diff --git a/aya/src/programs/cgroup_device.rs b/aya/src/programs/cgroup_device.rs index 180d3757..b8c96267 100644 --- a/aya/src/programs/cgroup_device.rs +++ b/aya/src/programs/cgroup_device.rs @@ -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(target_fd: T) -> Result, 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)] diff --git a/aya/src/programs/links.rs b/aya/src/programs/links.rs index d947d64f..2a87dff7 100644 --- a/aya/src/programs/links.rs +++ b/aya/src/programs/links.rs @@ -236,6 +236,18 @@ pub struct ProgAttachLink { } impl ProgAttachLink { + pub(crate) fn new( + prog_fd: ProgramFd, + target_fd: OwnedFd, + attach_type: bpf_attach_type, + ) -> Self { + Self { + prog_fd, + target_fd, + attach_type, + } + } + pub(crate) fn attach( prog_fd: BorrowedFd<'_>, target_fd: BorrowedFd<'_>, diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index 5fcc9914..a9667265 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -2383,6 +2383,7 @@ impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::attach(&mut self, cgroup: T) -> core::result::Result pub fn aya::programs::cgroup_device::CgroupDevice::detach(&mut self, link_id: aya::programs::cgroup_device::CgroupDeviceLinkId) -> core::result::Result<(), aya::programs::ProgramError> pub fn aya::programs::cgroup_device::CgroupDevice::load(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::cgroup_device::CgroupDevice::query(target_fd: T) -> core::result::Result, aya::programs::ProgramError> pub fn aya::programs::cgroup_device::CgroupDevice::take_link(&mut self, link_id: aya::programs::cgroup_device::CgroupDeviceLinkId) -> core::result::Result impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> @@ -6918,6 +6919,7 @@ impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::attach(&mut self, cgroup: T) -> core::result::Result pub fn aya::programs::cgroup_device::CgroupDevice::detach(&mut self, link_id: aya::programs::cgroup_device::CgroupDeviceLinkId) -> core::result::Result<(), aya::programs::ProgramError> pub fn aya::programs::cgroup_device::CgroupDevice::load(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::cgroup_device::CgroupDevice::query(target_fd: T) -> core::result::Result, aya::programs::ProgramError> pub fn aya::programs::cgroup_device::CgroupDevice::take_link(&mut self, link_id: aya::programs::cgroup_device::CgroupDeviceLinkId) -> core::result::Result impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError>