use core::{num::NonZeroU32, ptr::NonNull};
use aya_ebpf_bindings::bindings::bpf_devmap_val;
use super::{dev_map::DevMapValue, try_redirect_map};
use crate::{
bindings::bpf_map_type::BPF_MAP_TYPE_DEVMAP_HASH,
lookup,
maps::{MapDef, PinningType},
};
#[repr(transparent)]
pub struct DevMapHash {
def: MapDef,
}
impl super::super::private::Map for DevMapHash {
type Key = u32;
type Value = bpf_devmap_val;
}
impl DevMapHash {
map_constructors!(
u32,
bpf_devmap_val,
BPF_MAP_TYPE_DEVMAP_HASH,
with_docs {
},
pinned_docs {
},
);
#[inline(always)]
pub fn get(&self, key: u32) -> Option<DevMapValue> {
let value = lookup(self.def.as_ptr(), &key)?;
let value: &bpf_devmap_val = unsafe { value.as_ref() };
Some(DevMapValue {
if_index: value.ifindex,
prog_id: NonZeroU32::new(unsafe { value.bpf_prog.id }),
})
}
#[inline(always)]
pub fn get_ifindex(&self, key: u32) -> Option<u32> {
let value: NonNull<u32> = lookup(self.def.as_ptr(), &key)?;
Some(unsafe { *value.as_ptr() })
}
#[inline(always)]
pub fn redirect(&self, key: u32, flags: u64) -> Result<u32, u32> {
try_redirect_map(self.def.as_ptr(), key, flags)
}
}