Open vSwitch
ソースコードの全体像

清水 翔 (@oshothebig)
ソースコードの入手方法

• リリース版 (v.1.4.0)
 • http://openvswitch.org/releases/openvswitch-1.4.0.tar.gz
• 開発版
 • git clone git://openvswitch.org/openvswitch
 • git clone http://openvswitch.org/git/openvswitch
とりあえず規模を見る


• *.c, *.h, *.pyのファイルの一覧
 commit: 8a5b3cfd91841c97fbc8a003857cacbd602646ed
 • https://gist.github.com/2111386
 • 478ファイル, 合計164700行
行数トップ10
6494 ./ofproto/ofproto-dpif.c
4551 ./lib/netdev-linux.c
4096 ./ofproto/ofproto.c
3953 ./lib/ofp-util.c
3924 ./utilities/ovs-vsctl.c
3749 ./vswitchd/bridge.c
2461 ./lib/meta-flow.c
2350 ./python/compat/argparse.py
2263 ./lib/ovsdb-idl.c
2241 ./datapath/datapath.c
• README         •   ofproto/
• INSTALL.*      •   ovsdb/
• その他テキスト        •   python/

•   build-aux/   •   rhel/

•   datapath/    •   tests/

•   debian/      •   third-party/

•   include/     •   utilities/

•   lib/         •   vswitchd/

•   m4/          •   xenserver/
READMEを読む
• コンポーネントの説明         •   ovsdbmonitor

 •   ovs-vswitchd    •   ovs-controller

 •   ovsdb-server    •   ovs-ofctl

 •   ovs-brcompatd   •   ovs-pki

 •   ovs-dpctl       •   patch for tcpdump

 •   ovs-appctl      •   scripts for RPM
ovs-vswitchd



• Linuxカーネルモジュールと一緒になってフローに基
 づいたスイッチングを行うためのデーモン
ovsdb-server


• 軽量データベースサーバ
• ovs-vswitchdが設定情報を取得するために問い合わせ
 を行う先のサーバ
ovs-brcompatd


• ovs-vswitchdがLinuxブリッジを置き換える形で動作さ
 せるためのデーモン

• Linuxカーネルモジュールと一緒になって動作し、ブ
 リッジに対するioctlをインターセプトする
ovs-dpctl



• カーネルモジュールの設定を行うためのツール
ovs-vsctl



• ovs-vswitchdの設定の問い合わせと更新を行うユー
 ティリティ
ovs-appctl



• 動作中のOpen vSwitchデーモンにコマンドを送るユー
 ティリティ
ovsdbmonitor



• OVSデータベースとOpenFlowテーブルを外部から見る
 ためのGUIツール
ovs-controller



• 単純なOpenFlowコントローラ
ovs-ofctl



• OpenFlowスイッチおよびコントローラに問い合わせ
 を行うためのユーティリティ
ovs-pki



• OpenFlowスイッチのための公開 基盤を作成、管理
 するユーティリティ
ovs-dpctl ovs-vsctl
 ovs-appctl ovs-ofctl
ovs-controller ovs-pki


       utilities/
ovs-vswitchd
ovs-brcompatd


  vswitchd/
ovsdb-server



  ovsdb/
ovsdbmonitor



ovsdb/ovsdbmonitor/
patch for tcpdump



   third-party/
DESIGN
Design Decision
In Open vSwitch
OpenFlowに関する

  設計方針?
PORTING
他プラットフォーム

への移植方法の説明
アーキテクチャの

 説明あり
重要
用語解説(紛らわしい)
datapath/      vport       ---------
vswitchd/      iface       port
ofproto/       port        bundle
lib/bond.c     slave       bond
lib/lacp.c     slave       lacp
lib/netdev.c   netdev      ---------
database       Interface   Port
アーキテクチャ

     ovs-vswitchd         ovsdb-server
                          OpenFlow
         ofproto
                          controllers
netdev         ofproto
               provider
 netdev
provider
ofproto
• OpenFlowコントローラとやりとり
• ofproto providerを通してスイッチの実装とやりとり
• ofproto/に格納されている
アーキテクチャ

     ovs-vswitchd         ovsdb-server
                          OpenFlow
         ofproto
                          controllers
netdev         ofproto
               provider
 netdev
provider
netdev
• ネットワークデバイスとのやりとりを抽象化
 • Ethernetインターフェイス
• netdev providerへの薄いレイヤーとして働く
• lib/netdev.cにある
アーキテクチャ

     ovs-vswitchd         ovsdb-server
                          OpenFlow
         ofproto
                          controllers
netdev         ofproto
               provider
 netdev
provider
netdev provider
• ネットワークデバイス(e.g. eth0)に対してのOSやハー
 ドウェアに特有のインターフェイスを実装

• スイッチの各ポートはnetdevとして動作しなければな
 らない

• lib/netdev-provider.h中のnetdev_class構造体が重要
 • 多くの関数ポインタから構成される
netdevのインターフェイス
• OpenFlowの機能を実装するために最低限必要な関数
 • ポートのMACアドレスの報告
• Open vSwitchのオプションの機能を実装するために必
 要な関数

 • ARPテーブルの検査(in-band制御のため)
• 特定の実装を行うために必要となる関数
netdevの実装
• lib/netdev-linux.c: Linuxのカーネル呼び出しを使った
 Linuxのネットワークデバイスのための実装。フル機
 能を実装したnetdev実装として参考になる

• lib/netdev-vport.c: datapathモジュールが実装する仮想
 ポート機能をサポートした実装で、netdevの最低限の
 実装として参考になる

• lib/netdev-dummy.c: テストで有用なダミー実装
アーキテクチャ

     ovs-vswitchd         ovsdb-server
                          OpenFlow
         ofproto
                          controllers
netdev         ofproto
               provider
 netdev
provider
ovs-vswitchd                  ovsdb-server
                                                OpenFlow
                       ofproto
                                                controllers
Userspace



            netdev               ofproto-
                                   dpif
             netdev
            provider               dpif
                                   dpif
                                 provider   Implementation of
                                             ofproto provider

                                 datapath
Kernel




                  Physical NIC
カーネル空間とユーザ空間
• ユーザ空間での実装
 • 一番手間がかからないが、性能は低い
• カーネル空間での実装
 • 性能は高いが、必要なコード量が多い
 • 二つの選択肢
  • ofproto provider
  • dpif provider
ofproto provider
• OpenFlowスイッチを直接モニターしたり制御したり
 するためのもの

• TCAMのようなワイルドカードのハードウェアでの
 マッチングに対応させる場合

• ofproto/ofproto-provider.hの中のofproto_class構造体で
 インターフェイスが定義されている
dpif provider
• Open vSwitchでサポートされているボンディングなど
 の機能を活用するのに必要

• 通常、ofproto providerを実装するより容易
• lib/dpif-provider.hの中のdpif_class構造体でインター
 フェイスが定義されている
dpifの実装
• lib/dpif-linux.c: Linux用のdpifの実装
  • カーネルモジュールと連携して動作する
• lib/dpif-netdev.c: 一般的なdpifの実装
  • スイッチング動作を全て行っている
  • ユーザー空間の実装で使われている
まとめ
ovs-dpctl ovs-vsctl
 ovs-appctl ovs-ofctl
ovs-controller ovs-pki


       utilities/
ovs-vswitchd
ovs-brcompatd


  vswitchd/
ovsdb-server



  ovsdb/
ovsdbmonitor



ovsdb/ovsdbmonitor/
フォワーディング



 datapath/
netdev provider


lib/netdev-provider.h


  netdev_class構造体
ofproto provider


lib/ofproto-provider.h


  ofproto_class構造体
dpif provider


lib/dpif-provider.h


     dpif_class構造体
最近の話題

• Linux 3.3にコードが取り込まれた
 • MLでのお知らせ:http://bit.ly/HEQntI
 • 取り込まれたコード:http://bit.ly/HEQzZM
• OpenFlow 1.1, 1.2への対応
 • include/openflow/openflow-1.[012].h
 • 方針:http://bit.ly/HmVdCQ
終わり

Open vSwitchソースコードの全体像