Skip to content

Commit

Permalink
bpf: Implement Array/Hash of Maps
Browse files Browse the repository at this point in the history
Signed-off-by: Dave Tucker <[email protected]>
  • Loading branch information
dave-tucker committed Oct 18, 2021
1 parent 3a3e0da commit e17a3b6
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 0 deletions.
57 changes: 57 additions & 0 deletions bpf/aya-bpf/src/maps/array_of_maps.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
use core::mem;

use aya_bpf_cty::c_void;

use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_ARRAY_OF_MAPS},
helpers::bpf_map_lookup_elem,
maps::PinningType,
};

#[repr(transparent)]
pub struct ArrayOfMaps {
def: bpf_map_def,
}

impl ArrayOfMaps {
pub const fn with_max_entries(max_entries: u32, flags: u32) -> ArrayOfMaps {
ArrayOfMaps {
def: bpf_map_def {
type_: BPF_MAP_TYPE_ARRAY_OF_MAPS,
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::None as u32,
},
}
}

pub const fn pinned(max_entries: u32, flags: u32) -> ArrayOfMaps {
ArrayOfMaps {
def: bpf_map_def {
type_: BPF_MAP_TYPE_ARRAY_OF_MAPS,
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,
},
}
}

pub unsafe fn get(&mut self, index: u32) -> Option<&u32> {
let value = bpf_map_lookup_elem(
&mut self.def as *mut _ as *mut _,
&index as *const _ as *const c_void,
);
if value.is_null() {
None
} else {
// FIXME: alignment
Some(&*(value as *const u32))
}
}
}
60 changes: 60 additions & 0 deletions bpf/aya-bpf/src/maps/hash_of_maps.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use core::{marker::PhantomData, mem};

use aya_bpf_cty::c_void;

use crate::{
bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_HASH_OF_MAPS},
helpers::bpf_map_lookup_elem,
maps::PinningType,
};

#[repr(transparent)]
pub struct HashOfMaps<K> {
def: bpf_map_def,
_k: PhantomData<K>,
}

impl<K> HashOfMaps<K> {
pub const fn with_max_entries(max_entries: u32, flags: u32) -> HashOfMaps<K> {
HashOfMaps {
def: bpf_map_def {
type_: BPF_MAP_TYPE_HASH_OF_MAPS,
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::None as u32,
},
_k: PhantomData,
}
}

pub const fn pinned(max_entries: u32, flags: u32) -> HashOfMaps<K> {
HashOfMaps {
def: bpf_map_def {
type_: BPF_MAP_TYPE_HASH_OF_MAPS,
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,
}
}

pub unsafe fn get(&mut self, key: &K) -> Option<&u32> {
let value = bpf_map_lookup_elem(
&mut self.def as *mut _ as *mut _,
key as *const _ as *const c_void,
);
if value.is_null() {
None
} else {
// FIXME: alignment
Some(&*(value as *const u32))
}
}
}
4 changes: 4 additions & 0 deletions bpf/aya-bpf/src/maps/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ pub(crate) enum PinningType {
}

pub mod array;
pub mod array_of_maps;
pub mod hash_map;
pub mod hash_of_maps;
pub mod per_cpu_array;
pub mod perf;
pub mod queue;
Expand All @@ -15,7 +17,9 @@ pub mod sock_map;
pub mod stack_trace;

pub use array::Array;
pub use array_of_maps::ArrayOfMaps;
pub use hash_map::HashMap;
pub use hash_of_maps::HashOfMaps;
pub use per_cpu_array::PerCpuArray;
pub use perf::{PerfEventArray, PerfEventByteArray};
pub use queue::Queue;
Expand Down

0 comments on commit e17a3b6

Please sign in to comment.