use std::io; use std::path::PathBuf; use libbpf_rs::Map; use libbpf_rs::MapCore; use libbpf_rs::MapMut; use libbpf_rs::Object; use libbpf_rs::ObjectBuilder; use libbpf_rs::OpenObject; use libbpf_rs::ProgramMut; pub fn get_test_object_path(filename: &str) -> PathBuf { let mut path = PathBuf::new(); // env!() macro fails at compile time if var not found path.push(env!("CARGO_MANIFEST_DIR")); path.push("tests/bin"); path.push(filename); path } pub fn open_test_object(filename: &str) -> OpenObject { let obj_path = get_test_object_path(filename); let obj = ObjectBuilder::default() .debug(true) .open_file(obj_path) .expect("failed to open object"); obj } pub fn bump_rlimit_mlock() { let rlimit = libc::rlimit { rlim_cur: 128 << 20, rlim_max: 128 << 20, }; let ret = unsafe { libc::setrlimit(libc::RLIMIT_MEMLOCK, &rlimit) }; assert_eq!( ret, 0, "Setting RLIMIT_MEMLOCK failed with errno: {}", io::Error::last_os_error() ); } pub fn get_test_object(filename: &str) -> Object { open_test_object(filename) .load() .expect("failed to load object") } /// Find the BPF map with the given name, panic if it does not exist. #[track_caller] pub fn get_map<'obj>(object: &'obj Object, name: &str) -> Map<'obj> { object .maps() .find(|map| map.name() == name) .unwrap_or_else(|| panic!("failed to find map `{name}`")) } /// Find the BPF map with the given name, panic if it does not exist. #[track_caller] pub fn get_map_mut<'obj>(object: &'obj mut Object, name: &str) -> MapMut<'obj> { object .maps_mut() .find(|map| map.name() == name) .unwrap_or_else(|| panic!("failed to find map `{name}`")) } /// Find the BPF program with the given name, panic if it does not exist. #[track_caller] pub fn get_prog_mut<'obj>(object: &'obj mut Object, name: &str) -> ProgramMut<'obj> { object .progs_mut() .find(|map| map.name() == name) .unwrap_or_else(|| panic!("failed to find program `{name}`")) }