可以看看现成的示例,参考 `Linux` 源码树的 `tools/testing/selftests/bpf` 和 `samples/bpf`。
BPF 程序类型 | 函数参数 |
BPF_PROG_TYPE_SOCKET_FILTER | struct __sk_buff * |
BPF_PROG_TYPE_KPROBE | struct pt_regs * |
BPF_PROG_TYPE_SCHED_CLS | struct __sk_buff * |
BPF_PROG_TYPE_SCHED_ACT | struct __sk_buff * |
BPF_PROG_TYPE_TRACEPOINT | struct trace_event_raw_${EVENT_NAME} * |
BPF_PROG_TYPE_XDP | struct xdp_md * |
BPF_PROG_TYPE_PERF_EVENT | struct bpf_perf_event_data * |
BPF_PROG_TYPE_CGROUP_SKB | struct __sk_buff * |
BPF_PROG_TYPE_CGROUP_SOCK | struct bpf_sock * |
BPF_PROG_TYPE_LWT_IN | struct __sk_buff * |
BPF_PROG_TYPE_LWT_OUT | struct __sk_buff * |
BPF_PROG_TYPE_LWT_XMIT | struct __sk_buff * |
BPF_PROG_TYPE_SOCK_OPS | struct bpf_sock_ops * |
BPF_PROG_TYPE_SK_SKB | struct __sk_buff * |
BPF_PROG_TYPE_CGROUP_DEVICE | struct bpf_cgroup_dev_ctx * |
BPF_PROG_TYPE_SK_MSG | struct sk_msg_md * |
BPF_PROG_TYPE_RAW_TRACEPOINT | struct bpf_raw_tracepoint_args * |
BPF_PROG_TYPE_CGROUP_SOCK_ADDR | struct bpf_sock_addr * |
BPF_PROG_TYPE_LWT_SEG6LOCAL | struct __sk_buff * |
BPF_PROG_TYPE_LIRC_MODE2 | unsigned int * |
BPF_PROG_TYPE_SK_REUSEPORT | struct sk_reuseport_md * |
BPF_PROG_TYPE_FLOW_DISSECTOR | struct __sk_buff * |
BPF_PROG_TYPE_CGROUP_SYSCTL | struct bpf_sysctl * |
BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE | struct bpf_raw_tracepoint_args * |
BPF_PROG_TYPE_CGROUP_SOCKOPT | struct bpf_sockopt * |
BPF_PROG_TYPE_TRACING | array of u64 |
BPF_PROG_TYPE_STRUCT_OPS | array of u64 |
BPF_PROG_TYPE_EXT | depends on target program |
BPF_PROG_TYPE_LSM | array of u64 |
BPF_PROG_TYPE_SK_LOOKUP | struct bpf_sk_lookup * |
BPF_PROG_TYPE_SYSCALL | custom data structure |
BPF_PROG_TYPE_TRACEPOINT 的参数可以参见前文的介绍。
BPF_PROG_TYPE_TRACING / BPF_PROG_TYPE_STRUCT_OPS / BPF_PROG_TYPE_LSM 这几种程序类型的参数还与 Attach 类型有关,后面用到再详细介绍。
BPF_PROG_TYPE_EXT 很有意思,感兴趣的读者可以看看 `libxdp` 中利用它来实现 XDP dispatcher。
BPF_PROG_TYPE_SYSCALL 的参数就是用户提供的一段内存,当前只能通过 `bpf_prog_test_run` 运行。
以上仅作参考,如果疏漏,欢迎留言指正。