ネットワークエミュレーション機能 (openvswitch の起動)

質問を頂いたので、Trema のネットワークエミュレーション機能において、openvswitch がどのように起動されるかを解説します。

openvswitch の起動

openvswitch は、Trema 内の Ruby において、OpenVswitch クラスとして表現されています(ソース)。このクラス中で、openvswitch を起動するためのメソッドが以下のように定義されています。

def command
  "sudo #{ Executables.ovs_openflowd } #{ options }"
end

実行ファイル名は、executables.rb を見ると、trema ディレクトリ内でビルドされた "openvswitch/bin/ovs-openflowd" です。これが options つきで起動されています。options は以下のようになっています。

def options
  default_options.join( " " ) + " netdev@#{ network_device } tcp:#{ ip }:#{ @port }"
end


def default_options
  [
   "--detach",
   "--out-of-band",
   "--fail=closed",
   "--inactivity-probe=180",
   "--rate-limit=40000",
   "--burst-limit=20000",
   "--pidfile=#{ pid_file }",
   "--verbose=ANY:file:dbg",
   "--verbose=ANY:console:err",
   "--log-file=#{ log_file }",
   "--datapath-id=#{ dpid_long }",
   "--unixctl=#{ unixctl }",
  ] + ports_option
end

さらに ports_option は以下のようになっています。

def ports_option
  @interfaces.empty? ? [] : [ "--ports=#{ @interfaces.join( "," ) }" ]
end

"--ports=trema0-1,trema1-1" といった感じで ports_option が作られます。

追記

openvswitch の Changelog を見ると、1.2 系から ovs-openflowd が test-openflowd にリネームされています。Trema では Rantfile 中で、test-openflowd を ovs-openflowd に戻しているようです。ovs-openflowd は廃止の方向のようなので、Trema チームでは今後どうするか検討を行なっています(検討結果について誰かがすでにつぶやいてしまっている気もしますが)。