{-# 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
  { LinkStat -> Word64
rxPackets         :: Word64
  , LinkStat -> Word64
txPackets         :: Word64
  , LinkStat -> Word64
rxBytes           :: Word64
  , LinkStat -> Word64
txBytes           :: Word64
  , LinkStat -> Word64
rxErrors          :: Word64
  , LinkStat -> Word64
txErrors          :: Word64
  , LinkStat -> Word64
rxDropped         :: Word64
  , LinkStat -> Word64
txDropped         :: Word64
  , LinkStat -> Word64
multicast         :: Word64
  , LinkStat -> Word64
collisions        :: Word64

  , LinkStat -> Word64
rxLengthErrors    :: Word64
  , LinkStat -> Word64
rxOverErrors      :: Word64
  , LinkStat -> Word64
rxCRCErrors       :: Word64
  , LinkStat -> Word64
rxFrameErrors     :: Word64
  , LinkStat -> Word64
rxFifoErrors      :: Word64
  , LinkStat -> Word64
rxMissedErrors    :: Word64

  , LinkStat -> Word64
txAbortedErrors   :: Word64
  , LinkStat -> Word64
txCarrierErrors   :: Word64
  , LinkStat -> Word64
txFifoErrors      :: Word64
  , LinkStat -> Word64
txHeartbeatErrors :: Word64
  , LinkStat -> Word64
txWindowErrors    :: Word64

  , LinkStat -> Word64
rxCompressed      :: Word64
  , LinkStat -> Word64
txCompressed      :: Word64
  } deriving (LinkStat -> LinkStat -> Bool
(LinkStat -> LinkStat -> Bool)
-> (LinkStat -> LinkStat -> Bool) -> Eq LinkStat
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LinkStat -> LinkStat -> Bool
== :: LinkStat -> LinkStat -> Bool
$c/= :: LinkStat -> LinkStat -> Bool
/= :: LinkStat -> LinkStat -> Bool
Eq, Int -> LinkStat -> ShowS
[LinkStat] -> ShowS
LinkStat -> String
(Int -> LinkStat -> ShowS)
-> (LinkStat -> String) -> ([LinkStat] -> ShowS) -> Show LinkStat
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LinkStat -> ShowS
showsPrec :: Int -> LinkStat -> ShowS
$cshow :: LinkStat -> String
show :: LinkStat -> String
$cshowList :: [LinkStat] -> ShowS
showList :: [LinkStat] -> ShowS
Show)


-- |Get a 'LinkStat' object from a 64bit C struct
getLinkStat64 :: Get LinkStat
getLinkStat64 :: Get LinkStat
getLinkStat64 = Get Word64 -> Get LinkStat
forall a. Integral a => Get a -> Get LinkStat
getLinkStat Get Word64
g64

-- |Put a 'LinkStat' object into a 64bit C struct
putLinkStat64 :: LinkStat -> Put
putLinkStat64 :: LinkStat -> Put
putLinkStat64 = (Word64 -> Put) -> LinkStat -> Put
forall a. Num a => (a -> Put) -> LinkStat -> Put
putLinkStat Word64 -> Put
p64

-- |Get a 'LinkStat' object from a 32bit C struct
getLinkStat32 :: Get LinkStat
getLinkStat32 :: Get LinkStat
getLinkStat32 = Get Word32 -> Get LinkStat
forall a. Integral a => Get a -> Get LinkStat
getLinkStat Get Word32
g32

-- |Put a 'LinkStat' object into a 32bit C struct
putLinkStat32 :: LinkStat -> Put
putLinkStat32 :: LinkStat -> Put
putLinkStat32 = (Word32 -> Put) -> LinkStat -> Put
forall a. Num a => (a -> Put) -> LinkStat -> Put
putLinkStat Word32 -> Put
p32



-- Internal helper functions:
getLinkStat :: Integral a => Get a -> Get LinkStat
getLinkStat :: forall a. Integral a => Get a -> Get LinkStat
getLinkStat Get a
get = do
  rxp <- a -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a -> Word64) -> Get a -> Get Word64
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
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 :: forall a. Num a => (a -> Put) -> LinkStat -> Put
putLinkStat a -> Put
put LinkStat
msg = do
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxPackets LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txPackets LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxBytes LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txBytes LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxDropped LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txDropped LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
multicast LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
collisions LinkStat
msg

  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxLengthErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxOverErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxCRCErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxFrameErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxFifoErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxMissedErrors LinkStat
msg

  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txAbortedErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txCarrierErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txFifoErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txHeartbeatErrors LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txWindowErrors LinkStat
msg

  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxCompressed LinkStat
msg
  a -> Put
put (a -> Put) -> (Word64 -> a) -> Word64 -> Put
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Put) -> Word64 -> Put
forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txCompressed LinkStat
msg