程序类型

简要概述

eBPF 程序类型大体上被分为两类:

  1. 性能追踪类型;
  2. 网络相关类型。

程序类型决定了它可以附加到哪些事件上,这反过来又定义了它能接收的上下文信息的类型,以及可调用的 helper 函数和 kfuncs 集合。

helper 函数

helper 函数是在内核中定义的 UAPI 稳定接口,如 uapi/linux/bpf.h,这些接口定义发布后就不会更改了,尽管内部函数或数据结构在将来的版本会发生变更。可使用 bpftool feature 查看当前内核支持的 helper 函数。

kfuncs 集合

与 helper 函数不同,kfuncs 不提供兼容性保证,因此开发者必须考虑到内核版本之间可能发生的变化。它允许内核函数在 BPF 子系统中注册,以便验证器允许它们被 eBPF 程序调用。

性能追踪类型

Tracepoints

它们绝不仅限于eBPF,并且长期以来一直被用来生成内核追踪输出,以及像SystemTap这样的工具。

当前内核支持的事件:

cat /sys/kernel/tracing/available_events

网络相关类型

所需运行权限

需要有 CAP_NET_ADMINCAP_BPF 能力,或者 CAP_SYS_ADMIN 能力。

下图是 BPF 程序类型在网络堆栈的各个点上钩子:

test

特性:Socket

TODO;

BPF_PROG_TYPE_SOCKET_FILTER
BPF_PROG_TYPE_SOCK_OPS
BPF_PROG_TYPE_SK_SKB

特性:Traffic Control

TODO;

TC 子系统用于控制网络流量的调度,同时也拥有操控、丢弃或重定向数据包的能力,附加在 TC 中的 eBPF 程序也可以作为复杂网络行为的构建基础。

在 TC 子系统中附加的 ebpf 程序会使用存储在内核网络堆栈中的 [sk_buff] 数据结构的指针作为上下文参数。

网络数据栈中的一部分数据流动有两个方向:入口(从网络接口传入)或出口(向网络接口传出)。eBPF程序可以在任何一个方向上进行附加,并且只会影响那个方向的流量。不同于XDP,可以附加多个序列处理的eBPF程序。

特性:XDP

通过 XDP(eXpress Data Path)可以把特定的程序附加到指定的网卡上。如通过 bpftool 挂载 “hello.bpf.o” 程序:

bpftool prog load hello.bpf.o /sys/fs/bpf/hello
bpftool net attach xdp id 540 dev eth0

或者通过 ip 进行挂载:

ip link set dev eth0 xdp obj hello.bpf.o sec xdp

卸载:

ip link set dev eth0 xdp off

特性:Flow Dissector

TODO;

特性:Lightweight Tunnels

TODO;

特性:Cgroups

TODO;

特性:Infrared Controllers

TODO;