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