Import Floodlight v0.90
diff --git a/src/ext/floodlight/example/packetStreamerClientExample.py b/src/ext/floodlight/example/packetStreamerClientExample.py
new file mode 100755
index 0000000..4510374
--- /dev/null
+++ b/src/ext/floodlight/example/packetStreamerClientExample.py
@@ -0,0 +1,138 @@
+#!/usr/bin/python
+
+import urllib2
+import json
+import re
+import sys
+
+from optparse import OptionParser
+
+sys.path.append('~/floodlight/target/gen-py')
+sys.path.append('~/floodlight/thrift/lib/py')
+
+from packetstreamer import PacketStreamer
+from packetstreamer.ttypes import *
+
+from thrift import Thrift
+from thrift.transport import TSocket
+from thrift.transport import TTransport
+from thrift.protocol import TBinaryProtocol
+
+SESSIONID = 'sessionId'
+usage = "usage: %prog [options]"
+parser = OptionParser(usage=usage, version="%prog 1.0")
+parser.add_option("-c", "--controller", dest="controller", metavar="CONTROLLER_IP",
+ default="127.0.0.1", help="controller's IP address")
+parser.add_option("-m", "--mac", dest="mac", metavar="HOST_MAC",
+ help="The host mac address to trace the OF packets")
+
+(options, args) = parser.parse_args()
+
+def validateIp(ip):
+ ipReg = ("(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
+ "\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
+ "\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
+ "\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
+ m = re.compile(ipReg).match(ip)
+ if m:
+ return True
+ else :
+ return False
+
+def validateMac(mac):
+ macReg = '([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}' # same regex as above
+ m = re.compile(macReg).match(mac)
+ if m:
+ return True
+ else :
+ return False
+
+if not validateIp(options.controller):
+ parser.error("Invalid format for ip address.")
+
+if not options.mac:
+ parser.error("-m or --mac option is required.")
+
+if not validateMac(options.mac):
+ parser.error("Invalid format for mac address. Format: xx:xx:xx:xx:xx:xx")
+
+controller = options.controller
+host = options.mac
+
+url = 'http://%s:8080/wm/core/packettrace/json' % controller
+filter = {'mac':host, 'direction':'both', 'period':1000}
+post_data = json.dumps(filter)
+request = urllib2.Request(url, post_data, {'Content-Type':'application/json'})
+response_text = None
+
+def terminateTrace(sid):
+ global controller
+
+ filter = {SESSIONID:sid, 'period':-1}
+ post_data = json.dumps(filter)
+ url = 'http://%s:8080/wm/core/packettrace/json' % controller
+ request = urllib2.Request(url, post_data, {'Content-Type':'application/json'})
+ try:
+ response = urllib2.urlopen(request)
+ response_text = response.read()
+ except Exception, e:
+ # Floodlight may not be running, but we don't want that to be a fatal
+ # error, so we just ignore the exception in that case.
+ print "Exception:", e
+
+try:
+ response = urllib2.urlopen(request)
+ response_text = response.read()
+except Exception, e:
+ # Floodlight may not be running, but we don't want that to be a fatal
+ # error, so we just ignore the exception in that case.
+ print "Exception:", e
+ exit
+
+if not response_text:
+ print "Failed to start a packet trace session"
+ sys.exit()
+
+response_text = json.loads(response_text)
+
+sessionId = None
+if SESSIONID in response_text:
+ sessionId = response_text[SESSIONID]
+else:
+ print "Failed to start a packet trace session"
+ sys.exit()
+
+try:
+
+ # Make socket
+ transport = TSocket.TSocket('localhost', 9090)
+
+ # Buffering is critical. Raw sockets are very slow
+ transport = TTransport.TFramedTransport(transport)
+
+ # Wrap in a protocol
+ protocol = TBinaryProtocol.TBinaryProtocol(transport)
+
+ # Create a client to use the protocol encoder
+ client = PacketStreamer.Client(protocol)
+
+ # Connect!
+ transport.open()
+
+ while 1:
+ packets = client.getPackets(sessionId)
+ for packet in packets:
+ print "Packet: %s"% packet
+ if "FilterTimeout" in packet:
+ sys.exit()
+
+except Thrift.TException, e:
+ print '%s' % (e.message)
+ terminateTrace(sessionId)
+
+except KeyboardInterrupt, e:
+ terminateTrace(sessionId)
+
+# Close!
+transport.close()
+