1mod helper;
15pub mod insns;
16mod map;
17mod program;
18
19pub use helper::BpfHelper;
21pub use libbpf_sys;
22pub use map::MapType;
23pub use program::{ProgramInfo, ProgramLicense, ProgramType};
24
25use std::fmt::Debug;
26use thiserror::Error as ThisError;
27
28#[derive(ThisError, Debug)]
30pub enum Error {
31 #[error("errno: {0}")]
32 Errno(i32),
33 #[error("error code: {0}")]
34 Code(i32),
35 #[error("unknown: {0}")]
36 Unknown(i32),
37}
38
39trait StaticName {
41 fn name(&self) -> &'static str;
42}
43
44#[cfg(test)]
45mod tests {
46 use super::libbpf_sys as sys;
47 use super::*;
48
49 #[test]
50 fn bpf_helper_iter() {
51 let count = BpfHelper::iter()
52 .map(|helper| {
53 let name = helper.name();
54 assert_ne!(name, "<utf8err>");
55 assert_ne!(name, "<unknown>");
56 })
57 .count();
58
59 assert_eq!(count, usize::try_from(sys::__BPF_FUNC_MAX_ID - 1).unwrap());
60
61 assert_eq!(
65 u32::from(BpfHelper::GetPrandomU32),
66 sys::BPF_FUNC_get_prandom_u32
67 );
68 assert_eq!(
69 u32::from(BpfHelper::TraceVprintk),
70 sys::BPF_FUNC_trace_vprintk
71 );
72 assert_eq!(
73 u32::from(BpfHelper::TcpRawGenSyncookieIpv6),
74 sys::BPF_FUNC_tcp_raw_gen_syncookie_ipv6
75 );
76
77 let invalid_helper = BpfHelper::try_from(sys::__BPF_FUNC_MAX_ID);
78 assert!(invalid_helper.is_err());
79 }
80
81 #[test]
82 fn program_license_ptr() {
83 assert!(!ProgramLicense::GPL.as_ptr().is_null());
84 }
85}