mirror of https://github.com/aya-rs/aya
				
				
				
			bpf: add PerCpuArray
							parent
							
								
									c56a6b16aa
								
							
						
					
					
						commit
						269be03a89
					
				| @ -0,0 +1,59 @@ | ||||
| use core::{marker::PhantomData, mem}; | ||||
| 
 | ||||
| use aya_bpf_cty::c_void; | ||||
| 
 | ||||
| use crate::{ | ||||
|     bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_PERCPU_ARRAY}, | ||||
|     helpers::bpf_map_lookup_elem, | ||||
| }; | ||||
| 
 | ||||
| #[repr(transparent)] | ||||
| pub struct PerCpuArray<T> { | ||||
|     def: bpf_map_def, | ||||
|     _t: PhantomData<T>, | ||||
| } | ||||
| 
 | ||||
| impl<T> PerCpuArray<T> { | ||||
|     pub const fn with_max_entries(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: 0, | ||||
|             }, | ||||
|             _t: PhantomData, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     #[inline(always)] | ||||
|     pub unsafe fn get(&mut self, index: u32) -> Option<&T> { | ||||
|         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 T)) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     #[inline(always)] | ||||
|     pub unsafe fn get_mut(&mut self, index: u32) -> Option<&mut T> { | ||||
|         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(&mut *(value as *mut T)) | ||||
|         } | ||||
|     } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue