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 ()