Ryu script 是以 Python 為語言
這篇介紹一個最基本的 Ryu App,這個 Application 讓 OpenFlow switches 像 dumb layer 2 switch 一樣運作
from ryu.base import app_manager class L2Switch(app_manager.RyuApp): def __init__(self, *args, **kwargs): super(L2Switch, self).__init__(*args, **kwargs)
我們可將上段程式存檔,任意命名放在任意目錄,這邊檔名為 l2.py
存放在家目錄
這個 App 目前還沒什麼用,但他已經算是一個完整的 Ryu App 了
可以透過下面方式執行 App
% ryu-manager ~/l2.py
接著我們增加一個 function 讓 App 可以將收到的 packet 送到所有 ports
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)
新增 packet_in_handler
這個 function 到 L2Switch class,這個 function 會在 Ryu 收到 OpenFlow packet_in message 被呼叫,而關鍵在於 set_ev_cls
decorator,decorator 會告訴 Ryu App 何時這個 decorator function 會被呼叫
decorator
MAIN_DISPATCHER
即可達到此效果,表示這個函式只有在協商完成後才會被呼叫packet_in_handler function
ev.msg
是一個表示 packet_in data structure 的物件msg.dp
是一個表示 datapath (switch) 的物件dp.ofproto
和 dp.ofproto_parser
表示 Ryu 和 Switch 協商的 protocol