C 言語で flow_mod を送る (その1)
今回は、flow_mod をスイッチに送る方法について説明します。packet_in ハンドラ中で、flow_mod を作り、送ってみましょう。
flow_mod を送る際のポイントは、以下の 4 つです。
- match を作る
今回の例では、set_match_from_packet() 関数を使って、packet_in 中のパケットから 12 tuple の match を作っています。
- action を作る
今回の例では、ポート 1, 2 から入ってきたパケットをもう一方のポートに出力するというアクションを指定しています。
- match と action を送るための flow_mod メッセージを作る
create_flow_mod() 関数で、flow_mod メッセージを作っています。
- OpenFlow スイッチに flow_mod メッセージを送る
send_openflow_message() で、datapath_id で指定のOpenFlow スイッチに flow_mod メッセージを送っています。
このハンドラを含むコントローラを build し、実行してください。その上で、trema send_packets でパケットを送ってみましょう。その後 flow_dumper コマンドを用いて確認してみましょう。
$ ./trema send_packets --source host1 --dest host2 $ TREMA_HOME=. ../apps/flow_dumper/flow_dumper [0x00000000000abc] priority = 65535, match = [wildcards = 0, in_port = 2, dl_src = 00:00:00:00:00:01, dl_dst = 00:00:00:00:00:02, dl_vlan = 65535, dl_vlan_pcp = 0, dl_type = 0x800, nw_tos = 0, nw_proto = 17, nw_src = 192.168.0.1/32, nw_dst = 192.168.0.2/32, tp_src = 1, tp_dst = 1], actions = [output: port=1 max_len=65535]
フローエントリが設定されていることが確認できるはずです。
次回は、flow_mod メッセージの作り方について、もう少し詳しく説明します。