Crate bpf_feature
source · [−]Expand description
A library focused on detecting supported eBPF features on the current host
Background
The approaches here taken are similar to the way bpftool
probes functionality on the host. We recommend users use the bpftool feature
subcommand for interactive display of eBPF feature support but we
developed this library for incorporating these detection techniques within Rust apps.
Compatibility with bpftool
This library is aimed to exactly match the detection features of bpftool feature
. If
this is not the case, we consider it a bug.
As an example of this, we recreated the default output of bpftool feature
here:
examples/feature-probe.rs
JSON
We also support JSON output. This is powered by Serde,
a popular serialization crate. Note that the JSON output differs in structure
from the output of bpftool feature probe --json
but semantically should be
identical.
To see an example of JSON out, see the example
examples/json-dump.rs
.
Serialization support is NOT enabled by default. Please pass in the serde
feature to enable.
Other serialization formats
Because of the abstraction Serde provides, we are not restricted to JSON and it is possible to support other serialization formats. This should work out of the box but if issues occur, please let us know.
Design
For detecting all functionality, we’ve exported a singular function detect
that can be configured with options through DetectOpts
(to pass in the
defaults you can use DetectOpts::default()
):
use bpf_feature::{detect, DetectOpts};
let features = detect(DetectOpts::default());
// ...
Modularity
detect
is not the only entrypoint publicly exported. We have organized
related features into modules that export specific detections through a
features()
function:
This means that in your application can choose which features to run:
use bpf_feature::kernel_config::{self, KERNEL_CONFIG_KEYS, KernelConfig};
match kernel_config::features() {
Ok(KernelConfig { values }) => KERNEL_CONFIG_KEYS.iter().for_each(|&key| {
match values.get(key) {
Some(value) => println!("{} is set to {}", key, value),
None => println!("{} is not set", key),
};
}),
Err(err) => println!("skipping kernel config, {}", err),
}
Modules
Features related specifically to eBPF program development
Features derived from compile-time kernel configuration
Features for miscellaneous eBPF subsystem properties
Features available and configurable through procfs
Structs
Options that can be passed into detect
Functions
Primary function to run entire feature detection set