Ruby で Match を書く (その1)

今回は Match の書き方について説明します。今回は C 言語よりもシンプルにかける Ruby を使います。

OpenFlow 1.0 の仕様では、Packet の Matching に 12-tuple の情報を用いることができます。Trema において Match を作る際に、使用したい引数に値を設定すればよいということになります。例えば、12-tuple のうち in_port と dl_dst に値を指定したい場合、以下のようにすればよいです。

switch_ready は、スイッチから接続が行われ、セキュアチャネルが確立した時に呼ばれるハンドラです。今回ポート番号 1 から入ってきた宛先 MAC アドレスが 01:01:01:01:01:01 のパケットを、drop させるというエントリがスイッチに設定されます。

$ ./trema run ./matchtest.rb -c ./network.conf -d
$ TREMA_HOME=. ../apps/flow_dumper/flow_dumper
[0x00000000000001] priority = 65535, match = [wildcards = 0x3820f6, in_port = 1, dl_src = 00:00:00:00:00:00, dl_dst = 01:01:01:01:01:01, dl_vlan = 0, dl_vlan_pcp = 0, dl_type = 0, nw_tos = 0, nw_proto = 0, nw_src = 0.0.0.0/0, nw_dst = 0.0.0.0/0, tp_src = 0, tp_dst = 0], actions = [output: port=65531 max_len=65535]

今回指定しなかったフィールドは、すべて wildcard として扱われることに注意してください。つまり wildcard として扱いたい場合、Match を作る際に引数に値を設定しなければよいということです。

次回は、この Match を作る際の注意点について説明します。