OpenFlow v1.3 で遊ぼう (後編)

 前回 の続きで ofsoftswitch13 をインストールして Trema-edge と接続してみます.

 まずは, ofsoftswitch13 [1] のインストール作業について見てゆきます.
 プロジェクトページの README にも記述されていますが. ofsoftswitch13 のインストールは, 以下に示す必要パッケージのインストールと依存ライブラリの netbee [2] のインストールを行います.

 ( ofsoftswitch13 のビルドに必要なパッケージのインストール ([1] より抜粋) )

$ sudo apt-get install cmake libpcap-dev libxerces-c2-dev libpcre3-dev flex bison


 次に netbee ライブラリのインストールを行います. netbee ライブラリは, パケットをキャプチャし, 監視やフィルタリングそしてデコードといった処理を行う libpcap のスゴイ版といったもののようです. ただ現時点において netbee ライブラリはバイナリパッケージが見当たらないので, ソースコードからインストールさせます. netbee ライブラリのソースコードは, コミュニティの ダウンロードページ からダウンロードできます.
 ダウンロードした netbee ライブラリのソースコードを展開し, 展開したディレクトリ直下にある src, samples, tools ディレクトリにそれぞれ移動し, 以下のコマンドによってコンパイルします.

$ unzip nbeesrc-12-11-12.zip
$ cd nbeesrc-2012-11-12/
$ cd src ; cmake . && make; cd ..


 make が通ると, netbee のトップディレクトリの bin ディレクトリ直下に共有ライブラリ (*.so) が生成されるので, これらを /etc/ld.so.conf に記載されている適当なディレクトリにコピーさせ, ldconfig によって /etc/ld.so.cache を更新させます.

# cp bin/*.so /usr/local/lib
# ldconfig


 それと, ofsoftswitch13 が netbee のヘッダファイルを参照するので, include ディレクトリ以下のヘッダファイルを ofsoftswitch13 がコンパイルする際に見える場所もしくは, 環境変数 C_INCLUDE_PATH で設定したディレクトリにコピーします.

# cp include/*.h /usr/include/


 さて. ここまでで ofsoftswitch13 をインストールするための準備が整いましたので, ofsoftswitch13 自体のインストールを行います. ofsoftswitch13 のコンパイルは以下のように普通にできます.

$ ./boot && ./configure && make


 make が通れば ofsoftswitch13 はインストールされました. それでは早速 Trema-edge と接続してみます.

 Trema-edge は現時点において Ruby インターフェイスの実装ができていないので, C 言語で以下のような簡単なコントローラを記述してみます.

 [sample01.c]

#include "trema.h"

#include 

static void
handle_switch_ready( uint64_t datapath_id, void *user_data ) {
  UNUSED( user_data );

  printf( "[handle_switch_ready] \n" );
}

int
main( int argc, char **argv ) {
  init_trema( &argc, &argv );

  set_switch_ready_handler( handle_switch_ready, NULL );

  start_trema();

  return 0;
}


 上述のコントローラは, コントローラがスイッチと接続した際に呼ばれるイベントハンドラ (handle_switch_ready) を定義し, それを main() 関数で登録しているだけの処理になります. これを以下に示すようにビルドし, 実行させます.

 ( ビルド )

$ cd ${TREMA_HOME}
$ gcc -o sample01 sample01.c `./trema-config -c -l` 


 ( 実行 )

$ cd ${TREMA_HOME}
$ ./trema run ./sample01


 この時点ではどのスイッチとも接続していないので何も起こりません. それでは, 起動したコントローラにスイッチを接続させてみたいと思います. まずは, ofsoftswitch13 の ofdatapath コマンドによって, ソフトウェアスイッチを起動させます. ofdatapath コマンドは, udatapath というサブディレクトリ配下にあります. ofdatapath を以下のように実行してみてください.

# udatapath/ofdatapath -d 00000000000a ptcp:1000


 コマンドラインオプション -d によって, スイッチの dpid を決めています. 次の ptcp: オプションは, 次に示すセキュアチャンネルと接続するために待ち受ける TCP ポート番号になります. デフォルトでは 975 番を使います.
 そして, 起動したソフトウェアスイッチと, 先ほど起動したコントローラとを接続するセキュアチャンネルを, 以下に示す ofprotocol コマンドによって設定します.

$ secchan/ofprotocol tcp:localhost:1000 tcp:localhost:6633


 ofprotocol コマンドには二つの引数を指定します. 一つ目は, ofdatapath が動いているホストと起動時に指定した待受 TCP ポートの番号になります. 二つ目の引数が, コントローラのホストと TCP ポート番号になります.

 これを実行すると, Trema-edge を実行したシェルで, Swtich-Ready イベントハンドラが呼ばれて実行された printf の出力が得られます !! ちょっと感動します.
 ( 当たり前なのですが OF 1.3 に対応していない Trema でやった場合には Protocol Error が返ってきます )

 さて... では, いろんなメッセージを送ってちゃんと動くのか (遊んで) テストしてみましょうか.

 [1] https://github.com/CPqD/ofsoftswitch13
 [2] http://www.nbee.org/