aya: implement TryFrom<link type> for FdLink using macro

Refs: #1264

Co-authored-by: Benjamin Barzen <bbarzen@amazon.com>
reviewable/pr1264/r5
Mehnaz Yunus 4 weeks ago
parent 469d982a38
commit 39c65bb9db

@ -10,15 +10,13 @@ use aya_obj::generated::{
use crate::{ use crate::{
VerifierLogLevel, VerifierLogLevel,
programs::{ programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program, ProgramType, 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,
}; };
use super::links::LinkError;
/// A program used to inspect or filter network activity for a given cgroup. /// A program used to inspect or filter network activity for a given cgroup.
/// ///
/// [`CgroupSkb`] programs can be used to inspect or filter network activity /// [`CgroupSkb`] programs can be used to inspect or filter network activity
@ -188,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 {
@ -196,14 +196,3 @@ pub enum CgroupSkbAttachType {
/// Attach to egress. /// Attach to egress.
Egress, Egress,
} }
impl TryFrom<CgroupSkbLink> for FdLink {
type Error = LinkError;
fn try_from(value: CgroupSkbLink) -> Result<Self, Self::Error> {
match value.into_inner() {
CgroupSkbLinkInner::Fd(fd) => Ok(fd),
CgroupSkbLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink),
}
}
}

@ -8,15 +8,13 @@ pub use aya_obj::programs::CgroupSockAttachType;
use crate::{ use crate::{
VerifierLogLevel, VerifierLogLevel,
programs::{ programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program, ProgramType, 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,
}; };
use super::links::LinkError;
/// A program that is called on socket creation, bind and release. /// A program that is called on socket creation, bind and release.
/// ///
/// [`CgroupSock`] programs can be used to allow or deny socket creation from /// [`CgroupSock`] programs can be used to allow or deny socket creation from
@ -164,13 +162,4 @@ define_link_wrapper!(
CgroupSock, CgroupSock,
); );
impl TryFrom<CgroupSockLink> for FdLink { impl_try_into_fdlink!(CgroupSockLink, CgroupSockLinkInner);
type Error = LinkError;
fn try_from(value: CgroupSockLink) -> Result<Self, Self::Error> {
match value.into_inner() {
CgroupSockLinkInner::Fd(fd) => Ok(fd),
CgroupSockLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink),
}
}
}

@ -8,15 +8,13 @@ pub use aya_obj::programs::CgroupSockAddrAttachType;
use crate::{ use crate::{
VerifierLogLevel, VerifierLogLevel,
programs::{ programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program, ProgramType, 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,
}; };
use super::links::LinkError;
/// A program that can be used to inspect or modify socket addresses (`struct sockaddr`). /// 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 /// [`CgroupSockAddr`] programs can be used to inspect or modify socket addresses passed to
@ -165,13 +163,4 @@ define_link_wrapper!(
CgroupSockAddr, CgroupSockAddr,
); );
impl TryFrom<CgroupSockAddrLink> for FdLink { impl_try_into_fdlink!(CgroupSockAddrLink, CgroupSockAddrLinkInner);
type Error = LinkError;
fn try_from(value: CgroupSockAddrLink) -> Result<Self, Self::Error> {
match value.into_inner() {
CgroupSockAddrLinkInner::Fd(fd) => Ok(fd),
CgroupSockAddrLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink),
}
}
}

@ -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},
}; };
@ -104,18 +104,6 @@ impl AsFd for IterFd {
} }
} }
impl TryFrom<IterLink> for FdLink {
type Error = LinkError;
fn try_from(value: IterLink) -> Result<Self, Self::Error> {
if let PerfLinkInner::Fd(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;
@ -128,6 +116,8 @@ impl TryFrom<FdLink> for IterLink {
} }
} }
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,

@ -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 { impl_try_into_fdlink!(KProbeLink, PerfLinkInner);
type Error = LinkError;
fn try_from(value: KProbeLink) -> Result<Self, Self::Error> {
if let PerfLinkInner::Fd(fd) = value.into_inner() {
Ok(fd)
} else {
Err(LinkError::InvalidLink)
}
}
}
impl TryFrom<FdLink> for KProbeLink { impl TryFrom<FdLink> for KProbeLink {
type Error = LinkError; type Error = LinkError;

@ -443,6 +443,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 FdLink {
type Error = LinkError;
fn try_from(value: $wrapper) -> Result<Self, Self::Error> {
if let $inner::Fd(fd) = value.into_inner() {
Ok(fd)
} else {
Err(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 {

@ -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 { impl_try_into_fdlink!(PerfEventLink, PerfLinkInner);
type Error = LinkError;
fn try_from(value: PerfEventLink) -> Result<Self, Self::Error> {
if let PerfLinkInner::Fd(fd) = value.into_inner() {
Ok(fd)
} else {
Err(LinkError::InvalidLink)
}
}
}
impl TryFrom<FdLink> for PerfEventLink { impl TryFrom<FdLink> for PerfEventLink {
type Error = LinkError; type Error = LinkError;

@ -7,15 +7,13 @@ use aya_obj::generated::{
use crate::{ use crate::{
programs::{ programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType, CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program, ProgramType, 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,
}; };
use super::links::LinkError;
/// A program used to work with sockets. /// A program used to work with sockets.
/// ///
/// [`SockOps`] programs can access or set socket options, connection /// [`SockOps`] programs can access or set socket options, connection
@ -143,13 +141,4 @@ define_link_wrapper!(
SockOps, SockOps,
); );
impl TryFrom<SockOpsLink> for FdLink { impl_try_into_fdlink!(SockOpsLink, SockOpsLinkInner);
type Error = LinkError;
fn try_from(value: SockOpsLink) -> Result<Self, Self::Error> {
match value.into_inner() {
SockOpsLinkInner::Fd(fd) => Ok(fd),
SockOpsLinkInner::ProgAttach(_) => Err(LinkError::InvalidLink),
}
}
}

@ -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,
@ -244,9 +244,7 @@ impl SchedClassifier {
self.data self.data
.links .links
.insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new( .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(fd))))
fd,
))))
} }
TcLinkInner::NlLink(NlLink { TcLinkInner::NlLink(NlLink {
if_index, if_index,
@ -450,17 +448,7 @@ impl<'a> TryFrom<&'a SchedClassifierLink> for &'a FdLink {
} }
} }
impl TryFrom<SchedClassifierLink> for FdLink { impl_try_into_fdlink!(SchedClassifierLink, TcLinkInner);
type Error = LinkError;
fn try_from(value: SchedClassifierLink) -> Result<Self, Self::Error> {
if let TcLinkInner::Fd(fd) = value.into_inner() {
Ok(fd)
} else {
Err(LinkError::InvalidLink)
}
}
}
impl TryFrom<FdLink> for SchedClassifierLink { impl TryFrom<FdLink> for SchedClassifierLink {
type Error = LinkError; type Error = LinkError;

@ -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 { impl_try_into_fdlink!(TracePointLink, PerfLinkInner);
type Error = LinkError;
fn try_from(value: TracePointLink) -> Result<Self, Self::Error> {
if let PerfLinkInner::Fd(fd) = value.into_inner() {
Ok(fd)
} else {
Err(LinkError::InvalidLink)
}
}
}
impl TryFrom<FdLink> for TracePointLink { impl TryFrom<FdLink> for TracePointLink {
type Error = LinkError; type Error = LinkError;

@ -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 { impl_try_into_fdlink!(UProbeLink, PerfLinkInner);
type Error = LinkError;
fn try_from(value: UProbeLink) -> Result<Self, Self::Error> {
if let PerfLinkInner::Fd(fd) = value.into_inner() {
Ok(fd)
} else {
Err(LinkError::InvalidLink)
}
}
}
impl TryFrom<FdLink> for UProbeLink { impl TryFrom<FdLink> for UProbeLink {
type Error = LinkError; type Error = LinkError;

@ -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,
@ -304,17 +304,7 @@ impl Link for XdpLinkInner {
id_as_key!(XdpLinkInner, XdpLinkIdInner); id_as_key!(XdpLinkInner, XdpLinkIdInner);
impl TryFrom<XdpLink> for FdLink { impl_try_into_fdlink!(XdpLink, XdpLinkInner);
type Error = LinkError;
fn try_from(value: XdpLink) -> Result<Self, Self::Error> {
if let XdpLinkInner::Fd(fd) = value.into_inner() {
Ok(fd)
} else {
Err(LinkError::InvalidLink)
}
}
}
impl TryFrom<FdLink> for XdpLink { impl TryFrom<FdLink> for XdpLink {
type Error = LinkError; type Error = LinkError;

Loading…
Cancel
Save