rx_queue_index всегда возвращает значение 1 для пакетов ipv6-Srv6 на XDP-eBPF.

Я пытаюсь отслеживать пакеты Ipv6-Srv6, используя простую программу XDP-eBPF. Я получаю очередь NIC, как всегда 1.

Ниже приведены сведения об окружающей среде.

  1. ОС: гостевая ОС, Ubuntu 19.10, 5.3.0-64-универсальная
  2. Сетевая карта: x710: 10 Гбит/с, драйвер = i40e, версия драйвера = 2.8.20-k, прошивка = 7.20
  3. XDP-eBPF: мой собственный пример программы
#include <bpf.h>
#include <bpf/bpf_helpers.h>

#include <linux/if_ether.h>
#include <linux/ipv6.h>

#include <stdint.h>

#ifndef lock_xadd
#define lock_xadd(ptr, val)     ((void) __sync_fetch_and_add(ptr, val))
#endif

struct bpf_map_def SEC("maps") queue_rx_pkts = {
        .type        = BPF_MAP_TYPE_ARRAY,
        .key_size    = sizeof(__u32),
        .value_size  = sizeof(__u64),
        .max_entries = 256,
};

SEC("prog")
int xdp_select(struct xdp_md *ctx)
{
        //__u32 input_port = ctx->ingress_ifindex;
        __u32 input_queue = ctx->rx_queue_index;

        void *data_end = (void *)(long)ctx->data_end;
        void *data = (void *)(long)ctx->data;
        struct ethhdr *eth_ptr = (struct ethhdr *)data;
        struct ipv6hdr *ipv6_ptr = (struct ipv6hdr *)(data + sizeof(struct ethhdr));
        unsigned int *pkt_count = bpf_map_lookup_elem(&queue_rx_pkts, &input_queue);

        if (!pkt_count)
                return XDP_ABORTED;

        if ((data + sizeof(*eth_ptr)) > data_end)
                return XDP_DROP;


        if (eth_ptr->h_proto == 0xdd86) {
                if ((void *)(ipv6_ptr + 1) > data_end)
                        return XDP_DROP;
                *pkt_count += 1;
                return XDP_PASS;
        }

        return XDP_DROP;
}
  • генератор пакетов: Host NIC X710 запускается с помощью утилиты packEth cli с packETHcli -i ens261f2 -m 2- d 0 -n 0 -f /tmp/test.pcap
  • Ожидаемый результат: входящие пакеты будут распределяться по нескольким очередям RX.
  • Наблюдаемый результат: очередь RX 1 получает только пакеты.

введите здесь описание изображения

Я проверил результаты с помощью ethtool -S [interface name] и bpftool map dump id 12. В обоих случаях RX-Queue-1 только обновляется.

введите здесь описание изображения

[EDIT-1] обновление хеш-статуса RSS в соответствии с рекомендацией из комментария

$ ethtool --show-rxfh-indir ens10                                                                                                                                                                                                      [4/1785]
RX flow hash indirection table for ens10 with 8 RX ring(s):
    0:      0     1     2     3     4     5     6     7
    8:      0     1     2     3     4     5     6     7
<snipped>
  504:      0     1     2     3     4     5     6     7
RSS hash key:
9b:d2:e1:c0:f7:aa:1f:69:49:7c:55:76:48:7e:2c:fc:d5:91:47:39:df:50:52:8f:88:07:c8:63:62:27:93:17:35:75:dc:f6:85:e8:ff:c2:72:1d:de:92:d4:2b:1e:d9:f2:53:df:38
RSS hash function:
    toeplitz: on
    xor: off
    crc32: off

person Vipin Varghese    schedule 06.02.2021    source источник
comment
Спасибо, @Progman, за редактирование, но не кажется ли вам, что код C вызывает проблему?   -  person Vipin Varghese    schedule 06.02.2021
comment
Похоже, что генератор пакетов в вашем примере все время передает один и тот же пакет. Так ли это? Если да, то почему вы ожидаете, что пакеты будут распределяться по нескольким очередям? Скажем, на устройстве включена хэш-функция RSS-IPv6. Тогда поля пакета, вносящие вклад в хэш пакета, являются адресами источника и получателя. Они постоянны для пакетов, следовательно, одно и то же значение хеш-функции, следовательно, пакеты все время попадают в одну и ту же очередь. Имеет ли это объяснение смысл?   -  person stackinside    schedule 06.02.2021
comment
@stackinside спасибо, это имеет смысл, не могли бы вы опубликовать это как ответ. Я проверю то же самое, изменив IP-адрес и обновив вопрос по мере необходимости.   -  person Vipin Varghese    schedule 06.02.2021
comment
Что ж, я считаю, что еще одним моментом, который нужно проверить, будет фактический набор хеш-функций, включенных на сетевой карте. Чтобы убедиться, что RSS-IPv6 включен.   -  person stackinside    schedule 06.02.2021


Ответы (1)


Похоже, что генератор пакетов в вашем примере все время передает один и тот же пакет. Так ли это? Если да, то почему вы ожидаете, что пакеты будут распределяться по нескольким очередям? Скажем, на устройстве включена хэш-функция RSS-IPv6. Тогда поля пакета, вносящие вклад в хэш пакета, являются адресами источника и получателя. Они постоянны для пакетов, следовательно, одно и то же значение хеш-функции, следовательно, пакеты все время попадают в одну и ту же очередь.

Основываясь на дальнейших наблюдениях OP, включение рандомизации IP-адресов в PackETH (установка галочки в опции Set random source IPv6 address with mask и, например, использование значения маски 64) действительно приводит к тому, что сгенерированные пакеты попадают в разные очереди Rx на стороне получателя. Статистика пакетов по очереди, полученная с помощью ethtool -S, подтверждает это наблюдение.

person stackinside    schedule 06.02.2021
comment
ваше наблюдение верно, я принял ваш ответ. - person Vipin Varghese; 06.02.2021
comment
Большое спасибо. Я видел ваше предложение отредактировать пост и, если быть настолько наглым, считаю, что скриншоты лучше заменить текстовым описанием. Это гарантирует, что будущие читатели будут иметь больше шансов найти ответ при поиске названия параметра в другом месте. Спасибо за понимание. - person stackinside; 06.02.2021