Я использую dpdk-19.02 (но тоже пробовал 18.11), модуль Lanner x710 с прошивкой 6.01 и 6.8
ОС: Ubuntu Desktop и Сервер 18.04
Я занимаюсь разработкой сетевого приложения, которое делит трафик на потоки на основе тегов Vlan. Работает хорошо. Модуль x710 может пропускать теги и делать RSS на основе пяти кортежей.
Например:
Packet (Ether () / Dot1Q (vlan = 1) / IP ()) пропустит или удалит vlan (в случае удаления это помещает vlan в структуру rte_mbuf) и создает rss в области очередей (например, 1-7) )
в случае двойных тегов оба EtherType имеют значение 0x8100 (не первый эфир 0x88a8)
То же самое с непомеченным пакетом. Это будет rss в регионе очередей (1-7)
Работает хорошо.
Я могу контролировать это с
параметры: rte_eth_conf.rxmode.offloads и группа флагов DEV_RX_OFFLOAD _ *;
VLAN_EXTEND -> rss untag, одиночный тег или двойной тег
VLAN_STRIP -> поставить первый vlan в метаданных (в dpdk он вызывает strip). (не используйте двойные метки)
VLAN_STRIP | VLAN_EXTEND -> поместите оба тега и выполните команду rss
VLAN_EXTEND | QINQ_STRIP -> поместить только один тег в rss (внешний или единственный).
Все API работают хорошо.
Что я хочу: у меня есть несколько групп очередей. Мне нужно выбрать группу очередей по внешнему (или одиночному) тегу. (в общем, мне нужно несколько виртуальных портов в одном физическом процессе, но в одном процессе DPDK).
Пример: я хочу настроить три группы очередей. G0 (только без тегов) (очередь 1-7), G1 (внешний или одиночный тег vlan с идентификатором 1) (очереди 9-15) и G2 (внешний или одиночный тег vlan с идентификатором 2) (в dpdk эта группа вызывает пулы)
(Ether () / Dot1Q (vlan = 1) / IP ()) -> G1
(Ether () / Dot1Q (vlan = 1) / Dot1Q (vlan = 8) / IP ()) -> G1
(Ether () / Dot1Q (vlan = 2) / Dot1Q (vlan = 8) / IP ()) -> G2
(Ether () / IP ()) -> G0
Я принимаю зачистки:
(Эфир () / dot1q (ВЛС = 1) / dot1q (ВЛС = 8) / IP ())
(Ether () / Dot1Q (vlan = 1) / Dot1Q (vlan = 8) / IP ()) -> удалить внешний vlan (с id == 1)
(Ether () / Dot1Q (vlan = 1) / IP ()) -> полоса одиночного vlan
раздеть оба vlans.
Dpdk Api имеет эти технологии, это VMDQ
на драйвере i40e dpdk dpdk игнорирует флаги в структуре vmdq
rte_eth_vmdq_rx_conf.rx_mode, поэтому я не могу отключить флаг ETH_VMDQ_ACCEPT_UNTAG, и decigeon зависят от mac (не от vlan), но это приемлемо.
НО когда я пытался его настроить, я столкнулся с проблемой
в случае
(Ether () / Dot1Q (vlan = 1) / Dot1Q (vlan = 8) / IP ()) -> только второй удаленный vlan (идентификатор vlan 8)
(Ether () / Dot1Q (vlan = 1) / IP ()) -> удаленный vlan 1
Я пытался изменить флаги rte_eth_conf.rxmode.mq_mode
Результаты:
Zero Flag -> первый vlan, но без RSS
VLAN_EXTEND -> одиночная метка - без полосы, двойная метка - вторая полоса метки (мне нужно сначала или нет), но RSS работает
QINQ_STRIP -> удалить первый тег (или одиночный), НО RSS
QINQ_STRIP | VLAN_EXTEND -> (то же самое, что и без QINIQ_STRIP)
QINQ_STRIP | VLAN_STRIP | VLAN_EXTEND -> все еще удаляет только второй тег
Это моя функция, которая настраивает rte_eth_conf
void cGlobalConfig::portConfVmdq(rte_eth_conf *conf, uint32_t portId)
{
zeroStruct( *conf); // zero struct
conf->rxmode.mq_mode=ETH_MQ_RX_VMDQ_RSS; // SETTING RSS MODE
conf->rxmode.offloads= DEV_RX_OFFLOAD_VLAN_EXTEND
| DEV_RX_OFFLOAD_QINQ_STRIP
| DEV_RX_OFFLOAD_VLAN_STRIP ;// that flags i variate
conf->txmode.mq_mode=ETH_MQ_TX_VMDQ_ONLY;
conf->txmode.offloads=DEV_TX_OFFLOAD_VLAN_INSERT;
conf->txmode.hw_vlan_insert_pvid=1; // tx options
rte_eth_dev_info info=pInfo(portId);
rte_eth_vmdq_rx_conf & vmdq=conf->rx_adv_conf.vmdq_rx_conf;
rte_eth_vmdq_tx_conf & tvmdq=conf->tx_adv_conf.vmdq_tx_conf;
vmdq.rx_mode=ETH_VMDQ_ACCEPT_MULTICAST|ETH_VMDQ_ACCEPT_BROADCAST;
conf->rx_adv_conf.rss_conf.rss_hf=info.flow_type_rss_offloads;
vmdq.nb_queue_pools = (rte_eth_nb_pools)NB_POOLS;
vmdq.nb_pool_maps=NB_POOLS; // 8 in my case, cose i need 24 queue in each of 8 pools
vmdq.enable_default_pool=0;
vmdq.default_pool=0;
vmdq.enable_loop_back=0;
tvmdq.nb_queue_pools=(rte_eth_nb_pools)NB_POOLS;
for(uint i =0; i < vmdq.nb_pool_maps; ++i )
{
vmdq.pool_map[i].vlan_id = i; // binding vlans for pools (but it doesnt matter, because i40e dpdk driver ignors vmdq.rx_mode flags)
vmdq.pool_map[i].pools = (1UL << (i % NB_POOLS));
}
}```
I expect:
stripping first of sinle tag, forward to pool, based on VlanID and doing RSS