content: {-# LANGUAGE DeriveFunctor #-}
  {-# LANGUAGE PatternSynonyms #-}
  
  module Hans.Network.Types where
  
  import Hans.Device.Types (Device,HasDeviceConfig(..))
  import Hans.Lens
  
  import Data.Serialize (Get,Put,getWord8,putWord8)
  import Data.Word (Word8)
  
  
  type NetworkProtocol = Word8
  
  pattern PROT_ICMP4 :: (Num a, Eq a) => a
  pattern PROT_ICMP4 = 0x1
  
  pattern PROT_TCP :: (Num a, Eq a) => a
  pattern PROT_TCP   = 0x6
  
  pattern PROT_UDP :: (Num a, Eq a) => a
  pattern PROT_UDP   = 0x11
  
  getNetworkProtocol :: Get NetworkProtocol
  getNetworkProtocol  = getWord8
  
  putNetworkProtocol :: NetworkProtocol -> Put
  putNetworkProtocol  = putWord8
  
  
  -- | Information about how to reach a specific destination address (source and
  -- next-hop addresses, and device to use).
  data RouteInfo addr = RouteInfo { riSource :: !addr
                                    -- ^ The source address to use when sending
                                  , riNext :: !addr
                                    -- ^ The next-hop in the route
                                  , riDev :: !Device
                                    -- ^ The device used for delivery
                                  } deriving (Eq,Functor)
  
  instance HasDeviceConfig (RouteInfo addr) where
    deviceConfig = to riDev . deviceConfig
  