module Nettle.LLDP.LLDP (
LLDPDU ( .. ),
getLLDPInEthernet
) where
import Data.Binary
import Data.Binary.Get (skip)
import Nettle.Ethernet.EthernetAddress
import Nettle.Ethernet.EthernetFrame
import Control.Monad.Error
data LLDPDU = LLDPDU {
chassisID :: Word64,
portID :: Word16,
timeToLive :: Word16
} deriving (Eq, Show)
instance Binary LLDPDU where
get = do
skip $ headerLength + subtypeLength
address <- get
skip $ headerLength + subtypeLength
portNumber <- get
skip $ headerLength
timeUntilExpiration <- get
skip headerLength
return LLDPDU {
chassisID=address,
portID=portNumber,
timeToLive=timeUntilExpiration
}
put LLDPDU { chassisID=cid, portID=pid, timeToLive=ttl } = do
put chassisIDHeader
put chassisIDSubtype
put cid
put portIDHeader
put portIDSubtype
put pid
put timeToLiveHeader
put ttl
put endOfLLDPDUTLV
chassisIDHeader = 521 :: Word16
chassisIDSubtype = 4 :: Word8
portIDHeader = 1027 :: Word16
portIDSubtype = 2 :: Word8
timeToLiveHeader = 1538 :: Word16
endOfLLDPDUTLV = 0 :: Word16
headerLength = 2
subtypeLength = 1
getLLDPInEthernet :: GetE LLDPDU
getLLDPInEthernet =
do ethHeader <- getEthHeader
lldpdu <- lift get
return lldpdu