ebpf_user/
map.rs

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}