關於你的問題的第一部分,讓我們看到一個基本的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)
行之後添加鏡像控制流量的行到特定端口。如果我錯了,請更正/編輯我的答案。
我只需要識別來自控制器的OFPT_PACKET_OUT消息 –