From 6314e6100e2364815be83ac751666f4aa161bf34 Mon Sep 17 00:00:00 2001 From: Mehnaz Yunus Date: Tue, 6 May 2025 22:49:23 +0000 Subject: [PATCH] aya: implement TryFrom<[Program Type]> for FdLink for various program types Implements TryFrom for FdLink for CgroupSkb, CgroupSock, CgroupSockAddr and SockOps program types. This allows support for link pinning for these program types, aligning with the documentation for FdLink. Fixes: #739 Co-authored-by: Benjamin Barzen --- aya/src/programs/cgroup_skb.rs | 13 +++++++++++++ aya/src/programs/cgroup_sock.rs | 13 +++++++++++++ aya/src/programs/cgroup_sock_addr.rs | 13 +++++++++++++ aya/src/programs/sock_ops.rs | 13 +++++++++++++ 4 files changed, 52 insertions(+) diff --git a/aya/src/programs/cgroup_skb.rs b/aya/src/programs/cgroup_skb.rs index 7ce1b681..535e8881 100644 --- a/aya/src/programs/cgroup_skb.rs +++ b/aya/src/programs/cgroup_skb.rs @@ -17,6 +17,8 @@ use crate::{ util::KernelVersion, }; +use super::links::LinkError; + /// A program used to inspect or filter network activity for a given cgroup. /// /// [`CgroupSkb`] programs can be used to inspect or filter network activity @@ -194,3 +196,14 @@ pub enum CgroupSkbAttachType { /// Attach to egress. Egress, } + +impl TryFrom for FdLink { + type Error = LinkError; + + fn try_from(value: CgroupSkbLink) -> Result { + match value.into_inner() { + CgroupSkbLinkInner::Fd(fd) => Ok(fd), + CgroupSkbLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink), + } + } +} diff --git a/aya/src/programs/cgroup_sock.rs b/aya/src/programs/cgroup_sock.rs index df2d03ba..fca91043 100644 --- a/aya/src/programs/cgroup_sock.rs +++ b/aya/src/programs/cgroup_sock.rs @@ -15,6 +15,8 @@ use crate::{ util::KernelVersion, }; +use super::links::LinkError; + /// A program that is called on socket creation, bind and release. /// /// [`CgroupSock`] programs can be used to allow or deny socket creation from @@ -161,3 +163,14 @@ define_link_wrapper!( CgroupSockLinkIdInner, CgroupSock, ); + +impl TryFrom for FdLink { + type Error = LinkError; + + fn try_from(value: CgroupSockLink) -> Result { + match value.into_inner() { + CgroupSockLinkInner::Fd(fd) => Ok(fd), + CgroupSockLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink), + } + } +} diff --git a/aya/src/programs/cgroup_sock_addr.rs b/aya/src/programs/cgroup_sock_addr.rs index 1dbb7074..45544527 100644 --- a/aya/src/programs/cgroup_sock_addr.rs +++ b/aya/src/programs/cgroup_sock_addr.rs @@ -15,6 +15,8 @@ use crate::{ util::KernelVersion, }; +use super::links::LinkError; + /// A program that can be used to inspect or modify socket addresses (`struct sockaddr`). /// /// [`CgroupSockAddr`] programs can be used to inspect or modify socket addresses passed to @@ -162,3 +164,14 @@ define_link_wrapper!( CgroupSockAddrLinkIdInner, CgroupSockAddr, ); + +impl TryFrom for FdLink { + type Error = LinkError; + + fn try_from(value: CgroupSockAddrLink) -> Result { + match value.into_inner() { + CgroupSockAddrLinkInner::Fd(fd) => Ok(fd), + CgroupSockAddrLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink), + } + } +} diff --git a/aya/src/programs/sock_ops.rs b/aya/src/programs/sock_ops.rs index b0b96185..933107b0 100644 --- a/aya/src/programs/sock_ops.rs +++ b/aya/src/programs/sock_ops.rs @@ -14,6 +14,8 @@ use crate::{ util::KernelVersion, }; +use super::links::LinkError; + /// A program used to work with sockets. /// /// [`SockOps`] programs can access or set socket options, connection @@ -140,3 +142,14 @@ define_link_wrapper!( SockOpsLinkIdInner, SockOps, ); + +impl TryFrom for FdLink { + type Error = LinkError; + + fn try_from(value: SockOpsLink) -> Result { + match value.into_inner() { + SockOpsLinkInner::Fd(fd) => Ok(fd), + SockOpsLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink), + } + } +}