nettle-frp-0.1: src/Examples/AFRPControl/TrackPorts.hs
{-# 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 ]