|
@@ -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,
|