bpf_xdp_adjust_meta() возвращает код ошибки -13 (отказано в доступе)

avatar
n1kb3rt
8 августа 2021 в 22:14
194
1
4

Проблема:

bpf_xdp_adjust_meta(ctx, -delta); возвращает код ошибки -13 (отказано в доступе), когда дельта > 32.
Но Справочное руководство по BPF и XDP ​​утверждает, что для метаданных имеется запас в 256 байт.
Значит я что-то не так понял или как можно использовать 256 байт для метаданных?

Программа:

int xdp_prog_simple(struct xdp_md *ctx)
{   
    bpf_printk("---BPF DEBUG--- adjust_meta: %d\n", bpf_xdp_adjust_meta(ctx, -36));
    return XDP_PASS;
}

Настройка:

Kernel:
uname -rv
5.8.0-63-generic #71-Ubuntu SMP Tue Jul 13 15:59:12 UTC 2021
Device:
veth из xdp-tutorial/testenv, потому что мой аппаратный драйвер не поддерживает собственный режим xdp.

  • ip link set dev test xdp obj xdp_pass_kern.o sec xdp и проверил, что программа подключена в основном режиме xdp.
  • bpf_set_link_xdp_fd() из пользовательской программы

Я также пытался использовать различные среды компиляции (со значениями по умолчанию Makefile):

  1. linux/samples/bpf
  2. xdp-tutorial/basic01

Фон:

Я пытаюсь передать данные через поле xdp_md->data_meta, чтобы сделать данные доступными для программ eBPF с хвостовым вызовом. Чтобы настроить указатель data_meta, я вызываю вспомогательную функцию eBPF bpf_xdp_adjust_meta(ctx, -delta);, где дельта — это размер структуры, содержащей метаданные. Это работает нормально, пока дельта <= 32. Если она больше, вспомогательная функция возвращает -13 (отказано в доступе). Вот почему я предполагаю, что запас для метаданных в моем случае составляет 32 байта вместо 256 байтов, как указано в Справочном руководстве по BPF и XDP.

Источник

Ответы (1)

avatar
Qeole
9 августа 2021 в 08:16
2

Максимальное пространство для метаданных составляет всего 32 байта, поэтому то, что вы видите, ожидаемо.

Вы можете проверить это, прочитав соответствующий код ядра или журналы коммита, который представил эту функцию.

Процитированная вами документация относится к размеру комнаты для заголовков инкапсуляции, которые вы можете изменить с помощью bpf_xdp_adjust_head(), а не к размеру метаданных. Правда из текста непонятно (но пиар приветствуется!).

n1kb3rt
9 августа 2021 в 11:19
1

Действительно полезный ответ. Эти две ссылки были именно тем, что мне было нужно. Спасибо. Теперь я понял, что мне нужно было заглянуть в раздел реализации, чтобы хотя бы увидеть, как реализован помощник.