Не установлены флаги выключенного режима 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