|
|
@ -1,7 +1,7 @@
|
|
|
|
//! Test feature probing against kernel version.
|
|
|
|
//! Test feature probing against kernel version.
|
|
|
|
|
|
|
|
|
|
|
|
use assert_matches::assert_matches;
|
|
|
|
use assert_matches::assert_matches;
|
|
|
|
use aya::{Btf, programs::ProgramType, sys::feature_probe::*, util::KernelVersion};
|
|
|
|
use aya::{Btf, maps::MapType, programs::ProgramType, sys::feature_probe::*, util::KernelVersion};
|
|
|
|
use procfs::kernel_config;
|
|
|
|
use procfs::kernel_config;
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[test]
|
|
|
@ -210,3 +210,199 @@ fn probe_supported_programs() {
|
|
|
|
assert_matches!(netfilter, Ok(false));
|
|
|
|
assert_matches!(netfilter, Ok(false));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
|
|
|
fn probe_supported_maps() {
|
|
|
|
|
|
|
|
let current = KernelVersion::current().unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let hash = is_map_supported(MapType::Hash);
|
|
|
|
|
|
|
|
let array = is_map_supported(MapType::Array);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(3, 19, 0) {
|
|
|
|
|
|
|
|
assert_matches!(hash, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(array, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(hash, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(array, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let prog_array = is_map_supported(MapType::ProgramArray);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 2, 0) {
|
|
|
|
|
|
|
|
assert_matches!(prog_array, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(prog_array, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let perf_event_array = is_map_supported(MapType::PerfEventArray);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 3, 0) {
|
|
|
|
|
|
|
|
assert_matches!(perf_event_array, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(perf_event_array, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let per_cpu_hash = is_map_supported(MapType::PerCpuHash);
|
|
|
|
|
|
|
|
let per_cpu_array = is_map_supported(MapType::PerCpuArray);
|
|
|
|
|
|
|
|
let stack_trace = is_map_supported(MapType::StackTrace);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 6, 0) {
|
|
|
|
|
|
|
|
assert_matches!(per_cpu_hash, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(per_cpu_array, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(stack_trace, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(per_cpu_hash, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(per_cpu_array, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(stack_trace, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cgroup_array = is_map_supported(MapType::CgroupArray);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 8, 0) {
|
|
|
|
|
|
|
|
assert_matches!(cgroup_array, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(cgroup_array, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let lru_hash = is_map_supported(MapType::LruHash);
|
|
|
|
|
|
|
|
let lru_per_cpu_hash = is_map_supported(MapType::LruPerCpuHash);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 10, 0) {
|
|
|
|
|
|
|
|
assert_matches!(lru_hash, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(lru_per_cpu_hash, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(lru_hash, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(lru_per_cpu_hash, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let lpm_trie = is_map_supported(MapType::LpmTrie);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 11, 0) {
|
|
|
|
|
|
|
|
assert_matches!(lpm_trie, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(lpm_trie, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let array_of_maps = is_map_supported(MapType::ArrayOfMaps);
|
|
|
|
|
|
|
|
let hash_of_maps = is_map_supported(MapType::HashOfMaps);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 12, 0) {
|
|
|
|
|
|
|
|
assert_matches!(array_of_maps, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(hash_of_maps, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(array_of_maps, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(hash_of_maps, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let dev_map = is_map_supported(MapType::DevMap);
|
|
|
|
|
|
|
|
let sock_map = is_map_supported(MapType::SockMap);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 14, 0) {
|
|
|
|
|
|
|
|
assert_matches!(dev_map, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(sock_map, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(dev_map, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(sock_map, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cpu_map = is_map_supported(MapType::CpuMap);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 15, 0) {
|
|
|
|
|
|
|
|
assert_matches!(cpu_map, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(cpu_map, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let xsk_map = is_map_supported(MapType::XskMap);
|
|
|
|
|
|
|
|
let sock_hash = is_map_supported(MapType::SockHash);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 18, 0) {
|
|
|
|
|
|
|
|
assert_matches!(xsk_map, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(sock_hash, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(xsk_map, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(sock_hash, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cgroup_storage = is_map_supported(MapType::CgroupStorage);
|
|
|
|
|
|
|
|
let reuseport_sock_array = is_map_supported(MapType::ReuseportSockArray);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 19, 0) {
|
|
|
|
|
|
|
|
assert_matches!(cgroup_storage, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(reuseport_sock_array, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(cgroup_storage, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(reuseport_sock_array, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let per_cpu_cgroup_storage = is_map_supported(MapType::PerCpuCgroupStorage);
|
|
|
|
|
|
|
|
let queue = is_map_supported(MapType::Queue);
|
|
|
|
|
|
|
|
let stack = is_map_supported(MapType::Stack);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(4, 20, 0) {
|
|
|
|
|
|
|
|
assert_matches!(per_cpu_cgroup_storage, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(queue, Ok(true));
|
|
|
|
|
|
|
|
assert_matches!(stack, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(per_cpu_cgroup_storage, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(queue, Ok(false));
|
|
|
|
|
|
|
|
assert_matches!(stack, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let sk_storage = is_map_supported(MapType::SkStorage);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(5, 2, 0) {
|
|
|
|
|
|
|
|
assert_matches!(sk_storage, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(sk_storage, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let devmap_hash = is_map_supported(MapType::DevMapHash);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(5, 4, 0) {
|
|
|
|
|
|
|
|
assert_matches!(devmap_hash, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(devmap_hash, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let struct_ops = is_map_supported(MapType::StructOps);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(5, 6, 0) {
|
|
|
|
|
|
|
|
assert_matches!(struct_ops, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(struct_ops, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let ring_buf = is_map_supported(MapType::RingBuf);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(5, 8, 0) {
|
|
|
|
|
|
|
|
assert_matches!(ring_buf, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(ring_buf, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let inode_storage = is_map_supported(MapType::InodeStorage); // Requires `CONFIG_BPF_LSM=y`
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(5, 10, 0) {
|
|
|
|
|
|
|
|
assert_matches!(inode_storage, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(inode_storage, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let task_storage = is_map_supported(MapType::TaskStorage);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(5, 11, 0) {
|
|
|
|
|
|
|
|
assert_matches!(task_storage, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(task_storage, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let bloom_filter = is_map_supported(MapType::BloomFilter);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(5, 16, 0) {
|
|
|
|
|
|
|
|
assert_matches!(bloom_filter, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(bloom_filter, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let user_ring_buf = is_map_supported(MapType::UserRingBuf);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(6, 1, 0) {
|
|
|
|
|
|
|
|
assert_matches!(user_ring_buf, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(user_ring_buf, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cgrp_storage = is_map_supported(MapType::CgrpStorage);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(6, 2, 0) {
|
|
|
|
|
|
|
|
assert_matches!(cgrp_storage, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(cgrp_storage, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let arena = is_map_supported(MapType::Arena);
|
|
|
|
|
|
|
|
if current >= KernelVersion::new(6, 9, 0) {
|
|
|
|
|
|
|
|
assert_matches!(arena, Ok(true));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
assert_matches!(arena, Ok(false));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|