{-# 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
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LinkStat -> LinkStat -> Bool
$c/= :: LinkStat -> LinkStat -> Bool
== :: LinkStat -> LinkStat -> Bool
$c== :: LinkStat -> LinkStat -> Bool
Eq, Int -> LinkStat -> ShowS
[LinkStat] -> ShowS
LinkStat -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LinkStat] -> ShowS
$cshowList :: [LinkStat] -> ShowS
show :: LinkStat -> String
$cshow :: LinkStat -> String
showsPrec :: Int -> LinkStat -> ShowS
$cshowsPrec :: Int -> LinkStat -> ShowS
Show)


-- |Get a 'LinkStat' object from a 64bit C struct
getLinkStat64 :: Get LinkStat
getLinkStat64 :: Get LinkStat
getLinkStat64 = 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 = 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 = 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 = 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
  Word64
rxp <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txp <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxb <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txb <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxe <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txe <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxd <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txd <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
mul <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
col <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get

  Word64
rxle <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxoe <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxce <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxfe <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxfi <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
rxme <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get

  Word64
txae <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txce <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txfi <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txhe <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txwe <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get

  Word64
rxco <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  Word64
txco <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get a
get
  forall (m :: * -> *) a. Monad m => a -> m a
return (Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> Word64
-> LinkStat
LinkStat Word64
rxp Word64
txp Word64
rxb Word64
txb Word64
rxe
                   Word64
txe Word64
rxd Word64
txd Word64
mul Word64
col
                   Word64
rxle Word64
rxoe Word64
rxce Word64
rxfe
                   Word64
rxfi Word64
rxme Word64
txae Word64
txce
                   Word64
txfi Word64
txhe Word64
txwe Word64
rxco
                   Word64
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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxPackets LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txPackets LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxBytes LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txBytes LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxErrors LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txErrors LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
rxDropped LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
txDropped LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
multicast LinkStat
msg
  a -> Put
put forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ LinkStat -> Word64
collisions LinkStat
msg

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

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

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