diff --git a/System/Linux/Netlink.hs b/System/Linux/Netlink.hs
--- a/System/Linux/Netlink.hs
+++ b/System/Linux/Netlink.hs
@@ -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
diff --git a/System/Linux/Netlink/Attributes.hs b/System/Linux/Netlink/Attributes.hs
deleted file mode 100644
--- a/System/Linux/Netlink/Attributes.hs
+++ /dev/null
@@ -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)
diff --git a/System/Linux/Netlink/C.chs b/System/Linux/Netlink/C.chs
deleted file mode 100644
--- a/System/Linux/Netlink/C.chs
+++ /dev/null
@@ -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
diff --git a/System/Linux/Netlink/C.hsc b/System/Linux/Netlink/C.hsc
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/C.hsc
@@ -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
diff --git a/System/Linux/Netlink/Constants.hs b/System/Linux/Netlink/Constants.hs
--- a/System/Linux/Netlink/Constants.hs
+++ b/System/Linux/Netlink/Constants.hs
@@ -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
diff --git a/System/Linux/Netlink/GeNetlink.hs b/System/Linux/Netlink/GeNetlink.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/GeNetlink.hs
@@ -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
+
diff --git a/System/Linux/Netlink/GeNetlink/Constants.hs b/System/Linux/Netlink/GeNetlink/Constants.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/GeNetlink/Constants.hs
@@ -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
diff --git a/System/Linux/Netlink/GeNetlink/Control.hs b/System/Linux/Netlink/GeNetlink/Control.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/GeNetlink/Control.hs
@@ -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
diff --git a/System/Linux/Netlink/GeNetlink/NL80211.hs b/System/Linux/Netlink/GeNetlink/NL80211.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/GeNetlink/NL80211.hs
@@ -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
diff --git a/System/Linux/Netlink/GeNetlink/NL80211/Constants.hs b/System/Linux/Netlink/GeNetlink/NL80211/Constants.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/GeNetlink/NL80211/Constants.hs
@@ -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
diff --git a/System/Linux/Netlink/Helpers.hs b/System/Linux/Netlink/Helpers.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/Helpers.hs
@@ -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
diff --git a/System/Linux/Netlink/Internal.hs b/System/Linux/Netlink/Internal.hs
deleted file mode 100644
--- a/System/Linux/Netlink/Internal.hs
+++ /dev/null
@@ -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
diff --git a/System/Linux/Netlink/Protocol.hs b/System/Linux/Netlink/Protocol.hs
deleted file mode 100644
--- a/System/Linux/Netlink/Protocol.hs
+++ /dev/null
@@ -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
diff --git a/System/Linux/Netlink/Route.hs b/System/Linux/Netlink/Route.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/Route.hs
@@ -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)
diff --git a/System/Linux/Netlink/Route/LinkStat.hs b/System/Linux/Netlink/Route/LinkStat.hs
new file mode 100644
--- /dev/null
+++ b/System/Linux/Netlink/Route/LinkStat.hs
@@ -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
+
diff --git a/Utils/DumpNL80211.hs b/Utils/DumpNL80211.hs
new file mode 100644
--- /dev/null
+++ b/Utils/DumpNL80211.hs
@@ -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"
diff --git a/Utils/DumpRTNL.hs b/Utils/DumpRTNL.hs
new file mode 100644
--- /dev/null
+++ b/Utils/DumpRTNL.hs
@@ -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
diff --git a/Utils/GenlInfo.hs b/Utils/GenlInfo.hs
new file mode 100644
--- /dev/null
+++ b/Utils/GenlInfo.hs
@@ -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"
diff --git a/netlink.cabal b/netlink.cabal
--- a/netlink.cabal
+++ b/netlink.cabal
@@ -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
