|
|
|
@ -5,7 +5,8 @@ use std::os::fd::AsFd;
|
|
|
|
|
use crate::{
|
|
|
|
|
generated::{bpf_attach_type::BPF_CGROUP_DEVICE, bpf_prog_type::BPF_PROG_TYPE_CGROUP_DEVICE},
|
|
|
|
|
programs::{
|
|
|
|
|
define_link_wrapper, load_program, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
|
|
|
|
|
bpf_prog_get_fd_by_id, define_link_wrapper, load_program, query, FdLink, Link,
|
|
|
|
|
ProgAttachLink, ProgramData, ProgramError, ProgramFd,
|
|
|
|
|
},
|
|
|
|
|
sys::{bpf_link_create, LinkTarget, SyscallError},
|
|
|
|
|
util::KernelVersion,
|
|
|
|
@ -110,6 +111,24 @@ impl CgroupDevice {
|
|
|
|
|
pub fn detach(&mut self, link_id: CgroupDeviceLinkId) -> Result<(), ProgramError> {
|
|
|
|
|
self.data.links.remove(link_id)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Queries the cgroup for attached programs.
|
|
|
|
|
pub fn query<T: AsFd>(target_fd: T) -> Result<Vec<CgroupDeviceLink>, ProgramError> {
|
|
|
|
|
let target_fd = target_fd.as_fd();
|
|
|
|
|
let prog_ids = query(target_fd, BPF_CGROUP_DEVICE, 0, &mut None)?;
|
|
|
|
|
|
|
|
|
|
prog_ids
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|prog_id| {
|
|
|
|
|
let prog_fd = bpf_prog_get_fd_by_id(prog_id)?;
|
|
|
|
|
let target_fd = target_fd.try_clone_to_owned()?;
|
|
|
|
|
let prog_fd = ProgramFd(prog_fd);
|
|
|
|
|
Ok(CgroupDeviceLink::new(CgroupDeviceLinkInner::ProgAttach(
|
|
|
|
|
ProgAttachLink::new(prog_fd, target_fd, BPF_CGROUP_DEVICE),
|
|
|
|
|
)))
|
|
|
|
|
})
|
|
|
|
|
.collect()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Hash, Eq, PartialEq)]
|
|
|
|
|