1

I am trying to build a multi-RX-queue dpdk program, using RSS to split the incoming traffic into RX queues on a single port. Mellanox ConnectX-5 and DPDK Version 19.11 is used for this purpose. It works fine when I use IP over Ethernet packets as input. However when the packet contains IP over MPLS over Ethernet, RSS does not seems to work. As a result, all packets belonging to various flows (with different src & dst IPs, ports) over MPLS are all sent into the same RX queue.

My queries are

  1. Is there any parameter/techniques in DPDK to distribute MPLS packets to multiple RX queues?
  2. Is there any way to strip off MPLS tags (between Eth and IP) in hardware, something like hw_vlan_strip?

My Port configuration is

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,
            },
    } };
piet.t
  • 11,718
  • 21
  • 43
  • 52
  • @rakimbhatt did you check the answer and tried RTE_FLOW? – Vipin Varghese Jan 19 '21 at 12:26
  • I have humbly request editors like `https://stackoverflow.com/users/1364007/wai-ha-lee, and https://stackoverflow.com/users/2664350/piet-t` to help me understand `reject in question, especially when the question is specifically to POP/STRIP MPLS and then distribute to multiple queues. Question is not about MPLS processing (match MPLS id and take a specific action. but instead, pop MPLS irrespective of value if present. Seems very odd behaviour `as there is the real difference between MPLS processing vs MPLS stripping (as the requirement is not to process MPLS packet, but pop MPLS header). – Vipin Varghese Jan 20 '21 at 02:30

1 Answers1

0

The requirement of POP_MPLS and RSS on MPLS can be activated via RTE_FLOW for supported NIC PMD. But mellanox mxl5 PMD supports only RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN & RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN. Only options supported for tunneled packets by mxl5 PMD are MPLSoGRE, MPLSoUD. Hence POP MPLS in HW via PMD is not possible on MXL5 PMD for DPDK 19.11 LTS

For any PMD RSS is reserved for outer/inner IP address along with TCP/UDP/SCTP port numbers. Hence I have to interpret RSS for MPLS as I would like to distribute/ spread packets with different MPLS to various queues. This can be achieved by again using RTE_FLOW for RTE_FLOW_ITEM_TYPE_MPLS and action field as RTE_FLOW_ACTION_TYPE_QUEUE. Using mask/range fields one can set patterns which can satisfy condition as 2 ^ 20 (MPLS id max value) / number of RX queues. hence the recommendation is to use RTE_FLOW_ITEM_TYPE_MPLS from RTE_FLOW and RTE_FLOW_ACTION_TYPE_QUEUE. But there is no IP/PORT RSS hashing for the same.

to test the same you can use

  1. DPDK testpmd and set the flow rules or
  2. make use of RTE_FLOW code snippet from rte_flow link

note: for POP MPLS I highly recommend to use PTYPES to identify the metadata and use RX-callabck to modify the packet header.

Vipin Varghese
  • 4,540
  • 2
  • 9
  • 25