packages feed

haskell-openflow-0.0.0.1: examples/echo-client.hs

import Data.Serialize
import Network.Socket hiding (recv)
import Network.Socket.ByteString
import Network.OpenFlow
import Network.Info

mac1 = MAC 1 2 3 4 5 6
mac2 = MAC 7 8 9 0 1 2

phyPort1 = OfpPhyPort 0 mac1 "port1" [OfppcPortDown] [OfppsLinkDown] [OfppfFiber] [OfppfFiber] [OfppfFiber] [OfppfFiber]
phyPort2 = OfpPhyPort 1 mac2 "port2" [OfppcNoStp, OfppcNoFlood] [OfppsLinkDown] [OfppfFiber, OfppfAutoneg] [OfppfFiber, OfppfPause] [OfppfFiber] [OfppfFiber]


emptyMac = MAC 0x00 0x00 0x00 0x00 0x00 0x00

inp  = 1
outp = 6

wc = [--OfpfwInPort,
  OfpfwDlVlan, OfpfwDlSrc
  , OfpfwDlDst, OfpfwDlType, OfpfwNwProto
  , OfpfwTpSrc, OfpfwTpDst, OfpfwNwSrcShift
  , OfpfwNwSrcBits, OfpfwNwSrcMask, OfpfwNwSrcAll
  , OfpfwDlVlanPcp, OfpfwNwTos, OfpfwAll
  ]
m = OfpMatch wc inp emptyMac emptyMac 0 0 0 0 0 0 0 0 0

act1 = OfpOutput outp 256
flowMod = OfpFlowMod m 0 OfpfcAdd 360 360 1 100 outp OfpffSendFlowRem [act1]


main :: IO ()
main = do
  addrinfos <- getAddrInfo
               (Just (defaultHints {addrFlags = [AI_PASSIVE]}))
               Nothing (Just "9999")
  let serveaddr = head addrinfos
  sock <- socket (addrFamily serveaddr) Stream defaultProtocol
  connect sock (addrAddress serveaddr)
  
  bounce sock (OfpFrame (OfpHeader 1 0 0 42) (OfptHello []))
  bounce sock (OfpFrame (OfpHeader 1 0 0 42) (OfptError (OfpetHelloFailed OfphfcIncompatible "incompatible! foo bar_ 43")))
  bounce sock (OfpFrame (OfpHeader 1 0 0 42) (OfptFeaturesReply (OfpSwitchFeatures 0 0 0 [OfpcFlowStats, OfpcQueueStats] [OfpatOutput, OfpatEnqueue] [phyPort1, phyPort2])))
  bounce sock (OfpFrame (OfpHeader 1 0 0 42) (OfptGetConfigReply (OfpSwitchConfig [OfpcFragNormal, OfpcFragMask] 1234)))
  bounce sock (OfpFrame (OfpHeader 1 0 0 42) (OfptFlowMod flowMod))
  bounce sock $ mkFrame (OfptPacketIn (OfpPacketIn 1 1 1 OfprNoMatch []))
  bounce sock $ mkFrame (OfptBarrierRequest)
  bounce sock $ mkFrame (OfptPacketOut (OfpPacketOut 1 1 [(OfpOutput 1 1)] []))
  bounce sock $ mkFrame (OfptPacketOut (OfpPacketOut 1 1 [(OfpOutput 1 1), (OfpStripVlan)] [1,2]))
  bounce sock $ mkFrame (OfptFlowRemoved (OfpFlowRemoved m 0 4 OfprrIdleTimeout 1 2 3 4 5))
  bounce sock $ mkFrame (OfptPortStatus (OfpPortStatus OfpprModify phyPort1))
  bounce sock $ mkFrame (OfptPortMod (OfpPortMod 1 mac1 [OfppcPortDown] [OfppcNoFwd, OfppcNoStp] [Ofppf10MbHd]))
  bounce sock $ mkFrame (OfptQueueGetConfigReply (OfpQueueGetConfigReply 1 [(OfpPacketQueue 0 [OfpqtNone]), (OfpPacketQueue 1 [OfpqtNone, (OfpqtMinRate 550)])]))

  sClose sock

  where
    mkFrame msg = (OfpFrame (OfpHeader 1 0 0 42) msg)
    bounce sock' frame = do
      sendAll sock' $ encode frame
      frame <- readOfpFrame sock'
      putStrLn $ "recv: " ++ show frame