netcore-1.0.0: nettle-openflow/src/Nettle/OpenFlow/FlowTable.hs
{-# LANGUAGE CPP, DisambiguateRecordFields #-}
-- | A switch has some number of flow tables. Each flow table is a
-- prioritized list of entries containing a @Match@, a list of
-- @Action@s, and other options affecting the behavior of the switch.
-- This module represents the OpenFlow messages that can be used
-- to modify flow tables.
module Nettle.OpenFlow.FlowTable (
FlowTableID
, FlowMod (..)
, Cookie
, Priority
, TimeOut (..)
, FlowRemoved (..)
, FlowRemovalReason (..)
) where
import Nettle.OpenFlow.Switch
import Nettle.OpenFlow.Action
import Nettle.OpenFlow.Match
import Nettle.OpenFlow.Packet
import Data.Word
import Data.List as List
type FlowTableID = Word8
data FlowMod = AddFlow { match :: Match
, priority :: Priority
, actions :: ActionSequence
, cookie :: Cookie
, idleTimeOut :: TimeOut
, hardTimeOut :: TimeOut
, notifyWhenRemoved :: Bool
, applyToPacket :: Maybe BufferID
, overlapAllowed :: Bool
}
| AddEmergencyFlow { match :: Match
, priority :: Priority
, actions :: ActionSequence
, cookie :: Cookie
, overlapAllowed :: Bool
}
| ModifyFlows { match :: Match
, newActions :: ActionSequence
, ifMissingPriority :: Priority
, ifMissingCookie :: Cookie
, ifMissingIdleTimeOut :: TimeOut
, ifMissingHardTimeOut :: TimeOut
, ifMissingNotifyWhenRemoved :: Bool
, ifMissingOverlapAllowed :: Bool
}
| ModifyExactFlow { match :: Match
, priority :: Priority
, newActions :: ActionSequence
, ifMissingCookie :: Cookie
, ifMissingIdleTimeOut :: TimeOut
, ifMissingHardTimeOut :: TimeOut
, ifMissingNotifyWhenRemoved :: Bool
, ifMissingOverlapAllowed :: Bool
}
| DeleteFlows { match :: Match,
outPort :: Maybe PseudoPort
}
| DeleteExactFlow { match :: Match,
outPort :: Maybe PseudoPort,
priority :: Priority
}
deriving (Show, Eq)
type Cookie = Word64
-- |The priority of a flow entry is a 16-bit integer. Flow entries with higher numeric priorities match before lower ones.
type Priority = Word16
-- | Each flow entry has idle and hard timeout values
-- associated with it.
data TimeOut = Permanent
| ExpireAfter Word16
deriving (Show,Eq)
-- | When a switch removes a flow, it may send a message containing the information
-- in @FlowRemovedRecord@ to the controller.
data FlowRemoved = FlowRemovedRecord { flowRemovedMatch :: Match,
flowRemovedCookie :: Word64,
flowRemovedPriority :: Priority,
flowRemovedReason :: FlowRemovalReason,
flowRemovedDuration :: Integer,
flowRemovedDurationNSecs :: Integer,
flowRemovedIdleTimeout :: Integer,
flowRemovedPacketCount :: Integer,
flowRemovedByteCount :: Integer }
deriving (Show,Eq)
data FlowRemovalReason = IdleTimerExpired
| HardTimerExpired
| DeletedByController
deriving (Show,Eq,Ord,Enum)