DPDK:MPLS 数据包处理

问题描述

我正在尝试构建一个多 RX 队列 dpdk 程序,使用 RSS 将传入流量拆分为单个端口上的 RX 队列。 Mellanox ConnectX-5 和 DPDK 版本 19.11 用于此目的。当我使用 IP over Ethernet 数据包作为输入时,它工作正常。但是,当数据包包含 IP over MPLS over Ethernet 时,RSS 似乎不起作用。因此,属于 MPLS 上各种流(具有不同的 srcdst IP、端口)的所有数据包都被发送到同一个 RX 队列中。

我的疑问是

  1. DPDK 中是否有任何参数/技术可以将 MPLS 数据包分发到多个 RX 队列?
  2. 有什么方法可以去除硬件中的 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 MPLSRTE_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,RSSouter/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 散列。

测试你可以使用的相同

  1. DPDK testpmd 并设置 flow rules
  2. 利用 rte_flow link 中的 RTE_FLOW 代码片段

注意:对于 POP MPLS,我强烈建议使用 PTYPES 来识别元数据并使用 RX-callabck 来修改数据包头。