Разделить заголовок MPLS с помощью DPDK
Я пытаюсь удалить заголовок MPLS с помощью DPDK, я использовал образец приложения flow_filtering в качестве запуска и попытался добавить еще один элемент в шаблон: Ethernet MPLSIPv4END , и я добавил следующее действие: RTE_FLOW_ACTION_TYPE_OF_POP_MPLS RTE_FLOW_ACTION_TYPE_END Но при выполнении кода возникает следующая ошибка брошено: поток не может быть создан 16 сообщение: не поддерживается действие.
Ниже приведен фрагмент кода:
action[0].type = RTE_FLOW_ACTION_TYPE_OF_POP_MPLS;
action[1].type = RTE_FLOW_ACTION_TYPE_END;
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[1].type = RTE_FLOW_ITEM_TYPE_MPLS;
memset(&ip_spec, 0, sizeof(struct rte_flow_item_ipv4));
memset(&ip_mask, 0, sizeof(struct rte_flow_item_ipv4));
ip_spec.hdr.dst_addr = htonl(dest_ip);
ip_mask.hdr.dst_addr = dest_mask;
ip_spec.hdr.src_addr = htonl(src_ip);
ip_mask.hdr.src_addr = src_mask;
pattern[2].type = RTE_FLOW_ITEM_TYPE_IPV4;
pattern[2].spec = &ip_spec;
pattern[2].mask = &ip_mask;
pattern[3].type = RTE_FLOW_ITEM_TYPE_END;
res = rte_flow_validate(port_id, &attr, pattern, action, error);
Удалив шаблон[1].type = RTE_FLOW_ITEM_TYPE_MPLS; и action[0].type = RTE_FLOW_ACTION_TYPE_OF_POP_MPLS; . Код работает нормально.
Я попытался изменить порядок MPLS в шаблоне, хотя заголовок MPLS находится между уровнями L2 и L3, но бесполезно.
Версия:
Линукс: ЦенОС 7
ДПДК: 19.08.2
Сетевая карта: X520
Версия прошивки: 18.5.17
1 ответ
Для сетевой карты IntelX520
сообщение об ошибке Поток не может быть создан 16 сообщений: Неподдерживаемое действие является правильным и ожидаемым поведением. Следовательно, в драйвере DPDK IXGBE PMD нет проблем.
Объяснение:
- RTE_FLOW — это сетевая карта, основанная на аппаратной разгрузке для фильтрации и модификации пакетов как во входящем, так и в исходящем направлениях, подробнее здесь.
- Существует несколько тегов фильтра (таких как vlan, IP, TCP, UDP, MPLS) вместе с различными элементами действий (push pop vlan, push pop mpsl, dec inc mpls ttl, ... и т. д.). Но не все фильтры и действия поддерживаются всеми сетевыми адаптерами (поскольку они необязательны).
- См. Таблицу 1.3 Доступность действий rte_flow в сетевых драйверах (ссылка здесь), которая сопоставляет каждую PMD NIC с действием. Не показано, что IXGBE поддерживает действия MPLS.
- Проверка кода PMD здесь даже показывает поддерживаемые поля фильтра.
const struct rte_flow_item_ipv4 *ipv4_spec;
const struct rte_flow_item_ipv4 *ipv4_mask;
const struct rte_flow_item_tcp *tcp_spec;
const struct rte_flow_item_tcp *tcp_mask;
const struct rte_flow_item_udp *udp_spec;
const struct rte_flow_item_udp *udp_mask;
const struct rte_flow_item_sctp *sctp_spec;
const struct rte_flow_item_sctp *sctp_mask;
const struct rte_flow_item_eth *eth_spec;
const struct rte_flow_item_eth *eth_mask;
const struct rte_flow_item_vlan *vlan_spec;
const struct rte_flow_item_vlan *vlan_mask;
Следовательно, код и поведение IXGBE PMD согласованы, и ошибок нет. это ожидание отX550
для поддержки неподдерживаемой функции, которая неверна.
[РЕДАКТИРОВАТЬ-1]according to the sheet, none of the drivers support the "of_pop_mpls" action which implies that we can't strip off the MPLS header using RTE_FLOWS
Это правильное понимание, до сих пор текущая доступная базовая сетевая карта не показывает поддержку MPLS pop/push. Но я знаком с Intel NIC FM10K, который разрешал MPLS POP/PUSH, но я не вижу, чтобы сетевая карта поддерживалась в DPDK. Итак, у вас есть 2 варианта,
- используйте умный ник, чтобы сделать это HW
- используйте обратный вызов DPDK RX для вызова функции для извлечения тега MPLS и обратный вызов TX для отправки тега MPLS
Примечание. PTYPE поддерживается в большинстве сетевых адаптеров, а также будет доступен синтаксический анализ MPLS и сохранение tin rte_mbuf. Это также поможет при использовании подхода SW.