4个版本
0.1.3 | 2021年9月22日 |
---|---|
0.1.2 | 2021年9月21日 |
0.1.1 | 2021年9月21日 |
0.1.0 | 2021年9月20日 |
#321 in #发布
480KB
1.5K SLoC
Rust API 用于编写eBPF程序。
概述
redbpf-probes
是 redbpf 项目的一部分。它提供了一个惯用的Rust API来编写可以编译为eBPF字节码并在Linux内核eBPF虚拟机上执行的程序。
预计此crate将与配套的 redbpf-macros
crate一起使用 - 这是一个过程宏集合,用于减少生成eBPF程序所需的样板代码量。
为了进一步简化处理eBPF程序的过程,redbpf
还提供了 cargo-bpf
- 一个cargo子命令,用于简化创建和构建eBPF程序。
示例
这是 redbpf_probes
和 redbpf_macros
在实际应用中的样子
#![no_std]
#![no_main]
use redbpf_probes::xdp::prelude::*;
program!(0xFFFFFFFE, "GPL");
#[xdp]
pub fn block_port_80(ctx: XdpContext) -> XdpResult {
if let Ok(transport) = ctx.transport() {
if transport.dest() == 80 {
return Ok(XdpAction::Drop);
}
}
Ok(XdpAction::Pass)
}
生成Rust绑定的方法
Linux内核的结构体和枚举的Rust绑定被BPF程序使用。redBPF提供了两种生成Rust绑定的方法。
-
从系统预先安装的Linux内核头文件生成Rust绑定。Linux内核头文件位于
bpf_sys::headers
。 -
从
vmlinux.h
生成Rust绑定。它由bpf_sys::type_gen
即时生成。vmlinux是Linux内核的映像,因此可以将所有数据类型(包括内部结构体和枚举)从vmlinux映像中导出到C源代码。
redBPF的用户可以通过设置以下解释的环境变量来选择生成Rust绑定的首选方法。
方法选择规则
为了在两种方法之间选择,涉及三个环境变量: KERNEL_SOURCE
、KERNEL_VERSION
和 REDBPF_VMLINUX
。
情况1. 没有设置
如果这三个环境变量都没有设置,将尝试两种生成Rust绑定的方法。首先尝试使用Linux内核头文件的方法。如果失败,则尝试使用vmlinux作为后备方法。
情况2. 当设置了 REDBPF_VMLINUX
时
REDBPF_VMLINUX
的优先级高于环境变量 KERNEL_SOURCE
和 KERNEL_VERSION
。因此,生成 BPF 程序的 Linux 内核数据结构 rust 绑定的方法是使用从 vmlinux 图像生成的 vmlinux.h 文件。在这种情况下,不需要预安装的内核头文件。
情况 3:未设置 REDBPF_VMLINUX
,但设置了任一环境变量 KERNEL_SOURCE
或 KERNEL_VERSION
生成 BPF 程序的 Linux 内核数据结构 rust 绑定的方法是使用指定路径中的内核头文件。在这种情况下,根本不需要 vmlinux。
REDBPF_VMLINUX
的可能值
-
自定义 vmlinux 的路径。例如:
REDBPF_VMLINUX=/boot/my-vmlinux-5.11.0
-
对
REDBPF_VMLINUX=system
的特殊处理。如果提供了 system,redBPF 将尝试从已知的系统路径探测 vmlinux 并使用它 -
未设置
REDBPF_VMLINUX
。redBPF 的行为取决于是否提供了环境变量KERNEL_SOURCE
和KERNEL_VERSION
依赖项
~1.6–5.5MB
~102K SLoC