Ruby で Match を書く (その2)

今回は Match を書く際の注意点について説明します。

nw_dst を Matching の条件として使ってみましょう。

上記のサンプルを動かして、どのようなフローエントリが設定されたか確認してみましょう。

$ ./trema run ./matchtest.rb -c ./network.conf -d
$ TREMA_HOME=. ../apps/flow_dumper/flow_dumper
[0x00000000000001] priority = 65535, match = [wildcards = 0x3820ff, in_port = 0, dl_src = 00:00:00:00:00:00, dl_dst = 00:00:00:00:00:00, 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 = []

nw_dst = 0.0.0.0/0 となっており、思った通りのフローエントリが出来ていません。

OpenFlow 1.0 spec p.8 あたりを見てみると、Eth type (dl_type) が 0x0800 の場合、IP ヘッダ中の値をルックアップに用いるとあります。ここでは dl_type も Matching の条件として用いる必要が有りそうです。以下のような、修正版で試してみましょう。

[0x00000000000001] priority = 65535, match = [wildcards = 0x3220ef, in_port = 0, dl_src = 00:00:00:00:00:00, dl_dst = 00:00:00:00:00:00, dl_vlan = 0, dl_vlan_pcp = 0, dl_type = 0x800, nw_tos = 0, nw_proto = 0, nw_src = 0.0.0.0/0, nw_dst = 192.168.1.0/24, tp_src = 0, tp_dst = 0], actions = []

今度はきちんと設定されました。このことは tp_src, tp_dst といった L4 のフィールドを用いる場合も同様です。dl_type を 0x0800 とし、かつ nw_proto に 1 (icmp), 6 (tcp), 17 (udp) のいずれかの値をマッチ条件として設定する必要があります。

次は、match 条件中に現れる wildcards について説明します。