Add integration test for split BPF

reviewable/pr1248/r5
roblabla 1 week ago
parent c58433b0e9
commit aeea582bc1

@ -0,0 +1,27 @@
// clang-format off
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h>
// clang-format on
char _license[] SEC("license") = "GPL";
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__type(key, __u32);
__type(value, __u64);
__uint(max_entries, 1);
} output_map SEC(".maps");
long set_output(__u64 value) {
__u32 key = 0;
return bpf_map_update_elem(&output_map, &key, &value, BPF_ANY);
}
// Try to access ip_tables structures. In most distros, ip_tables is compiled
// and loaded as a separate module, making it a pretty good target.
SEC("uprobe") int check_can_access_module(void *ctx) {
int is_successful = bpf_core_type_exists(struct ipt_entry) && bpf_core_field_offset(struct ipt_entry, target_offset) != 0;
set_output(is_successful);
return is_successful;
}

@ -67,6 +67,7 @@ fn main() -> Result<()> {
("main.bpf.c", false), ("main.bpf.c", false),
("multimap-btf.bpf.c", false), ("multimap-btf.bpf.c", false),
("reloc.bpf.c", true), ("reloc.bpf.c", true),
("split.bpf.c", false),
("text_64_64_reloc.c", false), ("text_64_64_reloc.c", false),
("variables_reloc.bpf.c", false), ("variables_reloc.bpf.c", false),
]; ];

@ -8,6 +8,7 @@ pub const MULTIMAP_BTF: &[u8] =
pub const RELOC_BPF: &[u8] = include_bytes_aligned!(concat!(env!("OUT_DIR"), "/reloc.bpf.o")); pub const RELOC_BPF: &[u8] = include_bytes_aligned!(concat!(env!("OUT_DIR"), "/reloc.bpf.o"));
pub const RELOC_BTF: &[u8] = pub const RELOC_BTF: &[u8] =
include_bytes_aligned!(concat!(env!("OUT_DIR"), "/reloc.bpf.target.o")); include_bytes_aligned!(concat!(env!("OUT_DIR"), "/reloc.bpf.target.o"));
pub const SPLIT_BPF: &[u8] = include_bytes_aligned!(concat!(env!("OUT_DIR"), "/split.bpf.o"));
pub const TEXT_64_64_RELOC: &[u8] = pub const TEXT_64_64_RELOC: &[u8] =
include_bytes_aligned!(concat!(env!("OUT_DIR"), "/text_64_64_reloc.o")); include_bytes_aligned!(concat!(env!("OUT_DIR"), "/text_64_64_reloc.o"));
pub const VARIABLES_RELOC: &[u8] = pub const VARIABLES_RELOC: &[u8] =

@ -1,5 +1,6 @@
mod bpf_probe_read; mod bpf_probe_read;
mod btf_relocations; mod btf_relocations;
mod btf_split;
mod elf; mod elf;
mod info; mod info;
mod iter; mod iter;

@ -0,0 +1,37 @@
//! Test to make sure loading split BTF (kernel module BTF) works properly.
use aya::{maps::Array, programs::UProbe, EbpfLoader};
#[test]
fn rebase_tests() {
// First, check that we have ip_tables in the split btf.
if !matches!(std::fs::exists("/sys/kernel/btf/ip_tables"), Ok(true)) {
eprintln!("skipping test on kernel, as ip_tables is not loaded as an external kernel module.");
return;
}
let mut bpf = EbpfLoader::new()
.load(crate::SPLIT_BPF)
.unwrap();
let program: &mut UProbe = bpf.program_mut("check_can_access_module").unwrap().try_into().unwrap();
program.load().unwrap();
program
.attach(
"trigger_btf_split_program",
"/proc/self/exe",
None,
None,
)
.unwrap();
trigger_btf_split_program();
let output_map: Array<_, u64> = bpf.take_map("output_map").unwrap().try_into().unwrap();
let key = 0;
assert_eq!(output_map.get(&key, 0).unwrap(), 1)
}
#[unsafe(no_mangle)]
#[inline(never)]
pub extern "C" fn trigger_btf_split_program() {
core::hint::black_box(trigger_btf_split_program);
}
Loading…
Cancel
Save