bpf_xdp_adjust_meta() returns errcode -13(权限被拒绝)

bpf_xdp_adjust_meta() returns errcode -13 (permission denied)

问题:

当 delta > 32 时,

bpf_xdp_adjust_meta(ctx, -delta); 返回错误代码 -13(权限被拒绝)。
但是 BPF and XDP Reference Guide 指出元数据有 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;
}

设置:

内核:
uname -rv
5.8.0-63-generic #71-Ubuntu SMP Tue Jul 13 15:59:12 UTC 2021
设备:
来自 xdp-tutorial/testenv 的 veth,因为我的硬件驱动程序不支持本机 xdp 模式。
已加载:

我也尝试过使用不同的编译环境(默认Makefile):

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

背景:

我正在尝试通过 xdp_md->data_meta 字段传递数据,以使尾调用 eBPF 程序可以访问数据。为了调整 data_meta 指针,我调用了 eBPF 辅助函数 bpf_xdp_adjust_meta(ctx, -delta);,其中 delta 是保存元数据的结构的大小。 这工作正常,只要 delta <= 32。如果它更大,辅助函数 returns -13(权限被拒绝)。这就是为什么我猜元数据的余量在我的例子中是 32 个字节,而不是 BPF and XDP Reference Guide.

中所述的 256 个字节

元数据 的最大空间 space 只有 32 字节 ,所以您观察到的是预期的。

您可以通过阅读 the relevant kernel code, or the logs for the commit that introduced the feature 进行检查。

您引用的文档指的是您可以使用 bpf_xdp_adjust_head() 修改的封装空间大小 headers,而不是元数据的大小。诚然,从文本中看不清楚(但欢迎 PR!)。