Ryuを利用した、スイッチングハブの実装

提供:TuntunkunMediaWiki

移動: 案内, 検索

目次

Ryuを利用した、スイッチングハブの実装(OpenFlow1.3)

 OpenFlowコントローラーのRyuを利用したスイッチングハブについてまとめます。Ryuのインストールを行うと作られるディレクトリの中にサンプルアプリケーションが含まれていますが、今回はそのサンプルアプリケーションではなく、簡単なスイッチングハブの実装を公開している人のページを見つけたので、そのソースコードを解説します。

スイッチングハブの実装

 以下のページでスイッチングハブの実装が公開されていました。

# -*- coding: utf-8 -*-
from ryu.base import app_manager
from ryu.controller.handler import CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.controller import ofp_event
from ryu.ofproto import ofproto_v1_3
from ryu.lib import ofctl_v1_3
 
class SwitchingHub(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
 
    def __init__(self, *args, **kwargs):
        super(SwitchingHub, self).__init__(*args, **kwargs)
 
    @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):
        print('Switch is joined!')
        datapath = ev.msg.datapath
 
        flow = {
            'actions': [
                {
                    'type': 'OUTPUT',
                    'port': ofproto_v1_3.OFPP_NORMAL,
                 }
            ]
        }
 
        ofctl_v1_3.mod_flow_entry(datapath, flow, datapath.ofproto.OFPFC_ADD)

ソースコードの解説

 OpenFlowについての知識が浅いため、ソースコードを見ただけでは理解する事が難しかったため解説を残しておきます。誰かの参考になれば幸いです。

OpenFlowプロトコルのバージョン設定

 以下の部分で、OpenFlowスイッチとOpenFlowコントローラー内で通信を行うOpenFlowプロトコルのバージョンを設定しています。

class SwitchingHub(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

コンストラクタの呼び出し

 この部分では親クラス(app_manager.RyuApp)のコンストラクタを呼び出しています。

def __init__(self, *args, **kwargs):
    super(SwitchingHub, self).__init__(*args, **kwargs)

Features Requestについて

 この部分を理解するためには、OpenFlowの通信について知っている必要があります。OpenFlowコントローラーとOpenFlowスイッチが通信を始めるまでのメッセージの受け渡しについて理解しておく必要性があります。以下にOpenFlowコントローラーとスイッチのコネクション確立までのメッセージのやり取りについて書かれているスライドのURLを記します。

以下にOpenFlowコントローラーとスイッチが接続を行う際のメッセージ交換手順を示します。

 以下ソースコードでは、Featureリクエストの送信部分にあたります。スイッチが接続を行って来た場合にフローテーブルに書き込みを行いたい場合は、以下のメソッド内に操作を記述します。

@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):
        print('Switch is joined!')

 以下の部分では、接続を確立したスイッチのフローテーブルに書き込みを行っている部分です。OFPP_NORMALについては、以下の通りです。

        flow = {
            'actions': [
                {
                    'type': 'OUTPUT',
                    'port': ofproto_v1_3.OFPP_NORMAL,
                }
            ]
        }
 
        ofctl_v1_3.mod_flow_entry(datapath, flow, datapath.ofproto.OFPFC_ADD)

参考文献

個人用ツール
名前空間
変種
操作
案内
ツールボックス