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.
reviewable/pr1340/r4
Michal R 4 days ago
parent aa47acc507
commit 1b2c61fcf4

@ -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<K, V>(
def: *mut bindings::bpf_map_def,
key: &K,
value: &V,
flags: u64,
) -> Result<(), c_long> {
fn insert<K, V>(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<K, V>(
}
#[inline]
fn remove<K>(def: *mut bindings::bpf_map_def, key: &K) -> Result<(), c_long> {
fn remove<K>(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<K>(def: *mut bindings::bpf_map_def, key: &K) -> Result<(), c_long> {
}
#[inline]
fn lookup<K, V>(def: *mut bindings::bpf_map_def, key: &K) -> Option<NonNull<V>> {
fn lookup<K, V>(def: *mut c_void, key: &K) -> Option<NonNull<V>> {
let key: *const _ = key;
NonNull::new(unsafe { bpf_map_lookup_elem(def.cast(), key.cast()) }.cast())
}

@ -65,12 +65,12 @@ impl<T> Array<T> {
#[inline(always)]
unsafe fn lookup(&self, index: u32) -> Option<NonNull<T>> {
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)
}
}

@ -79,12 +79,12 @@ impl<K, V> HashMap<K, V> {
#[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<K, V> LruHashMap<K, V> {
#[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<K, V> PerCpuHashMap<K, V> {
#[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<K, V> LruPerCpuHashMap<K, V> {
#[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<K, V>(ty: u32, max_entries: u32, flags: u32, pin: PinningType
#[inline]
fn get_ptr_mut<K, V>(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]

@ -64,17 +64,17 @@ impl<K, V> LpmTrie<K, V> {
#[inline]
pub fn get(&self, key: &Key<K>) -> 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<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: &Key<K>) -> Result<(), c_long> {
remove(self.def.get(), key)
remove(self.def.get().cast(), key)
}
}

@ -65,6 +65,6 @@ impl<T> PerCpuArray<T> {
#[inline(always)]
unsafe fn lookup(&self, index: u32) -> Option<NonNull<T>> {
lookup(self.def.get(), &index)
lookup(self.def.get().cast(), &index)
}
}

@ -93,7 +93,7 @@ impl<K> SockHash<K> {
key: impl Borrow<K>,
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 {

@ -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 {

@ -105,7 +105,7 @@ impl DevMap {
/// ```
#[inline(always)]
pub fn get(&self, index: u32) -> Option<DevMapValue> {
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,

@ -107,7 +107,7 @@ impl DevMapHash {
/// ```
#[inline(always)]
pub fn get(&self, key: u32) -> Option<DevMapValue> {
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,

@ -124,7 +124,7 @@ impl XskMap {
/// ```
#[inline(always)]
pub fn get(&self, index: u32) -> Option<u32> {
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)
}

Loading…
Cancel
Save