From 4b5ba53a36b0c920969bbb9016330cd195e457dc 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 | 4 +++- aya/src/programs/cgroup_sock.rs | 4 +++- aya/src/programs/cgroup_sock_addr.rs | 4 +++- aya/src/programs/iter.rs | 22 ++++++------------- aya/src/programs/kprobe.rs | 16 +++----------- aya/src/programs/links.rs | 18 ++++++++++++++++ aya/src/programs/perf_attach.rs | 8 +++---- aya/src/programs/perf_event.rs | 16 +++----------- aya/src/programs/sock_ops.rs | 4 +++- aya/src/programs/tc.rs | 32 +++++++++------------------- aya/src/programs/trace_point.rs | 16 +++----------- aya/src/programs/uprobe.rs | 16 +++----------- aya/src/programs/xdp.rs | 28 ++++++++---------------- xtask/public-api/aya.txt | 24 +++++++++++++++++++++ 14 files changed, 95 insertions(+), 117 deletions(-) diff --git a/aya/src/programs/cgroup_skb.rs b/aya/src/programs/cgroup_skb.rs index 7ce1b681..86c809c5 100644 --- a/aya/src/programs/cgroup_skb.rs +++ b/aya/src/programs/cgroup_skb.rs @@ -11,7 +11,7 @@ use crate::{ VerifierLogLevel, programs::{ 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}, util::KernelVersion, @@ -186,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 { diff --git a/aya/src/programs/cgroup_sock.rs b/aya/src/programs/cgroup_sock.rs index df2d03ba..52b86f2e 100644 --- a/aya/src/programs/cgroup_sock.rs +++ b/aya/src/programs/cgroup_sock.rs @@ -9,7 +9,7 @@ use crate::{ VerifierLogLevel, programs::{ 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}, util::KernelVersion, @@ -161,3 +161,5 @@ define_link_wrapper!( CgroupSockLinkIdInner, CgroupSock, ); + +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 1dbb7074..26b3a7cf 100644 --- a/aya/src/programs/cgroup_sock_addr.rs +++ b/aya/src/programs/cgroup_sock_addr.rs @@ -9,7 +9,7 @@ use crate::{ VerifierLogLevel, programs::{ 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}, util::KernelVersion, @@ -162,3 +162,5 @@ define_link_wrapper!( CgroupSockAddrLinkIdInner, CgroupSockAddr, ); + +impl_try_into_fdlink!(CgroupSockAddrLink, CgroupSockAddrLinkInner); diff --git a/aya/src/programs/iter.rs b/aya/src/programs/iter.rs index 62ecd610..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}, }; @@ -87,7 +87,7 @@ impl Iter { self.data .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 for FdLink { - type Error = LinkError; - - fn try_from(value: IterLink) -> Result { - if let PerfLinkInner::FdLink(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} - impl TryFrom for IterLink { type Error = LinkError; fn try_from(fd_link: FdLink) -> Result { let info = bpf_link_get_info_by_fd(fd_link.fd.as_fd())?; 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) } } +impl_try_into_fdlink!(IterLink, PerfLinkInner); + define_link_wrapper!( /// The link used by [`Iter`] programs. IterLink, @@ -142,7 +132,7 @@ impl IterLink { /// Converts [`IterLink`] into a [`File`] that can be used to retrieve the /// outputs of the iterator program. pub fn into_file(self) -> Result { - 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| { LinkError::SyscallError(SyscallError { call: "bpf_iter_create", diff --git a/aya/src/programs/kprobe.rs b/aya/src/programs/kprobe.rs index 8a02ab13..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::FdLink(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(KProbeLink, PerfLinkInner); impl TryFrom for KProbeLink { type Error = LinkError; @@ -145,7 +135,7 @@ impl TryFrom for KProbeLink { fn try_from(fd_link: FdLink) -> Result { 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) { - return Ok(Self::new(PerfLinkInner::FdLink(fd_link))); + return Ok(Self::new(PerfLinkInner::Fd(fd_link))); } Err(LinkError::InvalidLink) } diff --git a/aya/src/programs/links.rs b/aya/src/programs/links.rs index 7dd3e36a..40d4c12d 100644 --- a/aya/src/programs/links.rs +++ b/aya/src/programs/links.rs @@ -556,6 +556,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 $crate::programs::FdLink { + type Error = $crate::programs::LinkError; + + fn try_from(value: $wrapper) -> Result { + 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)] /// Errors from operations on links. pub enum LinkError { diff --git a/aya/src/programs/perf_attach.rs b/aya/src/programs/perf_attach.rs index 12644f9d..00cddbd1 100644 --- a/aya/src/programs/perf_attach.rs +++ b/aya/src/programs/perf_attach.rs @@ -26,7 +26,7 @@ pub(crate) enum PerfLinkIdInner { #[derive(Debug)] pub(crate) enum PerfLinkInner { - FdLink(FdLink), + Fd(FdLink), PerfLink(PerfLink), } @@ -35,14 +35,14 @@ impl Link for PerfLinkInner { fn id(&self) -> Self::Id { match self { - Self::FdLink(link) => PerfLinkIdInner::FdLinkId(link.id()), + Self::Fd(link) => PerfLinkIdInner::FdLinkId(link.id()), Self::PerfLink(link) => PerfLinkIdInner::PerfLinkId(link.id()), } } fn detach(self) -> Result<(), ProgramError> { match self { - Self::FdLink(link) => link.detach(), + Self::Fd(link) => link.detach(), Self::PerfLink(link) => link.detach(), } } @@ -101,7 +101,7 @@ pub(crate) fn perf_attach( call: "bpf_link_create", io_error, })?; - Ok(PerfLinkInner::FdLink(FdLink::new(link_fd))) + Ok(PerfLinkInner::Fd(FdLink::new(link_fd))) } else { perf_attach_either(prog_fd, fd, None) } diff --git a/aya/src/programs/perf_event.rs b/aya/src/programs/perf_event.rs index 6ff70229..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::FdLink(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(PerfEventLink, PerfLinkInner); impl TryFrom for PerfEventLink { type Error = LinkError; @@ -206,7 +196,7 @@ impl TryFrom for PerfEventLink { fn try_from(fd_link: FdLink) -> Result { 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) { - return Ok(Self::new(PerfLinkInner::FdLink(fd_link))); + return Ok(Self::new(PerfLinkInner::Fd(fd_link))); } Err(LinkError::InvalidLink) } diff --git a/aya/src/programs/sock_ops.rs b/aya/src/programs/sock_ops.rs index b0b96185..83413c60 100644 --- a/aya/src/programs/sock_ops.rs +++ b/aya/src/programs/sock_ops.rs @@ -8,7 +8,7 @@ use aya_obj::generated::{ use crate::{ programs::{ 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}, util::KernelVersion, @@ -140,3 +140,5 @@ define_link_wrapper!( SockOpsLinkIdInner, SockOps, ); + +impl_try_into_fdlink!(SockOpsLink, SockOpsLinkInner); diff --git a/aya/src/programs/tc.rs b/aya/src/programs/tc.rs index 9ee15703..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, @@ -231,7 +231,7 @@ impl SchedClassifier { let prog_fd = self.fd()?; let prog_fd = prog_fd.as_fd(); match link.into_inner() { - TcLinkInner::FdLink(link) => { + TcLinkInner::Fd(link) => { let fd = link.fd; let link_fd = fd.as_fd(); @@ -244,9 +244,7 @@ impl SchedClassifier { self.data .links - .insert(SchedClassifierLink::new(TcLinkInner::FdLink(FdLink::new( - fd, - )))) + .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(fd)))) } TcLinkInner::NlLink(NlLink { if_index, @@ -314,7 +312,7 @@ impl SchedClassifier { self.data .links - .insert(SchedClassifierLink::new(TcLinkInner::FdLink(FdLink::new( + .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new( link_fd, )))) } @@ -414,7 +412,7 @@ pub(crate) enum TcLinkIdInner { #[derive(Debug)] pub(crate) enum TcLinkInner { - FdLink(FdLink), + Fd(FdLink), NlLink(NlLink), } @@ -423,14 +421,14 @@ impl Link for TcLinkInner { fn id(&self) -> Self::Id { match self { - Self::FdLink(link) => TcLinkIdInner::FdLinkId(link.id()), + Self::Fd(link) => TcLinkIdInner::FdLinkId(link.id()), Self::NlLink(link) => TcLinkIdInner::NlLinkId(link.id()), } } fn detach(self) -> Result<(), ProgramError> { match self { - Self::FdLink(link) => link.detach(), + Self::Fd(link) => link.detach(), Self::NlLink(link) => link.detach(), } } @@ -442,7 +440,7 @@ impl<'a> TryFrom<&'a SchedClassifierLink> for &'a FdLink { type Error = LinkError; fn try_from(value: &'a SchedClassifierLink) -> Result { - if let TcLinkInner::FdLink(fd) = value.inner() { + if let TcLinkInner::Fd(fd) = value.inner() { Ok(fd) } else { Err(LinkError::InvalidLink) @@ -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::FdLink(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(SchedClassifierLink, TcLinkInner); impl TryFrom for SchedClassifierLink { type Error = LinkError; @@ -468,7 +456,7 @@ impl TryFrom for SchedClassifierLink { fn try_from(fd_link: FdLink) -> Result { 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) { - return Ok(Self::new(TcLinkInner::FdLink(fd_link))); + return Ok(Self::new(TcLinkInner::Fd(fd_link))); } Err(LinkError::InvalidLink) } diff --git a/aya/src/programs/trace_point.rs b/aya/src/programs/trace_point.rs index e096f56d..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::FdLink(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(TracePointLink, PerfLinkInner); impl TryFrom for TracePointLink { type Error = LinkError; @@ -117,7 +107,7 @@ impl TryFrom for TracePointLink { fn try_from(fd_link: FdLink) -> Result { 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) { - return Ok(Self::new(PerfLinkInner::FdLink(fd_link))); + return Ok(Self::new(PerfLinkInner::Fd(fd_link))); } Err(LinkError::InvalidLink) } diff --git a/aya/src/programs/uprobe.rs b/aya/src/programs/uprobe.rs index ac438136..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::FdLink(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(UProbeLink, PerfLinkInner); impl TryFrom for UProbeLink { type Error = LinkError; @@ -238,7 +228,7 @@ impl TryFrom for UProbeLink { fn try_from(fd_link: FdLink) -> Result { 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) { - return Ok(Self::new(PerfLinkInner::FdLink(fd_link))); + return Ok(Self::new(PerfLinkInner::Fd(fd_link))); } Err(LinkError::InvalidLink) } diff --git a/aya/src/programs/xdp.rs b/aya/src/programs/xdp.rs index 30cf9304..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, @@ -158,7 +158,7 @@ impl Xdp { })?; self.data .links - .insert(XdpLink::new(XdpLinkInner::FdLink(FdLink::new(link_fd)))) + .insert(XdpLink::new(XdpLinkInner::Fd(FdLink::new(link_fd)))) } else { let if_index = if_index as i32; 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 = prog_fd.as_fd(); match link.into_inner() { - XdpLinkInner::FdLink(fd_link) => { + XdpLinkInner::Fd(fd_link) => { let link_fd = fd_link.fd; bpf_link_update(link_fd.as_fd(), prog_fd, None, 0).map_err(|io_error| { SyscallError { @@ -208,7 +208,7 @@ impl Xdp { self.data .links - .insert(XdpLink::new(XdpLinkInner::FdLink(FdLink::new(link_fd)))) + .insert(XdpLink::new(XdpLinkInner::Fd(FdLink::new(link_fd)))) } XdpLinkInner::NlLink(nl_link) => { let if_index = nl_link.if_index; @@ -280,7 +280,7 @@ pub(crate) enum XdpLinkIdInner { #[derive(Debug)] pub(crate) enum XdpLinkInner { - FdLink(FdLink), + Fd(FdLink), NlLink(NlLink), } @@ -289,14 +289,14 @@ impl Link for XdpLinkInner { fn id(&self) -> Self::Id { match self { - Self::FdLink(link) => XdpLinkIdInner::FdLinkId(link.id()), + Self::Fd(link) => XdpLinkIdInner::FdLinkId(link.id()), Self::NlLink(link) => XdpLinkIdInner::NlLinkId(link.id()), } } fn detach(self) -> Result<(), ProgramError> { match self { - Self::FdLink(link) => link.detach(), + Self::Fd(link) => link.detach(), Self::NlLink(link) => link.detach(), } } @@ -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::FdLink(fd) = value.into_inner() { - Ok(fd) - } else { - Err(LinkError::InvalidLink) - } - } -} +impl_try_into_fdlink!(XdpLink, XdpLinkInner); impl TryFrom for XdpLink { type Error = LinkError; @@ -323,7 +313,7 @@ impl TryFrom for XdpLink { // 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())?; 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) } diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index afe0bcb6..6e1923a1 100644 --- a/xtask/public-api/aya.txt +++ b/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::PartialEq for aya::programs::cgroup_skb::CgroupSkbLink pub fn aya::programs::cgroup_skb::CgroupSkbLink::eq(&self, other: &Self) -> bool +impl core::convert::TryFrom 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 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 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::PartialEq for aya::programs::cgroup_sock::CgroupSockLink pub fn aya::programs::cgroup_sock::CgroupSockLink::eq(&self, other: &Self) -> bool +impl core::convert::TryFrom 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 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 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::PartialEq for aya::programs::cgroup_sock_addr::CgroupSockAddrLink pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::eq(&self, other: &Self) -> bool +impl core::convert::TryFrom 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 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 impl core::hash::Hash for aya::programs::cgroup_sock_addr::CgroupSockAddrLink @@ -4400,6 +4409,15 @@ impl core::convert::From for aya::progra pub fn aya::programs::links::FdLink::from(w: aya::programs::sk_lookup::SkLookupLink) -> aya::programs::links::FdLink impl core::convert::From for 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 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 +impl core::convert::TryFrom 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 +impl core::convert::TryFrom 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 impl core::convert::TryFrom 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::iter::IterLink) -> core::result::Result @@ -4430,6 +4448,9 @@ pub fn aya::programs::xdp::XdpLink::try_from(fd_link: aya::programs::links::FdLi impl core::convert::TryFrom 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::perf_event::PerfEventLink) -> core::result::Result +impl core::convert::TryFrom 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 impl core::convert::TryFrom 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::tc::SchedClassifierLink) -> core::result::Result @@ -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::PartialEq for aya::programs::sock_ops::SockOpsLink pub fn aya::programs::sock_ops::SockOpsLink::eq(&self, other: &Self) -> bool +impl core::convert::TryFrom 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 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 impl core::hash::Hash for aya::programs::sock_ops::SockOpsLink