netlink 0.1 → 1.0.0.4
raw patch · 19 files changed
+4055/−549 lines, 19 filesdep +netlinkdep +pretty-hexdep ~basedep ~cerealnew-component:exe:dump_nl80211new-component:exe:dump_rtnetlinknew-component:exe:genlinfonew-uploader
Dependencies added: netlink, pretty-hex
Dependency ranges changed: base, cereal
Files
- System/Linux/Netlink.hs +368/−1
- System/Linux/Netlink/Attributes.hs +0/−115
- System/Linux/Netlink/C.chs +0/−150
- System/Linux/Netlink/C.hsc +171/−0
- System/Linux/Netlink/Constants.hs +430/−24
- System/Linux/Netlink/GeNetlink.hs +103/−0
- System/Linux/Netlink/GeNetlink/Constants.hs +100/−0
- System/Linux/Netlink/GeNetlink/Control.hs +268/−0
- System/Linux/Netlink/GeNetlink/NL80211.hs +253/−0
- System/Linux/Netlink/GeNetlink/NL80211/Constants.hs +1717/−0
- System/Linux/Netlink/Helpers.hs +48/−0
- System/Linux/Netlink/Internal.hs +0/−55
- System/Linux/Netlink/Protocol.hs +0/−191
- System/Linux/Netlink/Route.hs +282/−0
- System/Linux/Netlink/Route/LinkStat.hs +142/−0
- Utils/DumpNL80211.hs +36/−0
- Utils/DumpRTNL.hs +20/−0
- Utils/GenlInfo.hs +71/−0
- netlink.cabal +46/−13
System/Linux/Netlink.hs view
@@ -1,1 +1,368 @@-module System.Linux.Netlink where+{-# LANGUAGE CPP #-}++{-|+Module : System.Linux.Netlink+Description : The base module for the netlink package+Maintainer : ongy+Stability : testing+Portability : Linux++This is the base module for the netlink package.+It contains functions and datatype used by every netlink module.+All definitions are (supposed to be) generic enough to be used+by implementations of more specific netlink interfaces.+-}+module System.Linux.Netlink+( Header(..)+ , Attributes+ , Packet(..)+ , Convertable(..)+ , NoData(..)+ , NetlinkSocket++ , getPacket+ , getAttributes+ , getHeader+ , putHeader+ , putAttributes+ , putPacket+ , getPackets++ , makeSocket+ , makeSocketGeneric+ , getNetlinkFd+ , closeSocket+ , joinMulticastGroup++ , query+ , queryOne+ , recvOne+ , showNLAttrs+ , showAttrs+ , showAttr+ , showPacket+)+where++#if MIN_VERSION_base(4,8,0)+#else+import Control.Applicative ((<$>))+#endif+++import Data.List (intersperse)+import Hexdump (prettyHex)+import Control.Monad (when, replicateM_, unless)+import Control.Monad.Loops (whileM)+import Data.Bits (Bits, (.&.))+import qualified Data.ByteString as BS (length)+import Data.ByteString (ByteString)+import Data.Map (Map, fromList, toList)+import Data.Serialize.Get+import Data.Serialize.Put+import Data.Word (Word16, Word32)+import Foreign.C.Types (CInt)++import System.Posix.Types (Fd(Fd))+import qualified System.Linux.Netlink.C as C+import System.Linux.Netlink.Helpers+import System.Linux.Netlink.Constants++--Generic protocol stuff++{- |Typeclase used by the system. Basically 'Storable' for 'Get' and 'Put'+++getGet Returns a 'Get' function for the convertable. ++The MessageType is passed so that the function can parse different data structures+based on the message type.+-}+class Convertable a where+ getGet :: MessageType -> Get a -- ^get a 'Get' function for the static data+ getPut :: a -> Put -- ^get a 'Put' function for the static data+++-- |Datatype to be used when there is no additional static header+data NoData = NoData deriving (Show, Eq)++instance Convertable NoData where+ getPut _ = return ()+ getGet _ = return NoData++-- |Data type for the netlink header+data Header = Header+ {+ messageType :: MessageType -- ^The message type+ , messageFlags :: Word16 -- ^The message flags+ , messageSeqNum :: Word32 -- ^The sequence message number+ , messagePID :: Word32 -- ^The pid of the sending process (0 is from kernel for receiving or "let the kernel set it" for sending)+ } deriving (Eq)++instance Show Header where+ show (Header t f s p) = + "Type: " ++ show t ++ ", Flags: " ++ (show f) ++ ", Seq: " ++ show s ++ ", Pid: " ++ show p++-- |Type used for netlink attributes+type Attributes = Map Int ByteString++-- |The generic netlink message type+data Packet a+ = Packet -- The "normal" message+ {+ packetHeader :: Header -- ^The netlink message header+ , packetCustom :: a -- ^The datatype for additional static data for the interface+ , packetAttributes :: Attributes -- ^The netlink attributes+ }+ | ErrorMsg -- The error message+ {+ packetHeader :: Header -- ^The netlink message header+ , packetError :: CInt -- ^The error ID for this error message+ , errorPacket :: Packet a -- ^The offending message+ }+ | DoneMsg -- The done message, this should usually not be seen by a user+ {+ packetHeader :: Header -- ^The header of the done message+ }+ deriving (Eq)++-- |Helperfunction for show instance of 'Packet' and further specializations+showPacket :: Show a => Packet a -> String+showPacket (ErrorMsg hdr code pack) = + "Error packet: \n" +++ show hdr ++ "\n" +++ "Error code: " ++ (show code) ++ "\n" +++ (show pack)+showPacket (DoneMsg hdr) = "Done: " ++ show hdr+showPacket (Packet hdr cus attrs) =+ "NetlinkPacket: " ++ show hdr ++ "\n" +++ "Custom data: " ++ show cus ++ "\n" +++ "Attrs: \n" ++ showNLAttrs attrs++instance {-# OVERLAPPABLE #-} Show a => Show (Packet a) where+ showList xs = ((concat . intersperse "===\n" . map show $xs) ++)+ show = showPacket++-- |Convert generic NLAttrs into a string (# and hexdump)+showNLAttrs :: Attributes -> String+showNLAttrs = showAttrs show ++-- |Helper function to convert attributes into a string+showAttrs + :: (Int -> String) -- ^A function from element id to its name+ -> Attributes -- ^The attributes+ -> String -- ^A string with Element name and hexdump of element+showAttrs sh = showAttrs' . toList+ where+ showAttrs' [] = []+ showAttrs' (x:xs) = showAttr sh x ++ showAttrs' xs++-- |Helper function to generically show a single attribute+showAttr :: (Int -> String) -> (Int, ByteString) -> String+showAttr sh (i,v) = sh i ++ ": " ++ prettyHex v++-- | Read packets from the buffer+getPacket + :: ByteString -- ^The buffer to read from+ -> Get a -- ^The function to read a single message+ -> Either String [a] -- ^Either an error message or a list of messages read+getPacket bytes f = flip runGet bytes $ do+ pkts <- whileM (not <$> isEmpty) f+ isEmpty >>= \e -> unless e $ fail "Incomplete message parse"+ return pkts++-- |'Get' Attributes+getAttributes :: Get Attributes+getAttributes = fromList <$> whileM (not <$> isEmpty) getSingleAttribute++-- |'Get' a single 'Attribute'+getSingleAttribute :: Get (Int, ByteString)+getSingleAttribute = do+ len <- fromIntegral <$> g16+ ty <- fromIntegral <$> g16+ val <- getByteString (len - 4)+ isEmpty >>= \e -> when (not e && len `mod` 4 /= 0) $ skip (4 - (len `mod` 4))+ return (ty, val)++-- |'Get' the netlink 'Header'+getHeader :: Get (Int, Header)+getHeader = isolate 16 $ do+ len <- fromIntegral <$> g32+ ty <- fromIntegral <$> g16+ flags <- fromIntegral <$> g16+ seqnum <- g32+ pid <- g32+ return (len - 16, Header ty flags seqnum pid)++-- |'Put' the netlink 'Header'+putHeader+ :: Int -- ^The length of the message+ -> Header -- ^The header itself+ -> Put+putHeader len (Header ty flags seqnum pid) = do+ p32 (fromIntegral len)+ p16 (fromIntegral ty)+ p16 (fromIntegral flags)+ p32 seqnum+ p32 pid+++-- |'Put' a 'Map' of 'Attributes'+putAttributes :: Attributes -> Put+putAttributes = mapM_ putAttr . toList+ where+ putAttr (ty, value) = do+ p16 (fromIntegral $BS.length value + 4)+ p16 (fromIntegral ty)+ putByteString value+ when (BS.length value `mod` 4 /= 0) $replicateM_ (4 - (BS.length value `mod` 4)) (p8 0)++-- |'Put' a 'Packet' so it can e sent+putPacket :: (Convertable a, Eq a, Show a) => Packet a -> [ByteString]+putPacket (Packet header custom attributes) =+ let attrs = runPut $putAttributes attributes+ cus = runPut $getPut custom+ hdr = runPut $putHeader (BS.length attrs + BS.length cus + 16) header+ in [hdr, cus, attrs]+putPacket _ = error "Cannot convert this for transmission"+++-- |'Get' an error message+getError :: (Convertable a, Eq a, Show a) => Header -> Get (Packet a)+getError hdr = do+ code <- fromIntegral <$> getWord32host+ packet <- getGenPacket+ return $ErrorMsg hdr code packet+++-- | 'Get' the body of a packet (the 'Header' is already read from the buffer+getGenPacketContent :: (Convertable a, Eq a, Show a) => Header -> Get (Packet a)+getGenPacketContent hdr+ | messageType hdr == eNLMSG_DONE = skip 4 >> return (DoneMsg hdr)+ | messageType hdr == eNLMSG_ERROR = getError hdr+ | otherwise = do+ msg <- getGet (messageType hdr)+ attrs <- getAttributes+ return $ Packet hdr msg attrs++{- | 'Get' a packet++This returns a 'Get' function for a netlink message.+The message may have additional static data defined by the protocol.+-}+getGenPacket :: (Convertable a, Eq a, Show a) => Get (Packet a)+getGenPacket = do+ (len, header) <- getHeader+ isolate len $ getGenPacketContent header+++{- | Read all 'Packet's from a buffer++The packets may have additional static data defined by the protocol.+-}+getPackets :: (Convertable a, Eq a, Show a) => ByteString -> Either String [Packet a]+getPackets bytes = flip runGet bytes $ do+ pkts <- whileM (not <$> isEmpty) getGenPacket+ isEmpty >>= \e -> unless e $ fail "Incomplete message parse"+ return pkts++-- | Typesafe wrapper around a 'CInt' (fd)+newtype NetlinkSocket = NS CInt++-- |Open and return a 'NetlinkSocket', for legacy reasons this opens a route socket+makeSocket :: IO NetlinkSocket+makeSocket = NS <$> C.makeSocket++-- |Open a 'NetlinkSocket'. This is the generic function+makeSocketGeneric + :: Int -- ^The netlink family to use+ -> IO NetlinkSocket+makeSocketGeneric = fmap NS . C.makeSocketGeneric++-- |Get the raw 'Fd' used for netlink communcation (this can be plugged into eventing)+getNetlinkFd :: NetlinkSocket -> Fd+getNetlinkFd (NS f) = Fd f++{- |Send a Message over netlink.++This is an internal function.+The prototype directly reflects the interface of the C functions.+-}+sendmsg :: NetlinkSocket -> [ByteString] -> IO ()+sendmsg (NS fd) = C.sendmsg fd++{- |Receive a Message over netlink.++This is an internal function.+The prototype directly reflects the interface of the C functions.+-}+recvmsg :: NetlinkSocket -> Int -> IO ByteString+recvmsg (NS fd) = C.recvmsg fd++-- |Close a 'NetlinkSocket' when it is no longer used+closeSocket :: NetlinkSocket -> IO ()+closeSocket (NS fd) = C.closeSocket fd++-- |Join a netlink multicast group+joinMulticastGroup+ :: NetlinkSocket -- ^The socket to join with+ -> Word32 -- ^The id of the group to join+ -> IO ()+joinMulticastGroup (NS fd) = C.joinMulticastGroup fd++++-- generic query functions+{- |Query data over netlink.++This sends a 'Packet' over netlink and returns the answer.+This blocks in a safe foregin function until the other side replies.+-}+query :: (Convertable a, Eq a, Show a) => NetlinkSocket -> Packet a -> IO [Packet a]+query sock req = do+ sendmsg sock (putPacket req)+ recvMulti sock++-- |The same as 'query' but requires the answer to be a single message+queryOne :: (Convertable a, Eq a, Show a) => NetlinkSocket -> Packet a -> IO (Packet a)+queryOne sock req = do+ sendmsg sock (putPacket req)+ pkts <- recvMulti sock+ case pkts of+ [x] -> return x+ _ -> fail ("Expected one packet, received " ++ (show . length $pkts))++-- |Internal function to receive multiple netlink messages+recvMulti :: (Convertable a, Eq a, Show a) => NetlinkSocket -> IO [Packet a]+recvMulti sock = do+ pkts <- recvOne sock+ if isMulti (first pkts)+ then if isDone (last pkts)+ -- This is fine because first would have complained before+ then return $ init pkts+ else (pkts ++) <$> recvMulti sock+ else return pkts+ where+ isMulti = isFlagSet fNLM_F_MULTI . messageFlags . packetHeader+ isDone = (== eNLMSG_DONE) . messageType . packetHeader+ first (x:_) = x+ first [] = error "Got empty list from recvOne in recvMulti, this shouldn't happen"++{- | Calls recvmsg once and returns all received messages++This should only be used outside of the package when reading multicast messages.++The prototype of this function is unintuitive, but this cannot be avoided without+buffering in userspace with the netlink api.+-}+recvOne :: (Convertable a, Eq a, Show a) => NetlinkSocket -> IO [Packet a]+recvOne sock = recvmsg sock bufferSize >>= \b -> case getPackets b of+ Left err -> fail err+ Right pkts -> return pkts+++isFlagSet :: Bits a => a -> a -> Bool+isFlagSet f v = (f .&. v) == f++bufferSize :: Num a => a+bufferSize = 4096
− System/Linux/Netlink/Attributes.hs
@@ -1,115 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module System.Linux.Netlink.Attributes - ( getLinkAddress- , getLinkBroadcast- , getLinkName- , getLinkMTU- , getLinkQDisc- , getLinkTXQLen-- , putLinkAddress- , putLinkBroadcast- , putLinkName- , putLinkMTU- , putLinkQDisc- , putLinkTXQLen- ) where--import Prelude hiding (init, lookup)--import Control.Applicative ((<$>))-import Data.ByteString.Char8 (ByteString, append, init, pack, unpack)-import Data.Char (chr, ord)-import Data.Map (insert, lookup)-import Data.Serialize.Get (runGet, getWord32host)-import Data.Serialize.Put (runPut, putWord32host)-import Data.Word (Word8, Word32)--import System.Linux.Netlink.Constants-import System.Linux.Netlink.Protocol--type AttributeReader a = Attributes -> Maybe a--type AttributeWriter a = a -> Attributes -> Attributes------- Link message attributes----type LinkAddress = (Word8, Word8, Word8, Word8, Word8, Word8)--getLinkAddress :: AttributeReader LinkAddress-getLinkAddress attrs = decodeMAC <$> lookup eIFLA_ADDRESS attrs--putLinkAddress :: AttributeWriter LinkAddress-putLinkAddress addr = insert eIFLA_ADDRESS (encodeMAC addr)--getLinkBroadcast :: AttributeReader LinkAddress-getLinkBroadcast attrs = decodeMAC <$> lookup eIFLA_BROADCAST attrs--putLinkBroadcast :: AttributeWriter LinkAddress-putLinkBroadcast addr = insert eIFLA_BROADCAST (encodeMAC addr)--getLinkName :: AttributeReader String-getLinkName attrs = getString <$> lookup eIFLA_IFNAME attrs--putLinkName :: AttributeWriter String-putLinkName ifname = insert eIFLA_IFNAME (putString ifname)--getLinkMTU :: AttributeReader Word32-getLinkMTU attrs = get32 =<< lookup eIFLA_MTU attrs--putLinkMTU :: AttributeWriter Word32-putLinkMTU mtu = insert eIFLA_MTU (put32 mtu)---- TODO: IFLA_LINK - need to understand what it does--getLinkQDisc :: AttributeReader String-getLinkQDisc attrs = getString <$> lookup eIFLA_QDISC attrs--putLinkQDisc :: AttributeWriter String-putLinkQDisc disc = insert eIFLA_QDISC (putString disc)---- TODO: IFLA_STATS - bloody huge message, will deal with it later.---- TODO: IFLA_{COST,PRIORITY,MASTER,WIRELESS,PROTINFO} - need to--- understand what they do.--getLinkTXQLen :: AttributeReader Word32-getLinkTXQLen attrs = get32 =<< lookup eIFLA_TXQLEN attrs--putLinkTXQLen :: AttributeWriter Word32-putLinkTXQLen len = insert eIFLA_TXQLEN (put32 len)---- TODO: IFLA_{MAP,WEIGHT} - need to figure out---- TODO: IFLA_{LINKMODE,LINKINFO} - see Documentation/networking/operstates.txt---- TODO: IFLA_{NET_NS_PID,IFALIAS} - need to figure out------- Helpers-----decodeMAC :: ByteString -> LinkAddress-decodeMAC = tuplify . map (fromIntegral . ord) . unpack- where tuplify [a,b,c,d,e,f] = (a,b,c,d,e,f)- tuplify _ = error "Bad encoded MAC"--encodeMAC :: LinkAddress -> ByteString-encodeMAC = pack . map (chr . fromIntegral) . listify- where listify (a,b,c,d,e,f) = [a,b,c,d,e,f]--getString :: ByteString -> String-getString b = unpack (init b)--putString :: String -> ByteString-putString s = append (pack s) "\0"--get32 :: ByteString -> Maybe Word32-get32 bs = case runGet getWord32host bs of- Left _ -> Nothing- Right w -> Just w--put32 :: Word32 -> ByteString-put32 w = runPut (putWord32host w)
− System/Linux/Netlink/C.chs
@@ -1,150 +0,0 @@-{-# LANGUAGE ForeignFunctionInterface #-}-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}--module System.Linux.Netlink.C- (- NetlinkSocket- , makeSocket- , closeSocket- , sendmsg- , recvmsg-- , cFromEnum- , cToEnum- ) where--import Control.Applicative ((<$>), (<*))-import Control.Monad (when)-import Data.Bits (Bits, (.|.), shiftL)-import Data.ByteString (ByteString)-import Data.ByteString.Internal (createAndTrim, toForeignPtr)-import Data.Unique (hashUnique, newUnique)-import Data.Word (Word32)-import Foreign.C.Error (throwErrnoIf, throwErrnoIfMinus1, throwErrnoIfMinus1_)-import Foreign.C.Types-import Foreign.ForeignPtr (touchForeignPtr)-import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)-import Foreign.Marshal.Array (withArrayLen)-import Foreign.Marshal.Utils (with)-import Foreign.Ptr (Ptr, castPtr, plusPtr)-import Foreign.Storable (Storable(..))-import System.Posix.Process (getProcessID)--import System.Linux.Netlink.Constants (eAF_NETLINK)--#include <unistd.h>-#include <string.h>-#include <sys/types.h>-#include <sys/socket.h>-#include <linux/netlink.h>--#c-typedef struct msghdr msdhdr;-typedef struct iovec iovec;-typedef struct sockaddr_nl sockaddr_nl;-#endc--newtype NetlinkSocket = NS CInt--makeSocket :: IO NetlinkSocket-makeSocket = do- fd <- throwErrnoIfMinus1 "makeSocket.socket" $- ({#call socket #}- eAF_NETLINK- (cFromEnum Raw)- (cFromEnum Route))- unique <- fromIntegral . hashUnique <$> newUnique- pid <- fromIntegral <$> getProcessID- let sockId = (unique `shiftL` 16) .|. pid- with (SockAddrNetlink sockId) $ \addr ->- throwErrnoIfMinus1_ "makeSocket.bind" $ do- {#call bind #} fd (castPtr addr) {#sizeof sockaddr_nl #}- return $ NS fd--closeSocket :: NetlinkSocket -> IO ()-closeSocket (NS fd) = throwErrnoIfMinus1_ "closeSocket" $ {#call close #} fd--sendmsg :: NetlinkSocket -> [ByteString] -> IO ()-sendmsg (NS fd) bs =- useManyAsPtrLen bs $ \ptrs ->- withArrayLen (map IoVec ptrs) $ \iovlen iov ->- with (MsgHdr (castPtr iov, iovlen)) $ \msg ->- throwErrnoIfMinus1_ "sendmsg" $ do- {#call sendmsg as _sendmsg #} fd (castPtr msg) (0 :: CInt)--recvmsg :: NetlinkSocket -> Int -> IO ByteString-recvmsg (NS fd) len =- createAndTrim len $ \ptr ->- with (IoVec (castPtr ptr, len)) $ \vec ->- with (MsgHdr (castPtr vec, 1)) $ \msg ->- fmap fromIntegral . throwErrnoIf (<= 0) "recvmsg" $ do- {#call recvmsg as _recvmsg #} fd (castPtr msg) (0 :: CInt)--{#enum define PF { NETLINK_ROUTE as Route } #}-{#enum define ST { SOCK_RAW as Raw } #}--data IoVec = IoVec (Ptr (), Int)--instance Storable IoVec where- sizeOf _ = {#sizeof iovec #}- alignment _ = 4- peek p = do- addr <- {#get iovec.iov_base #} p- len <- {#get iovec.iov_len #} p- return $ IoVec (addr, (fromIntegral len))- poke p (IoVec (addr, len)) = do- zero p- {#set iovec.iov_base #} p addr- {#set iovec.iov_len #} p (fromIntegral len)--data MsgHdr = MsgHdr (Ptr (), Int)--instance Storable MsgHdr where- sizeOf _ = {#sizeof iovec #}- alignment _ = 4- peek p = do- iov <- {#get msghdr.msg_iov #} p- iovlen <- {#get msghdr.msg_iovlen #} p- return $ MsgHdr (iov, fromIntegral iovlen)- poke p (MsgHdr (iov, iovlen)) = do- zero p- {#set msghdr.msg_iov #} p iov- {#set msghdr.msg_iovlen #} p (fromIntegral iovlen)--data SockAddrNetlink = SockAddrNetlink Word32--instance Storable SockAddrNetlink where- sizeOf _ = {#sizeof sockaddr_nl #}- alignment _ = 4- peek p = do- family <- {#get sockaddr_nl.nl_family #} p- when (family /= eAF_NETLINK) $ fail "Bad address family"- SockAddrNetlink . fromIntegral <$> {#get sockaddr_nl.nl_pid #} p- poke p (SockAddrNetlink pid) = do- zero p- {#set sockaddr_nl.nl_family #} p eAF_NETLINK- {#set sockaddr_nl.nl_pid #} p (fromIntegral pid)--useManyAsPtrLen :: [ByteString] -> ([(Ptr (), Int)] -> IO a) -> IO a-useManyAsPtrLen bs act =- let makePtrLen (fptr, off, len) =- let ptr = plusPtr (unsafeForeignPtrToPtr fptr) off- in (ptr, len)- touchByteStringPtr (fptr, _, _) = touchForeignPtr fptr- foreigns = map toForeignPtr bs- in act (map makePtrLen foreigns) <* mapM_ touchByteStringPtr foreigns--sizeOfPtr :: (Storable a, Integral b) => Ptr a -> b-sizeOfPtr = fromIntegral . sizeOf . (undefined :: Ptr a -> a)--zero :: Storable a => Ptr a -> IO ()-zero p = void $ {#call memset #} (castPtr p) 0 (sizeOfPtr p)--void :: Monad m => m a -> m ()-void act = act >> return ()--cFromEnum :: (Enum e, Integral i) => e -> i-cFromEnum = fromIntegral . fromEnum--cToEnum :: (Integral i, Enum e) => i -> e-cToEnum = toEnum . fromIntegral
+ System/Linux/Netlink/C.hsc view
@@ -0,0 +1,171 @@+{-# LANGUAGE ForeignFunctionInterface #-}+{-|+Module : System.Linux.Netlink.C+Description : A module to bridge the haskell code to underlying C code+Maintainer : ongy+Stability : testing+Portability : Linux++I consider this module internal.+The documentation may be a bit sparse.+-}+module System.Linux.Netlink.C+ ( makeSocket+ , makeSocketGeneric+ , closeSocket+ , sendmsg+ , recvmsg+ , joinMulticastGroup+ )+where+++#if MIN_VERSION_base(4,8,0)+#else+import Control.Applicative ((<$>), (<*))+#endif++import Control.Monad (when)+import Data.ByteString (ByteString)+import Data.ByteString.Internal (createAndTrim, toForeignPtr)+import Data.Word (Word32)+import Foreign.C.Error (throwErrnoIf, throwErrnoIfMinus1, throwErrnoIfMinus1_)+import Foreign.C.Types+import Foreign.ForeignPtr (touchForeignPtr)+import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)+import Foreign.Marshal.Array (withArrayLen)+import Foreign.Marshal.Utils (with)+import Foreign.Ptr (Ptr, castPtr, plusPtr)+import Foreign.Storable (Storable(..))++import System.Linux.Netlink.Constants (eAF_NETLINK)++#include <unistd.h>+#include <string.h>+#include <sys/types.h>+#include <sys/socket.h>+#include <linux/netlink.h>++-- FFI declarations for clib syscall wrappers+-- So if we are not blocking long or calling back into haskell it should be ok to do unsafe imports?+-- These should be done fast, and we know the will never call back into haskell+foreign import ccall unsafe "socket" c_socket :: CInt -> CInt -> CInt -> IO CInt+foreign import ccall unsafe "bind" c_bind :: CInt -> Ptr SockAddrNetlink -> Int -> IO CInt+foreign import ccall unsafe "close" c_close :: CInt -> IO CInt+foreign import ccall unsafe "setsockopt" c_setsockopt :: CInt -> CInt -> CInt -> Ptr a -> CInt -> IO CInt+foreign import ccall unsafe "memset" c_memset :: Ptr a -> CInt -> CInt -> IO ()++-- those two may block for a while, so we'll not do unsafe for them+foreign import ccall "sendmsg" c_sendmsg :: CInt -> Ptr MsgHdr -> CInt -> IO CInt+foreign import ccall "recvmsg" c_recvmsg :: CInt -> Ptr MsgHdr -> CInt -> IO CInt++data SockAddrNetlink = SockAddrNetlink Word32++instance Storable SockAddrNetlink where+ sizeOf _ = #{size struct sockaddr_nl}+ alignment _ = 4+ peek p = do+ family <- #{peek struct sockaddr_nl, nl_family} p+ when ((family :: CShort) /= eAF_NETLINK) $ fail "Bad address family"+ SockAddrNetlink . fromIntegral <$> (#{peek struct sockaddr_nl, nl_pid} p :: IO CUInt)+ poke p (SockAddrNetlink pid) = do+ zero p+ #{poke struct sockaddr_nl, nl_family} p (eAF_NETLINK :: CShort)+ #{poke struct sockaddr_nl, nl_pid } p (fromIntegral pid :: CUInt)++data IoVec = IoVec (Ptr (), Int)++instance Storable IoVec where+ sizeOf _ = #{size struct iovec}+ alignment _ = 4+ peek p = do+ addr <- #{peek struct iovec, iov_base} p+ len <- #{peek struct iovec, iov_len} p :: IO CSize+ return $ IoVec (addr, fromIntegral len)+ poke p (IoVec (addr, len)) = do+ zero p+ #{poke struct iovec, iov_base} p addr+ #{poke struct iovec, iov_len } p (fromIntegral len :: CSize)++data MsgHdr = MsgHdr (Ptr (), Int)++instance Storable MsgHdr where+ sizeOf _ = #{size struct msghdr}+ alignment _ = 4+ peek p = do+ iov <- #{peek struct msghdr, msg_iov } p+ iovlen <- #{peek struct msghdr, msg_iovlen} p :: IO CSize+ return $ MsgHdr (iov, fromIntegral iovlen)+ poke p (MsgHdr (iov, iovlen)) = do+ zero p+ #{poke struct msghdr, msg_iov } p iov+ #{poke struct msghdr, msg_iovlen} p (fromIntegral iovlen :: CSize)+++-- |Create a netlink socket, for legacy reasons this will be of the route family+makeSocket :: IO CInt+makeSocket = makeSocketGeneric #{const NETLINK_ROUTE}++-- TODO maybe readd the unique thingy (look at git log)+-- |Create any netlink socket+makeSocketGeneric + :: Int -- ^The netlink family to use+ -> IO CInt+makeSocketGeneric prot = do+ fd <- throwErrnoIfMinus1 "makeSocket.socket" $+ c_socket eAF_NETLINK #{const SOCK_RAW} (fromIntegral prot)+ -- we need to bind or joining multicast groups will be useless+ with (SockAddrNetlink 0) $ \addr ->+ throwErrnoIfMinus1_ "makeSocket.bind" $+ c_bind fd (castPtr addr) #{size struct sockaddr_nl}+ return fd+++-- |Close a socket when it is not needed anymore+closeSocket :: CInt -> IO ()+closeSocket fd = throwErrnoIfMinus1_ "closeSocket" $ c_close fd++-- |Send a message over a socket.+sendmsg :: CInt -> [ByteString] -> IO ()+sendmsg fd bs =+ useManyAsPtrLen bs $ \ptrs ->+ withArrayLen (map IoVec ptrs) $ \iovlen iov ->+ with (MsgHdr (castPtr iov, iovlen)) $ \msg ->+ throwErrnoIfMinus1_ "sendmsg" $c_sendmsg fd (castPtr msg) (0 :: CInt)++-- |Receive a message over a socket.+recvmsg :: CInt -> Int -> IO ByteString+recvmsg fd len =+ createAndTrim len $ \ptr ->+ with (IoVec (castPtr ptr, len)) $ \vec ->+ with (MsgHdr (castPtr vec, 1)) $ \msg ->+ fmap fromIntegral . throwErrnoIf (<= 0) "recvmsg" $+ c_recvmsg fd (castPtr msg) (0 :: CInt)++useManyAsPtrLen :: [ByteString] -> ([(Ptr (), Int)] -> IO a) -> IO a+useManyAsPtrLen bs act =+ let makePtrLen (fptr, off, len) =+ let ptr = plusPtr (unsafeForeignPtrToPtr fptr) off+ in (ptr, len)+ touchByteStringPtr (fptr, _, _) = touchForeignPtr fptr+ foreigns = map toForeignPtr bs+ in act (map makePtrLen foreigns) <* mapM_ touchByteStringPtr foreigns++sizeOfPtr :: (Storable a, Integral b) => Ptr a -> b+sizeOfPtr = fromIntegral . sizeOf . (undefined :: Ptr a -> a)++zero :: Storable a => Ptr a -> IO ()+zero p = void $ c_memset (castPtr p) 0 (sizeOfPtr p)++void :: Monad m => m a -> m ()+void act = act >> return ()+++-- |Join a netlink multicast group+joinMulticastGroup :: CInt -> Word32 -> IO ()+joinMulticastGroup fd fid = do+ _ <- throwErrnoIfMinus1 "joinMulticast" $ with fid (\ptr ->+ c_setsockopt fd sol_netlink 1 (castPtr ptr) size)+ return ()+ where size = fromIntegral $sizeOf (undefined :: CInt)+ sol_netlink = 270 :: CInt
System/Linux/Netlink/Constants.hs view
@@ -1,10 +1,57 @@+{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-module System.Linux.Netlink.Constants (AddressFamily, eAF_UNSPEC, eAF_FILE, eAF_LOCAL, eAF_UNIX, eAF_INET, eAF_AX25, eAF_IPX, eAF_APPLETALK, eAF_NETROM, eAF_BRIDGE, eAF_ATMPVC, eAF_X25, eAF_INET6, eAF_ROSE, eAF_DECnet, eAF_NETBEUI, eAF_SECURITY, eAF_KEY, eAF_NETLINK, eAF_ROUTE, eAF_PACKET, eAF_ASH, eAF_ECONET, eAF_ATMSVC, eAF_RDS, eAF_SNA, eAF_IRDA, eAF_PPPOX, eAF_WANPIPE, eAF_LLC, eAF_CAN, eAF_TIPC, eAF_BLUETOOTH, eAF_IUCV, eAF_RXRPC, eAF_ISDN, eAF_PHONET, eAF_IEEE802154, eAF_MAX, MessageType, eNLMSG_NOOP, eNLMSG_ERROR, eNLMSG_DONE, eNLMSG_OVERRUN, eNLMSG_MIN_TYPE, eRTM_BASE, eRTM_NEWLINK, eRTM_DELLINK, eRTM_GETLINK, eRTM_SETLINK, eRTM_NEWADDR, eRTM_DELADDR, eRTM_GETADDR, eRTM_NEWROUTE, eRTM_DELROUTE, eRTM_GETROUTE, eRTM_NEWNEIGH, eRTM_DELNEIGH, eRTM_GETNEIGH, eRTM_NEWRULE, eRTM_DELRULE, eRTM_GETRULE, eRTM_NEWQDISC, eRTM_DELQDISC, eRTM_GETQDISC, eRTM_NEWTCLASS, eRTM_DELTCLASS, eRTM_GETTCLASS, eRTM_NEWTFILTER, eRTM_DELTFILTER, eRTM_GETTFILTER, eRTM_NEWACTION, eRTM_DELACTION, eRTM_GETACTION, eRTM_NEWPREFIX, eRTM_GETMULTICAST, eRTM_GETANYCAST, eRTM_NEWNEIGHTBL, eRTM_GETNEIGHTBL, eRTM_SETNEIGHTBL, eRTM_NEWNDUSEROPT, eRTM_NEWADDRLABEL, eRTM_DELADDRLABEL, eRTM_GETADDRLABEL, eRTM_GETDCB, eRTM_SETDCB, MessageFlags, fNLM_F_REQUEST, fNLM_F_MULTI, fNLM_F_ACK, fNLM_F_ECHO, fNLM_F_REPLACE, fNLM_F_ROOT, fNLM_F_EXCL, fNLM_F_MATCH, fNLM_F_ATOMIC, fNLM_F_CREATE, fNLM_F_APPEND, LinkType, eARPHRD_NETROM, eARPHRD_ETHER, eARPHRD_EETHER, eARPHRD_AX25, eARPHRD_PRONET, eARPHRD_CHAOS, eARPHRD_IEEE802, eARPHRD_ARCNET, eARPHRD_APPLETLK, eARPHRD_DLCI, eARPHRD_ATM, eARPHRD_METRICOM, eARPHRD_IEEE1394, eARPHRD_EUI64, eARPHRD_INFINIBAND, eARPHRD_SLIP, eARPHRD_CSLIP, eARPHRD_SLIP6, eARPHRD_CSLIP6, eARPHRD_RSRVD, eARPHRD_ADAPT, eARPHRD_ROSE, eARPHRD_X25, eARPHRD_HWX25, eARPHRD_CAN, eARPHRD_PPP, eARPHRD_CISCO, eARPHRD_HDLC, eARPHRD_LAPB, eARPHRD_DDCMP, eARPHRD_RAWHDLC, eARPHRD_TUNNEL, eARPHRD_TUNNEL6, eARPHRD_FRAD, eARPHRD_SKIP, eARPHRD_LOOPBACK, eARPHRD_LOCALTLK, eARPHRD_FDDI, eARPHRD_BIF, eARPHRD_SIT, eARPHRD_IPDDP, eARPHRD_IPGRE, eARPHRD_PIMREG, eARPHRD_HIPPI, eARPHRD_ASH, eARPHRD_ECONET, eARPHRD_IRDA, eARPHRD_FCPP, eARPHRD_FCAL, eARPHRD_FCPL, eARPHRD_FCFABRIC, eARPHRD_IEEE802_TR, eARPHRD_IEEE80211, eARPHRD_IEEE80211_PRISM, eARPHRD_IEEE80211_RADIOTAP, eARPHRD_IEEE802154, eARPHRD_PHONET, eARPHRD_PHONET_PIPE, LinkFlags, fIFF_802_1Q_VLAN, fIFF_TUN, fIFF_UP, fIFF_BROADCAST, fIFF_EBRIDGE, fIFF_TAP, fIFF_DEBUG, fIFF_SLAVE_INACTIVE, fIFF_LOOPBACK, fIFF_MASTER_8023AD, fIFF_MASTER_ALB, fIFF_POINTOPOINT, fIFF_BONDING, fIFF_NOTRAILERS, fIFF_RUNNING, fIFF_SLAVE_NEEDARP, fIFF_ISATAP, fIFF_NOARP, fIFF_MASTER_ARPMON, fIFF_PROMISC, fIFF_ALLMULTI, fIFF_WAN_HDLC, fIFF_MASTER, fIFF_XMIT_DST_RELEASE, fIFF_SLAVE, fIFF_MULTICAST, fIFF_NO_PI, fIFF_ONE_QUEUE, fIFF_PORTSEL, fIFF_AUTOMEDIA, fIFF_VNET_HDR, fIFF_DYNAMIC, fIFF_TUN_EXCL, fIFF_LOWER_UP, fIFF_DORMANT, fIFF_ECHO, LinkAttrType, eIFLA_UNSPEC, eIFLA_ADDRESS, eIFLA_BROADCAST, eIFLA_IFNAME, eIFLA_MTU, eIFLA_LINK, eIFLA_QDISC, eIFLA_STATS, eIFLA_COST, eIFLA_PRIORITY, eIFLA_MASTER, eIFLA_WIRELESS, eIFLA_PROTINFO, eIFLA_TXQLEN, eIFLA_MAP, eIFLA_WEIGHT, eIFLA_OPERSTATE, eIFLA_LINKMODE, eIFLA_LINKINFO, eIFLA_NET_NS_PID, eIFLA_IFALIAS, AddrFlags, fIFA_F_SECONDARY, fIFA_F_TEMPORARY, fIFA_F_NODAD, fIFA_F_OPTIMISTIC, fIFA_F_DADFAILED, fIFA_F_HOMEADDRESS, fIFA_F_DEPRECATED, fIFA_F_TENTATIVE, fIFA_F_PERMANENT, Scope, eRT_SCOPE_UNIVERSE, eRT_SCOPE_SITE, eRT_SCOPE_LINK, eRT_SCOPE_HOST, eRT_SCOPE_NOWHERE, AddrAttrType, eIFA_UNSPEC, eIFA_ADDRESS, eIFA_LOCAL, eIFA_LABEL, eIFA_BROADCAST, eIFA_ANYCAST, eIFA_CACHEINFO, eIFA_MULTICAST, RouteTableId, eRT_TABLE_UNSPEC, eRT_TABLE_COMPAT, eRT_TABLE_DEFAULT, eRT_TABLE_MAIN, eRT_TABLE_LOCAL, eRT_TABLE_MAX, RouteProto, eRTPROT_UNSPEC, eRTPROT_REDIRECT, eRTPROT_KERNEL, eRTPROT_BOOT, eRTPROT_STATIC, eRTPROT_GATED, eRTPROT_RA, eRTPROT_MRT, eRTPROT_ZEBRA, eRTPROT_BIRD, eRTPROT_DNROUTED, eRTPROT_XORP, eRTPROT_NTK, eRTPROT_DHCP, RouteType, eRTN_UNSPEC, eRTN_UNICAST, eRTN_LOCAL, eRTN_BROADCAST, eRTN_ANYCAST, eRTN_MULTICAST, eRTN_BLACKHOLE, eRTN_UNREACHABLE, eRTN_PROHIBIT, eRTN_THROW, eRTN_NAT, eRTN_XRESOLVE, RouteFlags, fRTM_F_NOTIFY, fRTM_F_CLONED, fRTM_F_EQUALIZE, fRTM_F_PREFIX, RouteAttrType, eRTA_UNSPEC, eRTA_DST, eRTA_SRC, eRTA_IIF, eRTA_OIF, eRTA_GATEWAY, eRTA_PRIORITY, eRTA_PREFSRC, eRTA_METRICS, eRTA_MULTIPATH, eRTA_PROTOINFO, eRTA_FLOW, eRTA_CACHEINFO, eRTA_SESSION, eRTA_MP_ALGO, eRTA_TABLE) where+module System.Linux.Netlink.Constants (AddressFamily, showAddressFamily, eAF_UNSPEC, eAF_FILE, eAF_LOCAL, eAF_UNIX, eAF_INET, eAF_AX25, eAF_IPX, eAF_APPLETALK, eAF_NETROM, eAF_BRIDGE, eAF_ATMPVC, eAF_X25, eAF_INET6, eAF_ROSE, eAF_DECnet, eAF_NETBEUI, eAF_SECURITY, eAF_KEY, eAF_NETLINK, eAF_ROUTE, eAF_PACKET, eAF_ASH, eAF_ECONET, eAF_ATMSVC, eAF_RDS, eAF_SNA, eAF_IRDA, eAF_PPPOX, eAF_WANPIPE, eAF_LLC, eAF_IB, eAF_MPLS, eAF_CAN, eAF_TIPC, eAF_BLUETOOTH, eAF_IUCV, eAF_RXRPC, eAF_ISDN, eAF_PHONET, eAF_IEEE802154, eAF_CAIF, eAF_ALG, eAF_NFC, eAF_VSOCK, eAF_MAX, MessageType, showMessageType, eNLMSG_NOOP, eNLMSG_ERROR, eNLMSG_DONE, eNLMSG_OVERRUN, eNLMSG_MIN_TYPE, eRTM_BASE, eRTM_NEWLINK, eRTM_DELLINK, eRTM_GETLINK, eRTM_SETLINK, eRTM_NEWADDR, eRTM_DELADDR, eRTM_GETADDR, eRTM_NEWROUTE, eRTM_DELROUTE, eRTM_GETROUTE, eRTM_NEWNEIGH, eRTM_DELNEIGH, eRTM_GETNEIGH, eRTM_NEWRULE, eRTM_DELRULE, eRTM_GETRULE, eRTM_NEWQDISC, eRTM_DELQDISC, eRTM_GETQDISC, eRTM_NEWTCLASS, eRTM_DELTCLASS, eRTM_GETTCLASS, eRTM_NEWTFILTER, eRTM_DELTFILTER, eRTM_GETTFILTER, eRTM_NEWACTION, eRTM_DELACTION, eRTM_GETACTION, eRTM_NEWPREFIX, eRTM_GETMULTICAST, eRTM_GETANYCAST, eRTM_NEWNEIGHTBL, eRTM_GETNEIGHTBL, eRTM_SETNEIGHTBL, eRTM_NEWNDUSEROPT, eRTM_NEWADDRLABEL, eRTM_DELADDRLABEL, eRTM_GETADDRLABEL, eRTM_GETDCB, eRTM_SETDCB, eRTM_NEWNETCONF, eRTM_GETNETCONF, eRTM_NEWMDB, eRTM_DELMDB, eRTM_GETMDB, eRTM_NEWNSID, eRTM_DELNSID, eRTM_GETNSID, MessageFlags, fNLM_F_REQUEST, fNLM_F_MULTI, fNLM_F_ACK, fNLM_F_ECHO, fNLM_F_DUMP_INTR, fNLM_F_DUMP_FILTERED, fNLM_F_REPLACE, fNLM_F_ROOT, fNLM_F_EXCL, fNLM_F_MATCH, fNLM_F_ATOMIC, fNLM_F_CREATE, fNLM_F_APPEND, LinkType, showLinkType, eARPHRD_NETROM, eARPHRD_ETHER, eARPHRD_EETHER, eARPHRD_AX25, eARPHRD_PRONET, eARPHRD_CHAOS, eARPHRD_IEEE802, eARPHRD_ARCNET, eARPHRD_APPLETLK, eARPHRD_DLCI, eARPHRD_ATM, eARPHRD_METRICOM, eARPHRD_IEEE1394, eARPHRD_EUI64, eARPHRD_INFINIBAND, eARPHRD_SLIP, eARPHRD_CSLIP, eARPHRD_SLIP6, eARPHRD_CSLIP6, eARPHRD_RSRVD, eARPHRD_ADAPT, eARPHRD_ROSE, eARPHRD_X25, eARPHRD_HWX25, eARPHRD_CAN, eARPHRD_PPP, eARPHRD_CISCO, eARPHRD_HDLC, eARPHRD_LAPB, eARPHRD_DDCMP, eARPHRD_RAWHDLC, eARPHRD_TUNNEL, eARPHRD_TUNNEL6, eARPHRD_FRAD, eARPHRD_SKIP, eARPHRD_LOOPBACK, eARPHRD_LOCALTLK, eARPHRD_FDDI, eARPHRD_BIF, eARPHRD_SIT, eARPHRD_IPDDP, eARPHRD_IPGRE, eARPHRD_PIMREG, eARPHRD_HIPPI, eARPHRD_ASH, eARPHRD_ECONET, eARPHRD_IRDA, eARPHRD_FCPP, eARPHRD_FCAL, eARPHRD_FCPL, eARPHRD_FCFABRIC, eARPHRD_IEEE802_TR, eARPHRD_IEEE80211, eARPHRD_IEEE80211_PRISM, eARPHRD_IEEE80211_RADIOTAP, eARPHRD_IEEE802154, eARPHRD_IEEE802154_MONITOR, eARPHRD_PHONET, eARPHRD_PHONET_PIPE, eARPHRD_CAIF, eARPHRD_IP6GRE, eARPHRD_NETLINK, eARPHRD_6LOWPAN, LinkFlags, fIFF_TUN, fIFF_UP, fIFF_BROADCAST, fIFF_TAP, fIFF_DEBUG, fIFF_LOOPBACK, fIFF_POINTOPOINT, fIFF_NOTRAILERS, fIFF_RUNNING, fIFF_NOARP, fIFF_MULTI_QUEUE, fIFF_PROMISC, fIFF_ALLMULTI, fIFF_ATTACH_QUEUE, fIFF_DETACH_QUEUE, fIFF_MASTER, fIFF_PERSIST, fIFF_SLAVE, fIFF_MULTICAST, fIFF_NOFILTER, fIFF_NO_PI, fIFF_ONE_QUEUE, fIFF_PORTSEL, fIFF_AUTOMEDIA, fIFF_VNET_HDR, fIFF_DYNAMIC, fIFF_TUN_EXCL, fIFF_LOWER_UP, fIFF_DORMANT, fIFF_ECHO, LinkAttrType, showLinkAttrType, eIFLA_UNSPEC, eIFLA_ADDRESS, eIFLA_BROADCAST, eIFLA_IFNAME, eIFLA_MTU, eIFLA_LINK, eIFLA_QDISC, eIFLA_STATS, eIFLA_COST, eIFLA_PRIORITY, eIFLA_MASTER, eIFLA_WIRELESS, eIFLA_PROTINFO, eIFLA_TXQLEN, eIFLA_MAP, eIFLA_WEIGHT, eIFLA_OPERSTATE, eIFLA_LINKMODE, eIFLA_LINKINFO, eIFLA_NET_NS_PID, eIFLA_IFALIAS, eIFLA_NUM_VF, eIFLA_VFINFO_LIST, eIFLA_STATS64, eIFLA_VF_PORTS, eIFLA_PORT_SELF, eIFLA_AF_SPEC, eIFLA_GROUP, eIFLA_NET_NS_FD, eIFLA_EXT_MASK, eIFLA_PROMISCUITY, eIFLA_NUM_TX_QUEUES, eIFLA_NUM_RX_QUEUES, eIFLA_CARRIER, eIFLA_PHYS_PORT_ID, eIFLA_CARRIER_CHANGES, eIFLA_PHYS_SWITCH_ID, eIFLA_LINK_NETNSID, eIFLA_PHYS_PORT_NAME, eIFLA_PROTO_DOWN, AddrFlags, fIFA_F_SECONDARY, fIFA_F_TEMPORARY, fIFA_F_NODAD, fIFA_F_OPTIMISTIC, fIFA_F_DADFAILED, fIFA_F_HOMEADDRESS, fIFA_F_DEPRECATED, fIFA_F_TENTATIVE, fIFA_F_PERMANENT, fIFA_F_MANAGETEMPADDR, fIFA_F_NOPREFIXROUTE, fIFA_F_MCAUTOJOIN, fIFA_F_STABLE_PRIVACY, Scope, showScope, eRT_SCOPE_UNIVERSE, eRT_SCOPE_SITE, eRT_SCOPE_LINK, eRT_SCOPE_HOST, eRT_SCOPE_NOWHERE, AddrAttrType, showAddrAttrType, eIFA_UNSPEC, eIFA_ADDRESS, eIFA_LOCAL, eIFA_LABEL, eIFA_BROADCAST, eIFA_ANYCAST, eIFA_CACHEINFO, eIFA_MULTICAST, eIFA_FLAGS, RouteTableId, showRouteTableId, eRT_TABLE_UNSPEC, eRT_TABLE_COMPAT, eRT_TABLE_DEFAULT, eRT_TABLE_MAIN, eRT_TABLE_LOCAL, eRT_TABLE_MAX, RouteProto, showRouteProto, eRTPROT_UNSPEC, eRTPROT_REDIRECT, eRTPROT_KERNEL, eRTPROT_BOOT, eRTPROT_STATIC, eRTPROT_GATED, eRTPROT_RA, eRTPROT_MRT, eRTPROT_ZEBRA, eRTPROT_BIRD, eRTPROT_DNROUTED, eRTPROT_XORP, eRTPROT_NTK, eRTPROT_DHCP, eRTPROT_MROUTED, eRTPROT_BABEL, RouteType, showRouteType, eRTN_UNSPEC, eRTN_UNICAST, eRTN_LOCAL, eRTN_BROADCAST, eRTN_ANYCAST, eRTN_MULTICAST, eRTN_BLACKHOLE, eRTN_UNREACHABLE, eRTN_PROHIBIT, eRTN_THROW, eRTN_NAT, eRTN_XRESOLVE, RouteFlags, fRTM_F_NOTIFY, fRTM_F_CLONED, fRTM_F_EQUALIZE, fRTM_F_PREFIX, fRTM_F_LOOKUP_TABLE, RouteAttrType, showRouteAttrType, eRTA_UNSPEC, eRTA_DST, eRTA_SRC, eRTA_IIF, eRTA_OIF, eRTA_GATEWAY, eRTA_PRIORITY, eRTA_PREFSRC, eRTA_METRICS, eRTA_MULTIPATH, eRTA_PROTOINFO, eRTA_FLOW, eRTA_CACHEINFO, eRTA_SESSION, eRTA_MP_ALGO, eRTA_TABLE, eRTA_MARK, eRTA_MFC_STATS, eRTA_VIA, eRTA_NEWDST, eRTA_PREF, eRTA_ENCAP_TYPE, eRTA_ENCAP) where import Data.Bits newtype AddressFamily = AddressFamily Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showAddressFamily :: (Num a) => (Show a) => (Eq a) => a -> String+showAddressFamily 0 = "AF_UNSPEC"+showAddressFamily 1 = "AF_FILE"+showAddressFamily 2 = "AF_INET"+showAddressFamily 3 = "AF_AX25"+showAddressFamily 4 = "AF_IPX"+showAddressFamily 5 = "AF_APPLETALK"+showAddressFamily 6 = "AF_NETROM"+showAddressFamily 7 = "AF_BRIDGE"+showAddressFamily 8 = "AF_ATMPVC"+showAddressFamily 9 = "AF_X25"+showAddressFamily 10 = "AF_INET6"+showAddressFamily 11 = "AF_ROSE"+showAddressFamily 12 = "AF_DECnet"+showAddressFamily 13 = "AF_NETBEUI"+showAddressFamily 14 = "AF_SECURITY"+showAddressFamily 15 = "AF_KEY"+showAddressFamily 16 = "AF_NETLINK"+showAddressFamily 17 = "AF_PACKET"+showAddressFamily 18 = "AF_ASH"+showAddressFamily 19 = "AF_ECONET"+showAddressFamily 20 = "AF_ATMSVC"+showAddressFamily 21 = "AF_RDS"+showAddressFamily 22 = "AF_SNA"+showAddressFamily 23 = "AF_IRDA"+showAddressFamily 24 = "AF_PPPOX"+showAddressFamily 25 = "AF_WANPIPE"+showAddressFamily 26 = "AF_LLC"+showAddressFamily 27 = "AF_IB"+showAddressFamily 28 = "AF_MPLS"+showAddressFamily 29 = "AF_CAN"+showAddressFamily 30 = "AF_TIPC"+showAddressFamily 31 = "AF_BLUETOOTH"+showAddressFamily 32 = "AF_IUCV"+showAddressFamily 33 = "AF_RXRPC"+showAddressFamily 34 = "AF_ISDN"+showAddressFamily 35 = "AF_PHONET"+showAddressFamily 36 = "AF_IEEE802154"+showAddressFamily 37 = "AF_CAIF"+showAddressFamily 38 = "AF_ALG"+showAddressFamily 39 = "AF_NFC"+showAddressFamily 40 = "AF_VSOCK"+showAddressFamily 41 = "AF_MAX"+showAddressFamily i = "AddressFamily #" ++ (show i)++ eAF_UNSPEC :: (Num a) => a eAF_UNSPEC = 0 eAF_FILE :: (Num a) => a@@ -65,6 +112,10 @@ eAF_WANPIPE = 25 eAF_LLC :: (Num a) => a eAF_LLC = 26+eAF_IB :: (Num a) => a+eAF_IB = 27+eAF_MPLS :: (Num a) => a+eAF_MPLS = 28 eAF_CAN :: (Num a) => a eAF_CAN = 29 eAF_TIPC :: (Num a) => a@@ -81,10 +132,74 @@ eAF_PHONET = 35 eAF_IEEE802154 :: (Num a) => a eAF_IEEE802154 = 36+eAF_CAIF :: (Num a) => a+eAF_CAIF = 37+eAF_ALG :: (Num a) => a+eAF_ALG = 38+eAF_NFC :: (Num a) => a+eAF_NFC = 39+eAF_VSOCK :: (Num a) => a+eAF_VSOCK = 40 eAF_MAX :: (Num a) => a-eAF_MAX = 37+eAF_MAX = 41 newtype MessageType = MessageType Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showMessageType :: (Num a) => (Show a) => (Eq a) => a -> String+showMessageType 1 = "NLMSG_NOOP"+showMessageType 2 = "NLMSG_ERROR"+showMessageType 3 = "NLMSG_DONE"+showMessageType 4 = "NLMSG_OVERRUN"+showMessageType 16 = "NLMSG_MIN_TYPE"+showMessageType 17 = "RTM_DELLINK"+showMessageType 18 = "RTM_GETLINK"+showMessageType 19 = "RTM_SETLINK"+showMessageType 20 = "RTM_NEWADDR"+showMessageType 21 = "RTM_DELADDR"+showMessageType 22 = "RTM_GETADDR"+showMessageType 24 = "RTM_NEWROUTE"+showMessageType 25 = "RTM_DELROUTE"+showMessageType 26 = "RTM_GETROUTE"+showMessageType 28 = "RTM_NEWNEIGH"+showMessageType 29 = "RTM_DELNEIGH"+showMessageType 30 = "RTM_GETNEIGH"+showMessageType 32 = "RTM_NEWRULE"+showMessageType 33 = "RTM_DELRULE"+showMessageType 34 = "RTM_GETRULE"+showMessageType 36 = "RTM_NEWQDISC"+showMessageType 37 = "RTM_DELQDISC"+showMessageType 38 = "RTM_GETQDISC"+showMessageType 40 = "RTM_NEWTCLASS"+showMessageType 41 = "RTM_DELTCLASS"+showMessageType 42 = "RTM_GETTCLASS"+showMessageType 44 = "RTM_NEWTFILTER"+showMessageType 45 = "RTM_DELTFILTER"+showMessageType 46 = "RTM_GETTFILTER"+showMessageType 48 = "RTM_NEWACTION"+showMessageType 49 = "RTM_DELACTION"+showMessageType 50 = "RTM_GETACTION"+showMessageType 52 = "RTM_NEWPREFIX"+showMessageType 58 = "RTM_GETMULTICAST"+showMessageType 62 = "RTM_GETANYCAST"+showMessageType 64 = "RTM_NEWNEIGHTBL"+showMessageType 66 = "RTM_GETNEIGHTBL"+showMessageType 67 = "RTM_SETNEIGHTBL"+showMessageType 68 = "RTM_NEWNDUSEROPT"+showMessageType 72 = "RTM_NEWADDRLABEL"+showMessageType 73 = "RTM_DELADDRLABEL"+showMessageType 74 = "RTM_GETADDRLABEL"+showMessageType 78 = "RTM_GETDCB"+showMessageType 79 = "RTM_SETDCB"+showMessageType 80 = "RTM_NEWNETCONF"+showMessageType 82 = "RTM_GETNETCONF"+showMessageType 84 = "RTM_NEWMDB"+showMessageType 85 = "RTM_DELMDB"+showMessageType 86 = "RTM_GETMDB"+showMessageType 88 = "RTM_NEWNSID"+showMessageType 89 = "RTM_DELNSID"+showMessageType 90 = "RTM_GETNSID"+showMessageType i = "MessageType #" ++ (show i)++ eNLMSG_NOOP :: (Num a) => a eNLMSG_NOOP = 1 eNLMSG_ERROR :: (Num a) => a@@ -177,6 +292,22 @@ eRTM_GETDCB = 78 eRTM_SETDCB :: (Num a) => a eRTM_SETDCB = 79+eRTM_NEWNETCONF :: (Num a) => a+eRTM_NEWNETCONF = 80+eRTM_GETNETCONF :: (Num a) => a+eRTM_GETNETCONF = 82+eRTM_NEWMDB :: (Num a) => a+eRTM_NEWMDB = 84+eRTM_DELMDB :: (Num a) => a+eRTM_DELMDB = 85+eRTM_GETMDB :: (Num a) => a+eRTM_GETMDB = 86+eRTM_NEWNSID :: (Num a) => a+eRTM_NEWNSID = 88+eRTM_DELNSID :: (Num a) => a+eRTM_DELNSID = 89+eRTM_GETNSID :: (Num a) => a+eRTM_GETNSID = 90 newtype MessageFlags = MessageFlags Int deriving (Bits, Eq, Enum, Integral, Num, Ord, Real, Show) fNLM_F_REQUEST :: (Num a, Bits a) => a@@ -187,6 +318,10 @@ fNLM_F_ACK = 4 fNLM_F_ECHO :: (Num a, Bits a) => a fNLM_F_ECHO = 8+fNLM_F_DUMP_INTR :: (Num a, Bits a) => a+fNLM_F_DUMP_INTR = 16+fNLM_F_DUMP_FILTERED :: (Num a, Bits a) => a+fNLM_F_DUMP_FILTERED = 32 fNLM_F_REPLACE :: (Num a, Bits a) => a fNLM_F_REPLACE = 256 fNLM_F_ROOT :: (Num a, Bits a) => a@@ -203,6 +338,72 @@ fNLM_F_APPEND = 2048 newtype LinkType = LinkType Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showLinkType :: (Num a) => (Show a) => (Eq a) => a -> String+showLinkType 0 = "ARPHRD_NETROM"+showLinkType 1 = "ARPHRD_ETHER"+showLinkType 2 = "ARPHRD_EETHER"+showLinkType 3 = "ARPHRD_AX25"+showLinkType 4 = "ARPHRD_PRONET"+showLinkType 5 = "ARPHRD_CHAOS"+showLinkType 6 = "ARPHRD_IEEE802"+showLinkType 7 = "ARPHRD_ARCNET"+showLinkType 8 = "ARPHRD_APPLETLK"+showLinkType 15 = "ARPHRD_DLCI"+showLinkType 19 = "ARPHRD_ATM"+showLinkType 23 = "ARPHRD_METRICOM"+showLinkType 24 = "ARPHRD_IEEE1394"+showLinkType 27 = "ARPHRD_EUI64"+showLinkType 32 = "ARPHRD_INFINIBAND"+showLinkType 256 = "ARPHRD_SLIP"+showLinkType 257 = "ARPHRD_CSLIP"+showLinkType 258 = "ARPHRD_SLIP6"+showLinkType 259 = "ARPHRD_CSLIP6"+showLinkType 260 = "ARPHRD_RSRVD"+showLinkType 264 = "ARPHRD_ADAPT"+showLinkType 270 = "ARPHRD_ROSE"+showLinkType 271 = "ARPHRD_X25"+showLinkType 272 = "ARPHRD_HWX25"+showLinkType 280 = "ARPHRD_CAN"+showLinkType 512 = "ARPHRD_PPP"+showLinkType 513 = "ARPHRD_CISCO"+showLinkType 516 = "ARPHRD_LAPB"+showLinkType 517 = "ARPHRD_DDCMP"+showLinkType 518 = "ARPHRD_RAWHDLC"+showLinkType 768 = "ARPHRD_TUNNEL"+showLinkType 769 = "ARPHRD_TUNNEL6"+showLinkType 770 = "ARPHRD_FRAD"+showLinkType 771 = "ARPHRD_SKIP"+showLinkType 772 = "ARPHRD_LOOPBACK"+showLinkType 773 = "ARPHRD_LOCALTLK"+showLinkType 774 = "ARPHRD_FDDI"+showLinkType 775 = "ARPHRD_BIF"+showLinkType 776 = "ARPHRD_SIT"+showLinkType 777 = "ARPHRD_IPDDP"+showLinkType 778 = "ARPHRD_IPGRE"+showLinkType 779 = "ARPHRD_PIMREG"+showLinkType 780 = "ARPHRD_HIPPI"+showLinkType 781 = "ARPHRD_ASH"+showLinkType 782 = "ARPHRD_ECONET"+showLinkType 783 = "ARPHRD_IRDA"+showLinkType 784 = "ARPHRD_FCPP"+showLinkType 785 = "ARPHRD_FCAL"+showLinkType 786 = "ARPHRD_FCPL"+showLinkType 787 = "ARPHRD_FCFABRIC"+showLinkType 800 = "ARPHRD_IEEE802_TR"+showLinkType 801 = "ARPHRD_IEEE80211"+showLinkType 802 = "ARPHRD_IEEE80211_PRISM"+showLinkType 803 = "ARPHRD_IEEE80211_RADIOTAP"+showLinkType 804 = "ARPHRD_IEEE802154"+showLinkType 805 = "ARPHRD_IEEE802154_MONITOR"+showLinkType 820 = "ARPHRD_PHONET"+showLinkType 821 = "ARPHRD_PHONET_PIPE"+showLinkType 822 = "ARPHRD_CAIF"+showLinkType 823 = "ARPHRD_IP6GRE"+showLinkType 824 = "ARPHRD_NETLINK"+showLinkType 825 = "ARPHRD_6LOWPAN"+showLinkType i = "LinkType #" ++ (show i)++ eARPHRD_NETROM :: (Num a) => a eARPHRD_NETROM = 0 eARPHRD_ETHER :: (Num a) => a@@ -315,64 +516,62 @@ eARPHRD_IEEE80211_RADIOTAP = 803 eARPHRD_IEEE802154 :: (Num a) => a eARPHRD_IEEE802154 = 804+eARPHRD_IEEE802154_MONITOR :: (Num a) => a+eARPHRD_IEEE802154_MONITOR = 805 eARPHRD_PHONET :: (Num a) => a eARPHRD_PHONET = 820 eARPHRD_PHONET_PIPE :: (Num a) => a eARPHRD_PHONET_PIPE = 821+eARPHRD_CAIF :: (Num a) => a+eARPHRD_CAIF = 822+eARPHRD_IP6GRE :: (Num a) => a+eARPHRD_IP6GRE = 823+eARPHRD_NETLINK :: (Num a) => a+eARPHRD_NETLINK = 824+eARPHRD_6LOWPAN :: (Num a) => a+eARPHRD_6LOWPAN = 825 newtype LinkFlags = LinkFlags Int deriving (Bits, Eq, Enum, Integral, Num, Ord, Real, Show) -fIFF_802_1Q_VLAN :: (Num a, Bits a) => a-fIFF_802_1Q_VLAN = 1 fIFF_TUN :: (Num a, Bits a) => a fIFF_TUN = 1 fIFF_UP :: (Num a, Bits a) => a fIFF_UP = 1 fIFF_BROADCAST :: (Num a, Bits a) => a fIFF_BROADCAST = 2-fIFF_EBRIDGE :: (Num a, Bits a) => a-fIFF_EBRIDGE = 2 fIFF_TAP :: (Num a, Bits a) => a fIFF_TAP = 2 fIFF_DEBUG :: (Num a, Bits a) => a fIFF_DEBUG = 4-fIFF_SLAVE_INACTIVE :: (Num a, Bits a) => a-fIFF_SLAVE_INACTIVE = 4 fIFF_LOOPBACK :: (Num a, Bits a) => a fIFF_LOOPBACK = 8-fIFF_MASTER_8023AD :: (Num a, Bits a) => a-fIFF_MASTER_8023AD = 8-fIFF_MASTER_ALB :: (Num a, Bits a) => a-fIFF_MASTER_ALB = 16 fIFF_POINTOPOINT :: (Num a, Bits a) => a fIFF_POINTOPOINT = 16-fIFF_BONDING :: (Num a, Bits a) => a-fIFF_BONDING = 32 fIFF_NOTRAILERS :: (Num a, Bits a) => a fIFF_NOTRAILERS = 32 fIFF_RUNNING :: (Num a, Bits a) => a fIFF_RUNNING = 64-fIFF_SLAVE_NEEDARP :: (Num a, Bits a) => a-fIFF_SLAVE_NEEDARP = 64-fIFF_ISATAP :: (Num a, Bits a) => a-fIFF_ISATAP = 128 fIFF_NOARP :: (Num a, Bits a) => a fIFF_NOARP = 128-fIFF_MASTER_ARPMON :: (Num a, Bits a) => a-fIFF_MASTER_ARPMON = 256+fIFF_MULTI_QUEUE :: (Num a, Bits a) => a+fIFF_MULTI_QUEUE = 256 fIFF_PROMISC :: (Num a, Bits a) => a fIFF_PROMISC = 256 fIFF_ALLMULTI :: (Num a, Bits a) => a fIFF_ALLMULTI = 512-fIFF_WAN_HDLC :: (Num a, Bits a) => a-fIFF_WAN_HDLC = 512+fIFF_ATTACH_QUEUE :: (Num a, Bits a) => a+fIFF_ATTACH_QUEUE = 512+fIFF_DETACH_QUEUE :: (Num a, Bits a) => a+fIFF_DETACH_QUEUE = 1024 fIFF_MASTER :: (Num a, Bits a) => a fIFF_MASTER = 1024-fIFF_XMIT_DST_RELEASE :: (Num a, Bits a) => a-fIFF_XMIT_DST_RELEASE = 1024+fIFF_PERSIST :: (Num a, Bits a) => a+fIFF_PERSIST = 2048 fIFF_SLAVE :: (Num a, Bits a) => a fIFF_SLAVE = 2048 fIFF_MULTICAST :: (Num a, Bits a) => a fIFF_MULTICAST = 4096+fIFF_NOFILTER :: (Num a, Bits a) => a+fIFF_NOFILTER = 4096 fIFF_NO_PI :: (Num a, Bits a) => a fIFF_NO_PI = 4096 fIFF_ONE_QUEUE :: (Num a, Bits a) => a@@ -395,6 +594,50 @@ fIFF_ECHO = 262144 newtype LinkAttrType = LinkAttrType Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showLinkAttrType :: (Num a) => (Show a) => (Eq a) => a -> String+showLinkAttrType 0 = "IFLA_UNSPEC"+showLinkAttrType 1 = "IFLA_ADDRESS"+showLinkAttrType 2 = "IFLA_BROADCAST"+showLinkAttrType 3 = "IFLA_IFNAME"+showLinkAttrType 4 = "IFLA_MTU"+showLinkAttrType 5 = "IFLA_LINK"+showLinkAttrType 6 = "IFLA_QDISC"+showLinkAttrType 7 = "IFLA_STATS"+showLinkAttrType 8 = "IFLA_COST"+showLinkAttrType 9 = "IFLA_PRIORITY"+showLinkAttrType 10 = "IFLA_MASTER"+showLinkAttrType 11 = "IFLA_WIRELESS"+showLinkAttrType 12 = "IFLA_PROTINFO"+showLinkAttrType 13 = "IFLA_TXQLEN"+showLinkAttrType 14 = "IFLA_MAP"+showLinkAttrType 15 = "IFLA_WEIGHT"+showLinkAttrType 16 = "IFLA_OPERSTATE"+showLinkAttrType 17 = "IFLA_LINKMODE"+showLinkAttrType 18 = "IFLA_LINKINFO"+showLinkAttrType 19 = "IFLA_NET_NS_PID"+showLinkAttrType 20 = "IFLA_IFALIAS"+showLinkAttrType 21 = "IFLA_NUM_VF"+showLinkAttrType 22 = "IFLA_VFINFO_LIST"+showLinkAttrType 23 = "IFLA_STATS64"+showLinkAttrType 24 = "IFLA_VF_PORTS"+showLinkAttrType 25 = "IFLA_PORT_SELF"+showLinkAttrType 26 = "IFLA_AF_SPEC"+showLinkAttrType 27 = "IFLA_GROUP"+showLinkAttrType 28 = "IFLA_NET_NS_FD"+showLinkAttrType 29 = "IFLA_EXT_MASK"+showLinkAttrType 30 = "IFLA_PROMISCUITY"+showLinkAttrType 31 = "IFLA_NUM_TX_QUEUES"+showLinkAttrType 32 = "IFLA_NUM_RX_QUEUES"+showLinkAttrType 33 = "IFLA_CARRIER"+showLinkAttrType 34 = "IFLA_PHYS_PORT_ID"+showLinkAttrType 35 = "IFLA_CARRIER_CHANGES"+showLinkAttrType 36 = "IFLA_PHYS_SWITCH_ID"+showLinkAttrType 37 = "IFLA_LINK_NETNSID"+showLinkAttrType 38 = "IFLA_PHYS_PORT_NAME"+showLinkAttrType 39 = "IFLA_PROTO_DOWN"+showLinkAttrType i = "LinkAttrType #" ++ (show i)++ eIFLA_UNSPEC :: (Num a) => a eIFLA_UNSPEC = 0 eIFLA_ADDRESS :: (Num a) => a@@ -437,6 +680,44 @@ eIFLA_NET_NS_PID = 19 eIFLA_IFALIAS :: (Num a) => a eIFLA_IFALIAS = 20+eIFLA_NUM_VF :: (Num a) => a+eIFLA_NUM_VF = 21+eIFLA_VFINFO_LIST :: (Num a) => a+eIFLA_VFINFO_LIST = 22+eIFLA_STATS64 :: (Num a) => a+eIFLA_STATS64 = 23+eIFLA_VF_PORTS :: (Num a) => a+eIFLA_VF_PORTS = 24+eIFLA_PORT_SELF :: (Num a) => a+eIFLA_PORT_SELF = 25+eIFLA_AF_SPEC :: (Num a) => a+eIFLA_AF_SPEC = 26+eIFLA_GROUP :: (Num a) => a+eIFLA_GROUP = 27+eIFLA_NET_NS_FD :: (Num a) => a+eIFLA_NET_NS_FD = 28+eIFLA_EXT_MASK :: (Num a) => a+eIFLA_EXT_MASK = 29+eIFLA_PROMISCUITY :: (Num a) => a+eIFLA_PROMISCUITY = 30+eIFLA_NUM_TX_QUEUES :: (Num a) => a+eIFLA_NUM_TX_QUEUES = 31+eIFLA_NUM_RX_QUEUES :: (Num a) => a+eIFLA_NUM_RX_QUEUES = 32+eIFLA_CARRIER :: (Num a) => a+eIFLA_CARRIER = 33+eIFLA_PHYS_PORT_ID :: (Num a) => a+eIFLA_PHYS_PORT_ID = 34+eIFLA_CARRIER_CHANGES :: (Num a) => a+eIFLA_CARRIER_CHANGES = 35+eIFLA_PHYS_SWITCH_ID :: (Num a) => a+eIFLA_PHYS_SWITCH_ID = 36+eIFLA_LINK_NETNSID :: (Num a) => a+eIFLA_LINK_NETNSID = 37+eIFLA_PHYS_PORT_NAME :: (Num a) => a+eIFLA_PHYS_PORT_NAME = 38+eIFLA_PROTO_DOWN :: (Num a) => a+eIFLA_PROTO_DOWN = 39 newtype AddrFlags = AddrFlags Int deriving (Bits, Eq, Enum, Integral, Num, Ord, Real, Show) fIFA_F_SECONDARY :: (Num a, Bits a) => a@@ -457,8 +738,25 @@ fIFA_F_TENTATIVE = 64 fIFA_F_PERMANENT :: (Num a, Bits a) => a fIFA_F_PERMANENT = 128+fIFA_F_MANAGETEMPADDR :: (Num a, Bits a) => a+fIFA_F_MANAGETEMPADDR = 256+fIFA_F_NOPREFIXROUTE :: (Num a, Bits a) => a+fIFA_F_NOPREFIXROUTE = 512+fIFA_F_MCAUTOJOIN :: (Num a, Bits a) => a+fIFA_F_MCAUTOJOIN = 1024+fIFA_F_STABLE_PRIVACY :: (Num a, Bits a) => a+fIFA_F_STABLE_PRIVACY = 2048 newtype Scope = Scope Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showScope :: (Num a) => (Show a) => (Eq a) => a -> String+showScope 0 = "RT_SCOPE_UNIVERSE"+showScope 200 = "RT_SCOPE_SITE"+showScope 253 = "RT_SCOPE_LINK"+showScope 254 = "RT_SCOPE_HOST"+showScope 255 = "RT_SCOPE_NOWHERE"+showScope i = "Scope #" ++ (show i)++ eRT_SCOPE_UNIVERSE :: (Num a) => a eRT_SCOPE_UNIVERSE = 0 eRT_SCOPE_SITE :: (Num a) => a@@ -471,6 +769,19 @@ eRT_SCOPE_NOWHERE = 255 newtype AddrAttrType = AddrAttrType Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showAddrAttrType :: (Num a) => (Show a) => (Eq a) => a -> String+showAddrAttrType 0 = "IFA_UNSPEC"+showAddrAttrType 1 = "IFA_ADDRESS"+showAddrAttrType 2 = "IFA_LOCAL"+showAddrAttrType 3 = "IFA_LABEL"+showAddrAttrType 4 = "IFA_BROADCAST"+showAddrAttrType 5 = "IFA_ANYCAST"+showAddrAttrType 6 = "IFA_CACHEINFO"+showAddrAttrType 7 = "IFA_MULTICAST"+showAddrAttrType 8 = "IFA_FLAGS"+showAddrAttrType i = "AddrAttrType #" ++ (show i)++ eIFA_UNSPEC :: (Num a) => a eIFA_UNSPEC = 0 eIFA_ADDRESS :: (Num a) => a@@ -487,8 +798,20 @@ eIFA_CACHEINFO = 6 eIFA_MULTICAST :: (Num a) => a eIFA_MULTICAST = 7+eIFA_FLAGS :: (Num a) => a+eIFA_FLAGS = 8 newtype RouteTableId = RouteTableId Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showRouteTableId :: (Num a) => (Show a) => (Eq a) => a -> String+showRouteTableId 0 = "RT_TABLE_UNSPEC"+showRouteTableId 252 = "RT_TABLE_COMPAT"+showRouteTableId 253 = "RT_TABLE_DEFAULT"+showRouteTableId 254 = "RT_TABLE_MAIN"+showRouteTableId 255 = "RT_TABLE_LOCAL"+showRouteTableId 4294967295 = "RT_TABLE_MAX"+showRouteTableId i = "RouteTableId #" ++ (show i)++ eRT_TABLE_UNSPEC :: (Num a) => a eRT_TABLE_UNSPEC = 0 eRT_TABLE_COMPAT :: (Num a) => a@@ -503,6 +826,26 @@ eRT_TABLE_MAX = 4294967295 newtype RouteProto = RouteProto Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showRouteProto :: (Num a) => (Show a) => (Eq a) => a -> String+showRouteProto 0 = "RTPROT_UNSPEC"+showRouteProto 1 = "RTPROT_REDIRECT"+showRouteProto 2 = "RTPROT_KERNEL"+showRouteProto 3 = "RTPROT_BOOT"+showRouteProto 4 = "RTPROT_STATIC"+showRouteProto 8 = "RTPROT_GATED"+showRouteProto 9 = "RTPROT_RA"+showRouteProto 10 = "RTPROT_MRT"+showRouteProto 11 = "RTPROT_ZEBRA"+showRouteProto 12 = "RTPROT_BIRD"+showRouteProto 13 = "RTPROT_DNROUTED"+showRouteProto 14 = "RTPROT_XORP"+showRouteProto 15 = "RTPROT_NTK"+showRouteProto 16 = "RTPROT_DHCP"+showRouteProto 17 = "RTPROT_MROUTED"+showRouteProto 42 = "RTPROT_BABEL"+showRouteProto i = "RouteProto #" ++ (show i)++ eRTPROT_UNSPEC :: (Num a) => a eRTPROT_UNSPEC = 0 eRTPROT_REDIRECT :: (Num a) => a@@ -531,8 +874,28 @@ eRTPROT_NTK = 15 eRTPROT_DHCP :: (Num a) => a eRTPROT_DHCP = 16+eRTPROT_MROUTED :: (Num a) => a+eRTPROT_MROUTED = 17+eRTPROT_BABEL :: (Num a) => a+eRTPROT_BABEL = 42 newtype RouteType = RouteType Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showRouteType :: (Num a) => (Show a) => (Eq a) => a -> String+showRouteType 0 = "RTN_UNSPEC"+showRouteType 1 = "RTN_UNICAST"+showRouteType 2 = "RTN_LOCAL"+showRouteType 3 = "RTN_BROADCAST"+showRouteType 4 = "RTN_ANYCAST"+showRouteType 5 = "RTN_MULTICAST"+showRouteType 6 = "RTN_BLACKHOLE"+showRouteType 7 = "RTN_UNREACHABLE"+showRouteType 8 = "RTN_PROHIBIT"+showRouteType 9 = "RTN_THROW"+showRouteType 10 = "RTN_NAT"+showRouteType 11 = "RTN_XRESOLVE"+showRouteType i = "RouteType #" ++ (show i)++ eRTN_UNSPEC :: (Num a) => a eRTN_UNSPEC = 0 eRTN_UNICAST :: (Num a) => a@@ -567,8 +930,37 @@ fRTM_F_EQUALIZE = 1024 fRTM_F_PREFIX :: (Num a, Bits a) => a fRTM_F_PREFIX = 2048+fRTM_F_LOOKUP_TABLE :: (Num a, Bits a) => a+fRTM_F_LOOKUP_TABLE = 4096 newtype RouteAttrType = RouteAttrType Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show) +showRouteAttrType :: (Num a) => (Show a) => (Eq a) => a -> String+showRouteAttrType 0 = "RTA_UNSPEC"+showRouteAttrType 1 = "RTA_DST"+showRouteAttrType 2 = "RTA_SRC"+showRouteAttrType 3 = "RTA_IIF"+showRouteAttrType 4 = "RTA_OIF"+showRouteAttrType 5 = "RTA_GATEWAY"+showRouteAttrType 6 = "RTA_PRIORITY"+showRouteAttrType 7 = "RTA_PREFSRC"+showRouteAttrType 8 = "RTA_METRICS"+showRouteAttrType 9 = "RTA_MULTIPATH"+showRouteAttrType 10 = "RTA_PROTOINFO"+showRouteAttrType 11 = "RTA_FLOW"+showRouteAttrType 12 = "RTA_CACHEINFO"+showRouteAttrType 13 = "RTA_SESSION"+showRouteAttrType 14 = "RTA_MP_ALGO"+showRouteAttrType 15 = "RTA_TABLE"+showRouteAttrType 16 = "RTA_MARK"+showRouteAttrType 17 = "RTA_MFC_STATS"+showRouteAttrType 18 = "RTA_VIA"+showRouteAttrType 19 = "RTA_NEWDST"+showRouteAttrType 20 = "RTA_PREF"+showRouteAttrType 21 = "RTA_ENCAP_TYPE"+showRouteAttrType 22 = "RTA_ENCAP"+showRouteAttrType i = "RouteAttrType #" ++ (show i)++ eRTA_UNSPEC :: (Num a) => a eRTA_UNSPEC = 0 eRTA_DST :: (Num a) => a@@ -601,3 +993,17 @@ eRTA_MP_ALGO = 14 eRTA_TABLE :: (Num a) => a eRTA_TABLE = 15+eRTA_MARK :: (Num a) => a+eRTA_MARK = 16+eRTA_MFC_STATS :: (Num a) => a+eRTA_MFC_STATS = 17+eRTA_VIA :: (Num a) => a+eRTA_VIA = 18+eRTA_NEWDST :: (Num a) => a+eRTA_NEWDST = 19+eRTA_PREF :: (Num a) => a+eRTA_PREF = 20+eRTA_ENCAP_TYPE :: (Num a) => a+eRTA_ENCAP_TYPE = 21+eRTA_ENCAP :: (Num a) => a+eRTA_ENCAP = 22
+ System/Linux/Netlink/GeNetlink.hs view
@@ -0,0 +1,103 @@+{-|+Module : System.Linux.Netlink.GeNetlink+Description : The base module for genetlink implementations+Maintainer : ongy+Stability : testing+Portability : Linux++GeNetlink is used as multiplexer since netlink only supports 32 families.++This module provides the basic datatypes used by genetlink.+-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-}+module System.Linux.Netlink.GeNetlink+where++import Data.List (intersperse)+import Data.Serialize.Get+import Data.Serialize.Put+import Data.Word (Word8)++-- Hide makeSocket since we will defien our own+import System.Linux.Netlink hiding (makeSocket)++{- |The static data used by genetlink++For more information about genetlink look into /usr/include/linux/genetlink.h+-}+data GenlHeader = GenlHeader+ {+ genlCmd :: Word8+ , genlVersion :: Word8+ } deriving (Eq)++-- |The 'Convertable' instance for 'GenlHeader'+instance Convertable GenlHeader where+ getPut = putGeHeader+ getGet _ = getGenlHeader++{- |A wrapper around 'GenlHeader'++This may be used by actual implementations to handle additional static data+placed after the genl header by the protocol they implement.+-}+data GenlData a = GenlData + {+ genlDataHeader :: GenlHeader+ , genlDataData :: a+ } deriving (Eq)++-- |The 'Convertable' instance for 'GenlData'+instance Convertable a => Convertable (GenlData a) where+ getPut (GenlData h a) = putGeHeader h >> getPut a+ getGet t = do+ hdr <- getGenlHeader+ dat <- getGet t+ return $GenlData hdr dat++-- |Type declaration for genetlink packets+type GenlPacket a = Packet (GenlData a)++-- |Show isntance of GenlHeader+instance Show GenlHeader where+ show (GenlHeader cmd ver) =+ "Header: Cmd = " ++ show cmd ++ ", Version: " ++ show ver ++ "\n"++-- |Show instance of GenlData+instance {-# OVERLAPPABLE #-} Show a => Show (GenlData a) where+ show (GenlData hdr content) =+ show hdr ++ show content++-- |Show instance of GenlData for NoData+instance Show (GenlData NoData) where+ show (GenlData hdr _) =+ show hdr++-- |Show Instance for GenlPacket+instance {-# OVERLAPPABLE #-} Show a => Show (GenlPacket a) where+ showList xs = ((concat . intersperse "===\n" . map show $xs) ++)+ show (Packet _ cus attrs) =+ "GenlPacket: " ++ show cus ++ "\n" +++ "Attrs: \n" ++ showNLAttrs attrs+ show p = showPacket p++-- |'Get' function for 'GenlHeader'+getGenlHeader :: Get GenlHeader+getGenlHeader = do+ cmd <- getWord8+ version <- getWord8+ _ <- getWord16host+ return $GenlHeader cmd version++-- |'Put' function for 'GenlHeader'+putGeHeader :: GenlHeader -> Put+putGeHeader gehdr = do+ putWord8 $ genlCmd gehdr+ putWord8 $ genlVersion gehdr+ putWord16host 0++-- |'makeSocketGeneric' preapplied for genetlink family+makeSocket :: IO NetlinkSocket+makeSocket = makeSocketGeneric 16+
+ System/Linux/Netlink/GeNetlink/Constants.hs view
@@ -0,0 +1,100 @@+{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+module System.Linux.Netlink.GeNetlink.Constants (ControlCommand, showControlCommand, eCTRL_CMD_UNSPEC, eCTRL_CMD_NEWFAMILY, eCTRL_CMD_DELFAMILY, eCTRL_CMD_GETFAMILY, eCTRL_CMD_NEWOPS, eCTRL_CMD_DELOPS, eCTRL_CMD_GETOPS, eCTRL_CMD_NEWMCAST_GRP, eCTRL_CMD_DELMCAST_GRP, eCTRL_CMD_GETMCAST_GRP, CtrlAttr, showCtrlAttr, eCTRL_ATTR_UNSPEC, eCTRL_ATTR_FAMILY_ID, eCTRL_ATTR_FAMILY_NAME, eCTRL_ATTR_VERSION, eCTRL_ATTR_HDRSIZE, eCTRL_ATTR_MAXATTR, eCTRL_ATTR_OPS, eCTRL_ATTR_MCAST_GROUPS, CtrlAttrOp, showCtrlAttrOp, eCTRL_ATTR_OP_UNSPEC, eCTRL_ATTR_OP_ID, eCTRL_ATTR_OP_FLAGS, CtrlAttrMcast, showCtrlAttrMcast, eCTRL_ATTR_MCAST_GRP_UNSPEC, eCTRL_ATTR_MCAST_GRP_NAME, eCTRL_ATTR_MCAST_GRP_ID) where++newtype ControlCommand = ControlCommand Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showControlCommand :: (Num a) => (Show a) => (Eq a) => a -> String+showControlCommand 0 = "CTRL_CMD_UNSPEC"+showControlCommand 1 = "CTRL_CMD_NEWFAMILY"+showControlCommand 2 = "CTRL_CMD_DELFAMILY"+showControlCommand 3 = "CTRL_CMD_GETFAMILY"+showControlCommand 4 = "CTRL_CMD_NEWOPS"+showControlCommand 5 = "CTRL_CMD_DELOPS"+showControlCommand 6 = "CTRL_CMD_GETOPS"+showControlCommand 7 = "CTRL_CMD_NEWMCAST_GRP"+showControlCommand 8 = "CTRL_CMD_DELMCAST_GRP"+showControlCommand 9 = "CTRL_CMD_GETMCAST_GRP"+showControlCommand i = "ControlCommand #" ++ (show i)+++eCTRL_CMD_UNSPEC :: (Num a) => a+eCTRL_CMD_UNSPEC = 0+eCTRL_CMD_NEWFAMILY :: (Num a) => a+eCTRL_CMD_NEWFAMILY = 1+eCTRL_CMD_DELFAMILY :: (Num a) => a+eCTRL_CMD_DELFAMILY = 2+eCTRL_CMD_GETFAMILY :: (Num a) => a+eCTRL_CMD_GETFAMILY = 3+eCTRL_CMD_NEWOPS :: (Num a) => a+eCTRL_CMD_NEWOPS = 4+eCTRL_CMD_DELOPS :: (Num a) => a+eCTRL_CMD_DELOPS = 5+eCTRL_CMD_GETOPS :: (Num a) => a+eCTRL_CMD_GETOPS = 6+eCTRL_CMD_NEWMCAST_GRP :: (Num a) => a+eCTRL_CMD_NEWMCAST_GRP = 7+eCTRL_CMD_DELMCAST_GRP :: (Num a) => a+eCTRL_CMD_DELMCAST_GRP = 8+eCTRL_CMD_GETMCAST_GRP :: (Num a) => a+eCTRL_CMD_GETMCAST_GRP = 9+newtype CtrlAttr = CtrlAttr Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showCtrlAttr :: (Num a) => (Show a) => (Eq a) => a -> String+showCtrlAttr 0 = "CTRL_ATTR_UNSPEC"+showCtrlAttr 1 = "CTRL_ATTR_FAMILY_ID"+showCtrlAttr 2 = "CTRL_ATTR_FAMILY_NAME"+showCtrlAttr 3 = "CTRL_ATTR_VERSION"+showCtrlAttr 4 = "CTRL_ATTR_HDRSIZE"+showCtrlAttr 5 = "CTRL_ATTR_MAXATTR"+showCtrlAttr 6 = "CTRL_ATTR_OPS"+showCtrlAttr 7 = "CTRL_ATTR_MCAST_GROUPS"+showCtrlAttr i = "CtrlAttr #" ++ (show i)+++eCTRL_ATTR_UNSPEC :: (Num a) => a+eCTRL_ATTR_UNSPEC = 0+eCTRL_ATTR_FAMILY_ID :: (Num a) => a+eCTRL_ATTR_FAMILY_ID = 1+eCTRL_ATTR_FAMILY_NAME :: (Num a) => a+eCTRL_ATTR_FAMILY_NAME = 2+eCTRL_ATTR_VERSION :: (Num a) => a+eCTRL_ATTR_VERSION = 3+eCTRL_ATTR_HDRSIZE :: (Num a) => a+eCTRL_ATTR_HDRSIZE = 4+eCTRL_ATTR_MAXATTR :: (Num a) => a+eCTRL_ATTR_MAXATTR = 5+eCTRL_ATTR_OPS :: (Num a) => a+eCTRL_ATTR_OPS = 6+eCTRL_ATTR_MCAST_GROUPS :: (Num a) => a+eCTRL_ATTR_MCAST_GROUPS = 7+newtype CtrlAttrOp = CtrlAttrOp Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showCtrlAttrOp :: (Num a) => (Show a) => (Eq a) => a -> String+showCtrlAttrOp 0 = "CTRL_ATTR_OP_UNSPEC"+showCtrlAttrOp 1 = "CTRL_ATTR_OP_ID"+showCtrlAttrOp 2 = "CTRL_ATTR_OP_FLAGS"+showCtrlAttrOp i = "CtrlAttrOp #" ++ (show i)+++eCTRL_ATTR_OP_UNSPEC :: (Num a) => a+eCTRL_ATTR_OP_UNSPEC = 0+eCTRL_ATTR_OP_ID :: (Num a) => a+eCTRL_ATTR_OP_ID = 1+eCTRL_ATTR_OP_FLAGS :: (Num a) => a+eCTRL_ATTR_OP_FLAGS = 2+newtype CtrlAttrMcast = CtrlAttrMcast Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showCtrlAttrMcast :: (Num a) => (Show a) => (Eq a) => a -> String+showCtrlAttrMcast 0 = "CTRL_ATTR_MCAST_GRP_UNSPEC"+showCtrlAttrMcast 1 = "CTRL_ATTR_MCAST_GRP_NAME"+showCtrlAttrMcast 2 = "CTRL_ATTR_MCAST_GRP_ID"+showCtrlAttrMcast i = "CtrlAttrMcast #" ++ (show i)+++eCTRL_ATTR_MCAST_GRP_UNSPEC :: (Num a) => a+eCTRL_ATTR_MCAST_GRP_UNSPEC = 0+eCTRL_ATTR_MCAST_GRP_NAME :: (Num a) => a+eCTRL_ATTR_MCAST_GRP_NAME = 1+eCTRL_ATTR_MCAST_GRP_ID :: (Num a) => a+eCTRL_ATTR_MCAST_GRP_ID = 2
+ System/Linux/Netlink/GeNetlink/Control.hs view
@@ -0,0 +1,268 @@+{-# LANGUAGE CPP #-}+{-|+Module : System.Linux.Netlink.GeNetlink.Control+Description : This module implements the control protocol of genetlink+Maintainer : ongy+Stability : testing+Portability : Linux++This module provides utility functions and datatypes for the genetlink control+protocol.+This has to be used by implementations of netlink families based on genetlink+to lookup their current id, since that is determined at runtime.+-}++module System.Linux.Netlink.GeNetlink.Control+ ( CtrlAttribute(..)+ , CtrlAttrMcastGroup(..)+ , CtrlPacket(..)+ , CTRLPacket+ , ctrlPacketFromGenl+ , CtrlAttrOpData(..)++ , ctrlPackettoGenl+ , getFamilyId+ , getFamilyIdS+ , getFamilyWithMulticasts+ , getFamilyWithMulticastsS+ , getMulticastGroups+ , getMulticast+ , getFamilie+ , getFamilies+ )+where++#if MIN_VERSION_base(4,8,0)+#else+import Control.Applicative ((<$>))+#endif++import Data.Bits ((.|.))+import Data.Serialize.Get+import Data.Serialize.Put+import Data.List (intercalate)+import Data.Map (fromList, lookup, toList, Map)+import Data.ByteString (ByteString, append, empty)+import Data.ByteString.Char8 (pack, unpack)+import Data.Word (Word16, Word32)+import Data.Maybe (fromMaybe, mapMaybe)++import Prelude hiding (lookup)++import System.Linux.Netlink+import System.Linux.Netlink.Constants+import System.Linux.Netlink.GeNetlink+import System.Linux.Netlink.GeNetlink.Constants+import System.Linux.Netlink.Helpers (g32, g16)++-- |Datatype for multicast groups as returned by the control protocol+data CtrlAttrMcastGroup = CAMG {grpName :: String, grpId :: Word32 } deriving (Eq, Show)+-- |Datatype for AttrOpData as returned by the control protocol+data CtrlAttrOpData = CAO {opId :: Word32, opFlags :: Word32 } deriving (Eq, Show)++-- |Attributes defined by the control family+data CtrlAttribute =+ CTRL_ATTR_UNSPEC ByteString |+ CTRL_ATTR_FAMILY_ID Word16 |+ CTRL_ATTR_FAMILY_NAME String |+ CTRL_ATTR_VERSION Word32 |+ CTRL_ATTR_HDRSIZE Word32 |+ CTRL_ATTR_MAXATTR Word32 |+ CTRL_ATTR_OPS [CtrlAttrOpData] |+ CTRL_ATTR_MCAST_GROUPS [CtrlAttrMcastGroup] |+ CTRL_ATTR_UNKNOWN Int ByteString+ deriving (Eq, Show)+++-- |Typesafe control packet+data CtrlPacket = CtrlPacket+ {+ ctrlHeader :: Header+ , ctrlGeHeader :: GenlHeader+ , ctrlAttributes :: [CtrlAttribute]+ } deriving (Eq)+++instance Show CtrlPacket where+ show packet = + show (ctrlHeader packet) ++ '\n':show (ctrlGeHeader packet) +++ "Attrs:\n" ++ intercalate "\n" (map show (ctrlAttributes packet))+++-- |typedef for control messages+type CTRLPacket = GenlPacket NoData++--+-- Start ctrl utility+--++getW16 :: ByteString -> Maybe Word16+getW16 x = e2M (runGet g16 x)++getW32 :: ByteString -> Maybe Word32+getW32 x = e2M (runGet g32 x)++e2M :: Either a b -> Maybe b+e2M (Right x) = Just x+e2M _ = Nothing++getMcastGroupAttr :: (Int, ByteString) -> Maybe CtrlAttrMcastGroup+getMcastGroupAttr (_, x) = do+ attrs <- e2M $runGet getAttributes x+ name <- lookup eCTRL_ATTR_MCAST_GRP_NAME attrs+ fid <- lookup eCTRL_ATTR_MCAST_GRP_ID attrs+ -- This init is ok because the name will always have the \0+ CAMG (init . unpack $ name) <$> getW32 fid++getMcastGroupAttrs :: ByteString -> Maybe [CtrlAttrMcastGroup]+getMcastGroupAttrs x = case runGet getAttributes x of+ (Right y) -> mapM getMcastGroupAttr $ toList y+ _ -> Nothing++getOpAttr :: (Int, ByteString) -> Maybe CtrlAttrOpData+getOpAttr (_, x) = do+ attrs <- e2M $runGet getAttributes x+ oid <- getW32 =<< lookup eCTRL_ATTR_OP_ID attrs+ ofl <- getW32 =<< lookup eCTRL_ATTR_OP_FLAGS attrs+ return $ CAO oid ofl++getOpAttrs :: ByteString -> Maybe [CtrlAttrOpData]+getOpAttrs x = case runGet getAttributes x of+ (Right y) -> mapM getOpAttr $ toList y+ _ -> Nothing++getAttribute :: (Int, ByteString) -> CtrlAttribute+getAttribute (i, x) = fromMaybe (CTRL_ATTR_UNKNOWN i x) $makeAttribute i x++makeAttribute :: Int -> ByteString -> Maybe CtrlAttribute+makeAttribute i x+ | i == eCTRL_ATTR_UNSPEC = Just $CTRL_ATTR_UNSPEC x+ | i == eCTRL_ATTR_FAMILY_ID = fmap CTRL_ATTR_FAMILY_ID $getW16 x+ | i == eCTRL_ATTR_FAMILY_NAME = Just . CTRL_ATTR_FAMILY_NAME . init $unpack x+ | i == eCTRL_ATTR_VERSION = fmap CTRL_ATTR_VERSION $getW32 x+ | i == eCTRL_ATTR_HDRSIZE = fmap CTRL_ATTR_HDRSIZE $getW32 x+ | i == eCTRL_ATTR_MAXATTR = fmap CTRL_ATTR_MAXATTR $getW32 x+ | i == eCTRL_ATTR_OPS = fmap CTRL_ATTR_OPS $getOpAttrs x+ | i == eCTRL_ATTR_MCAST_GROUPS = fmap CTRL_ATTR_MCAST_GROUPS $getMcastGroupAttrs x+ | otherwise = Nothing+++ctrlAttributesFromAttributes :: Map Int ByteString -> [CtrlAttribute]+ctrlAttributesFromAttributes = map getAttribute . toList++-- |Convert "normal" 'Packet's into typesafe 'CtrlPacket's+ctrlPacketFromGenl :: CTRLPacket -> Maybe CtrlPacket+ctrlPacketFromGenl (Packet h g attrs) = Just (CtrlPacket h (genlDataHeader g) a)+ where a = ctrlAttributesFromAttributes attrs+ctrlPacketFromGenl _ = Nothing+++putW16 :: Word16 -> ByteString+putW16 x = runPut (putWord16host x)+++putW32 :: Word32 -> ByteString+putW32 x = runPut (putWord32host x)+++-- AttrOps and McastGroup are broken, but generally we shouldn't send these anyway+cATA :: CtrlAttribute -> (Int, ByteString)+cATA (CTRL_ATTR_UNSPEC x) = (eCTRL_ATTR_UNSPEC , x)+cATA (CTRL_ATTR_FAMILY_ID x) = (eCTRL_ATTR_FAMILY_ID , putW16 x)+cATA (CTRL_ATTR_FAMILY_NAME x) = (eCTRL_ATTR_FAMILY_NAME , pack (x ++ "\n"))+cATA (CTRL_ATTR_VERSION x) = (eCTRL_ATTR_VERSION , putW32 x)+cATA (CTRL_ATTR_HDRSIZE x) = (eCTRL_ATTR_HDRSIZE , putW32 x)+cATA (CTRL_ATTR_MAXATTR x) = (eCTRL_ATTR_MAXATTR , putW32 x)+cATA (CTRL_ATTR_OPS _) = (eCTRL_ATTR_OPS , empty)+cATA (CTRL_ATTR_MCAST_GROUPS _) = (eCTRL_ATTR_MCAST_GROUPS, empty)+cATA (CTRL_ATTR_UNKNOWN i x) = (i , x)+++ctrlAttributesToAttribute :: CtrlAttribute -> (Int, ByteString)+ctrlAttributesToAttribute = cATA+++-- |Convert the typesafe 'CtrPacket' into a 'CTRLPacket' so it can be sent+ctrlPackettoGenl :: CtrlPacket -> CTRLPacket+ctrlPackettoGenl (CtrlPacket h g attrs)= Packet h (GenlData g NoData) a+ where a = fromList $map ctrlAttributesToAttribute attrs+++-- Hardcoding the request ID is not the most elegant, but shouldn't be a problem+-- since the family should be obvious in the answer+familyMcastRequest :: Word16 -> CTRLPacket+familyMcastRequest fid = let+ header = Header 16 fNLM_F_REQUEST 42 0+ geheader = GenlHeader eCTRL_CMD_GETFAMILY 0+ attrs = fromList [(eCTRL_ATTR_FAMILY_ID, runPut $putWord16host fid)] in+ Packet header (GenlData geheader NoData) attrs+++familyIdRequest :: String -> CTRLPacket+familyIdRequest name = let+ header = Header 16 fNLM_F_REQUEST 33 0+ geheader = GenlHeader eCTRL_CMD_GETFAMILY 0+ attrs = fromList [(eCTRL_ATTR_FAMILY_NAME, pack name `append` pack "\0")] in+ Packet header (GenlData geheader NoData) attrs++-- |A safe version of 'getFamilyId'+getFamilyIdS :: NetlinkSocket -> String -> IO (Maybe Word16)+getFamilyIdS s m = do+ may <- getFamilyWithMulticastsS s m+ return $fmap fst may++-- |A safe version of 'getFamilyWithMulticasts'+getFamilyWithMulticastsS :: NetlinkSocket -> String -> IO (Maybe (Word16, [CtrlAttrMcastGroup]))+getFamilyWithMulticastsS s m = do+ packet <- queryOne s (familyIdRequest m)+ let ctrl = ctrlPacketFromGenl packet+ return $ makeTupl . ctrlAttributes <$> ctrl+ where getIdFromList (CTRL_ATTR_FAMILY_ID x:_) = x+ getIdFromList (_:xs) = getIdFromList xs+ getIdFromList [] = -1+ makeTupl attrs = (getIdFromList attrs, getMCFromList attrs)++-- |Get the id for a netlink family by name+getFamilyId :: NetlinkSocket -> String -> IO Word16+getFamilyId = fmap (fmap fst) . getFamilyWithMulticasts++-- |get the id and multicast groups of a netlink family by name+getFamilyWithMulticasts :: NetlinkSocket -> String -> IO (Word16, [CtrlAttrMcastGroup])+getFamilyWithMulticasts s m = do+ may <- getFamilyWithMulticastsS s m+ return $fromMaybe (error "Could not find family") may+++-- |Get the 'CtrlPacket' describing a single family+getFamilie :: NetlinkSocket -> String -> IO (Maybe CtrlPacket)+getFamilie sock name =+ ctrlPacketFromGenl <$> queryOne sock (familyIdRequest name)++-- |Get 'CtrlPacket's for every currently registered GeNetlink family+getFamilies :: NetlinkSocket -> IO [CtrlPacket]+getFamilies sock = do+ mapMaybe ctrlPacketFromGenl <$> query sock familiesRequest+ where familiesRequest = let header = Header 16 (fNLM_F_REQUEST .|. fNLM_F_ROOT .|. fNLM_F_MATCH) 33 0+ geheader = GenlHeader eCTRL_CMD_GETFAMILY 0+ attrs = fromList [] in+ Packet header (GenlData geheader NoData) attrs+++-- |get the mutlicast groups of a netlink family by id+getMulticastGroups :: NetlinkSocket -> Word16 -> IO [CtrlAttrMcastGroup]+getMulticastGroups sock fid = do+ packet <- queryOne sock (familyMcastRequest fid)+ let (CtrlPacket _ _ attrs) = fromMaybe (error "Got infalid family id for request") . ctrlPacketFromGenl $packet+ return $getMCFromList attrs++getMCFromList :: [CtrlAttribute] -> [CtrlAttrMcastGroup]+getMCFromList (CTRL_ATTR_MCAST_GROUPS x:_) = x+getMCFromList (_:xs) = getMCFromList xs+getMCFromList [] = []++-- |Get id of multicast group by name+getMulticast :: String -> [CtrlAttrMcastGroup] -> Maybe Word32+getMulticast _ [] = Nothing+getMulticast name (CAMG gname gid:xs) = if name == gname+ then Just gid+ else getMulticast name xs
+ System/Linux/Netlink/GeNetlink/NL80211.hs view
@@ -0,0 +1,253 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-}+{-|+Module : System.Linux.Netlink.GeNetlink.NL80211+Description : Implementation of NL80211+Maintainer : ongy+Stability : testing+Portability : Linux++This module providis utility functions for NL80211 subsystem.+For more information see /usr/include/linux/nl80211.h+-}+module System.Linux.Netlink.GeNetlink.NL80211+ ( NL80211Socket+ , NL80211Packet+ , getWifiEIDs++ , makeNL80211Socket+ , joinMulticastByName+ , queryOne+ , query+ , getInterfaceList+ , getScanResults+ , getConnectedWifi+ , getWifiAttributes+ , getPacket+ , getFd+ , getMulticastGroups+ )+where++#if MIN_VERSION_base(4,8,0)+#else+import Control.Applicative ((<$>))+#endif++import Control.Monad.Loops (whileM)+import Data.Bits ((.|.))+import Data.ByteString.Char8 (unpack)+import Data.List (intercalate)+import Data.Maybe (mapMaybe)+import Data.Serialize.Get (runGet, getByteString, getWord8 ,getWord32host, isEmpty, Get)+import Data.Serialize.Put (runPut, putWord32host)+import Data.Word (Word32, Word16, Word8)++import Data.ByteString (ByteString)+import qualified Data.ByteString as BS (length)+import qualified Data.Map as M (empty, lookup, fromList, member, toList)++import System.Posix.Types (Fd)++import System.Linux.Netlink.Helpers (indent)+import System.Linux.Netlink.Constants+import System.Linux.Netlink.GeNetlink+import System.Linux.Netlink.GeNetlink.Control hiding (getMulticastGroups)+import qualified System.Linux.Netlink.GeNetlink.Control as C+import System.Linux.Netlink.GeNetlink.NL80211.Constants+import System.Linux.Netlink hiding (makeSocket, queryOne, query, recvOne, getPacket)+import qualified System.Linux.Netlink as I (queryOne, query, recvOne)++-- The Netlink socket with Family Id, so we don't need as many arguments+-- everywhere+-- |Wrapper for 'NetlinkSocket' we also need the family id for messages we construct+data NL80211Socket = NLS NetlinkSocket Word16++data NoData80211 = NoData80211 deriving (Eq, Show)++instance Convertable NoData80211 where+ getPut _ = return ()+ getGet _ = return NoData80211++-- |typedef for messages send by this mdoule+type NL80211Packet = GenlPacket NoData80211++instance Show NL80211Packet where+ showList xs = ((intercalate "===\n" . map show $xs) ++)+ show (Packet _ cus attrs) =+ "NL80211Packet: " ++ showNL80211Command cus ++ "\n" +++ "Attrs: \n" ++ concatMap showNL80211Attr (M.toList attrs) ++ "\n"+ show p = showPacket p++showNL80211Command :: (GenlData NoData80211) -> String+showNL80211Command (GenlData (GenlHeader cmd _) _ ) =+ showNL80211Commands cmd++showNL80211Attr :: (Int, ByteString) -> String+showNL80211Attr (i, v)+ | i == eNL80211_ATTR_STA_INFO = showStaInfo v+ | i == eNL80211_ATTR_RESP_IE = showWifiEid v+ | i == eNL80211_ATTR_BSS = showAttrBss v+ | otherwise = showAttr showNL80211Attrs (i, v)++showStaInfo :: ByteString -> String+showStaInfo bs = let attrs = getRight $ runGet getAttributes bs in+ "NL80211_ATTR_STA_INFO: " ++ show (BS.length bs) ++ "\n" +++ (indent $showAttrs showNl80211StaInfo attrs)++showWifiEid :: ByteString -> String+showWifiEid bs = let attrs = getRight $ runGet getWifiEIDs bs in+ "WifiEIDs:\n" +++ (indent $showAttrs showIEEE80211EID attrs)++showAttrBss :: ByteString -> String+showAttrBss bs = let attrs = getRight $ runGet getAttributes bs in+ "NL80211_ATTR_BSS: " ++ show (BS.length bs) ++ "\n" +++ (indent . concatMap showBssAttr $ M.toList attrs)++showBssAttr :: (Int, ByteString) -> String+showBssAttr (i, v)+ | i == eNL80211_BSS_INFORMATION_ELEMENTS = "NL80211_BSS_INFORMATION_ELEMENTS " ++ showWifiEid v+ | i == eNL80211_BSS_BEACON_IES = "NL80211_BSS_BEACON_IES " ++ showWifiEid v+ | otherwise = showAttr showNL80211Bss (i, v)++-- |Get the raw fd from a 'NL80211Socket'. This can be used for eventing+getFd :: NL80211Socket -> Fd+getFd (NLS s _) = getNetlinkFd s++-- |'Get' the EID Attributes from a buffer+getWifiEIDs :: Get Attributes+getWifiEIDs = M.fromList <$> whileM (not <$> isEmpty) getWifiEID++-- |'Get' an EID attribute from a buffer+getWifiEID :: Get (Int, ByteString)+getWifiEID = do+ ty <- fromIntegral <$> getWord8+ len <- fromIntegral <$> getWord8+ val <- getByteString len+ return (ty, val)++getRight :: Show a => Either a b -> b+getRight (Right x) = x+getRight (Left err) = error $show err+++-- |Create a 'NL80211Socket' this opens a genetlink socket and gets the family id+makeNL80211Socket :: IO NL80211Socket+makeNL80211Socket = do+ sock <- makeSocket+ fid <- getFamilyId sock "nl80211"+ return $NLS sock fid+++-- |Join a nl80211 multicast group by name+joinMulticastByName :: NL80211Socket -> String -> IO ()+joinMulticastByName (NLS sock _) name = do+ (_, m) <- getFamilyWithMulticasts sock "nl80211"+ let gid = getMulticast name m+ case gid of+ Nothing -> error $"Could not find \"" ++ name ++ "\" multicast group"+ Just x -> joinMulticastGroup sock x+++-- |Get the names of all multicast groups this nl80211 implementation provides+getMulticastGroups :: NL80211Socket -> IO [String]+getMulticastGroups (NLS sock fid) =+ map grpName <$> C.getMulticastGroups sock fid+++getRequestPacket :: Word16 -> Word8 -> Bool -> Attributes -> NL80211Packet+getRequestPacket fid cmd dump attrs =+ let header = Header (fromIntegral fid) flags 0 0+ geheader = GenlHeader cmd 0 in+ Packet header (GenlData geheader NoData80211) attrs+ where flags = if dump then fNLM_F_REQUEST .|. fNLM_F_MATCH .|. fNLM_F_ROOT else fNLM_F_REQUEST+++-- |queryOne for NL80211 (see 'System.Linux.Netlink.queryOne')+queryOne :: NL80211Socket -> Word8 -> Bool -> Attributes -> IO NL80211Packet+queryOne (NLS sock fid) cmd dump attrs = I.queryOne sock packet+ where packet = getRequestPacket fid cmd dump attrs++-- |query for NL80211 (see 'System.Linux.Netlink.query')+query :: NL80211Socket -> Word8 -> Bool -> Attributes -> IO [NL80211Packet]+query (NLS sock fid) cmd dump attrs = I.query sock packet+ where packet = getRequestPacket fid cmd dump attrs+++parseInterface :: (ByteString, ByteString) -> (String, Word32)+parseInterface (name, ifindex) = + --This init is ok because the name will always have a \0+ (init $unpack name, getRight $runGet getWord32host ifindex)+++-- |Get the list of interfaces currently managed by NL80211+getInterfaceList :: NL80211Socket -> IO [(String, Word32)]+getInterfaceList sock = do+ interfaces <- query sock eNL80211_CMD_GET_INTERFACE True M.empty+ return $ mapMaybe (fmap parseInterface . toTuple) interfaces+ where toTuple :: NL80211Packet -> Maybe (ByteString, ByteString)+ toTuple (Packet _ _ attrs) = do+ name <- M.lookup eNL80211_ATTR_IFNAME attrs+ findex <- M.lookup eNL80211_ATTR_IFINDEX attrs+ return (name, findex)+ toTuple x@(ErrorMsg{}) =+ error ("Something happend while getting the interfaceList: " ++ show x)+ toTuple (DoneMsg _) = Nothing+++{- |get scan results++In testing this could be a big chunk of data when a scan just happened+or be pretty much only the currently connected wifi.++For more information about how this is structured look into kernel source+or just try it out.+-}+getScanResults+ :: NL80211Socket+ -> Word32 -- ^The id of the interface for which this should be looked up+ -> IO [NL80211Packet]+getScanResults sock ifindex = query sock eNL80211_CMD_GET_SCAN True attrs+ where attrs = M.fromList [(eNL80211_ATTR_IFINDEX, runPut $putWord32host ifindex)]++{- |Get the information about the currently connected wifi(s).++This would technically work for multiple connected wifis, but since we only get+information about one interface this should only ever be emtpy on a singleton list.++For more information about how this is structured look into kernel soruce+or just try it out.+-}+getConnectedWifi+ :: NL80211Socket+ -> Word32 -- ^The id of the interface for which this should be looked up+ -> IO [NL80211Packet]+getConnectedWifi sock ifindex = filter isConn <$> getScanResults sock ifindex+ where isConn :: NL80211Packet -> Bool+ isConn (Packet _ _ attrs) = hasConn $M.lookup eNL80211_ATTR_BSS attrs+ -- -16 is -EBUSY, which will be returned IF and (as far as I could see) only IF another dump+ -- is already in progress, so retrying should get something useful+ -- For other error codes we don't know for sure and want to return the error to the user+ isConn x@(ErrorMsg _ e _) = if e == (-16)+ then False+ else error ("Something stupid happened" ++ show x)+ isConn (DoneMsg _) = False+ hasConn Nothing = False+ hasConn (Just attrs) = M.member eNL80211_BSS_STATUS $getRight $runGet getAttributes attrs+++-- |Get the EID attributes from a 'NL80211Packet' (for example from 'getConnectedWifi'+getWifiAttributes :: NL80211Packet -> Maybe Attributes+getWifiAttributes (Packet _ _ attrs) =+ getRight <$> runGet getWifiEIDs <$> eids+ where bssattrs = getRight . runGet getAttributes <$> M.lookup eNL80211_ATTR_BSS attrs+ eids = M.lookup eNL80211_BSS_INFORMATION_ELEMENTS =<< bssattrs+getWifiAttributes x@(ErrorMsg{}) = error ("Something stupid happened" ++ show x)+getWifiAttributes (DoneMsg _) = Nothing+++-- |NL80211 version of 'System.Linux.Netlink.recvOne'+getPacket :: NL80211Socket -> IO [NL80211Packet]+getPacket (NLS sock _) = I.recvOne sock
+ System/Linux/Netlink/GeNetlink/NL80211/Constants.hs view
@@ -0,0 +1,1717 @@+{-# OPTIONS_HADDOCK hide, prune, ignore-exports #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+module System.Linux.Netlink.GeNetlink.NL80211.Constants (NL80211Commands, showNL80211Commands, eNL80211_CMD_UNSPEC, eNL80211_CMD_GET_WIPHY, eNL80211_CMD_SET_WIPHY, eNL80211_CMD_NEW_WIPHY, eNL80211_CMD_DEL_WIPHY, eNL80211_CMD_GET_INTERFACE, eNL80211_CMD_SET_INTERFACE, eNL80211_CMD_NEW_INTERFACE, eNL80211_CMD_DEL_INTERFACE, eNL80211_CMD_GET_KEY, eNL80211_CMD_SET_KEY, eNL80211_CMD_NEW_KEY, eNL80211_CMD_DEL_KEY, eNL80211_CMD_GET_BEACON, eNL80211_CMD_SET_BEACON, eNL80211_CMD_NEW_BEACON, eNL80211_CMD_START_AP, eNL80211_CMD_DEL_BEACON, eNL80211_CMD_STOP_AP, eNL80211_CMD_GET_STATION, eNL80211_CMD_SET_STATION, eNL80211_CMD_NEW_STATION, eNL80211_CMD_DEL_STATION, eNL80211_CMD_GET_MPATH, eNL80211_CMD_SET_MPATH, eNL80211_CMD_NEW_MPATH, eNL80211_CMD_DEL_MPATH, eNL80211_CMD_SET_BSS, eNL80211_CMD_SET_REG, eNL80211_CMD_REQ_SET_REG, eNL80211_CMD_GET_MESH_CONFIG, eNL80211_CMD_SET_MESH_CONFIG, eNL80211_CMD_SET_MGMT_EXTRA_IE, eNL80211_CMD_GET_REG, eNL80211_CMD_GET_SCAN, eNL80211_CMD_TRIGGER_SCAN, eNL80211_CMD_NEW_SCAN_RESULTS, eNL80211_CMD_SCAN_ABORTED, eNL80211_CMD_REG_CHANGE, eNL80211_CMD_AUTHENTICATE, eNL80211_CMD_ASSOCIATE, eNL80211_CMD_DEAUTHENTICATE, eNL80211_CMD_DISASSOCIATE, eNL80211_CMD_MICHAEL_MIC_FAILURE, eNL80211_CMD_REG_BEACON_HINT, eNL80211_CMD_JOIN_IBSS, eNL80211_CMD_LEAVE_IBSS, eNL80211_CMD_TESTMODE, eNL80211_CMD_CONNECT, eNL80211_CMD_ROAM, eNL80211_CMD_DISCONNECT, eNL80211_CMD_SET_WIPHY_NETNS, eNL80211_CMD_GET_SURVEY, eNL80211_CMD_NEW_SURVEY_RESULTS, eNL80211_CMD_SET_PMKSA, eNL80211_CMD_DEL_PMKSA, eNL80211_CMD_FLUSH_PMKSA, eNL80211_CMD_REMAIN_ON_CHANNEL, eNL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, eNL80211_CMD_SET_TX_BITRATE_MASK, eNL80211_CMD_REGISTER_ACTION, eNL80211_CMD_REGISTER_FRAME, eNL80211_CMD_ACTION, eNL80211_CMD_FRAME, eNL80211_CMD_ACTION_TX_STATUS, eNL80211_CMD_FRAME_TX_STATUS, eNL80211_CMD_SET_POWER_SAVE, eNL80211_CMD_GET_POWER_SAVE, eNL80211_CMD_SET_CQM, eNL80211_CMD_NOTIFY_CQM, eNL80211_CMD_SET_CHANNEL, eNL80211_CMD_SET_WDS_PEER, eNL80211_CMD_FRAME_WAIT_CANCEL, eNL80211_CMD_JOIN_MESH, eNL80211_CMD_LEAVE_MESH, eNL80211_CMD_UNPROT_DEAUTHENTICATE, eNL80211_CMD_UNPROT_DISASSOCIATE, eNL80211_CMD_NEW_PEER_CANDIDATE, eNL80211_CMD_GET_WOWLAN, eNL80211_CMD_SET_WOWLAN, eNL80211_CMD_START_SCHED_SCAN, eNL80211_CMD_STOP_SCHED_SCAN, eNL80211_CMD_SCHED_SCAN_RESULTS, eNL80211_CMD_SCHED_SCAN_STOPPED, eNL80211_CMD_SET_REKEY_OFFLOAD, eNL80211_CMD_PMKSA_CANDIDATE, eNL80211_CMD_TDLS_OPER, eNL80211_CMD_TDLS_MGMT, eNL80211_CMD_UNEXPECTED_FRAME, eNL80211_CMD_PROBE_CLIENT, eNL80211_CMD_REGISTER_BEACONS, eNL80211_CMD_UNEXPECTED_4ADDR_FRAME, eNL80211_CMD_SET_NOACK_MAP, eNL80211_CMD_CH_SWITCH_NOTIFY, eNL80211_CMD_START_P2P_DEVICE, eNL80211_CMD_STOP_P2P_DEVICE, eNL80211_CMD_CONN_FAILED, eNL80211_CMD_SET_MCAST_RATE, eNL80211_CMD_SET_MAC_ACL, eNL80211_CMD_RADAR_DETECT, eNL80211_CMD_GET_PROTOCOL_FEATURES, eNL80211_CMD_UPDATE_FT_IES, eNL80211_CMD_FT_EVENT, eNL80211_CMD_CRIT_PROTOCOL_START, eNL80211_CMD_CRIT_PROTOCOL_STOP, eNL80211_CMD_GET_COALESCE, eNL80211_CMD_SET_COALESCE, eNL80211_CMD_CHANNEL_SWITCH, eNL80211_CMD_VENDOR, eNL80211_CMD_SET_QOS_MAP, eNL80211_CMD_ADD_TX_TS, eNL80211_CMD_DEL_TX_TS, eNL80211_CMD_GET_MPP, eNL80211_CMD_JOIN_OCB, eNL80211_CMD_LEAVE_OCB, eNL80211_CMD_CH_SWITCH_STARTED_NOTIFY, eNL80211_CMD_TDLS_CHANNEL_SWITCH, eNL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, eNL80211_CMD_MAX, eNL80211_CMD_WIPHY_REG_CHANGE, NL80211Attrs, showNL80211Attrs, eNL80211_ATTR_UNSPEC, eNL80211_ATTR_WIPHY, eNL80211_ATTR_WIPHY_NAME, eNL80211_ATTR_IFINDEX, eNL80211_ATTR_IFNAME, eNL80211_ATTR_IFTYPE, eNL80211_ATTR_MAC, eNL80211_ATTR_KEY_DATA, eNL80211_ATTR_KEY_IDX, eNL80211_ATTR_KEY_CIPHER, eNL80211_ATTR_KEY_SEQ, eNL80211_ATTR_KEY_DEFAULT, eNL80211_ATTR_BEACON_INTERVAL, eNL80211_ATTR_DTIM_PERIOD, eNL80211_ATTR_BEACON_HEAD, eNL80211_ATTR_BEACON_TAIL, eNL80211_ATTR_STA_AID, eNL80211_ATTR_STA_FLAGS, eNL80211_ATTR_STA_LISTEN_INTERVAL, eNL80211_ATTR_STA_SUPPORTED_RATES, eNL80211_ATTR_STA_VLAN, eNL80211_ATTR_STA_INFO, eNL80211_ATTR_WIPHY_BANDS, eNL80211_ATTR_MNTR_FLAGS, eNL80211_ATTR_MESH_ID, eNL80211_ATTR_STA_PLINK_ACTION, eNL80211_ATTR_MPATH_NEXT_HOP, eNL80211_ATTR_MPATH_INFO, eNL80211_ATTR_BSS_CTS_PROT, eNL80211_ATTR_BSS_SHORT_PREAMBLE, eNL80211_ATTR_BSS_SHORT_SLOT_TIME, eNL80211_ATTR_HT_CAPABILITY, eNL80211_ATTR_SUPPORTED_IFTYPES, eNL80211_ATTR_REG_ALPHA2, eNL80211_ATTR_REG_RULES, eNL80211_ATTR_MESH_CONFIG, eNL80211_ATTR_BSS_BASIC_RATES, eNL80211_ATTR_WIPHY_TXQ_PARAMS, eNL80211_ATTR_WIPHY_FREQ, eNL80211_ATTR_WIPHY_CHANNEL_TYPE, eNL80211_ATTR_KEY_DEFAULT_MGMT, eNL80211_ATTR_MGMT_SUBTYPE, eNL80211_ATTR_IE, eNL80211_ATTR_MAX_NUM_SCAN_SSIDS, eNL80211_ATTR_SCAN_FREQUENCIES, eNL80211_ATTR_SCAN_SSIDS, eNL80211_ATTR_GENERATION, eNL80211_ATTR_BSS, eNL80211_ATTR_REG_INITIATOR, eNL80211_ATTR_REG_TYPE, eNL80211_ATTR_SUPPORTED_COMMANDS, eNL80211_ATTR_FRAME, eNL80211_ATTR_SSID, eNL80211_ATTR_AUTH_TYPE, eNL80211_ATTR_REASON_CODE, eNL80211_ATTR_KEY_TYPE, eNL80211_ATTR_MAX_SCAN_IE_LEN, eNL80211_ATTR_CIPHER_SUITES, eNL80211_ATTR_FREQ_BEFORE, eNL80211_ATTR_FREQ_AFTER, eNL80211_ATTR_FREQ_FIXED, eNL80211_ATTR_WIPHY_RETRY_SHORT, eNL80211_ATTR_WIPHY_RETRY_LONG, eNL80211_ATTR_WIPHY_FRAG_THRESHOLD, eNL80211_ATTR_WIPHY_RTS_THRESHOLD, eNL80211_ATTR_TIMED_OUT, eNL80211_ATTR_USE_MFP, eNL80211_ATTR_STA_FLAGS2, eNL80211_ATTR_CONTROL_PORT, eNL80211_ATTR_TESTDATA, eNL80211_ATTR_PRIVACY, eNL80211_ATTR_DISCONNECTED_BY_AP, eNL80211_ATTR_STATUS_CODE, eNL80211_ATTR_CIPHER_SUITES_PAIRWISE, eNL80211_ATTR_CIPHER_SUITE_GROUP, eNL80211_ATTR_WPA_VERSIONS, eNL80211_ATTR_AKM_SUITES, eNL80211_ATTR_REQ_IE, eNL80211_ATTR_RESP_IE, eNL80211_ATTR_PREV_BSSID, eNL80211_ATTR_KEY, eNL80211_ATTR_KEYS, eNL80211_ATTR_PID, eNL80211_ATTR_4ADDR, eNL80211_ATTR_SURVEY_INFO, eNL80211_ATTR_PMKID, eNL80211_ATTR_MAX_NUM_PMKIDS, eNL80211_ATTR_DURATION, eNL80211_ATTR_COOKIE, eNL80211_ATTR_WIPHY_COVERAGE_CLASS, eNL80211_ATTR_TX_RATES, eNL80211_ATTR_FRAME_MATCH, eNL80211_ATTR_ACK, eNL80211_ATTR_PS_STATE, eNL80211_ATTR_CQM, eNL80211_ATTR_LOCAL_STATE_CHANGE, eNL80211_ATTR_AP_ISOLATE, eNL80211_ATTR_WIPHY_TX_POWER_SETTING, eNL80211_ATTR_WIPHY_TX_POWER_LEVEL, eNL80211_ATTR_TX_FRAME_TYPES, eNL80211_ATTR_RX_FRAME_TYPES, eNL80211_ATTR_FRAME_TYPE, eNL80211_ATTR_CONTROL_PORT_ETHERTYPE, eNL80211_ATTR_CONTROL_PORT_NO_ENCRYPT, eNL80211_ATTR_SUPPORT_IBSS_RSN, eNL80211_ATTR_WIPHY_ANTENNA_TX, eNL80211_ATTR_WIPHY_ANTENNA_RX, eNL80211_ATTR_MCAST_RATE, eNL80211_ATTR_OFFCHANNEL_TX_OK, eNL80211_ATTR_BSS_HT_OPMODE, eNL80211_ATTR_KEY_DEFAULT_TYPES, eNL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, eNL80211_ATTR_MESH_SETUP, eNL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, eNL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, eNL80211_ATTR_SUPPORT_MESH_AUTH, eNL80211_ATTR_STA_PLINK_STATE, eNL80211_ATTR_WOWLAN_TRIGGERS, eNL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED, eNL80211_ATTR_SCHED_SCAN_INTERVAL, eNL80211_ATTR_INTERFACE_COMBINATIONS, eNL80211_ATTR_SOFTWARE_IFTYPES, eNL80211_ATTR_REKEY_DATA, eNL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, eNL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, eNL80211_ATTR_SCAN_SUPP_RATES, eNL80211_ATTR_HIDDEN_SSID, eNL80211_ATTR_IE_PROBE_RESP, eNL80211_ATTR_IE_ASSOC_RESP, eNL80211_ATTR_STA_WME, eNL80211_ATTR_SUPPORT_AP_UAPSD, eNL80211_ATTR_ROAM_SUPPORT, eNL80211_ATTR_SCHED_SCAN_MATCH, eNL80211_ATTR_MAX_MATCH_SETS, eNL80211_ATTR_PMKSA_CANDIDATE, eNL80211_ATTR_TX_NO_CCK_RATE, eNL80211_ATTR_TDLS_ACTION, eNL80211_ATTR_TDLS_DIALOG_TOKEN, eNL80211_ATTR_TDLS_OPERATION, eNL80211_ATTR_TDLS_SUPPORT, eNL80211_ATTR_TDLS_EXTERNAL_SETUP, eNL80211_ATTR_DEVICE_AP_SME, eNL80211_ATTR_DONT_WAIT_FOR_ACK, eNL80211_ATTR_FEATURE_FLAGS, eNL80211_ATTR_PROBE_RESP_OFFLOAD, eNL80211_ATTR_PROBE_RESP, eNL80211_ATTR_DFS_REGION, eNL80211_ATTR_DISABLE_HT, eNL80211_ATTR_HT_CAPABILITY_MASK, eNL80211_ATTR_NOACK_MAP, eNL80211_ATTR_INACTIVITY_TIMEOUT, eNL80211_ATTR_RX_SIGNAL_DBM, eNL80211_ATTR_BG_SCAN_PERIOD, eNL80211_ATTR_WDEV, eNL80211_ATTR_USER_REG_HINT_TYPE, eNL80211_ATTR_CONN_FAILED_REASON, eNL80211_ATTR_SAE_DATA, eNL80211_ATTR_VHT_CAPABILITY, eNL80211_ATTR_SCAN_FLAGS, eNL80211_ATTR_CHANNEL_WIDTH, eNL80211_ATTR_CENTER_FREQ1, eNL80211_ATTR_CENTER_FREQ2, eNL80211_ATTR_P2P_CTWINDOW, eNL80211_ATTR_P2P_OPPPS, eNL80211_ATTR_LOCAL_MESH_POWER_MODE, eNL80211_ATTR_ACL_POLICY, eNL80211_ATTR_MAC_ADDRS, eNL80211_ATTR_MAC_ACL_MAX, eNL80211_ATTR_RADAR_EVENT, eNL80211_ATTR_EXT_CAPA, eNL80211_ATTR_EXT_CAPA_MASK, eNL80211_ATTR_STA_CAPABILITY, eNL80211_ATTR_STA_EXT_CAPABILITY, eNL80211_ATTR_PROTOCOL_FEATURES, eNL80211_ATTR_SPLIT_WIPHY_DUMP, eNL80211_ATTR_DISABLE_VHT, eNL80211_ATTR_VHT_CAPABILITY_MASK, eNL80211_ATTR_MDID, eNL80211_ATTR_IE_RIC, eNL80211_ATTR_CRIT_PROT_ID, eNL80211_ATTR_MAX_CRIT_PROT_DURATION, eNL80211_ATTR_PEER_AID, eNL80211_ATTR_COALESCE_RULE, eNL80211_ATTR_CH_SWITCH_COUNT, eNL80211_ATTR_CH_SWITCH_BLOCK_TX, eNL80211_ATTR_CSA_IES, eNL80211_ATTR_CSA_C_OFF_BEACON, eNL80211_ATTR_CSA_C_OFF_PRESP, eNL80211_ATTR_RXMGMT_FLAGS, eNL80211_ATTR_STA_SUPPORTED_CHANNELS, eNL80211_ATTR_STA_SUPPORTED_OPER_CLASSES, eNL80211_ATTR_HANDLE_DFS, eNL80211_ATTR_SUPPORT_5_MHZ, eNL80211_ATTR_SUPPORT_10_MHZ, eNL80211_ATTR_OPMODE_NOTIF, eNL80211_ATTR_VENDOR_ID, eNL80211_ATTR_VENDOR_SUBCMD, eNL80211_ATTR_VENDOR_DATA, eNL80211_ATTR_VENDOR_EVENTS, eNL80211_ATTR_QOS_MAP, eNL80211_ATTR_MAC_HINT, eNL80211_ATTR_WIPHY_FREQ_HINT, eNL80211_ATTR_MAX_AP_ASSOC_STA, eNL80211_ATTR_TDLS_PEER_CAPABILITY, eNL80211_ATTR_SOCKET_OWNER, eNL80211_ATTR_CSA_C_OFFSETS_TX, eNL80211_ATTR_MAX_CSA_COUNTERS, eNL80211_ATTR_TDLS_INITIATOR, eNL80211_ATTR_USE_RRM, eNL80211_ATTR_WIPHY_DYN_ACK, eNL80211_ATTR_TSID, eNL80211_ATTR_USER_PRIO, eNL80211_ATTR_ADMITTED_TIME, eNL80211_ATTR_SMPS_MODE, eNL80211_ATTR_OPER_CLASS, eNL80211_ATTR_MAC_MASK, eNL80211_ATTR_WIPHY_SELF_MANAGED_REG, eNL80211_ATTR_EXT_FEATURES, eNL80211_ATTR_SURVEY_RADIO_STATS, eNL80211_ATTR_NETNS_FD, eNL80211_ATTR_SCHED_SCAN_DELAY, eNL80211_ATTR_REG_INDOOR, eNL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, eNL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, eNL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, eNL80211_ATTR_MAX, eNL80211_ATTR_SCHED_SCAN_PLANS, eNUM_NL80211_ATTR, NL80211Bss, showNL80211Bss, eNL80211_BSS_BSSID, eNL80211_BSS_FREQUENCY, eNL80211_BSS_TSF, eNL80211_BSS_BEACON_INTERVAL, eNL80211_BSS_CAPABILITY, eNL80211_BSS_INFORMATION_ELEMENTS, eNL80211_BSS_SIGNAL_MBM, eNL80211_BSS_SIGNAL_UNSPEC, eNL80211_BSS_STATUS, eNL80211_BSS_SEEN_MS_AGO, eNL80211_BSS_BEACON_IES, eNL80211_BSS_CHAN_WIDTH, eNL80211_BSS_BEACON_TSF, eNL80211_BSS_PRESP_DATA, eNL80211_BSS_LAST_SEEN_BOOTTIME, eNL80211_BSS_MAX, Nl80211StaInfo, showNl80211StaInfo, eNL80211_STA_INFO_INACTIVE_TIME, eNL80211_STA_INFO_RX_BYTES, eNL80211_STA_INFO_TX_BYTES, eNL80211_STA_INFO_LLID, eNL80211_STA_INFO_PLID, eNL80211_STA_INFO_PLINK_STATE, eNL80211_STA_INFO_SIGNAL, eNL80211_STA_INFO_TX_BITRATE, eNL80211_STA_INFO_RX_PACKETS, eNL80211_STA_INFO_TX_PACKETS, eNL80211_STA_INFO_TX_RETRIES, eNL80211_STA_INFO_TX_FAILED, eNL80211_STA_INFO_SIGNAL_AVG, eNL80211_STA_INFO_RX_BITRATE, eNL80211_STA_INFO_BSS_PARAM, eNL80211_STA_INFO_CONNECTED_TIME, eNL80211_STA_INFO_STA_FLAGS, eNL80211_STA_INFO_BEACON_LOSS, eNL80211_STA_INFO_T_OFFSET, eNL80211_STA_INFO_LOCAL_PM, eNL80211_STA_INFO_PEER_PM, eNL80211_STA_INFO_NONPEER_PM, eNL80211_STA_INFO_RX_BYTES64, eNL80211_STA_INFO_TX_BYTES64, eNL80211_STA_INFO_CHAIN_SIGNAL, eNL80211_STA_INFO_CHAIN_SIGNAL_AVG, eNL80211_STA_INFO_EXPECTED_THROUGHPUT, eNL80211_STA_INFO_RX_DROP_MISC, eNL80211_STA_INFO_BEACON_RX, eNL80211_STA_INFO_BEACON_SIGNAL_AVG, eNL80211_STA_INFO_MAX, eNL80211_STA_INFO_TID_STATS, IEEE80211EID, showIEEE80211EID, eWLAN_EID_SSID, eWLAN_EID_SUPP_RATES, eWLAN_EID_FH_PARAMS, eWLAN_EID_DS_PARAMS, eWLAN_EID_CF_PARAMS, eWLAN_EID_TIM, eWLAN_EID_IBSS_PARAMS, eWLAN_EID_COUNTRY, eWLAN_EID_REQUEST, eWLAN_EID_QBSS_LOAD, eWLAN_EID_EDCA_PARAM_SET, eWLAN_EID_TSPEC, eWLAN_EID_TCLAS, eWLAN_EID_SCHEDULE, eWLAN_EID_CHALLENGE, eWLAN_EID_PWR_CONSTRAINT, eWLAN_EID_PWR_CAPABILITY, eWLAN_EID_TPC_REQUEST, eWLAN_EID_TPC_REPORT, eWLAN_EID_SUPPORTED_CHANNELS, eWLAN_EID_CHANNEL_SWITCH, eWLAN_EID_MEASURE_REQUEST, eWLAN_EID_MEASURE_REPORT, eWLAN_EID_QUIET, eWLAN_EID_IBSS_DFS, eWLAN_EID_ERP_INFO, eWLAN_EID_TS_DELAY, eWLAN_EID_TCLAS_PROCESSING, eWLAN_EID_HT_CAPABILITY, eWLAN_EID_QOS_CAPA, eWLAN_EID_RSN, eWLAN_EID_802_15_COEX, eWLAN_EID_EXT_SUPP_RATES, eWLAN_EID_AP_CHAN_REPORT, eWLAN_EID_NEIGHBOR_REPORT, eWLAN_EID_RCPI, eWLAN_EID_MOBILITY_DOMAIN, eWLAN_EID_FAST_BSS_TRANSITION, eWLAN_EID_TIMEOUT_INTERVAL, eWLAN_EID_RIC_DATA, eWLAN_EID_DSE_REGISTERED_LOCATION, eWLAN_EID_SUPPORTED_REGULATORY_CLASSES, eWLAN_EID_EXT_CHANSWITCH_ANN, eWLAN_EID_HT_OPERATION, eWLAN_EID_SECONDARY_CHANNEL_OFFSET, eWLAN_EID_BSS_AVG_ACCESS_DELAY, eWLAN_EID_ANTENNA_INFO, eWLAN_EID_RSNI, eWLAN_EID_MEASUREMENT_PILOT_TX_INFO, eWLAN_EID_BSS_AVAILABLE_CAPACITY, eWLAN_EID_BSS_AC_ACCESS_DELAY, eWLAN_EID_TIME_ADVERTISEMENT, eWLAN_EID_RRM_ENABLED_CAPABILITIES, eWLAN_EID_MULTIPLE_BSSID, eWLAN_EID_BSS_COEX_2040, eWLAN_EID_BSS_INTOLERANT_CHL_REPORT, eWLAN_EID_OVERLAP_BSS_SCAN_PARAM, eWLAN_EID_RIC_DESCRIPTOR, eWLAN_EID_MMIE, eWLAN_EID_ASSOC_COMEBACK_TIME, eWLAN_EID_EVENT_REQUEST, eWLAN_EID_EVENT_REPORT, eWLAN_EID_DIAGNOSTIC_REQUEST, eWLAN_EID_DIAGNOSTIC_REPORT, eWLAN_EID_LOCATION_PARAMS, eWLAN_EID_NON_TX_BSSID_CAP, eWLAN_EID_SSID_LIST, eWLAN_EID_MULTI_BSSID_IDX, eWLAN_EID_FMS_DESCRIPTOR, eWLAN_EID_FMS_REQUEST, eWLAN_EID_FMS_RESPONSE, eWLAN_EID_QOS_TRAFFIC_CAPA, eWLAN_EID_BSS_MAX_IDLE_PERIOD, eWLAN_EID_TSF_REQUEST, eWLAN_EID_TSF_RESPOSNE, eWLAN_EID_WNM_SLEEP_MODE, eWLAN_EID_TIM_BCAST_REQ, eWLAN_EID_TIM_BCAST_RESP, eWLAN_EID_COLL_IF_REPORT, eWLAN_EID_CHANNEL_USAGE, eWLAN_EID_TIME_ZONE, eWLAN_EID_DMS_REQUEST, eWLAN_EID_DMS_RESPONSE, eWLAN_EID_LINK_ID, eWLAN_EID_WAKEUP_SCHEDUL, eWLAN_EID_CHAN_SWITCH_TIMING, eWLAN_EID_PTI_CONTROL, eWLAN_EID_PU_BUFFER_STATUS, eWLAN_EID_INTERWORKING, eWLAN_EID_ADVERTISEMENT_PROTOCOL, eWLAN_EID_EXPEDITED_BW_REQ, eWLAN_EID_QOS_MAP_SET, eWLAN_EID_ROAMING_CONSORTIUM, eWLAN_EID_EMERGENCY_ALERT, eWLAN_EID_MESH_CONFIG, eWLAN_EID_MESH_ID, eWLAN_EID_LINK_METRIC_REPORT, eWLAN_EID_CONGESTION_NOTIFICATION, eWLAN_EID_PEER_MGMT, eWLAN_EID_CHAN_SWITCH_PARAM, eWLAN_EID_MESH_AWAKE_WINDOW, eWLAN_EID_BEACON_TIMING, eWLAN_EID_MCCAOP_SETUP_REQ, eWLAN_EID_MCCAOP_SETUP_RESP, eWLAN_EID_MCCAOP_ADVERT, eWLAN_EID_MCCAOP_TEARDOWN, eWLAN_EID_GANN, eWLAN_EID_RANN, eWLAN_EID_EXT_CAPABILITY, eWLAN_EID_PREQ, eWLAN_EID_PREP, eWLAN_EID_PERR, eWLAN_EID_PXU, eWLAN_EID_PXUC, eWLAN_EID_AUTH_MESH_PEER_EXCH, eWLAN_EID_MIC, eWLAN_EID_DESTINATION_URI, eWLAN_EID_UAPSD_COEX, eWLAN_EID_WAKEUP_SCHEDULE, eWLAN_EID_EXT_SCHEDULE, eWLAN_EID_STA_AVAILABILITY, eWLAN_EID_DMG_TSPEC, eWLAN_EID_DMG_AT, eWLAN_EID_DMG_CAP, eWLAN_EID_CISCO_VENDOR_SPECIFIC, eWLAN_EID_DMG_OPERATION, eWLAN_EID_DMG_BSS_PARAM_CHANGE, eWLAN_EID_DMG_BEAM_REFINEMENT, eWLAN_EID_CHANNEL_MEASURE_FEEDBACK, eWLAN_EID_AWAKE_WINDOW, eWLAN_EID_MULTI_BAND, eWLAN_EID_ADDBA_EXT, eWLAN_EID_NEXT_PCP_LIST, eWLAN_EID_PCP_HANDOVER, eWLAN_EID_DMG_LINK_MARGIN, eWLAN_EID_SWITCHING_STREAM, eWLAN_EID_SESSION_TRANSITION, eWLAN_EID_DYN_TONE_PAIRING_REPORT, eWLAN_EID_CLUSTER_REPORT, eWLAN_EID_RELAY_CAP, eWLAN_EID_RELAY_XFER_PARAM_SET, eWLAN_EID_BEAM_LINK_MAINT, eWLAN_EID_MULTIPLE_MAC_ADDR, eWLAN_EID_U_PID, eWLAN_EID_DMG_LINK_ADAPT_ACK, eWLAN_EID_MCCAOP_ADV_OVERVIEW, eWLAN_EID_QUIET_PERIOD_REQ, eWLAN_EID_QUIET_PERIOD_RESP, eWLAN_EID_EPAC_POLICY, eWLAN_EID_CLISTER_TIME_OFF, eWLAN_EID_INTER_AC_PRIO, eWLAN_EID_SCS_DESCRIPTOR, eWLAN_EID_QLOAD_REPORT, eWLAN_EID_HCCA_TXOP_UPDATE_COUNT, eWLAN_EID_HL_STREAM_ID, eWLAN_EID_GCR_GROUP_ADDR, eWLAN_EID_ANTENNA_SECTOR_ID_PATTERN, eWLAN_EID_VHT_CAPABILITY, eWLAN_EID_VHT_OPERATION, eWLAN_EID_EXTENDED_BSS_LOAD, eWLAN_EID_WIDE_BW_CHANNEL_SWITCH, eWLAN_EID_VHT_TX_POWER_ENVELOPE, eWLAN_EID_CHANNEL_SWITCH_WRAPPER, eWLAN_EID_AID, eWLAN_EID_QUIET_CHANNEL, eWLAN_EID_OPMODE_NOTIF, eWLAN_EID_VENDOR_SPECIFIC, eWLAN_EID_QOS_PARAMETER) where++newtype NL80211Commands = NL80211Commands Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showNL80211Commands :: (Num a) => (Show a) => (Eq a) => a -> String+showNL80211Commands 0 = "NL80211_CMD_UNSPEC"+showNL80211Commands 1 = "NL80211_CMD_GET_WIPHY"+showNL80211Commands 2 = "NL80211_CMD_SET_WIPHY"+showNL80211Commands 3 = "NL80211_CMD_NEW_WIPHY"+showNL80211Commands 4 = "NL80211_CMD_DEL_WIPHY"+showNL80211Commands 5 = "NL80211_CMD_GET_INTERFACE"+showNL80211Commands 6 = "NL80211_CMD_SET_INTERFACE"+showNL80211Commands 7 = "NL80211_CMD_NEW_INTERFACE"+showNL80211Commands 8 = "NL80211_CMD_DEL_INTERFACE"+showNL80211Commands 9 = "NL80211_CMD_GET_KEY"+showNL80211Commands 10 = "NL80211_CMD_SET_KEY"+showNL80211Commands 11 = "NL80211_CMD_NEW_KEY"+showNL80211Commands 12 = "NL80211_CMD_DEL_KEY"+showNL80211Commands 13 = "NL80211_CMD_GET_BEACON"+showNL80211Commands 14 = "NL80211_CMD_SET_BEACON"+showNL80211Commands 15 = "NL80211_CMD_NEW_BEACON"+showNL80211Commands 16 = "NL80211_CMD_DEL_BEACON"+showNL80211Commands 17 = "NL80211_CMD_GET_STATION"+showNL80211Commands 18 = "NL80211_CMD_SET_STATION"+showNL80211Commands 19 = "NL80211_CMD_NEW_STATION"+showNL80211Commands 20 = "NL80211_CMD_DEL_STATION"+showNL80211Commands 21 = "NL80211_CMD_GET_MPATH"+showNL80211Commands 22 = "NL80211_CMD_SET_MPATH"+showNL80211Commands 23 = "NL80211_CMD_NEW_MPATH"+showNL80211Commands 24 = "NL80211_CMD_DEL_MPATH"+showNL80211Commands 25 = "NL80211_CMD_SET_BSS"+showNL80211Commands 26 = "NL80211_CMD_SET_REG"+showNL80211Commands 27 = "NL80211_CMD_REQ_SET_REG"+showNL80211Commands 28 = "NL80211_CMD_GET_MESH_CONFIG"+showNL80211Commands 29 = "NL80211_CMD_SET_MESH_CONFIG"+showNL80211Commands 30 = "NL80211_CMD_SET_MGMT_EXTRA_IE"+showNL80211Commands 31 = "NL80211_CMD_GET_REG"+showNL80211Commands 32 = "NL80211_CMD_GET_SCAN"+showNL80211Commands 33 = "NL80211_CMD_TRIGGER_SCAN"+showNL80211Commands 34 = "NL80211_CMD_NEW_SCAN_RESULTS"+showNL80211Commands 35 = "NL80211_CMD_SCAN_ABORTED"+showNL80211Commands 36 = "NL80211_CMD_REG_CHANGE"+showNL80211Commands 37 = "NL80211_CMD_AUTHENTICATE"+showNL80211Commands 38 = "NL80211_CMD_ASSOCIATE"+showNL80211Commands 39 = "NL80211_CMD_DEAUTHENTICATE"+showNL80211Commands 40 = "NL80211_CMD_DISASSOCIATE"+showNL80211Commands 41 = "NL80211_CMD_MICHAEL_MIC_FAILURE"+showNL80211Commands 42 = "NL80211_CMD_REG_BEACON_HINT"+showNL80211Commands 43 = "NL80211_CMD_JOIN_IBSS"+showNL80211Commands 44 = "NL80211_CMD_LEAVE_IBSS"+showNL80211Commands 45 = "NL80211_CMD_TESTMODE"+showNL80211Commands 46 = "NL80211_CMD_CONNECT"+showNL80211Commands 47 = "NL80211_CMD_ROAM"+showNL80211Commands 48 = "NL80211_CMD_DISCONNECT"+showNL80211Commands 49 = "NL80211_CMD_SET_WIPHY_NETNS"+showNL80211Commands 50 = "NL80211_CMD_GET_SURVEY"+showNL80211Commands 51 = "NL80211_CMD_NEW_SURVEY_RESULTS"+showNL80211Commands 52 = "NL80211_CMD_SET_PMKSA"+showNL80211Commands 53 = "NL80211_CMD_DEL_PMKSA"+showNL80211Commands 54 = "NL80211_CMD_FLUSH_PMKSA"+showNL80211Commands 55 = "NL80211_CMD_REMAIN_ON_CHANNEL"+showNL80211Commands 56 = "NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL"+showNL80211Commands 57 = "NL80211_CMD_SET_TX_BITRATE_MASK"+showNL80211Commands 58 = "NL80211_CMD_REGISTER_ACTION"+showNL80211Commands 59 = "NL80211_CMD_ACTION"+showNL80211Commands 60 = "NL80211_CMD_ACTION_TX_STATUS"+showNL80211Commands 61 = "NL80211_CMD_SET_POWER_SAVE"+showNL80211Commands 62 = "NL80211_CMD_GET_POWER_SAVE"+showNL80211Commands 63 = "NL80211_CMD_SET_CQM"+showNL80211Commands 64 = "NL80211_CMD_NOTIFY_CQM"+showNL80211Commands 65 = "NL80211_CMD_SET_CHANNEL"+showNL80211Commands 66 = "NL80211_CMD_SET_WDS_PEER"+showNL80211Commands 67 = "NL80211_CMD_FRAME_WAIT_CANCEL"+showNL80211Commands 68 = "NL80211_CMD_JOIN_MESH"+showNL80211Commands 69 = "NL80211_CMD_LEAVE_MESH"+showNL80211Commands 70 = "NL80211_CMD_UNPROT_DEAUTHENTICATE"+showNL80211Commands 71 = "NL80211_CMD_UNPROT_DISASSOCIATE"+showNL80211Commands 72 = "NL80211_CMD_NEW_PEER_CANDIDATE"+showNL80211Commands 73 = "NL80211_CMD_GET_WOWLAN"+showNL80211Commands 74 = "NL80211_CMD_SET_WOWLAN"+showNL80211Commands 75 = "NL80211_CMD_START_SCHED_SCAN"+showNL80211Commands 76 = "NL80211_CMD_STOP_SCHED_SCAN"+showNL80211Commands 77 = "NL80211_CMD_SCHED_SCAN_RESULTS"+showNL80211Commands 78 = "NL80211_CMD_SCHED_SCAN_STOPPED"+showNL80211Commands 79 = "NL80211_CMD_SET_REKEY_OFFLOAD"+showNL80211Commands 80 = "NL80211_CMD_PMKSA_CANDIDATE"+showNL80211Commands 81 = "NL80211_CMD_TDLS_OPER"+showNL80211Commands 82 = "NL80211_CMD_TDLS_MGMT"+showNL80211Commands 83 = "NL80211_CMD_UNEXPECTED_FRAME"+showNL80211Commands 84 = "NL80211_CMD_PROBE_CLIENT"+showNL80211Commands 85 = "NL80211_CMD_REGISTER_BEACONS"+showNL80211Commands 86 = "NL80211_CMD_UNEXPECTED_4ADDR_FRAME"+showNL80211Commands 87 = "NL80211_CMD_SET_NOACK_MAP"+showNL80211Commands 88 = "NL80211_CMD_CH_SWITCH_NOTIFY"+showNL80211Commands 89 = "NL80211_CMD_START_P2P_DEVICE"+showNL80211Commands 90 = "NL80211_CMD_STOP_P2P_DEVICE"+showNL80211Commands 91 = "NL80211_CMD_CONN_FAILED"+showNL80211Commands 92 = "NL80211_CMD_SET_MCAST_RATE"+showNL80211Commands 93 = "NL80211_CMD_SET_MAC_ACL"+showNL80211Commands 94 = "NL80211_CMD_RADAR_DETECT"+showNL80211Commands 95 = "NL80211_CMD_GET_PROTOCOL_FEATURES"+showNL80211Commands 96 = "NL80211_CMD_UPDATE_FT_IES"+showNL80211Commands 97 = "NL80211_CMD_FT_EVENT"+showNL80211Commands 98 = "NL80211_CMD_CRIT_PROTOCOL_START"+showNL80211Commands 99 = "NL80211_CMD_CRIT_PROTOCOL_STOP"+showNL80211Commands 100 = "NL80211_CMD_GET_COALESCE"+showNL80211Commands 101 = "NL80211_CMD_SET_COALESCE"+showNL80211Commands 102 = "NL80211_CMD_CHANNEL_SWITCH"+showNL80211Commands 103 = "NL80211_CMD_VENDOR"+showNL80211Commands 104 = "NL80211_CMD_SET_QOS_MAP"+showNL80211Commands 105 = "NL80211_CMD_ADD_TX_TS"+showNL80211Commands 106 = "NL80211_CMD_DEL_TX_TS"+showNL80211Commands 107 = "NL80211_CMD_GET_MPP"+showNL80211Commands 108 = "NL80211_CMD_JOIN_OCB"+showNL80211Commands 109 = "NL80211_CMD_LEAVE_OCB"+showNL80211Commands 110 = "NL80211_CMD_CH_SWITCH_STARTED_NOTIFY"+showNL80211Commands 111 = "NL80211_CMD_TDLS_CHANNEL_SWITCH"+showNL80211Commands 112 = "NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH"+showNL80211Commands 113 = "NL80211_CMD_MAX"+showNL80211Commands i = "NL80211Commands #" ++ (show i)+++eNL80211_CMD_UNSPEC :: (Num a) => a+eNL80211_CMD_UNSPEC = 0+eNL80211_CMD_GET_WIPHY :: (Num a) => a+eNL80211_CMD_GET_WIPHY = 1+eNL80211_CMD_SET_WIPHY :: (Num a) => a+eNL80211_CMD_SET_WIPHY = 2+eNL80211_CMD_NEW_WIPHY :: (Num a) => a+eNL80211_CMD_NEW_WIPHY = 3+eNL80211_CMD_DEL_WIPHY :: (Num a) => a+eNL80211_CMD_DEL_WIPHY = 4+eNL80211_CMD_GET_INTERFACE :: (Num a) => a+eNL80211_CMD_GET_INTERFACE = 5+eNL80211_CMD_SET_INTERFACE :: (Num a) => a+eNL80211_CMD_SET_INTERFACE = 6+eNL80211_CMD_NEW_INTERFACE :: (Num a) => a+eNL80211_CMD_NEW_INTERFACE = 7+eNL80211_CMD_DEL_INTERFACE :: (Num a) => a+eNL80211_CMD_DEL_INTERFACE = 8+eNL80211_CMD_GET_KEY :: (Num a) => a+eNL80211_CMD_GET_KEY = 9+eNL80211_CMD_SET_KEY :: (Num a) => a+eNL80211_CMD_SET_KEY = 10+eNL80211_CMD_NEW_KEY :: (Num a) => a+eNL80211_CMD_NEW_KEY = 11+eNL80211_CMD_DEL_KEY :: (Num a) => a+eNL80211_CMD_DEL_KEY = 12+eNL80211_CMD_GET_BEACON :: (Num a) => a+eNL80211_CMD_GET_BEACON = 13+eNL80211_CMD_SET_BEACON :: (Num a) => a+eNL80211_CMD_SET_BEACON = 14+eNL80211_CMD_NEW_BEACON :: (Num a) => a+eNL80211_CMD_NEW_BEACON = 15+eNL80211_CMD_START_AP :: (Num a) => a+eNL80211_CMD_START_AP = 15+eNL80211_CMD_DEL_BEACON :: (Num a) => a+eNL80211_CMD_DEL_BEACON = 16+eNL80211_CMD_STOP_AP :: (Num a) => a+eNL80211_CMD_STOP_AP = 16+eNL80211_CMD_GET_STATION :: (Num a) => a+eNL80211_CMD_GET_STATION = 17+eNL80211_CMD_SET_STATION :: (Num a) => a+eNL80211_CMD_SET_STATION = 18+eNL80211_CMD_NEW_STATION :: (Num a) => a+eNL80211_CMD_NEW_STATION = 19+eNL80211_CMD_DEL_STATION :: (Num a) => a+eNL80211_CMD_DEL_STATION = 20+eNL80211_CMD_GET_MPATH :: (Num a) => a+eNL80211_CMD_GET_MPATH = 21+eNL80211_CMD_SET_MPATH :: (Num a) => a+eNL80211_CMD_SET_MPATH = 22+eNL80211_CMD_NEW_MPATH :: (Num a) => a+eNL80211_CMD_NEW_MPATH = 23+eNL80211_CMD_DEL_MPATH :: (Num a) => a+eNL80211_CMD_DEL_MPATH = 24+eNL80211_CMD_SET_BSS :: (Num a) => a+eNL80211_CMD_SET_BSS = 25+eNL80211_CMD_SET_REG :: (Num a) => a+eNL80211_CMD_SET_REG = 26+eNL80211_CMD_REQ_SET_REG :: (Num a) => a+eNL80211_CMD_REQ_SET_REG = 27+eNL80211_CMD_GET_MESH_CONFIG :: (Num a) => a+eNL80211_CMD_GET_MESH_CONFIG = 28+eNL80211_CMD_SET_MESH_CONFIG :: (Num a) => a+eNL80211_CMD_SET_MESH_CONFIG = 29+eNL80211_CMD_SET_MGMT_EXTRA_IE :: (Num a) => a+eNL80211_CMD_SET_MGMT_EXTRA_IE = 30+eNL80211_CMD_GET_REG :: (Num a) => a+eNL80211_CMD_GET_REG = 31+eNL80211_CMD_GET_SCAN :: (Num a) => a+eNL80211_CMD_GET_SCAN = 32+eNL80211_CMD_TRIGGER_SCAN :: (Num a) => a+eNL80211_CMD_TRIGGER_SCAN = 33+eNL80211_CMD_NEW_SCAN_RESULTS :: (Num a) => a+eNL80211_CMD_NEW_SCAN_RESULTS = 34+eNL80211_CMD_SCAN_ABORTED :: (Num a) => a+eNL80211_CMD_SCAN_ABORTED = 35+eNL80211_CMD_REG_CHANGE :: (Num a) => a+eNL80211_CMD_REG_CHANGE = 36+eNL80211_CMD_AUTHENTICATE :: (Num a) => a+eNL80211_CMD_AUTHENTICATE = 37+eNL80211_CMD_ASSOCIATE :: (Num a) => a+eNL80211_CMD_ASSOCIATE = 38+eNL80211_CMD_DEAUTHENTICATE :: (Num a) => a+eNL80211_CMD_DEAUTHENTICATE = 39+eNL80211_CMD_DISASSOCIATE :: (Num a) => a+eNL80211_CMD_DISASSOCIATE = 40+eNL80211_CMD_MICHAEL_MIC_FAILURE :: (Num a) => a+eNL80211_CMD_MICHAEL_MIC_FAILURE = 41+eNL80211_CMD_REG_BEACON_HINT :: (Num a) => a+eNL80211_CMD_REG_BEACON_HINT = 42+eNL80211_CMD_JOIN_IBSS :: (Num a) => a+eNL80211_CMD_JOIN_IBSS = 43+eNL80211_CMD_LEAVE_IBSS :: (Num a) => a+eNL80211_CMD_LEAVE_IBSS = 44+eNL80211_CMD_TESTMODE :: (Num a) => a+eNL80211_CMD_TESTMODE = 45+eNL80211_CMD_CONNECT :: (Num a) => a+eNL80211_CMD_CONNECT = 46+eNL80211_CMD_ROAM :: (Num a) => a+eNL80211_CMD_ROAM = 47+eNL80211_CMD_DISCONNECT :: (Num a) => a+eNL80211_CMD_DISCONNECT = 48+eNL80211_CMD_SET_WIPHY_NETNS :: (Num a) => a+eNL80211_CMD_SET_WIPHY_NETNS = 49+eNL80211_CMD_GET_SURVEY :: (Num a) => a+eNL80211_CMD_GET_SURVEY = 50+eNL80211_CMD_NEW_SURVEY_RESULTS :: (Num a) => a+eNL80211_CMD_NEW_SURVEY_RESULTS = 51+eNL80211_CMD_SET_PMKSA :: (Num a) => a+eNL80211_CMD_SET_PMKSA = 52+eNL80211_CMD_DEL_PMKSA :: (Num a) => a+eNL80211_CMD_DEL_PMKSA = 53+eNL80211_CMD_FLUSH_PMKSA :: (Num a) => a+eNL80211_CMD_FLUSH_PMKSA = 54+eNL80211_CMD_REMAIN_ON_CHANNEL :: (Num a) => a+eNL80211_CMD_REMAIN_ON_CHANNEL = 55+eNL80211_CMD_CANCEL_REMAIN_ON_CHANNEL :: (Num a) => a+eNL80211_CMD_CANCEL_REMAIN_ON_CHANNEL = 56+eNL80211_CMD_SET_TX_BITRATE_MASK :: (Num a) => a+eNL80211_CMD_SET_TX_BITRATE_MASK = 57+eNL80211_CMD_REGISTER_ACTION :: (Num a) => a+eNL80211_CMD_REGISTER_ACTION = 58+eNL80211_CMD_REGISTER_FRAME :: (Num a) => a+eNL80211_CMD_REGISTER_FRAME = 58+eNL80211_CMD_ACTION :: (Num a) => a+eNL80211_CMD_ACTION = 59+eNL80211_CMD_FRAME :: (Num a) => a+eNL80211_CMD_FRAME = 59+eNL80211_CMD_ACTION_TX_STATUS :: (Num a) => a+eNL80211_CMD_ACTION_TX_STATUS = 60+eNL80211_CMD_FRAME_TX_STATUS :: (Num a) => a+eNL80211_CMD_FRAME_TX_STATUS = 60+eNL80211_CMD_SET_POWER_SAVE :: (Num a) => a+eNL80211_CMD_SET_POWER_SAVE = 61+eNL80211_CMD_GET_POWER_SAVE :: (Num a) => a+eNL80211_CMD_GET_POWER_SAVE = 62+eNL80211_CMD_SET_CQM :: (Num a) => a+eNL80211_CMD_SET_CQM = 63+eNL80211_CMD_NOTIFY_CQM :: (Num a) => a+eNL80211_CMD_NOTIFY_CQM = 64+eNL80211_CMD_SET_CHANNEL :: (Num a) => a+eNL80211_CMD_SET_CHANNEL = 65+eNL80211_CMD_SET_WDS_PEER :: (Num a) => a+eNL80211_CMD_SET_WDS_PEER = 66+eNL80211_CMD_FRAME_WAIT_CANCEL :: (Num a) => a+eNL80211_CMD_FRAME_WAIT_CANCEL = 67+eNL80211_CMD_JOIN_MESH :: (Num a) => a+eNL80211_CMD_JOIN_MESH = 68+eNL80211_CMD_LEAVE_MESH :: (Num a) => a+eNL80211_CMD_LEAVE_MESH = 69+eNL80211_CMD_UNPROT_DEAUTHENTICATE :: (Num a) => a+eNL80211_CMD_UNPROT_DEAUTHENTICATE = 70+eNL80211_CMD_UNPROT_DISASSOCIATE :: (Num a) => a+eNL80211_CMD_UNPROT_DISASSOCIATE = 71+eNL80211_CMD_NEW_PEER_CANDIDATE :: (Num a) => a+eNL80211_CMD_NEW_PEER_CANDIDATE = 72+eNL80211_CMD_GET_WOWLAN :: (Num a) => a+eNL80211_CMD_GET_WOWLAN = 73+eNL80211_CMD_SET_WOWLAN :: (Num a) => a+eNL80211_CMD_SET_WOWLAN = 74+eNL80211_CMD_START_SCHED_SCAN :: (Num a) => a+eNL80211_CMD_START_SCHED_SCAN = 75+eNL80211_CMD_STOP_SCHED_SCAN :: (Num a) => a+eNL80211_CMD_STOP_SCHED_SCAN = 76+eNL80211_CMD_SCHED_SCAN_RESULTS :: (Num a) => a+eNL80211_CMD_SCHED_SCAN_RESULTS = 77+eNL80211_CMD_SCHED_SCAN_STOPPED :: (Num a) => a+eNL80211_CMD_SCHED_SCAN_STOPPED = 78+eNL80211_CMD_SET_REKEY_OFFLOAD :: (Num a) => a+eNL80211_CMD_SET_REKEY_OFFLOAD = 79+eNL80211_CMD_PMKSA_CANDIDATE :: (Num a) => a+eNL80211_CMD_PMKSA_CANDIDATE = 80+eNL80211_CMD_TDLS_OPER :: (Num a) => a+eNL80211_CMD_TDLS_OPER = 81+eNL80211_CMD_TDLS_MGMT :: (Num a) => a+eNL80211_CMD_TDLS_MGMT = 82+eNL80211_CMD_UNEXPECTED_FRAME :: (Num a) => a+eNL80211_CMD_UNEXPECTED_FRAME = 83+eNL80211_CMD_PROBE_CLIENT :: (Num a) => a+eNL80211_CMD_PROBE_CLIENT = 84+eNL80211_CMD_REGISTER_BEACONS :: (Num a) => a+eNL80211_CMD_REGISTER_BEACONS = 85+eNL80211_CMD_UNEXPECTED_4ADDR_FRAME :: (Num a) => a+eNL80211_CMD_UNEXPECTED_4ADDR_FRAME = 86+eNL80211_CMD_SET_NOACK_MAP :: (Num a) => a+eNL80211_CMD_SET_NOACK_MAP = 87+eNL80211_CMD_CH_SWITCH_NOTIFY :: (Num a) => a+eNL80211_CMD_CH_SWITCH_NOTIFY = 88+eNL80211_CMD_START_P2P_DEVICE :: (Num a) => a+eNL80211_CMD_START_P2P_DEVICE = 89+eNL80211_CMD_STOP_P2P_DEVICE :: (Num a) => a+eNL80211_CMD_STOP_P2P_DEVICE = 90+eNL80211_CMD_CONN_FAILED :: (Num a) => a+eNL80211_CMD_CONN_FAILED = 91+eNL80211_CMD_SET_MCAST_RATE :: (Num a) => a+eNL80211_CMD_SET_MCAST_RATE = 92+eNL80211_CMD_SET_MAC_ACL :: (Num a) => a+eNL80211_CMD_SET_MAC_ACL = 93+eNL80211_CMD_RADAR_DETECT :: (Num a) => a+eNL80211_CMD_RADAR_DETECT = 94+eNL80211_CMD_GET_PROTOCOL_FEATURES :: (Num a) => a+eNL80211_CMD_GET_PROTOCOL_FEATURES = 95+eNL80211_CMD_UPDATE_FT_IES :: (Num a) => a+eNL80211_CMD_UPDATE_FT_IES = 96+eNL80211_CMD_FT_EVENT :: (Num a) => a+eNL80211_CMD_FT_EVENT = 97+eNL80211_CMD_CRIT_PROTOCOL_START :: (Num a) => a+eNL80211_CMD_CRIT_PROTOCOL_START = 98+eNL80211_CMD_CRIT_PROTOCOL_STOP :: (Num a) => a+eNL80211_CMD_CRIT_PROTOCOL_STOP = 99+eNL80211_CMD_GET_COALESCE :: (Num a) => a+eNL80211_CMD_GET_COALESCE = 100+eNL80211_CMD_SET_COALESCE :: (Num a) => a+eNL80211_CMD_SET_COALESCE = 101+eNL80211_CMD_CHANNEL_SWITCH :: (Num a) => a+eNL80211_CMD_CHANNEL_SWITCH = 102+eNL80211_CMD_VENDOR :: (Num a) => a+eNL80211_CMD_VENDOR = 103+eNL80211_CMD_SET_QOS_MAP :: (Num a) => a+eNL80211_CMD_SET_QOS_MAP = 104+eNL80211_CMD_ADD_TX_TS :: (Num a) => a+eNL80211_CMD_ADD_TX_TS = 105+eNL80211_CMD_DEL_TX_TS :: (Num a) => a+eNL80211_CMD_DEL_TX_TS = 106+eNL80211_CMD_GET_MPP :: (Num a) => a+eNL80211_CMD_GET_MPP = 107+eNL80211_CMD_JOIN_OCB :: (Num a) => a+eNL80211_CMD_JOIN_OCB = 108+eNL80211_CMD_LEAVE_OCB :: (Num a) => a+eNL80211_CMD_LEAVE_OCB = 109+eNL80211_CMD_CH_SWITCH_STARTED_NOTIFY :: (Num a) => a+eNL80211_CMD_CH_SWITCH_STARTED_NOTIFY = 110+eNL80211_CMD_TDLS_CHANNEL_SWITCH :: (Num a) => a+eNL80211_CMD_TDLS_CHANNEL_SWITCH = 111+eNL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH :: (Num a) => a+eNL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH = 112+eNL80211_CMD_MAX :: (Num a) => a+eNL80211_CMD_MAX = 113+eNL80211_CMD_WIPHY_REG_CHANGE :: (Num a) => a+eNL80211_CMD_WIPHY_REG_CHANGE = 113+newtype NL80211Attrs = NL80211Attrs Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showNL80211Attrs :: (Num a) => (Show a) => (Eq a) => a -> String+showNL80211Attrs 0 = "NL80211_ATTR_UNSPEC"+showNL80211Attrs 1 = "NL80211_ATTR_WIPHY"+showNL80211Attrs 2 = "NL80211_ATTR_WIPHY_NAME"+showNL80211Attrs 3 = "NL80211_ATTR_IFINDEX"+showNL80211Attrs 4 = "NL80211_ATTR_IFNAME"+showNL80211Attrs 5 = "NL80211_ATTR_IFTYPE"+showNL80211Attrs 6 = "NL80211_ATTR_MAC"+showNL80211Attrs 7 = "NL80211_ATTR_KEY_DATA"+showNL80211Attrs 8 = "NL80211_ATTR_KEY_IDX"+showNL80211Attrs 9 = "NL80211_ATTR_KEY_CIPHER"+showNL80211Attrs 10 = "NL80211_ATTR_KEY_SEQ"+showNL80211Attrs 11 = "NL80211_ATTR_KEY_DEFAULT"+showNL80211Attrs 12 = "NL80211_ATTR_BEACON_INTERVAL"+showNL80211Attrs 13 = "NL80211_ATTR_DTIM_PERIOD"+showNL80211Attrs 14 = "NL80211_ATTR_BEACON_HEAD"+showNL80211Attrs 15 = "NL80211_ATTR_BEACON_TAIL"+showNL80211Attrs 16 = "NL80211_ATTR_STA_AID"+showNL80211Attrs 17 = "NL80211_ATTR_STA_FLAGS"+showNL80211Attrs 18 = "NL80211_ATTR_STA_LISTEN_INTERVAL"+showNL80211Attrs 19 = "NL80211_ATTR_STA_SUPPORTED_RATES"+showNL80211Attrs 20 = "NL80211_ATTR_STA_VLAN"+showNL80211Attrs 21 = "NL80211_ATTR_STA_INFO"+showNL80211Attrs 22 = "NL80211_ATTR_WIPHY_BANDS"+showNL80211Attrs 23 = "NL80211_ATTR_MNTR_FLAGS"+showNL80211Attrs 24 = "NL80211_ATTR_MESH_ID"+showNL80211Attrs 25 = "NL80211_ATTR_STA_PLINK_ACTION"+showNL80211Attrs 26 = "NL80211_ATTR_MPATH_NEXT_HOP"+showNL80211Attrs 27 = "NL80211_ATTR_MPATH_INFO"+showNL80211Attrs 28 = "NL80211_ATTR_BSS_CTS_PROT"+showNL80211Attrs 29 = "NL80211_ATTR_BSS_SHORT_PREAMBLE"+showNL80211Attrs 30 = "NL80211_ATTR_BSS_SHORT_SLOT_TIME"+showNL80211Attrs 31 = "NL80211_ATTR_HT_CAPABILITY"+showNL80211Attrs 32 = "NL80211_ATTR_SUPPORTED_IFTYPES"+showNL80211Attrs 33 = "NL80211_ATTR_REG_ALPHA2"+showNL80211Attrs 34 = "NL80211_ATTR_REG_RULES"+showNL80211Attrs 35 = "NL80211_ATTR_MESH_CONFIG"+showNL80211Attrs 36 = "NL80211_ATTR_BSS_BASIC_RATES"+showNL80211Attrs 37 = "NL80211_ATTR_WIPHY_TXQ_PARAMS"+showNL80211Attrs 38 = "NL80211_ATTR_WIPHY_FREQ"+showNL80211Attrs 39 = "NL80211_ATTR_WIPHY_CHANNEL_TYPE"+showNL80211Attrs 40 = "NL80211_ATTR_KEY_DEFAULT_MGMT"+showNL80211Attrs 41 = "NL80211_ATTR_MGMT_SUBTYPE"+showNL80211Attrs 42 = "NL80211_ATTR_IE"+showNL80211Attrs 43 = "NL80211_ATTR_MAX_NUM_SCAN_SSIDS"+showNL80211Attrs 44 = "NL80211_ATTR_SCAN_FREQUENCIES"+showNL80211Attrs 45 = "NL80211_ATTR_SCAN_SSIDS"+showNL80211Attrs 46 = "NL80211_ATTR_GENERATION"+showNL80211Attrs 47 = "NL80211_ATTR_BSS"+showNL80211Attrs 48 = "NL80211_ATTR_REG_INITIATOR"+showNL80211Attrs 49 = "NL80211_ATTR_REG_TYPE"+showNL80211Attrs 50 = "NL80211_ATTR_SUPPORTED_COMMANDS"+showNL80211Attrs 51 = "NL80211_ATTR_FRAME"+showNL80211Attrs 52 = "NL80211_ATTR_SSID"+showNL80211Attrs 53 = "NL80211_ATTR_AUTH_TYPE"+showNL80211Attrs 54 = "NL80211_ATTR_REASON_CODE"+showNL80211Attrs 55 = "NL80211_ATTR_KEY_TYPE"+showNL80211Attrs 56 = "NL80211_ATTR_MAX_SCAN_IE_LEN"+showNL80211Attrs 57 = "NL80211_ATTR_CIPHER_SUITES"+showNL80211Attrs 58 = "NL80211_ATTR_FREQ_BEFORE"+showNL80211Attrs 59 = "NL80211_ATTR_FREQ_AFTER"+showNL80211Attrs 60 = "NL80211_ATTR_FREQ_FIXED"+showNL80211Attrs 61 = "NL80211_ATTR_WIPHY_RETRY_SHORT"+showNL80211Attrs 62 = "NL80211_ATTR_WIPHY_RETRY_LONG"+showNL80211Attrs 63 = "NL80211_ATTR_WIPHY_FRAG_THRESHOLD"+showNL80211Attrs 64 = "NL80211_ATTR_WIPHY_RTS_THRESHOLD"+showNL80211Attrs 65 = "NL80211_ATTR_TIMED_OUT"+showNL80211Attrs 66 = "NL80211_ATTR_USE_MFP"+showNL80211Attrs 67 = "NL80211_ATTR_STA_FLAGS2"+showNL80211Attrs 68 = "NL80211_ATTR_CONTROL_PORT"+showNL80211Attrs 69 = "NL80211_ATTR_TESTDATA"+showNL80211Attrs 70 = "NL80211_ATTR_PRIVACY"+showNL80211Attrs 71 = "NL80211_ATTR_DISCONNECTED_BY_AP"+showNL80211Attrs 72 = "NL80211_ATTR_STATUS_CODE"+showNL80211Attrs 73 = "NL80211_ATTR_CIPHER_SUITES_PAIRWISE"+showNL80211Attrs 74 = "NL80211_ATTR_CIPHER_SUITE_GROUP"+showNL80211Attrs 75 = "NL80211_ATTR_WPA_VERSIONS"+showNL80211Attrs 76 = "NL80211_ATTR_AKM_SUITES"+showNL80211Attrs 77 = "NL80211_ATTR_REQ_IE"+showNL80211Attrs 78 = "NL80211_ATTR_RESP_IE"+showNL80211Attrs 79 = "NL80211_ATTR_PREV_BSSID"+showNL80211Attrs 80 = "NL80211_ATTR_KEY"+showNL80211Attrs 81 = "NL80211_ATTR_KEYS"+showNL80211Attrs 82 = "NL80211_ATTR_PID"+showNL80211Attrs 83 = "NL80211_ATTR_4ADDR"+showNL80211Attrs 84 = "NL80211_ATTR_SURVEY_INFO"+showNL80211Attrs 85 = "NL80211_ATTR_PMKID"+showNL80211Attrs 86 = "NL80211_ATTR_MAX_NUM_PMKIDS"+showNL80211Attrs 87 = "NL80211_ATTR_DURATION"+showNL80211Attrs 88 = "NL80211_ATTR_COOKIE"+showNL80211Attrs 89 = "NL80211_ATTR_WIPHY_COVERAGE_CLASS"+showNL80211Attrs 90 = "NL80211_ATTR_TX_RATES"+showNL80211Attrs 91 = "NL80211_ATTR_FRAME_MATCH"+showNL80211Attrs 92 = "NL80211_ATTR_ACK"+showNL80211Attrs 93 = "NL80211_ATTR_PS_STATE"+showNL80211Attrs 94 = "NL80211_ATTR_CQM"+showNL80211Attrs 95 = "NL80211_ATTR_LOCAL_STATE_CHANGE"+showNL80211Attrs 96 = "NL80211_ATTR_AP_ISOLATE"+showNL80211Attrs 97 = "NL80211_ATTR_WIPHY_TX_POWER_SETTING"+showNL80211Attrs 98 = "NL80211_ATTR_WIPHY_TX_POWER_LEVEL"+showNL80211Attrs 99 = "NL80211_ATTR_TX_FRAME_TYPES"+showNL80211Attrs 100 = "NL80211_ATTR_RX_FRAME_TYPES"+showNL80211Attrs 101 = "NL80211_ATTR_FRAME_TYPE"+showNL80211Attrs 102 = "NL80211_ATTR_CONTROL_PORT_ETHERTYPE"+showNL80211Attrs 103 = "NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT"+showNL80211Attrs 104 = "NL80211_ATTR_SUPPORT_IBSS_RSN"+showNL80211Attrs 105 = "NL80211_ATTR_WIPHY_ANTENNA_TX"+showNL80211Attrs 106 = "NL80211_ATTR_WIPHY_ANTENNA_RX"+showNL80211Attrs 107 = "NL80211_ATTR_MCAST_RATE"+showNL80211Attrs 108 = "NL80211_ATTR_OFFCHANNEL_TX_OK"+showNL80211Attrs 109 = "NL80211_ATTR_BSS_HT_OPMODE"+showNL80211Attrs 110 = "NL80211_ATTR_KEY_DEFAULT_TYPES"+showNL80211Attrs 111 = "NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION"+showNL80211Attrs 112 = "NL80211_ATTR_MESH_SETUP"+showNL80211Attrs 113 = "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX"+showNL80211Attrs 114 = "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX"+showNL80211Attrs 115 = "NL80211_ATTR_SUPPORT_MESH_AUTH"+showNL80211Attrs 116 = "NL80211_ATTR_STA_PLINK_STATE"+showNL80211Attrs 117 = "NL80211_ATTR_WOWLAN_TRIGGERS"+showNL80211Attrs 118 = "NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED"+showNL80211Attrs 119 = "NL80211_ATTR_SCHED_SCAN_INTERVAL"+showNL80211Attrs 120 = "NL80211_ATTR_INTERFACE_COMBINATIONS"+showNL80211Attrs 121 = "NL80211_ATTR_SOFTWARE_IFTYPES"+showNL80211Attrs 122 = "NL80211_ATTR_REKEY_DATA"+showNL80211Attrs 123 = "NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS"+showNL80211Attrs 124 = "NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN"+showNL80211Attrs 125 = "NL80211_ATTR_SCAN_SUPP_RATES"+showNL80211Attrs 126 = "NL80211_ATTR_HIDDEN_SSID"+showNL80211Attrs 127 = "NL80211_ATTR_IE_PROBE_RESP"+showNL80211Attrs 128 = "NL80211_ATTR_IE_ASSOC_RESP"+showNL80211Attrs 129 = "NL80211_ATTR_STA_WME"+showNL80211Attrs 130 = "NL80211_ATTR_SUPPORT_AP_UAPSD"+showNL80211Attrs 131 = "NL80211_ATTR_ROAM_SUPPORT"+showNL80211Attrs 132 = "NL80211_ATTR_SCHED_SCAN_MATCH"+showNL80211Attrs 133 = "NL80211_ATTR_MAX_MATCH_SETS"+showNL80211Attrs 134 = "NL80211_ATTR_PMKSA_CANDIDATE"+showNL80211Attrs 135 = "NL80211_ATTR_TX_NO_CCK_RATE"+showNL80211Attrs 136 = "NL80211_ATTR_TDLS_ACTION"+showNL80211Attrs 137 = "NL80211_ATTR_TDLS_DIALOG_TOKEN"+showNL80211Attrs 138 = "NL80211_ATTR_TDLS_OPERATION"+showNL80211Attrs 139 = "NL80211_ATTR_TDLS_SUPPORT"+showNL80211Attrs 140 = "NL80211_ATTR_TDLS_EXTERNAL_SETUP"+showNL80211Attrs 141 = "NL80211_ATTR_DEVICE_AP_SME"+showNL80211Attrs 142 = "NL80211_ATTR_DONT_WAIT_FOR_ACK"+showNL80211Attrs 143 = "NL80211_ATTR_FEATURE_FLAGS"+showNL80211Attrs 144 = "NL80211_ATTR_PROBE_RESP_OFFLOAD"+showNL80211Attrs 145 = "NL80211_ATTR_PROBE_RESP"+showNL80211Attrs 146 = "NL80211_ATTR_DFS_REGION"+showNL80211Attrs 147 = "NL80211_ATTR_DISABLE_HT"+showNL80211Attrs 148 = "NL80211_ATTR_HT_CAPABILITY_MASK"+showNL80211Attrs 149 = "NL80211_ATTR_NOACK_MAP"+showNL80211Attrs 150 = "NL80211_ATTR_INACTIVITY_TIMEOUT"+showNL80211Attrs 151 = "NL80211_ATTR_RX_SIGNAL_DBM"+showNL80211Attrs 152 = "NL80211_ATTR_BG_SCAN_PERIOD"+showNL80211Attrs 153 = "NL80211_ATTR_WDEV"+showNL80211Attrs 154 = "NL80211_ATTR_USER_REG_HINT_TYPE"+showNL80211Attrs 155 = "NL80211_ATTR_CONN_FAILED_REASON"+showNL80211Attrs 156 = "NL80211_ATTR_SAE_DATA"+showNL80211Attrs 157 = "NL80211_ATTR_VHT_CAPABILITY"+showNL80211Attrs 158 = "NL80211_ATTR_SCAN_FLAGS"+showNL80211Attrs 159 = "NL80211_ATTR_CHANNEL_WIDTH"+showNL80211Attrs 160 = "NL80211_ATTR_CENTER_FREQ1"+showNL80211Attrs 161 = "NL80211_ATTR_CENTER_FREQ2"+showNL80211Attrs 162 = "NL80211_ATTR_P2P_CTWINDOW"+showNL80211Attrs 163 = "NL80211_ATTR_P2P_OPPPS"+showNL80211Attrs 164 = "NL80211_ATTR_LOCAL_MESH_POWER_MODE"+showNL80211Attrs 165 = "NL80211_ATTR_ACL_POLICY"+showNL80211Attrs 166 = "NL80211_ATTR_MAC_ADDRS"+showNL80211Attrs 167 = "NL80211_ATTR_MAC_ACL_MAX"+showNL80211Attrs 168 = "NL80211_ATTR_RADAR_EVENT"+showNL80211Attrs 169 = "NL80211_ATTR_EXT_CAPA"+showNL80211Attrs 170 = "NL80211_ATTR_EXT_CAPA_MASK"+showNL80211Attrs 171 = "NL80211_ATTR_STA_CAPABILITY"+showNL80211Attrs 172 = "NL80211_ATTR_STA_EXT_CAPABILITY"+showNL80211Attrs 173 = "NL80211_ATTR_PROTOCOL_FEATURES"+showNL80211Attrs 174 = "NL80211_ATTR_SPLIT_WIPHY_DUMP"+showNL80211Attrs 175 = "NL80211_ATTR_DISABLE_VHT"+showNL80211Attrs 176 = "NL80211_ATTR_VHT_CAPABILITY_MASK"+showNL80211Attrs 177 = "NL80211_ATTR_MDID"+showNL80211Attrs 178 = "NL80211_ATTR_IE_RIC"+showNL80211Attrs 179 = "NL80211_ATTR_CRIT_PROT_ID"+showNL80211Attrs 180 = "NL80211_ATTR_MAX_CRIT_PROT_DURATION"+showNL80211Attrs 181 = "NL80211_ATTR_PEER_AID"+showNL80211Attrs 182 = "NL80211_ATTR_COALESCE_RULE"+showNL80211Attrs 183 = "NL80211_ATTR_CH_SWITCH_COUNT"+showNL80211Attrs 184 = "NL80211_ATTR_CH_SWITCH_BLOCK_TX"+showNL80211Attrs 185 = "NL80211_ATTR_CSA_IES"+showNL80211Attrs 186 = "NL80211_ATTR_CSA_C_OFF_BEACON"+showNL80211Attrs 187 = "NL80211_ATTR_CSA_C_OFF_PRESP"+showNL80211Attrs 188 = "NL80211_ATTR_RXMGMT_FLAGS"+showNL80211Attrs 189 = "NL80211_ATTR_STA_SUPPORTED_CHANNELS"+showNL80211Attrs 190 = "NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES"+showNL80211Attrs 191 = "NL80211_ATTR_HANDLE_DFS"+showNL80211Attrs 192 = "NL80211_ATTR_SUPPORT_5_MHZ"+showNL80211Attrs 193 = "NL80211_ATTR_SUPPORT_10_MHZ"+showNL80211Attrs 194 = "NL80211_ATTR_OPMODE_NOTIF"+showNL80211Attrs 195 = "NL80211_ATTR_VENDOR_ID"+showNL80211Attrs 196 = "NL80211_ATTR_VENDOR_SUBCMD"+showNL80211Attrs 197 = "NL80211_ATTR_VENDOR_DATA"+showNL80211Attrs 198 = "NL80211_ATTR_VENDOR_EVENTS"+showNL80211Attrs 199 = "NL80211_ATTR_QOS_MAP"+showNL80211Attrs 200 = "NL80211_ATTR_MAC_HINT"+showNL80211Attrs 201 = "NL80211_ATTR_WIPHY_FREQ_HINT"+showNL80211Attrs 202 = "NL80211_ATTR_MAX_AP_ASSOC_STA"+showNL80211Attrs 203 = "NL80211_ATTR_TDLS_PEER_CAPABILITY"+showNL80211Attrs 204 = "NL80211_ATTR_SOCKET_OWNER"+showNL80211Attrs 205 = "NL80211_ATTR_CSA_C_OFFSETS_TX"+showNL80211Attrs 206 = "NL80211_ATTR_MAX_CSA_COUNTERS"+showNL80211Attrs 207 = "NL80211_ATTR_TDLS_INITIATOR"+showNL80211Attrs 208 = "NL80211_ATTR_USE_RRM"+showNL80211Attrs 209 = "NL80211_ATTR_WIPHY_DYN_ACK"+showNL80211Attrs 210 = "NL80211_ATTR_TSID"+showNL80211Attrs 211 = "NL80211_ATTR_USER_PRIO"+showNL80211Attrs 212 = "NL80211_ATTR_ADMITTED_TIME"+showNL80211Attrs 213 = "NL80211_ATTR_SMPS_MODE"+showNL80211Attrs 214 = "NL80211_ATTR_OPER_CLASS"+showNL80211Attrs 215 = "NL80211_ATTR_MAC_MASK"+showNL80211Attrs 216 = "NL80211_ATTR_WIPHY_SELF_MANAGED_REG"+showNL80211Attrs 217 = "NL80211_ATTR_EXT_FEATURES"+showNL80211Attrs 218 = "NL80211_ATTR_SURVEY_RADIO_STATS"+showNL80211Attrs 219 = "NL80211_ATTR_NETNS_FD"+showNL80211Attrs 220 = "NL80211_ATTR_SCHED_SCAN_DELAY"+showNL80211Attrs 221 = "NL80211_ATTR_REG_INDOOR"+showNL80211Attrs 222 = "NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS"+showNL80211Attrs 223 = "NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL"+showNL80211Attrs 224 = "NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS"+showNL80211Attrs 225 = "NL80211_ATTR_MAX"+showNL80211Attrs 226 = "NUM_NL80211_ATTR"+showNL80211Attrs i = "NL80211Attrs #" ++ (show i)+++eNL80211_ATTR_UNSPEC :: (Num a) => a+eNL80211_ATTR_UNSPEC = 0+eNL80211_ATTR_WIPHY :: (Num a) => a+eNL80211_ATTR_WIPHY = 1+eNL80211_ATTR_WIPHY_NAME :: (Num a) => a+eNL80211_ATTR_WIPHY_NAME = 2+eNL80211_ATTR_IFINDEX :: (Num a) => a+eNL80211_ATTR_IFINDEX = 3+eNL80211_ATTR_IFNAME :: (Num a) => a+eNL80211_ATTR_IFNAME = 4+eNL80211_ATTR_IFTYPE :: (Num a) => a+eNL80211_ATTR_IFTYPE = 5+eNL80211_ATTR_MAC :: (Num a) => a+eNL80211_ATTR_MAC = 6+eNL80211_ATTR_KEY_DATA :: (Num a) => a+eNL80211_ATTR_KEY_DATA = 7+eNL80211_ATTR_KEY_IDX :: (Num a) => a+eNL80211_ATTR_KEY_IDX = 8+eNL80211_ATTR_KEY_CIPHER :: (Num a) => a+eNL80211_ATTR_KEY_CIPHER = 9+eNL80211_ATTR_KEY_SEQ :: (Num a) => a+eNL80211_ATTR_KEY_SEQ = 10+eNL80211_ATTR_KEY_DEFAULT :: (Num a) => a+eNL80211_ATTR_KEY_DEFAULT = 11+eNL80211_ATTR_BEACON_INTERVAL :: (Num a) => a+eNL80211_ATTR_BEACON_INTERVAL = 12+eNL80211_ATTR_DTIM_PERIOD :: (Num a) => a+eNL80211_ATTR_DTIM_PERIOD = 13+eNL80211_ATTR_BEACON_HEAD :: (Num a) => a+eNL80211_ATTR_BEACON_HEAD = 14+eNL80211_ATTR_BEACON_TAIL :: (Num a) => a+eNL80211_ATTR_BEACON_TAIL = 15+eNL80211_ATTR_STA_AID :: (Num a) => a+eNL80211_ATTR_STA_AID = 16+eNL80211_ATTR_STA_FLAGS :: (Num a) => a+eNL80211_ATTR_STA_FLAGS = 17+eNL80211_ATTR_STA_LISTEN_INTERVAL :: (Num a) => a+eNL80211_ATTR_STA_LISTEN_INTERVAL = 18+eNL80211_ATTR_STA_SUPPORTED_RATES :: (Num a) => a+eNL80211_ATTR_STA_SUPPORTED_RATES = 19+eNL80211_ATTR_STA_VLAN :: (Num a) => a+eNL80211_ATTR_STA_VLAN = 20+eNL80211_ATTR_STA_INFO :: (Num a) => a+eNL80211_ATTR_STA_INFO = 21+eNL80211_ATTR_WIPHY_BANDS :: (Num a) => a+eNL80211_ATTR_WIPHY_BANDS = 22+eNL80211_ATTR_MNTR_FLAGS :: (Num a) => a+eNL80211_ATTR_MNTR_FLAGS = 23+eNL80211_ATTR_MESH_ID :: (Num a) => a+eNL80211_ATTR_MESH_ID = 24+eNL80211_ATTR_STA_PLINK_ACTION :: (Num a) => a+eNL80211_ATTR_STA_PLINK_ACTION = 25+eNL80211_ATTR_MPATH_NEXT_HOP :: (Num a) => a+eNL80211_ATTR_MPATH_NEXT_HOP = 26+eNL80211_ATTR_MPATH_INFO :: (Num a) => a+eNL80211_ATTR_MPATH_INFO = 27+eNL80211_ATTR_BSS_CTS_PROT :: (Num a) => a+eNL80211_ATTR_BSS_CTS_PROT = 28+eNL80211_ATTR_BSS_SHORT_PREAMBLE :: (Num a) => a+eNL80211_ATTR_BSS_SHORT_PREAMBLE = 29+eNL80211_ATTR_BSS_SHORT_SLOT_TIME :: (Num a) => a+eNL80211_ATTR_BSS_SHORT_SLOT_TIME = 30+eNL80211_ATTR_HT_CAPABILITY :: (Num a) => a+eNL80211_ATTR_HT_CAPABILITY = 31+eNL80211_ATTR_SUPPORTED_IFTYPES :: (Num a) => a+eNL80211_ATTR_SUPPORTED_IFTYPES = 32+eNL80211_ATTR_REG_ALPHA2 :: (Num a) => a+eNL80211_ATTR_REG_ALPHA2 = 33+eNL80211_ATTR_REG_RULES :: (Num a) => a+eNL80211_ATTR_REG_RULES = 34+eNL80211_ATTR_MESH_CONFIG :: (Num a) => a+eNL80211_ATTR_MESH_CONFIG = 35+eNL80211_ATTR_BSS_BASIC_RATES :: (Num a) => a+eNL80211_ATTR_BSS_BASIC_RATES = 36+eNL80211_ATTR_WIPHY_TXQ_PARAMS :: (Num a) => a+eNL80211_ATTR_WIPHY_TXQ_PARAMS = 37+eNL80211_ATTR_WIPHY_FREQ :: (Num a) => a+eNL80211_ATTR_WIPHY_FREQ = 38+eNL80211_ATTR_WIPHY_CHANNEL_TYPE :: (Num a) => a+eNL80211_ATTR_WIPHY_CHANNEL_TYPE = 39+eNL80211_ATTR_KEY_DEFAULT_MGMT :: (Num a) => a+eNL80211_ATTR_KEY_DEFAULT_MGMT = 40+eNL80211_ATTR_MGMT_SUBTYPE :: (Num a) => a+eNL80211_ATTR_MGMT_SUBTYPE = 41+eNL80211_ATTR_IE :: (Num a) => a+eNL80211_ATTR_IE = 42+eNL80211_ATTR_MAX_NUM_SCAN_SSIDS :: (Num a) => a+eNL80211_ATTR_MAX_NUM_SCAN_SSIDS = 43+eNL80211_ATTR_SCAN_FREQUENCIES :: (Num a) => a+eNL80211_ATTR_SCAN_FREQUENCIES = 44+eNL80211_ATTR_SCAN_SSIDS :: (Num a) => a+eNL80211_ATTR_SCAN_SSIDS = 45+eNL80211_ATTR_GENERATION :: (Num a) => a+eNL80211_ATTR_GENERATION = 46+eNL80211_ATTR_BSS :: (Num a) => a+eNL80211_ATTR_BSS = 47+eNL80211_ATTR_REG_INITIATOR :: (Num a) => a+eNL80211_ATTR_REG_INITIATOR = 48+eNL80211_ATTR_REG_TYPE :: (Num a) => a+eNL80211_ATTR_REG_TYPE = 49+eNL80211_ATTR_SUPPORTED_COMMANDS :: (Num a) => a+eNL80211_ATTR_SUPPORTED_COMMANDS = 50+eNL80211_ATTR_FRAME :: (Num a) => a+eNL80211_ATTR_FRAME = 51+eNL80211_ATTR_SSID :: (Num a) => a+eNL80211_ATTR_SSID = 52+eNL80211_ATTR_AUTH_TYPE :: (Num a) => a+eNL80211_ATTR_AUTH_TYPE = 53+eNL80211_ATTR_REASON_CODE :: (Num a) => a+eNL80211_ATTR_REASON_CODE = 54+eNL80211_ATTR_KEY_TYPE :: (Num a) => a+eNL80211_ATTR_KEY_TYPE = 55+eNL80211_ATTR_MAX_SCAN_IE_LEN :: (Num a) => a+eNL80211_ATTR_MAX_SCAN_IE_LEN = 56+eNL80211_ATTR_CIPHER_SUITES :: (Num a) => a+eNL80211_ATTR_CIPHER_SUITES = 57+eNL80211_ATTR_FREQ_BEFORE :: (Num a) => a+eNL80211_ATTR_FREQ_BEFORE = 58+eNL80211_ATTR_FREQ_AFTER :: (Num a) => a+eNL80211_ATTR_FREQ_AFTER = 59+eNL80211_ATTR_FREQ_FIXED :: (Num a) => a+eNL80211_ATTR_FREQ_FIXED = 60+eNL80211_ATTR_WIPHY_RETRY_SHORT :: (Num a) => a+eNL80211_ATTR_WIPHY_RETRY_SHORT = 61+eNL80211_ATTR_WIPHY_RETRY_LONG :: (Num a) => a+eNL80211_ATTR_WIPHY_RETRY_LONG = 62+eNL80211_ATTR_WIPHY_FRAG_THRESHOLD :: (Num a) => a+eNL80211_ATTR_WIPHY_FRAG_THRESHOLD = 63+eNL80211_ATTR_WIPHY_RTS_THRESHOLD :: (Num a) => a+eNL80211_ATTR_WIPHY_RTS_THRESHOLD = 64+eNL80211_ATTR_TIMED_OUT :: (Num a) => a+eNL80211_ATTR_TIMED_OUT = 65+eNL80211_ATTR_USE_MFP :: (Num a) => a+eNL80211_ATTR_USE_MFP = 66+eNL80211_ATTR_STA_FLAGS2 :: (Num a) => a+eNL80211_ATTR_STA_FLAGS2 = 67+eNL80211_ATTR_CONTROL_PORT :: (Num a) => a+eNL80211_ATTR_CONTROL_PORT = 68+eNL80211_ATTR_TESTDATA :: (Num a) => a+eNL80211_ATTR_TESTDATA = 69+eNL80211_ATTR_PRIVACY :: (Num a) => a+eNL80211_ATTR_PRIVACY = 70+eNL80211_ATTR_DISCONNECTED_BY_AP :: (Num a) => a+eNL80211_ATTR_DISCONNECTED_BY_AP = 71+eNL80211_ATTR_STATUS_CODE :: (Num a) => a+eNL80211_ATTR_STATUS_CODE = 72+eNL80211_ATTR_CIPHER_SUITES_PAIRWISE :: (Num a) => a+eNL80211_ATTR_CIPHER_SUITES_PAIRWISE = 73+eNL80211_ATTR_CIPHER_SUITE_GROUP :: (Num a) => a+eNL80211_ATTR_CIPHER_SUITE_GROUP = 74+eNL80211_ATTR_WPA_VERSIONS :: (Num a) => a+eNL80211_ATTR_WPA_VERSIONS = 75+eNL80211_ATTR_AKM_SUITES :: (Num a) => a+eNL80211_ATTR_AKM_SUITES = 76+eNL80211_ATTR_REQ_IE :: (Num a) => a+eNL80211_ATTR_REQ_IE = 77+eNL80211_ATTR_RESP_IE :: (Num a) => a+eNL80211_ATTR_RESP_IE = 78+eNL80211_ATTR_PREV_BSSID :: (Num a) => a+eNL80211_ATTR_PREV_BSSID = 79+eNL80211_ATTR_KEY :: (Num a) => a+eNL80211_ATTR_KEY = 80+eNL80211_ATTR_KEYS :: (Num a) => a+eNL80211_ATTR_KEYS = 81+eNL80211_ATTR_PID :: (Num a) => a+eNL80211_ATTR_PID = 82+eNL80211_ATTR_4ADDR :: (Num a) => a+eNL80211_ATTR_4ADDR = 83+eNL80211_ATTR_SURVEY_INFO :: (Num a) => a+eNL80211_ATTR_SURVEY_INFO = 84+eNL80211_ATTR_PMKID :: (Num a) => a+eNL80211_ATTR_PMKID = 85+eNL80211_ATTR_MAX_NUM_PMKIDS :: (Num a) => a+eNL80211_ATTR_MAX_NUM_PMKIDS = 86+eNL80211_ATTR_DURATION :: (Num a) => a+eNL80211_ATTR_DURATION = 87+eNL80211_ATTR_COOKIE :: (Num a) => a+eNL80211_ATTR_COOKIE = 88+eNL80211_ATTR_WIPHY_COVERAGE_CLASS :: (Num a) => a+eNL80211_ATTR_WIPHY_COVERAGE_CLASS = 89+eNL80211_ATTR_TX_RATES :: (Num a) => a+eNL80211_ATTR_TX_RATES = 90+eNL80211_ATTR_FRAME_MATCH :: (Num a) => a+eNL80211_ATTR_FRAME_MATCH = 91+eNL80211_ATTR_ACK :: (Num a) => a+eNL80211_ATTR_ACK = 92+eNL80211_ATTR_PS_STATE :: (Num a) => a+eNL80211_ATTR_PS_STATE = 93+eNL80211_ATTR_CQM :: (Num a) => a+eNL80211_ATTR_CQM = 94+eNL80211_ATTR_LOCAL_STATE_CHANGE :: (Num a) => a+eNL80211_ATTR_LOCAL_STATE_CHANGE = 95+eNL80211_ATTR_AP_ISOLATE :: (Num a) => a+eNL80211_ATTR_AP_ISOLATE = 96+eNL80211_ATTR_WIPHY_TX_POWER_SETTING :: (Num a) => a+eNL80211_ATTR_WIPHY_TX_POWER_SETTING = 97+eNL80211_ATTR_WIPHY_TX_POWER_LEVEL :: (Num a) => a+eNL80211_ATTR_WIPHY_TX_POWER_LEVEL = 98+eNL80211_ATTR_TX_FRAME_TYPES :: (Num a) => a+eNL80211_ATTR_TX_FRAME_TYPES = 99+eNL80211_ATTR_RX_FRAME_TYPES :: (Num a) => a+eNL80211_ATTR_RX_FRAME_TYPES = 100+eNL80211_ATTR_FRAME_TYPE :: (Num a) => a+eNL80211_ATTR_FRAME_TYPE = 101+eNL80211_ATTR_CONTROL_PORT_ETHERTYPE :: (Num a) => a+eNL80211_ATTR_CONTROL_PORT_ETHERTYPE = 102+eNL80211_ATTR_CONTROL_PORT_NO_ENCRYPT :: (Num a) => a+eNL80211_ATTR_CONTROL_PORT_NO_ENCRYPT = 103+eNL80211_ATTR_SUPPORT_IBSS_RSN :: (Num a) => a+eNL80211_ATTR_SUPPORT_IBSS_RSN = 104+eNL80211_ATTR_WIPHY_ANTENNA_TX :: (Num a) => a+eNL80211_ATTR_WIPHY_ANTENNA_TX = 105+eNL80211_ATTR_WIPHY_ANTENNA_RX :: (Num a) => a+eNL80211_ATTR_WIPHY_ANTENNA_RX = 106+eNL80211_ATTR_MCAST_RATE :: (Num a) => a+eNL80211_ATTR_MCAST_RATE = 107+eNL80211_ATTR_OFFCHANNEL_TX_OK :: (Num a) => a+eNL80211_ATTR_OFFCHANNEL_TX_OK = 108+eNL80211_ATTR_BSS_HT_OPMODE :: (Num a) => a+eNL80211_ATTR_BSS_HT_OPMODE = 109+eNL80211_ATTR_KEY_DEFAULT_TYPES :: (Num a) => a+eNL80211_ATTR_KEY_DEFAULT_TYPES = 110+eNL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION :: (Num a) => a+eNL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION = 111+eNL80211_ATTR_MESH_SETUP :: (Num a) => a+eNL80211_ATTR_MESH_SETUP = 112+eNL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX :: (Num a) => a+eNL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX = 113+eNL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX :: (Num a) => a+eNL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX = 114+eNL80211_ATTR_SUPPORT_MESH_AUTH :: (Num a) => a+eNL80211_ATTR_SUPPORT_MESH_AUTH = 115+eNL80211_ATTR_STA_PLINK_STATE :: (Num a) => a+eNL80211_ATTR_STA_PLINK_STATE = 116+eNL80211_ATTR_WOWLAN_TRIGGERS :: (Num a) => a+eNL80211_ATTR_WOWLAN_TRIGGERS = 117+eNL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED :: (Num a) => a+eNL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED = 118+eNL80211_ATTR_SCHED_SCAN_INTERVAL :: (Num a) => a+eNL80211_ATTR_SCHED_SCAN_INTERVAL = 119+eNL80211_ATTR_INTERFACE_COMBINATIONS :: (Num a) => a+eNL80211_ATTR_INTERFACE_COMBINATIONS = 120+eNL80211_ATTR_SOFTWARE_IFTYPES :: (Num a) => a+eNL80211_ATTR_SOFTWARE_IFTYPES = 121+eNL80211_ATTR_REKEY_DATA :: (Num a) => a+eNL80211_ATTR_REKEY_DATA = 122+eNL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS :: (Num a) => a+eNL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS = 123+eNL80211_ATTR_MAX_SCHED_SCAN_IE_LEN :: (Num a) => a+eNL80211_ATTR_MAX_SCHED_SCAN_IE_LEN = 124+eNL80211_ATTR_SCAN_SUPP_RATES :: (Num a) => a+eNL80211_ATTR_SCAN_SUPP_RATES = 125+eNL80211_ATTR_HIDDEN_SSID :: (Num a) => a+eNL80211_ATTR_HIDDEN_SSID = 126+eNL80211_ATTR_IE_PROBE_RESP :: (Num a) => a+eNL80211_ATTR_IE_PROBE_RESP = 127+eNL80211_ATTR_IE_ASSOC_RESP :: (Num a) => a+eNL80211_ATTR_IE_ASSOC_RESP = 128+eNL80211_ATTR_STA_WME :: (Num a) => a+eNL80211_ATTR_STA_WME = 129+eNL80211_ATTR_SUPPORT_AP_UAPSD :: (Num a) => a+eNL80211_ATTR_SUPPORT_AP_UAPSD = 130+eNL80211_ATTR_ROAM_SUPPORT :: (Num a) => a+eNL80211_ATTR_ROAM_SUPPORT = 131+eNL80211_ATTR_SCHED_SCAN_MATCH :: (Num a) => a+eNL80211_ATTR_SCHED_SCAN_MATCH = 132+eNL80211_ATTR_MAX_MATCH_SETS :: (Num a) => a+eNL80211_ATTR_MAX_MATCH_SETS = 133+eNL80211_ATTR_PMKSA_CANDIDATE :: (Num a) => a+eNL80211_ATTR_PMKSA_CANDIDATE = 134+eNL80211_ATTR_TX_NO_CCK_RATE :: (Num a) => a+eNL80211_ATTR_TX_NO_CCK_RATE = 135+eNL80211_ATTR_TDLS_ACTION :: (Num a) => a+eNL80211_ATTR_TDLS_ACTION = 136+eNL80211_ATTR_TDLS_DIALOG_TOKEN :: (Num a) => a+eNL80211_ATTR_TDLS_DIALOG_TOKEN = 137+eNL80211_ATTR_TDLS_OPERATION :: (Num a) => a+eNL80211_ATTR_TDLS_OPERATION = 138+eNL80211_ATTR_TDLS_SUPPORT :: (Num a) => a+eNL80211_ATTR_TDLS_SUPPORT = 139+eNL80211_ATTR_TDLS_EXTERNAL_SETUP :: (Num a) => a+eNL80211_ATTR_TDLS_EXTERNAL_SETUP = 140+eNL80211_ATTR_DEVICE_AP_SME :: (Num a) => a+eNL80211_ATTR_DEVICE_AP_SME = 141+eNL80211_ATTR_DONT_WAIT_FOR_ACK :: (Num a) => a+eNL80211_ATTR_DONT_WAIT_FOR_ACK = 142+eNL80211_ATTR_FEATURE_FLAGS :: (Num a) => a+eNL80211_ATTR_FEATURE_FLAGS = 143+eNL80211_ATTR_PROBE_RESP_OFFLOAD :: (Num a) => a+eNL80211_ATTR_PROBE_RESP_OFFLOAD = 144+eNL80211_ATTR_PROBE_RESP :: (Num a) => a+eNL80211_ATTR_PROBE_RESP = 145+eNL80211_ATTR_DFS_REGION :: (Num a) => a+eNL80211_ATTR_DFS_REGION = 146+eNL80211_ATTR_DISABLE_HT :: (Num a) => a+eNL80211_ATTR_DISABLE_HT = 147+eNL80211_ATTR_HT_CAPABILITY_MASK :: (Num a) => a+eNL80211_ATTR_HT_CAPABILITY_MASK = 148+eNL80211_ATTR_NOACK_MAP :: (Num a) => a+eNL80211_ATTR_NOACK_MAP = 149+eNL80211_ATTR_INACTIVITY_TIMEOUT :: (Num a) => a+eNL80211_ATTR_INACTIVITY_TIMEOUT = 150+eNL80211_ATTR_RX_SIGNAL_DBM :: (Num a) => a+eNL80211_ATTR_RX_SIGNAL_DBM = 151+eNL80211_ATTR_BG_SCAN_PERIOD :: (Num a) => a+eNL80211_ATTR_BG_SCAN_PERIOD = 152+eNL80211_ATTR_WDEV :: (Num a) => a+eNL80211_ATTR_WDEV = 153+eNL80211_ATTR_USER_REG_HINT_TYPE :: (Num a) => a+eNL80211_ATTR_USER_REG_HINT_TYPE = 154+eNL80211_ATTR_CONN_FAILED_REASON :: (Num a) => a+eNL80211_ATTR_CONN_FAILED_REASON = 155+eNL80211_ATTR_SAE_DATA :: (Num a) => a+eNL80211_ATTR_SAE_DATA = 156+eNL80211_ATTR_VHT_CAPABILITY :: (Num a) => a+eNL80211_ATTR_VHT_CAPABILITY = 157+eNL80211_ATTR_SCAN_FLAGS :: (Num a) => a+eNL80211_ATTR_SCAN_FLAGS = 158+eNL80211_ATTR_CHANNEL_WIDTH :: (Num a) => a+eNL80211_ATTR_CHANNEL_WIDTH = 159+eNL80211_ATTR_CENTER_FREQ1 :: (Num a) => a+eNL80211_ATTR_CENTER_FREQ1 = 160+eNL80211_ATTR_CENTER_FREQ2 :: (Num a) => a+eNL80211_ATTR_CENTER_FREQ2 = 161+eNL80211_ATTR_P2P_CTWINDOW :: (Num a) => a+eNL80211_ATTR_P2P_CTWINDOW = 162+eNL80211_ATTR_P2P_OPPPS :: (Num a) => a+eNL80211_ATTR_P2P_OPPPS = 163+eNL80211_ATTR_LOCAL_MESH_POWER_MODE :: (Num a) => a+eNL80211_ATTR_LOCAL_MESH_POWER_MODE = 164+eNL80211_ATTR_ACL_POLICY :: (Num a) => a+eNL80211_ATTR_ACL_POLICY = 165+eNL80211_ATTR_MAC_ADDRS :: (Num a) => a+eNL80211_ATTR_MAC_ADDRS = 166+eNL80211_ATTR_MAC_ACL_MAX :: (Num a) => a+eNL80211_ATTR_MAC_ACL_MAX = 167+eNL80211_ATTR_RADAR_EVENT :: (Num a) => a+eNL80211_ATTR_RADAR_EVENT = 168+eNL80211_ATTR_EXT_CAPA :: (Num a) => a+eNL80211_ATTR_EXT_CAPA = 169+eNL80211_ATTR_EXT_CAPA_MASK :: (Num a) => a+eNL80211_ATTR_EXT_CAPA_MASK = 170+eNL80211_ATTR_STA_CAPABILITY :: (Num a) => a+eNL80211_ATTR_STA_CAPABILITY = 171+eNL80211_ATTR_STA_EXT_CAPABILITY :: (Num a) => a+eNL80211_ATTR_STA_EXT_CAPABILITY = 172+eNL80211_ATTR_PROTOCOL_FEATURES :: (Num a) => a+eNL80211_ATTR_PROTOCOL_FEATURES = 173+eNL80211_ATTR_SPLIT_WIPHY_DUMP :: (Num a) => a+eNL80211_ATTR_SPLIT_WIPHY_DUMP = 174+eNL80211_ATTR_DISABLE_VHT :: (Num a) => a+eNL80211_ATTR_DISABLE_VHT = 175+eNL80211_ATTR_VHT_CAPABILITY_MASK :: (Num a) => a+eNL80211_ATTR_VHT_CAPABILITY_MASK = 176+eNL80211_ATTR_MDID :: (Num a) => a+eNL80211_ATTR_MDID = 177+eNL80211_ATTR_IE_RIC :: (Num a) => a+eNL80211_ATTR_IE_RIC = 178+eNL80211_ATTR_CRIT_PROT_ID :: (Num a) => a+eNL80211_ATTR_CRIT_PROT_ID = 179+eNL80211_ATTR_MAX_CRIT_PROT_DURATION :: (Num a) => a+eNL80211_ATTR_MAX_CRIT_PROT_DURATION = 180+eNL80211_ATTR_PEER_AID :: (Num a) => a+eNL80211_ATTR_PEER_AID = 181+eNL80211_ATTR_COALESCE_RULE :: (Num a) => a+eNL80211_ATTR_COALESCE_RULE = 182+eNL80211_ATTR_CH_SWITCH_COUNT :: (Num a) => a+eNL80211_ATTR_CH_SWITCH_COUNT = 183+eNL80211_ATTR_CH_SWITCH_BLOCK_TX :: (Num a) => a+eNL80211_ATTR_CH_SWITCH_BLOCK_TX = 184+eNL80211_ATTR_CSA_IES :: (Num a) => a+eNL80211_ATTR_CSA_IES = 185+eNL80211_ATTR_CSA_C_OFF_BEACON :: (Num a) => a+eNL80211_ATTR_CSA_C_OFF_BEACON = 186+eNL80211_ATTR_CSA_C_OFF_PRESP :: (Num a) => a+eNL80211_ATTR_CSA_C_OFF_PRESP = 187+eNL80211_ATTR_RXMGMT_FLAGS :: (Num a) => a+eNL80211_ATTR_RXMGMT_FLAGS = 188+eNL80211_ATTR_STA_SUPPORTED_CHANNELS :: (Num a) => a+eNL80211_ATTR_STA_SUPPORTED_CHANNELS = 189+eNL80211_ATTR_STA_SUPPORTED_OPER_CLASSES :: (Num a) => a+eNL80211_ATTR_STA_SUPPORTED_OPER_CLASSES = 190+eNL80211_ATTR_HANDLE_DFS :: (Num a) => a+eNL80211_ATTR_HANDLE_DFS = 191+eNL80211_ATTR_SUPPORT_5_MHZ :: (Num a) => a+eNL80211_ATTR_SUPPORT_5_MHZ = 192+eNL80211_ATTR_SUPPORT_10_MHZ :: (Num a) => a+eNL80211_ATTR_SUPPORT_10_MHZ = 193+eNL80211_ATTR_OPMODE_NOTIF :: (Num a) => a+eNL80211_ATTR_OPMODE_NOTIF = 194+eNL80211_ATTR_VENDOR_ID :: (Num a) => a+eNL80211_ATTR_VENDOR_ID = 195+eNL80211_ATTR_VENDOR_SUBCMD :: (Num a) => a+eNL80211_ATTR_VENDOR_SUBCMD = 196+eNL80211_ATTR_VENDOR_DATA :: (Num a) => a+eNL80211_ATTR_VENDOR_DATA = 197+eNL80211_ATTR_VENDOR_EVENTS :: (Num a) => a+eNL80211_ATTR_VENDOR_EVENTS = 198+eNL80211_ATTR_QOS_MAP :: (Num a) => a+eNL80211_ATTR_QOS_MAP = 199+eNL80211_ATTR_MAC_HINT :: (Num a) => a+eNL80211_ATTR_MAC_HINT = 200+eNL80211_ATTR_WIPHY_FREQ_HINT :: (Num a) => a+eNL80211_ATTR_WIPHY_FREQ_HINT = 201+eNL80211_ATTR_MAX_AP_ASSOC_STA :: (Num a) => a+eNL80211_ATTR_MAX_AP_ASSOC_STA = 202+eNL80211_ATTR_TDLS_PEER_CAPABILITY :: (Num a) => a+eNL80211_ATTR_TDLS_PEER_CAPABILITY = 203+eNL80211_ATTR_SOCKET_OWNER :: (Num a) => a+eNL80211_ATTR_SOCKET_OWNER = 204+eNL80211_ATTR_CSA_C_OFFSETS_TX :: (Num a) => a+eNL80211_ATTR_CSA_C_OFFSETS_TX = 205+eNL80211_ATTR_MAX_CSA_COUNTERS :: (Num a) => a+eNL80211_ATTR_MAX_CSA_COUNTERS = 206+eNL80211_ATTR_TDLS_INITIATOR :: (Num a) => a+eNL80211_ATTR_TDLS_INITIATOR = 207+eNL80211_ATTR_USE_RRM :: (Num a) => a+eNL80211_ATTR_USE_RRM = 208+eNL80211_ATTR_WIPHY_DYN_ACK :: (Num a) => a+eNL80211_ATTR_WIPHY_DYN_ACK = 209+eNL80211_ATTR_TSID :: (Num a) => a+eNL80211_ATTR_TSID = 210+eNL80211_ATTR_USER_PRIO :: (Num a) => a+eNL80211_ATTR_USER_PRIO = 211+eNL80211_ATTR_ADMITTED_TIME :: (Num a) => a+eNL80211_ATTR_ADMITTED_TIME = 212+eNL80211_ATTR_SMPS_MODE :: (Num a) => a+eNL80211_ATTR_SMPS_MODE = 213+eNL80211_ATTR_OPER_CLASS :: (Num a) => a+eNL80211_ATTR_OPER_CLASS = 214+eNL80211_ATTR_MAC_MASK :: (Num a) => a+eNL80211_ATTR_MAC_MASK = 215+eNL80211_ATTR_WIPHY_SELF_MANAGED_REG :: (Num a) => a+eNL80211_ATTR_WIPHY_SELF_MANAGED_REG = 216+eNL80211_ATTR_EXT_FEATURES :: (Num a) => a+eNL80211_ATTR_EXT_FEATURES = 217+eNL80211_ATTR_SURVEY_RADIO_STATS :: (Num a) => a+eNL80211_ATTR_SURVEY_RADIO_STATS = 218+eNL80211_ATTR_NETNS_FD :: (Num a) => a+eNL80211_ATTR_NETNS_FD = 219+eNL80211_ATTR_SCHED_SCAN_DELAY :: (Num a) => a+eNL80211_ATTR_SCHED_SCAN_DELAY = 220+eNL80211_ATTR_REG_INDOOR :: (Num a) => a+eNL80211_ATTR_REG_INDOOR = 221+eNL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS :: (Num a) => a+eNL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS = 222+eNL80211_ATTR_MAX_SCAN_PLAN_INTERVAL :: (Num a) => a+eNL80211_ATTR_MAX_SCAN_PLAN_INTERVAL = 223+eNL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS :: (Num a) => a+eNL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS = 224+eNL80211_ATTR_MAX :: (Num a) => a+eNL80211_ATTR_MAX = 225+eNL80211_ATTR_SCHED_SCAN_PLANS :: (Num a) => a+eNL80211_ATTR_SCHED_SCAN_PLANS = 225+eNUM_NL80211_ATTR :: (Num a) => a+eNUM_NL80211_ATTR = 226+newtype NL80211Bss = NL80211Bss Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showNL80211Bss :: (Num a) => (Show a) => (Eq a) => a -> String+showNL80211Bss 1 = "NL80211_BSS_BSSID"+showNL80211Bss 2 = "NL80211_BSS_FREQUENCY"+showNL80211Bss 3 = "NL80211_BSS_TSF"+showNL80211Bss 4 = "NL80211_BSS_BEACON_INTERVAL"+showNL80211Bss 5 = "NL80211_BSS_CAPABILITY"+showNL80211Bss 6 = "NL80211_BSS_INFORMATION_ELEMENTS"+showNL80211Bss 7 = "NL80211_BSS_SIGNAL_MBM"+showNL80211Bss 8 = "NL80211_BSS_SIGNAL_UNSPEC"+showNL80211Bss 9 = "NL80211_BSS_STATUS"+showNL80211Bss 10 = "NL80211_BSS_SEEN_MS_AGO"+showNL80211Bss 11 = "NL80211_BSS_BEACON_IES"+showNL80211Bss 12 = "NL80211_BSS_CHAN_WIDTH"+showNL80211Bss 13 = "NL80211_BSS_BEACON_TSF"+showNL80211Bss 14 = "NL80211_BSS_PRESP_DATA"+showNL80211Bss 15 = "NL80211_BSS_LAST_SEEN_BOOTTIME"+showNL80211Bss i = "NL80211Bss #" ++ (show i)+++eNL80211_BSS_BSSID :: (Num a) => a+eNL80211_BSS_BSSID = 1+eNL80211_BSS_FREQUENCY :: (Num a) => a+eNL80211_BSS_FREQUENCY = 2+eNL80211_BSS_TSF :: (Num a) => a+eNL80211_BSS_TSF = 3+eNL80211_BSS_BEACON_INTERVAL :: (Num a) => a+eNL80211_BSS_BEACON_INTERVAL = 4+eNL80211_BSS_CAPABILITY :: (Num a) => a+eNL80211_BSS_CAPABILITY = 5+eNL80211_BSS_INFORMATION_ELEMENTS :: (Num a) => a+eNL80211_BSS_INFORMATION_ELEMENTS = 6+eNL80211_BSS_SIGNAL_MBM :: (Num a) => a+eNL80211_BSS_SIGNAL_MBM = 7+eNL80211_BSS_SIGNAL_UNSPEC :: (Num a) => a+eNL80211_BSS_SIGNAL_UNSPEC = 8+eNL80211_BSS_STATUS :: (Num a) => a+eNL80211_BSS_STATUS = 9+eNL80211_BSS_SEEN_MS_AGO :: (Num a) => a+eNL80211_BSS_SEEN_MS_AGO = 10+eNL80211_BSS_BEACON_IES :: (Num a) => a+eNL80211_BSS_BEACON_IES = 11+eNL80211_BSS_CHAN_WIDTH :: (Num a) => a+eNL80211_BSS_CHAN_WIDTH = 12+eNL80211_BSS_BEACON_TSF :: (Num a) => a+eNL80211_BSS_BEACON_TSF = 13+eNL80211_BSS_PRESP_DATA :: (Num a) => a+eNL80211_BSS_PRESP_DATA = 14+eNL80211_BSS_LAST_SEEN_BOOTTIME :: (Num a) => a+eNL80211_BSS_LAST_SEEN_BOOTTIME = 15+eNL80211_BSS_MAX :: (Num a) => a+eNL80211_BSS_MAX = 15+newtype Nl80211StaInfo = Nl80211StaInfo Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showNl80211StaInfo :: (Num a) => (Show a) => (Eq a) => a -> String+showNl80211StaInfo 1 = "NL80211_STA_INFO_INACTIVE_TIME"+showNl80211StaInfo 2 = "NL80211_STA_INFO_RX_BYTES"+showNl80211StaInfo 3 = "NL80211_STA_INFO_TX_BYTES"+showNl80211StaInfo 4 = "NL80211_STA_INFO_LLID"+showNl80211StaInfo 5 = "NL80211_STA_INFO_PLID"+showNl80211StaInfo 6 = "NL80211_STA_INFO_PLINK_STATE"+showNl80211StaInfo 7 = "NL80211_STA_INFO_SIGNAL"+showNl80211StaInfo 8 = "NL80211_STA_INFO_TX_BITRATE"+showNl80211StaInfo 9 = "NL80211_STA_INFO_RX_PACKETS"+showNl80211StaInfo 10 = "NL80211_STA_INFO_TX_PACKETS"+showNl80211StaInfo 11 = "NL80211_STA_INFO_TX_RETRIES"+showNl80211StaInfo 12 = "NL80211_STA_INFO_TX_FAILED"+showNl80211StaInfo 13 = "NL80211_STA_INFO_SIGNAL_AVG"+showNl80211StaInfo 14 = "NL80211_STA_INFO_RX_BITRATE"+showNl80211StaInfo 15 = "NL80211_STA_INFO_BSS_PARAM"+showNl80211StaInfo 16 = "NL80211_STA_INFO_CONNECTED_TIME"+showNl80211StaInfo 17 = "NL80211_STA_INFO_STA_FLAGS"+showNl80211StaInfo 18 = "NL80211_STA_INFO_BEACON_LOSS"+showNl80211StaInfo 19 = "NL80211_STA_INFO_T_OFFSET"+showNl80211StaInfo 20 = "NL80211_STA_INFO_LOCAL_PM"+showNl80211StaInfo 21 = "NL80211_STA_INFO_PEER_PM"+showNl80211StaInfo 22 = "NL80211_STA_INFO_NONPEER_PM"+showNl80211StaInfo 23 = "NL80211_STA_INFO_RX_BYTES64"+showNl80211StaInfo 24 = "NL80211_STA_INFO_TX_BYTES64"+showNl80211StaInfo 25 = "NL80211_STA_INFO_CHAIN_SIGNAL"+showNl80211StaInfo 26 = "NL80211_STA_INFO_CHAIN_SIGNAL_AVG"+showNl80211StaInfo 27 = "NL80211_STA_INFO_EXPECTED_THROUGHPUT"+showNl80211StaInfo 28 = "NL80211_STA_INFO_RX_DROP_MISC"+showNl80211StaInfo 29 = "NL80211_STA_INFO_BEACON_RX"+showNl80211StaInfo 30 = "NL80211_STA_INFO_BEACON_SIGNAL_AVG"+showNl80211StaInfo 31 = "NL80211_STA_INFO_MAX"+showNl80211StaInfo i = "Nl80211StaInfo #" ++ (show i)+++eNL80211_STA_INFO_INACTIVE_TIME :: (Num a) => a+eNL80211_STA_INFO_INACTIVE_TIME = 1+eNL80211_STA_INFO_RX_BYTES :: (Num a) => a+eNL80211_STA_INFO_RX_BYTES = 2+eNL80211_STA_INFO_TX_BYTES :: (Num a) => a+eNL80211_STA_INFO_TX_BYTES = 3+eNL80211_STA_INFO_LLID :: (Num a) => a+eNL80211_STA_INFO_LLID = 4+eNL80211_STA_INFO_PLID :: (Num a) => a+eNL80211_STA_INFO_PLID = 5+eNL80211_STA_INFO_PLINK_STATE :: (Num a) => a+eNL80211_STA_INFO_PLINK_STATE = 6+eNL80211_STA_INFO_SIGNAL :: (Num a) => a+eNL80211_STA_INFO_SIGNAL = 7+eNL80211_STA_INFO_TX_BITRATE :: (Num a) => a+eNL80211_STA_INFO_TX_BITRATE = 8+eNL80211_STA_INFO_RX_PACKETS :: (Num a) => a+eNL80211_STA_INFO_RX_PACKETS = 9+eNL80211_STA_INFO_TX_PACKETS :: (Num a) => a+eNL80211_STA_INFO_TX_PACKETS = 10+eNL80211_STA_INFO_TX_RETRIES :: (Num a) => a+eNL80211_STA_INFO_TX_RETRIES = 11+eNL80211_STA_INFO_TX_FAILED :: (Num a) => a+eNL80211_STA_INFO_TX_FAILED = 12+eNL80211_STA_INFO_SIGNAL_AVG :: (Num a) => a+eNL80211_STA_INFO_SIGNAL_AVG = 13+eNL80211_STA_INFO_RX_BITRATE :: (Num a) => a+eNL80211_STA_INFO_RX_BITRATE = 14+eNL80211_STA_INFO_BSS_PARAM :: (Num a) => a+eNL80211_STA_INFO_BSS_PARAM = 15+eNL80211_STA_INFO_CONNECTED_TIME :: (Num a) => a+eNL80211_STA_INFO_CONNECTED_TIME = 16+eNL80211_STA_INFO_STA_FLAGS :: (Num a) => a+eNL80211_STA_INFO_STA_FLAGS = 17+eNL80211_STA_INFO_BEACON_LOSS :: (Num a) => a+eNL80211_STA_INFO_BEACON_LOSS = 18+eNL80211_STA_INFO_T_OFFSET :: (Num a) => a+eNL80211_STA_INFO_T_OFFSET = 19+eNL80211_STA_INFO_LOCAL_PM :: (Num a) => a+eNL80211_STA_INFO_LOCAL_PM = 20+eNL80211_STA_INFO_PEER_PM :: (Num a) => a+eNL80211_STA_INFO_PEER_PM = 21+eNL80211_STA_INFO_NONPEER_PM :: (Num a) => a+eNL80211_STA_INFO_NONPEER_PM = 22+eNL80211_STA_INFO_RX_BYTES64 :: (Num a) => a+eNL80211_STA_INFO_RX_BYTES64 = 23+eNL80211_STA_INFO_TX_BYTES64 :: (Num a) => a+eNL80211_STA_INFO_TX_BYTES64 = 24+eNL80211_STA_INFO_CHAIN_SIGNAL :: (Num a) => a+eNL80211_STA_INFO_CHAIN_SIGNAL = 25+eNL80211_STA_INFO_CHAIN_SIGNAL_AVG :: (Num a) => a+eNL80211_STA_INFO_CHAIN_SIGNAL_AVG = 26+eNL80211_STA_INFO_EXPECTED_THROUGHPUT :: (Num a) => a+eNL80211_STA_INFO_EXPECTED_THROUGHPUT = 27+eNL80211_STA_INFO_RX_DROP_MISC :: (Num a) => a+eNL80211_STA_INFO_RX_DROP_MISC = 28+eNL80211_STA_INFO_BEACON_RX :: (Num a) => a+eNL80211_STA_INFO_BEACON_RX = 29+eNL80211_STA_INFO_BEACON_SIGNAL_AVG :: (Num a) => a+eNL80211_STA_INFO_BEACON_SIGNAL_AVG = 30+eNL80211_STA_INFO_MAX :: (Num a) => a+eNL80211_STA_INFO_MAX = 31+eNL80211_STA_INFO_TID_STATS :: (Num a) => a+eNL80211_STA_INFO_TID_STATS = 31+newtype IEEE80211EID = IEEE80211EID Int deriving (Eq, Enum, Integral, Num, Ord, Real, Show)++showIEEE80211EID :: (Num a) => (Show a) => (Eq a) => a -> String+showIEEE80211EID 0 = "WLAN_EID_SSID"+showIEEE80211EID 1 = "WLAN_EID_SUPP_RATES"+showIEEE80211EID 2 = "WLAN_EID_FH_PARAMS"+showIEEE80211EID 3 = "WLAN_EID_DS_PARAMS"+showIEEE80211EID 4 = "WLAN_EID_CF_PARAMS"+showIEEE80211EID 5 = "WLAN_EID_TIM"+showIEEE80211EID 6 = "WLAN_EID_IBSS_PARAMS"+showIEEE80211EID 7 = "WLAN_EID_COUNTRY"+showIEEE80211EID 10 = "WLAN_EID_REQUEST"+showIEEE80211EID 11 = "WLAN_EID_QBSS_LOAD"+showIEEE80211EID 12 = "WLAN_EID_EDCA_PARAM_SET"+showIEEE80211EID 13 = "WLAN_EID_TSPEC"+showIEEE80211EID 14 = "WLAN_EID_TCLAS"+showIEEE80211EID 15 = "WLAN_EID_SCHEDULE"+showIEEE80211EID 16 = "WLAN_EID_CHALLENGE"+showIEEE80211EID 32 = "WLAN_EID_PWR_CONSTRAINT"+showIEEE80211EID 33 = "WLAN_EID_PWR_CAPABILITY"+showIEEE80211EID 34 = "WLAN_EID_TPC_REQUEST"+showIEEE80211EID 35 = "WLAN_EID_TPC_REPORT"+showIEEE80211EID 36 = "WLAN_EID_SUPPORTED_CHANNELS"+showIEEE80211EID 37 = "WLAN_EID_CHANNEL_SWITCH"+showIEEE80211EID 38 = "WLAN_EID_MEASURE_REQUEST"+showIEEE80211EID 39 = "WLAN_EID_MEASURE_REPORT"+showIEEE80211EID 40 = "WLAN_EID_QUIET"+showIEEE80211EID 41 = "WLAN_EID_IBSS_DFS"+showIEEE80211EID 42 = "WLAN_EID_ERP_INFO"+showIEEE80211EID 43 = "WLAN_EID_TS_DELAY"+showIEEE80211EID 44 = "WLAN_EID_TCLAS_PROCESSING"+showIEEE80211EID 45 = "WLAN_EID_HT_CAPABILITY"+showIEEE80211EID 46 = "WLAN_EID_QOS_CAPA"+showIEEE80211EID 48 = "WLAN_EID_RSN"+showIEEE80211EID 49 = "WLAN_EID_802_15_COEX"+showIEEE80211EID 50 = "WLAN_EID_EXT_SUPP_RATES"+showIEEE80211EID 51 = "WLAN_EID_AP_CHAN_REPORT"+showIEEE80211EID 52 = "WLAN_EID_NEIGHBOR_REPORT"+showIEEE80211EID 53 = "WLAN_EID_RCPI"+showIEEE80211EID 54 = "WLAN_EID_MOBILITY_DOMAIN"+showIEEE80211EID 55 = "WLAN_EID_FAST_BSS_TRANSITION"+showIEEE80211EID 56 = "WLAN_EID_TIMEOUT_INTERVAL"+showIEEE80211EID 57 = "WLAN_EID_RIC_DATA"+showIEEE80211EID 58 = "WLAN_EID_DSE_REGISTERED_LOCATION"+showIEEE80211EID 59 = "WLAN_EID_SUPPORTED_REGULATORY_CLASSES"+showIEEE80211EID 60 = "WLAN_EID_EXT_CHANSWITCH_ANN"+showIEEE80211EID 61 = "WLAN_EID_HT_OPERATION"+showIEEE80211EID 62 = "WLAN_EID_SECONDARY_CHANNEL_OFFSET"+showIEEE80211EID 63 = "WLAN_EID_BSS_AVG_ACCESS_DELAY"+showIEEE80211EID 64 = "WLAN_EID_ANTENNA_INFO"+showIEEE80211EID 65 = "WLAN_EID_RSNI"+showIEEE80211EID 66 = "WLAN_EID_MEASUREMENT_PILOT_TX_INFO"+showIEEE80211EID 67 = "WLAN_EID_BSS_AVAILABLE_CAPACITY"+showIEEE80211EID 68 = "WLAN_EID_BSS_AC_ACCESS_DELAY"+showIEEE80211EID 69 = "WLAN_EID_TIME_ADVERTISEMENT"+showIEEE80211EID 70 = "WLAN_EID_RRM_ENABLED_CAPABILITIES"+showIEEE80211EID 71 = "WLAN_EID_MULTIPLE_BSSID"+showIEEE80211EID 72 = "WLAN_EID_BSS_COEX_2040"+showIEEE80211EID 73 = "WLAN_EID_BSS_INTOLERANT_CHL_REPORT"+showIEEE80211EID 74 = "WLAN_EID_OVERLAP_BSS_SCAN_PARAM"+showIEEE80211EID 75 = "WLAN_EID_RIC_DESCRIPTOR"+showIEEE80211EID 76 = "WLAN_EID_MMIE"+showIEEE80211EID 77 = "WLAN_EID_ASSOC_COMEBACK_TIME"+showIEEE80211EID 78 = "WLAN_EID_EVENT_REQUEST"+showIEEE80211EID 79 = "WLAN_EID_EVENT_REPORT"+showIEEE80211EID 80 = "WLAN_EID_DIAGNOSTIC_REQUEST"+showIEEE80211EID 81 = "WLAN_EID_DIAGNOSTIC_REPORT"+showIEEE80211EID 82 = "WLAN_EID_LOCATION_PARAMS"+showIEEE80211EID 83 = "WLAN_EID_NON_TX_BSSID_CAP"+showIEEE80211EID 84 = "WLAN_EID_SSID_LIST"+showIEEE80211EID 85 = "WLAN_EID_MULTI_BSSID_IDX"+showIEEE80211EID 86 = "WLAN_EID_FMS_DESCRIPTOR"+showIEEE80211EID 87 = "WLAN_EID_FMS_REQUEST"+showIEEE80211EID 88 = "WLAN_EID_FMS_RESPONSE"+showIEEE80211EID 89 = "WLAN_EID_QOS_TRAFFIC_CAPA"+showIEEE80211EID 90 = "WLAN_EID_BSS_MAX_IDLE_PERIOD"+showIEEE80211EID 91 = "WLAN_EID_TSF_REQUEST"+showIEEE80211EID 92 = "WLAN_EID_TSF_RESPOSNE"+showIEEE80211EID 93 = "WLAN_EID_WNM_SLEEP_MODE"+showIEEE80211EID 94 = "WLAN_EID_TIM_BCAST_REQ"+showIEEE80211EID 95 = "WLAN_EID_TIM_BCAST_RESP"+showIEEE80211EID 96 = "WLAN_EID_COLL_IF_REPORT"+showIEEE80211EID 97 = "WLAN_EID_CHANNEL_USAGE"+showIEEE80211EID 98 = "WLAN_EID_TIME_ZONE"+showIEEE80211EID 99 = "WLAN_EID_DMS_REQUEST"+showIEEE80211EID 100 = "WLAN_EID_DMS_RESPONSE"+showIEEE80211EID 101 = "WLAN_EID_LINK_ID"+showIEEE80211EID 102 = "WLAN_EID_WAKEUP_SCHEDUL"+showIEEE80211EID 104 = "WLAN_EID_CHAN_SWITCH_TIMING"+showIEEE80211EID 105 = "WLAN_EID_PTI_CONTROL"+showIEEE80211EID 106 = "WLAN_EID_PU_BUFFER_STATUS"+showIEEE80211EID 107 = "WLAN_EID_INTERWORKING"+showIEEE80211EID 108 = "WLAN_EID_ADVERTISEMENT_PROTOCOL"+showIEEE80211EID 109 = "WLAN_EID_EXPEDITED_BW_REQ"+showIEEE80211EID 110 = "WLAN_EID_QOS_MAP_SET"+showIEEE80211EID 111 = "WLAN_EID_ROAMING_CONSORTIUM"+showIEEE80211EID 112 = "WLAN_EID_EMERGENCY_ALERT"+showIEEE80211EID 113 = "WLAN_EID_MESH_CONFIG"+showIEEE80211EID 114 = "WLAN_EID_MESH_ID"+showIEEE80211EID 115 = "WLAN_EID_LINK_METRIC_REPORT"+showIEEE80211EID 116 = "WLAN_EID_CONGESTION_NOTIFICATION"+showIEEE80211EID 117 = "WLAN_EID_PEER_MGMT"+showIEEE80211EID 118 = "WLAN_EID_CHAN_SWITCH_PARAM"+showIEEE80211EID 119 = "WLAN_EID_MESH_AWAKE_WINDOW"+showIEEE80211EID 120 = "WLAN_EID_BEACON_TIMING"+showIEEE80211EID 121 = "WLAN_EID_MCCAOP_SETUP_REQ"+showIEEE80211EID 122 = "WLAN_EID_MCCAOP_SETUP_RESP"+showIEEE80211EID 123 = "WLAN_EID_MCCAOP_ADVERT"+showIEEE80211EID 124 = "WLAN_EID_MCCAOP_TEARDOWN"+showIEEE80211EID 125 = "WLAN_EID_GANN"+showIEEE80211EID 126 = "WLAN_EID_RANN"+showIEEE80211EID 127 = "WLAN_EID_EXT_CAPABILITY"+showIEEE80211EID 130 = "WLAN_EID_PREQ"+showIEEE80211EID 131 = "WLAN_EID_PREP"+showIEEE80211EID 132 = "WLAN_EID_PERR"+showIEEE80211EID 137 = "WLAN_EID_PXU"+showIEEE80211EID 138 = "WLAN_EID_PXUC"+showIEEE80211EID 139 = "WLAN_EID_AUTH_MESH_PEER_EXCH"+showIEEE80211EID 140 = "WLAN_EID_MIC"+showIEEE80211EID 141 = "WLAN_EID_DESTINATION_URI"+showIEEE80211EID 142 = "WLAN_EID_UAPSD_COEX"+showIEEE80211EID 143 = "WLAN_EID_WAKEUP_SCHEDULE"+showIEEE80211EID 144 = "WLAN_EID_EXT_SCHEDULE"+showIEEE80211EID 145 = "WLAN_EID_STA_AVAILABILITY"+showIEEE80211EID 146 = "WLAN_EID_DMG_TSPEC"+showIEEE80211EID 147 = "WLAN_EID_DMG_AT"+showIEEE80211EID 148 = "WLAN_EID_DMG_CAP"+showIEEE80211EID 150 = "WLAN_EID_CISCO_VENDOR_SPECIFIC"+showIEEE80211EID 151 = "WLAN_EID_DMG_OPERATION"+showIEEE80211EID 152 = "WLAN_EID_DMG_BSS_PARAM_CHANGE"+showIEEE80211EID 153 = "WLAN_EID_DMG_BEAM_REFINEMENT"+showIEEE80211EID 154 = "WLAN_EID_CHANNEL_MEASURE_FEEDBACK"+showIEEE80211EID 157 = "WLAN_EID_AWAKE_WINDOW"+showIEEE80211EID 158 = "WLAN_EID_MULTI_BAND"+showIEEE80211EID 159 = "WLAN_EID_ADDBA_EXT"+showIEEE80211EID 160 = "WLAN_EID_NEXT_PCP_LIST"+showIEEE80211EID 161 = "WLAN_EID_PCP_HANDOVER"+showIEEE80211EID 162 = "WLAN_EID_DMG_LINK_MARGIN"+showIEEE80211EID 163 = "WLAN_EID_SWITCHING_STREAM"+showIEEE80211EID 164 = "WLAN_EID_SESSION_TRANSITION"+showIEEE80211EID 165 = "WLAN_EID_DYN_TONE_PAIRING_REPORT"+showIEEE80211EID 166 = "WLAN_EID_CLUSTER_REPORT"+showIEEE80211EID 167 = "WLAN_EID_RELAY_CAP"+showIEEE80211EID 168 = "WLAN_EID_RELAY_XFER_PARAM_SET"+showIEEE80211EID 169 = "WLAN_EID_BEAM_LINK_MAINT"+showIEEE80211EID 170 = "WLAN_EID_MULTIPLE_MAC_ADDR"+showIEEE80211EID 171 = "WLAN_EID_U_PID"+showIEEE80211EID 172 = "WLAN_EID_DMG_LINK_ADAPT_ACK"+showIEEE80211EID 174 = "WLAN_EID_MCCAOP_ADV_OVERVIEW"+showIEEE80211EID 175 = "WLAN_EID_QUIET_PERIOD_REQ"+showIEEE80211EID 177 = "WLAN_EID_QUIET_PERIOD_RESP"+showIEEE80211EID 182 = "WLAN_EID_EPAC_POLICY"+showIEEE80211EID 183 = "WLAN_EID_CLISTER_TIME_OFF"+showIEEE80211EID 184 = "WLAN_EID_INTER_AC_PRIO"+showIEEE80211EID 185 = "WLAN_EID_SCS_DESCRIPTOR"+showIEEE80211EID 186 = "WLAN_EID_QLOAD_REPORT"+showIEEE80211EID 187 = "WLAN_EID_HCCA_TXOP_UPDATE_COUNT"+showIEEE80211EID 188 = "WLAN_EID_HL_STREAM_ID"+showIEEE80211EID 189 = "WLAN_EID_GCR_GROUP_ADDR"+showIEEE80211EID 190 = "WLAN_EID_ANTENNA_SECTOR_ID_PATTERN"+showIEEE80211EID 191 = "WLAN_EID_VHT_CAPABILITY"+showIEEE80211EID 192 = "WLAN_EID_VHT_OPERATION"+showIEEE80211EID 193 = "WLAN_EID_EXTENDED_BSS_LOAD"+showIEEE80211EID 194 = "WLAN_EID_WIDE_BW_CHANNEL_SWITCH"+showIEEE80211EID 195 = "WLAN_EID_VHT_TX_POWER_ENVELOPE"+showIEEE80211EID 196 = "WLAN_EID_CHANNEL_SWITCH_WRAPPER"+showIEEE80211EID 197 = "WLAN_EID_AID"+showIEEE80211EID 198 = "WLAN_EID_QUIET_CHANNEL"+showIEEE80211EID 199 = "WLAN_EID_OPMODE_NOTIF"+showIEEE80211EID 221 = "WLAN_EID_VENDOR_SPECIFIC"+showIEEE80211EID 222 = "WLAN_EID_QOS_PARAMETER"+showIEEE80211EID i = "IEEE80211EID #" ++ (show i)+++eWLAN_EID_SSID :: (Num a) => a+eWLAN_EID_SSID = 0+eWLAN_EID_SUPP_RATES :: (Num a) => a+eWLAN_EID_SUPP_RATES = 1+eWLAN_EID_FH_PARAMS :: (Num a) => a+eWLAN_EID_FH_PARAMS = 2+eWLAN_EID_DS_PARAMS :: (Num a) => a+eWLAN_EID_DS_PARAMS = 3+eWLAN_EID_CF_PARAMS :: (Num a) => a+eWLAN_EID_CF_PARAMS = 4+eWLAN_EID_TIM :: (Num a) => a+eWLAN_EID_TIM = 5+eWLAN_EID_IBSS_PARAMS :: (Num a) => a+eWLAN_EID_IBSS_PARAMS = 6+eWLAN_EID_COUNTRY :: (Num a) => a+eWLAN_EID_COUNTRY = 7+eWLAN_EID_REQUEST :: (Num a) => a+eWLAN_EID_REQUEST = 10+eWLAN_EID_QBSS_LOAD :: (Num a) => a+eWLAN_EID_QBSS_LOAD = 11+eWLAN_EID_EDCA_PARAM_SET :: (Num a) => a+eWLAN_EID_EDCA_PARAM_SET = 12+eWLAN_EID_TSPEC :: (Num a) => a+eWLAN_EID_TSPEC = 13+eWLAN_EID_TCLAS :: (Num a) => a+eWLAN_EID_TCLAS = 14+eWLAN_EID_SCHEDULE :: (Num a) => a+eWLAN_EID_SCHEDULE = 15+eWLAN_EID_CHALLENGE :: (Num a) => a+eWLAN_EID_CHALLENGE = 16+eWLAN_EID_PWR_CONSTRAINT :: (Num a) => a+eWLAN_EID_PWR_CONSTRAINT = 32+eWLAN_EID_PWR_CAPABILITY :: (Num a) => a+eWLAN_EID_PWR_CAPABILITY = 33+eWLAN_EID_TPC_REQUEST :: (Num a) => a+eWLAN_EID_TPC_REQUEST = 34+eWLAN_EID_TPC_REPORT :: (Num a) => a+eWLAN_EID_TPC_REPORT = 35+eWLAN_EID_SUPPORTED_CHANNELS :: (Num a) => a+eWLAN_EID_SUPPORTED_CHANNELS = 36+eWLAN_EID_CHANNEL_SWITCH :: (Num a) => a+eWLAN_EID_CHANNEL_SWITCH = 37+eWLAN_EID_MEASURE_REQUEST :: (Num a) => a+eWLAN_EID_MEASURE_REQUEST = 38+eWLAN_EID_MEASURE_REPORT :: (Num a) => a+eWLAN_EID_MEASURE_REPORT = 39+eWLAN_EID_QUIET :: (Num a) => a+eWLAN_EID_QUIET = 40+eWLAN_EID_IBSS_DFS :: (Num a) => a+eWLAN_EID_IBSS_DFS = 41+eWLAN_EID_ERP_INFO :: (Num a) => a+eWLAN_EID_ERP_INFO = 42+eWLAN_EID_TS_DELAY :: (Num a) => a+eWLAN_EID_TS_DELAY = 43+eWLAN_EID_TCLAS_PROCESSING :: (Num a) => a+eWLAN_EID_TCLAS_PROCESSING = 44+eWLAN_EID_HT_CAPABILITY :: (Num a) => a+eWLAN_EID_HT_CAPABILITY = 45+eWLAN_EID_QOS_CAPA :: (Num a) => a+eWLAN_EID_QOS_CAPA = 46+eWLAN_EID_RSN :: (Num a) => a+eWLAN_EID_RSN = 48+eWLAN_EID_802_15_COEX :: (Num a) => a+eWLAN_EID_802_15_COEX = 49+eWLAN_EID_EXT_SUPP_RATES :: (Num a) => a+eWLAN_EID_EXT_SUPP_RATES = 50+eWLAN_EID_AP_CHAN_REPORT :: (Num a) => a+eWLAN_EID_AP_CHAN_REPORT = 51+eWLAN_EID_NEIGHBOR_REPORT :: (Num a) => a+eWLAN_EID_NEIGHBOR_REPORT = 52+eWLAN_EID_RCPI :: (Num a) => a+eWLAN_EID_RCPI = 53+eWLAN_EID_MOBILITY_DOMAIN :: (Num a) => a+eWLAN_EID_MOBILITY_DOMAIN = 54+eWLAN_EID_FAST_BSS_TRANSITION :: (Num a) => a+eWLAN_EID_FAST_BSS_TRANSITION = 55+eWLAN_EID_TIMEOUT_INTERVAL :: (Num a) => a+eWLAN_EID_TIMEOUT_INTERVAL = 56+eWLAN_EID_RIC_DATA :: (Num a) => a+eWLAN_EID_RIC_DATA = 57+eWLAN_EID_DSE_REGISTERED_LOCATION :: (Num a) => a+eWLAN_EID_DSE_REGISTERED_LOCATION = 58+eWLAN_EID_SUPPORTED_REGULATORY_CLASSES :: (Num a) => a+eWLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59+eWLAN_EID_EXT_CHANSWITCH_ANN :: (Num a) => a+eWLAN_EID_EXT_CHANSWITCH_ANN = 60+eWLAN_EID_HT_OPERATION :: (Num a) => a+eWLAN_EID_HT_OPERATION = 61+eWLAN_EID_SECONDARY_CHANNEL_OFFSET :: (Num a) => a+eWLAN_EID_SECONDARY_CHANNEL_OFFSET = 62+eWLAN_EID_BSS_AVG_ACCESS_DELAY :: (Num a) => a+eWLAN_EID_BSS_AVG_ACCESS_DELAY = 63+eWLAN_EID_ANTENNA_INFO :: (Num a) => a+eWLAN_EID_ANTENNA_INFO = 64+eWLAN_EID_RSNI :: (Num a) => a+eWLAN_EID_RSNI = 65+eWLAN_EID_MEASUREMENT_PILOT_TX_INFO :: (Num a) => a+eWLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66+eWLAN_EID_BSS_AVAILABLE_CAPACITY :: (Num a) => a+eWLAN_EID_BSS_AVAILABLE_CAPACITY = 67+eWLAN_EID_BSS_AC_ACCESS_DELAY :: (Num a) => a+eWLAN_EID_BSS_AC_ACCESS_DELAY = 68+eWLAN_EID_TIME_ADVERTISEMENT :: (Num a) => a+eWLAN_EID_TIME_ADVERTISEMENT = 69+eWLAN_EID_RRM_ENABLED_CAPABILITIES :: (Num a) => a+eWLAN_EID_RRM_ENABLED_CAPABILITIES = 70+eWLAN_EID_MULTIPLE_BSSID :: (Num a) => a+eWLAN_EID_MULTIPLE_BSSID = 71+eWLAN_EID_BSS_COEX_2040 :: (Num a) => a+eWLAN_EID_BSS_COEX_2040 = 72+eWLAN_EID_BSS_INTOLERANT_CHL_REPORT :: (Num a) => a+eWLAN_EID_BSS_INTOLERANT_CHL_REPORT = 73+eWLAN_EID_OVERLAP_BSS_SCAN_PARAM :: (Num a) => a+eWLAN_EID_OVERLAP_BSS_SCAN_PARAM = 74+eWLAN_EID_RIC_DESCRIPTOR :: (Num a) => a+eWLAN_EID_RIC_DESCRIPTOR = 75+eWLAN_EID_MMIE :: (Num a) => a+eWLAN_EID_MMIE = 76+eWLAN_EID_ASSOC_COMEBACK_TIME :: (Num a) => a+eWLAN_EID_ASSOC_COMEBACK_TIME = 77+eWLAN_EID_EVENT_REQUEST :: (Num a) => a+eWLAN_EID_EVENT_REQUEST = 78+eWLAN_EID_EVENT_REPORT :: (Num a) => a+eWLAN_EID_EVENT_REPORT = 79+eWLAN_EID_DIAGNOSTIC_REQUEST :: (Num a) => a+eWLAN_EID_DIAGNOSTIC_REQUEST = 80+eWLAN_EID_DIAGNOSTIC_REPORT :: (Num a) => a+eWLAN_EID_DIAGNOSTIC_REPORT = 81+eWLAN_EID_LOCATION_PARAMS :: (Num a) => a+eWLAN_EID_LOCATION_PARAMS = 82+eWLAN_EID_NON_TX_BSSID_CAP :: (Num a) => a+eWLAN_EID_NON_TX_BSSID_CAP = 83+eWLAN_EID_SSID_LIST :: (Num a) => a+eWLAN_EID_SSID_LIST = 84+eWLAN_EID_MULTI_BSSID_IDX :: (Num a) => a+eWLAN_EID_MULTI_BSSID_IDX = 85+eWLAN_EID_FMS_DESCRIPTOR :: (Num a) => a+eWLAN_EID_FMS_DESCRIPTOR = 86+eWLAN_EID_FMS_REQUEST :: (Num a) => a+eWLAN_EID_FMS_REQUEST = 87+eWLAN_EID_FMS_RESPONSE :: (Num a) => a+eWLAN_EID_FMS_RESPONSE = 88+eWLAN_EID_QOS_TRAFFIC_CAPA :: (Num a) => a+eWLAN_EID_QOS_TRAFFIC_CAPA = 89+eWLAN_EID_BSS_MAX_IDLE_PERIOD :: (Num a) => a+eWLAN_EID_BSS_MAX_IDLE_PERIOD = 90+eWLAN_EID_TSF_REQUEST :: (Num a) => a+eWLAN_EID_TSF_REQUEST = 91+eWLAN_EID_TSF_RESPOSNE :: (Num a) => a+eWLAN_EID_TSF_RESPOSNE = 92+eWLAN_EID_WNM_SLEEP_MODE :: (Num a) => a+eWLAN_EID_WNM_SLEEP_MODE = 93+eWLAN_EID_TIM_BCAST_REQ :: (Num a) => a+eWLAN_EID_TIM_BCAST_REQ = 94+eWLAN_EID_TIM_BCAST_RESP :: (Num a) => a+eWLAN_EID_TIM_BCAST_RESP = 95+eWLAN_EID_COLL_IF_REPORT :: (Num a) => a+eWLAN_EID_COLL_IF_REPORT = 96+eWLAN_EID_CHANNEL_USAGE :: (Num a) => a+eWLAN_EID_CHANNEL_USAGE = 97+eWLAN_EID_TIME_ZONE :: (Num a) => a+eWLAN_EID_TIME_ZONE = 98+eWLAN_EID_DMS_REQUEST :: (Num a) => a+eWLAN_EID_DMS_REQUEST = 99+eWLAN_EID_DMS_RESPONSE :: (Num a) => a+eWLAN_EID_DMS_RESPONSE = 100+eWLAN_EID_LINK_ID :: (Num a) => a+eWLAN_EID_LINK_ID = 101+eWLAN_EID_WAKEUP_SCHEDUL :: (Num a) => a+eWLAN_EID_WAKEUP_SCHEDUL = 102+eWLAN_EID_CHAN_SWITCH_TIMING :: (Num a) => a+eWLAN_EID_CHAN_SWITCH_TIMING = 104+eWLAN_EID_PTI_CONTROL :: (Num a) => a+eWLAN_EID_PTI_CONTROL = 105+eWLAN_EID_PU_BUFFER_STATUS :: (Num a) => a+eWLAN_EID_PU_BUFFER_STATUS = 106+eWLAN_EID_INTERWORKING :: (Num a) => a+eWLAN_EID_INTERWORKING = 107+eWLAN_EID_ADVERTISEMENT_PROTOCOL :: (Num a) => a+eWLAN_EID_ADVERTISEMENT_PROTOCOL = 108+eWLAN_EID_EXPEDITED_BW_REQ :: (Num a) => a+eWLAN_EID_EXPEDITED_BW_REQ = 109+eWLAN_EID_QOS_MAP_SET :: (Num a) => a+eWLAN_EID_QOS_MAP_SET = 110+eWLAN_EID_ROAMING_CONSORTIUM :: (Num a) => a+eWLAN_EID_ROAMING_CONSORTIUM = 111+eWLAN_EID_EMERGENCY_ALERT :: (Num a) => a+eWLAN_EID_EMERGENCY_ALERT = 112+eWLAN_EID_MESH_CONFIG :: (Num a) => a+eWLAN_EID_MESH_CONFIG = 113+eWLAN_EID_MESH_ID :: (Num a) => a+eWLAN_EID_MESH_ID = 114+eWLAN_EID_LINK_METRIC_REPORT :: (Num a) => a+eWLAN_EID_LINK_METRIC_REPORT = 115+eWLAN_EID_CONGESTION_NOTIFICATION :: (Num a) => a+eWLAN_EID_CONGESTION_NOTIFICATION = 116+eWLAN_EID_PEER_MGMT :: (Num a) => a+eWLAN_EID_PEER_MGMT = 117+eWLAN_EID_CHAN_SWITCH_PARAM :: (Num a) => a+eWLAN_EID_CHAN_SWITCH_PARAM = 118+eWLAN_EID_MESH_AWAKE_WINDOW :: (Num a) => a+eWLAN_EID_MESH_AWAKE_WINDOW = 119+eWLAN_EID_BEACON_TIMING :: (Num a) => a+eWLAN_EID_BEACON_TIMING = 120+eWLAN_EID_MCCAOP_SETUP_REQ :: (Num a) => a+eWLAN_EID_MCCAOP_SETUP_REQ = 121+eWLAN_EID_MCCAOP_SETUP_RESP :: (Num a) => a+eWLAN_EID_MCCAOP_SETUP_RESP = 122+eWLAN_EID_MCCAOP_ADVERT :: (Num a) => a+eWLAN_EID_MCCAOP_ADVERT = 123+eWLAN_EID_MCCAOP_TEARDOWN :: (Num a) => a+eWLAN_EID_MCCAOP_TEARDOWN = 124+eWLAN_EID_GANN :: (Num a) => a+eWLAN_EID_GANN = 125+eWLAN_EID_RANN :: (Num a) => a+eWLAN_EID_RANN = 126+eWLAN_EID_EXT_CAPABILITY :: (Num a) => a+eWLAN_EID_EXT_CAPABILITY = 127+eWLAN_EID_PREQ :: (Num a) => a+eWLAN_EID_PREQ = 130+eWLAN_EID_PREP :: (Num a) => a+eWLAN_EID_PREP = 131+eWLAN_EID_PERR :: (Num a) => a+eWLAN_EID_PERR = 132+eWLAN_EID_PXU :: (Num a) => a+eWLAN_EID_PXU = 137+eWLAN_EID_PXUC :: (Num a) => a+eWLAN_EID_PXUC = 138+eWLAN_EID_AUTH_MESH_PEER_EXCH :: (Num a) => a+eWLAN_EID_AUTH_MESH_PEER_EXCH = 139+eWLAN_EID_MIC :: (Num a) => a+eWLAN_EID_MIC = 140+eWLAN_EID_DESTINATION_URI :: (Num a) => a+eWLAN_EID_DESTINATION_URI = 141+eWLAN_EID_UAPSD_COEX :: (Num a) => a+eWLAN_EID_UAPSD_COEX = 142+eWLAN_EID_WAKEUP_SCHEDULE :: (Num a) => a+eWLAN_EID_WAKEUP_SCHEDULE = 143+eWLAN_EID_EXT_SCHEDULE :: (Num a) => a+eWLAN_EID_EXT_SCHEDULE = 144+eWLAN_EID_STA_AVAILABILITY :: (Num a) => a+eWLAN_EID_STA_AVAILABILITY = 145+eWLAN_EID_DMG_TSPEC :: (Num a) => a+eWLAN_EID_DMG_TSPEC = 146+eWLAN_EID_DMG_AT :: (Num a) => a+eWLAN_EID_DMG_AT = 147+eWLAN_EID_DMG_CAP :: (Num a) => a+eWLAN_EID_DMG_CAP = 148+eWLAN_EID_CISCO_VENDOR_SPECIFIC :: (Num a) => a+eWLAN_EID_CISCO_VENDOR_SPECIFIC = 150+eWLAN_EID_DMG_OPERATION :: (Num a) => a+eWLAN_EID_DMG_OPERATION = 151+eWLAN_EID_DMG_BSS_PARAM_CHANGE :: (Num a) => a+eWLAN_EID_DMG_BSS_PARAM_CHANGE = 152+eWLAN_EID_DMG_BEAM_REFINEMENT :: (Num a) => a+eWLAN_EID_DMG_BEAM_REFINEMENT = 153+eWLAN_EID_CHANNEL_MEASURE_FEEDBACK :: (Num a) => a+eWLAN_EID_CHANNEL_MEASURE_FEEDBACK = 154+eWLAN_EID_AWAKE_WINDOW :: (Num a) => a+eWLAN_EID_AWAKE_WINDOW = 157+eWLAN_EID_MULTI_BAND :: (Num a) => a+eWLAN_EID_MULTI_BAND = 158+eWLAN_EID_ADDBA_EXT :: (Num a) => a+eWLAN_EID_ADDBA_EXT = 159+eWLAN_EID_NEXT_PCP_LIST :: (Num a) => a+eWLAN_EID_NEXT_PCP_LIST = 160+eWLAN_EID_PCP_HANDOVER :: (Num a) => a+eWLAN_EID_PCP_HANDOVER = 161+eWLAN_EID_DMG_LINK_MARGIN :: (Num a) => a+eWLAN_EID_DMG_LINK_MARGIN = 162+eWLAN_EID_SWITCHING_STREAM :: (Num a) => a+eWLAN_EID_SWITCHING_STREAM = 163+eWLAN_EID_SESSION_TRANSITION :: (Num a) => a+eWLAN_EID_SESSION_TRANSITION = 164+eWLAN_EID_DYN_TONE_PAIRING_REPORT :: (Num a) => a+eWLAN_EID_DYN_TONE_PAIRING_REPORT = 165+eWLAN_EID_CLUSTER_REPORT :: (Num a) => a+eWLAN_EID_CLUSTER_REPORT = 166+eWLAN_EID_RELAY_CAP :: (Num a) => a+eWLAN_EID_RELAY_CAP = 167+eWLAN_EID_RELAY_XFER_PARAM_SET :: (Num a) => a+eWLAN_EID_RELAY_XFER_PARAM_SET = 168+eWLAN_EID_BEAM_LINK_MAINT :: (Num a) => a+eWLAN_EID_BEAM_LINK_MAINT = 169+eWLAN_EID_MULTIPLE_MAC_ADDR :: (Num a) => a+eWLAN_EID_MULTIPLE_MAC_ADDR = 170+eWLAN_EID_U_PID :: (Num a) => a+eWLAN_EID_U_PID = 171+eWLAN_EID_DMG_LINK_ADAPT_ACK :: (Num a) => a+eWLAN_EID_DMG_LINK_ADAPT_ACK = 172+eWLAN_EID_MCCAOP_ADV_OVERVIEW :: (Num a) => a+eWLAN_EID_MCCAOP_ADV_OVERVIEW = 174+eWLAN_EID_QUIET_PERIOD_REQ :: (Num a) => a+eWLAN_EID_QUIET_PERIOD_REQ = 175+eWLAN_EID_QUIET_PERIOD_RESP :: (Num a) => a+eWLAN_EID_QUIET_PERIOD_RESP = 177+eWLAN_EID_EPAC_POLICY :: (Num a) => a+eWLAN_EID_EPAC_POLICY = 182+eWLAN_EID_CLISTER_TIME_OFF :: (Num a) => a+eWLAN_EID_CLISTER_TIME_OFF = 183+eWLAN_EID_INTER_AC_PRIO :: (Num a) => a+eWLAN_EID_INTER_AC_PRIO = 184+eWLAN_EID_SCS_DESCRIPTOR :: (Num a) => a+eWLAN_EID_SCS_DESCRIPTOR = 185+eWLAN_EID_QLOAD_REPORT :: (Num a) => a+eWLAN_EID_QLOAD_REPORT = 186+eWLAN_EID_HCCA_TXOP_UPDATE_COUNT :: (Num a) => a+eWLAN_EID_HCCA_TXOP_UPDATE_COUNT = 187+eWLAN_EID_HL_STREAM_ID :: (Num a) => a+eWLAN_EID_HL_STREAM_ID = 188+eWLAN_EID_GCR_GROUP_ADDR :: (Num a) => a+eWLAN_EID_GCR_GROUP_ADDR = 189+eWLAN_EID_ANTENNA_SECTOR_ID_PATTERN :: (Num a) => a+eWLAN_EID_ANTENNA_SECTOR_ID_PATTERN = 190+eWLAN_EID_VHT_CAPABILITY :: (Num a) => a+eWLAN_EID_VHT_CAPABILITY = 191+eWLAN_EID_VHT_OPERATION :: (Num a) => a+eWLAN_EID_VHT_OPERATION = 192+eWLAN_EID_EXTENDED_BSS_LOAD :: (Num a) => a+eWLAN_EID_EXTENDED_BSS_LOAD = 193+eWLAN_EID_WIDE_BW_CHANNEL_SWITCH :: (Num a) => a+eWLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194+eWLAN_EID_VHT_TX_POWER_ENVELOPE :: (Num a) => a+eWLAN_EID_VHT_TX_POWER_ENVELOPE = 195+eWLAN_EID_CHANNEL_SWITCH_WRAPPER :: (Num a) => a+eWLAN_EID_CHANNEL_SWITCH_WRAPPER = 196+eWLAN_EID_AID :: (Num a) => a+eWLAN_EID_AID = 197+eWLAN_EID_QUIET_CHANNEL :: (Num a) => a+eWLAN_EID_QUIET_CHANNEL = 198+eWLAN_EID_OPMODE_NOTIF :: (Num a) => a+eWLAN_EID_OPMODE_NOTIF = 199+eWLAN_EID_VENDOR_SPECIFIC :: (Num a) => a+eWLAN_EID_VENDOR_SPECIFIC = 221+eWLAN_EID_QOS_PARAMETER :: (Num a) => a+eWLAN_EID_QOS_PARAMETER = 222
+ System/Linux/Netlink/Helpers.hs view
@@ -0,0 +1,48 @@+{-|+Module : System.Linux.Netlink.Helpers+Description : Internal short names for Get and Put functions+Maintainer : ongy+Stability : testing+Portability : Linux++-}+module System.Linux.Netlink.Helpers+where++import Data.Serialize.Get+import Data.Serialize.Put++import Data.Word++-- |Indent a String by 2 " "s for output+indent :: String -> String+indent = unlines . map (" " ++) . lines++--+-- Helpers+--+-- | 'Put' 'Word8'+p8 :: Word8 -> Put+p8 = putWord8+-- | 'Put' 'Word16'+p16 :: Word16 -> Put+p16 = putWord16host+-- | 'Put' 'Word32'+p32 :: Word32 -> Put+p32 = putWord32host+-- | 'Put' 'Word64'+p64 :: Word64 -> Put+p64 = putWord64host++-- | 'Get' 'Word8'+g8 :: Get Word8+g8 = getWord8+-- | 'Get' 'Word16'+g16:: Get Word16+g16 = getWord16host+-- | 'Get' 'Word32'+g32 :: Get Word32+g32 = getWord32host+-- | 'Get' 'Word64'+g64 :: Get Word64+g64 = getWord64host
− System/Linux/Netlink/Internal.hs
@@ -1,55 +0,0 @@-module System.Linux.Netlink.Internal- (- query- , queryOne- - , module System.Linux.Netlink.Attributes- , module System.Linux.Netlink.C- , module System.Linux.Netlink.Constants- , module System.Linux.Netlink.Protocol- ) where--import Control.Applicative ((<$>))-import Control.Monad (when)-import Data.Bits (Bits, (.&.))--import System.Linux.Netlink.Attributes-import System.Linux.Netlink.C-import System.Linux.Netlink.Constants-import System.Linux.Netlink.Protocol--query :: NetlinkSocket -> Packet -> IO [Packet]-query sock req = do- sendmsg sock (putPacket req)- recvMulti sock--queryOne :: NetlinkSocket -> Packet -> IO Packet-queryOne sock req = do- sendmsg sock (putPacket req)- pkts <- recvMulti sock- let len = length pkts- when (len /= 1) $ fail ("Expected one packet, received " ++ show len)- return $ head pkts--recvMulti :: NetlinkSocket -> IO [Packet]-recvMulti sock = do- pkts <- recvOne sock- if isMulti (head pkts)- then if isDone (last pkts)- then return $ init pkts- else (pkts ++) <$> recvMulti sock- else return pkts- where- isMulti = isFlagSet fNLM_F_MULTI . messageFlags . packetHeader- isDone = (== eNLMSG_DONE) . messageType . packetHeader--recvOne :: NetlinkSocket -> IO [Packet]-recvOne sock = recvmsg sock bufferSize >>= \b -> case (getPacket b) of- Left err -> fail err- Right pkts -> return pkts--isFlagSet :: Bits a => a -> a -> Bool-isFlagSet f v = (f .&. v) == f--bufferSize :: Num a => a-bufferSize = 8192
− System/Linux/Netlink/Protocol.hs
@@ -1,191 +0,0 @@-module System.Linux.Netlink.Protocol - (- Header(..)- , Message(..)- , Attributes- , Packet(..)- - , getPacket- , putPacket- ) where--import Prelude hiding (length)--import Control.Applicative ((<$>))-import Control.Monad (when)-import Control.Monad.Loops (whileM)-import Data.ByteString (ByteString, length)-import Data.Map (Map, fromList, toList)-import Data.Serialize.Get-import Data.Serialize.Put-import Data.Word (Word8, Word16, Word32)-import Foreign.C.Types (CInt)--import System.Linux.Netlink.Constants--data Header = Header- {- messageType :: MessageType- , messageFlags :: Word16- , messageSeqNum :: Word32- , messagePID :: Word32- } deriving (Eq, Show)--data Message = DoneMsg- | ErrorMsg- {- errorCode :: CInt- , errorPacket :: Packet- }- | LinkMsg- {- interfaceType :: LinkType- , interfaceIndex :: Word32- , interfaceFlags :: Word32- }- | AddrMsg- {- addrFamily :: AddressFamily- , addrMaskLength :: Word8- , addrFlags :: Word8- , addrScope :: Word8- , addrInterfaceIndex :: Word32- } deriving (Eq, Show)--type Attributes = Map Int ByteString--data Packet = Packet- {- packetHeader :: Header - , packetMessage :: Message- , packetAttributes :: Attributes- } deriving (Eq, Show)------- Packet decoding----getPacket :: ByteString -> Either String [Packet]-getPacket bytes = flip runGet bytes $ do- pkts <- whileM (not <$> isEmpty) getPacketInternal- isEmpty >>= \e -> when (not e) $ fail "Incomplete message parse"- return pkts--getPacketInternal :: Get Packet-getPacketInternal = do- len <- fromIntegral <$> g32- isolate (len - 4) $ do- header <- getHeader- msg <- getMessage (messageType header)- attrs <- whileM (not <$> isEmpty) getSingleAttribute- return $ Packet header msg (fromList attrs)--getHeader :: Get Header-getHeader = do- ty <- fromIntegral <$> g16- flags <- fromIntegral <$> g16- seqnum <- g32- pid <- g32- return $ Header ty flags seqnum pid--getMessage :: MessageType -> Get Message-getMessage msgtype | msgtype == eNLMSG_DONE = skip 4 >> return DoneMsg- | msgtype == eNLMSG_ERROR = getMessageError- | msgtype == eRTM_NEWLINK = getMessageLink- | msgtype == eRTM_GETLINK = getMessageLink- | msgtype == eRTM_DELLINK = getMessageLink- | msgtype == eRTM_NEWADDR = getMessageAddr- | msgtype == eRTM_GETADDR = getMessageAddr- | msgtype == eRTM_DELADDR = getMessageAddr- | otherwise =- error $ "Can't decode message " ++ show msgtype--getMessageError :: Get Message-getMessageError = do- code <- abs . fromIntegral <$> g32- pkt <- getPacketInternal- return $ ErrorMsg code pkt--getMessageLink :: Get Message-getMessageLink = do- skip 2- ty <- fromIntegral <$> g16- idx <- g32- flags <- g32- skip 4- return $ LinkMsg ty idx flags--getMessageAddr :: Get Message-getMessageAddr = do- fam <- fromIntegral <$> g8- maskLen <- g8- flags <- g8- scope <- fromIntegral <$> g8- idx <- g32- return $ AddrMsg fam maskLen flags scope idx--getSingleAttribute :: Get (Int, ByteString)-getSingleAttribute = do- len <- fromIntegral <$> g16- ty <- fromIntegral <$> g16- val <- getByteString (len - 4)- isEmpty >>= \e -> when (not e && len `mod` 4 /= 0) $ skip (4 - (len `mod` 4))- return (ty, val)------- Packet serialization----putPacket :: Packet -> [ByteString]-putPacket (Packet header message attributes) =- let attrs = runPut $ putAttributes attributes- msg = runPut $ putMessage message- hdr = runPut $ putHeader (length msg + length attrs + 16) header- in [hdr, msg, attrs]--putHeader :: Int -> Header -> Put-putHeader len (Header ty flags seqnum pid) = do- p32 (fromIntegral len)- p16 (fromIntegral ty)- p16 (fromIntegral flags)- p32 seqnum- p32 pid--putMessage :: Message -> Put-putMessage DoneMsg = p32 0-putMessage (LinkMsg ty idx flags) = do- p8 eAF_UNSPEC >> p8 0- p16 (fromIntegral ty)- p32 idx- p32 flags- p32 0xFFFFFFFF-putMessage (AddrMsg fam maskLen flags scope idx) = do- p8 (fromIntegral fam)- p8 maskLen- p8 flags- p8 (fromIntegral scope)- p32 idx-putMessage _ = error "Can't transmit this message to the kernel."--putAttributes :: Attributes -> Put-putAttributes = mapM_ putAttr . toList- where- putAttr (ty, value) = do- p16 (fromIntegral ty)- p16 (fromIntegral . length $ value)- putByteString value------- Helpers----p8 :: Word8 -> Put-p8 = putWord8-p16 :: Word16 -> Put-p16 = putWord16host-p32 :: Word32 -> Put-p32 = putWord32host--g8 :: Get Word8-g8 = getWord8-g16:: Get Word16-g16 = getWord16host-g32 :: Get Word32-g32 = getWord32host
+ System/Linux/Netlink/Route.hs view
@@ -0,0 +1,282 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleInstances #-}++{-|+Module : System.Linux.Netlink.Route+Description : The implementation for netlinks route family+Maintainer : ongy+Stability : testing+Portability : Linux++This module provides wrappers for functionality provided by the netlink route family+-}+module System.Linux.Netlink.Route+ (+ Packet+ , RoutePacket++ , getRoutePackets+ , Message(..)+ + , getLinkAddress+ , getLinkBroadcast+ , getLinkName+ , getLinkMTU+ , getLinkQDisc+ , getLinkTXQLen++ , putLinkAddress+ , putLinkBroadcast+ , putLinkName+ , putLinkMTU+ , putLinkQDisc+ , putLinkTXQLen+ ) where++import Prelude hiding (length, lookup, init)++#if MIN_VERSION_base(4,8,0)+#else+import Control.Applicative ((<$>))+#endif++import qualified Data.ByteString as BS (length)+import Data.ByteString.Char8 (ByteString, append, init, pack, unpack)+import Data.Char (chr, ord)+import Data.List (intersperse)+import Data.Map (insert, lookup, toList)+import Data.Serialize.Get+import Data.Serialize.Put+import Data.Word (Word8, Word32)++import System.Linux.Netlink.Constants+import System.Linux.Netlink+import System.Linux.Netlink.Helpers+import System.Linux.Netlink.Route.LinkStat++-- |The static data for route messages+data Message = NLinkMsg+ {+ interfaceType :: LinkType+ , interfaceIndex :: Word32+ , interfaceFlags :: Word32+ }+ | NAddrMsg+ {+ addrFamily :: AddressFamily+ , addrMaskLength :: Word8+ , addrFlags :: Word8+ , addrScope :: Word8+ , addrInterfaceIndex :: Word32+ } deriving (Eq)++instance Show Message where+ show (NLinkMsg t i f) =+ "LinkMessage. Type: " ++ showLinkType t ++ ", Index: " ++ show i ++ ", Flags: " ++ show f+ show (NAddrMsg f l fl s i) =+ "AddrMessage. Family: " ++ show f ++ ", MLength: " ++ show l ++ ", Flags: " ++ + show fl ++ ", Scope: " ++ show s ++ ", Index: " ++ show i++instance Convertable Message where+ getGet = getMessage+ getPut = putMessage++-- |Typedef for route messages+type RoutePacket = Packet Message++showRouteHeader :: Header -> String+showRouteHeader (Header t f s p) =+ "Type: " ++ showMessageType t ++ ", Flags: " ++ (show f) ++ ", Seq: " ++ show s ++ ", Pid: " ++ show p+++instance Show RoutePacket where+ showList xs = ((concat . intersperse "===\n" . map show $xs) ++)+ show (Packet hdr cus attrs) =+ "RoutePacket: " ++ showRouteHeader hdr ++ "\n" +++ show cus ++ "\n" +++ --TODO: is this the case every time? maybe match on other to get which enum to use+ "Attrs: \n" ++ concatMap showLinkAttr (toList attrs) ++ "\n"+ show p = showPacket p+++showLinkAttr :: (Int, ByteString) -> String+showLinkAttr (i, v)+ | i == eIFLA_STATS64 = "IFLA_STATS64:\n" ++ showStats64 v+ | i == eIFLA_STATS = "IFLA_STATS:\n" ++ showStats32 v+ | i == eIFLA_AF_SPEC = + "eIFLA_AF_SPEC: " ++ show (BS.length v) ++ '\n':indent (showAfSpec v)+ | otherwise = showAttr showLinkAttrType (i, v)++showStats64 :: ByteString -> String+showStats64 bs = case runGet getLinkStat64 bs of+ (Left x) -> error ("Could not marshall LinkStat64: " ++ x)+ (Right x) -> show x ++ "\n"++showStats32 :: ByteString -> String+showStats32 bs = case runGet getLinkStat32 bs of+ (Left x) -> error ("Could not marshall LinkStat32: " ++ x)+ (Right x) -> show x ++ "\n"+++showAfSpec :: ByteString -> String+showAfSpec bs = case runGet getAttributes bs of+ (Left x) -> error ("Could not marshall AfSpec: " ++ x)+ (Right attrs) -> + concatMap (\(i, v) -> showAddressFamily i ++ '\n': indent (showAfSpec' v)) (toList attrs)++showAfSpec' :: ByteString -> String+showAfSpec' bs = case runGet getAttributes bs of+ (Left x) -> error ("Could not marshall AfSpec': " ++ x)+ (Right attrs) -> showNLAttrs attrs+++--+-- New generic stuffs+--++getMessage :: MessageType -> Get Message+getMessage msgtype | msgtype == eRTM_NEWLINK = getMessageLink+ | msgtype == eRTM_GETLINK = getMessageLink+ | msgtype == eRTM_DELLINK = getMessageLink+ | msgtype == eRTM_NEWADDR = getMessageAddr+ | msgtype == eRTM_GETADDR = getMessageAddr+ | msgtype == eRTM_DELADDR = getMessageAddr+ | otherwise =+ error $ "Can't decode message " ++ show msgtype++getMessageLink :: Get Message+getMessageLink = do+ skip 2+ ty <- fromIntegral <$> g16+ idx <- g32+ flags <- g32+ skip 4+ return $ NLinkMsg ty idx flags++getMessageAddr :: Get Message+getMessageAddr = do+ fam <- fromIntegral <$> g8+ maskLen <- g8+ flags <- g8+ scope <- fromIntegral <$> g8+ idx <- g32+ return $ NAddrMsg fam maskLen flags scope idx++putMessage :: Message -> Put+putMessage (NLinkMsg ty idx flags) = do+ p8 eAF_UNSPEC >> p8 0+ p16 (fromIntegral ty)+ p32 idx+ p32 flags+ p32 0xFFFFFFFF+putMessage (NAddrMsg fam maskLen flags scope idx) = do+ p8 (fromIntegral fam)+ p8 maskLen+ p8 flags+ p8 (fromIntegral scope)+ p32 idx++-- |'Get' a route message or an error+getRoutePackets :: ByteString -> Either String [RoutePacket]+getRoutePackets = getPackets++-- |typedef for utility functions+type AttributeReader a = Attributes -> Maybe a++-- |typedef for utility functions+type AttributeWriter a = a -> Attributes -> Attributes++--+-- Link message attributes+--+type LinkAddress = (Word8, Word8, Word8, Word8, Word8, Word8)++-- |get L2 address from netlink attributes+getLinkAddress :: AttributeReader LinkAddress+getLinkAddress attrs = decodeMAC <$> lookup eIFLA_ADDRESS attrs++-- |set L2 address on netlink attributes+putLinkAddress :: AttributeWriter LinkAddress+putLinkAddress addr = insert eIFLA_ADDRESS (encodeMAC addr)++-- |get L2 broadcast address from netlink attributes+getLinkBroadcast :: AttributeReader LinkAddress+getLinkBroadcast attrs = decodeMAC <$> lookup eIFLA_BROADCAST attrs++-- |set L2 broadcast address on netlink attributes+putLinkBroadcast :: AttributeWriter LinkAddress+putLinkBroadcast addr = insert eIFLA_BROADCAST (encodeMAC addr)++-- |get interface name from netlink attributes+getLinkName :: AttributeReader String+getLinkName attrs = getString <$> lookup eIFLA_IFNAME attrs++-- |set interface name on netlink attributes+putLinkName :: AttributeWriter String+putLinkName ifname = insert eIFLA_IFNAME (putString ifname)++-- |get mtu from netlink attributes+getLinkMTU :: AttributeReader Word32+getLinkMTU attrs = get32 =<< lookup eIFLA_MTU attrs++-- |set mtu on netlink attributes+putLinkMTU :: AttributeWriter Word32+putLinkMTU mtu = insert eIFLA_MTU (put32 mtu)++-- TODO: IFLA_LINK - need to understand what it does++-- |I actually have no idea what QDisc is+getLinkQDisc :: AttributeReader String+getLinkQDisc attrs = getString <$> lookup eIFLA_QDISC attrs++-- |I actually have no idea what QDisc is+putLinkQDisc :: AttributeWriter String+putLinkQDisc disc = insert eIFLA_QDISC (putString disc)++-- TODO: IFLA_STATS - bloody huge message, will deal with it later.++-- TODO: IFLA_{COST,PRIORITY,MASTER,WIRELESS,PROTINFO} - need to+-- understand what they do.++-- |I should look this up+getLinkTXQLen :: AttributeReader Word32+getLinkTXQLen attrs = get32 =<< lookup eIFLA_TXQLEN attrs++-- |I should look this up+putLinkTXQLen :: AttributeWriter Word32+putLinkTXQLen len = insert eIFLA_TXQLEN (put32 len)++-- TODO: IFLA_{MAP,WEIGHT} - need to figure out++-- TODO: IFLA_{LINKMODE,LINKINFO} - see Documentation/networking/operstates.txt++-- TODO: IFLA_{NET_NS_PID,IFALIAS} - need to figure out++--+-- Helpers+--++decodeMAC :: ByteString -> LinkAddress+decodeMAC = tuplify . map (fromIntegral . ord) . unpack+ where tuplify [a,b,c,d,e,f] = (a,b,c,d,e,f)+ tuplify _ = error "Bad encoded MAC"++encodeMAC :: LinkAddress -> ByteString+encodeMAC = pack . map (chr . fromIntegral) . listify+ where listify (a,b,c,d,e,f) = [a,b,c,d,e,f]++getString :: ByteString -> String+getString b = unpack (init b)++putString :: String -> ByteString+putString s = append (pack s) "\0"++get32 :: ByteString -> Maybe Word32+get32 bs = case runGet getWord32host bs of+ Left _ -> Nothing+ Right w -> Just w++put32 :: Word32 -> ByteString+put32 w = runPut (putWord32host w)
+ System/Linux/Netlink/Route/LinkStat.hs view
@@ -0,0 +1,142 @@+{-# LANGUAGE CPP #-}+{-|+Module : System.Linux.Netlink.Route.LinkStat+Description : The implementation for netlinks route linkstat portion+Maintainer : ongy+Stability : testing+Portability : Linux+-}+module System.Linux.Netlink.Route.LinkStat+ ( LinkStat+ , getLinkStat64+ , putLinkStat64+ , getLinkStat32+ , putLinkStat32+ )+where++#if MIN_VERSION_base(4,8,0)+#else+import Control.Applicative ((<$>))+#endif++import Data.Serialize.Get (Get)+import Data.Serialize.Put (Put)++import System.Linux.Netlink.Helpers (g64, p64, g32, p32)+import Data.Word (Word64)++-- |Data Structure for rtnl link stats+data LinkStat = LinkStat+ { rxPackets :: Word64+ , txPackets :: Word64+ , rxBytes :: Word64+ , txBytes :: Word64+ , rxErrors :: Word64+ , txErrors :: Word64+ , rxDropped :: Word64+ , txDropped :: Word64+ , multicast :: Word64+ , collisions :: Word64++ , rxLengthErrors :: Word64+ , rxOverErrors :: Word64+ , rxCRCErrors :: Word64+ , rxFrameErrors :: Word64+ , rxFifoErrors :: Word64+ , rxMissedErrors :: Word64++ , txAbortedErrors :: Word64+ , txCarrierErrors :: Word64+ , txFifoErrors :: Word64+ , txHeartbeatErrors :: Word64+ , txWindowErrors :: Word64++ , rxCompressed :: Word64+ , txCompressed :: Word64+ } deriving (Eq, Show)+++-- |Get a 'LinkStat' object from a 64bit C struct+getLinkStat64 :: Get LinkStat+getLinkStat64 = getLinkStat g64++-- |Put a 'LinkStat' object into a 64bit C struct+putLinkStat64 :: LinkStat -> Put+putLinkStat64 = putLinkStat p64++-- |Get a 'LinkStat' object from a 32bit C struct+getLinkStat32 :: Get LinkStat+getLinkStat32 = getLinkStat g32++-- |Put a 'LinkStat' object into a 32bit C struct+putLinkStat32 :: LinkStat -> Put+putLinkStat32 = putLinkStat p32++++-- Internal helper functions:+getLinkStat :: Integral a => Get a -> Get LinkStat+getLinkStat get = do+ rxp <- fromIntegral <$> get+ txp <- fromIntegral <$> get+ rxb <- fromIntegral <$> get+ txb <- fromIntegral <$> get+ rxe <- fromIntegral <$> get+ txe <- fromIntegral <$> get+ rxd <- fromIntegral <$> get+ txd <- fromIntegral <$> get+ mul <- fromIntegral <$> get+ col <- fromIntegral <$> get++ rxle <- fromIntegral <$> get+ rxoe <- fromIntegral <$> get+ rxce <- fromIntegral <$> get+ rxfe <- fromIntegral <$> get+ rxfi <- fromIntegral <$> get+ rxme <- fromIntegral <$> get++ txae <- fromIntegral <$> get+ txce <- fromIntegral <$> get+ txfi <- fromIntegral <$> get+ txhe <- fromIntegral <$> get+ txwe <- fromIntegral <$> get++ rxco <- fromIntegral <$> get+ txco <- fromIntegral <$> get+ return (LinkStat rxp txp rxb txb rxe+ txe rxd txd mul col+ rxle rxoe rxce rxfe+ rxfi rxme txae txce+ txfi txhe txwe rxco+ txco)++putLinkStat :: Num a => (a -> Put) -> LinkStat -> Put+putLinkStat put msg = do+ put . fromIntegral $ rxPackets msg+ put . fromIntegral $ txPackets msg+ put . fromIntegral $ rxBytes msg+ put . fromIntegral $ txBytes msg+ put . fromIntegral $ rxErrors msg+ put . fromIntegral $ txErrors msg+ put . fromIntegral $ rxDropped msg+ put . fromIntegral $ txDropped msg+ put . fromIntegral $ multicast msg+ put . fromIntegral $ collisions msg++ put . fromIntegral $ rxLengthErrors msg+ put . fromIntegral $ rxOverErrors msg+ put . fromIntegral $ rxCRCErrors msg+ put . fromIntegral $ rxFrameErrors msg+ put . fromIntegral $ rxFifoErrors msg+ put . fromIntegral $ rxMissedErrors msg++ put . fromIntegral $ txAbortedErrors msg+ put . fromIntegral $ txCarrierErrors msg+ put . fromIntegral $ txFifoErrors msg+ put . fromIntegral $ txHeartbeatErrors msg+ put . fromIntegral $ txWindowErrors msg++ put . fromIntegral $ rxCompressed msg+ put . fromIntegral $ txCompressed msg+
+ Utils/DumpNL80211.hs view
@@ -0,0 +1,36 @@+module Main+where++import System.Environment (getArgs)+import System.Linux.Netlink.GeNetlink.NL80211+++loopPrint :: NL80211Socket -> IO ()+loopPrint sock = do+ pack <- getPacket sock+ putStrLn $show pack+ loopPrint sock++doMain :: String -> IO ()+doMain group = do+ sock <- makeNL80211Socket+ putStrLn "Opened socket"+ joinMulticastByName sock group+ putStrLn $ "Joined multicast group: " ++ group+ loopPrint sock++printGroups :: IO ()+printGroups = do+ sock <- makeNL80211Socket+ groups <- getMulticastGroups sock+ putStrLn "This executable needs the multicast group to dump as argument"+ putStrLn "Possible multicast groups:"+ mapM_ putStrLn groups++main :: IO ()+main = do+ args <- getArgs+ case args of+ [x] -> doMain x+ [] -> printGroups+ _ -> putStrLn "This executable only takes the group to dump as argument"
+ Utils/DumpRTNL.hs view
@@ -0,0 +1,20 @@+module Main+where++import System.Linux.Netlink+import System.Linux.Netlink.Route++printLoop :: NetlinkSocket -> IO ()+printLoop sock = do+ pack <- (recvOne sock :: IO [RoutePacket])+ putStrLn $show pack+ printLoop sock+++main :: IO ()+main = do+ sock <- makeSocket+ putStrLn "Opened socket"+ joinMulticastGroup sock 1+ putStrLn "Joined multicast group"+ printLoop sock
+ Utils/GenlInfo.hs view
@@ -0,0 +1,71 @@+module Main+where++import System.Environment (getArgs)+import System.Linux.Netlink (joinMulticastGroup, recvOne, NoData, NetlinkSocket)+import System.Linux.Netlink.GeNetlink+import System.Linux.Netlink.GeNetlink.Control+++printMutlicastGroup :: CtrlAttrMcastGroup -> IO ()+printMutlicastGroup grp =+ putStr " " >> putStrLn (grpName grp)+++printFamily :: CtrlPacket -> IO ()+printFamily pack = do+ let [CTRL_ATTR_FAMILY_NAME name] = filter isName (ctrlAttributes pack)+ xs = filter isMGroup (ctrlAttributes pack)+ putStr name+ putStr ":"+ case xs of+ [CTRL_ATTR_MCAST_GROUPS grp] -> mapM_ printMutlicastGroup grp+ _ -> putStrLn " No multicast groups"+ where isName (CTRL_ATTR_FAMILY_NAME _) = True+ isName _ = False+ isMGroup (CTRL_ATTR_MCAST_GROUPS _) = True+ isMGroup _ = False+++printFamilies :: IO ()+printFamilies = do+ sock <- makeSocket+ fams <- getFamilies sock+ mapM_ printFamily fams+++printFamilieDetails :: String -> IO ()+printFamilieDetails name = do+ sock <- makeSocket+ fam <- getFamilie sock name+ putStrLn $show fam+++doDumpLoop :: NetlinkSocket -> IO ()+doDumpLoop sock = do+ pack <- (recvOne sock :: IO [GenlPacket NoData])+ putStrLn $show pack+ doDumpLoop sock+++dumpGeneric :: String -> String -> IO ()+dumpGeneric fam grp = do+ sock <- makeSocket+ may <- getFamilyWithMulticastsS sock fam+ case may of+ Just (_, grps) -> do+ let gid = getMulticast grp grps+ case gid of+ Just x -> joinMulticastGroup sock x >> doDumpLoop sock+ Nothing -> error "Could not find the specified multicast group"+ Nothing -> error "Could not find the specified family"+++main :: IO ()+main = do+ args <- getArgs+ case args of+ [] -> printFamilies+ [x] -> printFamilieDetails x+ [x,y] -> dumpGeneric x y+ _ -> putStrLn "This executable only takes a maximum of 2 arguments. Family and multicast group"
netlink.cabal view
@@ -1,35 +1,68 @@ Name: netlink-Version: 0.1+Version: 1.0.0.4 Synopsis: Netlink communication for Haskell Description: Library to comminicate with Linux kernel via Netlink-Homepage: http://netlink-hs.googlecode.com/+Homepage: https://github.com/Ongy/netlink-hs License: BSD3 License-file: LICENSE Author: David Anderson-Maintainer: Max Treskin <mtreskin@metachord.com>+Maintainer: Markus Ongyerth <ongy@ongy.net> Copyright: Google Inc. 2010 Stability: Alpha Category: System Build-type: Simple-Cabal-version: >=1.6+Cabal-version: >=1.10 Source-repository head type: git- location: https://github.com/metachord/netlink-hs+ location: https://github.com/Ongy/netlink-hs +executable dump_nl80211+ hs-source-dirs: Utils+ main-is: DumpNL80211.hs+ build-depends: base >=4.6 && <5,+ netlink+ default-language: Haskell2010+ ghc-options: -Wall++executable genlinfo+ hs-source-dirs: Utils+ main-is: GenlInfo.hs+ build-depends: base >=4.6 && <5,+ netlink+ default-language: Haskell2010+ ghc-options: -Wall++executable dump_rtnetlink+ hs-source-dirs: Utils+ main-is: DumpRTNL.hs+ build-depends: base >=4.6 && <5,+ netlink+ default-language: Haskell2010+ ghc-options: -Wall++ Library Exposed-modules: System.Linux.Netlink- System.Linux.Netlink.Internal- Other-modules: System.Linux.Netlink.C System.Linux.Netlink.Constants- System.Linux.Netlink.Protocol- System.Linux.Netlink.Attributes+ System.Linux.Netlink.Route+ System.Linux.Netlink.Route.LinkStat+ System.Linux.Netlink.Helpers+ System.Linux.Netlink.GeNetlink+ System.Linux.Netlink.GeNetlink.Constants+ System.Linux.Netlink.GeNetlink.Control+ System.Linux.Netlink.GeNetlink.NL80211+ System.Linux.Netlink.GeNetlink.NL80211.Constants+ Other-modules: System.Linux.Netlink.C+ default-language: Haskell2010 Build-depends: base >=4 && <5, bytestring >=0.9,- cereal >=0.3 && <0.4,+ cereal >=0.3, containers >=0.3, monad-loops >=0.3,- unix >=2.4- Build-tools: c2hs > 0.16+ unix >=2.4,+ pretty-hex Ghc-options: -Wall -fwarn-tabs- Ghc-prof-options: -auto-all+ if impl(ghc < 7.10)+ default-extensions: OverlappingInstances+ --Ghc-prof-options: -auto-all