DPDK編程指南(翻譯)( 八)

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

原文鏈接:http://www.lxweimin.com/p/405c99678e23 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 本文檔包含DPDK軟件安裝和配置的相關(guān)說明。旨在幫助用戶快速啟動(dòng)和運(yùn)行軟件。文檔主要描述了在Linux...
    半天妖閱讀 17,995評(píng)論 0 22
  • 12.哈希庫 DPDK提供了一個(gè)用于創(chuàng)建哈希表的哈希庫,哈希表可以用于快速查找。哈希表是針對(duì)一組條目進(jìn)行搜索而優(yōu)化...
    半天妖閱讀 1,891評(píng)論 0 0
  • 0×1.ACL概述ACL(Access Control List,訪問控制列表),是一系列運(yùn)用到路由器接口的指令列...
    Zero___閱讀 2,842評(píng)論 0 3
  • 7.輪詢模式驅(qū)動(dòng) DPDK包括1Gigabit、10Gigabit 及 40Gigabit 和半虛擬化IO的輪詢模...
    半天妖閱讀 5,579評(píng)論 0 4
  • 當(dāng)我看著他黑深的瞳眸時(shí),我欲言又止,卻不知如何開口,想說點(diǎn)什么?想講個(gè)故事?他喜歡嗎? 他的心思我是不知道的,他看...
    琛琛er閱讀 163評(píng)論 0 0