Open vSwitch VLAN相關字段詳解(dl_vlan、dl_vlan_pcp、vlan_vid、vlan_pcp、vlan_tci)

字段概覽

字段名 長度 格式 Masking 前置項 訪問權限 OpenFlow 1.0 OpenFlow 1.1 NXM/OXM Support 描述
dl_vlan 16位 (僅用到後12位) 十進制 not maskable Ethernet 讀/寫 VLAN ID相關
dl_vlan_pcp 8位 (僅用到後3位) 十進制 not maskable Ethernet 讀/寫 和802.1Q報文的優先級相關
vlan_vid 16位( 僅用到後13位) 十進制 支持任意位掩碼 Ethernet 讀/寫 exact match only exact match only OF 1.2+ and OVS 1.7+ VLAN ID相關
vlan_pcp 8位 (僅用到後3位) 十進制 not maskable VLAN VID 讀/寫 exact match only exact match only OF 1.2+ and OVS 1.7+ 和802.1Q報文的優先級相關
vlan_tci 16位 十六進制 支持任意位俺碼 Ethernet 讀/寫 exact match only exact match only OVS 1.1+ 覆蓋了VLAN ID和優先級的匹配

字段詳解

VLAN相關字段主要是對802.1Q VLAN header進行解析得到,該header的格式如下:
圖1 802.1Q VLAN header
該報文頭包括了2個16bit的部分,這兩個部分分別被稱爲TPID(Tag Protocol IDentifier)和TCI(Tag Control Information),對於OVS來說,只支持0x8100的Ethertype,所以前面16位TPID是固定的。剩下的TCI又包括3部分:

  • PCP (Priority Control Point):3位大小的優先級,即0~7(從低到高)。當交換機/路由器發生傳輸擁塞時,優先發送優先級高的數據幀。
  • CFI(Canonical Format Indicator):長度爲1bit,表示MAC地址是否是經典格式。CFI爲0說明是經典格式,CFI爲1表示爲非經典格式。該字段用於區分以太網幀、FDDI幀和令牌環網幀,在以太網幀中,CFI取值爲0。而實際上在OVS和OpenFlow中,都不會匹配這個位,直接忽略。
  • VID(VLAN ID):長度爲12bit,取值範圍是0~4095,其中0表示該幀不屬於任何一個VLAN,而4095是保留值,不能給用戶使用,所以實際可用的VLAN ID一共爲4094個(1 ~ 4094)。

vlan_tci

爲什麼叫vlan_tci呢,顧名思義,就是和802.1Q VLAN報文頭的TCI相關的字段啦。我們來仔細看看這個OVS的字段:
TCI
NXM(Nicira Extended Match)是Open vSwitch 1.1中對OpenFlow 1.0引入的擴展。這個字段比其他幾個VLAN字段(如dl_vlan、dl_vlan_pcp)提供了更強大的匹配能力。當數據包沒有802.1Q報文頭時,這個字段的值是0;當數據包帶有802.1Q報文頭時,這個字段的P位爲1。以下用幾個例子來做示例:

  • vlan_tci=0:表示匹配不帶802.1Q報文頭的數據包
  • vlan_tci=0x1000/0x1000:0x1000展開就是0001 0000 0000 0000,P位是1表示匹配帶有802.1Q報文頭的數據包,掩碼0x1000表示忽略PCP和VID,因此該條件表示匹配帶有802.1Q報文頭,任意優先級和任意VLAN ID的數據包
  • vlan_tci=0xf123:0xf123展開就是1111 0001 0010 0011,111=7、0001 0010 0011=291,故該條件表示匹配優先級爲7,VLAN ID爲291的數據包

vlan_vid

該字段和802.1Q報文頭的CFI和VID相關。格式如下:
VID
當P爲0時,表示匹配不帶802.1Q報文頭的數據包,否則後12位表示匹配數據包的VLAN ID。僅用到後13位,前3位固定爲0。以下用幾個例子來作爲示例:

  • vlan_vid=*:表示匹配所有不帶802.1Q報文頭和帶802.1Q報文頭的數據包,此時vlan_pcp字段無效
  • vlan_vid=0x0000/0xffff:匹配不帶802.1Q報文頭的數據包
  • vlan_vid=0x1000/0x1000:匹配所有帶802.1Q報文頭,且任意VLAN ID的數據包
  • vlan_vid=0x1009:匹配帶802.1Q報文頭,且VLAN ID爲9的數據包

vlan_pcp

該字段和802.1Q VLAN報文頭的PCP相關,表示該數據包的優先級。vlan_pcp的格式如下:
PCP
vlan_pcp佔用一個字節(8位),但只使用到後3位,前5位固定爲0。該字段只在vlan_vid不爲通配符和0時有效。

dl_vlan/dl_vlan_pcp

這兩個字段是在OpenFlow 1.0開始就存在的(其它幾個都是在1.0之後定義的),dl_vlan表示VLAN ID,dl_vlan_pcp表示優先級。這兩個字段的定義非常迷,在OpenFlow 1.0中,有以下規則:

  • 這兩個字段都爲通配符時,匹配所有不帶802.1Q報文頭和帶802.1Q報文頭的數據包
  • dl_vlan=0xffff時,匹配不帶802.1Q報文頭的數據包,此時dl_vlan_pcp應該爲*,因爲不帶802.1Q報文頭的數據包沒有PCP,但OpenFlow沒有強制它這麼做,也沒有說明當dl_vlan_pcp不爲*時要怎樣,所以Open vSwitch就直接把dl_vlan_pcp忽略了
  • 如果不是以上兩種情況,則匹配帶有802.1Q報文頭的數據包。
    dl_vlan只會用到16位中的後12位,dl_vlan_pcp只會用到8位中的後3位,但OpenFlow沒有說明不用的哪些位的值要怎麼設置,Open vSwitch則直接把這些位忽略。

在OpenFlow 1.1時,對這兩個字段進行了改進,當dl_vlan=0xfffe匹配帶802.1Q報文頭的任意VLAN ID的數據包。(在OpenFlow 1,0中匹配不了這種場景,但此時VLAN ID 4094就不能用了)
我們可以看到這兩個字段用起來真的是很複雜,也許這就是爲什麼在之後又出現了其它3個字段。看完這些字段,你會發現vlan_tci真的是簡單好用啊╮(・o・)╭

參考資料:

  1. ovs-fields
  2. 802.1Q幀格式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章