0

我刚刚从内核编译了 BPF 示例tools/testing/selftests/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!

这发生在内核 4.4.0-98 的 Ubuntu 16.04.3 LTS 上,llvm并且clang从包安装的版本 3.8iproute2是来自 github 的最新版本。

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

我究竟做错了什么?

4

1 回答 1

1

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

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

  • 如果您设法以某种方式加载该部分,我相信您在尝试将程序附加到内核时仍然会遇到问题。该功能称为“<a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=969bf05eb3cedd5a8d4b7c346a85c2ede87a6d6d" rel="nofollow noreferrer">direct数据包访问”仅存在于内核 4.7 及更高版本。这就是使您能够在您的程序中使用skb->data和使用的原因。skb->data_end

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

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

于 2017-11-22T11:16:48.920 回答