Open vSwitchソースコードリーディングに向けて その4

結局なんだかんだで前回から1週間あいてしまったが、気を取り直してトップディレクトリに置いてあるドキュメントの中身を読み進める。今日は、PORTINGについてまとめる。このファイルは、LinuxからほかのUnix系のプラットフォームにOpen vSwitchを移植する際の注意点について書かれたファイルなのだが、これを読むと何となくOpen vSwitchのアーキテクチャソースコードについての理解が深まるような内容になっている。

とりあえず、Open vSwitchは移植性が高いように作ってあるとのこと。

単語の意味

歴史的な背景によって、同じコンセプトを指し示す場合であっても、ソースツリー上のコードの場所によって使われている言葉が異なっているらしい。

datapath/ vport --
vswitchd/ iface port
ofproto/ port bundle
lib/bond.c slave lacp
lib/netdev.c netdev --
database Interface Port

そして、上記のような対応表が書かれているが、どのように読み取ったら良いのかよく分からない。一番左の列はソースツリー上の場所を指しているのは明白だが、2列目、3列がそれぞれ列方向で同じコンセプトのものがどのように表現されていると思っておけば良いのだろうか?詳しい人がいたら教えてほしい。

アーキテクチャの概要

以下の図がアーキテクチャの全体像を表している。

                   +-------------------+
                   |    ovs-vswitchd   |<-->ovsdb-server
                   +-------------------+
                   |      ofproto      |<-->OpenFlow controllers
                   +--------+-+--------+
                   | netdev | | ofproto|
                   +--------+ |provider|
                   | netdev | +--------+
                   |provider|
                   +--------+
ovs-vswitchd

Open vSwitchのユーザ空間で動くメインのプログラムで、vswitchd/に格納されている。Open vSwitchの設定情報をovsdb-serverからIPCを用いて読み出し、その設定をofprotoライブラリに渡す。逆に、ofprotoから得られる統計情報をデータベースに渡したりもする。

ofproto

Open vSwitchのライブラリで、ofproto/に格納されており、これを用いてOpen vSwitchが実装されている。ネットワーク越しにOpenFlowコントローラと通信士、また、ofproto providerを通じてスイッチ(ハードウェア実装、ソフトウェア実装を含む)と通信を行う。

netdev

Open vSwitchのライブラリで、lib/netdev.cに格納されており、ネットワークデバイス、つまり、Ethernetインターフェイスとのやりとりを抽象化している。netdevライブラリはnetdev providerのコードへの薄いレイヤーとして機能している。

netdev providerの書き方

netdev providerはOSとネットワークデバイス、たとえば、Linuxでのeth0を実装している。Open vSwitchではスイッチの各ポートをnetdevとして開くことが出来る必要があるので、それぞれの目的に合ったスイッチ実装で動作するようなnetdev providerを実装する必要がある。

lib/netdev-provider.hの中にあるnetdev_classは、netdevを実装するのに必要なインターフェイスを定義している。この構造体の中には多くの関数ポインタがあり、それぞれについてその振る舞いを詳しく説明したコメントがついている。もし、そのコメントが不明確であった場合には、バグとして報告すればいいと書いてある。

netdevインターフェイスは、以下の種類に大まかに分類可能である。

  • OpenFlowの機能を適切に実装するために必要となる関数。たとえば、OpenFlowでは、ポートのMACアドレスを報告する機能が必要である。これらの関数は最小限の正しい操作を実現するために実装されていなくてはいけない。
  • オプションのOpen vSwitchの機能を実装するために必要となる関数。たとえば、Open vSwitchでのインバンド制御を実現するには、netdevがTCP/IPスタックのARPテーブルの検査に対応していなければならない。これらの関数は動かそうとするOVSの機能に対応して実装する必要があるが、最初はやらなくても問題ない。
  • ある部分には必要だが、ほかでは必要とされない関数。たとえば、大半の種類のポートではネットワークデバイスからのパケットを受信するための機能は必要とされない。(→よく理解できていない)

既存のnetdevの実装は、ポート中の有用な実例として使える。

  • lib/netdev-vport.cはLinuxカーネルでのOpen vSwitchのデータパスモジュールによって実装される仮想ポートに対応するためのものである。
  • lib/netdev-dummy.cはテストにおいてのみ有用なダミーのnetdev実装である。

と、ここまで、概要をまとめて簡潔に記述するのではなく、ドキュメントの和訳のようになってしまった。。。

本日は、ここまでにして、次回はPORTINGの残りの部分、どのように移植するのが良いのかという部分について書く。