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