feature_probe: clarify composite logic

reviewable/pr1357/r6
Tamir Duberstein 1 month ago
parent 8e63960fee
commit 34c5328dcf
No known key found for this signature in database

@ -13,7 +13,9 @@ use crate::utils::kernel_assert;
#[test_log::test] #[test_log::test]
fn probe_supported_programs() { fn probe_supported_programs() {
let current = aya::util::KernelVersion::current().unwrap();
let kernel_config = kernel_config().unwrap_or_default(); let kernel_config = kernel_config().unwrap_or_default();
macro_rules! is_supported { macro_rules! is_supported {
($prog_type:expr) => { ($prog_type:expr) => {
is_program_supported($prog_type).unwrap() is_program_supported($prog_type).unwrap()
@ -61,23 +63,26 @@ fn probe_supported_programs() {
let kern_version = KernelVersion::new(4, 18, 0); let kern_version = KernelVersion::new(4, 18, 0);
kernel_assert!(is_supported!(ProgramType::LwtSeg6local), kern_version); kernel_assert!(is_supported!(ProgramType::LwtSeg6local), kern_version);
if current >= kern_version {
// `lirc_mode2` requires CONFIG_BPF_LIRC_MODE2=y // `lirc_mode2` requires CONFIG_BPF_LIRC_MODE2=y
let lirc_mode2_config = matches!( let lirc_mode2_config = matches!(
kernel_config.get("CONFIG_BPF_LIRC_MODE2"), kernel_config.get("CONFIG_BPF_LIRC_MODE2"),
Some(procfs::ConfigSetting::Yes) Some(procfs::ConfigSetting::Yes)
); );
let lirc_mode2 = is_supported!(ProgramType::LircMode2); assert_eq!(
kernel_assert!( is_supported!(ProgramType::LircMode2),
if aya::util::KernelVersion::current().unwrap() >= kern_version { lirc_mode2_config,
lirc_mode2 == lirc_mode2_config "current={current}"
} else {
lirc_mode2
},
kern_version
); );
if !lirc_mode2_config { if !lirc_mode2_config {
eprintln!("CONFIG_BPF_LIRC_MODE2 required for lirc_mode2 program type"); eprintln!("CONFIG_BPF_LIRC_MODE2 required for lirc_mode2 program type");
} }
} else {
assert!(
!is_supported!(ProgramType::LircMode2),
"{current} < {kern_version}"
);
}
let kern_version = KernelVersion::new(4, 19, 0); let kern_version = KernelVersion::new(4, 19, 0);
kernel_assert!(is_supported!(ProgramType::SkReuseport), kern_version); kernel_assert!(is_supported!(ProgramType::SkReuseport), kern_version);
@ -106,25 +111,28 @@ fn probe_supported_programs() {
// `lsm` requires `CONFIG_DEBUG_INFO_BTF=y` & `CONFIG_BPF_LSM=y` // `lsm` requires `CONFIG_DEBUG_INFO_BTF=y` & `CONFIG_BPF_LSM=y`
// Ways to check if `CONFIG_BPF_LSM` is enabled: // Ways to check if `CONFIG_BPF_LSM` is enabled:
// - kernel config has `CONFIG_BPF_LSM=y`, but config is not always exposed. // - kernel config has `CONFIG_BPF_LSM=y`, but config is not always exposed.
// - an LSM hooks is present in BTF, e.g. `bpf_lsm_bpf`. hooks are found in `bpf_lsm.c` // - an LSM hook is present in BTF, e.g. `bpf_lsm_bpf`. hooks are found in `bpf_lsm.c`
if current >= kern_version {
let lsm_enabled = matches!( let lsm_enabled = matches!(
kernel_config.get("CONFIG_BPF_LSM"), kernel_config.get("CONFIG_BPF_LSM"),
Some(procfs::ConfigSetting::Yes) Some(procfs::ConfigSetting::Yes)
) || Btf::from_sys_fs() ) || Btf::from_sys_fs()
.and_then(|btf| btf.id_by_type_name_kind("bpf_lsm_bpf", aya_obj::btf::BtfKind::Func)) .and_then(|btf| btf.id_by_type_name_kind("bpf_lsm_bpf", aya_obj::btf::BtfKind::Func))
.is_ok(); .is_ok();
let lsm = is_supported!(ProgramType::Lsm); assert_eq!(
kernel_assert!( is_supported!(ProgramType::Lsm),
if aya::util::KernelVersion::current().unwrap() >= kern_version { lsm_enabled,
lsm == lsm_enabled "current={current}"
} else {
lsm
},
kern_version
); );
if !lsm_enabled { if !lsm_enabled {
eprintln!("CONFIG_BPF_LSM required for lsm program type"); eprintln!("CONFIG_BPF_LSM required for lsm program type");
} }
} else {
assert!(
!is_supported!(ProgramType::Lsm),
"{current} < {kern_version}"
);
}
let kern_version = KernelVersion::new(5, 9, 0); let kern_version = KernelVersion::new(5, 9, 0);
kernel_assert!(is_supported!(ProgramType::SkLookup), kern_version); kernel_assert!(is_supported!(ProgramType::SkLookup), kern_version);

Loading…
Cancel
Save