为什么在bpf_helpers中定义了load_half但在filter.c中却没有出现?

时间:2019-09-05 08:23:28

标签: c header prototype ebpf

如果我了解const void*内的bpf heleprs原型是“很好”,那么

如果我现在想在特定程序类型中使用哪些助手,我需要在tools/testing/selftests/bpf/bpf_helpers.h的结果中进行搜索

例如检查套接字过滤器程序可以调用的助手,我可以阅读以下定义

'func_proto(enum bpf_func_id func_id' kernel/ net/ drivers/

问题:

1)我看不到static const struct bpf_func_proto * sock_filter_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog) { switch (func_id) { /* inet and inet6 sockets are created in a process * context so there is always a valid uid/gid */ case BPF_FUNC_get_current_uid_gid: return &bpf_get_current_uid_gid_proto; case BPF_FUNC_get_local_storage: return &bpf_get_local_storage_proto; default: return bpf_base_func_proto(func_id); } } ,但仍然可以从套接字过滤器程序中调用它。为什么? 2)load_halfsocket_filter之间有什么区别?

1 个答案:

答案 0 :(得分:1)

  1. docker run --name ai --rm -it -v /C/AI_project/:/AI_project project:latest bash 不是BPF助手。您提到的文件load_half()确实声明了BPF辅助函数的原型,但是它还包含其他有用的定义,例如bpf_helpers.hSEC()宏。特别是,它使用以下注释声明bpf_printk()

    load_half()

    如您所见,/* llvm builtin functions that eBPF C program may use to * emit BPF_LD_ABS and BPF_LD_IND instructions */ [...] unsigned long long load_half(void *skb, unsigned long long off) asm("llvm.bpf.load.half"); 是LLVM内置的,这是clang / LLVM支持的程序集原语,为方便起见,它包装为load_half()。而且由于它不是BPF帮助器,因此在内核中grepping其原型时将看不到它。

  2. 前缀load_half()用于连接到套接字的eBPF过滤器,其过滤方式类似于对传统cBPF的过滤方式,以过滤传入的数据包。尽管可能会引起混淆,但是您可以看到内核文件sk_filter中的sock_filter_is_valid_access用于net/core/filter.ccg_sock_verifier_opsinclude/uapi/linux/bpf.h中与程序类型BPF_PROG_TYPE_CGROUP_SOCK_ADDR相关联。因此,它指的是cgroup中使用的程序正确help (containerised) applications to bind and connect其套接字。