Open vSwitchのソースコードを読む(1) 読み始める

2013-05-14 by Daisuke Kotani

最近、Open vSwitchのソースコードを読んで処理を追っているので、そのメモを書いていこうと思います。転送するパケットとOpenFlowプロトコルがどう処理されるのかを知りたくて読んでいるので、そのあたりが中心です。細かいところを追うときに、いちいち最初から読むのではなく、どこらへんから追えばよいのか分かる、程度を目指しています。

対象は現段階で最新版の1.10.0です。

Open vSwitchとは

Open vSwitchはソフトウェアスイッチの一つで、サーバ仮想化環境のHypervisorで動くソフトウェアスイッチとしてよく使われているのではないかと思います。CitrixのXenServerはOpen vSwitchを使っているはずです。また、物理的なスイッチのControl Stackとして使うこともできて、実際にPica8がOpen vSwitchをBroadcomのチップセットで動くようにして自身の製品で使っているらしいです。

OpenFlowにも対応しています。

どこから読むか見当をつける

Open vSwitch 1.10.0のソースコードは約44万行(tar.gzを解凍して出てきたファイルが含んでいる行数の合計)あります。これはMakefileやconfigureのスクリプトなども含んだ行数ですが、これだけの量のCのソースコードの全体を把握するのは大変そうです。そこで、知りたいことに関係のある部分から読んでいこうと思います。

Open vSwitchのソースコードをダウンロードして解凍すると、READMEファイルとINSTALLファイルが見えます。とりあえずこれらのファイルをざっと眺めて、ovs-vswitchdとカーネルモジュールに関係するものを主に読めばよいのかなぁという当たりをつけます。

次にディレクトリ構成を見てみます。解凍すると以下のディレクトリが見えます。

  • build-aux
  • datapath
  • debian
  • include
  • lib
  • m4
  • ofproto
  • ovsdb
  • python
  • rhel
  • tests
  • third-party
  • utilities
  • vswitchd
  • xenserver

なんとなく、vswitchd/以下に ovs-vswitchdに関するコードが、datapath/以下にカーネルモジュールに関するコードがあるような気がしたので、これらのディレクトリから見ていくことにします。ofprotoはOpenFlowプロトコル関連で、必要に応じてofproto、include、libを見ながら読むことになるんだろうと思います。

Open vSwitchのアーキテクチャ

PORTINGにアーキテクチャの説明があります。userlandのプロセスからNICまで合わせた全体は次のようになっているというASCIIアートがありました。

            _
           |   +-------------------+
           |   |    ovs-vswitchd   |<-->ovsdb-server
           |   +-------------------+
           |   |      ofproto      |<-->OpenFlow controllers
           |   +--------+-+--------+  _
           |   | netdev | |ofproto-|   |
 userspace |   +--------+ |  dpif  |   |
           |   | netdev | +--------+   |
           |   |provider| |  dpif  |   |
           |   +---||---+ +--------+   |
           |       ||     |  dpif  |   | implementation of
           |       ||     |provider|   | ofproto provider
           |_      ||     +---||---+   |
                   ||         ||       |
            _  +---||-----+---||---+   |
           |   |          |datapath|   |
    kernel |   |          +--------+  _|
           |   |                   |
           |_  +--------||---------+
                        ||
                     physical
                       NIC

kernelのdatapathと書かれている部分がkernel moduleでやっていることで、それがない場合はuserspaceのnetdevが転送処理をしています。ofproto-dpifより下の部分を作り込むと、ハードウェア転送するようにもできるのだと思います。

userspaceと書かれている部分の実態はovs-vswitchdのという一つのプロセスです。

今後の予定

まず、パケットの転送をしているカーネルモジュールの処理を追って、次にovs-vswitchdを見ていくつもりです。



このエントリーをはてなブックマークに追加