如果我了解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_half
和socket_filter
之间有什么区别?
答案 0 :(得分:1)
docker run --name ai --rm -it -v /C/AI_project/:/AI_project project:latest bash
不是BPF助手。您提到的文件load_half()
确实声明了BPF辅助函数的原型,但是它还包含其他有用的定义,例如bpf_helpers.h
或SEC()
宏。特别是,它使用以下注释声明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其原型时将看不到它。
前缀load_half()
用于连接到套接字的eBPF过滤器,其过滤方式类似于对传统cBPF的过滤方式,以过滤传入的数据包。尽管可能会引起混淆,但是您可以看到内核文件sk_filter
中的sock_filter_is_valid_access
用于net/core/filter.c
,cg_sock_verifier_ops
在include/uapi/linux/bpf.h
中与程序类型BPF_PROG_TYPE_CGROUP_SOCK_ADDR
相关联。因此,它指的是cgroup中使用的程序正确help (containerised) applications to bind and connect其套接字。