无法附加eBPF blob

时间:2017-11-22 05:34:40

标签: linux-kernel bpf ebpf

我刚刚从内核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的最新版本。

我怀疑我遇到了一些工具链/内核版本/功能不匹配。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

  • 认为问题可能会出现,正如您所建议的那样,内核头文件版本和iproute2之间的某些不兼容性,以及某些重定位无法发生,尽管快速调查我没有找到它拒绝加载该部分的确切原因。在我这边我使用的是clang-3.8,最新的iproute2,还有最新的内核(有些提交接近4.14)。

  • 如果您设法以某种方式加载该部分,我相信在尝试在内核中附加程序时仍会遇到问题。名为“direct packet access”的功能仅出现在kernels 4.7 and higher上。这使您能够在程序中使用skb->dataskb->data_end

  • 然后作为旁注,此程序sockmap_parse_prog.c并不适用于tc。它应该直接附加到套接字(在同一目录中的文件SOCKMAP_PARSE_PROG中搜索test_maps.c以查看它是如何加载的)。从技术上讲,这并不妨碍人们将程序作为tc过滤器附加,但它可能无法按预期工作。特别是,从程序返回的值可能没有tc分类器钩子可以理解的含义。

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