2016-05-23 46 views
1

我需要從Python RYU控制器識別控制數據包。 換句話說:我如何做下面的指令?我如何識別從Ryu控制器到OF交換機的數據包?

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協議發送它。

當用作入口端口時,識別源自控制器的分組。

感謝您的幫助。

+0

我只需要識別來自控制器的OFPT_PACKET_OUT消息 –

回答

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)行之後添加鏡像控制流量的行到特定端口。如果我錯了,請更正/編輯我的答案。