Настройка vmdq для x710 - PullRequest
0 голосов
/ 04 апреля 2019

Я использую 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

Я принимаю зачистки:

  1. (Эфир () / dot1q (ВЛС = 1) / dot1q (ВЛС = 8) / IP ())

  2. (Ether () / Dot1Q (vlan = 1) / Dot1Q (vlan = 8) / IP ()) -> удалить внешний vlan (с id == 1)

    (Ether () / Dot1Q (vlan = 1) / IP ()) -> полоса одиночного vlan

  3. раздеть оба 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
...