第一部分需要 BPF_PROG_TYPE_SOCK_OPS BPF 程序来做,在建立套接字连接的时候,监听主动建连(BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB)和被动建连(BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB)事件,利用 bpf_sock_hash_update 函数将套接字存储到 sockmap(BPF_MAP_TYPE_SOCKHASH) 之中。 第二部分就需要 BPF_PROG_TYPE_...
目前,虽然它只能替换用于拥塞控制的struct tcp_congestion_ops结构,但大量的经验表明,在内核其他地方的应用将很快涌现。 用户空间API 在用户空间中,加载新的ops结构需要如下几个步骤。首先,使用bpf()系统调用以单独的BPF程序对每个函数的实现进行加载,这些BPF程序已经可以使用新的BPF_PROG_TYPE_STRUCT_OPS类型定义ops。
BPF_PROG_TYPE_XDP, BPF_PROG_TYPE_PERF_EVENT, BPF_PROG_TYPE_CGROUP_SKB, BPF_PROG_TYPE_CGROUP_SOCK, BPF_PROG_TYPE_LWT_IN, BPF_PROG_TYPE_LWT_OUT, BPF_PROG_TYPE_LWT_XMIT, BPF_PROG_TYPE_SOCK_OPS, BPF_PROG_TYPE_SK_SKB, BPF_PROG_TYPE_CGROUP_DEVICE, BPF_PROG_TYPE_SK_MSG, BPF_PROG_...
所以用来替换tcp_congestion_ops结构的就是bpf_tcp_congestion_ops。这个结构就是在user space在加载新的operation structure时要利用BTF ID来引用的structure了。最后,会在kernel/bpf/bpf_struct_ops_types.h里面增加如下一行: BPF_STRUCT_OPS_TYPE(tcp_congestion_ops) 最后是故意没有分号的。利用这些魔术一般的宏...
struct bpf_struct_ops_XYZ" from "struct XYZ". Register a struct_ops to a kernel subsystem: 1. Load all needed BPF_PROG_TYPE_STRUCT_OPS prog(s) 2. Create a BPF_MAP_TYPE_STRUCT_OPS with attr->btf_vmlinux_value_type_id set to the btf id "struct bpf_struct_ops_tcp_congestion_ops"...
BPF_PROG_TYPE_LIRC_MODE2, BPF_PROG_TYPE_SK_REUSEPORT, BPF_PROG_TYPE_FLOW_DISSECTOR, BPF_PROG_TYPE_CGROUP_SYSCTL, BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, BPF_PROG_TYPE_CGROUP_SOCKOPT, BPF_PROG_TYPE_TRACING, BPF_PROG_TYPE_STRUCT_OPS, ...
在bpf_object__open 阶段,libbpf 将寻找 SEC(".struct_ops") 部分,并找出 struct_ops 所实现的 btf 类型。 需要注意的是,这里的 btf-type 指的是 bpf_prog.o 的 btf 中的一个类型。 "struct bpf_map" 像其他 map 类型一样, 通过 bpf_object__add_map() 进行添加。 然后 libbpf 会收集(通过 SHT_...
BPF_PROG_TYPE_FLOW_DISSECTOR, /See /usr/include/linux/bpf.h for the full list./ };BPF MAPBPF 的 map 可用于内核 BPF 程序和用户应用程序之间实现双向的数据交换, 是重要基础数据结构,它可以通过声明 struct bpf_map_def 结构完成创建。关于 BPF 最吸引人的一个方面,就是运行在内核上的程序可以在运行...
BPF_PROG_TYPE_PERF_EVENT, BPF_PROG_TYPE_CGROUP_SKB, BPF_PROG_TYPE_CGROUP_SOCK, BPF_PROG_TYPE_LWT_IN, BPF_PROG_TYPE_LWT_OUT, BPF_PROG_TYPE_LWT_XMIT, BPF_PROG_TYPE_SOCK_OPS, BPF_PROG_TYPE_SK_SKB, BPF_PROG_TYPE_CGROUP_DEVICE, ...
实现为 eBPF 增加了BPF_MAP_TYPE_STRUCT_OPS新的 map 结构类型和BPF_PROG_TYPE_STRUCT_OPS的程序类型,当前阶段只支持对于内核中 TCP 拥塞结构 tcp_congestion_ops 的修改。 图1 整体实现的相关结构和代码片段 首先我们从如何使用样例程序入手(完整代码实现参见这里),这里我们省略与功能介绍不相干的内容:...