flow_dumper を使ってフローエントリを取得する

Trema を使ってコントローラの開発をしていると、OpenFlow スイッチにちゃんとフローが設定できているのか気になります。

OpenFlow の仕様では、OpenFlow スイッチに設定されているフローを取得するために、stats_request メッセージの OFPST_FLOW タイプが用意されています。Trema ではこのタイプの stats_request を作る関数として create_flow_stats_request() 関数が用意されています。

しかし、trema apps 中に用意されている flow_dumper を使えば、上記関数を使った作りこみをしなくても、簡単にフローの習得ができます。

例えば、trema 上でコントローラを動作させ、以下のようにパケットを流し、フローを設定します。

$ ./trema run -c ../apps/routing_switch/routing_switch.conf -d
$ ./trema send_packets --source host1 --dest host2
$ ./trema send_packets --source host2 --dest host1

その上で、flow_dumper を実行すると、以下のように datapath_id 0xe0 のスイッチのフローが表示されます。

$ TREMA_HOME=`pwd` ../apps/flow_dumper/flow_dumper
[0x000000000000e0] priority = 65535, match = [wildcards = 0, in_port = 1, dl_src = 00:00:00:01:00:02, dl_dst = 00:00:00:01:00:01, dl_vlan = 65535, dl_vlan_pcp = 0, dl_type = 0x800, nw_tos = 0, nw_proto = 17, nw_src = 192.168.0.2/32, nw_dst = 192.168.0.1/32, tp_src = 1, tp_dst = 1], actions = [output: port=2 max_len=65535]

フローは idle timeout で消えてしまいますので、うまくいかない場合には trema send_packets を何回か繰り返してみてください。