netlink-1.1.0.0: System/Linux/Netlink/GeNetlink/NL80211/WifiEI.hs
{-# LANGUAGE CPP #-}
{-|
Module : System.Linux.Netlink.GeNetlink.NL80211.WifiEI
Description : Implementation of NL80211
Maintainer : ongy
Stability : testing
Portability : Linux
This module providis utility functions for NL80211 subsystem.
In particular the IEEE80211 WifiEI part of NL80211.
-}
module System.Linux.Netlink.GeNetlink.NL80211.WifiEI
( showWifiEid
, getWifiEIDs
)
where
import qualified Data.Map as M
import Data.ByteString (ByteString)
import System.Linux.Netlink
import System.Linux.Netlink.Helpers (indent)
import Data.Serialize.Get (runGet, getByteString, getWord8, isEmpty, Get)
import Control.Monad.Loops (whileM)
import System.Linux.Netlink.GeNetlink.NL80211.Constants
#if MIN_VERSION_base(4,8,0)
#else
import Control.Applicative ((<$>))
#endif
getRight :: Show a => Either a b -> b
getRight (Right x) = x
getRight (Left err) = error $show err
-- |Prettyprint the WifiEid map
showWifiEid :: ByteString -> String
showWifiEid bs = let attrs = getRight $ runGet getWifiEIDs bs in
"WifiEIDs:\n" ++
(indent $showAttrs showIEEE80211EID attrs)
-- |'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)