Browse Source

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 <bbarzen@amazon.com>
Mehnaz Yunus 3 weeks ago
parent
commit
4b5ba53a36

+ 3 - 1
aya/src/programs/cgroup_skb.rs

@@ -11,7 +11,7 @@ use crate::{
     VerifierLogLevel,
     VerifierLogLevel,
     programs::{
     programs::{
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
-        define_link_wrapper, id_as_key, load_program,
+        define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
     },
     },
     sys::{LinkTarget, SyscallError, bpf_link_create},
     sys::{LinkTarget, SyscallError, bpf_link_create},
     util::KernelVersion,
     util::KernelVersion,
@@ -186,6 +186,8 @@ define_link_wrapper!(
     CgroupSkb,
     CgroupSkb,
 );
 );
 
 
+impl_try_into_fdlink!(CgroupSkbLink, CgroupSkbLinkInner);
+
 /// Defines where to attach a [`CgroupSkb`] program.
 /// Defines where to attach a [`CgroupSkb`] program.
 #[derive(Copy, Clone, Debug)]
 #[derive(Copy, Clone, Debug)]
 pub enum CgroupSkbAttachType {
 pub enum CgroupSkbAttachType {

+ 3 - 1
aya/src/programs/cgroup_sock.rs

@@ -9,7 +9,7 @@ use crate::{
     VerifierLogLevel,
     VerifierLogLevel,
     programs::{
     programs::{
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
-        define_link_wrapper, id_as_key, load_program,
+        define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
     },
     },
     sys::{LinkTarget, SyscallError, bpf_link_create},
     sys::{LinkTarget, SyscallError, bpf_link_create},
     util::KernelVersion,
     util::KernelVersion,
@@ -161,3 +161,5 @@ define_link_wrapper!(
     CgroupSockLinkIdInner,
     CgroupSockLinkIdInner,
     CgroupSock,
     CgroupSock,
 );
 );
+
+impl_try_into_fdlink!(CgroupSockLink, CgroupSockLinkInner);

+ 3 - 1
aya/src/programs/cgroup_sock_addr.rs

@@ -9,7 +9,7 @@ use crate::{
     VerifierLogLevel,
     VerifierLogLevel,
     programs::{
     programs::{
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
-        define_link_wrapper, id_as_key, load_program,
+        define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
     },
     },
     sys::{LinkTarget, SyscallError, bpf_link_create},
     sys::{LinkTarget, SyscallError, bpf_link_create},
     util::KernelVersion,
     util::KernelVersion,
@@ -162,3 +162,5 @@ define_link_wrapper!(
     CgroupSockAddrLinkIdInner,
     CgroupSockAddrLinkIdInner,
     CgroupSockAddr,
     CgroupSockAddr,
 );
 );
+
+impl_try_into_fdlink!(CgroupSockAddrLink, CgroupSockAddrLinkInner);

+ 6 - 16
aya/src/programs/iter.rs

@@ -15,7 +15,7 @@ use aya_obj::{
 use crate::{
 use crate::{
     programs::{
     programs::{
         FdLink, LinkError, PerfLinkIdInner, PerfLinkInner, ProgramData, ProgramError, ProgramType,
         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},
     sys::{LinkTarget, SyscallError, bpf_create_iter, bpf_link_create, bpf_link_get_info_by_fd},
 };
 };
@@ -87,7 +87,7 @@ impl Iter {
 
 
         self.data
         self.data
             .links
             .links
-            .insert(IterLink::new(PerfLinkInner::FdLink(FdLink::new(link_fd))))
+            .insert(IterLink::new(PerfLinkInner::Fd(FdLink::new(link_fd))))
     }
     }
 }
 }
 
 
@@ -104,30 +104,20 @@ impl AsFd for IterFd {
     }
     }
 }
 }
 
 
-impl TryFrom<IterLink> for FdLink {
-    type Error = LinkError;
-
-    fn try_from(value: IterLink) -> Result<Self, Self::Error> {
-        if let PerfLinkInner::FdLink(fd) = value.into_inner() {
-            Ok(fd)
-        } else {
-            Err(LinkError::InvalidLink)
-        }
-    }
-}
-
 impl TryFrom<FdLink> for IterLink {
 impl TryFrom<FdLink> for IterLink {
     type Error = LinkError;
     type Error = LinkError;
 
 
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         if info.type_ == (BPF_LINK_TYPE_ITER as u32) {
         if info.type_ == (BPF_LINK_TYPE_ITER as u32) {
-            return Ok(Self::new(PerfLinkInner::FdLink(fd_link)));
+            return Ok(Self::new(PerfLinkInner::Fd(fd_link)));
         }
         }
         Err(LinkError::InvalidLink)
         Err(LinkError::InvalidLink)
     }
     }
 }
 }
 
 
+impl_try_into_fdlink!(IterLink, PerfLinkInner);
+
 define_link_wrapper!(
 define_link_wrapper!(
     /// The link used by [`Iter`] programs.
     /// The link used by [`Iter`] programs.
     IterLink,
     IterLink,
@@ -142,7 +132,7 @@ impl IterLink {
     /// Converts [`IterLink`] into a [`File`] that can be used to retrieve the
     /// Converts [`IterLink`] into a [`File`] that can be used to retrieve the
     /// outputs of the iterator program.
     /// outputs of the iterator program.
     pub fn into_file(self) -> Result<File, LinkError> {
     pub fn into_file(self) -> Result<File, LinkError> {
-        if let PerfLinkInner::FdLink(fd) = self.into_inner() {
+        if let PerfLinkInner::Fd(fd) = self.into_inner() {
             let fd = bpf_create_iter(fd.fd.as_fd()).map_err(|io_error| {
             let fd = bpf_create_iter(fd.fd.as_fd()).map_err(|io_error| {
                 LinkError::SyscallError(SyscallError {
                 LinkError::SyscallError(SyscallError {
                     call: "bpf_iter_create",
                     call: "bpf_iter_create",

+ 3 - 13
aya/src/programs/kprobe.rs

@@ -13,7 +13,7 @@ use crate::{
     VerifierLogLevel,
     VerifierLogLevel,
     programs::{
     programs::{
         FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
         FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
-        load_program,
+        impl_try_into_fdlink, load_program,
         perf_attach::{PerfLinkIdInner, PerfLinkInner},
         perf_attach::{PerfLinkIdInner, PerfLinkInner},
         probe::{ProbeKind, attach},
         probe::{ProbeKind, attach},
     },
     },
@@ -127,17 +127,7 @@ pub enum KProbeError {
     },
     },
 }
 }
 
 
-impl TryFrom<KProbeLink> for FdLink {
-    type Error = LinkError;
-
-    fn try_from(value: KProbeLink) -> Result<Self, Self::Error> {
-        if let PerfLinkInner::FdLink(fd) = value.into_inner() {
-            Ok(fd)
-        } else {
-            Err(LinkError::InvalidLink)
-        }
-    }
-}
+impl_try_into_fdlink!(KProbeLink, PerfLinkInner);
 
 
 impl TryFrom<FdLink> for KProbeLink {
 impl TryFrom<FdLink> for KProbeLink {
     type Error = LinkError;
     type Error = LinkError;
@@ -145,7 +135,7 @@ impl TryFrom<FdLink> for KProbeLink {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_KPROBE_MULTI as u32) {
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_KPROBE_MULTI as u32) {
-            return Ok(Self::new(PerfLinkInner::FdLink(fd_link)));
+            return Ok(Self::new(PerfLinkInner::Fd(fd_link)));
         }
         }
         Err(LinkError::InvalidLink)
         Err(LinkError::InvalidLink)
     }
     }

+ 18 - 0
aya/src/programs/links.rs

@@ -556,6 +556,24 @@ macro_rules! define_link_wrapper {
 
 
 pub(crate) use define_link_wrapper;
 pub(crate) use define_link_wrapper;
 
 
+macro_rules! impl_try_into_fdlink {
+    ($wrapper:ident, $inner:ident) => {
+        impl TryFrom<$wrapper> for $crate::programs::FdLink {
+            type Error = $crate::programs::LinkError;
+
+            fn try_from(value: $wrapper) -> Result<Self, Self::Error> {
+                if let $inner::Fd(fd) = value.into_inner() {
+                    Ok(fd)
+                } else {
+                    Err($crate::programs::LinkError::InvalidLink)
+                }
+            }
+        }
+    };
+}
+
+pub(crate) use impl_try_into_fdlink;
+
 #[derive(Error, Debug)]
 #[derive(Error, Debug)]
 /// Errors from operations on links.
 /// Errors from operations on links.
 pub enum LinkError {
 pub enum LinkError {

+ 4 - 4
aya/src/programs/perf_attach.rs

@@ -26,7 +26,7 @@ pub(crate) enum PerfLinkIdInner {
 
 
 #[derive(Debug)]
 #[derive(Debug)]
 pub(crate) enum PerfLinkInner {
 pub(crate) enum PerfLinkInner {
-    FdLink(FdLink),
+    Fd(FdLink),
     PerfLink(PerfLink),
     PerfLink(PerfLink),
 }
 }
 
 
@@ -35,14 +35,14 @@ impl Link for PerfLinkInner {
 
 
     fn id(&self) -> Self::Id {
     fn id(&self) -> Self::Id {
         match self {
         match self {
-            Self::FdLink(link) => PerfLinkIdInner::FdLinkId(link.id()),
+            Self::Fd(link) => PerfLinkIdInner::FdLinkId(link.id()),
             Self::PerfLink(link) => PerfLinkIdInner::PerfLinkId(link.id()),
             Self::PerfLink(link) => PerfLinkIdInner::PerfLinkId(link.id()),
         }
         }
     }
     }
 
 
     fn detach(self) -> Result<(), ProgramError> {
     fn detach(self) -> Result<(), ProgramError> {
         match self {
         match self {
-            Self::FdLink(link) => link.detach(),
+            Self::Fd(link) => link.detach(),
             Self::PerfLink(link) => link.detach(),
             Self::PerfLink(link) => link.detach(),
         }
         }
     }
     }
@@ -101,7 +101,7 @@ pub(crate) fn perf_attach(
             call: "bpf_link_create",
             call: "bpf_link_create",
             io_error,
             io_error,
         })?;
         })?;
-        Ok(PerfLinkInner::FdLink(FdLink::new(link_fd)))
+        Ok(PerfLinkInner::Fd(FdLink::new(link_fd)))
     } else {
     } else {
         perf_attach_either(prog_fd, fd, None)
         perf_attach_either(prog_fd, fd, None)
     }
     }

+ 3 - 13
aya/src/programs/perf_event.rs

@@ -16,7 +16,7 @@ pub use aya_obj::generated::{
 
 
 use crate::{
 use crate::{
     programs::{
     programs::{
-        FdLink, LinkError, ProgramData, ProgramError, ProgramType,
+        FdLink, LinkError, ProgramData, ProgramError, ProgramType, impl_try_into_fdlink,
         links::define_link_wrapper,
         links::define_link_wrapper,
         load_program, perf_attach,
         load_program, perf_attach,
         perf_attach::{PerfLinkIdInner, PerfLinkInner},
         perf_attach::{PerfLinkIdInner, PerfLinkInner},
@@ -188,17 +188,7 @@ impl PerfEvent {
     }
     }
 }
 }
 
 
-impl TryFrom<PerfEventLink> for FdLink {
-    type Error = LinkError;
-
-    fn try_from(value: PerfEventLink) -> Result<Self, Self::Error> {
-        if let PerfLinkInner::FdLink(fd) = value.into_inner() {
-            Ok(fd)
-        } else {
-            Err(LinkError::InvalidLink)
-        }
-    }
-}
+impl_try_into_fdlink!(PerfEventLink, PerfLinkInner);
 
 
 impl TryFrom<FdLink> for PerfEventLink {
 impl TryFrom<FdLink> for PerfEventLink {
     type Error = LinkError;
     type Error = LinkError;
@@ -206,7 +196,7 @@ impl TryFrom<FdLink> for PerfEventLink {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_PERF_EVENT as u32) {
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_PERF_EVENT as u32) {
-            return Ok(Self::new(PerfLinkInner::FdLink(fd_link)));
+            return Ok(Self::new(PerfLinkInner::Fd(fd_link)));
         }
         }
         Err(LinkError::InvalidLink)
         Err(LinkError::InvalidLink)
     }
     }

+ 3 - 1
aya/src/programs/sock_ops.rs

@@ -8,7 +8,7 @@ use aya_obj::generated::{
 use crate::{
 use crate::{
     programs::{
     programs::{
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
         CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
-        define_link_wrapper, id_as_key, load_program,
+        define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
     },
     },
     sys::{LinkTarget, SyscallError, bpf_link_create},
     sys::{LinkTarget, SyscallError, bpf_link_create},
     util::KernelVersion,
     util::KernelVersion,
@@ -140,3 +140,5 @@ define_link_wrapper!(
     SockOpsLinkIdInner,
     SockOpsLinkIdInner,
     SockOps,
     SockOps,
 );
 );
+
+impl_try_into_fdlink!(SockOpsLink, SockOpsLinkInner);

+ 10 - 22
aya/src/programs/tc.rs

@@ -19,7 +19,7 @@ use crate::{
     VerifierLogLevel,
     VerifierLogLevel,
     programs::{
     programs::{
         Link, LinkError, LinkOrder, ProgramData, ProgramError, ProgramType, define_link_wrapper,
         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::{
     sys::{
         BpfLinkCreateArgs, LinkTarget, NetlinkError, ProgQueryTarget, SyscallError,
         BpfLinkCreateArgs, LinkTarget, NetlinkError, ProgQueryTarget, SyscallError,
@@ -231,7 +231,7 @@ impl SchedClassifier {
         let prog_fd = self.fd()?;
         let prog_fd = self.fd()?;
         let prog_fd = prog_fd.as_fd();
         let prog_fd = prog_fd.as_fd();
         match link.into_inner() {
         match link.into_inner() {
-            TcLinkInner::FdLink(link) => {
+            TcLinkInner::Fd(link) => {
                 let fd = link.fd;
                 let fd = link.fd;
                 let link_fd = fd.as_fd();
                 let link_fd = fd.as_fd();
 
 
@@ -244,9 +244,7 @@ impl SchedClassifier {
 
 
                 self.data
                 self.data
                     .links
                     .links
-                    .insert(SchedClassifierLink::new(TcLinkInner::FdLink(FdLink::new(
-                        fd,
-                    ))))
+                    .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(fd))))
             }
             }
             TcLinkInner::NlLink(NlLink {
             TcLinkInner::NlLink(NlLink {
                 if_index,
                 if_index,
@@ -314,7 +312,7 @@ impl SchedClassifier {
 
 
                 self.data
                 self.data
                     .links
                     .links
-                    .insert(SchedClassifierLink::new(TcLinkInner::FdLink(FdLink::new(
+                    .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(
                         link_fd,
                         link_fd,
                     ))))
                     ))))
             }
             }
@@ -414,7 +412,7 @@ pub(crate) enum TcLinkIdInner {
 
 
 #[derive(Debug)]
 #[derive(Debug)]
 pub(crate) enum TcLinkInner {
 pub(crate) enum TcLinkInner {
-    FdLink(FdLink),
+    Fd(FdLink),
     NlLink(NlLink),
     NlLink(NlLink),
 }
 }
 
 
@@ -423,14 +421,14 @@ impl Link for TcLinkInner {
 
 
     fn id(&self) -> Self::Id {
     fn id(&self) -> Self::Id {
         match self {
         match self {
-            Self::FdLink(link) => TcLinkIdInner::FdLinkId(link.id()),
+            Self::Fd(link) => TcLinkIdInner::FdLinkId(link.id()),
             Self::NlLink(link) => TcLinkIdInner::NlLinkId(link.id()),
             Self::NlLink(link) => TcLinkIdInner::NlLinkId(link.id()),
         }
         }
     }
     }
 
 
     fn detach(self) -> Result<(), ProgramError> {
     fn detach(self) -> Result<(), ProgramError> {
         match self {
         match self {
-            Self::FdLink(link) => link.detach(),
+            Self::Fd(link) => link.detach(),
             Self::NlLink(link) => link.detach(),
             Self::NlLink(link) => link.detach(),
         }
         }
     }
     }
@@ -442,7 +440,7 @@ impl<'a> TryFrom<&'a SchedClassifierLink> for &'a FdLink {
     type Error = LinkError;
     type Error = LinkError;
 
 
     fn try_from(value: &'a SchedClassifierLink) -> Result<Self, Self::Error> {
     fn try_from(value: &'a SchedClassifierLink) -> Result<Self, Self::Error> {
-        if let TcLinkInner::FdLink(fd) = value.inner() {
+        if let TcLinkInner::Fd(fd) = value.inner() {
             Ok(fd)
             Ok(fd)
         } else {
         } else {
             Err(LinkError::InvalidLink)
             Err(LinkError::InvalidLink)
@@ -450,17 +448,7 @@ impl<'a> TryFrom<&'a SchedClassifierLink> for &'a FdLink {
     }
     }
 }
 }
 
 
-impl TryFrom<SchedClassifierLink> for FdLink {
-    type Error = LinkError;
-
-    fn try_from(value: SchedClassifierLink) -> Result<Self, Self::Error> {
-        if let TcLinkInner::FdLink(fd) = value.into_inner() {
-            Ok(fd)
-        } else {
-            Err(LinkError::InvalidLink)
-        }
-    }
-}
+impl_try_into_fdlink!(SchedClassifierLink, TcLinkInner);
 
 
 impl TryFrom<FdLink> for SchedClassifierLink {
 impl TryFrom<FdLink> for SchedClassifierLink {
     type Error = LinkError;
     type Error = LinkError;
@@ -468,7 +456,7 @@ impl TryFrom<FdLink> for SchedClassifierLink {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TCX as u32) {
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TCX as u32) {
-            return Ok(Self::new(TcLinkInner::FdLink(fd_link)));
+            return Ok(Self::new(TcLinkInner::Fd(fd_link)));
         }
         }
         Err(LinkError::InvalidLink)
         Err(LinkError::InvalidLink)
     }
     }

+ 3 - 13
aya/src/programs/trace_point.rs

@@ -11,7 +11,7 @@ use thiserror::Error;
 use crate::{
 use crate::{
     programs::{
     programs::{
         FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
         FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
-        load_program,
+        impl_try_into_fdlink, load_program,
         perf_attach::{PerfLinkIdInner, PerfLinkInner, perf_attach},
         perf_attach::{PerfLinkIdInner, PerfLinkInner, perf_attach},
         utils::find_tracefs_path,
         utils::find_tracefs_path,
     },
     },
@@ -99,17 +99,7 @@ define_link_wrapper!(
     TracePoint,
     TracePoint,
 );
 );
 
 
-impl TryFrom<TracePointLink> for FdLink {
-    type Error = LinkError;
-
-    fn try_from(value: TracePointLink) -> Result<Self, Self::Error> {
-        if let PerfLinkInner::FdLink(fd) = value.into_inner() {
-            Ok(fd)
-        } else {
-            Err(LinkError::InvalidLink)
-        }
-    }
-}
+impl_try_into_fdlink!(TracePointLink, PerfLinkInner);
 
 
 impl TryFrom<FdLink> for TracePointLink {
 impl TryFrom<FdLink> for TracePointLink {
     type Error = LinkError;
     type Error = LinkError;
@@ -117,7 +107,7 @@ impl TryFrom<FdLink> for TracePointLink {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TRACING as u32) {
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TRACING as u32) {
-            return Ok(Self::new(PerfLinkInner::FdLink(fd_link)));
+            return Ok(Self::new(PerfLinkInner::Fd(fd_link)));
         }
         }
         Err(LinkError::InvalidLink)
         Err(LinkError::InvalidLink)
     }
     }

+ 3 - 13
aya/src/programs/uprobe.rs

@@ -19,7 +19,7 @@ use crate::{
     VerifierLogLevel,
     VerifierLogLevel,
     programs::{
     programs::{
         FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
         FdLink, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
-        load_program,
+        impl_try_into_fdlink, load_program,
         perf_attach::{PerfLinkIdInner, PerfLinkInner},
         perf_attach::{PerfLinkIdInner, PerfLinkInner},
         probe::{OsStringExt as _, ProbeKind, attach},
         probe::{OsStringExt as _, ProbeKind, attach},
     },
     },
@@ -220,17 +220,7 @@ define_link_wrapper!(
     UProbe,
     UProbe,
 );
 );
 
 
-impl TryFrom<UProbeLink> for FdLink {
-    type Error = LinkError;
-
-    fn try_from(value: UProbeLink) -> Result<Self, Self::Error> {
-        if let PerfLinkInner::FdLink(fd) = value.into_inner() {
-            Ok(fd)
-        } else {
-            Err(LinkError::InvalidLink)
-        }
-    }
-}
+impl_try_into_fdlink!(UProbeLink, PerfLinkInner);
 
 
 impl TryFrom<FdLink> for UProbeLink {
 impl TryFrom<FdLink> for UProbeLink {
     type Error = LinkError;
     type Error = LinkError;
@@ -238,7 +228,7 @@ impl TryFrom<FdLink> for UProbeLink {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
     fn try_from(fd_link: FdLink) -> Result<Self, Self::Error> {
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TRACING as u32) {
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_TRACING as u32) {
-            return Ok(Self::new(PerfLinkInner::FdLink(fd_link)));
+            return Ok(Self::new(PerfLinkInner::Fd(fd_link)));
         }
         }
         Err(LinkError::InvalidLink)
         Err(LinkError::InvalidLink)
     }
     }

+ 9 - 19
aya/src/programs/xdp.rs

@@ -21,7 +21,7 @@ use crate::{
     VerifierLogLevel,
     VerifierLogLevel,
     programs::{
     programs::{
         FdLink, Link, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
         FdLink, Link, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
-        id_as_key, load_program,
+        id_as_key, impl_try_into_fdlink, load_program,
     },
     },
     sys::{
     sys::{
         LinkTarget, NetlinkError, SyscallError, bpf_link_create, bpf_link_get_info_by_fd,
         LinkTarget, NetlinkError, SyscallError, bpf_link_create, bpf_link_get_info_by_fd,
@@ -158,7 +158,7 @@ impl Xdp {
             })?;
             })?;
             self.data
             self.data
                 .links
                 .links
-                .insert(XdpLink::new(XdpLinkInner::FdLink(FdLink::new(link_fd))))
+                .insert(XdpLink::new(XdpLinkInner::Fd(FdLink::new(link_fd))))
         } else {
         } else {
             let if_index = if_index as i32;
             let if_index = if_index as i32;
             unsafe { netlink_set_xdp_fd(if_index, Some(prog_fd), None, flags.bits()) }
             unsafe { netlink_set_xdp_fd(if_index, Some(prog_fd), None, flags.bits()) }
@@ -197,7 +197,7 @@ impl Xdp {
         let prog_fd = self.fd()?;
         let prog_fd = self.fd()?;
         let prog_fd = prog_fd.as_fd();
         let prog_fd = prog_fd.as_fd();
         match link.into_inner() {
         match link.into_inner() {
-            XdpLinkInner::FdLink(fd_link) => {
+            XdpLinkInner::Fd(fd_link) => {
                 let link_fd = fd_link.fd;
                 let link_fd = fd_link.fd;
                 bpf_link_update(link_fd.as_fd(), prog_fd, None, 0).map_err(|io_error| {
                 bpf_link_update(link_fd.as_fd(), prog_fd, None, 0).map_err(|io_error| {
                     SyscallError {
                     SyscallError {
@@ -208,7 +208,7 @@ impl Xdp {
 
 
                 self.data
                 self.data
                     .links
                     .links
-                    .insert(XdpLink::new(XdpLinkInner::FdLink(FdLink::new(link_fd))))
+                    .insert(XdpLink::new(XdpLinkInner::Fd(FdLink::new(link_fd))))
             }
             }
             XdpLinkInner::NlLink(nl_link) => {
             XdpLinkInner::NlLink(nl_link) => {
                 let if_index = nl_link.if_index;
                 let if_index = nl_link.if_index;
@@ -280,7 +280,7 @@ pub(crate) enum XdpLinkIdInner {
 
 
 #[derive(Debug)]
 #[derive(Debug)]
 pub(crate) enum XdpLinkInner {
 pub(crate) enum XdpLinkInner {
-    FdLink(FdLink),
+    Fd(FdLink),
     NlLink(NlLink),
     NlLink(NlLink),
 }
 }
 
 
@@ -289,14 +289,14 @@ impl Link for XdpLinkInner {
 
 
     fn id(&self) -> Self::Id {
     fn id(&self) -> Self::Id {
         match self {
         match self {
-            Self::FdLink(link) => XdpLinkIdInner::FdLinkId(link.id()),
+            Self::Fd(link) => XdpLinkIdInner::FdLinkId(link.id()),
             Self::NlLink(link) => XdpLinkIdInner::NlLinkId(link.id()),
             Self::NlLink(link) => XdpLinkIdInner::NlLinkId(link.id()),
         }
         }
     }
     }
 
 
     fn detach(self) -> Result<(), ProgramError> {
     fn detach(self) -> Result<(), ProgramError> {
         match self {
         match self {
-            Self::FdLink(link) => link.detach(),
+            Self::Fd(link) => link.detach(),
             Self::NlLink(link) => link.detach(),
             Self::NlLink(link) => link.detach(),
         }
         }
     }
     }
@@ -304,17 +304,7 @@ impl Link for XdpLinkInner {
 
 
 id_as_key!(XdpLinkInner, XdpLinkIdInner);
 id_as_key!(XdpLinkInner, XdpLinkIdInner);
 
 
-impl TryFrom<XdpLink> for FdLink {
-    type Error = LinkError;
-
-    fn try_from(value: XdpLink) -> Result<Self, Self::Error> {
-        if let XdpLinkInner::FdLink(fd) = value.into_inner() {
-            Ok(fd)
-        } else {
-            Err(LinkError::InvalidLink)
-        }
-    }
-}
+impl_try_into_fdlink!(XdpLink, XdpLinkInner);
 
 
 impl TryFrom<FdLink> for XdpLink {
 impl TryFrom<FdLink> for XdpLink {
     type Error = LinkError;
     type Error = LinkError;
@@ -323,7 +313,7 @@ impl TryFrom<FdLink> for XdpLink {
         // unwrap of fd_link.fd will not panic since it's only None when being dropped.
         // unwrap of fd_link.fd will not panic since it's only None when being dropped.
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?;
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_XDP as u32) {
         if info.type_ == (bpf_link_type::BPF_LINK_TYPE_XDP as u32) {
-            return Ok(Self::new(XdpLinkInner::FdLink(fd_link)));
+            return Ok(Self::new(XdpLinkInner::Fd(fd_link)));
         }
         }
         Err(LinkError::InvalidLink)
         Err(LinkError::InvalidLink)
     }
     }

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

@@ -2753,6 +2753,9 @@ pub fn aya::programs::cgroup_skb::CgroupSkbLink::id(&self) -> Self::Id
 impl core::cmp::Eq for aya::programs::cgroup_skb::CgroupSkbLink
 impl core::cmp::Eq for aya::programs::cgroup_skb::CgroupSkbLink
 impl core::cmp::PartialEq for aya::programs::cgroup_skb::CgroupSkbLink
 impl core::cmp::PartialEq for aya::programs::cgroup_skb::CgroupSkbLink
 pub fn aya::programs::cgroup_skb::CgroupSkbLink::eq(&self, other: &Self) -> bool
 pub fn aya::programs::cgroup_skb::CgroupSkbLink::eq(&self, other: &Self) -> bool
+impl core::convert::TryFrom<aya::programs::cgroup_skb::CgroupSkbLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::cgroup_skb::CgroupSkbLink) -> core::result::Result<Self, Self::Error>
 impl core::fmt::Debug for aya::programs::cgroup_skb::CgroupSkbLink
 impl core::fmt::Debug for aya::programs::cgroup_skb::CgroupSkbLink
 pub fn aya::programs::cgroup_skb::CgroupSkbLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 pub fn aya::programs::cgroup_skb::CgroupSkbLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 impl core::hash::Hash for aya::programs::cgroup_skb::CgroupSkbLink
 impl core::hash::Hash for aya::programs::cgroup_skb::CgroupSkbLink
@@ -2880,6 +2883,9 @@ pub fn aya::programs::cgroup_sock::CgroupSockLink::id(&self) -> Self::Id
 impl core::cmp::Eq for aya::programs::cgroup_sock::CgroupSockLink
 impl core::cmp::Eq for aya::programs::cgroup_sock::CgroupSockLink
 impl core::cmp::PartialEq for aya::programs::cgroup_sock::CgroupSockLink
 impl core::cmp::PartialEq for aya::programs::cgroup_sock::CgroupSockLink
 pub fn aya::programs::cgroup_sock::CgroupSockLink::eq(&self, other: &Self) -> bool
 pub fn aya::programs::cgroup_sock::CgroupSockLink::eq(&self, other: &Self) -> bool
+impl core::convert::TryFrom<aya::programs::cgroup_sock::CgroupSockLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::cgroup_sock::CgroupSockLink) -> core::result::Result<Self, Self::Error>
 impl core::fmt::Debug for aya::programs::cgroup_sock::CgroupSockLink
 impl core::fmt::Debug for aya::programs::cgroup_sock::CgroupSockLink
 pub fn aya::programs::cgroup_sock::CgroupSockLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 pub fn aya::programs::cgroup_sock::CgroupSockLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 impl core::hash::Hash for aya::programs::cgroup_sock::CgroupSockLink
 impl core::hash::Hash for aya::programs::cgroup_sock::CgroupSockLink
@@ -3007,6 +3013,9 @@ pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::id(&self) -> Self::I
 impl core::cmp::Eq for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
 impl core::cmp::Eq for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
 impl core::cmp::PartialEq for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
 impl core::cmp::PartialEq for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
 pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::eq(&self, other: &Self) -> bool
 pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::eq(&self, other: &Self) -> bool
+impl core::convert::TryFrom<aya::programs::cgroup_sock_addr::CgroupSockAddrLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::cgroup_sock_addr::CgroupSockAddrLink) -> core::result::Result<Self, Self::Error>
 impl core::fmt::Debug for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
 impl core::fmt::Debug for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
 pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 impl core::hash::Hash for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
 impl core::hash::Hash for aya::programs::cgroup_sock_addr::CgroupSockAddrLink
@@ -4400,6 +4409,15 @@ impl core::convert::From<aya::programs::sk_lookup::SkLookupLink> for aya::progra
 pub fn aya::programs::links::FdLink::from(w: aya::programs::sk_lookup::SkLookupLink) -> aya::programs::links::FdLink
 pub fn aya::programs::links::FdLink::from(w: aya::programs::sk_lookup::SkLookupLink) -> aya::programs::links::FdLink
 impl core::convert::From<aya::programs::tp_btf::BtfTracePointLink> for aya::programs::links::FdLink
 impl core::convert::From<aya::programs::tp_btf::BtfTracePointLink> for aya::programs::links::FdLink
 pub fn aya::programs::links::FdLink::from(w: aya::programs::tp_btf::BtfTracePointLink) -> aya::programs::links::FdLink
 pub fn aya::programs::links::FdLink::from(w: aya::programs::tp_btf::BtfTracePointLink) -> aya::programs::links::FdLink
+impl core::convert::TryFrom<aya::programs::cgroup_skb::CgroupSkbLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::cgroup_skb::CgroupSkbLink) -> core::result::Result<Self, Self::Error>
+impl core::convert::TryFrom<aya::programs::cgroup_sock::CgroupSockLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::cgroup_sock::CgroupSockLink) -> core::result::Result<Self, Self::Error>
+impl core::convert::TryFrom<aya::programs::cgroup_sock_addr::CgroupSockAddrLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::cgroup_sock_addr::CgroupSockAddrLink) -> core::result::Result<Self, Self::Error>
 impl core::convert::TryFrom<aya::programs::iter::IterLink> for aya::programs::links::FdLink
 impl core::convert::TryFrom<aya::programs::iter::IterLink> for aya::programs::links::FdLink
 pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
 pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
 pub fn aya::programs::links::FdLink::try_from(value: aya::programs::iter::IterLink) -> core::result::Result<Self, Self::Error>
 pub fn aya::programs::links::FdLink::try_from(value: aya::programs::iter::IterLink) -> core::result::Result<Self, Self::Error>
@@ -4430,6 +4448,9 @@ pub fn aya::programs::xdp::XdpLink::try_from(fd_link: aya::programs::links::FdLi
 impl core::convert::TryFrom<aya::programs::perf_event::PerfEventLink> for aya::programs::links::FdLink
 impl core::convert::TryFrom<aya::programs::perf_event::PerfEventLink> for aya::programs::links::FdLink
 pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
 pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
 pub fn aya::programs::links::FdLink::try_from(value: aya::programs::perf_event::PerfEventLink) -> core::result::Result<Self, Self::Error>
 pub fn aya::programs::links::FdLink::try_from(value: aya::programs::perf_event::PerfEventLink) -> core::result::Result<Self, Self::Error>
+impl core::convert::TryFrom<aya::programs::sock_ops::SockOpsLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::sock_ops::SockOpsLink) -> core::result::Result<Self, Self::Error>
 impl core::convert::TryFrom<aya::programs::tc::SchedClassifierLink> for aya::programs::links::FdLink
 impl core::convert::TryFrom<aya::programs::tc::SchedClassifierLink> for aya::programs::links::FdLink
 pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
 pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
 pub fn aya::programs::links::FdLink::try_from(value: aya::programs::tc::SchedClassifierLink) -> core::result::Result<Self, Self::Error>
 pub fn aya::programs::links::FdLink::try_from(value: aya::programs::tc::SchedClassifierLink) -> core::result::Result<Self, Self::Error>
@@ -6026,6 +6047,9 @@ pub fn aya::programs::sock_ops::SockOpsLink::id(&self) -> Self::Id
 impl core::cmp::Eq for aya::programs::sock_ops::SockOpsLink
 impl core::cmp::Eq for aya::programs::sock_ops::SockOpsLink
 impl core::cmp::PartialEq for aya::programs::sock_ops::SockOpsLink
 impl core::cmp::PartialEq for aya::programs::sock_ops::SockOpsLink
 pub fn aya::programs::sock_ops::SockOpsLink::eq(&self, other: &Self) -> bool
 pub fn aya::programs::sock_ops::SockOpsLink::eq(&self, other: &Self) -> bool
+impl core::convert::TryFrom<aya::programs::sock_ops::SockOpsLink> for aya::programs::links::FdLink
+pub type aya::programs::links::FdLink::Error = aya::programs::links::LinkError
+pub fn aya::programs::links::FdLink::try_from(value: aya::programs::sock_ops::SockOpsLink) -> core::result::Result<Self, Self::Error>
 impl core::fmt::Debug for aya::programs::sock_ops::SockOpsLink
 impl core::fmt::Debug for aya::programs::sock_ops::SockOpsLink
 pub fn aya::programs::sock_ops::SockOpsLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 pub fn aya::programs::sock_ops::SockOpsLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
 impl core::hash::Hash for aya::programs::sock_ops::SockOpsLink
 impl core::hash::Hash for aya::programs::sock_ops::SockOpsLink