1use super::{skeleton::MapRef, kind};
2
3pub struct ArrayPerCpuRef<const V: usize>(MapRef);
4
5impl<const V: usize> kind::AppItem for ArrayPerCpuRef<V> {
6 const MAP: usize = 1;
7 const PROG: usize = 0;
8
9 fn named(name: &'static str) -> Self {
10 ArrayPerCpuRef(MapRef::named(name))
11 }
12
13 fn kind_mut(&mut self) -> kind::AppItemKindMut<'_> {
14 kind::AppItemKindMut::Map(&mut self.0)
15 }
16}
17
18pub struct HashMapRef<const K: usize, const V: usize>(MapRef);
19
20impl<const K: usize, const V: usize> kind::AppItem for HashMapRef<K, V> {
21 const MAP: usize = 1;
22 const PROG: usize = 0;
23
24 fn named(name: &'static str) -> Self {
25 HashMapRef(MapRef::named(name))
26 }
27
28 fn kind_mut(&mut self) -> kind::AppItemKindMut<'_> {
29 kind::AppItemKindMut::Map(&mut self.0)
30 }
31}
32
33impl<const K: usize, const V: usize> HashMapRef<K, V> {
34 pub fn insert(&mut self, key: [u8; K], value: [u8; V]) -> Result<(), i32> {
35 let c = unsafe {
36 libbpf_sys::bpf_map_update_elem(self.0.fd(), key.as_ptr() as _, value.as_ptr() as _, 0)
37 };
38 if c >= 0 {
39 Ok(())
40 } else {
41 Err(c as _)
42 }
43 }
44
45 pub fn get(&self, key: &[u8; K]) -> Option<[u8; V]> {
46 let mut value = [0; V];
47 let c = unsafe {
48 libbpf_sys::bpf_map_lookup_elem(self.0.fd(), key.as_ptr() as _, value.as_mut_ptr() as _)
49 };
50 if c >= 0 {
51 Some(value)
52 } else {
53 None
54 }
55 }
56
57 pub fn remove(&self, key: &[u8; K]) -> Result<(), i32> {
58 let c = unsafe {
59 libbpf_sys::bpf_map_delete_elem(self.0.fd(), key.as_ptr() as _)
60 };
61 if c >= 0 {
62 Ok(())
63 } else {
64 Err(c)
65 }
66 }
67}