use std::slice;
use std::default::Default;
use bpf_sys::{XDP_FLAGS_UPDATE_IF_NOEXIST, XDP_FLAGS_SKB_MODE,
XDP_FLAGS_DRV_MODE, XDP_FLAGS_HW_MODE, XDP_FLAGS_MODES, XDP_FLAGS_MASK};
use crate::Sample;
#[derive(Debug, Clone, Copy)]
#[repr(u32)]
pub enum Flags {
Unset = 0,
UpdateIfNoExist = XDP_FLAGS_UPDATE_IF_NOEXIST,
SkbMode = XDP_FLAGS_SKB_MODE,
DrvMode = XDP_FLAGS_DRV_MODE,
HwMode = XDP_FLAGS_HW_MODE,
Modes = XDP_FLAGS_MODES,
Mask = XDP_FLAGS_MASK
}
impl Default for Flags {
fn default() -> Self {
Flags::Unset
}
}
#[repr(C)]
pub struct MapData<T> {
data: T,
offset: u32,
size: u32,
payload: [u8; 0],
}
impl<T> MapData<T> {
pub unsafe fn from_sample<U>(sample: &Sample) -> &MapData<U> {
&*(sample.data.as_ptr() as *const MapData<U>)
}
pub fn data(&self) -> &T {
&self.data
}
pub fn payload(&self) -> &[u8] {
unsafe {
let base = self.payload.as_ptr().add(self.offset as usize);
slice::from_raw_parts(base, (self.size - self.offset) as usize)
}
}
}