From 7edbf205630d298d5b8585e0009bf5cb68a66624 Mon Sep 17 00:00:00 2001 From: Zenna Allwein Date: Sat, 30 Sep 2023 17:10:57 -0500 Subject: [PATCH] Add support for Flow Dissector programs Closes #216. --- aya-ebpf-macros/src/flow_dissector.rs | 71 +++++++ aya-ebpf-macros/src/lib.rs | 14 ++ aya-obj/src/obj.rs | 2 + aya/src/bpf.rs | 11 +- aya/src/programs/flow_dissector.rs | 94 +++++++++ aya/src/programs/mod.rs | 15 ++ ebpf/aya-ebpf/src/programs/flow_dissector.rs | 34 ++++ ebpf/aya-ebpf/src/programs/mod.rs | 2 + test/integration-ebpf/src/test.rs | 11 +- test/integration-test/src/tests/load.rs | 30 ++- xtask/public-api/aya-ebpf-macros.txt | 1 + xtask/public-api/aya-ebpf.txt | 63 ++++++ xtask/public-api/aya-obj.txt | 2 + xtask/public-api/aya.txt | 199 +++++++++++++++++++ 14 files changed, 543 insertions(+), 6 deletions(-) create mode 100644 aya-ebpf-macros/src/flow_dissector.rs create mode 100644 aya/src/programs/flow_dissector.rs create mode 100644 ebpf/aya-ebpf/src/programs/flow_dissector.rs diff --git a/aya-ebpf-macros/src/flow_dissector.rs b/aya-ebpf-macros/src/flow_dissector.rs new file mode 100644 index 00000000..e8ab0a2c --- /dev/null +++ b/aya-ebpf-macros/src/flow_dissector.rs @@ -0,0 +1,71 @@ +use proc_macro2::TokenStream; +use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _}; +use quote::quote; +use syn::{ItemFn, spanned::Spanned as _}; + +pub(crate) struct FlowDissector { + item: ItemFn, +} + +impl FlowDissector { + pub(crate) fn parse(attrs: TokenStream, item: TokenStream) -> Result { + if !attrs.is_empty() { + return Err(attrs.span().error("unexpected attribute")); + } + let item = syn::parse2(item)?; + Ok(FlowDissector { item }) + } + + pub(crate) fn expand(&self) -> TokenStream { + let Self { item } = self; + let ItemFn { + attrs: _, + vis, + sig, + block: _, + } = item; + let fn_name = &sig.ident; + quote! { + #[unsafe(no_mangle)] + #[unsafe(link_section = "flow_dissector")] + #vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> u32 { + return #fn_name(::aya_ebpf::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_ebpf::programs::FlowDissectorContext) -> u32 { + 0 + } + }, + ) + .unwrap(); + let expanded = prog.expand(); + let expected = quote! { + #[unsafe(no_mangle)] + #[unsafe(link_section = "flow_dissector")] + fn prog(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> u32 { + return prog(::aya_ebpf::programs::FlowDissectorContext::new(ctx)); + + fn prog(ctx: &mut ::aya_ebpf::programs::FlowDissectorContext) -> u32 { + 0 + } + } + }; + assert_eq!(expected.to_string(), expanded.to_string()); + } +} diff --git a/aya-ebpf-macros/src/lib.rs b/aya-ebpf-macros/src/lib.rs index 13604218..4fbd1a6d 100644 --- a/aya-ebpf-macros/src/lib.rs +++ b/aya-ebpf-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; @@ -542,6 +544,18 @@ pub fn fexit(attrs: TokenStream, item: TokenStream) -> TokenStream { .into() } +/// Marks a function as an eBPF Flow Dissector program that can be attached to +/// a network namespace. +/// +#[proc_macro_attribute] +pub fn flow_dissector(attrs: TokenStream, item: TokenStream) -> TokenStream { + match FlowDissector::parse(attrs.into(), item.into()) { + Ok(prog) => prog.expand(), + Err(err) => err.emit_as_expr_tokens(), + } + .into() +} + /// 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 b1ca01c0..45246743 100644 --- a/aya-obj/src/obj.rs +++ b/aya-obj/src/obj.rs @@ -281,6 +281,7 @@ pub enum ProgramSection { FExit { sleepable: bool, }, + FlowDissector, Extension, SkLookup, CgroupSock { @@ -439,6 +440,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, "iter" => Iter { sleepable: false }, diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index 4bd590bb..73022dea 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -23,9 +23,10 @@ use crate::{ maps::{Map, MapData, MapError}, programs::{ BtfTracePoint, CgroupDevice, CgroupSkb, CgroupSkbAttachType, CgroupSock, CgroupSockAddr, - CgroupSockopt, CgroupSysctl, Extension, FEntry, FExit, Iter, 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, Iter, 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, @@ -430,6 +431,7 @@ impl<'a> EbpfLoader<'a> { | ProgramSection::PerfEvent | ProgramSection::RawTracePoint | ProgramSection::SkLookup + | ProgramSection::FlowDissector | ProgramSection::CgroupSock { attach_type: _ } | ProgramSection::CgroupDevice => {} } @@ -661,6 +663,9 @@ impl<'a> EbpfLoader<'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 00000000..ccba65fb --- /dev/null +++ b/aya/src/programs/flow_dissector.rs @@ -0,0 +1,94 @@ +//! Flow dissector programs. + +use std::os::fd::AsFd; + +use aya_obj::generated::{ + bpf_attach_type::BPF_FLOW_DISSECTOR, bpf_prog_type::BPF_PROG_TYPE_FLOW_DISSECTOR, +}; + +use crate::{ + programs::{FdLink, FdLinkId, ProgramData, ProgramError, define_link_wrapper, load_program}, + sys::{LinkTarget, SyscallError, bpf_link_create}, +}; + +/// 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.20. +/// +/// # 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)] +/// # Ebpf(#[from] aya::EbpfError) +/// # } +/// # let mut bpf = aya::Ebpf::load(&[])?; +/// use aya::programs::FlowDissector; +/// +/// let program: &mut FlowDissector = bpf.program_mut("filename_lookup").unwrap().try_into()?; +/// program.load()?; +/// +/// let net_ns = std::fs::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, + 0, + None, + ) + .map_err(|io_error| SyscallError { + call: "bpf_link_create", + io_error, + })?; + self.data + .links + .insert(FlowDissectorLink::new(FdLink::new(link_fd))) + } +} + +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, + FlowDissector, +); diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 013d91bc..f7c95ec9 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -51,6 +51,7 @@ pub mod cgroup_sysctl; pub mod extension; pub mod fentry; pub mod fexit; +pub mod flow_dissector; pub mod iter; pub mod kprobe; pub mod links; @@ -101,6 +102,7 @@ pub use crate::programs::{ extension::{Extension, ExtensionError}, fentry::FEntry, fexit::FExit, + flow_dissector::FlowDissector, iter::Iter, kprobe::{KProbe, KProbeError}, links::{CgroupAttachMode, Link, LinkOrder}, @@ -311,6 +313,8 @@ pub enum Program { FEntry(FEntry), /// A [`FExit`] program FExit(FExit), + /// A [`FlowDissector`] program + FlowDissector(FlowDissector), /// A [`Extension`] program Extension(Extension), /// A [`SkLookup`] program @@ -359,6 +363,7 @@ impl Program { Self::SkLookup(_) => ProgramType::SkLookup, Self::CgroupSock(_) => ProgramType::CgroupSock, Self::CgroupDevice(_) => ProgramType::CgroupDevice, + Self::FlowDissector(_) => ProgramType::FlowDissector, } } @@ -384,6 +389,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), @@ -415,6 +421,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(), @@ -448,6 +455,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(), @@ -482,6 +490,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(), @@ -796,6 +805,7 @@ impl_program_unload!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -837,6 +847,7 @@ impl_fd!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -943,6 +954,7 @@ impl_program_pin!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -984,6 +996,7 @@ impl_from_pin!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, SkLookup, SockOps, @@ -1039,6 +1052,7 @@ impl_try_from_program!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, @@ -1066,6 +1080,7 @@ impl_info!( BtfTracePoint, FEntry, FExit, + FlowDissector, Extension, CgroupSockAddr, SkLookup, diff --git a/ebpf/aya-ebpf/src/programs/flow_dissector.rs b/ebpf/aya-ebpf/src/programs/flow_dissector.rs new file mode 100644 index 00000000..6967b2fe --- /dev/null +++ b/ebpf/aya-ebpf/src/programs/flow_dissector.rs @@ -0,0 +1,34 @@ +use aya_ebpf_cty::c_void; + +use crate::{EbpfContext, bindings::__sk_buff}; + +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 EbpfContext for FlowDissectorContext { + fn as_ptr(&self) -> *mut c_void { + self.skb as *mut _ + } +} diff --git a/ebpf/aya-ebpf/src/programs/mod.rs b/ebpf/aya-ebpf/src/programs/mod.rs index 557e688f..f95b38de 100644 --- a/ebpf/aya-ebpf/src/programs/mod.rs +++ b/ebpf/aya-ebpf/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; @@ -22,6 +23,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 88f01e89..7eb800dd 100644 --- a/test/integration-ebpf/src/test.rs +++ b/test/integration-ebpf/src/test.rs @@ -3,8 +3,10 @@ use aya_ebpf::{ bindings::xdp_action, - macros::{kprobe, kretprobe, tracepoint, uprobe, uretprobe, xdp}, - programs::{ProbeContext, RetProbeContext, TracePointContext, XdpContext}, + macros::{flow_dissector, kprobe, kretprobe, tracepoint, uprobe, uretprobe, xdp}, + programs::{ + FlowDissectorContext, ProbeContext, RetProbeContext, TracePointContext, XdpContext, + }, }; #[xdp] @@ -44,6 +46,11 @@ pub fn test_uretprobe(_ctx: RetProbeContext) -> 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 8ec71419..a93e6f16 100644 --- a/test/integration-test/src/tests/load.rs +++ b/test/integration-test/src/tests/load.rs @@ -4,7 +4,7 @@ use aya::{ Ebpf, maps::Array, programs::{ - KProbe, TracePoint, UProbe, Xdp, XdpFlags, + FlowDissector, KProbe, TracePoint, UProbe, Xdp, XdpFlags, links::{FdLink, PinnedLink}, loaded_links, loaded_programs, }, @@ -311,6 +311,34 @@ fn basic_uprobe() { assert_unloaded("test_uprobe"); } +#[test] +fn basic_flow_dissector() { + let mut bpf = Ebpf::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 = std::fs::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-ebpf-macros.txt b/xtask/public-api/aya-ebpf-macros.txt index 4ebcc590..484df241 100644 --- a/xtask/public-api/aya-ebpf-macros.txt +++ b/xtask/public-api/aya-ebpf-macros.txt @@ -9,6 +9,7 @@ pub proc macro aya_ebpf_macros::#[cgroup_sysctl] pub proc macro aya_ebpf_macros::#[classifier] pub proc macro aya_ebpf_macros::#[fentry] pub proc macro aya_ebpf_macros::#[fexit] +pub proc macro aya_ebpf_macros::#[flow_dissector] pub proc macro aya_ebpf_macros::#[kprobe] pub proc macro aya_ebpf_macros::#[kretprobe] pub proc macro aya_ebpf_macros::#[lsm] diff --git a/xtask/public-api/aya-ebpf.txt b/xtask/public-api/aya-ebpf.txt index 6f90c014..a9937352 100644 --- a/xtask/public-api/aya-ebpf.txt +++ b/xtask/public-api/aya-ebpf.txt @@ -1452,6 +1452,37 @@ impl core::borrow::BorrowMut for aya_ebpf::programs::fexit::FExitContext w pub fn aya_ebpf::programs::fexit::FExitContext::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya_ebpf::programs::fexit::FExitContext pub fn aya_ebpf::programs::fexit::FExitContext::from(t: T) -> T +pub mod aya_ebpf::programs::flow_dissector +pub struct aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl aya_ebpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::data(&self) -> usize +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::data_end(&self) -> usize +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::flow_keys(&self) -> usize +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::new(skb: *mut aya_ebpf_bindings::x86_64::bindings::__sk_buff) -> aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl aya_ebpf::EbpfContext for aya_ebpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::as_ptr(&self) -> *mut aya_ebpf_cty::c_void +impl core::marker::Freeze for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl !core::marker::Send for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl !core::marker::Sync for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::marker::Unpin for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::RefUnwindSafe for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::UnwindSafe for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::convert::Into for aya_ebpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::From +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::into(self) -> U +impl core::convert::TryFrom for aya_ebpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::Into +pub type aya_ebpf::programs::flow_dissector::FlowDissectorContext::Error = core::convert::Infallible +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya_ebpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::TryFrom +pub type aya_ebpf::programs::flow_dissector::FlowDissectorContext::Error = >::Error +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya_ebpf::programs::flow_dissector::FlowDissectorContext where T: 'static + ?core::marker::Sized +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya_ebpf::programs::flow_dissector::FlowDissectorContext where T: ?core::marker::Sized +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya_ebpf::programs::flow_dissector::FlowDissectorContext where T: ?core::marker::Sized +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya_ebpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::from(t: T) -> T pub mod aya_ebpf::programs::lsm pub struct aya_ebpf::programs::lsm::LsmContext impl aya_ebpf::programs::lsm::LsmContext @@ -2161,6 +2192,36 @@ impl core::borrow::BorrowMut for aya_ebpf::programs::fexit::FExitContext w pub fn aya_ebpf::programs::fexit::FExitContext::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya_ebpf::programs::fexit::FExitContext pub fn aya_ebpf::programs::fexit::FExitContext::from(t: T) -> T +pub struct aya_ebpf::programs::FlowDissectorContext +impl aya_ebpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::data(&self) -> usize +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::data_end(&self) -> usize +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::flow_keys(&self) -> usize +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::new(skb: *mut aya_ebpf_bindings::x86_64::bindings::__sk_buff) -> aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl aya_ebpf::EbpfContext for aya_ebpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::as_ptr(&self) -> *mut aya_ebpf_cty::c_void +impl core::marker::Freeze for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl !core::marker::Send for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl !core::marker::Sync for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::marker::Unpin for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::RefUnwindSafe for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::panic::unwind_safe::UnwindSafe for aya_ebpf::programs::flow_dissector::FlowDissectorContext +impl core::convert::Into for aya_ebpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::From +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::into(self) -> U +impl core::convert::TryFrom for aya_ebpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::Into +pub type aya_ebpf::programs::flow_dissector::FlowDissectorContext::Error = core::convert::Infallible +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::try_from(value: U) -> core::result::Result>::Error> +impl core::convert::TryInto for aya_ebpf::programs::flow_dissector::FlowDissectorContext where U: core::convert::TryFrom +pub type aya_ebpf::programs::flow_dissector::FlowDissectorContext::Error = >::Error +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::try_into(self) -> core::result::Result>::Error> +impl core::any::Any for aya_ebpf::programs::flow_dissector::FlowDissectorContext where T: 'static + ?core::marker::Sized +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::type_id(&self) -> core::any::TypeId +impl core::borrow::Borrow for aya_ebpf::programs::flow_dissector::FlowDissectorContext where T: ?core::marker::Sized +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::borrow(&self) -> &T +impl core::borrow::BorrowMut for aya_ebpf::programs::flow_dissector::FlowDissectorContext where T: ?core::marker::Sized +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::borrow_mut(&mut self) -> &mut T +impl core::convert::From for aya_ebpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::from(t: T) -> T pub struct aya_ebpf::programs::LsmContext impl aya_ebpf::programs::lsm::LsmContext pub unsafe fn aya_ebpf::programs::lsm::LsmContext::arg(&self, n: usize) -> T @@ -2733,6 +2794,8 @@ impl aya_ebpf::EbpfContext for aya_ebpf::programs::fentry::FEntryContext pub fn aya_ebpf::programs::fentry::FEntryContext::as_ptr(&self) -> *mut core::ffi::c_void impl aya_ebpf::EbpfContext for aya_ebpf::programs::fexit::FExitContext pub fn aya_ebpf::programs::fexit::FExitContext::as_ptr(&self) -> *mut core::ffi::c_void +impl aya_ebpf::EbpfContext for aya_ebpf::programs::flow_dissector::FlowDissectorContext +pub fn aya_ebpf::programs::flow_dissector::FlowDissectorContext::as_ptr(&self) -> *mut aya_ebpf_cty::c_void impl aya_ebpf::EbpfContext for aya_ebpf::programs::lsm::LsmContext pub fn aya_ebpf::programs::lsm::LsmContext::as_ptr(&self) -> *mut core::ffi::c_void impl aya_ebpf::EbpfContext for aya_ebpf::programs::perf_event::PerfEventContext diff --git a/xtask/public-api/aya-obj.txt b/xtask/public-api/aya-obj.txt index d02cdfc3..507f24db 100644 --- a/xtask/public-api/aya-obj.txt +++ b/xtask/public-api/aya-obj.txt @@ -7655,6 +7655,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::Iter pub aya_obj::obj::ProgramSection::Iter::sleepable: bool pub aya_obj::obj::ProgramSection::KProbe @@ -8517,6 +8518,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::Iter pub aya_obj::ProgramSection::Iter::sleepable: bool pub aya_obj::ProgramSection::KProbe diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index 72f6d0e3..36c2bd44 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -3742,6 +3742,136 @@ 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::load(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +impl aya::programs::flow_dissector::FlowDissector +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::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::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::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::marker::Freeze for aya::programs::flow_dissector::FlowDissector +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::cmp::Eq for aya::programs::flow_dissector::FlowDissectorLink +impl core::cmp::PartialEq for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::eq(&self, other: &Self) -> bool +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::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::hash::Hash for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::hash(&self, state: &mut H) +impl core::ops::drop::Drop for aya::programs::flow_dissector::FlowDissectorLink +pub fn aya::programs::flow_dissector::FlowDissectorLink::drop(&mut self) +impl equivalent::Equivalent for aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::equivalent(&self, key: &aya::programs::flow_dissector::FlowDissectorLink) -> bool +impl core::marker::Freeze for aya::programs::flow_dissector::FlowDissectorLink +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 equivalent::Equivalent for aya::programs::flow_dissector::FlowDissectorLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLink::equivalent(&self, key: &K) -> bool +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::StructuralPartialEq for aya::programs::flow_dissector::FlowDissectorLinkId +impl equivalent::Equivalent for aya::programs::flow_dissector::FlowDissectorLinkId +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::equivalent(&self, key: &aya::programs::flow_dissector::FlowDissectorLink) -> bool +impl core::marker::Freeze 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 equivalent::Equivalent for aya::programs::flow_dissector::FlowDissectorLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::flow_dissector::FlowDissectorLinkId::equivalent(&self, key: &K) -> bool +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::iter pub struct aya::programs::iter::Iter impl aya::programs::iter::Iter @@ -4164,12 +4294,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::raw_trace_point::RawTracePointLink @@ -4485,6 +4619,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::iter::IterLink pub type aya::programs::iter::IterLink::Id = aya::programs::iter::IterLinkId pub fn aya::programs::iter::IterLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError> @@ -7383,6 +7521,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::Iter(aya::programs::iter::Iter) pub aya::programs::Program::KProbe(aya::programs::kprobe::KProbe) pub aya::programs::Program::LircMode2(aya::programs::lirc_mode2::LircMode2) @@ -7433,6 +7572,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::iter::Iter pub type &'a aya::programs::iter::Iter::Error = aya::programs::ProgramError pub fn &'a aya::programs::iter::Iter::try_from(program: &'a aya::programs::Program) -> core::result::Result<&'a aya::programs::iter::Iter, aya::programs::ProgramError> @@ -7508,6 +7650,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::iter::Iter pub type &'a mut aya::programs::iter::Iter::Error = aya::programs::ProgramError pub fn &'a mut aya::programs::iter::Iter::try_from(program: &'a mut aya::programs::Program) -> core::result::Result<&'a mut aya::programs::iter::Iter, aya::programs::ProgramError> @@ -8540,6 +8685,56 @@ impl core::borrow::BorrowMut for aya::programs::fexit::FExit where T: ?cor 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::load(&mut self) -> core::result::Result<(), aya::programs::ProgramError> +impl aya::programs::flow_dissector::FlowDissector +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::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::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::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::marker::Freeze for aya::programs::flow_dissector::FlowDissector +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::Iter impl aya::programs::iter::Iter pub fn aya::programs::iter::Iter::attach(&mut self) -> core::result::Result @@ -9580,6 +9775,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::iter::IterLink pub type aya::programs::iter::IterLink::Id = aya::programs::iter::IterLinkId pub fn aya::programs::iter::IterLink::detach(self) -> core::result::Result<(), aya::programs::ProgramError>