今日も秋田で IoT

旧 Trema 日記

C 言語で flow_mod を送る (その2)

今回は、flow_mod メッセージの作り方について、少し詳しく説明したいと思います。openflow-message.h 中にて、以下のように create_flow_mod() のプロトタイプが宣言されています。

buffer *create_flow_mod(
  const uint32_t transaction_id,
  const struct ofp_match match,
  const uint64_t cookie,
  const uint16_t command,
  const uint16_t idle_timeout,
  const uint16_t hard_timeout,
  const uint16_t priority,
  const uint32_t buffer_id,
  const uint16_t out_port,
  const uint16_t flags,
  const openflow_actions *actions
);

引数が多いですが、これらは OpenFlow spec 1.0 で定義されている flow_mod メッセージ中の各パラメータに値を指定できるように用意されているものです。

  • transaction_id

transation id を指定します。Trema の関数 get_transaction_id() にて取得した値を用いてください。

  • match

パケットのマッチ条件を指定します。

フローエントリを管理するための cookie を設定します。この cookie は、複数のフローエントリを一つのグループとして管理する際などに、用いることができます。Trema の関数 get_cookie() にて値を取得して用いてください。

  • command

OFPFC_ADD, OFPFC_MODIFY, OFPFC_MODIFY_STRICT, OFPFC_DELETE, OFPFC_DELETE_STRICT のいずれかの値を設定します。

  • idle_timeout

フローエントリの idle timeout 時間 (秒単位) を設定します。

  • hard_timeout

フローエントリの hard timeout 時間 (秒単位) を設定します。

  • priority

フローエントリの優先度を設定します。複数にマッチするパケットに対しては、優先度の一番高いフローエントリが適用されます。ただし Exact match である場合、この優先度は最優先のみしか指定できません。

  • buffer_id

packet_in 中の buffer_id を指定します。

  • out_port

DELETE, DELETE_STRICT でのみ有効なフィールドで、使用しない場合には OFPP_NONE を設定します。詳しくは、spec 1.0 の p.28 参照のこと。

  • flags

flag を設定します。例えばフローエントリがタイムアウト等の理由で消えた時 flow_removed メッセージで通知を行うようにするためには、OFPFF_SEND_FLOW_REM のフラグをここに設定します。

  • actions

条件にマッチしたパケットに対するアクションを指定します。

Ruby 版であれば不要な引数には特に指定しないでもデフォルトの値が使用されます。C ではそういうわけにはいかないので、面倒でも適切に値を設定してください。

次回以降、上記のうち重要なものからすこし詳しい説明を行なっていきます。