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