c - 为什么在 bpf_helpers 中定义了 load_half,但它没有出现在 filter.c 中?
问题描述
tools/testing/selftests/bpf/bpf_helpers.h
如果我在bpf 中理解“很好”,则定义了帮助原型。
如果我想现在哪些助手可用于特定程序类型,我需要在结果中搜索'func_proto(enum bpf_func_id func_id' kernel/ net/ drivers/
例如,要检查套接字过滤器程序可以调用的助手,我可以阅读以下定义
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);
}
}
问题:
1)我看不到load_half
,但我仍然可以从我的套接字过滤程序中调用它。为什么?socket_filter
2)和有什么区别sk_filter
?
解决方案
load_half()
不是 BPF 助手。您提到的文件bpf_helpers.h
确实声明了 BPF 辅助函数的原型,但它还包含其他有用的定义,例如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");
如您
load_half()
所见,LLVM 是内置的,它是由 clang/LLVM 支持的组件原语,load_half()
为了方便起见,它被包装了。而且因为它不是 BPF 助手,所以在内核中搜索它的原型时你不会看到它。该前缀
sk_filter
用于附加到套接字的 eBPF 过滤器,其方式与使用传统 cBPF 的方式类似,以过滤传入的数据包。虽然可能会让人感到困惑,但您可以看到sock_filter_is_valid_access
在内核文件net/core/filter.c
中用于cg_sock_verifier_ops
,它与include/uapi/linux/bpf.h
程序类型相关联BPF_PROG_TYPE_CGROUP_SOCK_ADDR
。所以它指的是在 cgroups 中使用的程序来帮助(容器化)应用程序正确绑定和连接它们的套接字。
推荐阅读
- java - 如何从作用于 Enum、Java 的接口中获取成员名称
- javascript - 用玩笑测试 App.tsx 期间的路由问题
- vue.js - 如何在 Vue 3 中访问导航守卫中的插件?
- powershell - 尝试合并数据但似乎停滞不前
- c++ - 从剪贴板获取数据并重新设置 - WINAPI,C
- java - Quarkus K8S 运算符 - 运行测试时执行 NoSuchField
- python - 如何批量重命名具有“父文件夹 + ...”名称的子文件夹
- python - 从抓取的数据中重新格式化字符串以满足关键字参数
- kubeflow - 如何更改 Kubeflow Pipeline Recurring Run 的参数?
- react-native - Android 存储 api 响应控制的缓存 http->cache (React-Native)