Atom Login Admin

Above the clouds

OF-CONFIGを使ってみる #1

written on Sunday,February 16,2014

今回は、OF-ConfigというOpenFlowスイッチの管理の為のプロトコルについて、理解を深めるべくOF-CONFIG 1.1.1 仕様書を読んでみたり、実際に動作させてみる。

OF-CONFIGとは

ONFが策定したOpenFlowスイッチの管理の為のプロトコルで、論理スイッチ、ポート、キューなどの状態取得、設定などができる。まだ実装されているスイッチは少ない。(Open vSwitchではOVSDBが同様の機能を提供するが、OF-CONFIGプロトコルではない)
また、OF-CONFIGをサーポートするデバイスはNETCONFのサポートが必須となる。

概要

以下のようなブロック図となっている。
OF-CONFIG Block
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を実装している。
Protocol stack
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

Login
This entry was tagged #OpenFlow #OF-CONFIG