linux-kernel - 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 模式。
满载:
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);
,其中 delta 是保存元数据的结构的大小。这工作正常,只要 delta <= 32。如果它更大,帮助函数返回 -13(权限被拒绝)。这就是为什么我猜测元数据的空间是 32 字节,而不是BPF 和 XDP 参考指南中所述的 256 字节。
解决方案
元数据的最大房间空间仅为 32 字节,因此您观察到的内容是预期的。
您可以通过阅读相关的内核代码或引入该功能的提交日志来检查这一点。
您引用的文档是指您可以修改的封装标头的房间大小bpf_xdp_adjust_head()
,而不是元数据的大小。诚然,文本中并不清楚(但欢迎 PR!)。
推荐阅读
- mysql - MySQL 使用 If 条件在 While-Loop 中设置变量
- xamarin.forms - xamarin 表单 - 图像包裹在框架中(带有属性cornerRadius 集)不显示圆角
- javascript - 根据元素宽度和高度计算 X 和 Y
- ibm-watson - Swift 中的 IBM Watson 助手问题
- typescript - TS 属性在仅检查其存在后不存在
- laravel - 如何避免连接在 10000 毫秒后超时?
- sql - 如果 value 为 double,则返回 SQL
- angular - rxjs5 在依赖项中注册时 ng test 命令出现 rxjs 6 错误
- javascript - 为什么 promise 的被拒绝参数在其范围之外起作用?
- javascript - 如何在 wordpress 上包含外部代码/库 javascript?