DPDK: обработка пакетов MPLS

Я пытаюсь создать программу dpdk с несколькими очередями RX, используя RSS для разделения входящего трафика на очереди RX на одном порту. Для этого используются Mellanox ConnectX-5 и DPDK версии 19.11. Он отлично работает, когда я использую в качестве входных данных пакеты IP over Ethernet. Однако, когда пакет содержит IP через MPLS через Ethernet, RSS не работает. В результате все пакеты, принадлежащие разным потокам (с разными src & dst IP-адресами, портами) через MPLS, все отправляются в одну и ту же очередь 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,
            },
    } };

person raktim bhatt    schedule 16.01.2021    source источник
comment
@rakimbhatt, вы проверили ответ и попробовали RTE_FLOW?   -  person Vipin Varghese    schedule 19.01.2021
comment
Я смиренно прошу редакторов, таких как https://stackoverflow.com/users/1364007/wai-ha-lee, and https://stackoverflow.com/users/2664350/piet-t, помочь мне понять 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 , поскольку существует реальная разница между обработкой MPLS и разделением MPLS (поскольку требование заключается не в обработке пакета MPLS, а в извлечении заголовка MPLS).   -  person Vipin Varghese    schedule 20.01.2021


Ответы (1)


Требование 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. Следовательно, POP MPLS в HW через PMD невозможен на MXL5 PMD для DPDK 19.11 LTS

Для любого 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_ITEM_TYPE_MPLS из RTE_FLOW и RTE_FLOW_ACTION_TYPE_QUEUE. Но для этого не существует хеширования IP / PORT RSS.

чтобы проверить то же самое, что вы можете использовать

  1. DPDK testpmd и установите flow rules или
  2. используйте фрагмент кода RTE_FLOW из ссылки rte_flow

примечание: для POP MPLS я настоятельно рекомендую использовать PTYPES для идентификации метаданных и использовать RX-callabck для изменения заголовка пакета.

person Vipin Varghese    schedule 16.01.2021