Expand description
§libbpf-rs
libbpf-rs
is a safe, idiomatic, and opinionated wrapper around
libbpf.
libbpf-rs, together with libbpf-cargo
(libbpf cargo plugin) allow you
to write Compile-Once-Run-Everywhere (CO-RE) eBPF programs. Note this document
uses “eBPF” and “BPF” interchangeably.
More information about CO-RE is available here.
§High level workflow
- Create new rust project (via
cargo new
or similar) at path$PROJ_PATH
- Create directory
$PROJ_PATH/src/bpf
- Write CO-RE bpf code in
$PROJ_PATH/src/bpf/${MYFILE}.bpf.c
, where$MYFILE
may be any valid filename. Note the.bpf.c
extension is required. - Create a build script that
builds and generates a skeleton module using
libbpf_cargo::SkeletonBuilder
- Write your userspace code by importing and using the generated module. Import the
module by using the path
attribute.
Your userspace code goes in
$PROJ_PATH/src/
as it would in a normal rust project. - Continue regular rust workflow (ie
cargo build
,cargo run
, etc)
§Alternate workflow
While using the skeleton is recommended, it is also possible to directly use libbpf-rs.
- Follow steps 1-3 of “High level workflow”
- Generate a BPF object file. Options include manually invoking
clang
, creating a build script to invokeclang
, or usinglibbpf-cargo
cargo plugins. - Write your userspace code in
$PROJ_PATH/src/
as you would a normal rust project and point libbpf-rs at your BPF object file - Continue regular rust workflow (ie
cargo build
,cargo run
, etc)
§Design
libbpf-rs models various “phases”:
from_*() load()
| |
v v
ObjectBuilder -> OpenObject -> Object
^ ^
| |
<pre-load modifications> |
|
<post-load interactions>
The entry point into libbpf-rs is ObjectBuilder
. ObjectBuilder
helps open the BPF object
file. After the object file is opened, you are returned an OpenObject
where you can
perform all your pre-load operations. Pre-load means before any BPF maps are created or BPF
programs are loaded and verified by the kernel. Finally, after the BPF object is loaded, you
are returned an Object
instance where you can read/write to BPF maps, attach BPF programs
to hooks, etc.
You must keep the Object
alive the entire duration you interact with anything inside the
BPF object it represents. This is further documented in Object
documentation.
§Example
This is probably the best way to understand how libbpf-rs and libbpf-cargo work together.
Re-exports§
pub use crate::btf::Btf;
pub use crate::btf::HasSize;
pub use crate::btf::ReferencesType;
pub use libbpf_sys;
Modules§
- Parse and introspect btf information, from files or loaded objects.
- Query the host about BPF
- Skeleton related definitions.
Macros§
- A macro that allows matching on the type of a
BtfType
as if it was an enum.
Structs§
- The error type used by the library.
- Represents a bpf iterator for reading kernel data structures. This requires Linux 5.8.
- Represents an attached
Program
. - A type used for linking multiple BPF object files into a single one.
- Flags to configure
Map
operations. - A handle to a map. Handles can be duplicated and dropped.
- Represents a libbpf-created map.
- A convenience wrapper for
bpf_map_info
. It provides the ability to retrieve the details of a certain map. - An iterator over the maps in a BPF object.
- An iterator over the keys of a BPF map.
- Options to be provided when attaching a program to a netfilter hook.
- Represents a loaded BPF object file.
- Builder for creating an
OpenObject
. Typically the entry point into libbpf-rs. - Represents a parsed but not yet loaded BPF map.
- Represents an opened (but not yet loaded) BPF object file.
- Represents a parsed but not yet loaded BPF program.
- Builds
PerfBuffer
instances. - An iterator over the programs in a BPF object.
- Represents a loaded
Program
. - The input a program accepts.
- The output a program produces.
- The canonical interface for managing a collection of
ringbuf
maps. - Builds
RingBuffer
instances. - Represents a location where a TC-BPF filter can be attached.
- Builds
TcHook
instances. - Options to optionally be provided when attaching to a tracepoint.
- Options to optionally be provided when attaching to a uprobe.
- Options to optionally be provided when attaching to a USDT.
- Represents a user ring buffer. This is a special kind of map that is used to transfer data between user space and kernel space.
- A mutable reference to sample from a
UserRingBuffer
. - Represents a XDP program.
- Flags to configure the
XDP
operations
Enums§
- An enum providing a rough classification of errors.
- Type of a
Map
. Maps toenum bpf_map_type
in kernel uapi. - An enum representing the different supported print levels.
- Attach type of a
Program
. Maps toenum bpf_attach_type
in kernel uapi. - Type of a
Program
. Maps toenum bpf_prog_type
in kernel uapi.
Constants§
- Netfilter protocol family for IPv4.
- Netfilter protocol family for IPv6.
- Netfilter hook number for packet forwarding (2).
- Netfilter hook number for local input (1).
- Netfilter hook number for local output (3).
- Netfilter hook number for post-routing (4).
- Netfilter hook number for pre-routing (0).
Traits§
- A trait implemented for types that are thin wrappers around
libbpf
types. - A trait providing ergonomic chaining capabilities to
Error
. - A trait representing core functionality common to fully initialized maps.
Functions§
- Return the current print callback and level.
- Get the number of CPUs in the system, e.g., to interact with per-cpu maps.
- Set a callback to receive log messages from libbpf, instead of printing them to stderr.
Type Aliases§
- An immutable loaded BPF map.
- A mutable loaded BPF map.
- An immutable parsed but not yet loaded BPF map.
- A mutable parsed but not yet loaded BPF map.
- An immutable parsed but not yet loaded BPF program.
- A mutable parsed but not yet loaded BPF program.
- The type of callback functions suitable for being provided to
set_print
. - An immutable loaded BPF program.
- A mutable loaded BPF program.
- A result type using our
Error
by default.