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 メッセージの作り方について、もう少し詳しく説明します。