DPDK:MPLS数据包处理

DPDK: MPLS packet processing

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

我的查询是

  1. DPDK中有没有parameter/techniques将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,
            },
    } };

POP_MPLSRSS on MPLS 的要求可以通过 RTE_FLOW 激活,以获得支持的 NIC PMD。但是 mellanox mxl5 PMD 只支持 RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN & RTE_FLOW_ACTION_TYPE_OF_PUSH_VLANmxl5 PMD 支持的隧道数据包选项只有 MPLSoGRE, MPLSoUD因此,对于 DPDK 19.11 LTS

,无法在 MXL5 PMD 上通过 PMD 在硬件中使用 POP MPLS

对于任何 PMD,RSSTCP/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_MPLSRTE_FLOWRTE_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
  3. 中的 RTE_FLOW 代码片段

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