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