use std::{
borrow::{Borrow, BorrowMut},
os::fd::{AsRawFd, RawFd},
};
use crate::maps::{MapData, MapError, check_bounds, check_kv_size, hash_map};
#[doc(alias = "BPF_MAP_TYPE_XSKMAP")]
pub struct XskMap<T> {
pub(crate) inner: T,
}
impl<T: Borrow<MapData>> XskMap<T> {
pub(crate) fn new(map: T) -> Result<Self, MapError> {
let data = map.borrow();
check_kv_size::<u32, RawFd>(data)?;
Ok(Self { inner: map })
}
pub fn len(&self) -> u32 {
self.inner.borrow().obj.max_entries()
}
}
impl<T: BorrowMut<MapData>> XskMap<T> {
pub fn set(&mut self, index: u32, socket_fd: impl AsRawFd, flags: u64) -> Result<(), MapError> {
let data = self.inner.borrow_mut();
check_bounds(data, index)?;
hash_map::insert(data, &index, &socket_fd.as_raw_fd(), flags)
}
pub fn unset(&mut self, index: u32) -> Result<(), MapError> {
let data = self.inner.borrow_mut();
check_bounds(data, index)?;
hash_map::remove(data, &index)
}
}