From 1b2c61fcf49c8975c8421bd92e47200e849fa116 Mon Sep 17 00:00:00 2001 From: Michal R Date: Sun, 7 Sep 2025 12:49:32 +0200 Subject: [PATCH] aya-ebpf: Take `c_void` instead of `bpf_map_def` in map helpers `bpf_map_def` is a legacy map definition. To be able to introduce BTF map definitions, make the `lookup` and `remove` helpers work with `c_void` and let the callers cast the map types to it. --- ebpf/aya-ebpf/src/lib.rs | 15 +++++---------- ebpf/aya-ebpf/src/maps/array.rs | 4 ++-- ebpf/aya-ebpf/src/maps/hash_map.rs | 18 +++++++++--------- ebpf/aya-ebpf/src/maps/lpm_trie.rs | 6 +++--- ebpf/aya-ebpf/src/maps/per_cpu_array.rs | 2 +- ebpf/aya-ebpf/src/maps/sock_hash.rs | 2 +- ebpf/aya-ebpf/src/maps/sock_map.rs | 2 +- ebpf/aya-ebpf/src/maps/xdp/dev_map.rs | 2 +- ebpf/aya-ebpf/src/maps/xdp/dev_map_hash.rs | 2 +- ebpf/aya-ebpf/src/maps/xdp/xsk_map.rs | 2 +- 10 files changed, 25 insertions(+), 30 deletions(-) diff --git a/ebpf/aya-ebpf/src/lib.rs b/ebpf/aya-ebpf/src/lib.rs index d842abaf..ced59066 100644 --- a/ebpf/aya-ebpf/src/lib.rs +++ b/ebpf/aya-ebpf/src/lib.rs @@ -28,11 +28,11 @@ pub mod helpers; pub mod maps; pub mod programs; -use core::{ffi::c_void, ptr::NonNull}; +use core::ptr::NonNull; pub use aya_ebpf_cty as cty; pub use aya_ebpf_macros as macros; -use cty::c_long; +use cty::{c_long, c_void}; use helpers::{ bpf_get_current_comm, bpf_get_current_pid_tgid, bpf_get_current_uid_gid, bpf_map_delete_elem, bpf_map_lookup_elem, bpf_map_update_elem, @@ -142,12 +142,7 @@ pub fn check_bounds_signed(value: i64, lower: i64, upper: i64) -> bool { } #[inline] -fn insert( - def: *mut bindings::bpf_map_def, - key: &K, - value: &V, - flags: u64, -) -> Result<(), c_long> { +fn insert(def: *mut c_void, key: &K, value: &V, flags: u64) -> Result<(), c_long> { let key: *const _ = key; let value: *const _ = value; match unsafe { bpf_map_update_elem(def.cast(), key.cast(), value.cast(), flags) } { @@ -157,7 +152,7 @@ fn insert( } #[inline] -fn remove(def: *mut bindings::bpf_map_def, key: &K) -> Result<(), c_long> { +fn remove(def: *mut c_void, key: &K) -> Result<(), c_long> { let key: *const _ = key; match unsafe { bpf_map_delete_elem(def.cast(), key.cast()) } { 0 => Ok(()), @@ -166,7 +161,7 @@ fn remove(def: *mut bindings::bpf_map_def, key: &K) -> Result<(), c_long> { } #[inline] -fn lookup(def: *mut bindings::bpf_map_def, key: &K) -> Option> { +fn lookup(def: *mut c_void, key: &K) -> Option> { let key: *const _ = key; NonNull::new(unsafe { bpf_map_lookup_elem(def.cast(), key.cast()) }.cast()) } diff --git a/ebpf/aya-ebpf/src/maps/array.rs b/ebpf/aya-ebpf/src/maps/array.rs index d9911547..ca26e48b 100644 --- a/ebpf/aya-ebpf/src/maps/array.rs +++ b/ebpf/aya-ebpf/src/maps/array.rs @@ -65,12 +65,12 @@ impl Array { #[inline(always)] unsafe fn lookup(&self, index: u32) -> Option> { - lookup(self.def.get(), &index) + lookup(self.def.get().cast(), &index) } /// Sets the value of the element at the given index. #[inline(always)] pub fn set(&self, index: u32, value: &T, flags: u64) -> Result<(), c_long> { - insert(self.def.get(), &index, value, flags) + insert(self.def.get().cast(), &index, value, flags) } } diff --git a/ebpf/aya-ebpf/src/maps/hash_map.rs b/ebpf/aya-ebpf/src/maps/hash_map.rs index f6efa8b2..33e015a7 100644 --- a/ebpf/aya-ebpf/src/maps/hash_map.rs +++ b/ebpf/aya-ebpf/src/maps/hash_map.rs @@ -79,12 +79,12 @@ impl HashMap { #[inline] pub fn insert(&self, key: &K, value: &V, flags: u64) -> Result<(), c_long> { - insert(self.def.get(), key, value, flags) + insert(self.def.get().cast(), key, value, flags) } #[inline] pub fn remove(&self, key: &K) -> Result<(), c_long> { - remove(self.def.get(), key) + remove(self.def.get().cast(), key) } } @@ -155,12 +155,12 @@ impl LruHashMap { #[inline] pub fn insert(&self, key: &K, value: &V, flags: u64) -> Result<(), c_long> { - insert(self.def.get(), key, value, flags) + insert(self.def.get().cast(), key, value, flags) } #[inline] pub fn remove(&self, key: &K) -> Result<(), c_long> { - remove(self.def.get(), key) + remove(self.def.get().cast(), key) } } @@ -231,12 +231,12 @@ impl PerCpuHashMap { #[inline] pub fn insert(&self, key: &K, value: &V, flags: u64) -> Result<(), c_long> { - insert(self.def.get(), key, value, flags) + insert(self.def.get().cast(), key, value, flags) } #[inline] pub fn remove(&self, key: &K) -> Result<(), c_long> { - remove(self.def.get(), key) + remove(self.def.get().cast(), key) } } @@ -307,12 +307,12 @@ impl LruPerCpuHashMap { #[inline] pub fn insert(&self, key: &K, value: &V, flags: u64) -> Result<(), c_long> { - insert(self.def.get(), key, value, flags) + insert(self.def.get().cast(), key, value, flags) } #[inline] pub fn remove(&self, key: &K) -> Result<(), c_long> { - remove(self.def.get(), key) + remove(self.def.get().cast(), key) } } @@ -330,7 +330,7 @@ const fn build_def(ty: u32, max_entries: u32, flags: u32, pin: PinningType #[inline] fn get_ptr_mut(def: *mut bpf_map_def, key: &K) -> Option<*mut V> { - lookup(def, key).map(|p| p.as_ptr()) + lookup(def.cast(), key).map(|p| p.as_ptr()) } #[inline] diff --git a/ebpf/aya-ebpf/src/maps/lpm_trie.rs b/ebpf/aya-ebpf/src/maps/lpm_trie.rs index 1e79f30d..45db960e 100644 --- a/ebpf/aya-ebpf/src/maps/lpm_trie.rs +++ b/ebpf/aya-ebpf/src/maps/lpm_trie.rs @@ -64,17 +64,17 @@ impl LpmTrie { #[inline] pub fn get(&self, key: &Key) -> Option<&V> { - lookup(self.def.get(), key).map(|p| unsafe { p.as_ref() }) + lookup(self.def.get().cast(), key).map(|p| unsafe { p.as_ref() }) } #[inline] pub fn insert(&self, key: &Key, value: &V, flags: u64) -> Result<(), c_long> { - insert(self.def.get(), key, value, flags) + insert(self.def.get().cast(), key, value, flags) } #[inline] pub fn remove(&self, key: &Key) -> Result<(), c_long> { - remove(self.def.get(), key) + remove(self.def.get().cast(), key) } } diff --git a/ebpf/aya-ebpf/src/maps/per_cpu_array.rs b/ebpf/aya-ebpf/src/maps/per_cpu_array.rs index da6e7640..500cc596 100644 --- a/ebpf/aya-ebpf/src/maps/per_cpu_array.rs +++ b/ebpf/aya-ebpf/src/maps/per_cpu_array.rs @@ -65,6 +65,6 @@ impl PerCpuArray { #[inline(always)] unsafe fn lookup(&self, index: u32) -> Option> { - lookup(self.def.get(), &index) + lookup(self.def.get().cast(), &index) } } diff --git a/ebpf/aya-ebpf/src/maps/sock_hash.rs b/ebpf/aya-ebpf/src/maps/sock_hash.rs index fe7fc25b..9d25059e 100644 --- a/ebpf/aya-ebpf/src/maps/sock_hash.rs +++ b/ebpf/aya-ebpf/src/maps/sock_hash.rs @@ -93,7 +93,7 @@ impl SockHash { key: impl Borrow, flags: u64, ) -> Result<(), u32> { - let sk = lookup(self.def.get(), key.borrow()).ok_or(1u32)?; + let sk = lookup(self.def.get().cast(), key.borrow()).ok_or(1u32)?; let ret = unsafe { bpf_sk_assign(ctx.as_ptr().cast(), sk.as_ptr(), flags) }; unsafe { bpf_sk_release(sk.as_ptr()) }; match ret { diff --git a/ebpf/aya-ebpf/src/maps/sock_map.rs b/ebpf/aya-ebpf/src/maps/sock_map.rs index 67b01a12..4a01ceef 100644 --- a/ebpf/aya-ebpf/src/maps/sock_map.rs +++ b/ebpf/aya-ebpf/src/maps/sock_map.rs @@ -77,7 +77,7 @@ impl SockMap { index: u32, flags: u64, ) -> Result<(), u32> { - let sk = lookup(self.def.get(), &index).ok_or(1u32)?; + let sk = lookup(self.def.get().cast(), &index).ok_or(1u32)?; let ret = unsafe { bpf_sk_assign(ctx.as_ptr().cast(), sk.as_ptr(), flags) }; unsafe { bpf_sk_release(sk.as_ptr()) }; match ret { diff --git a/ebpf/aya-ebpf/src/maps/xdp/dev_map.rs b/ebpf/aya-ebpf/src/maps/xdp/dev_map.rs index 52afeeef..07ce271a 100644 --- a/ebpf/aya-ebpf/src/maps/xdp/dev_map.rs +++ b/ebpf/aya-ebpf/src/maps/xdp/dev_map.rs @@ -105,7 +105,7 @@ impl DevMap { /// ``` #[inline(always)] pub fn get(&self, index: u32) -> Option { - let value = lookup(self.def.get(), &index)?; + let value = lookup(self.def.get().cast(), &index)?; let value: &bpf_devmap_val = unsafe { value.as_ref() }; Some(DevMapValue { if_index: value.ifindex, diff --git a/ebpf/aya-ebpf/src/maps/xdp/dev_map_hash.rs b/ebpf/aya-ebpf/src/maps/xdp/dev_map_hash.rs index 3c8ff019..29cc6d75 100644 --- a/ebpf/aya-ebpf/src/maps/xdp/dev_map_hash.rs +++ b/ebpf/aya-ebpf/src/maps/xdp/dev_map_hash.rs @@ -107,7 +107,7 @@ impl DevMapHash { /// ``` #[inline(always)] pub fn get(&self, key: u32) -> Option { - let value = lookup(self.def.get(), &key)?; + let value = lookup(self.def.get().cast(), &key)?; let value: &bpf_devmap_val = unsafe { value.as_ref() }; Some(DevMapValue { if_index: value.ifindex, diff --git a/ebpf/aya-ebpf/src/maps/xdp/xsk_map.rs b/ebpf/aya-ebpf/src/maps/xdp/xsk_map.rs index 3e3b7475..5de3816a 100644 --- a/ebpf/aya-ebpf/src/maps/xdp/xsk_map.rs +++ b/ebpf/aya-ebpf/src/maps/xdp/xsk_map.rs @@ -124,7 +124,7 @@ impl XskMap { /// ``` #[inline(always)] pub fn get(&self, index: u32) -> Option { - let value = lookup(self.def.get(), &index)?; + let value = lookup(self.def.get().cast(), &index)?; let value: &bpf_xdp_sock = unsafe { value.as_ref() }; Some(value.queue_id) }