From ad69e30cd124242294c09642d34a80d7add1effc Mon Sep 17 00:00:00 2001
From: Sebastian Bernauer <bernauerse@web.de>
Date: Thu, 9 Jun 2022 16:40:30 +0200
Subject: [PATCH] aya-bpf: Implement set() for array maps

---
 bpf/aya-bpf/src/maps/array.rs         | 18 ++++++++++++++++--
 bpf/aya-bpf/src/maps/per_cpu_array.rs | 18 ++++++++++++++++--
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/bpf/aya-bpf/src/maps/array.rs b/bpf/aya-bpf/src/maps/array.rs
index 53b596ca..546d68a7 100644
--- a/bpf/aya-bpf/src/maps/array.rs
+++ b/bpf/aya-bpf/src/maps/array.rs
@@ -1,10 +1,10 @@
 use core::{cell::UnsafeCell, marker::PhantomData, mem, ptr::NonNull};
 
-use aya_bpf_cty::c_void;
+use aya_bpf_cty::{c_void, c_long};
 
 use crate::{
     bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_ARRAY},
-    helpers::bpf_map_lookup_elem,
+    helpers::{bpf_map_lookup_elem, bpf_map_update_elem},
     maps::PinningType,
 };
 
@@ -57,4 +57,18 @@ impl<T> Array<T> {
             NonNull::new(value as *mut T).map(|p| p.as_ref())
         }
     }
+
+    pub fn set(&self, index: u32, value: &T, flags: u64) -> Result<(), c_long> {
+        unsafe {
+            let ret = unsafe {
+                bpf_map_update_elem(
+                    self.def.get() as *mut _,
+                    &index as *const _ as *const c_void,
+                    value as *const _ as *const _,
+                    flags,
+                )
+            };
+            (ret >= 0).then(|| ()).ok_or(ret)
+        }
+    }
 }
diff --git a/bpf/aya-bpf/src/maps/per_cpu_array.rs b/bpf/aya-bpf/src/maps/per_cpu_array.rs
index 5785de6e..91e5d363 100644
--- a/bpf/aya-bpf/src/maps/per_cpu_array.rs
+++ b/bpf/aya-bpf/src/maps/per_cpu_array.rs
@@ -1,10 +1,10 @@
 use core::{cell::UnsafeCell, marker::PhantomData, mem, ptr::NonNull};
 
-use aya_bpf_cty::c_void;
+use aya_bpf_cty::{c_void, c_long};
 
 use crate::{
     bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_PERCPU_ARRAY},
-    helpers::bpf_map_lookup_elem,
+    helpers::{bpf_map_lookup_elem, bpf_map_update_elem},
     maps::PinningType,
 };
 
@@ -73,4 +73,18 @@ impl<T> PerCpuArray<T> {
         );
         NonNull::new(ptr as *mut T)
     }
+
+    pub fn set(&self, index: u32, value: &T, flags: u64) -> Result<(), c_long> {
+        unsafe {
+            let ret = unsafe {
+                bpf_map_update_elem(
+                    self.def.get() as *mut _,
+                    &index as *const _ as *const c_void,
+                    value as *const _ as *const _,
+                    flags,
+                )
+            };
+            (ret >= 0).then(|| ()).ok_or(ret)
+        }
+    }
 }