|
|
|
@ -11,7 +11,7 @@ use aya_obj::{
|
|
|
|
|
btf::{BtfFeatures, BtfRelocationError},
|
|
|
|
|
generated::BPF_F_XDP_HAS_FRAGS,
|
|
|
|
|
relocation::BpfRelocationError,
|
|
|
|
|
BpfSectionKind,
|
|
|
|
|
BpfSectionKind, Features,
|
|
|
|
|
};
|
|
|
|
|
use log::debug;
|
|
|
|
|
use thiserror::Error;
|
|
|
|
@ -36,7 +36,7 @@ use crate::{
|
|
|
|
|
bpf_load_btf, bpf_map_freeze, bpf_map_update_elem_ptr, is_btf_datasec_supported,
|
|
|
|
|
is_btf_decl_tag_supported, is_btf_float_supported, is_btf_func_global_supported,
|
|
|
|
|
is_btf_func_supported, is_btf_supported, is_btf_type_tag_supported, is_perf_link_supported,
|
|
|
|
|
is_prog_name_supported, retry_with_verifier_logs,
|
|
|
|
|
is_probe_read_kernel_supported, is_prog_name_supported, retry_with_verifier_logs,
|
|
|
|
|
},
|
|
|
|
|
util::{bytes_of, bytes_of_slice, possible_cpus, VerifierLog, POSSIBLE_CPUS},
|
|
|
|
|
};
|
|
|
|
@ -66,39 +66,30 @@ unsafe impl<T: Pod, const N: usize> Pod for [T; N] {}
|
|
|
|
|
pub use aya_obj::maps::{bpf_map_def, PinningType};
|
|
|
|
|
|
|
|
|
|
lazy_static! {
|
|
|
|
|
pub(crate) static ref FEATURES: Features = Features::new();
|
|
|
|
|
pub(crate) static ref FEATURES: Features = detect_features();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Features implements BPF and BTF feature detection
|
|
|
|
|
#[derive(Default, Debug)]
|
|
|
|
|
pub(crate) struct Features {
|
|
|
|
|
pub bpf_name: bool,
|
|
|
|
|
pub bpf_perf_link: bool,
|
|
|
|
|
pub btf: Option<BtfFeatures>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Features {
|
|
|
|
|
fn new() -> Self {
|
|
|
|
|
let btf = if is_btf_supported() {
|
|
|
|
|
Some(BtfFeatures {
|
|
|
|
|
btf_func: is_btf_func_supported(),
|
|
|
|
|
btf_func_global: is_btf_func_global_supported(),
|
|
|
|
|
btf_datasec: is_btf_datasec_supported(),
|
|
|
|
|
btf_float: is_btf_float_supported(),
|
|
|
|
|
btf_decl_tag: is_btf_decl_tag_supported(),
|
|
|
|
|
btf_type_tag: is_btf_type_tag_supported(),
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
};
|
|
|
|
|
let f = Features {
|
|
|
|
|
bpf_name: is_prog_name_supported(),
|
|
|
|
|
bpf_perf_link: is_perf_link_supported(),
|
|
|
|
|
btf,
|
|
|
|
|
};
|
|
|
|
|
debug!("BPF Feature Detection: {:#?}", f);
|
|
|
|
|
f
|
|
|
|
|
}
|
|
|
|
|
fn detect_features() -> Features {
|
|
|
|
|
let btf = if is_btf_supported() {
|
|
|
|
|
Some(BtfFeatures {
|
|
|
|
|
btf_func: is_btf_func_supported(),
|
|
|
|
|
btf_func_global: is_btf_func_global_supported(),
|
|
|
|
|
btf_datasec: is_btf_datasec_supported(),
|
|
|
|
|
btf_float: is_btf_float_supported(),
|
|
|
|
|
btf_decl_tag: is_btf_decl_tag_supported(),
|
|
|
|
|
btf_type_tag: is_btf_type_tag_supported(),
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
};
|
|
|
|
|
let f = Features {
|
|
|
|
|
bpf_name: is_prog_name_supported(),
|
|
|
|
|
bpf_probe_read_kernel: is_probe_read_kernel_supported(),
|
|
|
|
|
bpf_perf_link: is_perf_link_supported(),
|
|
|
|
|
btf,
|
|
|
|
|
};
|
|
|
|
|
debug!("BPF Feature Detection: {:#?}", f);
|
|
|
|
|
f
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Builder style API for advanced loading of eBPF programs.
|
|
|
|
@ -443,6 +434,7 @@ impl<'a> BpfLoader<'a> {
|
|
|
|
|
&text_sections,
|
|
|
|
|
)?;
|
|
|
|
|
obj.relocate_calls(&text_sections)?;
|
|
|
|
|
obj.sanitize_programs(&FEATURES);
|
|
|
|
|
|
|
|
|
|
let programs = obj
|
|
|
|
|
.programs
|
|
|
|
|