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§
- btf
- Parse and introspect btf information, from files or loaded objects.
- query
- Query the host about BPF
- skel
- Skeleton related definitions.
Macros§
- btf_
type_ match - A macro that allows matching on the type of a
BtfType
as if it was an enum.
Structs§
- Error
- The error type used by the library.
- Iter
- Represents a bpf iterator for reading kernel data structures. This requires Linux 5.8.
- Link
- Represents an attached
Program
. - Linker
- A type used for linking multiple BPF object files into a single one.
- Map
- Represents a libbpf-created map.
- MapFlags
- Flags to configure
Map
operations. - MapHandle
- A handle to a map. Handles can be duplicated and dropped.
- MapInfo
- A convenience wrapper for
bpf_map_info
. It provides the ability to retrieve the details of a certain map. - MapKey
Iter - An iterator over the keys of a BPF map.
- Object
- Represents a loaded BPF object file.
- Object
Builder - Builder for creating an
OpenObject
. Typically the entry point into libbpf-rs. - OpenMap
- Represents a parsed but not yet loaded BPF map.
- Open
Object - Represents an opened (but not yet loaded) BPF object file.
- Open
Program - Represents a parsed but not yet loaded BPF program.
- Perf
Buffer - Represents a special kind of
Map
. Typically used to transfer data betweenProgram
s and userspace. - Perf
Buffer Builder - Builds
PerfBuffer
instances. - Program
- Represents a loaded
Program
. - Program
Input - The input a program accepts.
- Program
Output - The output a program produces.
- Ring
Buffer - The canonical interface for managing a collection of
ringbuf
maps. - Ring
Buffer Builder - Builds
RingBuffer
instances. - TcHook
- Represents a location where a TC-BPF filter can be attached.
- TcHook
Builder - Builds
TcHook
instances. - Tracepoint
Opts - Options to optionally be provided when attaching to a tracepoint.
- Uprobe
Opts - Options to optionally be provided when attaching to a uprobe.
- Usdt
Opts - Options to optionally be provided when attaching to a USDT.
- User
Ring Buffer - Represents a user ring buffer. This is a special kind of map that is used to transfer data between user space and kernel space.
- User
Ring Buffer Sample - A mutable reference to sample from a
UserRingBuffer
. - Xdp
- Represents a XDP program.
- XdpFlags
- Flags to configure the
XDP
operations
Enums§
- Error
Kind - An enum providing a rough classification of errors.
- MapType
- Type of a
Map
. Maps toenum bpf_map_type
in kernel uapi. - Print
Level - An enum representing the different supported print levels.
- Program
Attach Type - Attach type of a
Program
. Maps toenum bpf_attach_type
in kernel uapi. - Program
Type - Type of a
Program
. Maps toenum bpf_prog_type
in kernel uapi.
Constants§
- TC_
CUSTOM - See
libbpf_sys::BPF_TC_CUSTOM
. - TC_
EGRESS - See
libbpf_sys::BPF_TC_EGRESS
. - TC_
H_ CLSACT - TC_
H_ INGRESS - TC_
H_ MIN_ EGRESS - TC_
H_ MIN_ INGRESS - TC_
INGRESS - See
libbpf_sys::BPF_TC_INGRESS
.
Traits§
- AsRaw
Libbpf - A trait implemented for types that are thin wrappers around
libbpf
types. - Error
Ext - A trait providing ergonomic chaining capabilities to
Error
. - MapCore
- A trait representing core functionality common to fully initialized maps.
Functions§
- get_
print - Return the current print callback and level.
- num_
possible_ cpus - Get the number of CPUs in the system, e.g., to interact with per-cpu maps.
- set_
print - Set a callback to receive log messages from libbpf, instead of printing them to stderr.
Type Aliases§
- Print
Callback - The type of callback functions suitable for being provided to
set_print
. - Result
- A result type using our
Error
by default. - TcAttach
Point - See
libbpf_sys::bpf_tc_attach_point
.