From 39c65bb9db55ac0331151ae050450edc3412304e Mon Sep 17 00:00:00 2001 From: Mehnaz Yunus Date: Thu, 8 May 2025 18:57:10 +0000 Subject: [PATCH] aya: implement TryFrom for FdLink using macro Refs: #1264 Co-authored-by: Benjamin Barzen --- aya/src/programs/cgroup_skb.rs | 19 ++++--------------- aya/src/programs/cgroup_sock.rs | 17 +++-------------- aya/src/programs/cgroup_sock_addr.rs | 17 +++-------------- aya/src/programs/iter.rs | 16 +++------------- aya/src/programs/kprobe.rs | 14 ++------------ aya/src/programs/links.rs | 18 ++++++++++++++++++ aya/src/programs/perf_event.rs | 14 ++------------ aya/src/programs/sock_ops.rs | 17 +++-------------- aya/src/programs/tc.rs | 18 +++--------------- aya/src/programs/trace_point.rs | 14 ++------------ aya/src/programs/uprobe.rs | 14 ++------------ aya/src/programs/xdp.rs | 14 ++------------ 12 files changed, 47 insertions(+), 145 deletions(-) diff --git a/aya/src/programs/cgroup_skb.rs b/aya/src/programs/cgroup_skb.rs index 535e8881..8e854b85 100644 --- a/aya/src/programs/cgroup_skb.rs +++ b/aya/src/programs/cgroup_skb.rs @@ -10,15 +10,13 @@ use aya_obj::generated::{ use crate::{ VerifierLogLevel, programs::{ - CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, - define_link_wrapper, id_as_key, load_program, + CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError, + ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program, }, sys::{LinkTarget, SyscallError, bpf_link_create}, 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 @@ -188,6 +186,8 @@ define_link_wrapper!( CgroupSkb, ); +impl_try_into_fdlink!(CgroupSkbLink, CgroupSkbLinkInner); + /// Defines where to attach a [`CgroupSkb`] program. #[derive(Copy, Clone, Debug)] pub enum CgroupSkbAttachType { @@ -196,14 +196,3 @@ 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 fca91043..0d068e0e 100644 --- a/aya/src/programs/cgroup_sock.rs +++ b/aya/src/programs/cgroup_sock.rs @@ -8,15 +8,13 @@ pub use aya_obj::programs::CgroupSockAttachType; use crate::{ VerifierLogLevel, programs::{ - CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, - define_link_wrapper, id_as_key, load_program, + CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError, + ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program, }, sys::{LinkTarget, SyscallError, bpf_link_create}, 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 @@ -164,13 +162,4 @@ define_link_wrapper!( 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), - } - } -} +impl_try_into_fdlink!(CgroupSockLink, CgroupSockLinkInner); diff --git a/aya/src/programs/cgroup_sock_addr.rs b/aya/src/programs/cgroup_sock_addr.rs index 45544527..7424b4ea 100644 --- a/aya/src/programs/cgroup_sock_addr.rs +++ b/aya/src/programs/cgroup_sock_addr.rs @@ -8,15 +8,13 @@ pub use aya_obj::programs::CgroupSockAddrAttachType; use crate::{ VerifierLogLevel, programs::{ - CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, - define_link_wrapper, id_as_key, load_program, + CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError, + ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program, }, sys::{LinkTarget, SyscallError, bpf_link_create}, 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 @@ -165,13 +163,4 @@ define_link_wrapper!( 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), - } - } -} +impl_try_into_fdlink!(CgroupSockAddrLink, CgroupSockAddrLinkInner); diff --git a/aya/src/programs/iter.rs b/aya/src/programs/iter.rs index c7351ec7..4f74fec7 100644 --- a/aya/src/programs/iter.rs +++ b/aya/src/programs/iter.rs @@ -15,7 +15,7 @@ use aya_obj::{ use crate::{ programs::{ FdLink, LinkError, PerfLinkIdInner, PerfLinkInner, ProgramData, ProgramError, ProgramType, - define_link_wrapper, load_program, + define_link_wrapper, impl_try_into_fdlink, load_program, }, sys::{LinkTarget, SyscallError, bpf_create_iter, bpf_link_create, bpf_link_get_info_by_fd}, }; @@ -104,18 +104,6 @@ impl AsFd for IterFd { } } -impl TryFrom for FdLink { - type Error = LinkError; - - fn try_from(value: IterLink) -> Result { - if let PerfLinkInner::Fd(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} - impl TryFrom for IterLink { type Error = LinkError; @@ -128,6 +116,8 @@ impl TryFrom for IterLink { } } +impl_try_into_fdlink!(IterLink, PerfLinkInner); + define_link_wrapper!( /// The link used by [`Iter`] programs. IterLink, diff --git a/aya/src/programs/kprobe.rs b/aya/src/programs/kprobe.rs index 96ca2630..9d46be7f 100644 --- a/aya/src/programs/kprobe.rs +++ b/aya/src/programs/kprobe.rs @@ -13,7 +13,7 @@ use crate::{ VerifierLogLevel, programs::{ FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper, - load_program, + impl_try_into_fdlink, load_program, perf_attach::{PerfLinkIdInner, PerfLinkInner}, probe::{ProbeKind, attach}, }, @@ -127,17 +127,7 @@ pub enum KProbeError { }, } -impl TryFrom for FdLink { - type Error = LinkError; - - fn try_from(value: KProbeLink) -> Result { - if let PerfLinkInner::Fd(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(KProbeLink, PerfLinkInner); impl TryFrom for KProbeLink { type Error = LinkError; diff --git a/aya/src/programs/links.rs b/aya/src/programs/links.rs index 53628eb1..13fca179 100644 --- a/aya/src/programs/links.rs +++ b/aya/src/programs/links.rs @@ -443,6 +443,24 @@ macro_rules! define_link_wrapper { pub(crate) use define_link_wrapper; +macro_rules! impl_try_into_fdlink { + ($wrapper:ident, $inner:ident) => { + impl TryFrom<$wrapper> for FdLink { + type Error = LinkError; + + fn try_from(value: $wrapper) -> Result { + if let $inner::Fd(fd) = value.into_inner() { + Ok(fd) + } else { + Err(LinkError::InvalidLink) + } + } + } + }; +} + +pub(crate) use impl_try_into_fdlink; + #[derive(Error, Debug)] /// Errors from operations on links. pub enum LinkError { diff --git a/aya/src/programs/perf_event.rs b/aya/src/programs/perf_event.rs index 390ba181..40a8d7e0 100644 --- a/aya/src/programs/perf_event.rs +++ b/aya/src/programs/perf_event.rs @@ -16,7 +16,7 @@ pub use aya_obj::generated::{ use crate::{ programs::{ - FdLink, LinkError, ProgramData, ProgramError, ProgramType, + FdLink, LinkError, ProgramData, ProgramError, ProgramType, impl_try_into_fdlink, links::define_link_wrapper, load_program, perf_attach, perf_attach::{PerfLinkIdInner, PerfLinkInner}, @@ -188,17 +188,7 @@ impl PerfEvent { } } -impl TryFrom for FdLink { - type Error = LinkError; - - fn try_from(value: PerfEventLink) -> Result { - if let PerfLinkInner::Fd(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(PerfEventLink, PerfLinkInner); impl TryFrom for PerfEventLink { type Error = LinkError; diff --git a/aya/src/programs/sock_ops.rs b/aya/src/programs/sock_ops.rs index 933107b0..4585d92e 100644 --- a/aya/src/programs/sock_ops.rs +++ b/aya/src/programs/sock_ops.rs @@ -7,15 +7,13 @@ use aya_obj::generated::{ use crate::{ programs::{ - CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, - define_link_wrapper, id_as_key, load_program, + CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError, + ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program, }, sys::{LinkTarget, SyscallError, bpf_link_create}, util::KernelVersion, }; -use super::links::LinkError; - /// A program used to work with sockets. /// /// [`SockOps`] programs can access or set socket options, connection @@ -143,13 +141,4 @@ define_link_wrapper!( 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), - } - } -} +impl_try_into_fdlink!(SockOpsLink, SockOpsLinkInner); diff --git a/aya/src/programs/tc.rs b/aya/src/programs/tc.rs index 9c055630..5e54a946 100644 --- a/aya/src/programs/tc.rs +++ b/aya/src/programs/tc.rs @@ -19,7 +19,7 @@ use crate::{ VerifierLogLevel, programs::{ Link, LinkError, LinkOrder, ProgramData, ProgramError, ProgramType, define_link_wrapper, - id_as_key, load_program, query, + id_as_key, impl_try_into_fdlink, load_program, query, }, sys::{ BpfLinkCreateArgs, LinkTarget, NetlinkError, ProgQueryTarget, SyscallError, @@ -244,9 +244,7 @@ impl SchedClassifier { self.data .links - .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new( - fd, - )))) + .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(fd)))) } TcLinkInner::NlLink(NlLink { if_index, @@ -450,17 +448,7 @@ impl<'a> TryFrom<&'a SchedClassifierLink> for &'a FdLink { } } -impl TryFrom for FdLink { - type Error = LinkError; - - fn try_from(value: SchedClassifierLink) -> Result { - if let TcLinkInner::Fd(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(SchedClassifierLink, TcLinkInner); impl TryFrom for SchedClassifierLink { type Error = LinkError; diff --git a/aya/src/programs/trace_point.rs b/aya/src/programs/trace_point.rs index 85617dbc..c3d95b51 100644 --- a/aya/src/programs/trace_point.rs +++ b/aya/src/programs/trace_point.rs @@ -11,7 +11,7 @@ use thiserror::Error; use crate::{ programs::{ FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper, - load_program, + impl_try_into_fdlink, load_program, perf_attach::{PerfLinkIdInner, PerfLinkInner, perf_attach}, utils::find_tracefs_path, }, @@ -99,17 +99,7 @@ define_link_wrapper!( TracePoint, ); -impl TryFrom for FdLink { - type Error = LinkError; - - fn try_from(value: TracePointLink) -> Result { - if let PerfLinkInner::Fd(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(TracePointLink, PerfLinkInner); impl TryFrom for TracePointLink { type Error = LinkError; diff --git a/aya/src/programs/uprobe.rs b/aya/src/programs/uprobe.rs index ab4ab064..2ebb063d 100644 --- a/aya/src/programs/uprobe.rs +++ b/aya/src/programs/uprobe.rs @@ -19,7 +19,7 @@ use crate::{ VerifierLogLevel, programs::{ FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper, - load_program, + impl_try_into_fdlink, load_program, perf_attach::{PerfLinkIdInner, PerfLinkInner}, probe::{OsStringExt as _, ProbeKind, attach}, }, @@ -220,17 +220,7 @@ define_link_wrapper!( UProbe, ); -impl TryFrom for FdLink { - type Error = LinkError; - - fn try_from(value: UProbeLink) -> Result { - if let PerfLinkInner::Fd(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(UProbeLink, PerfLinkInner); impl TryFrom for UProbeLink { type Error = LinkError; diff --git a/aya/src/programs/xdp.rs b/aya/src/programs/xdp.rs index 6e12bdaf..eb7c57b7 100644 --- a/aya/src/programs/xdp.rs +++ b/aya/src/programs/xdp.rs @@ -21,7 +21,7 @@ use crate::{ VerifierLogLevel, programs::{ FdLink, Link, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper, - id_as_key, load_program, + id_as_key, impl_try_into_fdlink, load_program, }, sys::{ LinkTarget, NetlinkError, SyscallError, bpf_link_create, bpf_link_get_info_by_fd, @@ -304,17 +304,7 @@ impl Link for XdpLinkInner { id_as_key!(XdpLinkInner, XdpLinkIdInner); -impl TryFrom for FdLink { - type Error = LinkError; - - fn try_from(value: XdpLink) -> Result { - if let XdpLinkInner::Fd(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(XdpLink, XdpLinkInner); impl TryFrom for XdpLink { type Error = LinkError;