diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2cf076a4..d9cc54c1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,14 +41,15 @@ jobs: - run: ./clippy.sh + # On the `aya-rs/aya` repository, regenerate the public API on a schedule. + # + # On all other events and repositories assert the public API is up to date. - run: cargo xtask public-api - if: github.event_name != 'schedule' - + if: ${{ !(github.event_name == 'schedule' && github.repository == 'aya-rs/aya') }} - run: cargo xtask public-api --bless - if: github.event_name == 'schedule' - + if: ${{ (github.event_name == 'schedule' && github.repository == 'aya-rs/aya') }} - uses: peter-evans/create-pull-request@v7 - if: github.event_name == 'schedule' + if: ${{ (github.event_name == 'schedule' && github.repository == 'aya-rs/aya') }} with: # GitHub actions aren't allowed to trigger other actions to prevent # abuse; the canonical workaround is to use a sufficiently authorized diff --git a/.github/workflows/gen.yml b/.github/workflows/gen.yml index 416f72ef..e63ccc1b 100644 --- a/.github/workflows/gen.yml +++ b/.github/workflows/gen.yml @@ -2,7 +2,8 @@ name: codegen on: push: - branches-ignore: 'create-pull-request/**' + branches-ignore: + - 'create-pull-request/**' schedule: - cron: 00 4 * * * @@ -40,6 +41,7 @@ jobs: run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" - uses: peter-evans/create-pull-request@v7 + if: ${{ github.repository == 'aya-rs/aya' }} with: # GitHub actions aren't allowed to trigger other actions to prevent # abuse; the canonical workaround is to use a sufficiently authorized diff --git a/Cargo.toml b/Cargo.toml index 16825e1f..ec959eab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,25 +70,25 @@ bytes = { version = "1", default-features = false } cargo_metadata = { version = "0.22.0", default-features = false } clap = { version = "4", default-features = false } const-assert = { version = "1.0.1", default-features = false } -dialoguer = { version = "0.11", default-features = false } +dialoguer = { version = "0.12", default-features = false } diff = { version = "0.1.13", default-features = false } env_logger = { version = "0.11", default-features = false } epoll = { version = "4.3.3", default-features = false } futures = { version = "0.3.28", default-features = false } glob = { version = "0.3.0", default-features = false } -hashbrown = { version = "0.15.0", default-features = false } +hashbrown = { version = "0.16.0", default-features = false } indoc = { version = "2.0", default-features = false } libc = { version = "0.2.105", default-features = false } log = { version = "0.4", default-features = false } netns-rs = { version = "0.1", default-features = false } -network-types = { version = "0.0.8", default-features = false } +network-types = { version = "0.1.0", default-features = false } nix = { version = "0.30.1", default-features = false } num_enum = { version = "0.7", default-features = false } object = { version = "0.37", default-features = false } once_cell = { version = "1.20.1", default-features = false } proc-macro2 = { version = "1", default-features = false } proc-macro2-diagnostics = { version = "0.10.1", default-features = false } -procfs = { version = "0.17.0", default-features = false } +procfs = { version = "0.18.0", default-features = false } public-api = { version = "0.50.0", default-features = false } quote = { version = "1", default-features = false } rand = { version = "0.9", default-features = false } diff --git a/aya-log-ebpf-macros/src/expand.rs b/aya-log-ebpf-macros/src/expand.rs index 890ffdc7..45d5b41e 100644 --- a/aya-log-ebpf-macros/src/expand.rs +++ b/aya-log-ebpf-macros/src/expand.rs @@ -68,11 +68,11 @@ impl Parse for LogArgs { } } -pub(crate) fn log(args: LogArgs, level: Option) -> Result { +pub(crate) fn log(args: LogArgs, level_expr: Option) -> Result { let LogArgs { ctx, target, - level: level_expr, + level, format_string, formatting_args, } = args; @@ -80,14 +80,14 @@ pub(crate) fn log(args: LogArgs, level: Option) -> Result quote! { #t }, None => quote! { module_path!() }, }; - let level = match level { - Some(l) => l, + let level_expr = match level_expr { + Some(level_expr) => level_expr, None => { - let l = level_expr.ok_or(Error::new( + let level_expr = level.ok_or(Error::new( format_string.span(), "missing `level` argument: try passing an `aya_log_ebpf::Level` value", ))?; - quote! { #l } + quote! { #level_expr } } }; @@ -146,37 +146,43 @@ pub(crate) fn log(args: LogArgs, level: Option) -> Result {}, - Some(::aya_log_ebpf::macro_support::LogBuf { buf: #buf }) => { - // Silence unused variable warning; we may need ctx in the future. - let _ = #ctx; - let _: Option<()> = (|| { - let #size = ::aya_log_ebpf::macro_support::write_record_header( - #buf, - #target, - #level, - module_path!(), - file!(), - line!(), - #num_args, - )?; - let mut #size = #size.get(); - #( - { - let #buf = #buf.get_mut(#size..)?; - let #len = ::aya_log_ebpf::macro_support::WriteToBuf::write(#values_iter, #buf)?; - #size += #len.get(); - } - )* - let #record = #buf.get(..#size)?; - Result::<_, i64>::ok(::aya_log_ebpf::macro_support::AYA_LOGS.output(#record, 0)) - })(); + { + let #level = #level_expr; + if ::aya_log_ebpf::macro_support::level_enabled(#level) { + match ::aya_log_ebpf::macro_support::AYA_LOG_BUF.get_ptr_mut(0).and_then(|ptr| unsafe { ptr.as_mut() }) { + None => {}, + Some(::aya_log_ebpf::macro_support::LogBuf { buf: #buf }) => { + // Silence unused variable warning; we may need ctx in the future. + let _ = #ctx; + let _: Option<()> = (|| { + let #size = ::aya_log_ebpf::macro_support::write_record_header( + #buf, + #target, + #level, + module_path!(), + file!(), + line!(), + #num_args, + )?; + let mut #size = #size.get(); + #( + { + let #buf = #buf.get_mut(#size..)?; + let #len = ::aya_log_ebpf::macro_support::WriteToBuf::write(#values_iter, #buf)?; + #size += #len.get(); + } + )* + let #record = #buf.get(..#size)?; + Result::<_, i64>::ok(::aya_log_ebpf::macro_support::AYA_LOGS.output(#record, 0)) + })(); + } + } } } }) diff --git a/aya-log/CHANGELOG.md b/aya-log/CHANGELOG.md index 5eb0e76d..5508046d 100644 --- a/aya-log/CHANGELOG.md +++ b/aya-log/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### New Features + +- Add eBPF-side log level `AYA_LOG_LEVEL` allowing selective disabling of log + levels at load-time. Disabled levels are eliminated by the verifier, reducing + instruction count and avoiding program size limits when extensive logging is + present. + ### Breaking Changes - The implementation is now backed by a ring buffer rather than a perf event array. This should diff --git a/aya-log/README.md b/aya-log/README.md index 765247c9..1eefa995 100644 --- a/aya-log/README.md +++ b/aya-log/README.md @@ -69,3 +69,33 @@ fn try_xdp_firewall(ctx: XdpContext) -> Result { [aya]: https://github.com/aya-rs/aya [log]: https://docs.rs/log [env_logger]: https://docs.rs/env_logger + +## Disabling log levels at load-time + +eBPF instruction budgets are tight. Even if a log statement never executes at +runtime, the verifier must still evaluate its instructions unless it can prove +they're unreachable. `aya-log` now exposes a global `AYA_LOG_LEVEL` inside the +eBPF object allowing you to selectively enable levels before the program is +loaded. + +By default all bits are set (all logging enabled). To disable all logging: + +```rust +let mut bpf = aya::EbpfLoader::new() + .set_global(aya_log::LEVEL, &0, false /* must_exist */) + .load_file("prog.bpf.o")?; +# Ok::<(), aya::EbpfError>(()) +``` + +Enable only Error and Warn: + +```rust +let level = aya_log::Level::Warn as u8; +let mut bpf = EbpfLoader::new() + .set_global(aya_log::LEVEL, &level, false /* must_exist */) + .load_file("prog.bpf.o")?; +``` + +Because the level is placed in global read-only data, the verifier sees the +disabled branch as unreachable and prunes the logging instructions, reducing +overall instruction count and avoiding potential instruction limit issues. diff --git a/aya-log/src/lib.rs b/aya-log/src/lib.rs index 333ddcc9..7560f6aa 100644 --- a/aya-log/src/lib.rs +++ b/aya-log/src/lib.rs @@ -67,12 +67,14 @@ use std::{ const MAP_NAME: &str = "AYA_LOGS"; +pub const LEVEL: &str = "AYA_LOG_LEVEL"; use aya::{ Ebpf, Pod, maps::{Map, MapData, MapError, MapInfo, RingBuf}, programs::{ProgramError, loaded_programs}, }; -use aya_log_common::{Argument, DisplayHint, LOG_FIELDS, Level, LogValueLength, RecordField}; +pub use aya_log_common::Level; +use aya_log_common::{Argument, DisplayHint, LOG_FIELDS, LogValueLength, RecordField}; use log::{Log, Record, error}; use thiserror::Error; diff --git a/aya-obj/src/generated/btf_internal_bindings.rs b/aya-obj/src/generated/btf_internal_bindings.rs index 09864b5d..e82dd8d0 100644 --- a/aya-obj/src/generated/btf_internal_bindings.rs +++ b/aya-obj/src/generated/btf_internal_bindings.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ pub type __u8 = ::core::ffi::c_uchar; pub type __u16 = ::core::ffi::c_ushort; diff --git a/aya-obj/src/generated/linux_bindings_aarch64.rs b/aya-obj/src/generated/linux_bindings_aarch64.rs index 2708ecfa..b76ed850 100644 --- a/aya-obj/src/generated/linux_bindings_aarch64.rs +++ b/aya-obj/src/generated/linux_bindings_aarch64.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/aya-obj/src/generated/linux_bindings_armv7.rs b/aya-obj/src/generated/linux_bindings_armv7.rs index 3a8a249a..08b3a162 100644 --- a/aya-obj/src/generated/linux_bindings_armv7.rs +++ b/aya-obj/src/generated/linux_bindings_armv7.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/aya-obj/src/generated/linux_bindings_loongarch64.rs b/aya-obj/src/generated/linux_bindings_loongarch64.rs index 2708ecfa..b76ed850 100644 --- a/aya-obj/src/generated/linux_bindings_loongarch64.rs +++ b/aya-obj/src/generated/linux_bindings_loongarch64.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/aya-obj/src/generated/linux_bindings_mips.rs b/aya-obj/src/generated/linux_bindings_mips.rs index 555185e2..349653d7 100644 --- a/aya-obj/src/generated/linux_bindings_mips.rs +++ b/aya-obj/src/generated/linux_bindings_mips.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/aya-obj/src/generated/linux_bindings_powerpc64.rs b/aya-obj/src/generated/linux_bindings_powerpc64.rs index 90ab9f21..50d01b86 100644 --- a/aya-obj/src/generated/linux_bindings_powerpc64.rs +++ b/aya-obj/src/generated/linux_bindings_powerpc64.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/aya-obj/src/generated/linux_bindings_riscv64.rs b/aya-obj/src/generated/linux_bindings_riscv64.rs index 2708ecfa..b76ed850 100644 --- a/aya-obj/src/generated/linux_bindings_riscv64.rs +++ b/aya-obj/src/generated/linux_bindings_riscv64.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/aya-obj/src/generated/linux_bindings_s390x.rs b/aya-obj/src/generated/linux_bindings_s390x.rs index 2708ecfa..b76ed850 100644 --- a/aya-obj/src/generated/linux_bindings_s390x.rs +++ b/aya-obj/src/generated/linux_bindings_s390x.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/aya-obj/src/generated/linux_bindings_x86_64.rs b/aya-obj/src/generated/linux_bindings_x86_64.rs index 2708ecfa..b76ed850 100644 --- a/aya-obj/src/generated/linux_bindings_x86_64.rs +++ b/aya-obj/src/generated/linux_bindings_x86_64.rs @@ -1,4 +1,4 @@ -/* automatically generated by rust-bindgen 0.72.0 */ +/* automatically generated by rust-bindgen 0.72.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/ebpf/aya-ebpf/src/maps/queue.rs b/ebpf/aya-ebpf/src/maps/queue.rs index 8c8f0bb1..961ee8a1 100644 --- a/ebpf/aya-ebpf/src/maps/queue.rs +++ b/ebpf/aya-ebpf/src/maps/queue.rs @@ -2,7 +2,7 @@ use core::{cell::UnsafeCell, marker::PhantomData, mem}; use crate::{ bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_QUEUE}, - helpers::{bpf_map_pop_elem, bpf_map_push_elem}, + helpers::{bpf_map_peek_elem, bpf_map_pop_elem, bpf_map_push_elem}, maps::PinningType, }; @@ -63,4 +63,12 @@ impl Queue { (ret == 0).then_some(value.assume_init()) } } + + pub fn peek(&self) -> Option { + unsafe { + let mut value = mem::MaybeUninit::uninit(); + let ret = bpf_map_peek_elem(self.def.get() as *mut _, value.as_mut_ptr() as *mut _); + (ret == 0).then_some(value.assume_init()) + } + } } diff --git a/ebpf/aya-ebpf/src/maps/stack.rs b/ebpf/aya-ebpf/src/maps/stack.rs index 6328693d..05cbc2ee 100644 --- a/ebpf/aya-ebpf/src/maps/stack.rs +++ b/ebpf/aya-ebpf/src/maps/stack.rs @@ -2,7 +2,7 @@ use core::{marker::PhantomData, mem}; use crate::{ bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_STACK}, - helpers::{bpf_map_pop_elem, bpf_map_push_elem}, + helpers::{bpf_map_peek_elem, bpf_map_pop_elem, bpf_map_push_elem}, maps::PinningType, }; @@ -43,10 +43,10 @@ impl Stack { } } - pub fn push(&mut self, value: &T, flags: u64) -> Result<(), i64> { + pub fn push(&self, value: &T, flags: u64) -> Result<(), i64> { let ret = unsafe { bpf_map_push_elem( - &mut self.def as *mut _ as *mut _, + &self.def as *const _ as *mut _, value as *const _ as *const _, flags, ) @@ -54,11 +54,22 @@ impl Stack { (ret == 0).then_some(()).ok_or(ret) } - pub fn pop(&mut self) -> Option { + pub fn pop(&self) -> Option { unsafe { let mut value = mem::MaybeUninit::uninit(); let ret = bpf_map_pop_elem( - &mut self.def as *mut _ as *mut _, + &self.def as *const _ as *mut _, + value.as_mut_ptr() as *mut _, + ); + (ret == 0).then_some(value.assume_init()) + } + } + + pub fn peek(&self) -> Option { + unsafe { + let mut value = mem::MaybeUninit::uninit(); + let ret = bpf_map_peek_elem( + &self.def as *const _ as *mut _, value.as_mut_ptr() as *mut _, ); (ret == 0).then_some(value.assume_init()) diff --git a/ebpf/aya-log-ebpf/src/lib.rs b/ebpf/aya-log-ebpf/src/lib.rs index 0a3f1421..7d93f478 100644 --- a/ebpf/aya-log-ebpf/src/lib.rs +++ b/ebpf/aya-log-ebpf/src/lib.rs @@ -34,4 +34,17 @@ pub mod macro_support { // test/integration-test/Cargo.toml. #[cfg_attr(target_arch = "bpf", map)] pub static AYA_LOGS: RingBuf = RingBuf::with_byte_size((LOG_BUF_CAPACITY as u32) << 4, 0); + + /// Global log level controlling which log statements are active. + /// + /// Userspace may patch this symbol before load via `EbpfLoader::set_global`. + #[unsafe(no_mangle)] + pub static AYA_LOG_LEVEL: u8 = 0xff; + + /// Returns `true` if the provided level is enabled according to [`AYA_LOG_LEVEL`]. + #[inline(always)] + pub fn level_enabled(level: Level) -> bool { + let current_level = unsafe { core::ptr::read_volatile(&AYA_LOG_LEVEL) }; + level as u8 <= current_level + } } diff --git a/test/integration-common/src/lib.rs b/test/integration-common/src/lib.rs index b17a8d31..e9fb63b8 100644 --- a/test/integration-common/src/lib.rs +++ b/test/integration-common/src/lib.rs @@ -65,6 +65,12 @@ pub mod strncmp { unsafe impl aya::Pod for TestResult {} } +pub mod linear_data_structures { + pub const PEEK_INDEX: u32 = 0; + pub const POP_INDEX: u32 = 1; +} + + pub mod bpf_d_path { pub const PATH_BUF_LEN: usize = 128; diff --git a/test/integration-ebpf/Cargo.toml b/test/integration-ebpf/Cargo.toml index d4e860e0..f2da66bc 100644 --- a/test/integration-ebpf/Cargo.toml +++ b/test/integration-ebpf/Cargo.toml @@ -28,6 +28,10 @@ xtask = { path = "../../xtask" } name = "bpf_probe_read" path = "src/bpf_probe_read.rs" +[[bin]] +name = "linear_data_structures" +path = "src/linear_data_structures.rs" + [[bin]] name = "bpf_d_path" path = "src/bpf_d_path.rs" diff --git a/test/integration-ebpf/src/linear_data_structures.rs b/test/integration-ebpf/src/linear_data_structures.rs new file mode 100644 index 00000000..d8f01709 --- /dev/null +++ b/test/integration-ebpf/src/linear_data_structures.rs @@ -0,0 +1,71 @@ +#![no_std] +#![no_main] + +#[cfg(not(test))] +extern crate ebpf_panic; + +use aya_ebpf::{ + cty::c_long, + macros::{map, uprobe}, + maps::{Array, Queue, Stack}, + programs::ProbeContext, +}; +use integration_common::linear_data_structures::{PEEK_INDEX, POP_INDEX}; + +#[map] +static RESULT: Array = Array::::with_max_entries(2, 0); + +#[inline(always)] +fn result_set(index: u32, value: u64) -> Result<(), c_long> { + let ptr = RESULT.get_ptr_mut(index).ok_or(-1)?; + let dst = unsafe { ptr.as_mut() }; + let dst_res = dst.ok_or(-1)?; + *dst_res = value; + Ok(()) +} + +macro_rules! define_linear_ds_test { + ($Type:ident, $map_ident:ident, + push_fn: $push_fn:ident, + pop_fn: $pop_fn:ident, + peek_fn: $peek_fn:ident, + ) => { + #[map] + static $map_ident: $Type = $Type::with_max_entries(10, 0); + + #[uprobe] + pub fn $push_fn(ctx: ProbeContext) -> Result<(), c_long> { + let value = ctx.arg(0).ok_or(-1)?; + $map_ident.push(&value, 0)?; + Ok(()) + } + + #[uprobe] + pub fn $pop_fn(_: ProbeContext) -> Result<(), c_long> { + let value = $map_ident.pop().ok_or(-1)?; + result_set(POP_INDEX, value)?; + Ok(()) + } + + #[uprobe] + pub fn $peek_fn(_: ProbeContext) -> Result<(), c_long> { + let value = $map_ident.peek().ok_or(-1)?; + result_set(PEEK_INDEX, value)?; + Ok(()) + } + }; +} + +use define_linear_ds_test; + +define_linear_ds_test!(Stack, TEST_STACK, + push_fn: test_stack_push, + pop_fn: test_stack_pop, + peek_fn: test_stack_peek, +); + +define_linear_ds_test!(Queue, TEST_QUEUE, + push_fn: test_queue_push, + pop_fn: test_queue_pop, + peek_fn: test_queue_peek, +); diff --git a/test/integration-ebpf/src/log.rs b/test/integration-ebpf/src/log.rs index 67228b53..d2cc1fc4 100644 --- a/test/integration-ebpf/src/log.rs +++ b/test/integration-ebpf/src/log.rs @@ -1,7 +1,10 @@ #![no_std] #![no_main] -use core::net::{IpAddr, Ipv4Addr, Ipv6Addr}; +use core::{ + hint::black_box, + net::{IpAddr, Ipv4Addr, Ipv6Addr}, +}; use aya_ebpf::{macros::uprobe, programs::ProbeContext}; use aya_log_ebpf::{debug, error, info, trace, warn}; @@ -80,6 +83,16 @@ pub fn test_log(ctx: ProbeContext) { let no_copy = NoCopy {}; - debug!(&ctx, "{:x}", no_copy.consume()); + // Check usage in expression position. + let () = debug!(&ctx, "{:x}", no_copy.consume()); } } + +#[uprobe] +pub fn test_log_omission(ctx: ProbeContext) { + debug!( + &ctx, + "This is the last u32: {}", + black_box(0u32..).last().unwrap_or(u32::MAX) + ); +} diff --git a/test/integration-test/src/lib.rs b/test/integration-test/src/lib.rs index 533fd3d9..d692a962 100644 --- a/test/integration-test/src/lib.rs +++ b/test/integration-test/src/lib.rs @@ -40,6 +40,7 @@ bpf_file!( BPF_D_PATH => "bpf_d_path", BPF_PROBE_READ => "bpf_probe_read", + LINEAR_DATA_STRUCTURES => "linear_data_structures", LOG => "log", MAP_TEST => "map_test", MEMMOVE_TEST => "memmove_test", diff --git a/test/integration-test/src/tests.rs b/test/integration-test/src/tests.rs index ef0f51c3..b9533c16 100644 --- a/test/integration-test/src/tests.rs +++ b/test/integration-test/src/tests.rs @@ -5,6 +5,7 @@ mod elf; mod feature_probe; mod info; mod iter; +mod linear_data_structures; mod load; mod log; mod raw_tracepoint; diff --git a/test/integration-test/src/tests/linear_data_structures.rs b/test/integration-test/src/tests/linear_data_structures.rs new file mode 100644 index 00000000..49ddbfdb --- /dev/null +++ b/test/integration-test/src/tests/linear_data_structures.rs @@ -0,0 +1,94 @@ +use aya::{EbpfLoader, maps::Array, programs::UProbe}; +use integration_common::linear_data_structures::{PEEK_INDEX, POP_INDEX}; + +enum Order { + Lifo, + Fifo, +} + +macro_rules! define_linear_ds_host_test { + ( + push_prog: $push_prog:literal, + pop_prog: $pop_prog:literal, + peek_prog: $peek_prog:literal, + push_fn: $push_fn:ident, + pop_fn: $pop_fn:ident, + peek_fn: $peek_fn:ident, + test_fn: $test_fn:ident, + order: $order:expr, + ) => { + #[unsafe(no_mangle)] + #[inline(never)] + pub extern "C" fn $push_fn(arg: u64) { + core::hint::black_box(arg); + } + #[unsafe(no_mangle)] + #[inline(never)] + pub extern "C" fn $peek_fn(marker: u64) -> u64 { + core::hint::black_box($peek_fn); + marker + 1 + } + #[unsafe(no_mangle)] + #[inline(never)] + pub extern "C" fn $pop_fn(marker: u64) -> u64 { + core::hint::black_box($pop_fn); + marker + 2 + } + + #[test_log::test] + fn $test_fn() { + let mut bpf = EbpfLoader::new() + .load(crate::LINEAR_DATA_STRUCTURES) + .unwrap(); + for (prog_name, symbol) in [ + ($push_prog, stringify!($push_fn)), + ($peek_prog, stringify!($peek_fn)), + ($pop_prog, stringify!($pop_fn)), + ] { + let prog: &mut UProbe = bpf.program_mut(prog_name).unwrap().try_into().unwrap(); + prog.load().unwrap(); + prog.attach(symbol, "/proc/self/exe", None, None).unwrap(); + } + let array_map = bpf.map("RESULT").unwrap(); + let array = Array::<_, u64>::try_from(array_map).unwrap(); + let seq = 0..9; + for i in seq.clone() { + $push_fn(i); + } + let mut rev = seq.clone().rev(); + let mut seq = seq; + let iter: &mut dyn Iterator = match $order { + Order::Lifo => &mut rev, + Order::Fifo => &mut seq, + }; + for i in iter { + $peek_fn(i); + assert_eq!(array.get(&PEEK_INDEX, 0).unwrap(), i); + $pop_fn(i); + assert_eq!(array.get(&POP_INDEX, 0).unwrap(), i); + } + } + }; +} + +define_linear_ds_host_test!( + push_prog: "test_stack_push", + pop_prog: "test_stack_pop", + peek_prog: "test_stack_peek", + push_fn: trigger_stack_push, + pop_fn: trigger_stack_pop, + peek_fn: trigger_stack_peek, + test_fn: stack_basic, + order: Order::Lifo, +); + +define_linear_ds_host_test!( + push_prog: "test_queue_push", + pop_prog: "test_queue_pop", + peek_prog: "test_queue_peek", + push_fn: trigger_queue_push, + pop_fn: trigger_queue_pop, + peek_fn: trigger_queue_peek, + test_fn: queue_basic, + order: Order::Fifo, +); diff --git a/test/integration-test/src/tests/log.rs b/test/integration-test/src/tests/log.rs index 987ec23b..c7a8976a 100644 --- a/test/integration-test/src/tests/log.rs +++ b/test/integration-test/src/tests/log.rs @@ -1,6 +1,6 @@ use std::{borrow::Cow, sync::Mutex}; -use aya::{Ebpf, programs::UProbe}; +use aya::{Ebpf, EbpfLoader, programs::UProbe}; use aya_log::EbpfLogger; use log::{Level, Log, Record}; @@ -173,3 +173,91 @@ fn log() { assert_eq!(records.next(), None); } + +#[test_log::test] +fn log_level_only_error_warn() { + let level = aya_log::Level::Warn as u8; + let mut bpf = EbpfLoader::new() + .set_global(aya_log::LEVEL, &level, true /* must_exist */) + .load(crate::LOG) + .unwrap(); + + let mut captured_logs = Vec::new(); + let logger = TestingLogger { + log: Mutex::new(|record: &Record| { + captured_logs.push(CapturedLog { + body: format!("{}", record.args()).into(), + level: record.level(), + target: record.target().to_string().into(), + }); + }), + }; + let mut logger = EbpfLogger::init_with_logger(&mut bpf, &logger).unwrap(); + + let prog: &mut UProbe = bpf.program_mut("test_log").unwrap().try_into().unwrap(); + prog.load().unwrap(); + prog.attach("trigger_ebpf_program", "/proc/self/exe", None, None) + .unwrap(); + + trigger_ebpf_program(); + logger.flush(); + + let mut records = captured_logs.iter(); + + assert_eq!( + records.next(), + Some(&CapturedLog { + body: "69, 420, wao, 77616f".into(), + level: Level::Error, + target: "log".into(), + }) + ); + + assert_eq!( + records.next(), + Some(&CapturedLog { + body: "hex lc: 2f, hex uc: 2F".into(), + level: Level::Warn, + target: "log".into(), + }) + ); + + assert_eq!(records.next(), None); +} + +#[test_log::test] +fn log_level_prevents_verif_fail() { + let level = aya_log::Level::Warn as u8; + let mut bpf = EbpfLoader::new() + .set_global(aya_log::LEVEL, &level, true /* must_exist */) + .load(crate::LOG) + .unwrap(); + + let mut captured_logs = Vec::new(); + let logger = TestingLogger { + log: Mutex::new(|record: &Record| { + captured_logs.push(CapturedLog { + body: format!("{}", record.args()).into(), + level: record.level(), + target: record.target().to_string().into(), + }); + }), + }; + let mut logger = EbpfLogger::init_with_logger(&mut bpf, &logger).unwrap(); + + let prog: &mut UProbe = bpf + .program_mut("test_log_omission") + .unwrap() + .try_into() + .unwrap(); + prog.load().unwrap(); + prog.attach("trigger_ebpf_program", "/proc/self/exe", None, None) + .unwrap(); + + trigger_ebpf_program(); + logger.flush(); + + let mut records = captured_logs.iter(); + + assert_eq!(records.next(), None); +} diff --git a/xtask/public-api/aya-ebpf.txt b/xtask/public-api/aya-ebpf.txt index 16621936..105327e9 100644 --- a/xtask/public-api/aya-ebpf.txt +++ b/xtask/public-api/aya-ebpf.txt @@ -440,6 +440,7 @@ pub fn aya_ebpf::maps::program_array::ProgramArray::from(t: T) -> T pub mod aya_ebpf::maps::queue #[repr(transparent)] pub struct aya_ebpf::maps::queue::Queue impl aya_ebpf::maps::queue::Queue +pub fn aya_ebpf::maps::queue::Queue::peek(&self) -> core::option::Option pub const fn aya_ebpf::maps::queue::Queue::pinned(max_entries: u32, flags: u32) -> aya_ebpf::maps::queue::Queue pub fn aya_ebpf::maps::queue::Queue::pop(&self) -> core::option::Option pub fn aya_ebpf::maps::queue::Queue::push(&self, value: &T, flags: u64) -> core::result::Result<(), i64> @@ -594,9 +595,10 @@ pub fn aya_ebpf::maps::sock_map::SockMap::from(t: T) -> T pub mod aya_ebpf::maps::stack #[repr(transparent)] pub struct aya_ebpf::maps::stack::Stack impl aya_ebpf::maps::stack::Stack +pub fn aya_ebpf::maps::stack::Stack::peek(&self) -> core::option::Option pub const fn aya_ebpf::maps::stack::Stack::pinned(max_entries: u32, flags: u32) -> aya_ebpf::maps::stack::Stack -pub fn aya_ebpf::maps::stack::Stack::pop(&mut self) -> core::option::Option -pub fn aya_ebpf::maps::stack::Stack::push(&mut self, value: &T, flags: u64) -> core::result::Result<(), i64> +pub fn aya_ebpf::maps::stack::Stack::pop(&self) -> core::option::Option +pub fn aya_ebpf::maps::stack::Stack::push(&self, value: &T, flags: u64) -> core::result::Result<(), i64> pub const fn aya_ebpf::maps::stack::Stack::with_max_entries(max_entries: u32, flags: u32) -> aya_ebpf::maps::stack::Stack impl core::marker::Freeze for aya_ebpf::maps::stack::Stack impl core::marker::Send for aya_ebpf::maps::stack::Stack where T: core::marker::Send @@ -1168,6 +1170,7 @@ impl core::convert::From for aya_ebpf::maps::program_array::ProgramArray pub fn aya_ebpf::maps::program_array::ProgramArray::from(t: T) -> T #[repr(transparent)] pub struct aya_ebpf::maps::Queue impl aya_ebpf::maps::queue::Queue +pub fn aya_ebpf::maps::queue::Queue::peek(&self) -> core::option::Option pub const fn aya_ebpf::maps::queue::Queue::pinned(max_entries: u32, flags: u32) -> aya_ebpf::maps::queue::Queue pub fn aya_ebpf::maps::queue::Queue::pop(&self) -> core::option::Option pub fn aya_ebpf::maps::queue::Queue::push(&self, value: &T, flags: u64) -> core::result::Result<(), i64> @@ -1285,9 +1288,10 @@ impl core::convert::From for aya_ebpf::maps::sock_map::SockMap pub fn aya_ebpf::maps::sock_map::SockMap::from(t: T) -> T #[repr(transparent)] pub struct aya_ebpf::maps::Stack impl aya_ebpf::maps::stack::Stack +pub fn aya_ebpf::maps::stack::Stack::peek(&self) -> core::option::Option pub const fn aya_ebpf::maps::stack::Stack::pinned(max_entries: u32, flags: u32) -> aya_ebpf::maps::stack::Stack -pub fn aya_ebpf::maps::stack::Stack::pop(&mut self) -> core::option::Option -pub fn aya_ebpf::maps::stack::Stack::push(&mut self, value: &T, flags: u64) -> core::result::Result<(), i64> +pub fn aya_ebpf::maps::stack::Stack::pop(&self) -> core::option::Option +pub fn aya_ebpf::maps::stack::Stack::push(&self, value: &T, flags: u64) -> core::result::Result<(), i64> pub const fn aya_ebpf::maps::stack::Stack::with_max_entries(max_entries: u32, flags: u32) -> aya_ebpf::maps::stack::Stack impl core::marker::Freeze for aya_ebpf::maps::stack::Stack impl core::marker::Send for aya_ebpf::maps::stack::Stack where T: core::marker::Send diff --git a/xtask/public-api/aya-log.txt b/xtask/public-api/aya-log.txt index 47e000d8..3583315e 100644 --- a/xtask/public-api/aya-log.txt +++ b/xtask/public-api/aya-log.txt @@ -1,4 +1,5 @@ pub mod aya_log +pub use aya_log::Level pub enum aya_log::Error pub aya_log::Error::MapError(aya::maps::MapError) pub aya_log::Error::MapNotFound @@ -297,6 +298,7 @@ impl core::borrow::BorrowMut for aya_log::UpperMacFormatter where T: ?core pub fn aya_log::UpperMacFormatter::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya_log::UpperMacFormatter pub fn aya_log::UpperMacFormatter::from(t: T) -> T +pub const aya_log::LEVEL: &str pub trait aya_log::Formatter pub fn aya_log::Formatter::format(v: T) -> alloc::string::String impl aya_log::Formatter<&[u8]> for aya_log::LowerHexBytesFormatter diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index a0d9277f..25480b40 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -413,6 +413,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::maps::perf::Events impl core::panic::unwind_safe::UnwindSafe for aya::maps::perf::Events impl equivalent::Equivalent for aya::maps::perf::Events where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::maps::perf::Events::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::maps::perf::Events where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::maps::perf::Events::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::maps::perf::Events where U: core::convert::From pub fn aya::maps::perf::Events::into(self) -> U impl core::convert::TryFrom for aya::maps::perf::Events where U: core::convert::Into @@ -2504,6 +2506,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_device::C impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_device::CgroupDeviceLink impl equivalent::Equivalent for aya::programs::cgroup_device::CgroupDeviceLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_device::CgroupDeviceLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_device::CgroupDeviceLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_device::CgroupDeviceLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_device::CgroupDeviceLink where U: core::convert::From pub fn aya::programs::cgroup_device::CgroupDeviceLink::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_device::CgroupDeviceLink where U: core::convert::Into @@ -2539,6 +2543,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_device::C impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_device::CgroupDeviceLinkId impl equivalent::Equivalent for aya::programs::cgroup_device::CgroupDeviceLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_device::CgroupDeviceLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_device::CgroupDeviceLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_device::CgroupDeviceLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_device::CgroupDeviceLinkId where U: core::convert::From pub fn aya::programs::cgroup_device::CgroupDeviceLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_device::CgroupDeviceLinkId where U: core::convert::Into @@ -2672,6 +2678,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_skb::Cgro impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_skb::CgroupSkbLink impl equivalent::Equivalent for aya::programs::cgroup_skb::CgroupSkbLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_skb::CgroupSkbLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_skb::CgroupSkbLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_skb::CgroupSkbLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_skb::CgroupSkbLink where U: core::convert::From pub fn aya::programs::cgroup_skb::CgroupSkbLink::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_skb::CgroupSkbLink where U: core::convert::Into @@ -2707,6 +2715,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_skb::Cgro impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_skb::CgroupSkbLinkId impl equivalent::Equivalent for aya::programs::cgroup_skb::CgroupSkbLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_skb::CgroupSkbLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_skb::CgroupSkbLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_skb::CgroupSkbLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_skb::CgroupSkbLinkId where U: core::convert::From pub fn aya::programs::cgroup_skb::CgroupSkbLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_skb::CgroupSkbLinkId where U: core::convert::Into @@ -2802,6 +2812,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sock::Cgr impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sock::CgroupSockLink impl equivalent::Equivalent for aya::programs::cgroup_sock::CgroupSockLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sock::CgroupSockLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sock::CgroupSockLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sock::CgroupSockLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sock::CgroupSockLink where U: core::convert::From pub fn aya::programs::cgroup_sock::CgroupSockLink::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sock::CgroupSockLink where U: core::convert::Into @@ -2837,6 +2849,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sock::Cgr impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sock::CgroupSockLinkId impl equivalent::Equivalent for aya::programs::cgroup_sock::CgroupSockLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sock::CgroupSockLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sock::CgroupSockLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sock::CgroupSockLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sock::CgroupSockLinkId where U: core::convert::From pub fn aya::programs::cgroup_sock::CgroupSockLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sock::CgroupSockLinkId where U: core::convert::Into @@ -2932,6 +2946,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sock_addr impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sock_addr::CgroupSockAddrLink impl equivalent::Equivalent for aya::programs::cgroup_sock_addr::CgroupSockAddrLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sock_addr::CgroupSockAddrLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sock_addr::CgroupSockAddrLink where U: core::convert::From pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLink::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sock_addr::CgroupSockAddrLink where U: core::convert::Into @@ -2967,6 +2983,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sock_addr impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId impl equivalent::Equivalent for aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId where U: core::convert::From pub fn aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sock_addr::CgroupSockAddrLinkId where U: core::convert::Into @@ -3061,6 +3079,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sockopt:: impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sockopt::CgroupSockoptLink impl equivalent::Equivalent for aya::programs::cgroup_sockopt::CgroupSockoptLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sockopt::CgroupSockoptLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sockopt::CgroupSockoptLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sockopt::CgroupSockoptLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sockopt::CgroupSockoptLink where U: core::convert::From pub fn aya::programs::cgroup_sockopt::CgroupSockoptLink::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sockopt::CgroupSockoptLink where U: core::convert::Into @@ -3096,6 +3116,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sockopt:: impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sockopt::CgroupSockoptLinkId impl equivalent::Equivalent for aya::programs::cgroup_sockopt::CgroupSockoptLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sockopt::CgroupSockoptLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sockopt::CgroupSockoptLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sockopt::CgroupSockoptLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sockopt::CgroupSockoptLinkId where U: core::convert::From pub fn aya::programs::cgroup_sockopt::CgroupSockoptLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sockopt::CgroupSockoptLinkId where U: core::convert::Into @@ -3190,6 +3212,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sysctl::C impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sysctl::CgroupSysctlLink impl equivalent::Equivalent for aya::programs::cgroup_sysctl::CgroupSysctlLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sysctl::CgroupSysctlLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sysctl::CgroupSysctlLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sysctl::CgroupSysctlLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sysctl::CgroupSysctlLink where U: core::convert::From pub fn aya::programs::cgroup_sysctl::CgroupSysctlLink::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sysctl::CgroupSysctlLink where U: core::convert::Into @@ -3225,6 +3249,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::cgroup_sysctl::C impl core::panic::unwind_safe::UnwindSafe for aya::programs::cgroup_sysctl::CgroupSysctlLinkId impl equivalent::Equivalent for aya::programs::cgroup_sysctl::CgroupSysctlLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::cgroup_sysctl::CgroupSysctlLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::cgroup_sysctl::CgroupSysctlLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::cgroup_sysctl::CgroupSysctlLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::cgroup_sysctl::CgroupSysctlLinkId where U: core::convert::From pub fn aya::programs::cgroup_sysctl::CgroupSysctlLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::cgroup_sysctl::CgroupSysctlLinkId where U: core::convert::Into @@ -3357,6 +3383,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::extension::Exten impl core::panic::unwind_safe::UnwindSafe for aya::programs::extension::ExtensionLink impl equivalent::Equivalent for aya::programs::extension::ExtensionLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::extension::ExtensionLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::extension::ExtensionLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::extension::ExtensionLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::extension::ExtensionLink where U: core::convert::From pub fn aya::programs::extension::ExtensionLink::into(self) -> U impl core::convert::TryFrom for aya::programs::extension::ExtensionLink where U: core::convert::Into @@ -3392,6 +3420,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::extension::Exten impl core::panic::unwind_safe::UnwindSafe for aya::programs::extension::ExtensionLinkId impl equivalent::Equivalent for aya::programs::extension::ExtensionLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::extension::ExtensionLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::extension::ExtensionLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::extension::ExtensionLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::extension::ExtensionLinkId where U: core::convert::From pub fn aya::programs::extension::ExtensionLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::extension::ExtensionLinkId where U: core::convert::Into @@ -3490,6 +3520,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::fentry::FEntryLi impl core::panic::unwind_safe::UnwindSafe for aya::programs::fentry::FEntryLink impl equivalent::Equivalent for aya::programs::fentry::FEntryLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::fentry::FEntryLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::fentry::FEntryLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::fentry::FEntryLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::fentry::FEntryLink where U: core::convert::From pub fn aya::programs::fentry::FEntryLink::into(self) -> U impl core::convert::TryFrom for aya::programs::fentry::FEntryLink where U: core::convert::Into @@ -3525,6 +3557,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::fentry::FEntryLi impl core::panic::unwind_safe::UnwindSafe for aya::programs::fentry::FEntryLinkId impl equivalent::Equivalent for aya::programs::fentry::FEntryLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::fentry::FEntryLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::fentry::FEntryLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::fentry::FEntryLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::fentry::FEntryLinkId where U: core::convert::From pub fn aya::programs::fentry::FEntryLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::fentry::FEntryLinkId where U: core::convert::Into @@ -3623,6 +3657,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::fexit::FExitLink impl core::panic::unwind_safe::UnwindSafe for aya::programs::fexit::FExitLink impl equivalent::Equivalent for aya::programs::fexit::FExitLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::fexit::FExitLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::fexit::FExitLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::fexit::FExitLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::fexit::FExitLink where U: core::convert::From pub fn aya::programs::fexit::FExitLink::into(self) -> U impl core::convert::TryFrom for aya::programs::fexit::FExitLink where U: core::convert::Into @@ -3658,6 +3694,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::fexit::FExitLink impl core::panic::unwind_safe::UnwindSafe for aya::programs::fexit::FExitLinkId impl equivalent::Equivalent for aya::programs::fexit::FExitLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::fexit::FExitLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::fexit::FExitLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::fexit::FExitLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::fexit::FExitLinkId where U: core::convert::From pub fn aya::programs::fexit::FExitLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::fexit::FExitLinkId where U: core::convert::Into @@ -3750,6 +3788,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::flow_dissector:: 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 hashbrown::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 @@ -3785,6 +3825,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::flow_dissector:: 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 hashbrown::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 @@ -3914,6 +3956,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::iter::IterLink impl core::panic::unwind_safe::UnwindSafe for aya::programs::iter::IterLink impl equivalent::Equivalent for aya::programs::iter::IterLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::iter::IterLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::iter::IterLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::iter::IterLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::iter::IterLink where U: core::convert::From pub fn aya::programs::iter::IterLink::into(self) -> U impl core::convert::TryFrom for aya::programs::iter::IterLink where U: core::convert::Into @@ -3949,6 +3993,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::iter::IterLinkId impl core::panic::unwind_safe::UnwindSafe for aya::programs::iter::IterLinkId impl equivalent::Equivalent for aya::programs::iter::IterLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::iter::IterLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::iter::IterLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::iter::IterLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::iter::IterLinkId where U: core::convert::From pub fn aya::programs::iter::IterLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::iter::IterLinkId where U: core::convert::Into @@ -4085,6 +4131,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::kprobe::KProbeLi impl core::panic::unwind_safe::UnwindSafe for aya::programs::kprobe::KProbeLink impl equivalent::Equivalent for aya::programs::kprobe::KProbeLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::kprobe::KProbeLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::kprobe::KProbeLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::kprobe::KProbeLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::kprobe::KProbeLink where U: core::convert::From pub fn aya::programs::kprobe::KProbeLink::into(self) -> U impl core::convert::TryFrom for aya::programs::kprobe::KProbeLink where U: core::convert::Into @@ -4120,6 +4168,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::kprobe::KProbeLi impl core::panic::unwind_safe::UnwindSafe for aya::programs::kprobe::KProbeLinkId impl equivalent::Equivalent for aya::programs::kprobe::KProbeLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::kprobe::KProbeLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::kprobe::KProbeLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::kprobe::KProbeLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::kprobe::KProbeLinkId where U: core::convert::From pub fn aya::programs::kprobe::KProbeLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::kprobe::KProbeLinkId where U: core::convert::Into @@ -4380,6 +4430,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::links::FdLink impl core::panic::unwind_safe::UnwindSafe for aya::programs::links::FdLink impl equivalent::Equivalent for aya::programs::links::FdLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::links::FdLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::links::FdLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::links::FdLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::links::FdLink where U: core::convert::From pub fn aya::programs::links::FdLink::into(self) -> U impl core::convert::TryFrom for aya::programs::links::FdLink where U: core::convert::Into @@ -4415,6 +4467,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::links::FdLinkId impl core::panic::unwind_safe::UnwindSafe for aya::programs::links::FdLinkId impl equivalent::Equivalent for aya::programs::links::FdLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::links::FdLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::links::FdLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::links::FdLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::links::FdLinkId where U: core::convert::From pub fn aya::programs::links::FdLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::links::FdLinkId where U: core::convert::Into @@ -4554,6 +4608,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::links::ProgAttac impl core::panic::unwind_safe::UnwindSafe for aya::programs::links::ProgAttachLink impl equivalent::Equivalent for aya::programs::links::ProgAttachLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::links::ProgAttachLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::links::ProgAttachLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::links::ProgAttachLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::links::ProgAttachLink where U: core::convert::From pub fn aya::programs::links::ProgAttachLink::into(self) -> U impl core::convert::TryFrom for aya::programs::links::ProgAttachLink where U: core::convert::Into @@ -4589,6 +4645,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::links::ProgAttac impl core::panic::unwind_safe::UnwindSafe for aya::programs::links::ProgAttachLinkId impl equivalent::Equivalent for aya::programs::links::ProgAttachLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::links::ProgAttachLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::links::ProgAttachLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::links::ProgAttachLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::links::ProgAttachLinkId where U: core::convert::From pub fn aya::programs::links::ProgAttachLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::links::ProgAttachLinkId where U: core::convert::Into @@ -4750,6 +4808,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::lirc_mode2::Lirc impl core::panic::unwind_safe::UnwindSafe for aya::programs::lirc_mode2::LircLink impl equivalent::Equivalent for aya::programs::lirc_mode2::LircLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::lirc_mode2::LircLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::lirc_mode2::LircLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::lirc_mode2::LircLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::lirc_mode2::LircLink where U: core::convert::From pub fn aya::programs::lirc_mode2::LircLink::into(self) -> U impl core::convert::TryFrom for aya::programs::lirc_mode2::LircLink where U: core::convert::Into @@ -4785,6 +4845,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::lirc_mode2::Lirc impl core::panic::unwind_safe::UnwindSafe for aya::programs::lirc_mode2::LircLinkId impl equivalent::Equivalent for aya::programs::lirc_mode2::LircLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::lirc_mode2::LircLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::lirc_mode2::LircLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::lirc_mode2::LircLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::lirc_mode2::LircLinkId where U: core::convert::From pub fn aya::programs::lirc_mode2::LircLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::lirc_mode2::LircLinkId where U: core::convert::Into @@ -4936,6 +4998,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::lsm::LsmLink impl core::panic::unwind_safe::UnwindSafe for aya::programs::lsm::LsmLink impl equivalent::Equivalent for aya::programs::lsm::LsmLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::lsm::LsmLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::lsm::LsmLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::lsm::LsmLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::lsm::LsmLink where U: core::convert::From pub fn aya::programs::lsm::LsmLink::into(self) -> U impl core::convert::TryFrom for aya::programs::lsm::LsmLink where U: core::convert::Into @@ -4971,6 +5035,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::lsm::LsmLinkId impl core::panic::unwind_safe::UnwindSafe for aya::programs::lsm::LsmLinkId impl equivalent::Equivalent for aya::programs::lsm::LsmLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::lsm::LsmLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::lsm::LsmLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::lsm::LsmLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::lsm::LsmLinkId where U: core::convert::From pub fn aya::programs::lsm::LsmLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::lsm::LsmLinkId where U: core::convert::Into @@ -5010,6 +5076,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::perf_attach::Per impl core::panic::unwind_safe::UnwindSafe for aya::programs::perf_attach::PerfLink impl equivalent::Equivalent for aya::programs::perf_attach::PerfLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::perf_attach::PerfLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::perf_attach::PerfLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::perf_attach::PerfLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::perf_attach::PerfLink where U: core::convert::From pub fn aya::programs::perf_attach::PerfLink::into(self) -> U impl core::convert::TryFrom for aya::programs::perf_attach::PerfLink where U: core::convert::Into @@ -5045,6 +5113,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::perf_attach::Per impl core::panic::unwind_safe::UnwindSafe for aya::programs::perf_attach::PerfLinkId impl equivalent::Equivalent for aya::programs::perf_attach::PerfLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::perf_attach::PerfLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::perf_attach::PerfLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::perf_attach::PerfLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::perf_attach::PerfLinkId where U: core::convert::From pub fn aya::programs::perf_attach::PerfLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::perf_attach::PerfLinkId where U: core::convert::Into @@ -5267,6 +5337,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::perf_event::Perf impl core::panic::unwind_safe::UnwindSafe for aya::programs::perf_event::PerfEventLink impl equivalent::Equivalent for aya::programs::perf_event::PerfEventLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::perf_event::PerfEventLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::perf_event::PerfEventLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::perf_event::PerfEventLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::perf_event::PerfEventLink where U: core::convert::From pub fn aya::programs::perf_event::PerfEventLink::into(self) -> U impl core::convert::TryFrom for aya::programs::perf_event::PerfEventLink where U: core::convert::Into @@ -5302,6 +5374,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::perf_event::Perf impl core::panic::unwind_safe::UnwindSafe for aya::programs::perf_event::PerfEventLinkId impl equivalent::Equivalent for aya::programs::perf_event::PerfEventLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::perf_event::PerfEventLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::perf_event::PerfEventLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::perf_event::PerfEventLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::perf_event::PerfEventLinkId where U: core::convert::From pub fn aya::programs::perf_event::PerfEventLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::perf_event::PerfEventLinkId where U: core::convert::Into @@ -5400,6 +5474,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::raw_trace_point: impl core::panic::unwind_safe::UnwindSafe for aya::programs::raw_trace_point::RawTracePointLink impl equivalent::Equivalent for aya::programs::raw_trace_point::RawTracePointLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::raw_trace_point::RawTracePointLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::raw_trace_point::RawTracePointLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::raw_trace_point::RawTracePointLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::raw_trace_point::RawTracePointLink where U: core::convert::From pub fn aya::programs::raw_trace_point::RawTracePointLink::into(self) -> U impl core::convert::TryFrom for aya::programs::raw_trace_point::RawTracePointLink where U: core::convert::Into @@ -5435,6 +5511,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::raw_trace_point: impl core::panic::unwind_safe::UnwindSafe for aya::programs::raw_trace_point::RawTracePointLinkId impl equivalent::Equivalent for aya::programs::raw_trace_point::RawTracePointLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::raw_trace_point::RawTracePointLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::raw_trace_point::RawTracePointLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::raw_trace_point::RawTracePointLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::raw_trace_point::RawTracePointLinkId where U: core::convert::From pub fn aya::programs::raw_trace_point::RawTracePointLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::raw_trace_point::RawTracePointLinkId where U: core::convert::Into @@ -5533,6 +5611,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sk_lookup::SkLoo impl core::panic::unwind_safe::UnwindSafe for aya::programs::sk_lookup::SkLookupLink impl equivalent::Equivalent for aya::programs::sk_lookup::SkLookupLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sk_lookup::SkLookupLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sk_lookup::SkLookupLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sk_lookup::SkLookupLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sk_lookup::SkLookupLink where U: core::convert::From pub fn aya::programs::sk_lookup::SkLookupLink::into(self) -> U impl core::convert::TryFrom for aya::programs::sk_lookup::SkLookupLink where U: core::convert::Into @@ -5568,6 +5648,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sk_lookup::SkLoo impl core::panic::unwind_safe::UnwindSafe for aya::programs::sk_lookup::SkLookupLinkId impl equivalent::Equivalent for aya::programs::sk_lookup::SkLookupLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sk_lookup::SkLookupLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sk_lookup::SkLookupLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sk_lookup::SkLookupLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sk_lookup::SkLookupLinkId where U: core::convert::From pub fn aya::programs::sk_lookup::SkLookupLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::sk_lookup::SkLookupLinkId where U: core::convert::Into @@ -5666,6 +5748,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sk_msg::SkMsgLin impl core::panic::unwind_safe::UnwindSafe for aya::programs::sk_msg::SkMsgLink impl equivalent::Equivalent for aya::programs::sk_msg::SkMsgLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sk_msg::SkMsgLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sk_msg::SkMsgLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sk_msg::SkMsgLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sk_msg::SkMsgLink where U: core::convert::From pub fn aya::programs::sk_msg::SkMsgLink::into(self) -> U impl core::convert::TryFrom for aya::programs::sk_msg::SkMsgLink where U: core::convert::Into @@ -5701,6 +5785,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sk_msg::SkMsgLin impl core::panic::unwind_safe::UnwindSafe for aya::programs::sk_msg::SkMsgLinkId impl equivalent::Equivalent for aya::programs::sk_msg::SkMsgLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sk_msg::SkMsgLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sk_msg::SkMsgLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sk_msg::SkMsgLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sk_msg::SkMsgLinkId where U: core::convert::From pub fn aya::programs::sk_msg::SkMsgLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::sk_msg::SkMsgLinkId where U: core::convert::Into @@ -5834,6 +5920,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sk_skb::SkSkbLin impl core::panic::unwind_safe::UnwindSafe for aya::programs::sk_skb::SkSkbLink impl equivalent::Equivalent for aya::programs::sk_skb::SkSkbLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sk_skb::SkSkbLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sk_skb::SkSkbLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sk_skb::SkSkbLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sk_skb::SkSkbLink where U: core::convert::From pub fn aya::programs::sk_skb::SkSkbLink::into(self) -> U impl core::convert::TryFrom for aya::programs::sk_skb::SkSkbLink where U: core::convert::Into @@ -5869,6 +5957,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sk_skb::SkSkbLin impl core::panic::unwind_safe::UnwindSafe for aya::programs::sk_skb::SkSkbLinkId impl equivalent::Equivalent for aya::programs::sk_skb::SkSkbLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sk_skb::SkSkbLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sk_skb::SkSkbLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sk_skb::SkSkbLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sk_skb::SkSkbLinkId where U: core::convert::From pub fn aya::programs::sk_skb::SkSkbLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::sk_skb::SkSkbLinkId where U: core::convert::Into @@ -5966,6 +6056,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sock_ops::SockOp impl core::panic::unwind_safe::UnwindSafe for aya::programs::sock_ops::SockOpsLink impl equivalent::Equivalent for aya::programs::sock_ops::SockOpsLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sock_ops::SockOpsLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sock_ops::SockOpsLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sock_ops::SockOpsLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sock_ops::SockOpsLink where U: core::convert::From pub fn aya::programs::sock_ops::SockOpsLink::into(self) -> U impl core::convert::TryFrom for aya::programs::sock_ops::SockOpsLink where U: core::convert::Into @@ -6001,6 +6093,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::sock_ops::SockOp impl core::panic::unwind_safe::UnwindSafe for aya::programs::sock_ops::SockOpsLinkId impl equivalent::Equivalent for aya::programs::sock_ops::SockOpsLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::sock_ops::SockOpsLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::sock_ops::SockOpsLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::sock_ops::SockOpsLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::sock_ops::SockOpsLinkId where U: core::convert::From pub fn aya::programs::sock_ops::SockOpsLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::sock_ops::SockOpsLinkId where U: core::convert::Into @@ -6125,6 +6219,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::socket_filter::S impl core::panic::unwind_safe::UnwindSafe for aya::programs::socket_filter::SocketFilterLink impl equivalent::Equivalent for aya::programs::socket_filter::SocketFilterLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::socket_filter::SocketFilterLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::socket_filter::SocketFilterLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::socket_filter::SocketFilterLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::socket_filter::SocketFilterLink where U: core::convert::From pub fn aya::programs::socket_filter::SocketFilterLink::into(self) -> U impl core::convert::TryFrom for aya::programs::socket_filter::SocketFilterLink where U: core::convert::Into @@ -6160,6 +6256,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::socket_filter::S impl core::panic::unwind_safe::UnwindSafe for aya::programs::socket_filter::SocketFilterLinkId impl equivalent::Equivalent for aya::programs::socket_filter::SocketFilterLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::socket_filter::SocketFilterLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::socket_filter::SocketFilterLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::socket_filter::SocketFilterLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::socket_filter::SocketFilterLinkId where U: core::convert::From pub fn aya::programs::socket_filter::SocketFilterLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::socket_filter::SocketFilterLinkId where U: core::convert::Into @@ -6227,6 +6325,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::tc::TcAttachType impl core::panic::unwind_safe::UnwindSafe for aya::programs::tc::TcAttachType impl equivalent::Equivalent for aya::programs::tc::TcAttachType where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::tc::TcAttachType::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::tc::TcAttachType where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::tc::TcAttachType::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::tc::TcAttachType where U: core::convert::From pub fn aya::programs::tc::TcAttachType::into(self) -> U impl core::convert::TryFrom for aya::programs::tc::TcAttachType where U: core::convert::Into @@ -6313,6 +6413,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::tc::NlOptions impl core::panic::unwind_safe::UnwindSafe for aya::programs::tc::NlOptions impl equivalent::Equivalent for aya::programs::tc::NlOptions where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::tc::NlOptions::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::tc::NlOptions where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::tc::NlOptions::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::tc::NlOptions where U: core::convert::From pub fn aya::programs::tc::NlOptions::into(self) -> U impl core::convert::TryFrom for aya::programs::tc::NlOptions where U: core::convert::Into @@ -6426,6 +6528,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::tc::SchedClassif impl core::panic::unwind_safe::UnwindSafe for aya::programs::tc::SchedClassifierLink impl equivalent::Equivalent for aya::programs::tc::SchedClassifierLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::tc::SchedClassifierLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::tc::SchedClassifierLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::tc::SchedClassifierLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::tc::SchedClassifierLink where U: core::convert::From pub fn aya::programs::tc::SchedClassifierLink::into(self) -> U impl core::convert::TryFrom for aya::programs::tc::SchedClassifierLink where U: core::convert::Into @@ -6461,6 +6565,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::tc::SchedClassif impl core::panic::unwind_safe::UnwindSafe for aya::programs::tc::SchedClassifierLinkId impl equivalent::Equivalent for aya::programs::tc::SchedClassifierLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::tc::SchedClassifierLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::tc::SchedClassifierLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::tc::SchedClassifierLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::tc::SchedClassifierLinkId where U: core::convert::From pub fn aya::programs::tc::SchedClassifierLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::tc::SchedClassifierLinkId where U: core::convert::Into @@ -6561,6 +6667,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::tp_btf::BtfTrace impl core::panic::unwind_safe::UnwindSafe for aya::programs::tp_btf::BtfTracePointLink impl equivalent::Equivalent for aya::programs::tp_btf::BtfTracePointLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::tp_btf::BtfTracePointLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::tp_btf::BtfTracePointLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::tp_btf::BtfTracePointLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::tp_btf::BtfTracePointLink where U: core::convert::From pub fn aya::programs::tp_btf::BtfTracePointLink::into(self) -> U impl core::convert::TryFrom for aya::programs::tp_btf::BtfTracePointLink where U: core::convert::Into @@ -6596,6 +6704,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::tp_btf::BtfTrace impl core::panic::unwind_safe::UnwindSafe for aya::programs::tp_btf::BtfTracePointLinkId impl equivalent::Equivalent for aya::programs::tp_btf::BtfTracePointLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::tp_btf::BtfTracePointLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::tp_btf::BtfTracePointLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::tp_btf::BtfTracePointLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::tp_btf::BtfTracePointLinkId where U: core::convert::From pub fn aya::programs::tp_btf::BtfTracePointLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::tp_btf::BtfTracePointLinkId where U: core::convert::Into @@ -6732,6 +6842,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::trace_point::Tra impl core::panic::unwind_safe::UnwindSafe for aya::programs::trace_point::TracePointLink impl equivalent::Equivalent for aya::programs::trace_point::TracePointLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::trace_point::TracePointLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::trace_point::TracePointLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::trace_point::TracePointLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::trace_point::TracePointLink where U: core::convert::From pub fn aya::programs::trace_point::TracePointLink::into(self) -> U impl core::convert::TryFrom for aya::programs::trace_point::TracePointLink where U: core::convert::Into @@ -6767,6 +6879,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::trace_point::Tra impl core::panic::unwind_safe::UnwindSafe for aya::programs::trace_point::TracePointLinkId impl equivalent::Equivalent for aya::programs::trace_point::TracePointLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::trace_point::TracePointLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::trace_point::TracePointLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::trace_point::TracePointLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::trace_point::TracePointLinkId where U: core::convert::From pub fn aya::programs::trace_point::TracePointLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::trace_point::TracePointLinkId where U: core::convert::Into @@ -6979,6 +7093,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::uprobe::UProbeLi impl core::panic::unwind_safe::UnwindSafe for aya::programs::uprobe::UProbeLink impl equivalent::Equivalent for aya::programs::uprobe::UProbeLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::uprobe::UProbeLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::uprobe::UProbeLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::uprobe::UProbeLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::uprobe::UProbeLink where U: core::convert::From pub fn aya::programs::uprobe::UProbeLink::into(self) -> U impl core::convert::TryFrom for aya::programs::uprobe::UProbeLink where U: core::convert::Into @@ -7014,6 +7130,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::uprobe::UProbeLi impl core::panic::unwind_safe::UnwindSafe for aya::programs::uprobe::UProbeLinkId impl equivalent::Equivalent for aya::programs::uprobe::UProbeLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::uprobe::UProbeLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::uprobe::UProbeLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::uprobe::UProbeLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::uprobe::UProbeLinkId where U: core::convert::From pub fn aya::programs::uprobe::UProbeLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::uprobe::UProbeLinkId where U: core::convert::Into @@ -7262,6 +7380,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::xdp::XdpLink impl core::panic::unwind_safe::UnwindSafe for aya::programs::xdp::XdpLink impl equivalent::Equivalent for aya::programs::xdp::XdpLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::xdp::XdpLink::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::xdp::XdpLink where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::xdp::XdpLink::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::xdp::XdpLink where U: core::convert::From pub fn aya::programs::xdp::XdpLink::into(self) -> U impl core::convert::TryFrom for aya::programs::xdp::XdpLink where U: core::convert::Into @@ -7297,6 +7417,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::xdp::XdpLinkId impl core::panic::unwind_safe::UnwindSafe for aya::programs::xdp::XdpLinkId impl equivalent::Equivalent for aya::programs::xdp::XdpLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::xdp::XdpLinkId::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::xdp::XdpLinkId where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::xdp::XdpLinkId::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::xdp::XdpLinkId where U: core::convert::From pub fn aya::programs::xdp::XdpLinkId::into(self) -> U impl core::convert::TryFrom for aya::programs::xdp::XdpLinkId where U: core::convert::Into @@ -8074,6 +8196,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::programs::tc::TcAttachType impl core::panic::unwind_safe::UnwindSafe for aya::programs::tc::TcAttachType impl equivalent::Equivalent for aya::programs::tc::TcAttachType where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::programs::tc::TcAttachType::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::programs::tc::TcAttachType where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::programs::tc::TcAttachType::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::programs::tc::TcAttachType where U: core::convert::From pub fn aya::programs::tc::TcAttachType::into(self) -> U impl core::convert::TryFrom for aya::programs::tc::TcAttachType where U: core::convert::Into @@ -10113,6 +10237,8 @@ impl core::panic::unwind_safe::RefUnwindSafe for aya::util::KernelVersion impl core::panic::unwind_safe::UnwindSafe for aya::util::KernelVersion impl equivalent::Equivalent for aya::util::KernelVersion where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized pub fn aya::util::KernelVersion::equivalent(&self, key: &K) -> bool +impl hashbrown::Equivalent for aya::util::KernelVersion where Q: core::cmp::Eq + ?core::marker::Sized, K: core::borrow::Borrow + ?core::marker::Sized +pub fn aya::util::KernelVersion::equivalent(&self, key: &K) -> bool impl core::convert::Into for aya::util::KernelVersion where U: core::convert::From pub fn aya::util::KernelVersion::into(self) -> U impl core::convert::TryFrom for aya::util::KernelVersion where U: core::convert::Into