diff --git a/aya-bpf-macros/src/flow_dissector.rs b/aya-bpf-macros/src/flow_dissector.rs new file mode 100644 index 000000000..297435d9a --- /dev/null +++ b/aya-bpf-macros/src/flow_dissector.rs @@ -0,0 +1,66 @@ +use proc_macro2::TokenStream; +use proc_macro_error::abort; +use quote::quote; +use syn::{ItemFn, Result}; + +pub(crate) struct FlowDissector { + item: ItemFn, +} + +impl FlowDissector { + pub(crate) fn parse(attrs: TokenStream, item: TokenStream) -> Result { + if !attrs.is_empty() { + abort!(attrs, "unexpected attribute") + } + let item = syn::parse2(item)?; + Ok(FlowDissector { item }) + } + + pub(crate) fn expand(&self) -> Result { + let fn_name = self.item.sig.ident.clone(); + let fn_vis = &self.item.vis; + let item = &self.item; + Ok(quote! { + #[no_mangle] + #[link_section = "flow_dissector"] + #fn_vis fn #fn_name(ctx: *mut ::aya_bpf::bindings::__sk_buff) -> u32 { + return #fn_name(::aya_bpf::programs::FlowDissectorContext::new(ctx)); + + #item + } + }) + } +} + +#[cfg(test)] +mod tests { + use syn::parse_quote; + + use super::*; + + #[test] + fn test_flow_dissector() { + let prog = FlowDissector::parse( + parse_quote! {}, + parse_quote! { + fn prog(ctx: &mut ::aya_bpf::programs::FlowDissectorContext) -> u32 { + 0 + } + }, + ) + .unwrap(); + let expanded = prog.expand().unwrap(); + let expected = quote! { + #[no_mangle] + #[link_section = "flow_dissector"] + fn prog(ctx: *mut ::aya_bpf::bindings::__sk_buff) -> u32 { + return prog(::aya_bpf::programs::FlowDissectorContext::new(ctx)); + + fn prog(ctx: &mut ::aya_bpf::programs::FlowDissectorContext) -> u32 { + 0 + } + } + }; + assert_eq!(expected.to_string(), expanded.to_string()); + } +} diff --git a/aya-bpf-macros/src/lib.rs b/aya-bpf-macros/src/lib.rs index 4393ab95a..f9e0e09d2 100644 --- a/aya-bpf-macros/src/lib.rs +++ b/aya-bpf-macros/src/lib.rs @@ -8,6 +8,7 @@ mod cgroup_sockopt; mod cgroup_sysctl; mod fentry; mod fexit; +mod flow_dissector; mod kprobe; mod lsm; mod map; @@ -32,6 +33,7 @@ use cgroup_sockopt::CgroupSockopt; use cgroup_sysctl::CgroupSysctl; use fentry::FEntry; use fexit::FExit; +use flow_dissector::FlowDissector; use kprobe::{KProbe, KProbeKind}; use lsm::Lsm; use map::Map; @@ -605,6 +607,21 @@ pub fn fexit(attrs: TokenStream, item: TokenStream) -> TokenStream { } } +/// Marks a function as an eBPF Flow Dissector program that can be attached to +/// a network namespace. +/// +#[proc_macro_error] +#[proc_macro_attribute] +pub fn flow_dissector(attrs: TokenStream, item: TokenStream) -> TokenStream { + match FlowDissector::parse(attrs.into(), item.into()) { + Ok(prog) => prog + .expand() + .unwrap_or_else(|err| abort!(err.span(), "{}", err)) + .into(), + Err(err) => abort!(err.span(), "{}", err), + } +} + /// Marks a function as an eBPF Socket Lookup program that can be attached to /// a network namespace. /// diff --git a/aya-obj/src/obj.rs b/aya-obj/src/obj.rs index 1776b3ca7..c296dcea6 100644 --- a/aya-obj/src/obj.rs +++ b/aya-obj/src/obj.rs @@ -264,6 +264,7 @@ pub enum ProgramSection { FExit { sleepable: bool, }, + FlowDissector, Extension, SkLookup, CgroupSock { @@ -419,6 +420,7 @@ impl FromStr for ProgramSection { "fentry.s" => FEntry { sleepable: true }, "fexit" => FExit { sleepable: false }, "fexit.s" => FExit { sleepable: true }, + "flow_dissector" => FlowDissector, "freplace" => Extension, "sk_lookup" => SkLookup, _ => { diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index 2272bc524..b9955378a 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -31,9 +31,10 @@ use crate::{ }, programs::{ BtfTracePoint, CgroupDevice, CgroupSkb, CgroupSkbAttachType, CgroupSock, CgroupSockAddr, - CgroupSockopt, CgroupSysctl, Extension, FEntry, FExit, KProbe, LircMode2, Lsm, PerfEvent, - ProbeKind, Program, ProgramData, ProgramError, RawTracePoint, SchedClassifier, SkLookup, - SkMsg, SkSkb, SkSkbKind, SockOps, SocketFilter, TracePoint, UProbe, Xdp, + CgroupSockopt, CgroupSysctl, Extension, FEntry, FExit, FlowDissector, KProbe, LircMode2, + Lsm, PerfEvent, ProbeKind, Program, ProgramData, ProgramError, RawTracePoint, + SchedClassifier, SkLookup, SkMsg, SkSkb, SkSkbKind, SockOps, SocketFilter, TracePoint, + UProbe, Xdp, }, sys::{ bpf_load_btf, is_bpf_cookie_supported, is_bpf_global_data_supported, @@ -434,6 +435,7 @@ impl<'a> BpfLoader<'a> { | ProgramSection::PerfEvent | ProgramSection::RawTracePoint | ProgramSection::SkLookup + | ProgramSection::FlowDissector | ProgramSection::CgroupSock { attach_type: _ } | ProgramSection::CgroupDevice => {} } @@ -666,6 +668,9 @@ impl<'a> BpfLoader<'a> { } Program::FExit(FExit { data }) } + ProgramSection::FlowDissector => Program::FlowDissector(FlowDissector { + data: ProgramData::new(prog_name, obj, btf_fd, *verifier_log_level), + }), ProgramSection::Extension => Program::Extension(Extension { data: ProgramData::new(prog_name, obj, btf_fd, *verifier_log_level), }), diff --git a/aya/src/programs/flow_dissector.rs b/aya/src/programs/flow_dissector.rs new file mode 100644 index 000000000..4e83f6e72 --- /dev/null +++ b/aya/src/programs/flow_dissector.rs @@ -0,0 +1,109 @@ +//! Flow dissector programs. + +use std::os::fd::AsFd; + +use crate::{ + generated::{bpf_attach_type::BPF_FLOW_DISSECTOR, bpf_prog_type::BPF_PROG_TYPE_FLOW_DISSECTOR}, + programs::{define_link_wrapper, load_program, FdLink, FdLinkId, ProgramData, ProgramError}, + sys::{bpf_link_create, LinkTarget, SyscallError}, +}; + +/// A program that can be attached as a Flow Dissector routine +/// +/// ['FlowDissector'] programs operate on an __sk_buff. +/// However, only the limited set of fields is allowed: data, data_end and flow_keys. +/// flow_keys is struct bpf_flow_keys and contains flow dissector input and output arguments. +/// +/// # Minimum kernel version +/// +/// The minimum kernel version required to use this feature is 4.2. +/// +/// # Examples +/// +/// ```no_run +/// # #[derive(Debug, thiserror::Error)] +/// # enum Error { +/// # #[error(transparent)] +/// # IO(#[from] std::io::Error), +/// # #[error(transparent)] +/// # Map(#[from] aya::maps::MapError), +/// # #[error(transparent)] +/// # Program(#[from] aya::programs::ProgramError), +/// # #[error(transparent)] +/// # Bpf(#[from] aya::BpfError) +/// # } +/// # let mut bpf = Bpf::load_file("ebpf_programs.o")?; +/// use aya::{Bpf, programs::FlowDissector}; +/// use std::fs::File; +/// +/// let program: &mut FlowDissector = bpf.program_mut("filename_lookup").unwrap().try_into()?; +/// program.load()?; +/// +/// let net_ns = File::open("/proc/self/ns/net")?; +/// program.attach(net_ns)?; +/// # Ok::<(), Error>(()) +/// ``` +#[derive(Debug)] +#[doc(alias = "BPF_PROG_TYPE_FLOW_DISSECTOR")] +pub struct FlowDissector { + pub(crate) data: ProgramData, +} + +impl FlowDissector { + /// Loads the program inside the kernel. + pub fn load(&mut self) -> Result<(), ProgramError> { + self.data.expected_attach_type = Some(BPF_FLOW_DISSECTOR); + load_program(BPF_PROG_TYPE_FLOW_DISSECTOR, &mut self.data) + } + + /// Attaches the program to the given network namespace. + /// + /// The returned value can be used to detach, see [FlowDissector::detach]. + pub fn attach(&mut self, netns: T) -> Result { + let prog_fd = self.fd()?; + let prog_fd = prog_fd.as_fd(); + let netns_fd = netns.as_fd(); + + let link_fd = bpf_link_create( + prog_fd, + LinkTarget::Fd(netns_fd), + BPF_FLOW_DISSECTOR, + None, + 0, + ) + .map_err(|(_, io_error)| SyscallError { + call: "bpf_link_create", + io_error, + })?; + self.data + .links + .insert(FlowDissectorLink::new(FdLink::new(link_fd))) + } + + /// Detaches the program. + /// + /// See [FlowDissector::attach]. + pub fn detach(&mut self, link_id: FlowDissectorLinkId) -> Result<(), ProgramError> { + self.data.links.remove(link_id) + } + + /// Takes ownership of the link referenced by the provided link_id. + /// + /// The link will be detached on `Drop` and the caller is now responsible + /// for managing its lifetime. + pub fn take_link( + &mut self, + link_id: FlowDissectorLinkId, + ) -> Result { + self.data.take_link(link_id) + } +} + +define_link_wrapper!( + /// The link used by [FlowDissector] programs. + FlowDissectorLink, + /// The type returned by [FlowDissector::attach]. Can be passed to [FlowDissector::detach]. + FlowDissectorLinkId, + FdLink, + FdLinkId +); diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 64da0fdff..6e606eb7a 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -44,6 +44,7 @@ pub mod cgroup_sysctl; pub mod extension; pub mod fentry; pub mod fexit; +pub mod flow_dissector; pub mod kprobe; pub mod links; pub mod lirc_mode2; @@ -83,6 +84,7 @@ pub use cgroup_sysctl::CgroupSysctl; pub use extension::{Extension, ExtensionError}; pub use fentry::FEntry; pub use fexit::FExit; +pub use flow_dissector::FlowDissector; pub use kprobe::{KProbe, KProbeError}; use libc::ENOSPC; pub use links::Link; @@ -276,6 +278,8 @@ pub enum Program { FEntry(FEntry), /// A [`FExit`] program FExit(FExit), + /// A [`FlowDissector`] program + FlowDissector(FlowDissector), /// A [`Extension`] program Extension(Extension), /// A [`SkLookup`] program @@ -310,6 +314,7 @@ impl Program { Self::BtfTracePoint(_) => BPF_PROG_TYPE_TRACING, Self::FEntry(_) => BPF_PROG_TYPE_TRACING, Self::FExit(_) => BPF_PROG_TYPE_TRACING, + Self::FlowDissector(_) => BPF_PROG_TYPE_FLOW_DISSECTOR, Self::Extension(_) => BPF_PROG_TYPE_EXT, Self::CgroupSockAddr(_) => BPF_PROG_TYPE_CGROUP_SOCK_ADDR, Self::SkLookup(_) => BPF_PROG_TYPE_SK_LOOKUP, @@ -340,6 +345,7 @@ impl Program { Self::BtfTracePoint(p) => p.pin(path), Self::FEntry(p) => p.pin(path), Self::FExit(p) => p.pin(path), + Self::FlowDissector(p) => p.pin(path), Self::Extension(p) => p.pin(path), Self::CgroupSockAddr(p) => p.pin(path), Self::SkLookup(p) => p.pin(path), @@ -370,6 +376,7 @@ impl Program { Self::BtfTracePoint(mut p) => p.unload(), Self::FEntry(mut p) => p.unload(), Self::FExit(mut p) => p.unload(), + Self::FlowDissector(mut p) => p.unload(), Self::Extension(mut p) => p.unload(), Self::CgroupSockAddr(mut p) => p.unload(), Self::SkLookup(mut p) => p.unload(), @@ -402,6 +409,7 @@ impl Program { Self::BtfTracePoint(p) => p.fd(), Self::FEntry(p) => p.fd(), Self::FExit(p) => p.fd(), + Self::FlowDissector(p) => p.fd(), Self::Extension(p) => p.fd(), Self::CgroupSockAddr(p) => p.fd(), Self::SkLookup(p) => p.fd(), @@ -435,6 +443,7 @@ impl Program { Self::BtfTracePoint(p) => p.info(), Self::FEntry(p) => p.info(), Self::FExit(p) => p.info(), + Self::FlowDissector(p) => p.info(), Self::Extension(p) => p.info(), Self::CgroupSockAddr(p) => p.info(), Self::SkLookup(p) => p.info(), @@ -748,6 +757,7 @@ impl_program_unload!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -788,6 +798,7 @@ impl_fd!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -842,6 +853,7 @@ impl_program_pin!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -882,6 +894,7 @@ impl_from_pin!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, SkLookup, SockOps, @@ -936,6 +949,7 @@ impl_try_from_program!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -982,6 +996,7 @@ impl_info!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, diff --git a/bpf/aya-bpf/src/programs/flow_dissector.rs b/bpf/aya-bpf/src/programs/flow_dissector.rs new file mode 100644 index 000000000..1b01c537f --- /dev/null +++ b/bpf/aya-bpf/src/programs/flow_dissector.rs @@ -0,0 +1,34 @@ +use aya_bpf_cty::c_void; + +use crate::{bindings::__sk_buff, BpfContext}; + +pub struct FlowDissectorContext { + skb: *mut __sk_buff, +} + +impl FlowDissectorContext { + pub fn new(skb: *mut __sk_buff) -> FlowDissectorContext { + FlowDissectorContext { skb } + } + + #[inline] + pub fn data(&self) -> usize { + unsafe { (*self.skb).data as usize } + } + + #[inline] + pub fn data_end(&self) -> usize { + unsafe { (*self.skb).data_end as usize } + } + + #[inline] + pub fn flow_keys(&self) -> usize { + unsafe { (*self.skb).__bindgen_anon_1.flow_keys as usize } + } +} + +impl BpfContext for FlowDissectorContext { + fn as_ptr(&self) -> *mut c_void { + self.skb as *mut _ + } +} diff --git a/bpf/aya-bpf/src/programs/mod.rs b/bpf/aya-bpf/src/programs/mod.rs index 498b0d1c7..ddfdd9b03 100644 --- a/bpf/aya-bpf/src/programs/mod.rs +++ b/bpf/aya-bpf/src/programs/mod.rs @@ -1,6 +1,7 @@ pub mod device; pub mod fentry; pub mod fexit; +pub mod flow_dissector; pub mod lsm; pub mod perf_event; pub mod probe; @@ -21,6 +22,7 @@ pub mod xdp; pub use device::DeviceContext; pub use fentry::FEntryContext; pub use fexit::FExitContext; +pub use flow_dissector::FlowDissectorContext; pub use lsm::LsmContext; pub use perf_event::PerfEventContext; pub use probe::ProbeContext; diff --git a/test/integration-ebpf/src/test.rs b/test/integration-ebpf/src/test.rs index 8b0f5d798..da719a651 100644 --- a/test/integration-ebpf/src/test.rs +++ b/test/integration-ebpf/src/test.rs @@ -3,8 +3,8 @@ use aya_bpf::{ bindings::xdp_action, - macros::{kprobe, tracepoint, uprobe, xdp}, - programs::{ProbeContext, TracePointContext, XdpContext}, + macros::{flow_dissector, kprobe, tracepoint, uprobe, xdp}, + programs::{FlowDissectorContext, ProbeContext, TracePointContext, XdpContext}, }; #[xdp] @@ -34,6 +34,11 @@ pub fn test_uprobe(_ctx: ProbeContext) -> u32 { 0 } +#[flow_dissector] +pub fn test_flow(_ctx: FlowDissectorContext) -> u32 { + 0 +} + #[cfg(not(test))] #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { diff --git a/test/integration-test/src/tests/load.rs b/test/integration-test/src/tests/load.rs index 5e193dbf8..d47571d94 100644 --- a/test/integration-test/src/tests/load.rs +++ b/test/integration-test/src/tests/load.rs @@ -1,5 +1,6 @@ use std::{ convert::TryInto as _, + fs::File, thread, time::{Duration, SystemTime}, }; @@ -8,7 +9,7 @@ use aya::{ maps::Array, programs::{ links::{FdLink, PinnedLink}, - loaded_links, loaded_programs, KProbe, TracePoint, UProbe, Xdp, XdpFlags, + loaded_links, loaded_programs, FlowDissector, KProbe, TracePoint, UProbe, Xdp, XdpFlags, }, util::KernelVersion, Bpf, @@ -272,6 +273,34 @@ fn basic_uprobe() { assert_unloaded("test_uprobe"); } +#[test] +fn basic_flow_dissector() { + let mut bpf = Bpf::load(crate::TEST).unwrap(); + let prog: &mut FlowDissector = bpf.program_mut("test_flow").unwrap().try_into().unwrap(); + + prog.load().unwrap(); + assert_loaded("test_flow"); + + let net_ns = File::open("/proc/self/ns/net").unwrap(); + let link = prog.attach(net_ns.try_clone().unwrap()).unwrap(); + { + let _link_owned = prog.take_link(link).unwrap(); + prog.unload().unwrap(); + assert_loaded_and_linked("test_flow"); + }; + + assert_unloaded("test_flow"); + prog.load().unwrap(); + + assert_loaded("test_flow"); + prog.attach(net_ns).unwrap(); + + assert_loaded("test_flow"); + prog.unload().unwrap(); + + assert_unloaded("test_flow"); +} + #[test] fn pin_link() { let kernel_version = KernelVersion::current().unwrap(); diff --git a/xtask/public-api/aya-bpf-macros.txt b/xtask/public-api/aya-bpf-macros.txt index 19567b47b..5517809e0 100644 --- a/xtask/public-api/aya-bpf-macros.txt +++ b/xtask/public-api/aya-bpf-macros.txt @@ -9,6 +9,7 @@ pub proc macro aya_bpf_macros::#[cgroup_sysctl] pub proc macro aya_bpf_macros::#[classifier] pub proc macro aya_bpf_macros::#[fentry] pub proc macro aya_bpf_macros::#[fexit] +pub proc macro aya_bpf_macros::#[flow_dissector] pub proc macro aya_bpf_macros::#[kprobe] pub proc macro aya_bpf_macros::#[kretprobe] pub proc macro aya_bpf_macros::#[lsm] diff --git a/xtask/public-api/aya-bpf.txt b/xtask/public-api/aya-bpf.txt index e221d2cca..1c42df4c6 100644 --- a/xtask/public-api/aya-bpf.txt +++ b/xtask/public-api/aya-bpf.txt @@ -1314,6 +1314,36 @@ impl core::borrow::BorrowMut for aya_bpf::programs::fexit::FExitContext wh pub fn aya_bpf::programs::fexit::FExitContext::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya_bpf::programs::fexit::FExitContext pub fn aya_bpf::programs::fexit::FExitContext::from(t: T) -> T +pub mod aya_bpf::programs::flow_dissector +pub struct aya_bpf::programs::flow_dissector::FlowDissectorContext +impl aya_bpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::data(&self) -> usize +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::data_end(&self) -> usize +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::flow_keys(&self) -> usize +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::new(skb: *mut aya_bpf_bindings::x86_64::bindings::__sk_buff) -> aya_bpf::programs::flow_dissector::FlowDissectorContext +impl aya_bpf::BpfContext for aya_bpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::as_ptr(&self) -> *mut aya_bpf_cty::c_void +impl !core::marker::Send for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl !core::marker::Sync for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::marker::Unpin for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::RefUnwindSafe for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::UnwindSafe for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::convert::Into for aya_bpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::From +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::into(self) -> U +impl core::convert::TryFrom for aya_bpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::Into +pub type aya_bpf::programs::flow_dissector::FlowDissectorContext::Error = core::convert::Infallible +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya_bpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::TryFrom +pub type aya_bpf::programs::flow_dissector::FlowDissectorContext::Error = >::Error +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya_bpf::programs::flow_dissector::FlowDissectorContext where T: 'static + core::marker::Sized +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya_bpf::programs::flow_dissector::FlowDissectorContext where T: core::marker::Sized +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya_bpf::programs::flow_dissector::FlowDissectorContext where T: core::marker::Sized +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya_bpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::from(t: T) -> T pub mod aya_bpf::programs::lsm pub struct aya_bpf::programs::lsm::LsmContext impl aya_bpf::programs::lsm::LsmContext @@ -1969,6 +1999,35 @@ impl core::borrow::BorrowMut for aya_bpf::programs::fexit::FExitContext wh pub fn aya_bpf::programs::fexit::FExitContext::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya_bpf::programs::fexit::FExitContext pub fn aya_bpf::programs::fexit::FExitContext::from(t: T) -> T +pub struct aya_bpf::programs::FlowDissectorContext +impl aya_bpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::data(&self) -> usize +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::data_end(&self) -> usize +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::flow_keys(&self) -> usize +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::new(skb: *mut aya_bpf_bindings::x86_64::bindings::__sk_buff) -> aya_bpf::programs::flow_dissector::FlowDissectorContext +impl aya_bpf::BpfContext for aya_bpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::as_ptr(&self) -> *mut aya_bpf_cty::c_void +impl !core::marker::Send for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl !core::marker::Sync for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::marker::Unpin for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::RefUnwindSafe for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::UnwindSafe for aya_bpf::programs::flow_dissector::FlowDissectorContext +impl core::convert::Into for aya_bpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::From +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::into(self) -> U +impl core::convert::TryFrom for aya_bpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::Into +pub type aya_bpf::programs::flow_dissector::FlowDissectorContext::Error = core::convert::Infallible +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya_bpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::TryFrom +pub type aya_bpf::programs::flow_dissector::FlowDissectorContext::Error = >::Error +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya_bpf::programs::flow_dissector::FlowDissectorContext where T: 'static + core::marker::Sized +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya_bpf::programs::flow_dissector::FlowDissectorContext where T: core::marker::Sized +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya_bpf::programs::flow_dissector::FlowDissectorContext where T: core::marker::Sized +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya_bpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::from(t: T) -> T pub struct aya_bpf::programs::LsmContext impl aya_bpf::programs::lsm::LsmContext pub unsafe fn aya_bpf::programs::lsm::LsmContext::arg(&self, n: usize) -> T @@ -2467,6 +2526,8 @@ impl aya_bpf::BpfContext for aya_bpf::programs::fentry::FEntryContext pub fn aya_bpf::programs::fentry::FEntryContext::as_ptr(&self) -> *mut core::ffi::c_void impl aya_bpf::BpfContext for aya_bpf::programs::fexit::FExitContext pub fn aya_bpf::programs::fexit::FExitContext::as_ptr(&self) -> *mut core::ffi::c_void +impl aya_bpf::BpfContext for aya_bpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_bpf::programs::flow_dissector::FlowDissectorContext::as_ptr(&self) -> *mut aya_bpf_cty::c_void impl aya_bpf::BpfContext for aya_bpf::programs::lsm::LsmContext pub fn aya_bpf::programs::lsm::LsmContext::as_ptr(&self) -> *mut core::ffi::c_void impl aya_bpf::BpfContext for aya_bpf::programs::perf_event::PerfEventContext diff --git a/xtask/public-api/aya-obj.txt b/xtask/public-api/aya-obj.txt index 5c3613720..ff7a6ee27 100644 --- a/xtask/public-api/aya-obj.txt +++ b/xtask/public-api/aya-obj.txt @@ -5831,6 +5831,7 @@ pub aya_obj::obj::ProgramSection::FEntry pub aya_obj::obj::ProgramSection::FEntry::sleepable: bool pub aya_obj::obj::ProgramSection::FExit pub aya_obj::obj::ProgramSection::FExit::sleepable: bool +pub aya_obj::obj::ProgramSection::FlowDissector pub aya_obj::obj::ProgramSection::KProbe pub aya_obj::obj::ProgramSection::KRetProbe pub aya_obj::obj::ProgramSection::LircMode2 @@ -6620,6 +6621,7 @@ pub aya_obj::ProgramSection::FEntry pub aya_obj::ProgramSection::FEntry::sleepable: bool pub aya_obj::ProgramSection::FExit pub aya_obj::ProgramSection::FExit::sleepable: bool +pub aya_obj::ProgramSection::FlowDissector pub aya_obj::ProgramSection::KProbe pub aya_obj::ProgramSection::KRetProbe pub aya_obj::ProgramSection::LircMode2 diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index 862214985..e2ee850ee 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -3217,6 +3217,120 @@ impl core::borrow::BorrowMut for aya::programs::fexit::FExitLinkId where T pub fn aya::programs::fexit::FExitLinkId::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya::programs::fexit::FExitLinkId pub fn aya::programs::fexit::FExitLinkId::from(t: T) -> T +pub mod aya::programs::flow_dissector +pub struct aya::programs::flow_dissector::FlowDissector +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::attach(&mut self, netns: T) -> core::result::Result +pub fn aya::programs::flow_dissector::FlowDissector::detach(&mut self, link_id: aya::programs::flow_dissector::FlowDissectorLinkId) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::flow_dissector::FlowDissector::load(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::flow_dissector::FlowDissector::take_link(&mut self, link_id: aya::programs::flow_dissector::FlowDissectorLinkId) -> core::result::Result +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::from_pin>(path: P) -> core::result::Result +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::info(&self) -> core::result::Result +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> +pub fn aya::programs::flow_dissector::FlowDissector::unpin(self) -> core::result::Result<(), std::io::error::Error> +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::unload(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +impl core::ops::drop::Drop for aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::drop(&mut self) +impl<'a> core::convert::TryFrom<&'a aya::programs::Program> for &'a aya::programs::flow_dissector::FlowDissector +pub type &'a aya::programs::flow_dissector::FlowDissector::Error = aya::programs::ProgramError +pub fn &'a aya::programs::flow_dissector::FlowDissector::try_from(program: &'a aya::programs::Program) -> core::result::Result<&'a aya::programs::flow_dissector::FlowDissector, aya::programs::ProgramError> +impl<'a> core::convert::TryFrom<&'a mut aya::programs::Program> for &'a mut aya::programs::flow_dissector::FlowDissector +pub type &'a mut aya::programs::flow_dissector::FlowDissector::Error = aya::programs::ProgramError +pub fn &'a mut aya::programs::flow_dissector::FlowDissector::try_from(program: &'a mut aya::programs::Program) -> core::result::Result<&'a mut aya::programs::flow_dissector::FlowDissector, aya::programs::ProgramError> +impl core::fmt::Debug for aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::Send for aya::programs::flow_dissector::FlowDissector +impl core::marker::Sync for aya::programs::flow_dissector::FlowDissector +impl core::marker::Unpin for aya::programs::flow_dissector::FlowDissector +impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::flow_dissector::FlowDissector +impl core::panic::unwind_safe::UnwindSafe for aya::programs::flow_dissector::FlowDissector +impl core::convert::Into for aya::programs::flow_dissector::FlowDissector where U: core::convert::From +pub fn aya::programs::flow_dissector::FlowDissector::into(self) -> U +impl core::convert::TryFrom for aya::programs::flow_dissector::FlowDissector where U: core::convert::Into +pub type aya::programs::flow_dissector::FlowDissector::Error = core::convert::Infallible +pub fn aya::programs::flow_dissector::FlowDissector::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya::programs::flow_dissector::FlowDissector where U: core::convert::TryFrom +pub type aya::programs::flow_dissector::FlowDissector::Error = >::Error +pub fn aya::programs::flow_dissector::FlowDissector::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya::programs::flow_dissector::FlowDissector where T: 'static + core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissector::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya::programs::flow_dissector::FlowDissector where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissector::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya::programs::flow_dissector::FlowDissector where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissector::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::from(t: T) -> T +pub struct aya::programs::flow_dissector::FlowDissectorLink(_) +impl aya::programs::links::Link for aya::programs::flow_dissector::FlowDissectorLink +pub type aya::programs::flow_dissector::FlowDissectorLink::Id = aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::flow_dissector::FlowDissectorLink::id(&self) -> Self::Id +impl core::convert::From for aya::programs::links::FdLink +pub fn aya::programs::links::FdLink::from(w: aya::programs::flow_dissector::FlowDissectorLink) -> aya::programs::links::FdLink +impl core::convert::From for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::from(b: aya::programs::links::FdLink) -> aya::programs::flow_dissector::FlowDissectorLink +impl core::ops::drop::Drop for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::drop(&mut self) +impl core::fmt::Debug for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::Send for aya::programs::flow_dissector::FlowDissectorLink +impl core::marker::Sync for aya::programs::flow_dissector::FlowDissectorLink +impl core::marker::Unpin for aya::programs::flow_dissector::FlowDissectorLink +impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::flow_dissector::FlowDissectorLink +impl core::panic::unwind_safe::UnwindSafe for aya::programs::flow_dissector::FlowDissectorLink +impl core::convert::Into for aya::programs::flow_dissector::FlowDissectorLink where U: core::convert::From +pub fn aya::programs::flow_dissector::FlowDissectorLink::into(self) -> U +impl core::convert::TryFrom for aya::programs::flow_dissector::FlowDissectorLink where U: core::convert::Into +pub type aya::programs::flow_dissector::FlowDissectorLink::Error = core::convert::Infallible +pub fn aya::programs::flow_dissector::FlowDissectorLink::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya::programs::flow_dissector::FlowDissectorLink where U: core::convert::TryFrom +pub type aya::programs::flow_dissector::FlowDissectorLink::Error = >::Error +pub fn aya::programs::flow_dissector::FlowDissectorLink::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya::programs::flow_dissector::FlowDissectorLink where T: 'static + core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLink::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya::programs::flow_dissector::FlowDissectorLink where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLink::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya::programs::flow_dissector::FlowDissectorLink where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLink::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::from(t: T) -> T +pub struct aya::programs::flow_dissector::FlowDissectorLinkId(_) +impl core::cmp::Eq for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::cmp::PartialEq for aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::eq(&self, other: &aya::programs::flow_dissector::FlowDissectorLinkId) -> bool +impl core::fmt::Debug for aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::hash::Hash for aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::hash<__H: core::hash::Hasher>(&self, state: &mut __H) +impl core::marker::StructuralEq for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::marker::StructuralPartialEq for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::marker::Send for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::marker::Sync for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::marker::Unpin for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::panic::unwind_safe::UnwindSafe for aya::programs::flow_dissector::FlowDissectorLinkId +impl core::convert::Into for aya::programs::flow_dissector::FlowDissectorLinkId where U: core::convert::From +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::into(self) -> U +impl core::convert::TryFrom for aya::programs::flow_dissector::FlowDissectorLinkId where U: core::convert::Into +pub type aya::programs::flow_dissector::FlowDissectorLinkId::Error = core::convert::Infallible +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya::programs::flow_dissector::FlowDissectorLinkId where U: core::convert::TryFrom +pub type aya::programs::flow_dissector::FlowDissectorLinkId::Error = >::Error +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya::programs::flow_dissector::FlowDissectorLinkId where T: 'static + core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya::programs::flow_dissector::FlowDissectorLinkId where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya::programs::flow_dissector::FlowDissectorLinkId where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::from(t: T) -> T pub mod aya::programs::kprobe pub enum aya::programs::kprobe::KProbeError pub aya::programs::kprobe::KProbeError::FileError @@ -3414,12 +3528,16 @@ impl core::convert::From for aya::programs::l pub fn aya::programs::links::FdLink::from(w: aya::programs::fentry::FEntryLink) -> aya::programs::links::FdLink impl core::convert::From for aya::programs::links::FdLink pub fn aya::programs::links::FdLink::from(w: aya::programs::fexit::FExitLink) -> aya::programs::links::FdLink +impl core::convert::From for aya::programs::links::FdLink +pub fn aya::programs::links::FdLink::from(w: aya::programs::flow_dissector::FlowDissectorLink) -> aya::programs::links::FdLink impl core::convert::From for aya::programs::extension::ExtensionLink pub fn aya::programs::extension::ExtensionLink::from(b: aya::programs::links::FdLink) -> aya::programs::extension::ExtensionLink impl core::convert::From for aya::programs::fentry::FEntryLink pub fn aya::programs::fentry::FEntryLink::from(b: aya::programs::links::FdLink) -> aya::programs::fentry::FEntryLink impl core::convert::From for aya::programs::fexit::FExitLink pub fn aya::programs::fexit::FExitLink::from(b: aya::programs::links::FdLink) -> aya::programs::fexit::FExitLink +impl core::convert::From for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::from(b: aya::programs::links::FdLink) -> aya::programs::flow_dissector::FlowDissectorLink impl core::convert::From for aya::programs::lsm::LsmLink pub fn aya::programs::lsm::LsmLink::from(b: aya::programs::links::FdLink) -> aya::programs::lsm::LsmLink impl core::convert::From for aya::programs::tp_btf::BtfTracePointLink @@ -3642,6 +3760,10 @@ impl aya::programs::links::Link for aya::programs::fexit::FExitLink pub type aya::programs::fexit::FExitLink::Id = aya::programs::fexit::FExitLinkId pub fn aya::programs::fexit::FExitLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError> pub fn aya::programs::fexit::FExitLink::id(&self) -> Self::Id +impl aya::programs::links::Link for aya::programs::flow_dissector::FlowDissectorLink +pub type aya::programs::flow_dissector::FlowDissectorLink::Id = aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::flow_dissector::FlowDissectorLink::id(&self) -> Self::Id impl aya::programs::links::Link for aya::programs::kprobe::KProbeLink pub type aya::programs::kprobe::KProbeLink::Id = aya::programs::kprobe::KProbeLinkId pub fn aya::programs::kprobe::KProbeLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError> @@ -5328,6 +5450,7 @@ pub aya::programs::Program::CgroupSysctl(aya::programs::cgroup_sysctl::CgroupSys pub aya::programs::Program::Extension(aya::programs::extension::Extension) pub aya::programs::Program::FEntry(aya::programs::fentry::FEntry) pub aya::programs::Program::FExit(aya::programs::fexit::FExit) +pub aya::programs::Program::FlowDissector(aya::programs::flow_dissector::FlowDissector) pub aya::programs::Program::KProbe(aya::programs::kprobe::KProbe) pub aya::programs::Program::LircMode2(aya::programs::lirc_mode2::LircMode2) pub aya::programs::Program::Lsm(aya::programs::lsm::Lsm) @@ -5393,6 +5516,9 @@ pub fn &'a aya::programs::fentry::FEntry::try_from(program: &'a aya::programs::P impl<'a> core::convert::TryFrom<&'a aya::programs::Program> for &'a aya::programs::fexit::FExit pub type &'a aya::programs::fexit::FExit::Error = aya::programs::ProgramError pub fn &'a aya::programs::fexit::FExit::try_from(program: &'a aya::programs::Program) -> core::result::Result<&'a aya::programs::fexit::FExit, aya::programs::ProgramError> +impl<'a> core::convert::TryFrom<&'a aya::programs::Program> for &'a aya::programs::flow_dissector::FlowDissector +pub type &'a aya::programs::flow_dissector::FlowDissector::Error = aya::programs::ProgramError +pub fn &'a aya::programs::flow_dissector::FlowDissector::try_from(program: &'a aya::programs::Program) -> core::result::Result<&'a aya::programs::flow_dissector::FlowDissector, aya::programs::ProgramError> impl<'a> core::convert::TryFrom<&'a aya::programs::Program> for &'a aya::programs::kprobe::KProbe pub type &'a aya::programs::kprobe::KProbe::Error = aya::programs::ProgramError pub fn &'a aya::programs::kprobe::KProbe::try_from(program: &'a aya::programs::Program) -> core::result::Result<&'a aya::programs::kprobe::KProbe, aya::programs::ProgramError> @@ -5465,6 +5591,9 @@ pub fn &'a mut aya::programs::fentry::FEntry::try_from(program: &'a mut aya::pro impl<'a> core::convert::TryFrom<&'a mut aya::programs::Program> for &'a mut aya::programs::fexit::FExit pub type &'a mut aya::programs::fexit::FExit::Error = aya::programs::ProgramError pub fn &'a mut aya::programs::fexit::FExit::try_from(program: &'a mut aya::programs::Program) -> core::result::Result<&'a mut aya::programs::fexit::FExit, aya::programs::ProgramError> +impl<'a> core::convert::TryFrom<&'a mut aya::programs::Program> for &'a mut aya::programs::flow_dissector::FlowDissector +pub type &'a mut aya::programs::flow_dissector::FlowDissector::Error = aya::programs::ProgramError +pub fn &'a mut aya::programs::flow_dissector::FlowDissector::try_from(program: &'a mut aya::programs::Program) -> core::result::Result<&'a mut aya::programs::flow_dissector::FlowDissector, aya::programs::ProgramError> impl<'a> core::convert::TryFrom<&'a mut aya::programs::Program> for &'a mut aya::programs::kprobe::KProbe pub type &'a mut aya::programs::kprobe::KProbe::Error = aya::programs::ProgramError pub fn &'a mut aya::programs::kprobe::KProbe::try_from(program: &'a mut aya::programs::Program) -> core::result::Result<&'a mut aya::programs::kprobe::KProbe, aya::programs::ProgramError> @@ -6354,6 +6483,54 @@ impl core::borrow::BorrowMut for aya::programs::fexit::FExit where T: core pub fn aya::programs::fexit::FExit::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya::programs::fexit::FExit pub fn aya::programs::fexit::FExit::from(t: T) -> T +pub struct aya::programs::FlowDissector +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::attach(&mut self, netns: T) -> core::result::Result +pub fn aya::programs::flow_dissector::FlowDissector::detach(&mut self, link_id: aya::programs::flow_dissector::FlowDissectorLinkId) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::flow_dissector::FlowDissector::load(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::flow_dissector::FlowDissector::take_link(&mut self, link_id: aya::programs::flow_dissector::FlowDissectorLinkId) -> core::result::Result +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::fd(&self) -> core::result::Result<&aya::programs::ProgramFd, aya::programs::ProgramError> +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::from_pin>(path: P) -> core::result::Result +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::info(&self) -> core::result::Result +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::pin>(&mut self, path: P) -> core::result::Result<(), aya::pin::PinError> +pub fn aya::programs::flow_dissector::FlowDissector::unpin(self) -> core::result::Result<(), std::io::error::Error> +impl aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::unload(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +impl core::ops::drop::Drop for aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::drop(&mut self) +impl<'a> core::convert::TryFrom<&'a aya::programs::Program> for &'a aya::programs::flow_dissector::FlowDissector +pub type &'a aya::programs::flow_dissector::FlowDissector::Error = aya::programs::ProgramError +pub fn &'a aya::programs::flow_dissector::FlowDissector::try_from(program: &'a aya::programs::Program) -> core::result::Result<&'a aya::programs::flow_dissector::FlowDissector, aya::programs::ProgramError> +impl<'a> core::convert::TryFrom<&'a mut aya::programs::Program> for &'a mut aya::programs::flow_dissector::FlowDissector +pub type &'a mut aya::programs::flow_dissector::FlowDissector::Error = aya::programs::ProgramError +pub fn &'a mut aya::programs::flow_dissector::FlowDissector::try_from(program: &'a mut aya::programs::Program) -> core::result::Result<&'a mut aya::programs::flow_dissector::FlowDissector, aya::programs::ProgramError> +impl core::fmt::Debug for aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result +impl core::marker::Send for aya::programs::flow_dissector::FlowDissector +impl core::marker::Sync for aya::programs::flow_dissector::FlowDissector +impl core::marker::Unpin for aya::programs::flow_dissector::FlowDissector +impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::flow_dissector::FlowDissector +impl core::panic::unwind_safe::UnwindSafe for aya::programs::flow_dissector::FlowDissector +impl core::convert::Into for aya::programs::flow_dissector::FlowDissector where U: core::convert::From +pub fn aya::programs::flow_dissector::FlowDissector::into(self) -> U +impl core::convert::TryFrom for aya::programs::flow_dissector::FlowDissector where U: core::convert::Into +pub type aya::programs::flow_dissector::FlowDissector::Error = core::convert::Infallible +pub fn aya::programs::flow_dissector::FlowDissector::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya::programs::flow_dissector::FlowDissector where U: core::convert::TryFrom +pub type aya::programs::flow_dissector::FlowDissector::Error = >::Error +pub fn aya::programs::flow_dissector::FlowDissector::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya::programs::flow_dissector::FlowDissector where T: 'static + core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissector::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya::programs::flow_dissector::FlowDissector where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissector::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya::programs::flow_dissector::FlowDissector where T: core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissector::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya::programs::flow_dissector::FlowDissector +pub fn aya::programs::flow_dissector::FlowDissector::from(t: T) -> T pub struct aya::programs::KProbe impl aya::programs::kprobe::KProbe pub fn aya::programs::kprobe::KProbe::attach>(&mut self, fn_name: T, offset: u64) -> core::result::Result @@ -7245,6 +7422,10 @@ impl aya::programs::links::Link for aya::programs::fexit::FExitLink pub type aya::programs::fexit::FExitLink::Id = aya::programs::fexit::FExitLinkId pub fn aya::programs::fexit::FExitLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError> pub fn aya::programs::fexit::FExitLink::id(&self) -> Self::Id +impl aya::programs::links::Link for aya::programs::flow_dissector::FlowDissectorLink +pub type aya::programs::flow_dissector::FlowDissectorLink::Id = aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError> +pub fn aya::programs::flow_dissector::FlowDissectorLink::id(&self) -> Self::Id impl aya::programs::links::Link for aya::programs::kprobe::KProbeLink pub type aya::programs::kprobe::KProbeLink::Id = aya::programs::kprobe::KProbeLinkId pub fn aya::programs::kprobe::KProbeLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError>