{-# LANGUAGE Arrows #-} module Main where import Nettle.FRPControl.NettleSF import Nettle.FRPControl.NetInfo import Nettle.OpenFlow.Action import Nettle.OpenFlow.Packet import Nettle.OpenFlow.Switch -- A controller that broadcasts everything. -- Warning: Only works for loop-free networks; On loopy networks, a single packet will loop indefinitely -- through the network. main = do simpleNettleDriver 2525 controller controller = proc msgE -> do netInfoCmdE <- networkInfoRequester defaultMonitorPolicy -< msgE clock <- repeatedly 2 () -< () netInfo <- switchInfo -< msgE let clearE = liftE (\(dpid, _) -> clearTables dpid) (arrivalE msgE) let floodE = liftE (\(dpid, pktIn) -> sendPacket dpid (receivedPacketOut pktIn flood)) (packetInE msgE) let stdOutE = liftE show (packetInE msgE) <+> tag clock (show (portQuery netInfo)) returnA -< (mergeEventsBy (<+>) [netInfoCmdE, clearE, floodE], stdOutE) portQuery i = [ (dPID p, portID p) | p <- portTable i ]