【问题标题】:bpf_xdp_adjust_meta() returns errcode -13 (permission denied)bpf_xdp_adjust_meta() 返回 errcode -13(权限被拒绝)
【发布时间】:2021-10-12 17:41:45
【问题描述】:

问题:

bpf_xdp_adjust_meta(ctx, -delta); 在 delta > 32 时返回错误代码 -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
设备:
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);,其中 delta 是保存元数据的结构的大小。 这工作正常,只要 delta BPF and XDP Reference Guide 中所述的 256 字节。

【问题讨论】:

    标签: linux-kernel linux-device-driver bpf ebpf xdp-bpf


    【解决方案1】:

    元数据的最大空间空间只有 32 个字节,因此您观察到的结果是预期的。

    您可以通过阅读the relevant kernel codethe logs for the commit that introduced the feature 来检查这一点。

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

    【讨论】:

    • 非常有帮助的答案。这两个链接正是我需要的。谢谢你。现在我看到我应该看看implementation section 至少看看帮助器是如何实现的。
    猜你喜欢
    • 2016-04-04
    • 2017-08-05
    • 2014-03-24
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2018-07-19
    • 2017-04-20
    相关资源
    最近更新 更多