Browse Source

aya: Add support for bpf_link_update

Signed-off-by: Dave Tucker <[email protected]>
Dave Tucker 2 years ago
parent
commit
ccb189784f
1 changed files with 24 additions and 1 deletions
  1. 24 1
      aya/src/sys/bpf.rs

+ 24 - 1
aya/src/sys/bpf.rs

@@ -1,5 +1,7 @@
 use crate::{
-    generated::{btf_func_linkage, btf_param, btf_var_secinfo, BTF_INT_SIGNED, BTF_VAR_STATIC},
+    generated::{
+        btf_func_linkage, btf_param, btf_var_secinfo, BPF_F_REPLACE, BTF_INT_SIGNED, BTF_VAR_STATIC,
+    },
     obj::{btf::BtfType, copy_instructions},
     Btf,
 };
@@ -333,6 +335,27 @@ pub(crate) fn bpf_link_create(
     sys_bpf(bpf_cmd::BPF_LINK_CREATE, &attr)
 }
 
+// since kernel 5.7
+pub(crate) fn bpf_link_update(
+    link_fd: RawFd,
+    new_prog_fd: RawFd,
+    old_prog_fd: Option<RawFd>,
+    flags: u32,
+) -> SysResult {
+    let mut attr = unsafe { mem::zeroed::<bpf_attr>() };
+
+    attr.link_update.link_fd = link_fd as u32;
+    attr.link_update.new_prog_fd = new_prog_fd as u32;
+    if let Some(fd) = old_prog_fd {
+        attr.link_update.old_prog_fd = fd as u32;
+        attr.link_update.flags = flags | BPF_F_REPLACE;
+    } else {
+        attr.link_update.flags = flags;
+    }
+
+    sys_bpf(bpf_cmd::BPF_LINK_UPDATE, &attr)
+}
+
 pub(crate) fn bpf_prog_attach(
     prog_fd: RawFd,
     target_fd: RawFd,