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 プロトコルを使用して送信します。

入力ポートとして使用する場合、コントローラーから発信されたパケットを識別します。」

助けてくれてありがとう。

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)

最後の 2 つのステートメントは、

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生成し、メソッドをそれに添付できるように)。EventOFPPacketInRyu APIはあまり使っていませんが、理由は簡単だと思います。メッセージはコード自体を介して送信されpacket_out、このイベントを生成する行の後に数行のコードを追加するだけです。これらの数行で、packet_outメッセージの生成時に実行したいことを何でも実行できます。たとえば、上記のコードでは、行の後に制御トラフィックをミラーリングする行を特定のポートに追加するだけですdp.send_msg(out)。間違っている場合は、回答を修正/編集してください。

于 2016-06-24T12:49:00.373 に答える