实验5:开源控制器实践——POX

一、基础要求:

建立拓扑:sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
运行Hub模块:./pox.py log.level --DEBUG forwarding.hub
开启主机终端:mininet> xterm h2 h3
在h2主机终端输入:tcpdump -nn -i h2-eth0
在h3主机终端输入:tcpdump -nn -i h3-eth0

1、h1 ping h2,h2和h3的tcpdump抓包结果截图:

2、h1 ping h3,h2和h3的tcpdump抓包结果截图:

3、L2_learning模块代码流程图:

4、使用 tcpdump 验证Switch模块

运行L2_learning模块:./pox.py log.level --DEBUG forwarding.l2_learning
h1 ping h2(h3没有收到数据包):
h1 ping h3(h2没有收到数据包):

二、进阶要求:

重新建立拓扑,用dpctl del-flows命令删除流表,如下图。

1、将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。 ( ./pox.py log.level --DEBUG SendFlowInSingle3)

代码
from pox.core import core
import pox.openflow.libopenflow_01 as of

class SendFlowInSingle3(object):
    def __init__(self):
        core.openflow.addListeners(self)
    def _handle_ConnectionUp(self, event):
        msg = of.ofp_flow_mod()  # 使用ofp_flow_mod()方法向交换机下发流表
        msg.priority = 1
        msg.match.in_port = 1  # 使数据包进入端口1
        msg.actions.append(of.ofp_action_output(port=2))  # 从端口2转发出去
        msg.actions.append(of.ofp_action_output(port=3))  # 从端口3转发出去
        event.connection.send(msg)

        msg = of.ofp_flow_mod()  # 使用ofp_flow_mod()方法向交换机下发流表
        msg.priority = 1
        msg.match.in_port = 2  # 使数据包进入端口2
        msg.actions.append(of.ofp_action_output(port=1))  # 从端口1转发出去
        msg.actions.append(of.ofp_action_output(port=3))  # 从端口3转发出去
        event.connection.send(msg)

        msg = of.ofp_flow_mod()  # 使用ofp_flow_mod()方法向交换机下发流表
        msg.priority = 1
        msg.match.in_port = 3  # 使数据包进入端口3
        msg.actions.append(of.ofp_action_output(port=1))  # 从端口1转发出去
        msg.actions.append(of.ofp_action_output(port=2))  # 从端口2转发出去
        event.connection.send(msg)

def launch():
    core.registerNew(SendFlowInSingle3)

2、基于进阶1的代码,完成ODL实验的硬超时功能。(./pox.py log.level --DEBUG SendPoxHardTimeOut)

代码:
from pox.core import core
import pox.openflow.libopenflow_01 as of
#只禁h1与h3的通信,h2与其他两个主机都可通信
class SendFlowInSingle3(object):
    def __init__(self):
        core.openflow.addListeners(self)
    def _handle_ConnectionUp(self, event):
        msg = of.ofp_flow_mod()  # 使用ofp_flow_mod()方法向交换机下发流表
        msg.priority = 1
        msg.match.in_port = 1  
        msg.actions.append(of.ofp_action_output(port=2))  
       # msg.actions.append(of.ofp_action_output(port=3)) #把从端口3转发出去的路径删掉
        event.connection.send(msg)
 
        msg = of.ofp_flow_mod() 
        msg.priority = 1
        msg.match.in_port = 2  
        msg.actions.append(of.ofp_action_output(port=1))  
        msg.actions.append(of.ofp_action_output(port=3))  
        event.connection.send(msg)
 
        msg = of.ofp_flow_mod()  
        msg.priority = 1
        msg.match.in_port = 3  
       # msg.actions.append(of.ofp_action_output(port=1))  把从端口1转发出去的路径删掉
        msg.actions.append(of.ofp_action_output(port=2))  
        event.connection.send(msg)
 
def launch():
    core.registerNew(SendFlowInSingle3)

三、心得体会:

这次的实验对我来说难度还是挺大的。
最开始我也遇到了使用命令dpctl del-flows删除流表也不起作用的问题,后来是看到群里有人的解答重启了虚拟机解决的。
在进阶部分,没注意老师的文档在./pox.py log.level --DEBUG调用文件的时候加上了.py,报错了很久,后来认真的看完文档解决了。
最后特别是在进阶的ODL硬超时功能的实现,当硬超时太久的时候,会出现“找不到主机”,这时候再利用SendFlowInSingle3向s1发送流表规则也没有用了。后来发现得在出现“找不到主机”字眼出现之前就要向s1发送流表规则才能解决这个问题。
posted @ 2022-10-12 00:39  小苏同学  阅读(42)  评论(0编辑  收藏  举报