|
|
|
@ -55,6 +55,7 @@ pub(crate) struct bpf_map_def {
|
|
|
|
|
pub(crate) map_flags: u32,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Used to work with eBPF programs and maps.
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
pub struct Bpf {
|
|
|
|
|
maps: HashMap<String, MapLock>,
|
|
|
|
@ -62,6 +63,20 @@ pub struct Bpf {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Bpf {
|
|
|
|
|
/// Loads eBPF bytecode from a file.
|
|
|
|
|
///
|
|
|
|
|
/// Parses the given object code file and initializes the [maps](crate::maps) defined in it. If
|
|
|
|
|
/// the kernel supports [BTF](Btf) debug info, it is automatically loaded from
|
|
|
|
|
/// `/sys/kernel/btf/vmlinux`.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
///
|
|
|
|
|
/// ```no_run
|
|
|
|
|
/// use aya::Bpf;
|
|
|
|
|
///
|
|
|
|
|
/// let bpf = Bpf::load_file("file.o")?;
|
|
|
|
|
/// # Ok::<(), aya::BpfError>(())
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn load_file<P: AsRef<Path>>(path: P) -> Result<Bpf, BpfError> {
|
|
|
|
|
let path = path.as_ref();
|
|
|
|
|
Bpf::load(
|
|
|
|
@ -73,6 +88,23 @@ impl Bpf {
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Load eBPF bytecode.
|
|
|
|
|
///
|
|
|
|
|
/// Parses the object code contained in `data` and initializes the [maps](crate::maps) defined
|
|
|
|
|
/// in it. If `target_btf` is `Some` and `data` includes BTF debug info, [BTF](Btf) relocations
|
|
|
|
|
/// are applied as well.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
///
|
|
|
|
|
/// ```no_run
|
|
|
|
|
/// use aya::{Bpf, Btf};
|
|
|
|
|
/// use std::fs;
|
|
|
|
|
///
|
|
|
|
|
/// let data = fs::read("file.o").unwrap();
|
|
|
|
|
/// // load the BTF data from /sys/kernel/btf/vmlinux
|
|
|
|
|
/// let bpf = Bpf::load(&data, Some(Btf::from_sys_fs()?));
|
|
|
|
|
/// # Ok::<(), aya::BpfError>(())
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn load(data: &[u8], target_btf: Option<Btf>) -> Result<Bpf, BpfError> {
|
|
|
|
|
let mut obj = Object::parse(data)?;
|
|
|
|
|
|
|
|
|
@ -155,6 +187,18 @@ impl Bpf {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns a reference to the map with the given name.
|
|
|
|
|
///
|
|
|
|
|
/// The returned type is mostly opaque. In order to do anything useful with it you need to
|
|
|
|
|
/// convert it to a [concrete map type](crate::maps).
|
|
|
|
|
///
|
|
|
|
|
/// For more details and examples on maps and their usage, see the [maps module
|
|
|
|
|
/// documentation][crate::maps].
|
|
|
|
|
///
|
|
|
|
|
/// # Errors
|
|
|
|
|
///
|
|
|
|
|
/// Returns [`MapError::NotFound`] if the map does not exist. If the map is already borrowed
|
|
|
|
|
/// mutably with [map_mut](Self::map_mut) then [`MapError::BorrowError`] is returned.
|
|
|
|
|
pub fn map(&self, name: &str) -> Result<MapRef, MapError> {
|
|
|
|
|
self.maps
|
|
|
|
|
.get(name)
|
|
|
|
@ -168,6 +212,18 @@ impl Bpf {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns a mutable reference to the map with the given name.
|
|
|
|
|
///
|
|
|
|
|
/// The returned type is mostly opaque. In order to do anything useful with it you need to
|
|
|
|
|
/// convert it to a [concrete map type](crate::maps).
|
|
|
|
|
///
|
|
|
|
|
/// For more details and examples on maps and their usage, see the [maps module
|
|
|
|
|
/// documentation][crate::maps].
|
|
|
|
|
///
|
|
|
|
|
/// # Errors
|
|
|
|
|
///
|
|
|
|
|
/// Returns [`MapError::NotFound`] if the map does not exist. If the map is already borrowed
|
|
|
|
|
/// mutably with [map_mut](Self::map_mut) then [`MapError::BorrowError`] is returned.
|
|
|
|
|
pub fn map_mut(&self, name: &str) -> Result<MapRefMut, MapError> {
|
|
|
|
|
self.maps
|
|
|
|
|
.get(name)
|
|
|
|
@ -181,6 +237,20 @@ impl Bpf {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// An iterator over all the maps.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```no_run
|
|
|
|
|
/// # let mut bpf = aya::Bpf::load(&[], None)?;
|
|
|
|
|
/// for (name, map) in bpf.maps() {
|
|
|
|
|
/// println!(
|
|
|
|
|
/// "found map `{}` of type `{:?}`",
|
|
|
|
|
/// name,
|
|
|
|
|
/// map?.map_type().unwrap()
|
|
|
|
|
/// );
|
|
|
|
|
/// }
|
|
|
|
|
/// # Ok::<(), aya::BpfError>(())
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn maps<'a>(&'a self) -> impl Iterator<Item = (&'a str, Result<MapRef, MapError>)> + 'a {
|
|
|
|
|
let ret = self.maps.iter().map(|(name, lock)| {
|
|
|
|
|
(
|
|
|
|
@ -192,6 +262,26 @@ impl Bpf {
|
|
|
|
|
ret
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns a reference to the program with the given name.
|
|
|
|
|
///
|
|
|
|
|
/// You can use this to inspect a program and its properties. To load and attach a program, use
|
|
|
|
|
/// [program_mut](Self::program_mut) instead.
|
|
|
|
|
///
|
|
|
|
|
/// For more details on programs and their usage, see the [programs module
|
|
|
|
|
/// documentation](crate::programs).
|
|
|
|
|
///
|
|
|
|
|
/// # Errors
|
|
|
|
|
///
|
|
|
|
|
/// Returns [`ProgramError::NotFound`] if the program does not exist.
|
|
|
|
|
///
|
|
|
|
|
/// # Example
|
|
|
|
|
///
|
|
|
|
|
/// ```no_run
|
|
|
|
|
/// # let bpf = aya::Bpf::load(&[], None)?;
|
|
|
|
|
/// let program = bpf.program("SSL_read")?;
|
|
|
|
|
/// println!("program SSL_read is of type {:?}", program.prog_type());
|
|
|
|
|
/// # Ok::<(), aya::BpfError>(())
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn program(&self, name: &str) -> Result<&Program, ProgramError> {
|
|
|
|
|
self.programs
|
|
|
|
|
.get(name)
|
|
|
|
@ -200,6 +290,27 @@ impl Bpf {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns a mutable reference to the program with the given name.
|
|
|
|
|
///
|
|
|
|
|
/// Used to get a program before loading and attaching it. For more details on programs and
|
|
|
|
|
/// their usage, see the [programs module documentation](crate::programs).
|
|
|
|
|
///
|
|
|
|
|
/// # Errors
|
|
|
|
|
///
|
|
|
|
|
/// Returns [`ProgramError::NotFound`] if the program does not exist.
|
|
|
|
|
///
|
|
|
|
|
/// # Example
|
|
|
|
|
///
|
|
|
|
|
/// ```no_run
|
|
|
|
|
/// # let mut bpf = aya::Bpf::load(&[], None)?;
|
|
|
|
|
/// use aya::programs::UProbe;
|
|
|
|
|
/// use std::convert::TryInto;
|
|
|
|
|
///
|
|
|
|
|
/// let program: &mut UProbe = bpf.program_mut("SSL_read")?.try_into()?;
|
|
|
|
|
/// program.load()?;
|
|
|
|
|
/// program.attach(Some("SSL_read"), 0, "libssl", None)?;
|
|
|
|
|
/// # Ok::<(), aya::BpfError>(())
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn program_mut(&mut self, name: &str) -> Result<&mut Program, ProgramError> {
|
|
|
|
|
self.programs
|
|
|
|
|
.get_mut(name)
|
|
|
|
@ -208,6 +319,20 @@ impl Bpf {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// An iterator over all the programs.
|
|
|
|
|
///
|
|
|
|
|
/// # Examples
|
|
|
|
|
/// ```no_run
|
|
|
|
|
/// # let mut bpf = aya::Bpf::load(&[], None)?;
|
|
|
|
|
/// for program in bpf.programs() {
|
|
|
|
|
/// println!(
|
|
|
|
|
/// "found program `{}` of type `{:?}`",
|
|
|
|
|
/// program.name(),
|
|
|
|
|
/// program.prog_type()
|
|
|
|
|
/// );
|
|
|
|
|
/// }
|
|
|
|
|
/// # Ok::<(), aya::BpfError>(())
|
|
|
|
|
/// ```
|
|
|
|
|
pub fn programs(&self) -> impl Iterator<Item = &Program> {
|
|
|
|
|
self.programs.values()
|
|
|
|
|
}
|
|
|
|
|