DPDK:MPLS数据包处理
DPDK: MPLS packet processing
我正在尝试构建一个多 RX 队列 dpdk 程序,使用 RSS 将传入流量拆分为单个端口上的 RX 队列。 Mellanox ConnectX-5 和 DPDK 版本 19.11 用于此目的。当我使用 IP over Ethernet 数据包作为输入时,它工作正常。但是,当数据包包含以太网上的 IP over MPLS 时,RSS 似乎不起作用。因此,所有属于不同流(具有不同 src
和 dst
IP、端口)的数据包都通过 MPLS 发送到同一个 RX 队列。
我的查询是
- DPDK中有没有parameter/techniques将MPLS包分发到多个RX队列?
- 有什么方法可以去除硬件中的 MPLS 标签(在 Eth 和 IP 之间),比如
hw_vlan_strip
?
我的端口配置是
const struct rte_eth_conf default_port_conf = {
.rxmode = {
.hw_vlan_strip = 0, /* VLAN strip enabled. */
.header_split = 0, /* Header Split disabled. */
.hw_ip_checksum = 0, /* IP checksum offload disabled. */
.hw_strip_crc = 0, /* CRC stripping by hardware disabled. */
},
.rx_adv_conf = {
.rss_conf = {
.rss_key = NULL,
.rss_key_len = 0,
.rss_hf = ETH_RSS_IP,
},
} };
POP_MPLS
和 RSS on MPLS
的要求可以通过 RTE_FLOW
激活,以获得支持的 NIC PMD。但是 mellanox mxl5 PMD
只支持 RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN & RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN
。 mxl5 PMD
支持的隧道数据包选项只有 MPLSoGRE, MPLSoUD
。 因此,对于 DPDK 19.11 LTS
,无法在 MXL5 PMD 上通过 PMD 在硬件中使用 POP MPLS
对于任何 PMD,RSS
与 TCP/UDP/SCTP port numbers
一起保留给 outer/inner IP address
。因此我必须将 RSS for MPLS
解释为 I would like to distribute/ spread packets with different MPLS to various queues
。这可以通过再次使用 RTE_FLOW_ITEM_TYPE_MPLS
的 RTE_FLOW
和 RTE_FLOW_ACTION_TYPE_QUEUE
的操作字段来实现。使用mask/range fields
可以将满足条件的模式设置为2 ^ 20 (MPLS id max value) / number of RX queues
。 因此建议使用 RTE_FLOW 和 RTE_FLOW_ACTION_TYPE_QUEUE 中的 RTE_FLOW_ITEM_TYPE_MPLS。但是没有 IP/PORT 相同的 RSS 散列。
您可以使用
来测试相同的内容
- DPDK testpmd并设置
flow rules
或
- 利用 rte_flow link
中的 RTE_FLOW 代码片段
注意:对于POP MPLS
我强烈建议使用PTYPES
来识别元数据并使用RX-callabck
修改包头。
我正在尝试构建一个多 RX 队列 dpdk 程序,使用 RSS 将传入流量拆分为单个端口上的 RX 队列。 Mellanox ConnectX-5 和 DPDK 版本 19.11 用于此目的。当我使用 IP over Ethernet 数据包作为输入时,它工作正常。但是,当数据包包含以太网上的 IP over MPLS 时,RSS 似乎不起作用。因此,所有属于不同流(具有不同 src
和 dst
IP、端口)的数据包都通过 MPLS 发送到同一个 RX 队列。
我的查询是
- DPDK中有没有parameter/techniques将MPLS包分发到多个RX队列?
- 有什么方法可以去除硬件中的 MPLS 标签(在 Eth 和 IP 之间),比如
hw_vlan_strip
?
我的端口配置是
const struct rte_eth_conf default_port_conf = {
.rxmode = {
.hw_vlan_strip = 0, /* VLAN strip enabled. */
.header_split = 0, /* Header Split disabled. */
.hw_ip_checksum = 0, /* IP checksum offload disabled. */
.hw_strip_crc = 0, /* CRC stripping by hardware disabled. */
},
.rx_adv_conf = {
.rss_conf = {
.rss_key = NULL,
.rss_key_len = 0,
.rss_hf = ETH_RSS_IP,
},
} };
POP_MPLS
和 RSS on MPLS
的要求可以通过 RTE_FLOW
激活,以获得支持的 NIC PMD。但是 mellanox mxl5 PMD
只支持 RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN & RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN
。 mxl5 PMD
支持的隧道数据包选项只有 MPLSoGRE, MPLSoUD
。 因此,对于 DPDK 19.11 LTS
对于任何 PMD,RSS
与 TCP/UDP/SCTP port numbers
一起保留给 outer/inner IP address
。因此我必须将 RSS for MPLS
解释为 I would like to distribute/ spread packets with different MPLS to various queues
。这可以通过再次使用 RTE_FLOW_ITEM_TYPE_MPLS
的 RTE_FLOW
和 RTE_FLOW_ACTION_TYPE_QUEUE
的操作字段来实现。使用mask/range fields
可以将满足条件的模式设置为2 ^ 20 (MPLS id max value) / number of RX queues
。 因此建议使用 RTE_FLOW 和 RTE_FLOW_ACTION_TYPE_QUEUE 中的 RTE_FLOW_ITEM_TYPE_MPLS。但是没有 IP/PORT 相同的 RSS 散列。
您可以使用
来测试相同的内容- DPDK testpmd并设置
flow rules
或 - 利用 rte_flow link 中的 RTE_FLOW 代码片段
注意:对于POP MPLS
我强烈建议使用PTYPES
来识别元数据并使用RX-callabck
修改包头。