ネットワークエミュレーション機能の中身

Trema のネットワークエミュレーション機能の中身を見てみたいと思います。

例えば、以下のようなコンフィグファイルを Trema から起動したとします。

vswitch ( "vsw" ) { 
  datapath_id "0xabc" 
}
vhost ( "host1" )
vhost ( "host2" )

link "host1", "vsw"
link "host2", "vsw"

このコンフィグファイルには、vswitch, vhost, link から始まる項目が含まれています。それぞれについて説明したいと思います。

vswitch

このエントリ一つに対して Openvswitch のプロセスが一つ起動します。Openvswitch のソースコードは、Trema に同梱されているため、別途用意する必要はありません。上記の例では、datapath_id が "0xabc" である OpenFlow スイッチとして、Openvswitch の起動が行われます。

vhost

このエントリ一つに対して phost のプロセスが一つ起動します。phost のソースコードも、Trema の vendor ディレクリの配下に同梱されています。trema の send_packets コマンドなどで操作することができます。

link

このエントリ一つに対し二つのネットワークインターフェイスが、Trema 起動マシンのホスト OS 上に作成されます。一方は openvswith に、もう一方は phost のプロセスにて使用されます。
上記のコンフィグファイルを Trema で起動後 ifconfig で確認してみると、trema0-0, trema0-1, trema1-0, trema1-1 の 4 つのインターフェイスができていることが確認できます。trema のソースを覗いてみると、以下のコマンドで link が張られているようです。

sudo ip link add name trema0-0 type veth peer name trema0-1

おわりに

今回は、ネットワークエミュレーション機能の中身をすこし覗いてみました。より複雑なテストを行うためには、phost にさまざまなパケットを出せるよう機能を追加していく必要があります。興味がある人は、様々な機能を実装してみてはいかがでしょうか?