packages feed

nettle-openflow-0.2.0: src/Examples/Flood.hs

import Nettle.Servers.Server
import Nettle.OpenFlow
import Control.Concurrent
import System.Environment

main :: IO ()
main =
  do portNum <- getPortNumber
     ofpServer <- startOpenFlowServer Nothing portNum
     forever (do (switch, features) <- acceptSwitch ofpServer
                 forkIO (handleSwitch switch)
             )
     closeServer ofpServer
       
       
getPortNumber :: IO ServerPortNumber       
getPortNumber 
  = do args <- getArgs
       if length args < 1 
         then error "Requires one command-line argument specifying the server port number."
         else return (read (args !! 0))


handleSwitch :: SwitchHandle -> IO ()
handleSwitch switch 
  = do untilNothing (receiveFromSwitch switch) (messageHandler switch)
       closeSwitchHandle switch


messageHandler :: SwitchHandle -> (TransactionID, SCMessage) -> IO ()
messageHandler switch (xid, scmsg) =
  case scmsg of
    PacketIn pktIn      -> sendToSwitch switch (xid, PacketOut (receivedPacketOut pktIn flood))
    _                   -> return ()