module Nettle.OpenFlow.Port (
Port (..)
, PortID
, SpanningTreePortState (..)
, PortConfigAttribute (..)
, PortFeature (..)
, PortFeatures
, PortMod (..)
, PortStatus
, PortStatusUpdateReason (..)
, portAttributeOn
, portAttributeOff
) where
import Data.Word
import Data.Map (Map)
import qualified Data.Map as Map
import Nettle.Ethernet.EthernetAddress
data Port
= Port {
portID :: PortID,
portName :: String,
portAddress :: EthernetAddress,
portConfig :: [PortConfigAttribute],
portLinkDown :: Bool,
portSTPState :: SpanningTreePortState,
portCurrentFeatures :: Maybe PortFeatures,
portAdvertisedFeatures :: Maybe PortFeatures,
portSupportedFeatures :: Maybe PortFeatures,
portPeerFeatures :: Maybe PortFeatures
} deriving (Show,Read,Eq)
type PortID = Word16
data SpanningTreePortState = STPListening
| STPLearning
| STPForwarding
| STPBlocking
deriving (Show,Read,Eq,Ord,Enum)
data PortConfigAttribute
= PortDown
| STPDisabled
| OnlySTPackets
| NoSTPackets
| NoFlooding
| DropForwarded
| NoPacketInMsg
deriving (Show,Read,Eq,Ord,Enum)
data PortFeature
= Rate10MbHD
| Rate10MbFD
| Rate100MbHD
| Rate100MbFD
| Rate1GbHD
| Rate1GbFD
| Rate10GbFD
| Copper
| Fiber
| AutoNegotiation
| Pause
| AsymmetricPause
deriving (Show,Read,Eq)
type PortFeatures = [PortFeature]
data PortMod
= PortMod {
portNumber :: PortID,
hwAddr :: EthernetAddress,
attributesToSet :: Map PortConfigAttribute Bool
} deriving (Show,Read,Eq)
type PortStatus = (PortStatusUpdateReason, Port)
data PortStatusUpdateReason = PortAdded
| PortDeleted
| PortModified
deriving (Show,Read,Eq,Ord,Enum)
portAttributeOn :: PortID -> EthernetAddress -> PortConfigAttribute -> PortMod
portAttributeOn portID addr attr = PortMod portID addr (Map.singleton attr True)
portAttributeOff :: PortID -> EthernetAddress -> PortConfigAttribute -> PortMod
portAttributeOff portID addr attr = PortMod portID addr (Map.singleton attr False)