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

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

1 ответ

Требование POP_MPLSа также RSS on MPLSможно активировать через для поддерживаемой сетевой карты PMD. Но mellanox mxl5 PMDподдерживает только RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN & RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN. Только параметры, поддерживаемые для туннелируемых пакетов mxl5 PMDнаходятся MPLSoGRE, MPLSoUD. Следовательно, POPMPLS в HW через PMD невозможен на MXL5 PMD для DPDK 19.11 LTS.

Для любого ПМД 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. Но для этого нет RSS-хеширования IP/PORT.

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

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

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

Другие вопросы по тегам