如何解决DPDK:MPLS 数据包处理
我正在尝试构建一个多 RX 队列 dpdk 程序,使用 RSS 将传入流量拆分为单个端口上的 RX 队列。 Mellanox ConnectX-5 和 DPDK 版本 19.11 用于此目的。当我使用 IP over Ethernet 数据包作为输入时,它工作正常。但是,当数据包包含 IP over MPLS over Ethernet 时,RSS 似乎不起作用。因此,属于 MPLS 上各种流(具有不同的 src
和 dst
IP、端口)的所有数据包都被发送到同一个 RX 队列中。
我的疑问是
- DPDK 中是否有任何参数/技术可以将 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,},} };
解决方法
对于支持的 NIC PMD,可以通过 POP_MPLS
激活 RSS on MPLS
和 RTE_FLOW
的要求。但 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
与 outer/inner IP address
一起保留给 TCP/UDP/SCTP port numbers
。因此我必须将 RSS for MPLS
解释为 I would like to distribute/ spread packets with different MPLS to various queues
。这可以通过再次将 RTE_FLOW
用于 RTE_FLOW_ITEM_TYPE_MPLS
并将操作字段用作 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
来修改数据包头。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。