Не установлены флаги выключенного режима XDP с ОЦК

Я пытаюсь запустить этот учебник XDP-код, который предоставляется в скрытой копии.

Я использую следующий код: https://github.com/iovisor/bcc/blob/master/examples/networking/xdp/xdp_drop_count.py.

и, насколько я понимаю, флаг XDP работает следующим образом (из этого вопроса):

#define XDP_FLAGS_SKB_MODE (1U << 1)
#define XDP_FLAGS_DRV_MODE (1U << 2)
#define XDP_FLAGS_HW_MODE (1U << 3)

Итак, разве это не значит, что если я немного изменю флаги

flags |= 1 << 3

Я должен быть в состоянии запустить этот код в аппаратном ускоренном режиме (выгружен)?

У меня есть сетевая карта, поддерживающая ускоренный режим XDP HW, и она прекрасно работает, когда я просто присоединяю простую программу с одной строкой кода:

return XDP_PASS;

и прикрепить его в режиме выгрузки с помощью ip link set dev interface xdpoffload и т.п.

Таким образом, я подтвердил, что мой сетевой адаптер способен загружать выгруженную программу XDP, но когда я пробую вышеописанное, он выдает мне ошибку:

bpf: Attaching prog to enp4s0np1: Invalid argumentTraceback (most recent call last) :
File "xdp_drop_count.py", line 132, in <module>
b. attach_xdp(device, fn, flags)
File "usr/lib/python2.7/dist-packages/bcc/__init__.py", line 723, in attach_xdp % (dev, errstr))
Exception : Failed to attach BPF to device enp4s0np1: No such file or directory

Кроме того, когда я устанавливаю флаги:

flags |= 1 << 2

Я не уверен, что это на самом деле работает программа XDP в режиме драйвера.

Я что-то пропустил?

Заранее спасибо.

1 ответ

Для того чтобы программа BPF была присоединена в качестве программы XDP, ее необходимо сначала выгружать в NIC при загрузке в систему.

В вашем случае b.load_func() предоставляемый bcc не поддерживает какую-либо опцию выгрузки программ при передаче их ядру. Поэтому, когда вы позже позвоните b.attach_xdp() с XDP_FLAGS_HW_MODE, функция завершается ошибкой, потому что она не может найти какую-либо программу, выгруженную на NIC.

В настоящее время нет обходного пути для разгрузки программы с ОЦК. Как упоминалось в pchaigno, функция просто не предлагает опцию, указывающую, что программа должна быть выгружена.

Не должно быть слишком сложно добавить поддержку выгрузки программ в bcc, поэтому, вероятно, она должна быть доступна в будущем (особенно, если pchaigno захочет добавить ее:p). Вам все равно придется заменить массив для каждого процессора на обычный массив в вашей программе, так как первый не поддерживается для разгрузки в настоящее время.

Что касается режима, в котором работают ваши программы, это то, что вы можете проверить с bpftool net например.

Если вы собираете bcc из исходников

С момента фиксации d147588, bcc поддерживает аппаратную разгрузку. Чтобы разгрузить программы с использованием bcc, вам понадобятся три вещи:

  • В XDP_FLAGS_HW_MODE немного (1U << 3) должны быть установлены во флагах, передаваемых в attach_xdp().
  • Имя интерфейса, на который вы хотите разгрузить программу, следует дать BPF() с device=параметр. Это позволит bcc выгружать карты на соответствующее устройство. В этом нет необходимости, если у вас нет карт.
  • Имя интерфейса также следует указать load_func, снова с параметром device=, так что bcc сообщает ядру, куда разгрузить программу.

Обратите внимание, что с последними источниками скрытой копии xdp_drop_count.py был обновлен скрипт, чтобы сделать все это за вас, когда вы пройдете -H вариант:

sudo ./xdp_drop_count.py -H $ETHNAME

Для более старых версий bcc

Более старые версии bcc не поддерживают разгрузку оборудования. Вы можете использоватьbpftool или ip (>v4.16), например:

sudo ip link set dev $ETHNAME xdpoffload obj prog.o sec .text
sudo bpftool prog load prog.o /sys/fs/bpf/prog type xdp dev $ETHNAME
Другие вопросы по тегам