{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE OverloadedStrings #-}

module Hans.Device.Loopback where

import Hans.Device.Types
import Hans.Ethernet.Types (Mac(..))
import Hans.Types


import Control.Concurrent.BoundedChan (newBoundedChan)



-- | A device that just posts outgoing packets back to the input queue.
newLoopbackDevice :: NetworkStack -> IO Device
newLoopbackDevice _ns =
  do let noChecksum = ChecksumOffload { coIP4   = True
                                      , coUdp   = True
                                      , coTcp   = True
                                      , coIcmp4 = True }

     let devConfig = defaultDeviceConfig { dcSendQueueLen = 1
                                         , dcTxOffload    = noChecksum
                                         , dcRxOffload    = noChecksum }
     let devName   = "lo"
     let devMac    = Mac 0 0 0 0 0 0

     devStats     <- newDeviceStats
     devSendQueue <- newBoundedChan (dcSendQueueLen devConfig)

     return $! Device { devStart   = return ()
                      , devStop    = return ()
                      , devCleanup = return ()
                      , .. }