字段概覽
字段名 | 長度 | 格式 | 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的格式如下:
該報文頭包括了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的字段:
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相關。格式如下:
當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的格式如下:
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・)╭
參考資料: