bpf: Added pinned constructor to maps

Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
pull/65/head
Dave Tucker 3 years ago committed by Alessandro Decina
parent 9426f36f79
commit 69041954cb

@ -5,6 +5,7 @@ use aya_bpf_cty::c_void;
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_ARRAY}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_ARRAY},
helpers::bpf_map_lookup_elem, helpers::bpf_map_lookup_elem,
maps::PinningType,
}; };
#[repr(transparent)] #[repr(transparent)]
@ -23,7 +24,22 @@ impl<T> Array<T> {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
},
_t: PhantomData,
}
}
pub const fn pinned(max_entries: u32, flags: u32) -> Array<T> {
Array {
def: bpf_map_def {
type_: BPF_MAP_TYPE_ARRAY,
key_size: mem::size_of::<u32>() as u32,
value_size: mem::size_of::<T>() as u32,
max_entries,
map_flags: flags,
id: 0,
pinning: PinningType::ByName as u32,
}, },
_t: PhantomData, _t: PhantomData,
} }

@ -5,6 +5,7 @@ use aya_bpf_cty::{c_long, c_void};
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_HASH}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_HASH},
helpers::{bpf_map_delete_elem, bpf_map_lookup_elem, bpf_map_update_elem}, helpers::{bpf_map_delete_elem, bpf_map_lookup_elem, bpf_map_update_elem},
maps::PinningType,
}; };
#[repr(transparent)] #[repr(transparent)]
@ -24,14 +25,14 @@ impl<K, V> HashMap<K, V> {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
}, },
_k: PhantomData, _k: PhantomData,
_v: PhantomData, _v: PhantomData,
} }
} }
pub const fn pinned(max_entries: u32, flags: u32, pinning: u32) -> HashMap<K, V> { pub const fn pinned(max_entries: u32, flags: u32) -> HashMap<K, V> {
HashMap { HashMap {
def: bpf_map_def { def: bpf_map_def {
type_: BPF_MAP_TYPE_HASH, type_: BPF_MAP_TYPE_HASH,
@ -40,7 +41,7 @@ impl<K, V> HashMap<K, V> {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning, pinning: PinningType::ByName as u32,
}, },
_k: PhantomData, _k: PhantomData,
_v: PhantomData, _v: PhantomData,

@ -1,3 +1,10 @@
#[repr(u32)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub(crate) enum PinningType {
None = 0,
ByName = 1,
}
pub mod array; pub mod array;
pub mod hash_map; pub mod hash_map;
pub mod per_cpu_array; pub mod per_cpu_array;

@ -5,6 +5,7 @@ use aya_bpf_cty::c_void;
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_PERCPU_ARRAY}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_PERCPU_ARRAY},
helpers::bpf_map_lookup_elem, helpers::bpf_map_lookup_elem,
maps::PinningType,
}; };
#[repr(transparent)] #[repr(transparent)]
@ -23,7 +24,22 @@ impl<T> PerCpuArray<T> {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
},
_t: PhantomData,
}
}
pub const fn pinned(max_entries: u32, flags: u32) -> PerCpuArray<T> {
PerCpuArray {
def: bpf_map_def {
type_: BPF_MAP_TYPE_PERCPU_ARRAY,
key_size: mem::size_of::<u32>() as u32,
value_size: mem::size_of::<T>() as u32,
max_entries,
map_flags: flags,
id: 0,
pinning: PinningType::ByName as u32,
}, },
_t: PhantomData, _t: PhantomData,
} }

@ -3,6 +3,7 @@ use core::{marker::PhantomData, mem};
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_PERF_EVENT_ARRAY, BPF_F_CURRENT_CPU}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_PERF_EVENT_ARRAY, BPF_F_CURRENT_CPU},
helpers::bpf_perf_event_output, helpers::bpf_perf_event_output,
maps::PinningType,
BpfContext, BpfContext,
}; };
@ -26,7 +27,22 @@ impl<T> PerfMap<T> {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
},
_t: PhantomData,
}
}
pub const fn pinned(max_entries: u32, flags: u32) -> PerfMap<T> {
PerfMap {
def: bpf_map_def {
type_: BPF_MAP_TYPE_PERF_EVENT_ARRAY,
key_size: mem::size_of::<u32>() as u32,
value_size: mem::size_of::<u32>() as u32,
max_entries,
map_flags: flags,
id: 0,
pinning: PinningType::ByName as u32,
}, },
_t: PhantomData, _t: PhantomData,
} }

@ -3,6 +3,7 @@ use core::{marker::PhantomData, mem};
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_QUEUE}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_QUEUE},
helpers::{bpf_map_pop_elem, bpf_map_push_elem}, helpers::{bpf_map_pop_elem, bpf_map_push_elem},
maps::PinningType,
}; };
#[repr(transparent)] #[repr(transparent)]
@ -21,7 +22,22 @@ impl<T> Queue<T> {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
},
_t: PhantomData,
}
}
pub const fn pinned(max_entries: u32, flags: u32) -> Queue<T> {
Queue {
def: bpf_map_def {
type_: BPF_MAP_TYPE_QUEUE,
key_size: 0,
value_size: mem::size_of::<T>() as u32,
max_entries,
map_flags: flags,
id: 0,
pinning: PinningType::ByName as u32,
}, },
_t: PhantomData, _t: PhantomData,
} }

@ -5,6 +5,7 @@ use aya_bpf_cty::c_void;
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_SOCKHASH, bpf_sock_ops}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_SOCKHASH, bpf_sock_ops},
helpers::{bpf_msg_redirect_hash, bpf_sock_hash_update}, helpers::{bpf_msg_redirect_hash, bpf_sock_hash_update},
maps::PinningType,
programs::SkMsgContext, programs::SkMsgContext,
BpfContext, BpfContext,
}; };
@ -25,7 +26,22 @@ impl<K> SockHash<K> {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
},
_k: PhantomData,
}
}
pub const fn pinned(max_entries: u32, flags: u32) -> SockHash<K> {
SockHash {
def: bpf_map_def {
type_: BPF_MAP_TYPE_SOCKHASH,
key_size: mem::size_of::<K>() as u32,
value_size: mem::size_of::<u32>() as u32,
max_entries,
map_flags: flags,
id: 0,
pinning: PinningType::ByName as u32,
}, },
_k: PhantomData, _k: PhantomData,
} }

@ -5,6 +5,7 @@ use aya_bpf_cty::c_void;
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_SOCKMAP, bpf_sock_ops}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_SOCKMAP, bpf_sock_ops},
helpers::{bpf_msg_redirect_map, bpf_sock_map_update}, helpers::{bpf_msg_redirect_map, bpf_sock_map_update},
maps::PinningType,
programs::SkMsgContext, programs::SkMsgContext,
BpfContext, BpfContext,
}; };
@ -24,7 +25,21 @@ impl SockMap {
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
},
}
}
pub const fn pinned(max_entries: u32, flags: u32) -> SockMap {
SockMap {
def: bpf_map_def {
type_: BPF_MAP_TYPE_SOCKMAP,
key_size: mem::size_of::<u32>() as u32,
value_size: mem::size_of::<u32>() as u32,
max_entries,
map_flags: flags,
id: 0,
pinning: PinningType::ByName as u32,
}, },
} }
} }

@ -2,42 +2,53 @@ use core::mem;
use crate::{ use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_STACK_TRACE}, bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_STACK_TRACE},
helpers::{bpf_get_stackid}, helpers::bpf_get_stackid,
maps::PinningType,
BpfContext, BpfContext,
}; };
#[repr(transparent)] #[repr(transparent)]
pub struct StackTrace { pub struct StackTrace {
def: bpf_map_def, def: bpf_map_def,
} }
const PERF_MAX_STACK_DEPTH: u32 = 127; const PERF_MAX_STACK_DEPTH: u32 = 127;
impl StackTrace { impl StackTrace {
pub const fn with_max_entries(max_entries: u32, flags: u32) -> StackTrace { pub const fn with_max_entries(max_entries: u32, flags: u32) -> StackTrace {
StackTrace { StackTrace {
def: bpf_map_def { def: bpf_map_def {
type_: BPF_MAP_TYPE_STACK_TRACE, type_: BPF_MAP_TYPE_STACK_TRACE,
key_size: mem::size_of::<u32>() as u32, key_size: mem::size_of::<u32>() as u32,
value_size: mem::size_of::<u64>() as u32 * PERF_MAX_STACK_DEPTH, value_size: mem::size_of::<u64>() as u32 * PERF_MAX_STACK_DEPTH,
max_entries, max_entries,
map_flags: flags, map_flags: flags,
id: 0, id: 0,
pinning: 0, pinning: PinningType::None as u32,
}, },
} }
} }
pub unsafe fn get_stackid<C: BpfContext>(&mut self, ctx: &C, flags: u64) -> Result<i64, i64> { pub const fn pinned(max_entries: u32, flags: u32) -> StackTrace {
let ret = bpf_get_stackid( StackTrace {
ctx.as_ptr(), def: bpf_map_def {
&mut self.def as *mut _ as *mut _, type_: BPF_MAP_TYPE_STACK_TRACE,
flags, key_size: mem::size_of::<u32>() as u32,
); value_size: mem::size_of::<u64>() as u32 * PERF_MAX_STACK_DEPTH,
if ret < 0 { max_entries,
Err(ret) map_flags: flags,
} else { id: 0,
Ok(ret) pinning: PinningType::ByName as u32,
} },
} }
} }
pub unsafe fn get_stackid<C: BpfContext>(&mut self, ctx: &C, flags: u64) -> Result<i64, i64> {
let ret = bpf_get_stackid(ctx.as_ptr(), &mut self.def as *mut _ as *mut _, flags);
if ret < 0 {
Err(ret)
} else {
Ok(ret)
}
}
}

Loading…
Cancel
Save