无法附加 eBPF blob

fail to attach eBPF blob

我刚刚从内核 tools/testing/selftests/bpf 编译了 BPF 示例,并尝试按照 http://cilium.readthedocs.io/en/v0.10/bpf/:

中的说明加载
% tc filter add dev enp0s1 ingress bpf \
    object-file ./net-next.git/tools/testing/selftests/bpf/sockmap_parse_prog.o \
    section sk_skb1 verbose 
Program section 'sk_skb1' not found in ELF file!
Error fetching program/map!

这发生在 Ubuntu 16.04.3 LTS 内核 4.4.0-98,llvmclang 版本 3.8 从软件包安装,iproute2 是最新来自 github.

我怀疑我 运行 有一些 toolchain/kernel version/features 不匹配。

我做错了什么?

我不知道 tc 为什么抱怨。在我的设置中,使用类似的命令,程序加载。不过,这里有一些提示:

  • 认为如您所言,问题可能来自内核头文件版本与 iproute2 之间的某些不兼容,并且某些重定位未能发生,尽管在快速调查中,我没有找到它拒绝加载该部分的确切原因。在我这边,我使用的是 clang-3.8,最新的 iproute2,还有最新的内核(一些提交接近 4.14)。

  • 如果您设法以某种方式加载该部分,我相信您在尝试将程序附加到内核时仍然会遇到问题。该功能称为“direct packet access” is only present on kernels 4.7 and higher。这就是使您能够在程序中使用 skb->dataskb->data_end 的原因。

  • 然后作为旁注,这个程序sockmap_parse_prog.c不打算与tc​​一起使用。它应该直接连接到套接字(在同一目录的文件 test_maps.c 中搜索 SOCKMAP_PARSE_PROG 以查看它是如何加载到那里的)。从技术上讲,这不会阻止将程序附加为 tc 过滤器,但它可能无法按预期工作。特别是,从程序返回的值可能没有 tc 分类器钩子理解的含义。

所以我建议您尝试使用最新的内核,看看您是否更成功。或者,尝试编译和 运行 您可以在自己的内核源代码中找到的示例。祝你好运!