| //! # libbpf-rs |
| //! |
| //! `libbpf-rs` is a safe, idiomatic, and opinionated wrapper around |
| //! [libbpf](https://github.com/libbpf/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](https://facebookmicrosites.github.io/bpf/blog/2020/02/19/bpf-portability-and-co-re.html). |
| //! |
| //! ## High level workflow |
| //! |
| //! 1. Create new rust project (via `cargo new` or similar) at path `$PROJ_PATH` |
| //! 2. Create directory `$PROJ_PATH/src/bpf` |
| //! 3. 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. |
| //! 4. Create a [build script](https://doc.rust-lang.org/cargo/reference/build-scripts.html) that |
| //! builds and generates a skeleton module using `libbpf_cargo::SkeletonBuilder` |
| //! 5. Write your userspace code by importing and using the generated module. Import the |
| //! module by using the [path |
| //! attribute](https://doc.rust-lang.org/reference/items/modules.html#the-path-attribute). |
| //! Your userspace code goes in `$PROJ_PATH/src/` as it would in a normal rust project. |
| //! 6. 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. |
| //! |
| //! 1. Follow steps 1-3 of "High level workflow" |
| //! 2. Generate a BPF object file. Options include manually invoking `clang`, creating a build |
| //! script to invoke `clang`, or using `libbpf-cargo` cargo plugins. |
| //! 3. Write your userspace code in `$PROJ_PATH/src/` as you would a normal rust project and point |
| //! libbpf-rs at your BPF object file |
| //! 4. Continue regular rust workflow (ie `cargo build`, `cargo run`, etc) |
| //! |
| //! ## Design |
| //! |
| //! libbpf-rs models various "phases": |
| //! ```text |
| //! 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. |
| //! |
| //! [See example here](https://github.com/libbpf/libbpf-rs/tree/master/examples/runqslower). |
| |
| #![allow(clippy::let_and_return, clippy::let_unit_value)] |
| #![warn( |
| elided_lifetimes_in_paths, |
| missing_debug_implementations, |
| missing_docs, |
| single_use_lifetimes, |
| clippy::absolute_paths, |
| clippy::wildcard_imports, |
| rustdoc::broken_intra_doc_links |
| )] |
| #![deny(unsafe_op_in_unsafe_fn)] |
| |
| pub mod btf; |
| mod error; |
| mod iter; |
| mod link; |
| mod linker; |
| mod map; |
| mod object; |
| mod perf_buffer; |
| mod print; |
| mod program; |
| pub mod query; |
| mod ringbuf; |
| mod skeleton; |
| mod tc; |
| mod user_ringbuf; |
| mod util; |
| mod xdp; |
| |
| pub use libbpf_sys; |
| |
| pub use crate::btf::Btf; |
| pub use crate::btf::HasSize; |
| pub use crate::btf::ReferencesType; |
| pub use crate::error::Error; |
| pub use crate::error::ErrorExt; |
| pub use crate::error::ErrorKind; |
| pub use crate::error::Result; |
| pub use crate::iter::Iter; |
| pub use crate::link::Link; |
| pub use crate::linker::Linker; |
| pub use crate::map::Map; |
| pub use crate::map::MapCore; |
| pub use crate::map::MapFlags; |
| pub use crate::map::MapHandle; |
| pub use crate::map::MapInfo; |
| pub use crate::map::MapKeyIter; |
| pub use crate::map::MapMut; |
| pub use crate::map::MapType; |
| pub use crate::map::OpenMap; |
| pub use crate::map::OpenMapMut; |
| pub use crate::object::AsRawLibbpf; |
| pub use crate::object::MapIter; |
| pub use crate::object::Object; |
| pub use crate::object::ObjectBuilder; |
| pub use crate::object::OpenObject; |
| pub use crate::object::ProgIter; |
| pub use crate::perf_buffer::PerfBuffer; |
| pub use crate::perf_buffer::PerfBufferBuilder; |
| pub use crate::print::get_print; |
| pub use crate::print::set_print; |
| pub use crate::print::PrintCallback; |
| pub use crate::print::PrintLevel; |
| pub use crate::program::Input as ProgramInput; |
| pub use crate::program::OpenProgram; |
| pub use crate::program::OpenProgramMut; |
| pub use crate::program::Output as ProgramOutput; |
| pub use crate::program::Program; |
| pub use crate::program::ProgramAttachType; |
| pub use crate::program::ProgramMut; |
| pub use crate::program::ProgramType; |
| pub use crate::program::TracepointOpts; |
| pub use crate::program::UprobeOpts; |
| pub use crate::program::UsdtOpts; |
| pub use crate::ringbuf::RingBuffer; |
| pub use crate::ringbuf::RingBufferBuilder; |
| pub use crate::tc::TcAttachPoint; |
| pub use crate::tc::TcHook; |
| pub use crate::tc::TcHookBuilder; |
| pub use crate::tc::TC_CUSTOM; |
| pub use crate::tc::TC_EGRESS; |
| pub use crate::tc::TC_H_CLSACT; |
| pub use crate::tc::TC_H_INGRESS; |
| pub use crate::tc::TC_H_MIN_EGRESS; |
| pub use crate::tc::TC_H_MIN_INGRESS; |
| pub use crate::tc::TC_INGRESS; |
| pub use crate::user_ringbuf::UserRingBuffer; |
| pub use crate::user_ringbuf::UserRingBufferSample; |
| pub use crate::util::num_possible_cpus; |
| pub use crate::xdp::Xdp; |
| pub use crate::xdp::XdpFlags; |
| |
| |
| /// An unconstructible dummy type used for tagging mutable type |
| /// variants. |
| #[doc(hidden)] |
| #[derive(Copy, Clone, Debug)] |
| pub enum Mut {} |
| |
| |
| /// Used for skeleton -- an end user may not consider this API stable |
| #[doc(hidden)] |
| pub mod __internal_skel { |
| pub use super::skeleton::*; |
| } |
| |
| /// Skeleton related definitions. |
| pub mod skel { |
| pub use super::skeleton::OpenSkel; |
| pub use super::skeleton::Skel; |
| pub use super::skeleton::SkelBuilder; |
| } |