С attach_xdp, флаги управляют режимом?

Когда я использую xdp с eBPF, я подумал, что могу использовать ip link для установки режима.

Например,

ip link set dev eno1 xdpoffload obj xdp.o sec .text

Я хотел знать, как этот код xdpoffload или универсальный или собственный режим реализован в коде.

Поэтому я смотрел на другие коды и нашел что-то вроде:

attach_xdp(device, fn, flags)

Я полагаю, что флаги - это то место, куда должен входить флаг режима настройки?

Было бы здорово, если бы кто-то мог сказать мне, правда ли это, и если да, то какие цифры я мог бы использовать, чтобы выбрать вариант.

Заранее большое спасибо.

1 ответ

Решение

ip link получает режим XDP и действительно устанавливает флаги. Вы можете увидеть это в ip/iplink_xdp.c:

    if (!force)
        xdp.flags |= XDP_FLAGS_UPDATE_IF_NOEXIST;
    if (generic)
        xdp.flags |= XDP_FLAGS_SKB_MODE;
    if (drv)
        xdp.flags |= XDP_FLAGS_DRV_MODE;
    if (offload)
        xdp.flags |= XDP_FLAGS_HW_MODE;

Есть не так много доступных значений, и они находятся в заголовке, который поступает из Linux UAPI, if_link.h:

#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0)
#define XDP_FLAGS_SKB_MODE      (1U << 1)
#define XDP_FLAGS_DRV_MODE      (1U << 2)
#define XDP_FLAGS_HW_MODE       (1U << 3)
#define XDP_FLAGS_MODES         (XDP_FLAGS_SKB_MODE | \
                     XDP_FLAGS_DRV_MODE | \
                     XDP_FLAGS_HW_MODE)
#define XDP_FLAGS_MASK          (XDP_FLAGS_UPDATE_IF_NOEXIST | \
                     XDP_FLAGS_MODES)

Итак, в основном, три режима: универсальный / СКБ (xdpgeneric), родной / водитель (xdp) и аппаратная разгрузка (xdpoffload). Что будет подтверждено ip-link(8) страница справочника:

xdp object | pinned | off

установить (или сбросить) программу BPF XDP ("eXpress Data Path") для запуска на каждом пакете на уровне драйвера. ip link выход будет указывать xdp флаг для сетевого устройства. Если драйвер не имеет встроенной поддержки XDP, ядро ​​переключится на более медленный, не зависящий от драйвера "универсальный" вариант XDP. ip link выход в этом случае будет указывать xdpgeneric вместо xdp только. Если драйвер имеет встроенную поддержку XDP, но программа загружается в xdpgeneric object | pinned тогда ядро ​​будет использовать общий вариант XDP вместо собственного. xdpdrv имеет противоположный эффект запроса о том, что автоматический откат к универсальному варианту XDP должен быть отключен, и в случае, если драйвер не поддерживает XDP, должна быть возвращена ошибка. xdpdrv также отключает аппаратную разгрузку. xdpoffload в выводе iplink указывает, что программа была выгружена на аппаратное обеспечение и может также использоваться для запроса режима "разгрузки", очень похоже на xdpgeneric это заставляет программу быть установленным в HW/FW апатера.

После анализа аргументов командной строки xdp Объект отправляется в ядро ​​и присоединяется к выбранной ловушке XDP через сообщение netlink. Затем в ядре программа обрабатывается в соответствии с флагами, переданными из пространства пользователя.

(Вы можете использовать перекрестную ссылку или git grep, git log -S и т.д., чтобы отслеживать флаги, например, в исходных репозиториях.)

Другие вопросы по тегам