AF_XDP: сопоставить `(SR C -IP, DST-IP, DST-порт)` с индексом в `BPF_MAP_TYPE_XSKMAP` - PullRequest
0 голосов
/ 09 марта 2020

Я хочу порождать несколько процессов в пользовательском пространстве, каждый из которых обрабатывает пакеты из одного источника (три раза (SRC-IP, DST-IP, DST-Port)).

Поскольку через AF-XDP будет проходить много пакетов Программа ядра и время критически важны, я подумал об отдельной карте в программе ядра, которая заранее заполняется программой пользовательского пространства.

Эта карта определяет отображение из ранее упомянутой тройки в индекс, который затем используется в bpf_redirect_map(&xsks_map, index, 0) для отправки пакетов в указанный c сокет в пространстве пользователя.

Моя первоначальная идея состояла в том, чтобы просто объединить sr c -ip, destination-ip и порт назначения в ( 32 + 32 + 16) -битное значение.

Можно ли определить карты с таким большим размером ключа? Какая карта лучше всего подойдет для этой проблемы? Кроме того, возможно ли заполнить карту из пользовательского пространства?

1 Ответ

0 голосов
/ 12 марта 2020

Структура в качестве ключа

Существует несколько типов карт, которые можно использовать с eBPF. Некоторые из них являются обобщенными c (ha sh карты, массивы, ...), а некоторые очень специфичны c (карты перенаправления, карты памяти, ...).

Случай, который вы описываете звучит как идеальный вариант использования для карт ha sh. Такие карты принимают struct в качестве ключа и еще один struct в качестве значения. Таким образом, вы можете иметь что-то вроде:

struct my_key {
        uint32_t src_ip;
        uint32_t dst_ip;
        uint16_t dst_port;
};

... и использовать это как ключ. Значение, в вашем случае, будет индексом для xskmap, то есть простым целым числом. Карты Ha sh эффективны для извлечения значения из заданного ключа (без линейного поиска, как для массива), поэтому вы получаете хорошую производительность при этом.

Размер ключа для га sh карт

Не существует определенных ограничений c для размера ключей или значений, если размер сохраняется для 32-разрядного целого числа :) (Обратите внимание, что в случае аппаратной разгрузки могут быть ограничения размера) .

Обновление из пользовательского пространства

Совершенно выполнимо обновить карту ha sh из пользовательского пространства (хотя некоторые очень специфические c типы карт могут этого не разрешать, но общие c карты, такие как массивы или ха sh карты вполне в порядке). Вы сделаете это:

  • Из командной строки, с bpftool,
  • Из программы C, с помощниками из libbpf,
  • In ваш собственный язык. Во всех трех случаях само обновление выполняется посредством вызова системного вызова bpf().
...