首页 文章

如何识别从Ryu控制器到OF交换机的数据包?

提问于
浏览
1

我需要从Python RYU-controller中识别出一个控制包 . 换句话说:我怎么能做以下指示?

If (I receive a OFPT_PACKET_OUT msg from ryu-controller)
   do something (for example all control traffic must mirroring to an output port)

我该如何匹配此规则?

我在OpenFlow v1.3规范中看到有一个ofproto.OFPP_CONTROLLER保留端口:如何将其用作入口端口?

从OFv1.3规范:“OFPP_CONTROLLER:代表具有OpenFlow控制器的控制通道 . 可用作入口端口或输出端口 .

当用作输出端口时,将数据包封装在数据包输入消息中并使用OpenFlow协议发送 .

当用作入口端口时,识别源自控制器的数据包 . “

谢谢您的帮助 .

1 回答

  • 1

    关于问题的第一部分,让我们看一下基本的第2层交换机,它只是将传入的数据包泛洪到所有输出端口:

    from ryu.base import app_manager
    from ryu.controller import ofp_event
    from ryu.controller.handler import MAIN_DISPATCHER
    from ryu.controller.handler import set_ev_cls
    
    class L2Switch(app_manager.RyuApp):
        def __init__(self, *args, **kwargs):
            super(L2Switch, self).__init__(*args, **kwargs)
    
        @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
        def packet_in_handler(self, ev):
            msg = ev.msg
            dp = msg.datapath
            ofp = dp.ofproto
            ofp_parser = dp.ofproto_parser
    
            actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
            out = ofp_parser.OFPPacketOut(
                datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
                actions=actions)
            dp.send_msg(out)
    

    最后两个陈述是

    out = ofp_parser.OFPPacketOut(
        datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
        actions=actions)
    dp.send_msg(out)
    

    这些语句生成一条 packet_out 消息,但是,我没有为 packet_out 消息引发相应的事件(如 packet_in 消息生成 EventOFPPacketIn 事件,可以在代码中检测到,并且可以附加一个方法) . 我没有太多使用过Ryu API,但我认为原因很简单 . 通过代码本身发送 packet_out 消息,您可以在生成此事件的行之后添加几行代码 . 这几行可以在生成 packet_out 消息时执行您想要执行的任何操作 . 例如,在上面的代码中,您只需将镜像控制流量的行添加到 dp.send_msg(out) 行之后的特定端口即可 . 如果我错了,请纠正/编辑我的答案 .

相关问题