今日も秋田で IoT

旧 Trema 日記

OpenWRT with OpenFlow を trema と接続する(その2)

OpenWRT/WHR-G301N 側の設定

前回の記事で /lib/openflow/ofprotocol.sh の修正を行いましたが、それに加え、今回は以下の修正を行いました。

  • /etc/config/network : switch_vlan の設定を変更しています。
  • /etc/config/openflow : OpenFlow の設定は、inband と outofband の二通りあるようですが、今回の使い方では outofband モードのみの設定すればよいと思われます。

OpenWRT/WHR-G301N 側の IP アドレスを 192.168.1.250、Trema 側の IP アドレスを 192.168.1.249 としています。この部分は、それぞれの環境に合わせて変更してください。今回、OpenWRT/WHR-G301N の WAN 側のポート (eth1) を Trema との接続用に使っています。

Trema の動作確認

Trema は前回の記事を参考に、起動してください。OpenWRT 側の以下のコマンドで OpenFlow プロセスを再起動させます。

root@OpenWrt:~# /etc/init.d/openflow restart

OpenWRT と Trema との間でポート 6633 の TCP コネクションが張られていることを、netstat -an で確認してください。

通信をしてみる

今回 OpenFlow スイッチとして動作する OpenWRT/WHR-G301N の LAN 側の 4 ポート (eth0.1-4) は、Trema の learning_switch により普通の L2SW のエミュレートするようになっています。ここに例えば 192.168.11.2, 192.168.11.3 の二つの端末をつなぎ、ping をうってみましょう。通信できたでしょうか?

OpenWRT 側でのフローエントリの確認

以下のようなコマンドで、設定されているフローエントリを表示できます。

root@OpenWrt:~# dpctl dump-flows unix:/var/run/dp0.sock 
stats_reply (xid=0x8e5d6e05): flags=none type=1(flow)
  cookie=38, duration_sec=338s, duration_nsec=858000000s, table_id=0, priority=65535, n_packets=339, n_bytes=25086, idle_timeout=61,hard_timeout=0,icmp,in_port=1,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:24:81:5d:6b:f1,dl_dst=c4:2c:03:1d:91:e4,nw_src=192.168.11.3,nw_dst=192.168.11.2,nw_tos=0x00,icmp_type=8,icmp_code=0,actions=output:4
  cookie=40, duration_sec=338s, duration_nsec=855000000s, table_id=0, priority=65535, n_packets=339, n_bytes=25086, idle_timeout=61,hard_timeout=0,icmp,in_port=4,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=c4:2c:03:1d:91:e4,dl_dst=00:24:81:5d:6b:f1,nw_src=192.168.11.2,nw_dst=192.168.11.3,nw_tos=0x00,icmp_type=0,icmp_code=0,actions=output:1

Trema 側でのフローエントリの確認

OpenFlow プロトコルには、スイッチ側のフローエントリをコントローラ側から取得するためのメッセージが存在します。このメッセージを使って取得したフローエントリを表示するコマンドが、Trema apps に用意されています。

# (cd apps/flow_dumper; make)
# TREMA_HOME=./trema apps/flow_dumper/flow_dumper
[0x00002320698790] priority = 65535, match = [wildcards = 0, in_port = 1, dl_src = 00:24:81:5d:6b:f1, dl_dst = c4:2c:03:1d:91:e4, dl_vlan = 65535, dl_vlan_pcp = 0, dl_type = 0x800, nw_tos = 0, nw_proto = 1, nw_src = 192.168.11.3/32, nw_dst = 192.168.11.2/32, tp_src = 8, tp_dst = 0], actions = [output: port=4 max_len=65535]
[0x00002320698790] priority = 65535, match = [wildcards = 0, in_port = 4, dl_src = c4:2c:03:1d:91:e4, dl_dst = 00:24:81:5d:6b:f1, dl_vlan = 65535, dl_vlan_pcp = 0, dl_type = 0x800, nw_tos = 0, nw_proto = 1, nw_src = 192.168.11.2/32, nw_dst = 192.168.11.3/32, tp_src = 0, tp_dst = 0], actions = [output: port=1 max_len=65535]

OpenWRT 側で確認したエントリが取得できていることが確認できたでしょうか?もしかしたら、ping 以外にも OS が独自にだしているパケットによりフローエントリが出来ているかもしれませんので、その場合はもういちど OpenWRT 側のエントリも確認してみてください。