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

Refs: #1264

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

@ -10,15 +10,13 @@ use aya_obj::generated::{
use crate::{
VerifierLogLevel,
programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
define_link_wrapper, id_as_key, load_program,
CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
};
use super::links::LinkError;
/// A program used to inspect or filter network activity for a given cgroup.
///
/// [`CgroupSkb`] programs can be used to inspect or filter network activity
@ -188,6 +186,8 @@ define_link_wrapper!(
CgroupSkb,
);
impl_try_into_fdlink!(CgroupSkbLink, CgroupSkbLinkInner);
/// Defines where to attach a [`CgroupSkb`] program.
#[derive(Copy, Clone, Debug)]
pub enum CgroupSkbAttachType {
@ -196,14 +196,3 @@ pub enum CgroupSkbAttachType {
/// Attach to egress.
Egress,
}
impl TryFrom<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::{
VerifierLogLevel,
programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
define_link_wrapper, id_as_key, load_program,
CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
};
use super::links::LinkError;
/// A program that is called on socket creation, bind and release.
///
/// [`CgroupSock`] programs can be used to allow or deny socket creation from
@ -164,13 +162,4 @@ define_link_wrapper!(
CgroupSock,
);
impl TryFrom<CgroupSockLink> for FdLink {
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),
}
}
}
impl_try_into_fdlink!(CgroupSockLink, CgroupSockLinkInner);

@ -8,15 +8,13 @@ pub use aya_obj::programs::CgroupSockAddrAttachType;
use crate::{
VerifierLogLevel,
programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
define_link_wrapper, id_as_key, load_program,
CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
};
use super::links::LinkError;
/// A program that can be used to inspect or modify socket addresses (`struct sockaddr`).
///
/// [`CgroupSockAddr`] programs can be used to inspect or modify socket addresses passed to
@ -165,13 +163,4 @@ define_link_wrapper!(
CgroupSockAddr,
);
impl TryFrom<CgroupSockAddrLink> for FdLink {
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),
}
}
}
impl_try_into_fdlink!(CgroupSockAddrLink, CgroupSockAddrLinkInner);

@ -15,7 +15,7 @@ use aya_obj::{
use crate::{
programs::{
FdLink, LinkError, PerfLinkIdInner, PerfLinkInner, ProgramData, ProgramError, ProgramType,
define_link_wrapper, load_program,
define_link_wrapper, impl_try_into_fdlink, load_program,
},
sys::{LinkTarget, SyscallError, bpf_create_iter, bpf_link_create, bpf_link_get_info_by_fd},
};
@ -104,18 +104,6 @@ impl AsFd for IterFd {
}
}
impl TryFrom<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 {
type Error = LinkError;
@ -128,6 +116,8 @@ impl TryFrom<FdLink> for IterLink {
}
}
impl_try_into_fdlink!(IterLink, PerfLinkInner);
define_link_wrapper!(
/// The link used by [`Iter`] programs.
IterLink,

@ -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<KProbeLink> for FdLink {
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_try_into_fdlink!(KProbeLink, PerfLinkInner);
impl TryFrom<FdLink> for KProbeLink {
type Error = LinkError;

@ -443,6 +443,24 @@ macro_rules! define_link_wrapper {
pub(crate) use define_link_wrapper;
macro_rules! impl_try_into_fdlink {
($wrapper:ident, $inner:ident) => {
impl TryFrom<$wrapper> for FdLink {
type Error = LinkError;
fn try_from(value: $wrapper) -> Result<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)]
/// Errors from operations on links.
pub enum LinkError {

@ -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<PerfEventLink> for FdLink {
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_try_into_fdlink!(PerfEventLink, PerfLinkInner);
impl TryFrom<FdLink> for PerfEventLink {
type Error = LinkError;

@ -7,15 +7,13 @@ use aya_obj::generated::{
use crate::{
programs::{
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramType,
define_link_wrapper, id_as_key, load_program,
CgroupAttachMode, FdLink, Link, LinkError, ProgAttachLink, ProgramData, ProgramError,
ProgramType, define_link_wrapper, id_as_key, impl_try_into_fdlink, load_program,
},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
};
use super::links::LinkError;
/// A program used to work with sockets.
///
/// [`SockOps`] programs can access or set socket options, connection
@ -143,13 +141,4 @@ define_link_wrapper!(
SockOps,
);
impl TryFrom<SockOpsLink> for FdLink {
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),
}
}
}
impl_try_into_fdlink!(SockOpsLink, SockOpsLinkInner);

@ -19,7 +19,7 @@ use crate::{
VerifierLogLevel,
programs::{
Link, LinkError, LinkOrder, ProgramData, ProgramError, ProgramType, define_link_wrapper,
id_as_key, load_program, query,
id_as_key, impl_try_into_fdlink, load_program, query,
},
sys::{
BpfLinkCreateArgs, LinkTarget, NetlinkError, ProgQueryTarget, SyscallError,
@ -244,9 +244,7 @@ impl SchedClassifier {
self.data
.links
.insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(
fd,
))))
.insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(fd))))
}
TcLinkInner::NlLink(NlLink {
if_index,
@ -450,17 +448,7 @@ impl<'a> TryFrom<&'a SchedClassifierLink> for &'a FdLink {
}
}
impl TryFrom<SchedClassifierLink> for FdLink {
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_try_into_fdlink!(SchedClassifierLink, TcLinkInner);
impl TryFrom<FdLink> for SchedClassifierLink {
type Error = LinkError;

@ -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<TracePointLink> for FdLink {
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_try_into_fdlink!(TracePointLink, PerfLinkInner);
impl TryFrom<FdLink> for TracePointLink {
type Error = LinkError;

@ -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<UProbeLink> for FdLink {
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_try_into_fdlink!(UProbeLink, PerfLinkInner);
impl TryFrom<FdLink> for UProbeLink {
type Error = LinkError;

@ -21,7 +21,7 @@ use crate::{
VerifierLogLevel,
programs::{
FdLink, Link, LinkError, ProgramData, ProgramError, ProgramType, define_link_wrapper,
id_as_key, load_program,
id_as_key, impl_try_into_fdlink, load_program,
},
sys::{
LinkTarget, NetlinkError, SyscallError, bpf_link_create, bpf_link_get_info_by_fd,
@ -304,17 +304,7 @@ impl Link for XdpLinkInner {
id_as_key!(XdpLinkInner, XdpLinkIdInner);
impl TryFrom<XdpLink> for FdLink {
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_try_into_fdlink!(XdpLink, XdpLinkInner);
impl TryFrom<FdLink> for XdpLink {
type Error = LinkError;

Loading…
Cancel
Save