DPDK: обработка пакетов MPLS
Я пытаюсь создать программу dpdk с несколькими очередями RX, используя RSS для разделения входящего трафика на очереди RX на одном порту. Для этой цели используется Mellanox ConnectX-5 и DPDK версии 19.11. Он отлично работает, когда я использую пакеты IP over Ethernet в качестве входных данных. Однако, когда пакет содержит IP через MPLS через Ethernet, RSS, кажется, не работает. В результате все пакеты, принадлежащие разным потокам (с разными
src
&
dst
IP, порты) через MPLS отправляются в одну и ту же очередь RX.
Мои запросы
- Существуют ли какие-либо параметры/методы в DPDK для распределения пакетов MPLS по нескольким очередям RX?
- Есть ли способ удалить теги 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.
чтобы проверить то же самое, вы можете использовать
- DPDK testpmd и установите
flow rules
или же - используйте фрагмент кода RTE_FLOW из ссылки rte_flow
примечание: для
POP MPLS
Я настоятельно рекомендую использовать
PTYPES
определить метаданные и использовать
RX-callabck
изменить заголовок пакета.