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), + } + } +}