首页 > 解决方案 > bpf_xdp_adjust_meta() 返回 errcode -13(权限被拒绝)

问题描述

问题:

bpf_xdp_adjust_meta(ctx, -delta);当 delta > 32 时返回错误代码 -13(权限被拒绝)。
但是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;
}

设置:

内核:
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/样本/bpf
  2. xdp 教程/basic01

背景:

我正在尝试通过该xdp_md->data_meta字段传递数据,以使尾调用 eBPF 程序可以访问数据。为了调整 data_meta 指针,我调用了 eBPF 辅助函数bpf_xdp_adjust_meta(ctx, -delta);,其中 delta 是保存元数据的结构的大小。这工作正常,只要 delta <= 32。如果它更大,帮助函数返回 -13(权限被拒绝)。这就是为什么我猜测元数据的空间是 32 字节,而不是BPF 和 XDP 参考指南中所述的 256 字节。

标签: linux-kernellinux-device-driverbpfebpfxdp-bpf

解决方案


元数据的最大房间空间仅为 32 字节,因此您观察到的内容是预期的。

您可以通过阅读相关的内核代码引入该功能的提交日志来检查这一点。

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


推荐阅读