Floodlight 用Static Flow Pusher 改变流表规则

来源:互联网 发布:淘宝双11营业额 编辑:程序博客网 时间:2024/06/02 11:26

实验拓扑:


====================================================================================

1.登录mininet

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo ssh -x openflow@openflow  

2.启动floodlight

写一个把启动floodlight小脚本,用shell来运行

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2. cd /home/fei/workspace/floodlight-0.90/target  
  3. java -jar floodlight.jar   

终端中运行这个脚本


3.构建拓扑

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo mn --topo single,3 --controller=remote --ip=192.168.131.129 --port=6633  


4.h2,h3,h4三个host相互ping,可以看到默认是可以拼通的,而且从每个host,第一个ping包time值比较大,可以猜测出默认转发端口是floodlight控制器

可以在floodlight包的

[plain] view plain copy
  1. src/main/resources/floodlightdefault.properties  
文件中删除

[plain] view plain copy
  1. net.floodlightcontroller.forwarding.Forwarding  
这一项,则默认是ping不同的




5.至此基本网络已经完成,接下来我们使用Static Flow Pusher 改变流表,让h2 ping不通h3,h4。 h3与h4能ping通,转发口使用floodlight控制器,我们设置从端口1的数据从端口1转发回去,也可以在actions域置为空,则丢弃从端口1来的包。

Python代码:

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import httplib  
  2. import json  
  3.   
  4. class StaticFlowPusher(object):  
  5.   
  6.     def __init__(self, server):  
  7.         self.server = server  
  8.   
  9.     def get(self, data):  
  10.         ret = self.rest_call({}, 'GET')  
  11.         return json.loads(ret[2])  
  12.   
  13.     def set(self, data):  
  14.         ret = self.rest_call(data, 'POST')  
  15.         return ret[0] == 200  
  16.   
  17.     def remove(self, objtype, data):  
  18.         ret = self.rest_call(data, 'DELETE')  
  19.         return ret[0] == 200  
  20.   
  21.     def rest_call(self, data, action):  
  22.         path = '/wm/staticflowentrypusher/json'  
  23.         headers = {  
  24.             'Content-type''application/json',  
  25.             'Accept''application/json',  
  26.             }  
  27.         body = json.dumps(data)  
  28.         conn = httplib.HTTPConnection(self.server, 8080)  
  29.         conn.request(action, path, body, headers)  
  30.         response = conn.getresponse()  
  31.         ret = (response.status, response.reason, response.read())  
  32.         print ret  
  33.         conn.close()  
  34.         return ret  
  35.   
  36. pusher = StaticFlowPusher('192.168.131.129')  #控制器ip  
  37.   
  38. flow1 = {  
  39.     'switch':"00:00:00:00:00:00:00:01",  
  40.     "name":"flow-mod-1",  
  41.     "cookie":"0",  
  42.     "priority":"32768",  
  43.     "ingress-port":"1",  
  44.     "active":"true",  
  45.     "actions":"output=1"  
  46.     }  
  47.       
  48. flow2 = {  
  49.     'switch':"00:00:00:00:00:00:00:01",  
  50.     "name":"flow-mod-2",  
  51.     "cookie":"0",  
  52.     "priority":"32768",  
  53.     "ingress-port":"2",  
  54.     "active":"true",  
  55.     "actions":"output=flood"  
  56.     }  
  57.   
  58. flow3 = {  
  59.     'switch':"00:00:00:00:00:00:00:01",  
  60.     "name":"flow-mod-3",  
  61.     "cookie":"0",  
  62.     "priority":"32768",  
  63.     "ingress-port":"3",  
  64.     "active":"true",  
  65.     "actions":"output=flood"  
  66.     }  
  67. #添加流表flow1,flow2,flow3  
  68. pusher.set(flow1)     
  69. pusher.set(flow2)  
  70. pusher.set(flow3)  


运行python flow1.py,可以看到按代码添加了3个流表


在mininet执行

[plain] view plain copy
  1. dpctl dump-flows tcp:127.0.0.1:6634  
查看流表,与代码一致



也可以在floodlight的web页面看到流表项


实验结果如下:


(1)h3与h4能ping通


(2)h2与h3不能ping通,当然h2与h4也是如此



下面将流表flow2,flow3项"actions":"output=flood"字段改成相应的端口,即2转发到3,3转发到2

      通过ping h3,h4,可以看到第一个ping 包time值明显缩小,因为添加了直接转发的表项,而不是上面那样的经过控制器,不过跟后面的包time值还不是一个数量级,因为对控制器不是很熟悉,这些细节还有待学习。

0 0
原创粉丝点击