今回は、OF-ConfigというOpenFlowスイッチの管理の為のプロトコルについて、理解を深めるべくOF-CONFIG 1.1.1 仕様書を読んでみたり、実際に動作させてみる。
OF-CONFIGとは
ONFが策定したOpenFlowスイッチの管理の為のプロトコルで、論理スイッチ、ポート、キューなどの状態取得、設定などができる。まだ実装されているスイッチは少ない。(Open vSwitchではOVSDBが同様の機能を提供するが、OF-CONFIGプロトコルではない)
また、OF-CONFIGをサーポートするデバイスはNETCONFのサポートが必須となる。
概要
以下のようなブロック図となっている。
OF-CONFIGはOpenFlow Configuration Pointで通信を行う。一方、OpenFlowコントローラはOpenFlowProtocolで通信を行う。OpenFlowコントローラとは別である。
OF-CONFIGはOpenFlow datapathの設定(OpenFlow contorollerがOpenFlowプロトコルを用いて通信を行う為の要素 例えばコントローラのIP Addressなど)をリモートで行うことを目的としている。
OF-CONFIGではOpenFlow datapathを抽象的にOpenFlow論理スイッチとして扱う。
OF-CONFIGプロトコルでは、OpenFlow論理スイッチとOpenFlowコントローラがOpenFlowプロトコルを用いた通信を行う為の設定を行う。
また、複数のOpenFlow datapathの操作環境をOpenFlow Capable Switchと呼ぶ。
OpenFlow Capable Switchは、ホストされたOpenFlow datapath間のポートやキューなどのOpenFlow関連リソースの集合を分割することによって1つ以上のOpenFlowデータパスをホストしている実際の物理または仮想ネットワーク要素(例えば、イーサネット·スイッチ)と同等であることを意図している。
OF-CONFIGプロトコルは、OpenFlow Capable Switch上でホストされている特定の論理スイッチと、OpenFlow Capable Switch上のオープンフロー関連リソースとの動的な関連付けを可能にしている。
OF-CONFIGはOpenFlow Capable Switch上のリソースがどのように割り振られているか特定またはリポートしない。ポートやキューなどのリソースは、それぞれの論理スイッチが割り当てられているリソースを完全に制御を取ることができるように、複数の論理スイッチの間で分割されていることを前提としている。
OF-CONFIG 1.1.1はOpenFlow Switchのアーキテクチャーについてシンプルな仮定を作る。この仕様は、意図的にFlowVisorまたは仮想化モデルされているかどうかからは切り離している。
OF-CONFIGメッセージをOpenFlow CapbleSwitchへ送信するサービスのことをOpenFlow Configuration Pointと呼ぶ。
例えば、ソフトウェアによるOpenFlowコントローラが動作してサービスを提供するか、または、既存のネットワーク管理フレームワークが提供するか、どちらであろうとOpenFlow Configuration PointとOpenFlowコントローラとの相互作用はOF-CONFIG 1.1.1の範疇外である。OpenFlow Configuration PointとOpenFlow Capable SwitchはOF-CONFIGを用いて通信する。設定は、目的の論理スイッチへ作用する。OpenFlowコントローラとOpenFlow Logical Switch(datapath)はOpenFlowプロトコルで通信する。
この仕様の開発の指針は、単純なプロトコルとスキーマを維持し、既存のプロトコルとスキーマモデルの可能なを活用することである。
これは、この仕様書の迅速な開発を支援し、願わくば、目的はSDN採用を推進するための意味のある方法でのOpenFlowの仕様を補完するという、簡単に導入が可能にすることができることである。
プロトコル層について
以下の図の通り、NETCONFを実装している。
NETCONFは標準化されたプロトコルであり、様々なプラットホームで利用されていて、
OF-CONFIG 1.1.1の要件を満たしているものである。メッセージング層(RPC)上に一連の操作を定義している。
Data Modelについて
OpenFlow Capable Switchまたは他の設定には、XMLでエンコードされたDataModelが用いられている。XMLによりエンコードされたパラメータによりRPCメソッドの呼び出しを行う。
※Data Modelの詳細についてはまた後日記載したい。
以下は例として実際にLINC-Switchを動作させて取得したOpenFlow Capable Switchの状態。
予め、LINC-Switchには起動時に以下の設定を行っている。(sys.configで行う)
[Capable Switch]
・ポート:
Port1( interface : tap0 )
Port2( interface : tap1 )
・キュー
Queue1( min_rate:100, max_rate:100 )
Queue2( min_rate:100, max_rate:100 )
[論理スイッチ : LogicalSwitch0]
・ポート
Port1:(queue:(Queue1,Queue2))
Port2:(queue:(Queue1,Queue2))
以下が実際に取得したデータである。
CapableSwitchは論理スイッチであるLogicalSwitchを含んでいる(CapableSwitch上の論理スイッチというほうが分かりやすいか)CapableSwitchのリソースには、LogicalSwitchに割り当てられているリソースが含まれている事が分かる。つまり、CapableSwitchのリソースから論理スイッチに割り当てられているということだ。次回以降で紹介しようと思うが、それぞれのリソースに設定されているresource-idをキーに論理スイッチ上で動作する割り当てられているリソースを操作することになる。
<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<rpc-reply message-id=\"0\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">
<data>
<capable-switch xmlns=\"urn:onf:of111:config:yang\">
<id>CapableSwitch0</id>
<resources>
<port>
<resource-id>LogicalSwitch0-Port1</resource-id>
<configuration>
<admin-state>up</admin-state>
<no-receive>false</no-receive>
<no-forward>false</no-forward>
<no-packet-in>false</no-packet-in>
</configuration>
<features>
<advertised>
<rate>other</rate>
<auto-negotiate>true</auto-negotiate>
<medium>copper</medium>
<pause>unsupported</pause>
</advertised>
</features>
</port>
<port>
<resource-id>LogicalSwitch0-Port2</resource-id>
<configuration>
<admin-state>up</admin-state>
<no-receive>false</no-receive>
<no-forward>false</no-forward>
<no-packet-in>false</no-packet-in>
</configuration>
<features>
<advertised>
<rate>other</rate>
<auto-negotiate>true</auto-negotiate>
<medium>copper</medium>
<pause>unsupported</pause>
</advertised>
</features>
</port>
<queue>
<resource-id>LogicalSwitch0-Port1-Queue1</resource-id>
<properties>
<min-rate>100</min-rate>
<max-rate>100</max-rate>
</properties>
</queue>
<queue>
<resource-id>LogicalSwitch0-Port1-Queue2</resource-id>
<properties>
<min-rate>100</min-rate>
<max-rate>100</max-rate>
</properties>
</queue>
<queue>
<resource-id>LogicalSwitch0-Port2-Queue1</resource-id>
<properties>
<min-rate>100</min-rate>
<max-rate>100</max-rate>
</properties>
</queue>
<queue>
<resource-id>LogicalSwitch0-Port2-Queue2</resource-id>
<properties>
<min-rate>100</min-rate>
<max-rate>100</max-rate>
</properties>
</queue>
</resources>
<logical-switches>
<switch>
<id>LogicalSwitch0</id>
<datapath-id>08:00:27:5A:CD:44:00:00</datapath-id>
<controllers>
<controller>
<id>Switch0-DefaultController</id>
<role>equal</role>
<ip-address>localhost</ip-address>
<port>6633</port>
<protocol>tcp</protocol>
<state>
<connection-state>down</connection-state>
<supported-versions>1.3</supported-versions>
</state>
</controller>
</controllers>
<resources>
<port>LogicalSwitch0-Port1</port>
<port>LogicalSwitch0-Port2</port>
<queue>LogicalSwitch0-Port1-Queue1</queue>
<queue>LogicalSwitch0-Port1-Queue2</queue>
<queue>LogicalSwitch0-Port2-Queue1</queue>
<queue>LogicalSwitch0-Port2-Queue2</queue>
</resources>
</switch>
</logical-switches>
</capable-switch>
</data>
</rpc-reply>">>
今回はOF-CONFIGの概要について触れてみたが、まだもやっとしているので、
実際にLINC-Switchを使って色々試してみたい。
Comments
Add Comment