28个版本 (11个稳定版)

2.3.0 2022年1月9日
2.2.0 2021年11月17日
2.1.0 2021年10月29日
1.3.0 2020年12月7日
0.9.6 2019年11月9日

#bpf 中排名第68

Download history 29/week @ 2024-03-14 20/week @ 2024-03-21 50/week @ 2024-03-28 28/week @ 2024-04-04 16/week @ 2024-04-11 30/week @ 2024-04-18 28/week @ 2024-04-25 14/week @ 2024-05-02 25/week @ 2024-05-09 98/week @ 2024-05-16 34/week @ 2024-05-23 49/week @ 2024-05-30 21/week @ 2024-06-06 15/week @ 2024-06-13 13/week @ 2024-06-20 6/week @ 2024-06-27

每月下载量59
用于 redbpf-macros

MIT/Apache

175KB
4K SLoC

C 2K SLoC // 0.1% comments Rust 1.5K SLoC // 0.2% comments Shell 114 SLoC // 0.1% comments BASH 4 SLoC

Rust API用于编写eBPF程序。

概述

redbpf-probesredbpf项目的一部分。它提供了一个惯用的Rust API,用于编写可以编译为eBPF字节码并由linux内核eBPF虚拟机执行的程序。

该crate预计将与配套的redbpf-macros crate一起使用 - 这是一个用于减少生成eBPF程序所需的样板代码数量的过程宏集合。

为了进一步简化与eBPF程序一起工作的过程,redbpf还提供了cargo-bpf - 一个用于简化创建和构建eBPF程序的cargo子命令。

示例

这就是redbpf_probesredbpf_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绑定的方法。

  1. 从系统预先安装的Linux内核头文件生成Rust绑定。Linux内核头文件位于bpf_sys::headers

  2. vmlinux.h生成Rust绑定。它由bpf_sys::type_gen现场生成。vmlinux是Linux内核的映像,因此可以从中将所有数据类型(包括内部结构体和枚举)转换为C源代码。

redBPF的用户可以通过设置以下解释的环境变量来选择首选的生成Rust绑定的方法。

方法选择规则

为了在两种方法之间选择一种方法,涉及三个环境变量:KERNEL_SOURCEKERNEL_VERSIONREDBPF_VMLINUX

情况1. 未设置

如果没有设置这三个环境变量中的任何一个,将尝试两种生成rust绑定的方法。首先尝试使用Linux内核头文件的方法。如果失败,则尝试使用vmlinux作为后备方法。

情况2. 当设置了 REDBPF_VMLINUX

REDBPF_VMLINUX 优先于环境变量 KERNEL_SOURCEKERNEL_VERSION。因此,生成BPF程序Linux内核数据结构rust绑定的方法是使用从vmlinux镜像生成的vmlinux.h。在这种情况下,不需要预安装的内核头文件。

情况3. REDBPF_VMLINUX 未设置,但设置了环境变量 KERNEL_SOURCEKERNEL_VERSION 中的任何一个

生成BPF程序Linux内核数据结构的rust绑定方法是使用指定路径中的内核头文件。在这种情况下,vmlinux根本不需要。

REDBPF_VMLINUX 可能的值

  1. 自定义vmlinux文件或原始BTF数据文件的路径
  • 例如,REDBPF_VMLINUX=/boot/my-vmlinux-5.11.0 指定了vmlinux镜像的路径。
  • 例如,REDBPF_VMLINUX=/sys/kernel/btf/vmlinux 设置了原始BTF数据文件的路径。
  1. REDBPF_VMLINUX=system 的特殊处理。如果提供了 system,redBPF将尝试从知名的系统路径探测vmlinux并使用它

  2. 未设置 REDBPF_VMLINUX。redBPF的行为取决于是否提供了环境变量 KERNEL_SOURCEKERNEL_VERSION

依赖项

~1.6–5.5MB
~99K SLoC