OpenFlowプロトコル

本章では、OpenFlowプロトコルで定義されている、マッチとインストラクションおよびアクションについて説明します。

マッチ

マッチに指定できる条件には様々なものがあり、OpenFlowのバージョンが上がる度にその種類は増えています。OpenFlow 1.0では12種類でしたが、OpenFlow 1.3では40種類もの条件が定義されています。

個々の詳細については、OpenFlowの仕様書などを参照して頂くとして、ここではOpenFlow 1.3のMatchフィールドを簡単に紹介します。

Matchフィールド名 説明
in_port 受信ポートのポート番号
in_phy_port 受信ポートの物理ポート番号
metadata テーブル間で情報を受け渡すために用いられるメタデータ
eth_dst Ethernetの宛先MACアドレス
eth_src Ethernetの送信元MACアドレス
eth_type Ethernetのフレームタイプ
vlan_vid VLAN ID
vlan_pcp VLAN PCP
ip_dscp IP DSCP
ip_ecn IP ECN
ip_proto IPのプロトコル種別
ipv4_src IPv4の送信元IPアドレス
ipv4_dst IPv4の宛先IPアドレス
tcp_src TCPの送信元ポート番号
tcp_dst TCPの宛先ポート番号
udp_src UDPの送信元ポート番号
udp_dst UDPの宛先ポート番号
sctp_src SCTPの送信元ポート番号
sctp_dst SCTPの宛先ポート番号
icmpv4_type ICMPのType
icmpv4_code ICMPのCode
arp_op ARPのオペコード
arp_spa ARPの送信元IPアドレス
arp_tpa ARPのターゲットIPアドレス
arp_sha ARPの送信元MACアドレス
arp_tha ARPのターゲットMACアドレス
ipv6_src IPv6の送信元IPアドレス
ipv6_dst IPv6の宛先IPアドレス
ipv6_flabel IPv6のフローラベル
icmpv6_type ICMPv6のType
icmpv6_code ICMPv6のCode
ipv6_nd_target IPv6ネイバーディスカバリのターゲットアドレス
ipv6_nd_sll IPv6ネイバーディスカバリの送信元リンクレイヤーアドレス
ipv6_nd_tll IPv6ネイバーディスカバリのターゲットリンクレイヤーアドレス
mpls_label MPLSのラベル
mpls_tc MPLSのトラフィッククラス(TC)
mpls_bos MPLSのBoSビット
pbb_isid 802.1ah PBBのI-SID
tunnel_id 論理ポートに関するメタデータ
ipv6_exthdr IPv6の拡張ヘッダの擬似フィールド

MACアドレスやIPアドレスなどのフィールドによっては、さらにマスクを指定することができます。

インストラクション

インストラクションは、マッチに該当するパケットを受信した時の動作を定義するもので、 次のタイプが規定されています。

インストラクション 説明
Goto Table (必須)

OpenFlow 1.1以降では、複数のフローテーブルがサポートされています。Goto Tableによって、マッチしたパケットの処理を、指定したフローテーブルに引き継ぐことができます。例えば、「ポート1で受信したパケットにVLAN-ID 200を付加して、テーブル2へ飛ぶ」といったフローエントリが設定できます。

指定するテーブルIDは、現在のテーブルIDより大きい値でなければなりません。

Write Metadata (オプション) 以降のテーブルで参照できるメタデータをセットします。
Write Actions (必須) 現在のアクションセットに指定されたアクションを追加します。同じタイプのアクションが既にセットされていた場合には、新しいアクションで置き換えられます。
Apply Actions (オプション) アクションセットは変更せず、指定されたアクションを直ちに適用します。
Clear Actions (オプション) 現在のアクションセットのすべてのアクションを削除します。
Meter (オプション) 指定したメーターにパケットを適用します。

Ryuでは、各インストラクションに対応する次のクラスが実装されています。

  • OFPInstructionGotoTable
  • OFPInstructionWriteMetadata
  • OFPInstructionActions
  • OFPInstructionMeter

Write/Apply/Clear Actionsは、OPFInstructionActionsにまとめられていて、インスタンス生成時に選択します。

注釈

Write Actionsのサポートは仕様上必須とされていますが、古いバージョンのOpen vSwitchでは未実装であり、代替としてApply Actionsを使用する必要がありました。Open vSwitch 2.1.0からはWrite Actionsのサポートが追加されました。

アクション

OFPActionOutputクラスは、Packet-OutメッセージやFlow Modメッセージで使用するパケット転送を指定するものです。コンストラクタの引数で転送先と、コントローラへ送信する場合は最大データサイズ(max_len)を指定します。転送先には、スイッチの物理的なポート番号の他にいくつかの定義された値が指定できます。

説明
OFPP_IN_PORT 受信ポートに転送されます
OFPP_TABLE 先頭のフローテーブルに摘要されます
OFPP_NORMAL スイッチのL2/L3機能で転送されます
OFPP_FLOOD 受信ポートやブロックされているポートを除く当該VLAN内のすべての物理ポートにフラッディングされます
OFPP_ALL 受信ポートを除くすべての物理ポートに転送されます
OFPP_CONTROLLER コントローラにPacket-Inメッセージとして送られます
OFPP_LOCAL スイッチのローカルポートを示します
OFPP_ANY Flow Mod(delete)メッセージやFlow Stats Requestsメッセージでポートを選択する際にワイルドカードとして使用するもので、パケット転送では使用されません

max_lenに0を指定すると、Packet-Inメッセージにパケットのバイナリデータは添付されなくなります。OFPCML_NO_BUFFERを指定すると、OpenFlowスイッチ上でそのパケットをバッファせず、Packet-Inメッセージにパケット全体が添付されます。