Структура в качестве ключа
Существует несколько типов карт, которые можно использовать с 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()
.