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>
pull/1265/merge
Mehnaz Yunus 4 weeks ago committed by Tamir Duberstein
parent 7a0dabc295
commit 4b5ba53a36

@ -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 {

@ -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);

@ -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);

@ -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",

@ -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::FdLink(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;
@ -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)
} }

@ -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 {

@ -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)
} }

@ -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::FdLink(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;
@ -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)
} }

@ -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);

@ -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( .insert(SchedClassifierLink::new(TcLinkInner::Fd(FdLink::new(fd))))
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 { impl_try_into_fdlink!(SchedClassifierLink, TcLinkInner);
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 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)
} }

@ -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::FdLink(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;
@ -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)
} }

@ -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::FdLink(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;
@ -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)
} }

@ -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 { impl_try_into_fdlink!(XdpLink, XdpLinkInner);
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 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)
} }

@ -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

Loading…
Cancel
Save