1

我需要从 Python RYU 控制器中识别一个控制数据包。换句话说:我怎样才能执行以下指令?

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 控制器的控制通道。可用作入口端口或输出端口。

用作输出端口时,将数据包封装在 packet-in 消息中,并使用 OpenFlow 协议发送。

当用作入口端口时,识别来自控制器的数据包。”

谢谢您的帮助。

4

1 回答 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)行。如果我错了,请更正/编辑我的答案。

于 2016-06-24T12:49:00.373 回答