我刚刚从内核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,llvm
和clang
版本3.8从软件包安装,iproute2
是github的最新版本。
我怀疑我遇到了一些工具链/内核版本/功能不匹配。
我做错了什么?
答案 0 :(得分:1)
我不知道为什么tc抱怨。在我的设置中,使用类似的命令,程序加载。不过,这里有一些提示:
我认为问题可能会出现,正如您所建议的那样,内核头文件版本和iproute2之间的某些不兼容性,以及某些重定位无法发生,尽管快速调查我没有找到它拒绝加载该部分的确切原因。在我这边我使用的是clang-3.8,最新的iproute2,还有最新的内核(有些提交接近4.14)。
如果您设法以某种方式加载该部分,我相信在尝试在内核中附加程序时仍会遇到问题。名为“direct packet access”的功能仅出现在kernels 4.7 and higher上。这使您能够在程序中使用skb->data
和skb->data_end
。
然后作为旁注,此程序sockmap_parse_prog.c
并不适用于tc。它应该直接附加到套接字(在同一目录中的文件SOCKMAP_PARSE_PROG
中搜索test_maps.c
以查看它是如何加载的)。从技术上讲,这并不妨碍人们将程序作为tc过滤器附加,但它可能无法按预期工作。特别是,从程序返回的值可能没有tc分类器钩子可以理解的含义。
所以我建议尝试使用最近的内核,看看你是否有更多的成功。或者,尝试编译并运行您可以在自己的内核源代码中找到的示例。祝你好运!