diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index 4bd590bb..790e637f 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -609,15 +609,15 @@ impl<'a> EbpfLoader<'a> { } ProgramSection::CgroupSkb => Program::CgroupSkb(CgroupSkb { data: ProgramData::new(prog_name, obj, btf_fd, *verifier_log_level), - expected_attach_type: None, + attach_type: None, }), ProgramSection::CgroupSkbIngress => Program::CgroupSkb(CgroupSkb { data: ProgramData::new(prog_name, obj, btf_fd, *verifier_log_level), - expected_attach_type: Some(CgroupSkbAttachType::Ingress), + attach_type: Some(CgroupSkbAttachType::Ingress), }), ProgramSection::CgroupSkbEgress => Program::CgroupSkb(CgroupSkb { data: ProgramData::new(prog_name, obj, btf_fd, *verifier_log_level), - expected_attach_type: Some(CgroupSkbAttachType::Egress), + attach_type: Some(CgroupSkbAttachType::Egress), }), ProgramSection::CgroupSockAddr { attach_type, .. } => { Program::CgroupSockAddr(CgroupSockAddr { diff --git a/aya/src/programs/cgroup_skb.rs b/aya/src/programs/cgroup_skb.rs index 26f5490d..f0d00915 100644 --- a/aya/src/programs/cgroup_skb.rs +++ b/aya/src/programs/cgroup_skb.rs @@ -57,18 +57,16 @@ use crate::{ #[doc(alias = "BPF_PROG_TYPE_CGROUP_SKB")] pub struct CgroupSkb { pub(crate) data: ProgramData, - pub(crate) expected_attach_type: Option, + pub(crate) attach_type: Option, } impl CgroupSkb { /// Loads the program inside the kernel. pub fn load(&mut self) -> Result<(), ProgramError> { - self.data.expected_attach_type = - self.expected_attach_type - .map(|attach_type| match attach_type { - CgroupSkbAttachType::Ingress => BPF_CGROUP_INET_INGRESS, - CgroupSkbAttachType::Egress => BPF_CGROUP_INET_EGRESS, - }); + self.data.expected_attach_type = self.attach_type.map(|attach_type| match attach_type { + CgroupSkbAttachType::Ingress => BPF_CGROUP_INET_INGRESS, + CgroupSkbAttachType::Egress => BPF_CGROUP_INET_EGRESS, + }); load_program(BPF_PROG_TYPE_CGROUP_SKB, &mut self.data) } @@ -79,7 +77,7 @@ impl CgroupSkb { /// method returns `None` for programs defined with the generic section /// `cgroup/skb`. pub fn expected_attach_type(&self) -> &Option { - &self.expected_attach_type + &self.attach_type } /// Attaches the program to the given cgroup. @@ -138,7 +136,7 @@ impl CgroupSkb { let data = ProgramData::from_pinned_path(path, VerifierLogLevel::default())?; Ok(Self { data, - expected_attach_type: Some(expected_attach_type), + attach_type: Some(expected_attach_type), }) } } diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 013d91bc..5fd1b842 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -83,6 +83,7 @@ use aya_obj::{ VerifierLog, btf::BtfError, generated::{bpf_attach_type, bpf_link_info, bpf_prog_info, bpf_prog_type}, + programs::XdpAttachType, }; use info::impl_info; pub use info::{ProgramInfo, ProgramType, loaded_programs}; @@ -991,6 +992,212 @@ impl_from_pin!( Iter, ); +macro_rules! impl_from_prog_info { + ($(($struct_name:ident, $prog_type:expr, $unsafe:ident $(, $var:ident, $var_ty:ty)?)),* $(,)?) => { + $( + impl_from_prog_info!($struct_name, $prog_type, $unsafe $(, $var, $var_ty)?); + )* + }; + ($struct_name:ident, $prog_type:expr, false) => { + impl $struct_name { + /// Constructs an instance of a Program from a [`ProgramInfo`]. + /// + /// This allows the caller to get a handle to an already loaded + /// program from the kernel without having to load it again. + /// + /// # Errors + /// + /// - If the program type reported by the kernel does not match + /// that of the type you're converting to. + /// - If the file descriptor of the program cannot be cloned. + pub fn from_program_info( + name: Option<&'static str>, + info: ProgramInfo, + ) -> Result { + if info.program_type()? != $prog_type { + return Err(ProgramError::UnexpectedProgramType {}); + } + let ProgramInfo { 0: bpf_progam_info} = info; + let fd = info.fd()?; + let fd = fd.as_fd().try_clone_to_owned()?; + + Ok(Self { + data: ProgramData::from_bpf_prog_info( + name.map(|n| Cow::Borrowed(n)), + crate::MockableFd::from_fd(fd), + Path::new(""), + bpf_progam_info, + VerifierLogLevel::default(), + )?, + }) + } + } + }; + ($struct_name:ident, $prog_type:expr, true) => { + impl $struct_name { + /// Constructs an instance of a Program from a [`ProgramInfo`]. + /// + /// This allows the caller to get a handle to an already loaded + /// program from the kernel without having to load it again. + /// + /// # Errors + /// + /// - If the program type reported by the kernel does not match + /// that of the type you're converting to. + /// - If the file descriptor of the program cannot be cloned. + /// + /// # Safety + /// + /// We can't safely cast to `ProgramInfo` since we don't know the + /// concrete type of the program. It's up to the caller to ensure + /// that the program type matches the type you're converting to. + /// Otherwise, the behavior is undefined. + pub unsafe fn from_program_info( + name: Option<&'static str>, + info: ProgramInfo, + ) -> Result { + if info.program_type()? != $prog_type { + return Err(ProgramError::UnexpectedProgramType {}); + } + let ProgramInfo { 0: bpf_progam_info} = info; + let fd = info.fd()?; + let fd = fd.as_fd().try_clone_to_owned()?; + + Ok(Self { + data: ProgramData::from_bpf_prog_info( + name.map(|n| Cow::Borrowed(n)), + crate::MockableFd::from_fd(fd), + Path::new(""), + bpf_progam_info, + VerifierLogLevel::default(), + )?, + }) + } + } + }; + ($struct_name:ident, $prog_type:expr, false, $var:ident, $var_ty:ty) => { + impl $struct_name { + /// Constructs an instance of a Program from a [`ProgramInfo`]. + /// + /// This allows the caller to get a handle to an already loaded + /// program from the kernel without having to load it again. + /// + /// # Errors + /// + /// - If the program type reported by the kernel does not match + /// that of the type you're converting to. + /// - If the file descriptor of the program cannot be cloned. + pub fn from_program_info( + name: Option<&'static str>, + info: ProgramInfo, + $var: $var_ty, + ) -> Result { + if info.program_type()? != $prog_type { + return Err(ProgramError::UnexpectedProgramType {}); + } + let ProgramInfo { 0: bpf_progam_info} = info; + let fd = info.fd()?; + let fd = fd.as_fd().try_clone_to_owned()?; + + Ok(Self { + data: ProgramData::from_bpf_prog_info( + name.map(|n| Cow::Borrowed(n)), + crate::MockableFd::from_fd(fd), + Path::new(""), + bpf_progam_info, + VerifierLogLevel::default(), + )?, + $var, + }) + } + } + }; + ($struct_name:ident, $prog_type:expr, true, $var:ident, $var_ty:ty) => { + impl $struct_name { + /// Constructs an instance of a Program from a [`ProgramInfo`]. + /// + /// This allows the caller to get a handle to an already loaded + /// program from the kernel without having to load it again. + /// + /// # Errors + /// + /// - If the program type reported by the kernel does not match + /// that of the type you're converting to. + /// - If the file descriptor of the program cannot be cloned. + /// + /// # Safety + /// + /// We can't safely cast to `ProgramInfo` since we don't know the + /// concrete type of the program. It's up to the caller to ensure + /// that the program type matches the type you're converting to. + /// Otherwise, the behavior is undefined. + pub unsafe fn from_program_info( + name: Option<&'static str>, + info: ProgramInfo, + $var: $var_ty, + ) -> Result { + if info.program_type()? != $prog_type { + return Err(ProgramError::UnexpectedProgramType {}); + } + let ProgramInfo { 0: bpf_progam_info} = info; + let fd = info.fd()?; + let fd = fd.as_fd().try_clone_to_owned()?; + + Ok(Self { + data: ProgramData::from_bpf_prog_info( + name.map(|n| Cow::Borrowed(n)), + crate::MockableFd::from_fd(fd), + Path::new(""), + bpf_progam_info, + VerifierLogLevel::default(), + )?, + $var, + }) + } + } + }; +} + +// Order of arguments is as follows: +// - Program, bpf_prog_type, unsafe +// - Program, bpf_prog_type, unsafe, additional variable, variable type +impl_from_prog_info!( + (KProbe, ProgramType::KProbe, true, kind, ProbeKind), + (UProbe, ProgramType::KProbe, true, kind, ProbeKind), + (TracePoint, ProgramType::TracePoint, false), + (SocketFilter, ProgramType::SocketFilter, false), + (Xdp, ProgramType::Xdp, false, attach_type, XdpAttachType), + (SkMsg, ProgramType::SkMsg, false), + (SkSkb, ProgramType::SkSkb, false, kind, SkSkbKind), + (SockOps, ProgramType::SockOps, false), + (SchedClassifier, ProgramType::SchedClassifier, false), + ( + CgroupSkb, + ProgramType::CgroupSkb, + false, + attach_type, + Option + ), + (CgroupSysctl, ProgramType::CgroupSysctl, false), + ( + CgroupSockopt, + ProgramType::CgroupSockopt, + false, + attach_type, + CgroupSockoptAttachType + ), + (LircMode2, ProgramType::LircMode2, false), + (PerfEvent, ProgramType::PerfEvent, false), + (Lsm, ProgramType::Lsm, false), + (RawTracePoint, ProgramType::RawTracePoint, false), + (BtfTracePoint, ProgramType::Tracing, true), + (FEntry, ProgramType::Tracing, true), + (FExit, ProgramType::Tracing, true), + (Extension, ProgramType::Extension, false), + (SkLookup, ProgramType::SkLookup, false), + (CgroupDevice, ProgramType::CgroupDevice, false), +); + macro_rules! impl_try_from_program { ($($ty:ident),+ $(,)?) => { $( diff --git a/test/integration-test/src/tests/info.rs b/test/integration-test/src/tests/info.rs index 05b7a849..ef0b40aa 100644 --- a/test/integration-test/src/tests/info.rs +++ b/test/integration-test/src/tests/info.rs @@ -10,7 +10,7 @@ use std::{fs, panic, path::Path, time::SystemTime}; use aya::{ Ebpf, maps::{Array, HashMap, IterableMap as _, MapError, MapType, loaded_maps}, - programs::{ProgramError, ProgramType, SocketFilter, TracePoint, loaded_programs}, + programs::{ProgramError, ProgramType, SocketFilter, TracePoint, UProbe, loaded_programs}, sys::enable_stats, util::KernelVersion, }; @@ -25,8 +25,8 @@ const BPF_STATS_ENABLED: &str = "/proc/sys/kernel/bpf_stats_enabled"; fn test_loaded_programs() { // Load a program. // Since we are only testing the programs for their metadata, there is no need to "attach" them. - let mut bpf = Ebpf::load(crate::SIMPLE_PROG).unwrap(); - let prog: &mut SocketFilter = bpf.program_mut("simple_prog").unwrap().try_into().unwrap(); + let mut bpf = Ebpf::load(crate::TEST).unwrap(); + let prog: &mut UProbe = bpf.program_mut("test_uprobe").unwrap().try_into().unwrap(); prog.load().unwrap(); let test_prog = prog.info().unwrap(); @@ -55,6 +55,27 @@ fn test_loaded_programs() { programs.any(|prog| prog.id() == test_prog.id()), KernelVersion::new(4, 13, 0) ); + + // Iterate through loaded programs to exercise `from_program_info()`. + for program in loaded_programs() { + let program = program.unwrap(); + let mut p: UProbe = unsafe { + UProbe::from_program_info( + Some("simple_prog"), + program, + aya::programs::ProbeKind::UProbe, + ) + .unwrap() + }; + + // Ensure we can perform basic operations on the re-created program. + let res = p + .attach("uprobe_function", "/proc/self/exe", None, None) + .unwrap(); + + // Ensure the program can be detached + p.detach(res).unwrap(); + } } #[test] diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index 6ed2a959..16a8ff2c 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -2539,6 +2539,8 @@ pub fn aya::programs::cgroup_device::CgroupDevice::fd(&self) -> core::result::Re impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::from_pin>(path: P) -> core::result::Result impl aya::programs::cgroup_device::CgroupDevice +pub fn aya::programs::cgroup_device::CgroupDevice::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::info(&self) -> core::result::Result impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -2701,6 +2703,8 @@ pub fn aya::programs::cgroup_skb::CgroupSkb::take_link(&mut self, link_id: aya:: impl aya::programs::cgroup_skb::CgroupSkb pub fn aya::programs::cgroup_skb::CgroupSkb::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::cgroup_skb::CgroupSkb +pub fn aya::programs::cgroup_skb::CgroupSkb::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, attach_type: core::option::Option) -> core::result::Result +impl aya::programs::cgroup_skb::CgroupSkb pub fn aya::programs::cgroup_skb::CgroupSkb::info(&self) -> core::result::Result impl aya::programs::cgroup_skb::CgroupSkb pub fn aya::programs::cgroup_skb::CgroupSkb::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -3079,6 +3083,8 @@ pub fn aya::programs::cgroup_sockopt::CgroupSockopt::take_link(&mut self, link_i impl aya::programs::cgroup_sockopt::CgroupSockopt pub fn aya::programs::cgroup_sockopt::CgroupSockopt::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::cgroup_sockopt::CgroupSockopt +pub fn aya::programs::cgroup_sockopt::CgroupSockopt::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, attach_type: aya_obj::programs::cgroup_sockopt::CgroupSockoptAttachType) -> core::result::Result +impl aya::programs::cgroup_sockopt::CgroupSockopt pub fn aya::programs::cgroup_sockopt::CgroupSockopt::info(&self) -> core::result::Result impl aya::programs::cgroup_sockopt::CgroupSockopt pub fn aya::programs::cgroup_sockopt::CgroupSockopt::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -3205,6 +3211,8 @@ pub fn aya::programs::cgroup_sysctl::CgroupSysctl::fd(&self) -> core::result::Re impl aya::programs::cgroup_sysctl::CgroupSysctl pub fn aya::programs::cgroup_sysctl::CgroupSysctl::from_pin>(path: P) -> core::result::Result impl aya::programs::cgroup_sysctl::CgroupSysctl +pub fn aya::programs::cgroup_sysctl::CgroupSysctl::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::cgroup_sysctl::CgroupSysctl pub fn aya::programs::cgroup_sysctl::CgroupSysctl::info(&self) -> core::result::Result impl aya::programs::cgroup_sysctl::CgroupSysctl pub fn aya::programs::cgroup_sysctl::CgroupSysctl::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -3365,6 +3373,8 @@ pub fn aya::programs::extension::Extension::fd(&self) -> core::result::Result<&a impl aya::programs::extension::Extension pub fn aya::programs::extension::Extension::from_pin>(path: P) -> core::result::Result impl aya::programs::extension::Extension +pub fn aya::programs::extension::Extension::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::extension::Extension pub fn aya::programs::extension::Extension::info(&self) -> core::result::Result impl aya::programs::extension::Extension pub fn aya::programs::extension::Extension::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -3495,6 +3505,8 @@ pub fn aya::programs::fentry::FEntry::fd(&self) -> core::result::Result<&aya::pr impl aya::programs::fentry::FEntry pub fn aya::programs::fentry::FEntry::from_pin>(path: P) -> core::result::Result impl aya::programs::fentry::FEntry +pub unsafe fn aya::programs::fentry::FEntry::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::fentry::FEntry pub fn aya::programs::fentry::FEntry::info(&self) -> core::result::Result impl aya::programs::fentry::FEntry pub fn aya::programs::fentry::FEntry::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -3625,6 +3637,8 @@ pub fn aya::programs::fexit::FExit::fd(&self) -> core::result::Result<&aya::prog impl aya::programs::fexit::FExit pub fn aya::programs::fexit::FExit::from_pin>(path: P) -> core::result::Result impl aya::programs::fexit::FExit +pub unsafe fn aya::programs::fexit::FExit::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::fexit::FExit pub fn aya::programs::fexit::FExit::info(&self) -> core::result::Result impl aya::programs::fexit::FExit pub fn aya::programs::fexit::FExit::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -3952,6 +3966,8 @@ pub fn aya::programs::kprobe::KProbe::take_link(&mut self, link_id: aya::program impl aya::programs::kprobe::KProbe pub fn aya::programs::kprobe::KProbe::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::kprobe::KProbe +pub unsafe fn aya::programs::kprobe::KProbe::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, kind: aya::programs::ProbeKind) -> core::result::Result +impl aya::programs::kprobe::KProbe pub fn aya::programs::kprobe::KProbe::info(&self) -> core::result::Result impl aya::programs::kprobe::KProbe pub fn aya::programs::kprobe::KProbe::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -4649,6 +4665,8 @@ pub fn aya::programs::lirc_mode2::LircMode2::fd(&self) -> core::result::Result<& impl aya::programs::lirc_mode2::LircMode2 pub fn aya::programs::lirc_mode2::LircMode2::from_pin>(path: P) -> core::result::Result impl aya::programs::lirc_mode2::LircMode2 +pub fn aya::programs::lirc_mode2::LircMode2::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::lirc_mode2::LircMode2 pub fn aya::programs::lirc_mode2::LircMode2::info(&self) -> core::result::Result impl aya::programs::lirc_mode2::LircMode2 pub fn aya::programs::lirc_mode2::LircMode2::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -4700,6 +4718,8 @@ pub fn aya::programs::lsm::Lsm::fd(&self) -> core::result::Result<&aya::programs impl aya::programs::lsm::Lsm pub fn aya::programs::lsm::Lsm::from_pin>(path: P) -> core::result::Result impl aya::programs::lsm::Lsm +pub fn aya::programs::lsm::Lsm::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::lsm::Lsm pub fn aya::programs::lsm::Lsm::info(&self) -> core::result::Result impl aya::programs::lsm::Lsm pub fn aya::programs::lsm::Lsm::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -5026,6 +5046,8 @@ pub fn aya::programs::perf_event::PerfEvent::fd(&self) -> core::result::Result<& impl aya::programs::perf_event::PerfEvent pub fn aya::programs::perf_event::PerfEvent::from_pin>(path: P) -> core::result::Result impl aya::programs::perf_event::PerfEvent +pub fn aya::programs::perf_event::PerfEvent::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::perf_event::PerfEvent pub fn aya::programs::perf_event::PerfEvent::info(&self) -> core::result::Result impl aya::programs::perf_event::PerfEvent pub fn aya::programs::perf_event::PerfEvent::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -5158,6 +5180,8 @@ pub fn aya::programs::raw_trace_point::RawTracePoint::fd(&self) -> core::result: impl aya::programs::raw_trace_point::RawTracePoint pub fn aya::programs::raw_trace_point::RawTracePoint::from_pin>(path: P) -> core::result::Result impl aya::programs::raw_trace_point::RawTracePoint +pub fn aya::programs::raw_trace_point::RawTracePoint::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::raw_trace_point::RawTracePoint pub fn aya::programs::raw_trace_point::RawTracePoint::info(&self) -> core::result::Result impl aya::programs::raw_trace_point::RawTracePoint pub fn aya::programs::raw_trace_point::RawTracePoint::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -5288,6 +5312,8 @@ pub fn aya::programs::sk_lookup::SkLookup::fd(&self) -> core::result::Result<&ay impl aya::programs::sk_lookup::SkLookup pub fn aya::programs::sk_lookup::SkLookup::from_pin>(path: P) -> core::result::Result impl aya::programs::sk_lookup::SkLookup +pub fn aya::programs::sk_lookup::SkLookup::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::sk_lookup::SkLookup pub fn aya::programs::sk_lookup::SkLookup::info(&self) -> core::result::Result impl aya::programs::sk_lookup::SkLookup pub fn aya::programs::sk_lookup::SkLookup::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -5418,6 +5444,8 @@ pub fn aya::programs::sk_msg::SkMsg::fd(&self) -> core::result::Result<&aya::pro impl aya::programs::sk_msg::SkMsg pub fn aya::programs::sk_msg::SkMsg::from_pin>(path: P) -> core::result::Result impl aya::programs::sk_msg::SkMsg +pub fn aya::programs::sk_msg::SkMsg::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::sk_msg::SkMsg pub fn aya::programs::sk_msg::SkMsg::info(&self) -> core::result::Result impl aya::programs::sk_msg::SkMsg pub fn aya::programs::sk_msg::SkMsg::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -5583,6 +5611,8 @@ pub fn aya::programs::sk_skb::SkSkb::take_link(&mut self, link_id: aya::programs impl aya::programs::sk_skb::SkSkb pub fn aya::programs::sk_skb::SkSkb::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::sk_skb::SkSkb +pub fn aya::programs::sk_skb::SkSkb::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, kind: aya::programs::sk_skb::SkSkbKind) -> core::result::Result +impl aya::programs::sk_skb::SkSkb pub fn aya::programs::sk_skb::SkSkb::info(&self) -> core::result::Result impl aya::programs::sk_skb::SkSkb pub fn aya::programs::sk_skb::SkSkb::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -5713,6 +5743,8 @@ pub fn aya::programs::sock_ops::SockOps::fd(&self) -> core::result::Result<&aya: impl aya::programs::sock_ops::SockOps pub fn aya::programs::sock_ops::SockOps::from_pin>(path: P) -> core::result::Result impl aya::programs::sock_ops::SockOps +pub fn aya::programs::sock_ops::SockOps::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::sock_ops::SockOps pub fn aya::programs::sock_ops::SockOps::info(&self) -> core::result::Result impl aya::programs::sock_ops::SockOps pub fn aya::programs::sock_ops::SockOps::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -5873,6 +5905,8 @@ pub fn aya::programs::socket_filter::SocketFilter::fd(&self) -> core::result::Re impl aya::programs::socket_filter::SocketFilter pub fn aya::programs::socket_filter::SocketFilter::from_pin>(path: P) -> core::result::Result impl aya::programs::socket_filter::SocketFilter +pub fn aya::programs::socket_filter::SocketFilter::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::socket_filter::SocketFilter pub fn aya::programs::socket_filter::SocketFilter::info(&self) -> core::result::Result impl aya::programs::socket_filter::SocketFilter pub fn aya::programs::socket_filter::SocketFilter::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -6151,6 +6185,8 @@ pub fn aya::programs::tc::SchedClassifier::take_link(&mut self, link_id: aya::pr impl aya::programs::tc::SchedClassifier pub fn aya::programs::tc::SchedClassifier::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::tc::SchedClassifier +pub fn aya::programs::tc::SchedClassifier::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::tc::SchedClassifier pub fn aya::programs::tc::SchedClassifier::info(&self) -> core::result::Result impl aya::programs::tc::SchedClassifier pub fn aya::programs::tc::SchedClassifier::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -6297,6 +6333,8 @@ pub fn aya::programs::tp_btf::BtfTracePoint::fd(&self) -> core::result::Result<& impl aya::programs::tp_btf::BtfTracePoint pub fn aya::programs::tp_btf::BtfTracePoint::from_pin>(path: P) -> core::result::Result impl aya::programs::tp_btf::BtfTracePoint +pub unsafe fn aya::programs::tp_btf::BtfTracePoint::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::tp_btf::BtfTracePoint pub fn aya::programs::tp_btf::BtfTracePoint::info(&self) -> core::result::Result impl aya::programs::tp_btf::BtfTracePoint pub fn aya::programs::tp_btf::BtfTracePoint::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -6463,6 +6501,8 @@ pub fn aya::programs::trace_point::TracePoint::fd(&self) -> core::result::Result impl aya::programs::trace_point::TracePoint pub fn aya::programs::trace_point::TracePoint::from_pin>(path: P) -> core::result::Result impl aya::programs::trace_point::TracePoint +pub fn aya::programs::trace_point::TracePoint::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::trace_point::TracePoint pub fn aya::programs::trace_point::TracePoint::info(&self) -> core::result::Result impl aya::programs::trace_point::TracePoint pub fn aya::programs::trace_point::TracePoint::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -6707,6 +6747,8 @@ pub fn aya::programs::uprobe::UProbe::take_link(&mut self, link_id: aya::program impl aya::programs::uprobe::UProbe pub fn aya::programs::uprobe::UProbe::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::uprobe::UProbe +pub unsafe fn aya::programs::uprobe::UProbe::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, kind: aya::programs::ProbeKind) -> core::result::Result +impl aya::programs::uprobe::UProbe pub fn aya::programs::uprobe::UProbe::info(&self) -> core::result::Result impl aya::programs::uprobe::UProbe pub fn aya::programs::uprobe::UProbe::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -6874,6 +6916,8 @@ pub fn aya::programs::xdp::Xdp::take_link(&mut self, link_id: aya::programs::xdp impl aya::programs::xdp::Xdp pub fn aya::programs::xdp::Xdp::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::xdp::Xdp +pub fn aya::programs::xdp::Xdp::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, attach_type: aya_obj::programs::xdp::XdpAttachType) -> core::result::Result +impl aya::programs::xdp::Xdp pub fn aya::programs::xdp::Xdp::info(&self) -> core::result::Result impl aya::programs::xdp::Xdp pub fn aya::programs::xdp::Xdp::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8053,6 +8097,8 @@ pub fn aya::programs::tp_btf::BtfTracePoint::fd(&self) -> core::result::Result<& impl aya::programs::tp_btf::BtfTracePoint pub fn aya::programs::tp_btf::BtfTracePoint::from_pin>(path: P) -> core::result::Result impl aya::programs::tp_btf::BtfTracePoint +pub unsafe fn aya::programs::tp_btf::BtfTracePoint::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::tp_btf::BtfTracePoint pub fn aya::programs::tp_btf::BtfTracePoint::info(&self) -> core::result::Result impl aya::programs::tp_btf::BtfTracePoint pub fn aya::programs::tp_btf::BtfTracePoint::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8104,6 +8150,8 @@ pub fn aya::programs::cgroup_device::CgroupDevice::fd(&self) -> core::result::Re impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::from_pin>(path: P) -> core::result::Result impl aya::programs::cgroup_device::CgroupDevice +pub fn aya::programs::cgroup_device::CgroupDevice::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::info(&self) -> core::result::Result impl aya::programs::cgroup_device::CgroupDevice pub fn aya::programs::cgroup_device::CgroupDevice::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8154,6 +8202,8 @@ pub fn aya::programs::cgroup_skb::CgroupSkb::take_link(&mut self, link_id: aya:: impl aya::programs::cgroup_skb::CgroupSkb pub fn aya::programs::cgroup_skb::CgroupSkb::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::cgroup_skb::CgroupSkb +pub fn aya::programs::cgroup_skb::CgroupSkb::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, attach_type: core::option::Option) -> core::result::Result +impl aya::programs::cgroup_skb::CgroupSkb pub fn aya::programs::cgroup_skb::CgroupSkb::info(&self) -> core::result::Result impl aya::programs::cgroup_skb::CgroupSkb pub fn aya::programs::cgroup_skb::CgroupSkb::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8301,6 +8351,8 @@ pub fn aya::programs::cgroup_sockopt::CgroupSockopt::take_link(&mut self, link_i impl aya::programs::cgroup_sockopt::CgroupSockopt pub fn aya::programs::cgroup_sockopt::CgroupSockopt::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::cgroup_sockopt::CgroupSockopt +pub fn aya::programs::cgroup_sockopt::CgroupSockopt::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, attach_type: aya_obj::programs::cgroup_sockopt::CgroupSockoptAttachType) -> core::result::Result +impl aya::programs::cgroup_sockopt::CgroupSockopt pub fn aya::programs::cgroup_sockopt::CgroupSockopt::info(&self) -> core::result::Result impl aya::programs::cgroup_sockopt::CgroupSockopt pub fn aya::programs::cgroup_sockopt::CgroupSockopt::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8351,6 +8403,8 @@ pub fn aya::programs::cgroup_sysctl::CgroupSysctl::fd(&self) -> core::result::Re impl aya::programs::cgroup_sysctl::CgroupSysctl pub fn aya::programs::cgroup_sysctl::CgroupSysctl::from_pin>(path: P) -> core::result::Result impl aya::programs::cgroup_sysctl::CgroupSysctl +pub fn aya::programs::cgroup_sysctl::CgroupSysctl::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::cgroup_sysctl::CgroupSysctl pub fn aya::programs::cgroup_sysctl::CgroupSysctl::info(&self) -> core::result::Result impl aya::programs::cgroup_sysctl::CgroupSysctl pub fn aya::programs::cgroup_sysctl::CgroupSysctl::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8402,6 +8456,8 @@ pub fn aya::programs::extension::Extension::fd(&self) -> core::result::Result<&a impl aya::programs::extension::Extension pub fn aya::programs::extension::Extension::from_pin>(path: P) -> core::result::Result impl aya::programs::extension::Extension +pub fn aya::programs::extension::Extension::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::extension::Extension pub fn aya::programs::extension::Extension::info(&self) -> core::result::Result impl aya::programs::extension::Extension pub fn aya::programs::extension::Extension::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8452,6 +8508,8 @@ pub fn aya::programs::fentry::FEntry::fd(&self) -> core::result::Result<&aya::pr impl aya::programs::fentry::FEntry pub fn aya::programs::fentry::FEntry::from_pin>(path: P) -> core::result::Result impl aya::programs::fentry::FEntry +pub unsafe fn aya::programs::fentry::FEntry::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::fentry::FEntry pub fn aya::programs::fentry::FEntry::info(&self) -> core::result::Result impl aya::programs::fentry::FEntry pub fn aya::programs::fentry::FEntry::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8502,6 +8560,8 @@ pub fn aya::programs::fexit::FExit::fd(&self) -> core::result::Result<&aya::prog impl aya::programs::fexit::FExit pub fn aya::programs::fexit::FExit::from_pin>(path: P) -> core::result::Result impl aya::programs::fexit::FExit +pub unsafe fn aya::programs::fexit::FExit::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::fexit::FExit pub fn aya::programs::fexit::FExit::info(&self) -> core::result::Result impl aya::programs::fexit::FExit pub fn aya::programs::fexit::FExit::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8602,6 +8662,8 @@ pub fn aya::programs::kprobe::KProbe::take_link(&mut self, link_id: aya::program impl aya::programs::kprobe::KProbe pub fn aya::programs::kprobe::KProbe::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::kprobe::KProbe +pub unsafe fn aya::programs::kprobe::KProbe::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, kind: aya::programs::ProbeKind) -> core::result::Result +impl aya::programs::kprobe::KProbe pub fn aya::programs::kprobe::KProbe::info(&self) -> core::result::Result impl aya::programs::kprobe::KProbe pub fn aya::programs::kprobe::KProbe::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8688,6 +8750,8 @@ pub fn aya::programs::lirc_mode2::LircMode2::fd(&self) -> core::result::Result<& impl aya::programs::lirc_mode2::LircMode2 pub fn aya::programs::lirc_mode2::LircMode2::from_pin>(path: P) -> core::result::Result impl aya::programs::lirc_mode2::LircMode2 +pub fn aya::programs::lirc_mode2::LircMode2::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::lirc_mode2::LircMode2 pub fn aya::programs::lirc_mode2::LircMode2::info(&self) -> core::result::Result impl aya::programs::lirc_mode2::LircMode2 pub fn aya::programs::lirc_mode2::LircMode2::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8738,6 +8802,8 @@ pub fn aya::programs::lsm::Lsm::fd(&self) -> core::result::Result<&aya::programs impl aya::programs::lsm::Lsm pub fn aya::programs::lsm::Lsm::from_pin>(path: P) -> core::result::Result impl aya::programs::lsm::Lsm +pub fn aya::programs::lsm::Lsm::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::lsm::Lsm pub fn aya::programs::lsm::Lsm::info(&self) -> core::result::Result impl aya::programs::lsm::Lsm pub fn aya::programs::lsm::Lsm::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8788,6 +8854,8 @@ pub fn aya::programs::perf_event::PerfEvent::fd(&self) -> core::result::Result<& impl aya::programs::perf_event::PerfEvent pub fn aya::programs::perf_event::PerfEvent::from_pin>(path: P) -> core::result::Result impl aya::programs::perf_event::PerfEvent +pub fn aya::programs::perf_event::PerfEvent::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::perf_event::PerfEvent pub fn aya::programs::perf_event::PerfEvent::info(&self) -> core::result::Result impl aya::programs::perf_event::PerfEvent pub fn aya::programs::perf_event::PerfEvent::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8936,6 +9004,8 @@ pub fn aya::programs::raw_trace_point::RawTracePoint::fd(&self) -> core::result: impl aya::programs::raw_trace_point::RawTracePoint pub fn aya::programs::raw_trace_point::RawTracePoint::from_pin>(path: P) -> core::result::Result impl aya::programs::raw_trace_point::RawTracePoint +pub fn aya::programs::raw_trace_point::RawTracePoint::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::raw_trace_point::RawTracePoint pub fn aya::programs::raw_trace_point::RawTracePoint::info(&self) -> core::result::Result impl aya::programs::raw_trace_point::RawTracePoint pub fn aya::programs::raw_trace_point::RawTracePoint::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -8988,6 +9058,8 @@ pub fn aya::programs::tc::SchedClassifier::take_link(&mut self, link_id: aya::pr impl aya::programs::tc::SchedClassifier pub fn aya::programs::tc::SchedClassifier::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::tc::SchedClassifier +pub fn aya::programs::tc::SchedClassifier::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::tc::SchedClassifier pub fn aya::programs::tc::SchedClassifier::info(&self) -> core::result::Result impl aya::programs::tc::SchedClassifier pub fn aya::programs::tc::SchedClassifier::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9040,6 +9112,8 @@ pub fn aya::programs::sk_lookup::SkLookup::fd(&self) -> core::result::Result<&ay impl aya::programs::sk_lookup::SkLookup pub fn aya::programs::sk_lookup::SkLookup::from_pin>(path: P) -> core::result::Result impl aya::programs::sk_lookup::SkLookup +pub fn aya::programs::sk_lookup::SkLookup::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::sk_lookup::SkLookup pub fn aya::programs::sk_lookup::SkLookup::info(&self) -> core::result::Result impl aya::programs::sk_lookup::SkLookup pub fn aya::programs::sk_lookup::SkLookup::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9090,6 +9164,8 @@ pub fn aya::programs::sk_msg::SkMsg::fd(&self) -> core::result::Result<&aya::pro impl aya::programs::sk_msg::SkMsg pub fn aya::programs::sk_msg::SkMsg::from_pin>(path: P) -> core::result::Result impl aya::programs::sk_msg::SkMsg +pub fn aya::programs::sk_msg::SkMsg::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::sk_msg::SkMsg pub fn aya::programs::sk_msg::SkMsg::info(&self) -> core::result::Result impl aya::programs::sk_msg::SkMsg pub fn aya::programs::sk_msg::SkMsg::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9139,6 +9215,8 @@ pub fn aya::programs::sk_skb::SkSkb::take_link(&mut self, link_id: aya::programs impl aya::programs::sk_skb::SkSkb pub fn aya::programs::sk_skb::SkSkb::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::sk_skb::SkSkb +pub fn aya::programs::sk_skb::SkSkb::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, kind: aya::programs::sk_skb::SkSkbKind) -> core::result::Result +impl aya::programs::sk_skb::SkSkb pub fn aya::programs::sk_skb::SkSkb::info(&self) -> core::result::Result impl aya::programs::sk_skb::SkSkb pub fn aya::programs::sk_skb::SkSkb::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9189,6 +9267,8 @@ pub fn aya::programs::sock_ops::SockOps::fd(&self) -> core::result::Result<&aya: impl aya::programs::sock_ops::SockOps pub fn aya::programs::sock_ops::SockOps::from_pin>(path: P) -> core::result::Result impl aya::programs::sock_ops::SockOps +pub fn aya::programs::sock_ops::SockOps::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::sock_ops::SockOps pub fn aya::programs::sock_ops::SockOps::info(&self) -> core::result::Result impl aya::programs::sock_ops::SockOps pub fn aya::programs::sock_ops::SockOps::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9238,6 +9318,8 @@ pub fn aya::programs::socket_filter::SocketFilter::fd(&self) -> core::result::Re impl aya::programs::socket_filter::SocketFilter pub fn aya::programs::socket_filter::SocketFilter::from_pin>(path: P) -> core::result::Result impl aya::programs::socket_filter::SocketFilter +pub fn aya::programs::socket_filter::SocketFilter::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::socket_filter::SocketFilter pub fn aya::programs::socket_filter::SocketFilter::info(&self) -> core::result::Result impl aya::programs::socket_filter::SocketFilter pub fn aya::programs::socket_filter::SocketFilter::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9288,6 +9370,8 @@ pub fn aya::programs::trace_point::TracePoint::fd(&self) -> core::result::Result impl aya::programs::trace_point::TracePoint pub fn aya::programs::trace_point::TracePoint::from_pin>(path: P) -> core::result::Result impl aya::programs::trace_point::TracePoint +pub fn aya::programs::trace_point::TracePoint::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo) -> core::result::Result +impl aya::programs::trace_point::TracePoint pub fn aya::programs::trace_point::TracePoint::info(&self) -> core::result::Result impl aya::programs::trace_point::TracePoint pub fn aya::programs::trace_point::TracePoint::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9338,6 +9422,8 @@ pub fn aya::programs::uprobe::UProbe::take_link(&mut self, link_id: aya::program impl aya::programs::uprobe::UProbe pub fn aya::programs::uprobe::UProbe::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::uprobe::UProbe +pub unsafe fn aya::programs::uprobe::UProbe::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, kind: aya::programs::ProbeKind) -> core::result::Result +impl aya::programs::uprobe::UProbe pub fn aya::programs::uprobe::UProbe::info(&self) -> core::result::Result impl aya::programs::uprobe::UProbe pub fn aya::programs::uprobe::UProbe::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> @@ -9389,6 +9475,8 @@ pub fn aya::programs::xdp::Xdp::take_link(&mut self, link_id: aya::programs::xdp impl aya::programs::xdp::Xdp pub fn aya::programs::xdp::Xdp::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> impl aya::programs::xdp::Xdp +pub fn aya::programs::xdp::Xdp::from_program_info(name: core::option::Option<&'static str>, info: aya::programs::ProgramInfo, attach_type: aya_obj::programs::xdp::XdpAttachType) -> core::result::Result +impl aya::programs::xdp::Xdp pub fn aya::programs::xdp::Xdp::info(&self) -> core::result::Result impl aya::programs::xdp::Xdp pub fn aya::programs::xdp::Xdp::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError>