8.通用流API
8.1.概述
此API提供了一種通用的方式來配置硬件以匹配特定的Ingress或Egress流量,根據(jù)用戶的任何配置規(guī)則更改其操作或查詢相關(guān)計(jì)數(shù)器。
所有API帶有 rte_flow前綴,在文件 rte_flow.h 中定義。
- 可以對(duì)報(bào)文數(shù)據(jù)(如協(xié)議頭部,載荷)及報(bào)文屬性(如關(guān)聯(lián)的物理端口,虛擬設(shè)備ID等)執(zhí)行匹配。
- 可能的操作包括丟棄流量,將流量轉(zhuǎn)移到特定隊(duì)列、虛擬/物理設(shè)備或端口,執(zhí)行隧道解封、添加標(biāo)記等操作。
它比其涵蓋和替代(包括所有功能和過濾類型)的傳統(tǒng)過濾框架層次更高,以便發(fā)布所有輪詢模式驅(qū)動(dòng)程序(PMD)明確行為的通用操作接口。
遷移現(xiàn)有應(yīng)用程序的幾種方法在API遷移中有描述。
8.2.流規(guī)則
8.2.1.描述
流規(guī)則是具有匹配模式的屬性和動(dòng)作列表的組合。流規(guī)則構(gòu)成了此API的基礎(chǔ)。
一個(gè)流規(guī)則可以具有幾個(gè)不同的動(dòng)作(如在將數(shù)據(jù)重定向到特定隊(duì)列之前執(zhí)行計(jì)數(shù),封裝,解封裝等操作),而不是依靠幾個(gè)規(guī)則來實(shí)現(xiàn)這些動(dòng)作,并且通過應(yīng)用程序操作具體的硬件實(shí)現(xiàn)細(xì)節(jié)來順序執(zhí)行這些規(guī)則。
API提供了基于規(guī)則的不同優(yōu)先級(jí)支持,例如,當(dāng)報(bào)文匹配兩個(gè)規(guī)則時(shí),強(qiáng)制先執(zhí)行特定規(guī)則。然而,硬件是否支持多個(gè)優(yōu)先級(jí)并不能保證。即使硬件支持,可用優(yōu)先級(jí)的數(shù)量通常也較低,這也是為什么還需要通過PMDs在軟件中實(shí)現(xiàn)(如通過重新排序規(guī)則可以模擬缺失的優(yōu)先級(jí))。
為了盡可能保持與硬件無關(guān),默認(rèn)情況下所有規(guī)則都被認(rèn)為具有相同的優(yōu)先級(jí),這意味著重疊規(guī)則(當(dāng)數(shù)據(jù)包被多個(gè)過濾器匹配時(shí))之間的順序是未定義的,不能保證誰先執(zhí)行。
當(dāng)給定一個(gè)優(yōu)先級(jí)時(shí),PMD如果能夠檢測(cè)到的話(例如,如果模式匹配現(xiàn)有過濾器),可能會(huì)拒絕在此優(yōu)先級(jí)下創(chuàng)建重疊規(guī)則。
因此,對(duì)于給定的優(yōu)先級(jí),可預(yù)測(cè)的結(jié)果只能通過非重疊規(guī)則來實(shí)現(xiàn),在所有協(xié)議層上使用完全匹配。
流規(guī)則也可以分組,流規(guī)則的優(yōu)先級(jí)特定于它們所屬的組。因此,給定組中的所有流規(guī)則在另一個(gè)流規(guī)則組所有規(guī)則之前或之后。
根據(jù)規(guī)則支持多個(gè)操作可以在非默認(rèn)硬件優(yōu)先級(jí)之前內(nèi)部實(shí)現(xiàn),因此兩個(gè)功能可能不能同時(shí)應(yīng)用于應(yīng)用程序。????
考慮到允許的模式/動(dòng)作組合不能提前知道,并且將導(dǎo)致不切實(shí)際地大量的暴露能力,提供了從當(dāng)前設(shè)備配置狀態(tài)驗(yàn)證給定規(guī)則的方法。這樣,在啟動(dòng)數(shù)據(jù)路徑之前,應(yīng)用程序可以檢查在初始化時(shí)是否支持所需的規(guī)則類型。該方法可以隨時(shí)使用,其唯一要求是應(yīng)該存在規(guī)則所需的資源(例如,應(yīng)首先配置目標(biāo)RX隊(duì)列)。
每個(gè)定義的規(guī)則與由PMD管理的不透明句柄相關(guān)聯(lián),應(yīng)用程序負(fù)責(zé)維護(hù)它。這些句柄可用于查詢和規(guī)則管理,例如檢索計(jì)數(shù)器或其他數(shù)據(jù)并銷毀它們。為了避免PMD方面的資源泄漏,在釋放相關(guān)資源(如隊(duì)列和端口)之前,應(yīng)用程序必須顯式地銷毀句柄。
以下小節(jié)覆蓋如下內(nèi)容:
- 屬性(由struct rte_flow_attr表示):流規(guī)則的屬性,例如其方向(Ingress或Egress)和優(yōu)先級(jí)。
- 模式條目(由struct rte_flow_item表示):匹配模式的一部分,匹配特定的數(shù)據(jù)包數(shù)據(jù)或流量屬性。也可以描述模式本身屬性,如反向匹配。
- 匹配模式:要查找的流量屬性,組合任意的模式。
- 動(dòng)作(由struct rte_flow_action表示):每當(dāng)數(shù)據(jù)包被模式匹配時(shí)執(zhí)行的操作。
8.2.2.屬性
8.2.2.1.Group
流規(guī)則可以通過為其分配一個(gè)公共的組號(hào)來分組。較低的值具有較高的優(yōu)先級(jí)。組0具有最高優(yōu)先級(jí)。
雖然是可選的,但是建議應(yīng)用程序盡可能將類似的規(guī)則分組,以充分利用硬件功能(例如,優(yōu)化的匹配)并解決限制(例如,給定組中可能只允許單個(gè)模式類型)。
請(qǐng)注意,并不保證支持多個(gè)組。
8.2.2.2.Priority
可以將優(yōu)先級(jí)分配給流規(guī)則。像Group一樣,較低的值表示較高的優(yōu)先級(jí),0為最大值。
具有優(yōu)先級(jí)0的Group 8流規(guī)則,總是在Group 0優(yōu)先級(jí)8的優(yōu)先級(jí)之后才匹配(Group的優(yōu)先級(jí)先得到保證)。
組和優(yōu)先級(jí)是任意的,取決于應(yīng)用程序,它們不需要是連續(xù)的,也不需要從0開始,但是最大數(shù)量因設(shè)備而異,并且可能受到現(xiàn)有流規(guī)則的影響。
如果某個(gè)報(bào)文在給定的優(yōu)先級(jí)和Group中被幾個(gè)規(guī)則匹配,那么結(jié)果是未定義的。 它可以采取任何路徑,可能重復(fù),甚至導(dǎo)致不可恢復(fù)的錯(cuò)誤。
請(qǐng)注意,不保證能支持超過一個(gè)優(yōu)先級(jí)。
8.2.2.3.Traffic direction
流量規(guī)則可以應(yīng)用于入站和/或出站流量(Ingress/Egress)。
多個(gè)模式條目和操作都是有效的,可以在兩個(gè)方向中使用。但是必須至少指定一個(gè)方向。
不推薦對(duì)給定規(guī)則一次指定兩個(gè)方向,但在少數(shù)情況下可能是有效的(例如共享計(jì)數(shù)器)。
8.2.3.模式條目
模式條目分成兩類:
- 匹配協(xié)議頭部及報(bào)文數(shù)據(jù)(ANY,RAW,ETH,VLAN,IPV4,IPV6,ICMP,UDP,TCP,SCTP,VXLAN,MPLS,GRE等等),通常關(guān)聯(lián)一個(gè)規(guī)范結(jié)構(gòu)。
- 匹配元數(shù)據(jù)或影響模式處理(END,VOID,INVERT,PF,VF,PORT等等),通常沒有規(guī)范結(jié)構(gòu)。
條目規(guī)范結(jié)構(gòu)用于匹配協(xié)議字段(或項(xiàng)目屬性)中的特定值。文檔描述每個(gè)條目是否與一個(gè)條目及其類型名稱相關(guān)聯(lián)。
可以為給定的條目最多設(shè)置三個(gè)相同類型的結(jié)構(gòu):
- Spec: 要匹配的數(shù)值(如IPv4地址)。
- Last:規(guī)格中的相應(yīng)字段的范圍上限。
- Mask:應(yīng)用于spec和last的位掩碼(如匹配IPv4地址的前綴)。
使用限制和期望行為:
- 沒有spec就設(shè)置mask和last是錯(cuò)誤的。
- 錯(cuò)誤值如0或者等于spce中相應(yīng)值的last字段將被忽略,他們不產(chǎn)生范圍。不支持低于spce的非0值。
- 設(shè)置spce和可選的last,而不設(shè)置mask會(huì)導(dǎo)致PMD使用該條目定義的默認(rèn)mask(定義為rte_flow_item_{name}_mask常量)。
- 不設(shè)置任何值(如果支持)相當(dāng)于提供空掩碼的廣泛匹配。
- 掩碼是用于spec和last的簡(jiǎn)單位掩碼,如果不小心使用,可能會(huì)產(chǎn)生意想不到的結(jié)果。例如,對(duì)于IPv4地址字段,spec提供10.1.2.3,last提供10.3.4.5,掩碼為255.255.0.0,有效范圍為10.1.0.0~10.3.255.255。
匹配以太網(wǎng)頭部的條目示例:
Table 8.1 Ethernet item
Field | Subfield | Value |
---|---|---|
Spec | Src | 00:01:02:03:04 |
Dst | 02:2a:66:00:01 | |
Type | 0x22aa | |
last | Unspecified | |
mask | Src | 00:ff:ff:ff:00 |
Dst | 00:00:00:00:ff | |
Type | 0x0000 |
無掩碼的位表示任意的值(如下面顯示的?),根據(jù)上面的條目,具有如下的屬性以太頭部的報(bào)文將被匹配:
- src:??:01:02:03:??
- dst:??:??:??:??:01
- type:0x????
8.2.4.匹配模式
通過堆疊方式從最底層協(xié)議開始匹配條目的方式形成模式。這種堆疊限制不適用于那些可以放在任意位置,但是不影響匹配結(jié)構(gòu)的元條目。
模式由END條目終結(jié)。
例子:
Table 8.2 TCPv4 as L4
Index | Item |
---|---|
0 | Ethernet |
1 | IPv4 |
2 | TCP |
3 | END |
Table 8.3 TCPv6 in VXLAN
Index | Item |
---|---|
0 | Ethernet |
1 | IPv4 |
2 | UDP |
3 | VXLAN |
4 | Ethernet |
5 | IPv6 |
6 | TCP |
7 | END |
Table 8.4 TCPv4 as L4 with meta items
Index | Item |
---|---|
0 | VOID |
1 | Ethernet |
2 | VOID |
3 | IPv4 |
4 | TCP |
5 | VOID |
6 | VOID |
7 | END |
這個(gè)例子顯示了元條目如何不影響匹配結(jié)果,只要他們保持堆疊正確。這個(gè)例子得到的匹配結(jié)果與模式“TCPv4 as L4”相同。
Table 8.5 UDPv6 anywhere
Index | Item |
---|---|
0 | IPv6 |
1 | UDP |
2 | END |
假如PMD支持,如上述例子,缺少Ethernet規(guī)范,忽略堆棧底部的一個(gè)或多個(gè)協(xié)議層,也可以匹配數(shù)據(jù)包總的任意指定位置。
Table 8.6 Invalid, missing L3
Index | Item |
---|---|
0 | Ethernet |
1 | UDP |
2 | END |
由于L2(以太網(wǎng))和L4(UDP)之間的L3規(guī)范缺失,上述模式無效。也就是說,只允許在堆疊的底部或頂部忽略協(xié)議層。
8.2.5.元條目類型
元條目只匹配元數(shù)據(jù)或影響模式處理過程,而不是直接匹配數(shù)據(jù)包數(shù)據(jù),一般不需要規(guī)范結(jié)構(gòu)。這種特殊性允許他們?cè)诙褩V械娜魏挝恢?,而不?huì)對(duì)匹配結(jié)果造成影響。
8.2.5.1.END條目
條目列表的結(jié)束標(biāo)記。阻止進(jìn)一步處理?xiàng)l目,從而結(jié)束模式匹配。
- 為了方便起見,其數(shù)值為0。
- PMD必須強(qiáng)制支持這個(gè)條目。
- 忽略spec、last、mask域。
Table 8.7 END
Field | Value |
---|---|
spec | Ignored |
last | Ignored |
mask | Ignored |
8.2.5.2.VOID條目
方便起見,用作占位符,被PMD忽略并簡(jiǎn)單丟棄,跳過不處理。
- PMD必須強(qiáng)制支持這個(gè)條目。
- 忽略spec、last、mask域。
Table 8.8 VOID
Field | Value |
---|---|
spec | Ignored |
last | Ignored |
mask | Ignored |
此類型條目的一個(gè)使用情景是快速生成共享共用前綴的規(guī)則,而無需重新分配內(nèi)存,僅需要更新條目類型。
Table 8.9 TCP, UDP or ICMP as L4
Field | Item | ||
---|---|---|---|
0 | Ethernet | ||
1 | IPv4 | ||
2 | UDP | VOID | VOID |
3 | VOID | TCP | VOID |
4 | VOID | VOID | ICMP |
5 | END |
8.2.5.3.INVERT條目
反向匹配,即與模式不匹配的數(shù)據(jù)包的處理。
- 忽略spec、last、mask域。
Table 8.10 INVERT
Field | Value |
---|---|
spec | ignored |
last | Ignored |
mask | Ignored |
下面的使用場(chǎng)景,匹配非TCPv4的報(bào)文:
Table 8.11 Anything but TCPv4
Index | Item |
---|---|
0 | INVERT |
1 | Ethernet |
2 | IPv4 |
3 | TCP |
4 | END |
8.2.5.4.PF條目
匹配尋址到設(shè)備物理功能的數(shù)據(jù)包。
如果底層設(shè)備功能與正常接收到匹配流量的功能不同,則指定此項(xiàng)可防止報(bào)文到達(dá)該設(shè)備,除非流規(guī)則包含Action: PF。默認(rèn)情況下,設(shè)備實(shí)例之間的數(shù)據(jù)包不會(huì)重復(fù)。
- 如果條目應(yīng)用于VF設(shè)備,可能返回錯(cuò)誤或不匹配任何流量。
- 可以和任意數(shù)據(jù)的條目組合:VF組合以匹配PF或者VF流量。
- spec、last、mask不能設(shè)置。
Table 8.12 PF
Field | Value |
---|---|
spec | unset |
last | unset |
mask | unset |
8.2.5.5.VF條目
匹配尋址到設(shè)備虛擬功能ID的數(shù)據(jù)包。
如果底層設(shè)備功能與正常接收匹配流量的功能不同,則指定此項(xiàng)可防止報(bào)文到達(dá)該設(shè)備,除非流規(guī)則包含Action:VF。默認(rèn)情況下,設(shè)備實(shí)例之間的數(shù)據(jù)包不會(huì)重復(fù)。
- 如果這導(dǎo)致VF設(shè)備匹配到不同VF的流量,則可能返回錯(cuò)誤或不匹配任何流量。
- 可以指定多次以匹配尋址到多個(gè)VF ID的流量。
- 可以與PF項(xiàng)目組合以匹配PF和VF流量。
- 默認(rèn)掩碼匹配任何VF ID。
Table 8.13 VF
Field | Subfield | Value |
---|---|---|
spec | Id | destination VF ID |
last | Id | upper range value |
mask | id | zeroed to match any VF ID |
8.2.5.6.PORT條目
匹配來自指定底層設(shè)備物理端口的數(shù)據(jù)包。
第一個(gè)PORT條目覆蓋的物理端口通常與指定的DPDK輸入端口(port_id)相關(guān)聯(lián)。該條目可以提供多次以匹配其他物理端口。
請(qǐng)注意,當(dāng)這些端口不在DPDK控制下時(shí),物理端口不一定與DPDK輸入端口(port_id)綁定。 可能的值是特定于每個(gè)設(shè)備,它們不一定從零開始,并且可能不是連續(xù)的。
作為設(shè)備屬性,可以通過其他方式檢索允許的值列表以及與port_id關(guān)聯(lián)的值。
Table 8.14 PORT
Field | Subfield | Value |
---|---|---|
spec | index | destination port index |
last | index | upper range value |
mask | index | zeroed to match any port index |
8.2.6.數(shù)據(jù)匹配條目類型
大多數(shù)的數(shù)據(jù)匹配條目是具有位掩碼的基本協(xié)議頭部定義。必須從最底層到最高層協(xié)議指定(堆疊方式)以形成匹配模式。
下面的描述并不詳盡,將來會(huì)添加新的協(xié)議。
8.2.6.1.ANY
匹配當(dāng)前層的任何協(xié)議,單個(gè)ANY也可以代表多個(gè)協(xié)議層。
當(dāng)在數(shù)據(jù)包中的任意位置尋找協(xié)議時(shí),通常將其指定為第一個(gè)模式條目。
- 默認(rèn)掩碼匹配任何數(shù)目的協(xié)議層。
Table 8.15 ANY
Field | Subfield | Value |
---|---|---|
spec | num | 覆蓋的層數(shù) |
last | num | 最大范圍 |
mask | num | 匹配任意層數(shù) |
例如VXLAN TCP負(fù)載外部L3(IPv4或IPv6)及L4(UDP)使用第一個(gè)ANY來匹配,內(nèi)部L3(IPv4或IPv6)用第二個(gè)ANY來匹配:
Table 8.16 TCP in VXLAN with wildcards
Index | Item | Field | Subfield | Value |
---|---|---|---|---|
0 | Ethernet | |||
1 | ANY | Spec | Num | 2 |
2 | VXLAN | |||
3 | Ethernet | |||
4 | ANY | Spec | Num | 1 |
5 | TCP | |||
6 | END |
8.2.6.2.RAW
匹配指定偏移量下指定長度的字節(jié)串。
偏移量可以是是絕對(duì)偏移(使用數(shù)據(jù)包開始)或者相對(duì)于堆棧中先前匹配項(xiàng)的結(jié)尾,相對(duì)偏移量允許為負(fù)值。
如果啟用搜索,則使用偏移量作為起點(diǎn)。搜索區(qū)域可以通過將限制設(shè)置為非零值來定界,該值可以是可以開始模式的偏移量后的最大字節(jié)數(shù)。
允許匹配0長度,這樣做會(huì)重置后續(xù)項(xiàng)目的相對(duì)偏移量。
- 這個(gè)條目不支持區(qū)間(last)。
- 默認(rèn)的掩碼精確匹配所有字段。
Table 8.17 RAW
Field | Subfield | Value |
---|---|---|
spec | relative | 上一個(gè)條目之后的搜索模式 |
search | 搜索模式 | |
reserved | 預(yù)留,必須為0 | |
offset | 絕對(duì)/相對(duì)偏移量 | |
limit | 搜索區(qū)域限制 | |
length | 模式長度 | |
pattern | 要匹配的字節(jié)串 | |
last | 如果指定,必須全0或者與spec相等 | |
mask | 應(yīng)用于spec |
使用組合的RAW條目在UDP有效載荷的各種偏移量下查找?guī)讉€(gè)字符串的示例模式:
Index | Item | Field | Subfield | Value |
---|---|---|---|---|
0 | Ethernet | |||
1 | IPv4 | |||
2 | UDP | |||
3 | RAW | spec | relative | 1 |
search | 1 | |||
offset | 10 | |||
limit | 0 | |||
length | 3 | |||
pattern | “foo” | |||
4 | RAW | spec | relative | 1 |
search | 0 | |||
offset | 20 | |||
limit | 0 | |||
length | 3 | |||
pattern | “bar” | |||
5 | RAW | spec | relative | 1 |
search | 0 | |||
offset | -29 | |||
limit | 0 | |||
length | 3 | |||
pattern | “baz” | |||
6 | END |
含義如下:
- 在UDP有效載荷內(nèi)偏移10個(gè)自己的地方匹配“foo”。
- 在“foo”之后20個(gè)字節(jié)的地方匹配“bar”。
- 在“bar”向后退29字節(jié)的地方匹配“baz”。
滿足這樣條件的報(bào)文可以表示為如下:
0 >= 10 B == 20 B
| |<--------->| |<--------->|
| | | | |
|-----|------|-----|-----|-----|-----|-----------|-----|------|
| ETH | IPv4 | UDP | ... | baz | foo | ......... | bar | .... |
|-----|------|-----|-----|-----|-----|-----------|-----|------|
| |
|<--------------------------->|
== 29 B
注意,匹配模式后續(xù)條目將在”baz”之后恢復(fù),而不是“bar”,因?yàn)榭偸窃诙褩5南惹绊?xiàng)之后執(zhí)行匹配。
8.2.6.3.ETH
匹配以太頭部。
- dst:目的MAC。
- src:源MAC。
- type:EtherType。
- 默認(rèn)掩碼僅匹配源MAC和目的MAC。
8.2.6.4.VLAN
匹配802.1Q/ad VLAN tag。
- tpid:標(biāo)簽協(xié)議標(biāo)識(shí)符。
- tci:標(biāo)簽控制信息。
- 默認(rèn)掩碼僅匹配tci。
8.2.6.5.IPv4
匹配IPv4頭部。注意,IPv4選項(xiàng)由專用模式條目處理。
- hdr:IPv4頭部定義(ret_ip.h)。
- 默認(rèn)掩碼僅匹配源和目的IP地址。
8.2.6.6.IPv6
匹配IPv6頭部。注意,IPv6選項(xiàng)由專用模式條目處理。
- hdr:IPv6頭部定義(ret_ip.h)。
- 默認(rèn)掩碼僅匹配源和目的IPv6地址。
8.2.6.7.ICMP
匹配ICMP頭部。
- hdr:ICMP頭部定義(ret_icmp.h)。
- 默認(rèn)掩碼僅匹配ICMP類型及代碼。
8.2.6.8.UDP
匹配UDP頭部。
- hdr:UDP頭部定義(ret_udp.h)。
- 默認(rèn)掩碼僅匹配源端口和目的端口。
8.2.6.9.TCP
匹配TCP頭部。
- hdr:UDP頭部定義(ret_tcp.h)。
- 默認(rèn)掩碼僅匹配源端口和目的端口。
8.2.6.10.SCTP
匹配SCTP頭部。
- hdr:UDP頭部定義(ret_sctp.h)。
- 默認(rèn)掩碼僅匹配源端口和目的端口。
8.2.6.11.VXLAN
匹配VXLAN頭部(RFC 7348)。
- flags:通常是0x80。
- rsvd0:預(yù)留,通常為0x00000。
- vni:VXLAN網(wǎng)絡(luò)標(biāo)識(shí)符。
- rsvd1:預(yù)留,通常為0x00。
- 默認(rèn)掩碼僅匹配vni。
8.2.6.12.E_TAG
匹配IEEE 802.1BR E-Tag。
- tpid:標(biāo)簽協(xié)議標(biāo)識(shí)符,通常是0x893F。
- epcp_edei_in_ecid_b:E-TAG控制信息(E-TCI),E-PCB(3b),E-DEI(1b),ingress E-CDI base(12b)。
- rsvd_grp_ecid_b:reserver(2b),GRP(2b),C-CID base(12b)。
- in_ecid_e:ingress E-CID ext。
- ecid_e:E-CID ext。
- 默認(rèn)掩碼同時(shí)匹配GRP和E-CID base。
8.2.6.13.NVGRE
匹配NVGRE頭部(RFC7637)。
- c_k_s_rsvd0_ver:checksum(1b),key bit(1b),seq number(1b),reserved 0(9b),version(3b)。根據(jù)RFC7637,這個(gè)字段必須是0x2000。
- protocol:協(xié)議類型0x6558.
- tni:虛擬子網(wǎng)ID。
- flow_id:流ID。
- 默認(rèn)掩碼只匹配TNI。
8.2.6.14.MPLS
匹配MPLS頭部。
- label_tc_s_ttl:label,TC,Bottom of stack及ttl。
- 默認(rèn)掩碼只匹配label。
8.2.6.15.GRE
匹配GRE頭部。
- c_rsvd0_ver:checksum,rsvd0,version。
- protocol:協(xié)議類型。
- 默認(rèn)掩碼只匹配協(xié)議類型。
8.2.7.動(dòng)作
每個(gè)可能的動(dòng)作都由一個(gè)類型來表示。一些動(dòng)作具有相關(guān)的配置結(jié)構(gòu)。列表中組合的幾個(gè)操作可能會(huì)影響流規(guī)則。列表并不有序。
動(dòng)作分成以下三種:
- 終結(jié)動(dòng)作(如QUEUE、DROP、RSS、PF、VF),防止后續(xù)流程處理匹配的數(shù)據(jù)包,除非動(dòng)作被PASSTHRU覆蓋。
- 非終結(jié)動(dòng)作(如PASSTHRU、DUP),將匹配的數(shù)據(jù)包保留以便后續(xù)的流程規(guī)則進(jìn)行額外的處理。
- 非終結(jié)元?jiǎng)幼鳎‥ND、VOID、MARK、FLAG、COUNT)等不會(huì)影響數(shù)據(jù)包最終結(jié)果的動(dòng)作。
當(dāng)流規(guī)則中組合了多個(gè)動(dòng)作時(shí),他們應(yīng)該具有不同的類型(如丟棄數(shù)據(jù)包兩次是不可能的)。相同類型的動(dòng)作,只有最后一個(gè)會(huì)被考慮到,但是PMD仍然在動(dòng)作鏈表中執(zhí)行錯(cuò)誤檢查。
類似于匹配模式,動(dòng)作鏈表被END條目終結(jié)。注意,只有PASSTHUR才能覆蓋終結(jié)規(guī)則。
下面實(shí)例為將數(shù)據(jù)包重定向到隊(duì)列索引為10的隊(duì)列:
Table 8.18 Queue action
Field | Value |
---|---|
index | 10 |
動(dòng)作列表示例,其順序不重要,應(yīng)用程序必須考慮同時(shí)執(zhí)行所有的動(dòng)作:
Table 8.19 Count and drop
Field | Action |
---|---|
0 | COUNT |
1 | DROP |
2 | END |
Table 8.20 Mark, count and redirect
Index | Action | Field | Valie |
---|---|---|---|
0 | MARK | make | 0x2a |
1 | COUNT | ||
2 | QUEUE | queue | 10 |
3 | END |
Index | Action | Field | Valie |
---|---|---|---|
0 | Drop | ||
1 | QUEUE | queue | 5 |
2 | END |
Table 8.21 Redirect to queue 5
Index | Action | Field | Valie |
---|---|---|---|
0 | Drop | ||
1 | QUEUE | queue | 5 |
2 | END |
在上例中,考慮到同時(shí)執(zhí)行這兩個(gè)動(dòng)作,最終的結(jié)果只有QUEUE有效果。
Table 8.22 Redirect to queue 3
Index | Action | Field | Valie |
---|---|---|---|
0 | QUEUE | queue | 5 |
1 | VOID | ||
2 | QUEUE | queue | 3 |
3 | END |
如前所述,僅考慮列表中相同類型的最后一個(gè)動(dòng)作。這個(gè)例子也顯示了VIOD被忽略。
8.2.8.動(dòng)作類型
通用動(dòng)作類型將在本節(jié)描述。與模式條目類型一樣,這個(gè)列表并不完全,后續(xù)將添加新的動(dòng)作類型。
8.2.8.1.END
END標(biāo)記動(dòng)作列表結(jié)束,防止進(jìn)一步處理動(dòng)作。
- 方便起見,其數(shù)值為0。
- PMD需要強(qiáng)制支持。
- 不配置任何屬性。
Table 8.23 END
Field |
---|
no properties |
8.2.8.2.VOID
方便起見,用作占位符。它被PMD簡(jiǎn)單的忽略處理。
- PMD需要強(qiáng)制支持。
- 不配置任何屬性。
Table 8.24 VOID
Field |
---|
no properties |
8.2.8.3.PASSTHUR
將報(bào)文留給后續(xù)流規(guī)則進(jìn)行額外的處理。當(dāng)流規(guī)則不包含終結(jié)動(dòng)作時(shí),這個(gè)操作時(shí)默認(rèn)的,當(dāng)時(shí)可以指定強(qiáng)制規(guī)則變?yōu)榉墙K止。
- 不配置任何屬性。
Table 8.25 PASSTHRU
Field | |
---|---|
no properties | s |
Index | Action | Field | Valie |
---|---|---|---|
0 | PASSTHUR | ||
1 | QUEUE | queue | 8 |
2 | END |
將數(shù)據(jù)包復(fù)制到隊(duì)列并按照后續(xù)流規(guī)則繼續(xù)處理的示例:
Table 8.26 Copy to queue 8
Index | Action | Field | Valie |
---|---|---|---|
0 | PASSTHUR | ||
1 | QUEUE | queue | 8 |
2 | END |
8.2.8.4.MARK
將一個(gè)整形數(shù)值附加到數(shù)據(jù)包并設(shè)置PKT_RX_FDIR和PKT_RX_FDIR_ID mbuf標(biāo)志。
該值的意義可以由應(yīng)用程序任意指定。最大允許值取決于底層實(shí)現(xiàn)。它在hash.fdir.hi mbuf字段中返回。
Table 8.27 MARK
Field | Value |
---|---|
id | 數(shù)據(jù)包返回的整形數(shù)值 |
8.2.8.5.FLAG
標(biāo)記數(shù)據(jù)包。與MARK動(dòng)作類似,只是沒有特定值,只能設(shè)置PKT_RX_FDIR mbuf標(biāo)志。
Table 8.28 FLAG
Field |
---|
no properties |
8.2.8.6.QUEUE
將報(bào)文重定向到指定隊(duì)列。
- 默認(rèn)為終結(jié)動(dòng)作。
Table 8.29 QUEUE
Field | Value |
---|---|
index | 隊(duì)列索引 |
8.2.8.7.DROP
丟棄報(bào)文。
- 不配置任何屬性。
- 默認(rèn)為終結(jié)動(dòng)作。
- 如果指定, PASSTHUR可以覆蓋這個(gè)動(dòng)作。
Table 8.30 DROP
Field |
---|
no properties |
8.2.8.8.COUNT
在規(guī)則中使能計(jì)數(shù)器。
這些計(jì)數(shù)器可以通過rte_flow_query()檢索和重置,具體請(qǐng)參閱rte_flow_query_count結(jié)構(gòu)體描述。
- 計(jì)數(shù)器可以通過rte_flow_query()檢索。
- 不配置任何屬性。
Table 8.31 COUNT
Field |
---|
no properties |
檢索和重置流量規(guī)則計(jì)數(shù)器的查詢結(jié)構(gòu):
Table 8.32 COUNT query
Field | IO | Value |
---|---|---|
reset | in | 查詢之后重置計(jì)數(shù)器 |
hit_set | out | hits字段設(shè)置 |
bytes_set | out | bytes字段設(shè)置 |
hits | out | 此規(guī)則hit的次數(shù) |
bytes | out | 此規(guī)則經(jīng)過的bytes |
8.2.8.9.DUP
復(fù)制報(bào)文給指定的隊(duì)列。
這個(gè)動(dòng)作通常與QUEUE結(jié)合,但當(dāng)單獨(dú)使用時(shí),實(shí)際上類似于QUEUE+PASSTHUR。
- 默認(rèn)為非終結(jié)動(dòng)作。
Table 8.33 DUP
Field | Value |
---|---|
index | 隊(duì)列索引 |
8.2.8.10.RSS
與QUEUE類似,但是根據(jù)參數(shù)在數(shù)據(jù)包上額外執(zhí)行RSS以將他們擴(kuò)展到多個(gè)隊(duì)列中。
注意:RSS哈希結(jié)果存儲(chǔ)在hash.rss mbuf字段中,該字段與hash.fdir.lo重疊。由于MARK動(dòng)作僅設(shè)置hash.fdir.hi字段,因此可以同時(shí)查詢這兩個(gè)字段。
- 默認(rèn)為終結(jié)動(dòng)作。
Table 8.34 RSS
Field | Value |
---|---|
rss_conf | RSS參數(shù) |
num | Queue隊(duì)列中的數(shù)目 |
queue[] | 使用的Queue |
8.2.8.11.PF
將數(shù)據(jù)包重定向到當(dāng)前設(shè)備的物理功能(PF)。
- 不配置任何屬性。
- 默認(rèn)為終結(jié)動(dòng)作。
Table 8.35 PF
Field |
---|
no properties |
8.2.8.12.VF
將數(shù)據(jù)包重定向到當(dāng)前設(shè)備的虛擬功能(VF)。
由VF模式項(xiàng)匹配的數(shù)據(jù)包可以重定向到其原始VF ID而不是指定的VF ID。如果VF部分與先前的流規(guī)則相匹配,或者首先將數(shù)據(jù)包未發(fā)送到VF,則此參數(shù)可能不可用,并且不能保證其正常工作。
- 默認(rèn)為終結(jié)動(dòng)作。
Table 8.36 VF
Field | Value |
---|---|
original | 使用原始的VF ID |
vf | VF ID |
8.2.9.負(fù)數(shù)類型
所有指定的模式條目(枚舉rte_flow_item_type)和動(dòng)作條目(枚舉rte_flow_action_type)都使用正的標(biāo)識(shí)符。
負(fù)數(shù)空間用于在運(yùn)行期間由PMD生成的動(dòng)態(tài)類型。PMD可能會(huì)遇到他們,但不能接受他們不知道的負(fù)數(shù)標(biāo)識(shí)符。
生成負(fù)數(shù)類型的方法有待定義。
8.2.10.計(jì)劃擴(kuò)展類型
隨著新協(xié)議的實(shí)現(xiàn),將添加模式條目類型。
通過專用模式項(xiàng)支持變量頭,例如為了匹配特定的IPv4選項(xiàng),IPv6擴(kuò)展頭將在IPv4 / IPv6項(xiàng)目之后堆疊。
其他動(dòng)作類型已經(jīng)在計(jì)劃,但尚未定義。包括以多種方式改變分組數(shù)據(jù)的能力,例如執(zhí)行隧道報(bào)頭的封裝/解封裝等。
DPDK提供了一個(gè)極簡(jiǎn)的API用于所有的流規(guī)則管理。
每個(gè)創(chuàng)建的流規(guī)則都與PMD中不透明的句柄相關(guān)聯(lián),應(yīng)用程序負(fù)責(zé)維護(hù)它,直到流規(guī)則被刪除為止。
流規(guī)則由結(jié)構(gòu)體struct rte_flow對(duì)象表示。
8.2.11.驗(yàn)證
鑒于完全表達(dá)一組確定的設(shè)備功能是不實(shí)際的,因此,DPDK提供了專用的函數(shù)來檢查流規(guī)則是否被支持,并且可以被創(chuàng)建。
int rte_flow_validate(uint8_t port_id,
const struct rte_flow_attr *attr,
const struct rte_flow_item pattern[],
const struct rte_flow_action actions[],
struct rte_flow_error *error);
這個(gè)函數(shù)驗(yàn)證流規(guī)則是否正確,以及是否可以由設(shè)備給定的資源所接受。根據(jù)當(dāng)前設(shè)備模式和隊(duì)列配置檢查規(guī)則。還可以根據(jù)現(xiàn)有流規(guī)則和設(shè)備資源選擇性地驗(yàn)證規(guī)則。此函數(shù)對(duì)目標(biāo)設(shè)備無影響。
由于可能的沖突或資源限制,只要在同一時(shí)間沒有成功調(diào)用rte_flow_create()或者rte_flow_destroy(),并且沒有任何影響流規(guī)則的設(shè)備參數(shù)被修改,那么返回值可以保證有效。
參數(shù):
- port_id:以太設(shè)備端口標(biāo)識(shí)。
- attr:流規(guī)則屬性。
- pattern:指定模式(以END為結(jié)尾的鏈表)。
- actions:關(guān)聯(lián)動(dòng)作(以END為結(jié)尾的鏈表)。
- error:如果不為NULL,執(zhí)行詳細(xì)錯(cuò)誤報(bào)告。PMD初始化這個(gè)結(jié)構(gòu)以防止出錯(cuò)。
返回值:
- 如果流規(guī)則有效,并且可以被創(chuàng)建,那么返回0。否則返回一個(gè)負(fù)的error值,定義為如下。
- -ENOSYS:底層設(shè)備不支持此功能。
- -EINVAL:未知或無效的流規(guī)則。
- -ENOTSUP:有效但不支持的規(guī)則(例如不支持部分位掩碼)。
- EEXIST:與現(xiàn)有規(guī)則沖突。僅當(dāng)設(shè)備支持流規(guī)則沖突檢查并且存在流規(guī)則沖突時(shí)才返回這個(gè)值,如果不處理此返回值,則不能保證創(chuàng)建的流規(guī)則不會(huì)因?yàn)闆_突而失敗。
- ENOMEM:內(nèi)存不足,或者設(shè)備支持資源驗(yàn)證,但是設(shè)備上的資源有限制。
- -EBUSY:由于設(shè)備繁忙,無法執(zhí)行操作,如果受影響的隊(duì)列甚至整個(gè)端口處于停止?fàn)顟B(tài)(參考接口rte_eth_dev_rx_queue_stop()及rte_eth_dev_stop()),則可能會(huì)執(zhí)行。
8.2.12. 創(chuàng)建
創(chuàng)建流規(guī)則與驗(yàn)證流規(guī)則類型,除了實(shí)際創(chuàng)建規(guī)則并返回句柄。
struct rte_flow *
rte_flow_create(uint8_t port_id,
const struct rte_flow_attr *attr,
const struct rte_flow_item pattern[],
const struct rte_flow_action *actions[],
struct rte_flow_error *error);
參數(shù):
- port_id:以太設(shè)備端口標(biāo)識(shí)。
- attr:流規(guī)則屬性。
- pattern:指定模式(以END為結(jié)尾的鏈表)。
- actions:關(guān)聯(lián)動(dòng)作(以END為結(jié)尾的鏈表)。
- error:如果不為NULL,執(zhí)行詳細(xì)錯(cuò)誤報(bào)告。PMD初始化這個(gè)結(jié)構(gòu)以防止出錯(cuò)。
返回值:
在創(chuàng)建成功時(shí)返回一個(gè)有效的句柄,否則為NULL,并且rte_errno設(shè)置為rte_flow_vaildate()定義的錯(cuò)誤代碼的正值。
8.2.13. 銷毀
流規(guī)則的刪除不是自動(dòng)完成的,如果任何隊(duì)列或端口仍然引用他們,則不應(yīng)該釋放。應(yīng)用程序必須在釋放資源之前執(zhí)行此步驟。
int rte_flow_destroy(uint8_t port_id,
struct rte_flow *flow,
struct rte_flow_error *error);
當(dāng)其他流規(guī)則依賴于它時(shí),刪除流規(guī)則句柄可能會(huì)失敗,并且刪除操作可能會(huì)造成不一致的狀態(tài)。
如果句柄與創(chuàng)建順序相反的順序執(zhí)行銷毀,則可以保證成功。
參數(shù):
- port_id:以太設(shè)備端口標(biāo)識(shí)。
- flow:要銷毀的流規(guī)則。
- error:如果不為NULL,執(zhí)行詳細(xì)錯(cuò)誤報(bào)告。PMD初始化這個(gè)結(jié)構(gòu)以防止出錯(cuò)。
返回值:
- 成功返回0,失敗返回負(fù)值,且rte_errno被設(shè)置。
8.2.14. 清空
一個(gè)更加方便的功能,可以用于銷毀與port關(guān)聯(lián)的所有流規(guī)則。通過連續(xù)調(diào)用rte_flow_destory()來實(shí)現(xiàn)。
int
rte_flow_flush(uint8_t port_id,
struct rte_flow_error *error);
當(dāng)執(zhí)行失敗時(shí)(不太可能發(fā)生),流規(guī)則句柄仍然視為已經(jīng)銷毀,不再有效,但是端口必須處于不一致的狀態(tài)。
參數(shù):
- port_id:以太設(shè)備端口標(biāo)識(shí)。
- error:如果不為NULL,執(zhí)行詳細(xì)錯(cuò)誤報(bào)告。PMD初始化這個(gè)結(jié)構(gòu)以防止出錯(cuò)。
返回值:
- 成功返回0,失敗返回負(fù)值,且rte_errno被設(shè)置。
8.2.15.查詢
查詢一個(gè)存在的流規(guī)則。
此功能允許檢索特定于流的數(shù)據(jù),如計(jì)數(shù)器等。數(shù)據(jù)通過必須存在于流規(guī)則定義中的特殊操作來收集。
int
rte_flow_query(uint8_t port_id,
struct rte_flow *flow,
enum rte_flow_action_type action,
void *data,
struct rte_flow_error *error);
參數(shù):
- port_id:以太設(shè)備端口標(biāo)識(shí)。
- flow:要查詢的流規(guī)則句柄。
- actions:查詢的動(dòng)作類型。
- data:用于存儲(chǔ)相關(guān)查詢數(shù)據(jù)類型的指針
- error:如果不為NULL,執(zhí)行詳細(xì)錯(cuò)誤報(bào)告。PMD初始化這個(gè)結(jié)構(gòu)以防止出錯(cuò)。
返回值:
- 成功返回0,失敗返回負(fù)值,且rte_errno被設(shè)置。
8.3. 詳細(xì)錯(cuò)誤報(bào)告
對(duì)于想要調(diào)查與流規(guī)則管理有關(guān)的問題的用戶或應(yīng)用程序開發(fā)人員,定義的錯(cuò)誤值可能不夠詳細(xì)。為此目的定義了專門的錯(cuò)誤對(duì)象:
enum rte_flow_error_type {
RTE_FLOW_ERROR_TYPE_NONE, /**< No error. */
RTE_FLOW_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
RTE_FLOW_ERROR_TYPE_HANDLE, /**< Flow rule (handle). */
RTE_FLOW_ERROR_TYPE_ATTR_GROUP, /**< Group field. */
RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, /**< Priority field. */
RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, /**< Ingress field. */
RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, /**< Egress field. */
RTE_FLOW_ERROR_TYPE_ATTR, /**< Attributes structure. */
RTE_FLOW_ERROR_TYPE_ITEM_NUM, /**< Pattern length. */
RTE_FLOW_ERROR_TYPE_ITEM, /**< Specific pattern item. */
RTE_FLOW_ERROR_TYPE_ACTION_NUM, /**< Number of actions. */
RTE_FLOW_ERROR_TYPE_ACTION, /**< Specific action. */
};
struct rte_flow_error {
enum rte_flow_error_type type; /**< Cause field and error types. */
const void *cause; /**< Object responsible for the error. */
const char *message; /**< Human-readable error message. */
};
錯(cuò)誤類型RTE_FLOW_ERROR_TYPE_NONE代表無錯(cuò)誤,在這種情況下可以忽略其他字段。其他錯(cuò)誤類型描述了由cause指向的對(duì)象類型。
如果cause不為NULL,cause指向的對(duì)象用于描述錯(cuò)誤。對(duì)于一個(gè)流規(guī)則,這個(gè)對(duì)象可能是個(gè)模式條目或單個(gè)動(dòng)作。
該對(duì)象通常由應(yīng)用程序分配,并在PMD發(fā)生錯(cuò)誤的情況下由PMD設(shè)置,消息指向不需要被應(yīng)用程序釋放的常量字符串,但是只要它的關(guān)聯(lián)DPDK端口保持配置。關(guān)閉底層設(shè)備或卸載PMD使其無效。
8.4.注意事項(xiàng)
- DPDK不會(huì)自動(dòng)跟蹤流規(guī)則定義或流規(guī)則對(duì)象。應(yīng)用程序必須跟蹤后者,也可以跟蹤前者。PMD每部也可以實(shí)現(xiàn),但是應(yīng)用程序不能依賴于此。
- 在連續(xù)的端口初始化之間不保留流規(guī)則。應(yīng)用程序退出而沒有釋放的話,重啟時(shí)必須重新創(chuàng)建。
- API操作是同步和阻塞的(EAGAIN不能作為返回值)。
- 盡管沒什么措施來防止不同的設(shè)備被同時(shí)配置,仍然沒有方法保證重入/多線程安全,需要特別注意。
- 管理流規(guī)則時(shí),不需要停止數(shù)據(jù)路徑(RX/TX)。如果不能自然地實(shí)現(xiàn)或解決,則必須返回適當(dāng)?shù)腻e(cuò)誤代碼(EBUSY)。
- PMD負(fù)責(zé)在停止和重新啟動(dòng)端口或執(zhí)行可能影響端口的其他操作時(shí)維護(hù)流規(guī)則配置,而不是應(yīng)用程序。但是流規(guī)則只能被應(yīng)用程序明確地銷毀。
對(duì)于暴露多個(gè)端口共享流規(guī)則影響的全局設(shè)置的設(shè)備:
- DPDK控制下的多有端口必須一致,PMD負(fù)責(zé)確保端口上的現(xiàn)有流規(guī)則不受其他端口的影響。
- 不受DPDK控制的端口,由用戶負(fù)責(zé)處理。他們可能會(huì)影響現(xiàn)有的流規(guī)則并導(dǎo)致未定義的行為。感知這種情況的PMD可能會(huì)阻止流規(guī)則的創(chuàng)建。
8.5.PMD接口
PMD接口在rte_flow_driver.h中定義。它不受API/ABI版本控制的約束,因?yàn)樗粫?huì)暴露于應(yīng)用程序,并可能獨(dú)立發(fā)展。
目前,它通過過濾器類型RTE_ETH_FILTER_GENERIC實(shí)現(xiàn)了傳統(tǒng)過濾框架,該類型接受單個(gè)操作RTE_ETH_FILTER_GET以返回包含在struct rte_flow_ops內(nèi)的PMD特定的rte_flow回調(diào)。
為了保持與遺留過濾框架的兼容性,這個(gè)開銷是暫時(shí)必需的,但是這些框架應(yīng)該最終消失。
- PMD回調(diào)完全實(shí)現(xiàn)了規(guī)則管理中描述的接口,除了已經(jīng)轉(zhuǎn)換為指向底層結(jié)構(gòu)rte_eth_dev的指針的端口ID參數(shù)外。
- 在調(diào)用PMD函數(shù)之前,公共API函數(shù)根本不處理流規(guī)則定義(無基本錯(cuò)誤檢查,無任何驗(yàn)證)。 他們只確保這些回調(diào)非NULL或返回ENOSYS(不支持功能)錯(cuò)誤。
此接口另外定義了以下幫助函數(shù):
- rte_flow_ops_get():從端口獲取泛型流操作結(jié)構(gòu)。
- rte_flow_error_set():初始化通用流錯(cuò)誤結(jié)構(gòu)。
8.6.設(shè)備兼容性
沒有已知的實(shí)現(xiàn)可以支持所有描述的功能。
出于性能原因,PMD不支持的功能或組合不會(huì)在軟件中完全模擬實(shí)現(xiàn)。硬件執(zhí)行大部分工作(例如隊(duì)列重定向和數(shù)據(jù)包識(shí)別),部分支持的功能在軟件中完成。
只要這樣做不會(huì)影響現(xiàn)有流規(guī)則的行為,PMD將盡力通過解決硬件限制來滿足應(yīng)用程序請(qǐng)求。
以下部分提供了這種情況的一些示例,并描述了PMD如何處理它們,它們基于之前的API中內(nèi)置的限制。
8.6.1.全局的bit-mask
每個(gè)流規(guī)則都帶有自己的每層位掩碼,而硬件可能僅支持給定層類型的單個(gè)設(shè)備范圍的位掩碼,以便兩個(gè)IPv4規(guī)則不能使用不同的位掩碼。
在這種情況下,預(yù)期的行為是PMD根據(jù)創(chuàng)建的第一個(gè)流規(guī)則的需要自動(dòng)配置全局位掩碼。
僅當(dāng)其位掩碼與其匹配時(shí)才允許后續(xù)規(guī)則,否則應(yīng)返回EEXIST錯(cuò)誤代碼。
8.6.2.不支持的layer類型
可以通過使用RAW類型條目來模擬許多協(xié)議。
PMD可以依靠此功能來模擬對(duì)不被硬件直接識(shí)別的頭部的協(xié)議的支持。
8.6.3.ANY 模式條目
這種模式條目代表任何東西,這可能難以轉(zhuǎn)換為硬件理解的信息,特別是如果跟隨更具體的類型。
考慮如下的模式:
Table 8.37 Pattern with ANY as L3
Index | Item | ||
---|---|---|---|
0 | Ethernet | ||
1 | ANY | num | 1 |
2 | TCP | ||
3 | END |
我們知道TCP對(duì)IPv4和IPv6之外的其他東西并不合適,這樣的模式可能被轉(zhuǎn)換為兩個(gè)流規(guī)則:
Table 8.38 ANY replaced with IPV4
Index | Item |
---|---|
0 | Ethernet |
1 | IPv4(zeroed mask) |
2 | TCP |
3 | END |
Table 8.39 ANY replaced with IPV6
Index | Item |
---|---|
0 | Ethernet |
1 | IPv6(zeroed mask) |
2 | TCP |
3 | END |
請(qǐng)注意,一旦任何規(guī)則覆蓋了多個(gè)層次,這種方法可能會(huì)產(chǎn)生大量隱藏的流規(guī)則。 因此建議僅支持最常見的情況(ANY處于L2和/或L3)。
8.6.4.不支持的動(dòng)作
- 當(dāng)與QUEUE動(dòng)作組合時(shí),只要目標(biāo)隊(duì)列由單個(gè)規(guī)則使用,可以在軟件中實(shí)現(xiàn)數(shù)據(jù)包計(jì)數(shù)(COUNT動(dòng)作)和標(biāo)記(MARK動(dòng)作或FLAG動(dòng)作)。
- 指定動(dòng)作DUP + QUEUE的規(guī)則可能會(huì)轉(zhuǎn)換為兩個(gè)隱藏的規(guī)則QUEUE和PASSTHRU動(dòng)作。
- 當(dāng)提供單個(gè)目標(biāo)隊(duì)列時(shí),動(dòng)作RSS也可以通過QUEUE來實(shí)現(xiàn)。
8.6.5.流規(guī)則優(yōu)先級(jí)
雖然自然是有意義的,但是由于以下幾個(gè)原因,流量規(guī)則不能被假定為與其創(chuàng)建相同的順序由硬件處理:
- 它們可以作為樹或哈希表而不是列表在內(nèi)部進(jìn)行管理。
- 在添加另一個(gè)流規(guī)則之前刪除流規(guī)則可以將新規(guī)則放在列表的末尾或重新使用釋放的條目。
- 當(dāng)數(shù)據(jù)包被幾個(gè)規(guī)則匹配時(shí),可能會(huì)發(fā)生重復(fù)。
對(duì)于重疊的規(guī)則(特別是為了使用動(dòng)作PASSTHRU),可預(yù)測(cè)的行為只能通過使用不同的優(yōu)先級(jí)來保證。
優(yōu)先級(jí)不一定在硬件中實(shí)現(xiàn),或者可能受到嚴(yán)重限制(例如單個(gè)優(yōu)先級(jí)位)。
由于這些原因,優(yōu)先級(jí)可以純粹在PMD的軟件中實(shí)現(xiàn)。
- 對(duì)于期望以正確順序添加流規(guī)則的設(shè)備,PMD可能會(huì)在添加具有較高優(yōu)先級(jí)的新規(guī)則之后破壞并重新創(chuàng)建現(xiàn)有規(guī)則。
- 可以在初始化時(shí)間創(chuàng)建可配置數(shù)量的空或空規(guī)則,以節(jié)省高優(yōu)先級(jí)槽位供以后使用。
- 為了節(jié)省優(yōu)先級(jí),PMD可以評(píng)估規(guī)則是否可能相應(yīng)地發(fā)生沖突并調(diào)整其優(yōu)先級(jí)。
8.7.未來演變
- 設(shè)備配置文件選擇功能,可用于強(qiáng)制永久性配置文件,而不是依靠現(xiàn)有流程規(guī)則自動(dòng)配置。
- 通過PMD即時(shí)配置生成的特定模式條目和動(dòng)作類型優(yōu)化rte_flow規(guī)則的方法。DPDK應(yīng)該為這些類型分配負(fù)數(shù)值,以便不與現(xiàn)有類型相沖突。具體參考負(fù)數(shù)類型。
- 添加指定Egress模式條目和動(dòng)作,如Traffic direction中所描述。
- PMD無法處理所請(qǐng)求的流規(guī)則時(shí),可以選擇軟件實(shí)現(xiàn)作為后備,使得應(yīng)用程序無需自己實(shí)現(xiàn)。
8.8.API遷移
這一部分描述在rte_eth_ctrl.h中找到的已棄用的過濾器類型(通常以RTE_ETH_FILTER_為前綴)的完整列表以及將其轉(zhuǎn)換為rte_flow規(guī)則的方法。
8.8.1.MACVLAN to ETH?VF,RF
MACVLAN可以轉(zhuǎn)換為基本條目:ETH流規(guī)則,終止操作為VF或PF。
Table 8.40 MACVLAN conversion
Pattern | Action | |||
---|---|---|---|---|
0 | ETH | Spec | Any | VF、PF |
Last | N/A | |||
Mask | Any | |||
1 | END | END |
8.8.2.ETHERTYPE to ETH?QUEUE,DROP
ETHERTYPE可以看成是條目:具有終止操作的ETH流規(guī)則,動(dòng)作為QUEUE或DROP。
Table 8.41 ETHERTYPE conversion
Pattern | Action | |||
---|---|---|---|---|
0 | ETH | Spec | Any | QUEUE、DROP |
Last | N/A | |||
Mask | Any | |||
1 | END | END |
8.8.3.FLEXIBLE to RAW?QUEUE
FLEXIBLE可以轉(zhuǎn)換為一個(gè)條目:RAW模式,終止動(dòng)作為QUEUE和定義的優(yōu)先級(jí)。
Table 8.42 FLEXIBLE conversion
Pattern | Action | |||
---|---|---|---|---|
0 | RAW | Spec | Any | QUEUE |
Last | N/A | |||
Mask | Any | |||
1 | END | END |
8.8.4.SYN to TCP?QUEUE
SYN條目:只有syn位啟用和屏蔽的TCP規(guī)則,以及終止動(dòng)作QUEUE。
優(yōu)先級(jí)可以設(shè)置為模擬高優(yōu)先級(jí)位。
Table 8.43 SYN conversion
Pattern | Action | |||
---|---|---|---|---|
0 | ETH | Spec | unset | QUEUE |
Last | unset | |||
Mask | unset | |||
1 | IPv4 | Spec | unset | END |
Last | unset | |||
Mask | unset | |||
2 | TCP | Spec | Syn | 1 |
Mask | Syn | 1 | ||
3 | END |
8.8.5.NTUPLE to IPV4,TCP,UDP?QUEUE
NTUPLE類似于指定一個(gè)空的L2, IPV4作為L3, TCP或UDP做為L4,終止動(dòng)作為QUEUE。
也可以指定優(yōu)先級(jí)。
Table 8.44 NTUPLE conversion
Pattern | Action | |||
---|---|---|---|---|
0 | ETH | Spec | unset | QUEUE |
Last | unset | |||
Mask | unset | |||
1 | IPv4 | Spec | any | END |
Last | unset | |||
Mask | any | |||
2 | TCP/UDP | Spec | any | |
Last | unset | |||
Mask | any | |||
3 | END |
8.8.6.TUNNEL to ETH,IPV4,IPV6,VXLAN?QUEUE
TUNNEL匹配常見的基于IPv4和IPv6 L3 / L4的隧道類型。
在下表中,ANY條目用于覆蓋可選的L4。
Table 8.45 TUNNEL conversion
Pattern | Action | |||
---|---|---|---|---|
0 | ETH | Spec | any | QUEUE |
Last | unset | |||
Mask | unset | |||
1 | IPv4/IPv6 | Spec | any | END |
Last | unset | |||
Mask | any | |||
2 | ANY | Spec | any | |
Last | unset | |||
Mask | num 0 | |||
3 | VXLAN, GENEVE, TEREDO, NVGRE, GRE, ... | Spec | any | |
Last | unset | |||
Mask | any | |||
3 | END |
8.8.7.FDIR to most item types?QUEUE,DROP,PASSTHRU
FDIR比任何其他類型更復(fù)雜,有幾種方法來模擬其功能。 大部分在下表中進(jìn)行了總結(jié)。
部分功能有意不實(shí)現(xiàn)支持:
- 配置整個(gè)設(shè)備的匹配輸入集和掩碼的能力,PMD應(yīng)根據(jù)請(qǐng)求的流規(guī)則自動(dòng)處理。
例如,如果設(shè)備每個(gè)協(xié)議類型僅支持一個(gè)位掩碼,則源/地址IPv4位掩碼可以通過第一個(gè)創(chuàng)建的規(guī)則變成不可變的。 隨后的IPv4或TCPv4規(guī)則只能在兼容的情況下創(chuàng)建。
請(qǐng)注意,只有現(xiàn)有流規(guī)則影響的協(xié)議位掩碼是不可變的,其他可以稍后更改。相關(guān)的流量規(guī)則被破壞后,它們?cè)俅巫兊每勺儭?/li> - 使用flex字節(jié)過濾時(shí)返回四個(gè)或八個(gè)字節(jié)的匹配數(shù)據(jù)。雖然具體的操作可以實(shí)現(xiàn)它,但它與支持它的設(shè)備上更有用的32位標(biāo)記沖突。
- 對(duì)整個(gè)設(shè)備的RSS處理的副作用。不允許與當(dāng)前設(shè)備配置沖突的流規(guī)則。 同樣,當(dāng)它影響現(xiàn)有流規(guī)則時(shí),不應(yīng)允許設(shè)備配置。
- 設(shè)備操作模式?!皀one”不受支持,因?yàn)橹灰嬖诹饕?guī)則,就不能禁用過濾。
- 應(yīng)根據(jù)創(chuàng)建的流規(guī)則自動(dòng)設(shè)置“MAC VLAN”或“隧道”完美匹配模式。
- 簽名模式的操作未定義,但如果需要,可以通過特定的項(xiàng)目類型處理。
Table 8.46 FDIR conversion
Pattern | Action | |||
---|---|---|---|---|
0 | ETH/RAW | Spec | any | QUEUE、DROP、PASSTHRU |
Last | N/A | |||
Mask | any | |||
1 | IPv4/IPv6 | Spec | any | MARK |
Last | N/A | |||
Mask | any | |||
2 | TCP、UDP、SCTP | Spec | any | END |
Last | N/A | |||
Mask | any | |||
3 | VF、RF | Spec | any | |
Last | N/A | |||
Mask | any | |||
3 | END |
8.8.8.HASH
沒有這個(gè)過濾器類型的對(duì)應(yīng)物,因?yàn)樗D(zhuǎn)換為全局設(shè)備設(shè)置而不是模式項(xiàng)。設(shè)備設(shè)置根據(jù)創(chuàng)建的流規(guī)則自動(dòng)設(shè)置。
8.8.9.L2_TUNNEL to VOID?VXLAN
所有數(shù)據(jù)包都匹配。這種類型改變了傳入的數(shù)據(jù)包,將它們封裝在選定的隧道類型中,也可以將它們重定向到VF。
可以使用動(dòng)作DUP使用其他流規(guī)則來模擬基于標(biāo)簽的轉(zhuǎn)發(fā)的目標(biāo)池。
Table 8.47 L2_TUNNEL conversion
Pattern | Action | |||
---|---|---|---|---|
0 | VOID | Spec | N/A | VXLAN, GENEVE, ... |
Last | N/A | |||
Mask | N/A | |||
1 | END | VF | ||
2 | END | END |