module Data.Header
( L3Header (..)
, L3Address (..)
) where
import Data.Serialize (encode, Serialize)
import qualified Data.ByteString as B
class (Num c,Serialize h) => L3Header h a c | h -> a, a -> h, h -> c where
getChecksum :: h -> c
setChecksum :: h -> c -> h
src :: h -> a
dst :: h -> a
zeroChecksum :: h -> h
zeroChecksum h = setChecksum h 0
computeChecksum :: h -> c
fillChecksum :: h -> h
fillChecksum h = setChecksum h (computeChecksum h)
pseudoHeader :: h -> B.ByteString
valid :: h -> Bool
valid h = computeChecksum h == getChecksum h
class (Serialize a) => L3Address a h | a -> h, h -> a where
localBroadcast :: a -> a
globalBroadcast :: a
class (Serialize h, Serialize p) => L4Header h p | h -> p where
fixChecksum :: (L3Header l3 a c) => h -> l3 -> h
srcPort :: h -> p
dstPort :: h -> p