mod helper;
pub mod insns;
mod map;
mod program;
pub use helper::BpfHelper;
pub use libbpf_sys;
pub use map::MapType;
pub use program::{ProgramInfo, ProgramLicense, ProgramType};
use std::fmt::Debug;
use thiserror::Error as ThisError;
#[derive(ThisError, Debug)]
pub enum Error {
#[error("errno: {0}")]
Errno(i32),
#[error("error code: {0}")]
Code(i32),
#[error("unknown: {0}")]
Unknown(i32),
}
trait StaticName {
fn name(&self) -> &'static str;
}
#[cfg(test)]
mod tests {
use super::libbpf_sys as sys;
use super::*;
#[test]
fn bpf_helper_iter() {
let count = BpfHelper::iter()
.map(|helper| {
let name = helper.name();
assert_ne!(name, "<utf8err>");
assert_ne!(name, "<unknown>");
})
.count();
assert_eq!(count, usize::try_from(sys::__BPF_FUNC_MAX_ID - 1).unwrap());
assert_eq!(
u32::from(BpfHelper::GetPrandomU32),
sys::BPF_FUNC_get_prandom_u32
);
assert_eq!(
u32::from(BpfHelper::TraceVprintk),
sys::BPF_FUNC_trace_vprintk
);
assert_eq!(
u32::from(BpfHelper::TcpRawGenSyncookieIpv6),
sys::BPF_FUNC_tcp_raw_gen_syncookie_ipv6
);
let invalid_helper = BpfHelper::try_from(sys::__BPF_FUNC_MAX_ID);
assert!(invalid_helper.is_err());
}
#[test]
fn program_license_ptr() {
assert!(!ProgramLicense::GPL.as_ptr().is_null());
}
}