OpenFlow 通訊協定

本章將描述 Match、Instructions 和 Action 在 OpenFlow 協定中的細節。

Match

有許多種類的指定條件可以用在 Match ,隨著 OpenFlow 版本的持續更新,數量也在持續增加中。 在 OpenFlow 1.0 時僅有 12 種,OpenFlow 1.3 時數量就來到約 40 種。

若想要了解每個指令的細節,請參考 OpenFlow 規格書。本章僅簡要列出 OpenFlow 1.3 的 Match 指令。

Match Field 名稱 說明
in_port 接受埠編號(含邏輯埠)
in_phy_port 接收埠實體編號
metadata 在 table 間傳遞使用的 Metadata
eth_src Ethernet MAC 來源位址
eth_dst 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 port 來源編號
tcp_dst TCP port 目的編號
udp_src UDP port 來源編號
udp_dst UDP port 目的編號
sctp_src SCTP port 來源編號
sctp_dst SCTP port 目的編號
icmpv4_type ICMP 種類
icmpv4_code ICMP Code 編碼
arp_op ARP Opcode
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 Flow label
icmpv6_type ICMPv6 Type
icmpv6_code ICMPv6 Code
ipv6_nd_target IPv6 neighbour discovery 目的位址
ipv6_nd_sll IPv6 neighbour discovery link-layer 來源位址
ipv6_nd_tll IPv6 neighbour discovery link-layer 目的位址
mpls_label MPLS 標簽
mpls_tc MPLS Traffic class(TC)
mpls_bos MPLS Bos bit
pbb_isid 802.1ah PBB I-SID
tunnel_id 邏輯埠的 metadata
ipv6_exthdr IPv6 extension header 的 Pseudo-field

可以針對 MAC 位址或 IP 位址,透過 Mask 來指定 field。

Instruction

Instruction 是用來定義當封包滿足所規範的 Match 條件時,需要執行的動作。 下面列出相關的定義。

Instruction 說明
Goto Table(必要) 在 OpenFlow 1.1 或更新的版本中, multiple flow tables 將是必需支援的項目。透過 Goto Table 的指令可以在多個 table 間進行移轉,並繼續相關的比對及對應的動作。 例如:「收到來自 port 1 的封包時,增加 VLAN-ID 200 的 tag ,並移動至 table 2」。 而所指定的 table ID 則必須是大於目前的 table ID。
Write Metadata(選項) 寫入 Metadata 以做為下一個 table 所需的參考資料。
Write Actions(必要) 在目前的 action set 中寫入新的 action ,如果有相同的 action 存在時 ,會進行覆蓋。
Apply Actions(選項) 立刻執行所指定的 action 不對現有的 action set 進行修改。
Clear Actions(選項) 清空目前存在 action set 中的資料。
Meter(選項) 指定該封包到所定義的 meter table。

以下的類別是對應各個 Instruction 的 Ryu 實作。

  • OFPInstructionGotoTable
  • OFPInstructionWriteMetadata
  • OFPInstructionActions
  • OFPInstructionMeter

Write/Apply/Clear Actions 已經包含在 OPFInstructionActions 中,可以在安裝的時候進行選取。

備註

Write Actions 雖然在規格中被列為必要,但是目前的 Open vSwitch 並不支援該功能。 Apply Actions 是目前 Open vSwitch 所提供的功能,所以可以用來替代 Write Actions。 Write Actions 預計在 Open vSwitch 2.1.0 中支援。

Action

OFPActionOutput Class 是用來轉送指定封包,其中包含 Packet-Out 和 Flow Mod。 設定好要傳送的最大封包容量(max_len)和要傳送的 Controller 目的地做為 Constructor 的參數。 對於設定目的地,除了實體連接埠號之外還有一些其他的值可以進行定義。

名稱 說明
OFPP_IN_PORT 轉送到接收埠
OFPP_TABLE 轉送到最前端的 table
OFPP_NORMAL 使用交換器本身的 L2 / L3 功能轉送
OFPP_FLOOD 轉送(Flood)到所有 VLAN 的物理連接埠,除了來源埠跟已閉鎖的埠之外
OFPP_ALL 轉送到除了來源埠之外的所有埠
OFPP_CONTROLLER 轉送到 Controller 的 Packet-In 訊息
OFPP_LOCAL 轉送到交換器本身(local port)
OFPP_ANY 使用 Wild card 來指定 Flow Mod(delete)或 Flow Stats Requests 訊息的埠號, 主要功能並不是用來轉送封包訊息。

當指定 max_len 為 0 時,Binary data 將不會被加在 Packet-In 的訊息中。 當 OFPCML_NO_BUFFER 被指定時,所有的封包將會加入 Packet-In 訊息中而不會暫存在 OpenFlow 交換器。