Browse Source

Add `CgroupDevice::query`

This follows closely the existing `LircMode2::query`.
Gary Guo 1 year ago
parent
commit
542306d295
3 changed files with 34 additions and 1 deletions
  1. 20 1
      aya/src/programs/cgroup_device.rs
  2. 12 0
      aya/src/programs/links.rs
  3. 2 0
      xtask/public-api/aya.txt

+ 20 - 1
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<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)]

+ 12 - 0
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<'_>,

+ 2 - 0
xtask/public-api/aya.txt

@@ -2383,6 +2383,7 @@ impl aya::programs::cgroup_device::CgroupDevice
 pub fn aya::programs::cgroup_device::CgroupDevice::attach<T: std::os::fd::owned::AsFd>(&mut self, cgroup: T) -> core::result::Result<aya::programs::cgroup_device::CgroupDeviceLinkId, aya::programs::ProgramError>
 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<T: std::os::fd::owned::AsFd>(target_fd: T) -> core::result::Result<alloc::vec::Vec<aya::programs::cgroup_device::CgroupDeviceLink>, aya::programs::ProgramError>
 pub fn aya::programs::cgroup_device::CgroupDevice::take_link(&mut self, link_id: aya::programs::cgroup_device::CgroupDeviceLinkId) -> core::result::Result<aya::programs::cgroup_device::CgroupDeviceLink, aya::programs::ProgramError>
 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<T: std::os::fd::owned::AsFd>(&mut self, cgroup: T) -> core::result::Result<aya::programs::cgroup_device::CgroupDeviceLinkId, aya::programs::ProgramError>
 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<T: std::os::fd::owned::AsFd>(target_fd: T) -> core::result::Result<alloc::vec::Vec<aya::programs::cgroup_device::CgroupDeviceLink>, aya::programs::ProgramError>
 pub fn aya::programs::cgroup_device::CgroupDevice::take_link(&mut self, link_id: aya::programs::cgroup_device::CgroupDeviceLinkId) -> core::result::Result<aya::programs::cgroup_device::CgroupDeviceLink, aya::programs::ProgramError>
 impl aya::programs::cgroup_device::CgroupDevice
 pub fn aya::programs::cgroup_device::CgroupDevice::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError>