Ryu官網簡介,原滋原味 Ryu is a component-based software defined networking framework. Ryu provides software components with well defined API that make it easy for developers to create new network management and control applications. Ryu supports various protocols for managing network devices, such as OpenFlow, Netconf, OF-config, etc. About OpenFlow, Ryu supports fully 1.0, 1.2, 1.3, 1.4, 1.5 and Nicira Extensions. All of the code is freely available under the Apache 2.0 license.(內容來源:Ryu網站)
#Ryu安裝
- 系統環境:Ubuntu16.04 / 18.04
##使用pip3的Ryu源碼安裝 1.安裝依賴
sudo apt install gcc python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev zlib1g-dev
2.安裝pip3
sudo apt-get install python3-pip
3.下載源碼
git clone https://github.com/osrg/ryu.git
4.進入主目錄,安裝其他組件依賴 根據GitHub提示
下載安裝額外的組件用於支持ryu的OF-Config,NETCONF,BGP speaker (SSH console),**Zebra protocol service (database)**組件
cd ryu
sudo pip3 install -r tools/pip-requires -i https://pypi.tuna.tsinghua.edu.cn/simple
5.安裝ryu(install后面有空格和點)
sudo python3 setup.py install
6.查看版本
ryu --version
##參考資料 參考博客,直接嘗試安裝pip3,更方便。 RYU+mininet實踐
#Ryu入門 官方參考資料 SDNLAB參考資料 Ryu一大特點就是便於二次開發,用戶可以自定義控制器的功能。
- 從最簡單開始 新建一個l2.py,添加代碼:
from ryu.base import app_manager
class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs)
代碼中定義了一個L2Switch類,它繼承自RyuApp這個基類(在~/ryu/ryu/base/app_manager.py文件中定義),然后只做了聲明、初始化,所以這段代碼執行后不會做什么實質的事情,但是它確實一個ryu應用程序。 在l2.py目錄下執行:
ryu-manager l2.py

- 繼續添加內容 新的代碼開頭多了幾行from ryu.xxx,涉及到ryu安裝目錄~/ryu/ryu/中controller、ofphoto文件夾
controller目錄下的ofo_event.py定義了OpenFlow事件,handler.py定義了事件的處理,具體可以查看兩個文件的內容。 ofphoto目錄下主要是OpenFlow版本信息,ofproto_v1_0是OpenFlow1.0版本的定義,具體亦可查看文件內容。
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
from ryu.ofproto import ofproto_v1_0
class L2Switch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
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,當Ryu收到OpenFlow交換機送來的packet_in消息時調用,set_ev_cls的第一個參數也聲明了。 set_ev_cls的第二個參數MAIN_DISPATCHER意味着當Ryu和交換機握手過程(即hello, features request/reply, Set Config等)完畢,才會調用packet_in_handler。 之后定義packet_in消息數據結構,交換機datapath,OpenFlow協議和解析過程; 定義發給交換機packet_out的動作,要求交換機將數據包泛洪廣播;定義Ryu向交換機發送的packet_out內容,最后發送消息。 至此,一個能夠接收packet和轉發packet的交換機完成了(接收packet,廣播packet)。
- 繼續擴展 在Ryu主目錄的app文件夾下可以查看各種應用並做二次開發,實現Ryu對交換機的自定義控制。
