Как разделить карту ebpf между интерфейсами

Можно ли разделить карту ebpf между двумя сетевыми интерфейсами. Я хочу написать программу XDP и подключить ее к двум устройствам, а именно к eth0 и eth1. Реализация требует, чтобы они оба использовали одну и ту же карту. Можно ли загрузить одну и ту же программу, цепляя их на eth0 и eth1 и использовать один и тот же Map.

Спасибо вам всем!


person WIOUW    schedule 10.01.2021    source источник


Ответы (1)


Да, это вполне возможно. Карта eBPF не привязана к интерфейсу, она создается в ядре, а затем на нее ссылается один или несколько из:

  • Дескриптор файла из приложения, создавшего карту,
  • Программа eBPF, использующая карту,
  • Ссылка на другую карту выделенного типа (массив карт, хэш-карт),
  • Закрепленный путь в виртуальной файловой системе eBPF.

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

Для повторного использования карты для нескольких программ это делается путем указания на одну и ту же карту при загрузке ваших программ: что происходит, когда вы загружаете одну карту, так это то, что вы получаете дескриптор карты (например, ее идентификатор или закрепленный путь), получить дескриптор файла для карты из этого дескриптора и поместить этот дескриптор файла в байт-код eBPF перед его загрузкой. Затем ядро ​​переводит дескриптор файла в соответствующий адрес памяти.

На практике чаще всего происходит то, что этот шаг «перемещения» (помещение файлового дескриптора в байт-код) обрабатывается за вас инфраструктурой, которую вы используете для загрузки своих программ, такой как инструменты libbpf или bcc. Например, в libbpf есть функция bpf_map__reuse_fd(struct bpf_map *map, int fd) для явного повторного использования заданного дескриптора файла для конкретной карты, используемой программой, после разбора объектного файла для извлечения байт-кода, но перед его загрузкой.

person Qeole    schedule 11.01.2021