packages feed

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 ]