module Nettle.Ethernet.EthernetAddress ( 
  -- * Ethernet address
  EthernetAddress(..)
  , isReserved
    
    -- * Parsers and unparsers
  , getEthernetAddress
  , putEthernetAddress
  ) where

import Data.Word
import Data.Bits
import Data.Binary

-- | An Ethernet address consists of 6 bytes.
data EthernetAddress = EthernetAddress Word8 Word8 Word8 Word8 Word8 Word8
                       deriving (Show,Read,Eq,Ord)
                                
-- | Parse an Ethernet address from a ByteString
getEthernetAddress :: Get EthernetAddress                                
getEthernetAddress = 
  do a1 <- get
     a2 <- get
     a3 <- get
     a4 <- get
     a5 <- get
     a6 <- get
     return $ EthernetAddress a1 a2 a3 a4 a5 a6
     
-- | Unparse an Ethernet address to a ByteString     
putEthernetAddress :: EthernetAddress -> Put     
putEthernetAddress (EthernetAddress a1 a2 a3 a4 a5 a6) = put a1 >> put a2 >> put a3 >> put a4 >> put a5 >> put a6

isReserved :: EthernetAddress -> Bool
isReserved (EthernetAddress a1 a2 a3 a4 a5 a6) = 
    a1 == 0x01 && 
    a2 == 0x80 && 
    a3 == 0xc2 && 
    a4 == 0 && 
    ((a5 .&. 0xf0) == 0)