Bump edition to 2024

Change FromRawTracepointArgs::arg to return T rather than *const T which
seems to have been returning a dangling pointer.

Arguably this is not strictly necessary; edition 2024 seems to be
focused on increased strictness around unsafe code which doesn't unlock
new functionality for our users. That said, this work revealed an
apparent bug (see above) that we wouldn't otherwise catch due to
allow-by-default lints.
reviewable/pr1201/r1
Tamir Duberstein 2 weeks ago
parent ea5f7e3015
commit f0a9f19ddc

@ -52,7 +52,8 @@ authors = ["Aya Contributors"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/aya-rs/aya"
homepage = "https://aya-rs.dev"
edition = "2021"
rust-version = "1.85.0"
edition = "2024"
# NOTE(vadorovsky): Neither cargo-udeps nor cargo-machete are able to detect
# unused crates defined in this section. It would be nice to teach either of

@ -6,6 +6,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -5,7 +5,7 @@ use std::{
process::{Child, Command, Stdio},
};
use anyhow::{anyhow, Context as _, Result};
use anyhow::{Context as _, Result, anyhow};
// Re-export `cargo_metadata` to having to encode the version downstream and risk mismatches.
pub use cargo_metadata;
use cargo_metadata::{Artifact, CompilerMessage, Message, Package, Target};

@ -6,6 +6,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[lib]

@ -1,7 +1,7 @@
use syn::{
Error, Ident, LitStr, Result, Token,
parse::{Parse, ParseStream},
punctuated::{Pair, Punctuated},
Error, Ident, LitStr, Result, Token,
};
pub(crate) struct NameValue {

@ -4,7 +4,7 @@ use proc_macro2::TokenStream;
use quote::quote;
use syn::{ItemFn, Result};
use crate::args::{err_on_unknown_args, pop_string_arg, Args};
use crate::args::{Args, err_on_unknown_args, pop_string_arg};
pub(crate) struct BtfTracePoint {
item: ItemFn,
@ -36,8 +36,8 @@ impl BtfTracePoint {
};
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = #fn_name(::aya_ebpf::programs::BtfTracePointContext::new(ctx));
return 0;
@ -67,8 +67,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote!(
#[no_mangle]
#[link_section = "tp_btf"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "tp_btf")]
fn foo(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = foo(::aya_ebpf::programs::BtfTracePointContext::new(ctx));
return 0;
@ -94,8 +94,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote!(
#[no_mangle]
#[link_section = "tp_btf/some_func"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "tp_btf/some_func")]
fn foo(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = foo(::aya_ebpf::programs::BtfTracePointContext::new(ctx));
return 0;

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct CgroupDevice {
item: ItemFn,
@ -26,8 +26,8 @@ impl CgroupDevice {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "cgroup/dev"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/dev")]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::bpf_cgroup_dev_ctx) -> i32 {
return #fn_name(::aya_ebpf::programs::DeviceContext::new(ctx));
@ -56,8 +56,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/dev"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/dev")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_cgroup_dev_ctx) -> i32 {
return foo(::aya_ebpf::programs::DeviceContext::new(ctx));

@ -39,8 +39,8 @@ impl CgroupSkb {
};
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return #fn_name(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -69,8 +69,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/skb"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/skb")]
fn foo(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return foo(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -95,8 +95,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup_skb/egress"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup_skb/egress")]
fn foo(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return foo(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -121,8 +121,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup_skb/ingress"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup_skb/ingress")]
fn foo(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return foo(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -147,8 +147,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup_skb/egress"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup_skb/egress")]
fn foo(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return foo(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -173,8 +173,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup_skb/egress"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup_skb/egress")]
pub fn foo(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return foo(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -199,8 +199,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup_skb/egress"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup_skb/egress")]
pub(crate) fn foo(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return foo(::aya_ebpf::programs::SkBuffContext::new(ctx));

@ -3,7 +3,7 @@ use std::borrow::Cow;
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, Ident, ItemFn};
use syn::{Ident, ItemFn, spanned::Spanned as _};
pub(crate) struct CgroupSock {
item: ItemFn,
@ -38,8 +38,8 @@ impl CgroupSock {
let section_name: Cow<'_, _> = format!("cgroup/{attach_type}").into();
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::bpf_sock) -> i32 {
return #fn_name(::aya_ebpf::programs::SockContext::new(ctx));
@ -68,8 +68,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/post_bind4"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/post_bind4")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock) -> i32 {
return foo(::aya_ebpf::programs::SockContext::new(ctx));
@ -94,8 +94,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/post_bind6"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/post_bind6")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock) -> i32 {
return foo(::aya_ebpf::programs::SockContext::new(ctx));
@ -119,8 +119,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/sock_create"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/sock_create")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock) -> i32 {
return foo(::aya_ebpf::programs::SockContext::new(ctx));
@ -144,8 +144,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/sock_release"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/sock_release")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock) -> i32 {
return foo(::aya_ebpf::programs::SockContext::new(ctx));

@ -3,7 +3,7 @@ use std::borrow::Cow;
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, Ident, ItemFn};
use syn::{Ident, ItemFn, spanned::Spanned as _};
pub(crate) struct CgroupSockAddr {
item: ItemFn,
@ -46,8 +46,8 @@ impl CgroupSockAddr {
let section_name: Cow<'_, _> = format!("cgroup/{attach_type}").into();
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return #fn_name(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -76,8 +76,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/connect4"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/connect4")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -102,8 +102,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/connect6"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/connect6")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -128,8 +128,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/bind4"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/bind4")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -154,8 +154,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/bind6"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/bind6")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -180,8 +180,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/getpeername4"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/getpeername4")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -206,8 +206,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/getpeername6"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/getpeername6")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -232,8 +232,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/getsockname4"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/getsockname4")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -258,8 +258,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/getsockname6"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/getsockname6")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -284,8 +284,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/sendmsg4"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/sendmsg4")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -310,8 +310,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/sendmsg6"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/sendmsg6")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -336,8 +336,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/recvmsg4"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/recvmsg4")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));
@ -362,8 +362,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/recvmsg6"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/recvmsg6")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sock_addr) -> i32 {
return foo(::aya_ebpf::programs::SockAddrContext::new(ctx));

@ -3,7 +3,7 @@ use std::borrow::Cow;
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, Ident, ItemFn};
use syn::{Ident, ItemFn, spanned::Spanned as _};
pub(crate) struct CgroupSockopt {
item: ItemFn,
@ -37,8 +37,8 @@ impl CgroupSockopt {
let section_name: Cow<'_, _> = format!("cgroup/{attach_type}").into();
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::bpf_sockopt) -> i32 {
return #fn_name(::aya_ebpf::programs::SockoptContext::new(ctx));
@ -67,8 +67,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote!(
#[no_mangle]
#[link_section = "cgroup/getsockopt"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/getsockopt")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sockopt) -> i32 {
return foo(::aya_ebpf::programs::SockoptContext::new(ctx));
@ -93,8 +93,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote!(
#[no_mangle]
#[link_section = "cgroup/setsockopt"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/setsockopt")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sockopt) -> i32 {
return foo(::aya_ebpf::programs::SockoptContext::new(ctx));

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct CgroupSysctl {
item: ItemFn,
@ -26,8 +26,8 @@ impl CgroupSysctl {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "cgroup/sysctl"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/sysctl")]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::bpf_sysctl) -> i32 {
return #fn_name(::aya_ebpf::programs::SysctlContext::new(ctx));
@ -56,8 +56,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "cgroup/sysctl"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "cgroup/sysctl")]
fn foo(ctx: *mut ::aya_ebpf::bindings::bpf_sysctl) -> i32 {
return foo(::aya_ebpf::programs::SysctlContext::new(ctx));

@ -46,8 +46,8 @@ impl FEntry {
};
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = #fn_name(::aya_ebpf::programs::FEntryContext::new(ctx));
return 0;
@ -77,8 +77,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "fentry"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "fentry")]
fn sys_clone(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = sys_clone(::aya_ebpf::programs::FEntryContext::new(ctx));
return 0;
@ -106,8 +106,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "fentry/sys_clone"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "fentry/sys_clone")]
fn sys_clone(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = sys_clone(::aya_ebpf::programs::FEntryContext::new(ctx));
return 0;
@ -135,8 +135,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "fentry.s"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "fentry.s")]
fn sys_clone(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = sys_clone(::aya_ebpf::programs::FEntryContext::new(ctx));
return 0;

@ -46,8 +46,8 @@ impl FExit {
};
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = #fn_name(::aya_ebpf::programs::FExitContext::new(ctx));
return 0;
@ -77,8 +77,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "fexit"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "fexit")]
fn sys_clone(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = sys_clone(::aya_ebpf::programs::FExitContext::new(ctx));
return 0;
@ -106,8 +106,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "fexit/sys_clone"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "fexit/sys_clone")]
fn sys_clone(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = sys_clone(::aya_ebpf::programs::FExitContext::new(ctx));
return 0;
@ -135,8 +135,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "fexit.s/sys_clone"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "fexit.s/sys_clone")]
fn sys_clone(ctx: *mut ::core::ffi::c_void) -> i32 {
let _ = sys_clone(::aya_ebpf::programs::FExitContext::new(ctx));
return 0;

@ -3,7 +3,7 @@ use std::borrow::Cow;
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
use crate::args::{err_on_unknown_args, pop_string_arg};
@ -82,8 +82,8 @@ impl KProbe {
};
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = #fn_name(::aya_ebpf::programs::#probe_type::new(ctx));
return 0;
@ -115,8 +115,8 @@ mod tests {
assert_eq!(
kprobe.expand().to_string(),
quote! {
#[no_mangle]
#[link_section = "kprobe"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "kprobe")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::ProbeContext::new(ctx));
return 0;
@ -147,8 +147,8 @@ mod tests {
assert_eq!(
kprobe.expand().to_string(),
quote! {
#[no_mangle]
#[link_section = "kprobe/fib_lookup"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "kprobe/fib_lookup")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::ProbeContext::new(ctx));
return 0;
@ -180,8 +180,8 @@ mod tests {
assert_eq!(
kprobe.expand().to_string(),
quote! {
#[no_mangle]
#[link_section = "kprobe/fib_lookup+10"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "kprobe/fib_lookup+10")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::ProbeContext::new(ctx));
return 0;
@ -210,8 +210,8 @@ mod tests {
assert_eq!(
kprobe.expand().to_string(),
quote! {
#[no_mangle]
#[link_section = "kretprobe"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "kretprobe")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::RetProbeContext::new(ctx));
return 0;

@ -49,8 +49,8 @@ impl Lsm {
// of 0 as in other program types.
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> i32 {
return #fn_name(::aya_ebpf::programs::LsmContext::new(ctx));
@ -82,8 +82,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "lsm.s/bprm_committed_creds"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "lsm.s/bprm_committed_creds")]
fn bprm_committed_creds(ctx: *mut ::core::ffi::c_void) -> i32 {
return bprm_committed_creds(::aya_ebpf::programs::LsmContext::new(ctx));
@ -110,8 +110,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "lsm/bprm_committed_creds"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "lsm/bprm_committed_creds")]
fn bprm_committed_creds(ctx: *mut ::core::ffi::c_void) -> i32 {
return bprm_committed_creds(::aya_ebpf::programs::LsmContext::new(ctx));

@ -23,8 +23,8 @@ impl Map {
let name = &self.name;
let item = &self.item;
quote! {
#[link_section = #section_name]
#[export_name = #name]
#[unsafe(link_section = #section_name)]
#[unsafe(export_name = #name)]
#item
}
}
@ -47,8 +47,8 @@ mod tests {
.unwrap();
let expanded = map.expand();
let expected = quote!(
#[link_section = "maps"]
#[export_name = "foo"]
#[unsafe(link_section = "maps")]
#[unsafe(export_name = "foo")]
static BAR: HashMap<&'static str, u32> = HashMap::new();
);
assert_eq!(expected.to_string(), expanded.to_string());
@ -65,8 +65,8 @@ mod tests {
.unwrap();
let expanded = map.expand();
let expected = quote!(
#[link_section = "maps"]
#[export_name = "BAR"]
#[unsafe(link_section = "maps")]
#[unsafe(export_name = "BAR")]
static BAR: HashMap<&'static str, u32> = HashMap::new();
);
assert_eq!(expected.to_string(), expanded.to_string());

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct PerfEvent {
item: ItemFn,
@ -26,8 +26,8 @@ impl PerfEvent {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "perf_event"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "perf_event")]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = #fn_name(::aya_ebpf::programs::PerfEventContext::new(ctx));
return 0;
@ -57,8 +57,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "perf_event"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "perf_event")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::PerfEventContext::new(ctx));
return 0;

@ -35,8 +35,8 @@ impl RawTracePoint {
};
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = #fn_name(::aya_ebpf::programs::RawTracePointContext::new(ctx));
return 0;
@ -66,8 +66,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "raw_tp/sys_enter"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "raw_tp/sys_enter")]
fn prog(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = prog(::aya_ebpf::programs::RawTracePointContext::new(ctx));
return 0;

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct SkLookup {
item: ItemFn,
@ -26,8 +26,8 @@ impl SkLookup {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "sk_lookup"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sk_lookup")]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::bpf_sk_lookup) -> u32 {
return #fn_name(::aya_ebpf::programs::SkLookupContext::new(ctx));
@ -56,8 +56,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "sk_lookup"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sk_lookup")]
fn prog(ctx: *mut ::aya_ebpf::bindings::bpf_sk_lookup) -> u32 {
return prog(::aya_ebpf::programs::SkLookupContext::new(ctx));

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct SkMsg {
item: ItemFn,
@ -26,8 +26,8 @@ impl SkMsg {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "sk_msg"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sk_msg")]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::sk_msg_md) -> u32 {
return #fn_name(::aya_ebpf::programs::SkMsgContext::new(ctx));
@ -56,8 +56,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "sk_msg"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sk_msg")]
fn prog(ctx: *mut ::aya_ebpf::bindings:: sk_msg_md) -> u32 {
return prog(::aya_ebpf::programs::SkMsgContext::new(ctx));

@ -3,7 +3,7 @@ use std::borrow::Cow;
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
#[derive(Debug, Copy, Clone)]
pub(crate) enum SkSkbKind {
@ -50,8 +50,8 @@ impl SkSkb {
let section_name: Cow<'_, _> = format!("sk_skb/{kind}").into();
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> u32 {
return #fn_name(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -81,8 +81,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "sk_skb/stream_parser"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sk_skb/stream_parser")]
fn prog(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> u32 {
return prog(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -108,8 +108,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "sk_skb/stream_verdict"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sk_skb/stream_verdict")]
fn prog(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> u32 {
return prog(::aya_ebpf::programs::SkBuffContext::new(ctx));

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct SockOps {
item: ItemFn,
@ -26,8 +26,8 @@ impl SockOps {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "sockops"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sockops")]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::bpf_sock_ops) -> u32 {
return #fn_name(::aya_ebpf::programs::SockOpsContext::new(ctx));
@ -56,8 +56,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "sockops"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "sockops")]
fn prog(ctx: *mut ::aya_ebpf::bindings::bpf_sock_ops) -> u32 {
return prog(::aya_ebpf::programs::SockOpsContext::new(ctx));

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct SocketFilter {
item: ItemFn,
@ -26,8 +26,8 @@ impl SocketFilter {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "socket"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "socket")]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i64 {
return #fn_name(::aya_ebpf::programs::SkBuffContext::new(ctx));
@ -56,8 +56,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "socket"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "socket")]
fn prog(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i64 {
return prog(::aya_ebpf::programs::SkBuffContext::new(ctx));

@ -1,7 +1,7 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
pub(crate) struct SchedClassifier {
item: ItemFn,
@ -26,8 +26,8 @@ impl SchedClassifier {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = "classifier"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "classifier")]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return #fn_name(::aya_ebpf::programs::TcContext::new(ctx));
@ -56,8 +56,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "classifier"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "classifier")]
fn prog(ctx: *mut ::aya_ebpf::bindings::__sk_buff) -> i32 {
return prog(::aya_ebpf::programs::TcContext::new(ctx));

@ -3,7 +3,7 @@ use std::borrow::Cow;
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
use crate::args::{err_on_unknown_args, pop_string_arg};
@ -50,8 +50,8 @@ impl TracePoint {
} = item;
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = #fn_name(::aya_ebpf::programs::TracePointContext::new(ctx));
return 0;
@ -81,8 +81,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "tracepoint/syscalls/sys_enter_bind"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "tracepoint/syscalls/sys_enter_bind")]
fn prog(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = prog(::aya_ebpf::programs::TracePointContext::new(ctx));
return 0;

@ -3,7 +3,7 @@ use std::borrow::Cow;
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
use crate::args::{err_on_unknown_args, pop_bool_arg, pop_string_arg};
@ -101,8 +101,8 @@ impl UProbe {
};
let fn_name = &sig.ident;
Ok(quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = #fn_name(::aya_ebpf::programs::#probe_type::new(ctx));
return 0;
@ -134,8 +134,8 @@ mod tests {
assert_eq!(
uprobe.expand().unwrap().to_string(),
quote! {
#[no_mangle]
#[link_section = "uprobe"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "uprobe")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::ProbeContext::new(ctx));
return 0;
@ -164,8 +164,8 @@ mod tests {
assert_eq!(
uprobe.expand().unwrap().to_string(),
quote! {
#[no_mangle]
#[link_section = "uprobe.s"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "uprobe.s")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::ProbeContext::new(ctx));
return 0;
@ -197,8 +197,8 @@ mod tests {
assert_eq!(
uprobe.expand().unwrap().to_string(),
quote! {
#[no_mangle]
#[link_section = "uprobe/self/proc/exe:trigger_uprobe"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "uprobe/self/proc/exe:trigger_uprobe")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::ProbeContext::new(ctx));
return 0;
@ -229,8 +229,8 @@ mod tests {
assert_eq!(
uprobe.expand().unwrap().to_string(),
quote! {
#[no_mangle]
#[link_section = "uprobe/self/proc/exe:foo+123"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "uprobe/self/proc/exe:foo+123")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::ProbeContext::new(ctx));
return 0;
@ -259,8 +259,8 @@ mod tests {
assert_eq!(
uprobe.expand().unwrap().to_string(),
quote! {
#[no_mangle]
#[link_section = "uretprobe"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "uretprobe")]
fn foo(ctx: *mut ::core::ffi::c_void) -> u32 {
let _ = foo(::aya_ebpf::programs::RetProbeContext::new(ctx));
return 0;

@ -1,9 +1,9 @@
use proc_macro2::TokenStream;
use proc_macro2_diagnostics::{Diagnostic, SpanDiagnosticExt as _};
use quote::quote;
use syn::{spanned::Spanned as _, ItemFn};
use syn::{ItemFn, spanned::Spanned as _};
use crate::args::{err_on_unknown_args, pop_bool_arg, pop_string_arg, Args};
use crate::args::{Args, err_on_unknown_args, pop_bool_arg, pop_string_arg};
pub(crate) struct Xdp {
item: ItemFn,
@ -30,7 +30,7 @@ impl Xdp {
Some(name) => {
return Err(span.error(format!(
"Invalid value. Expected 'cpumap' or 'devmap', found '{name}'"
)))
)));
}
None => None,
};
@ -56,8 +56,8 @@ impl Xdp {
let section_name = section_name.join("/");
let fn_name = &sig.ident;
quote! {
#[no_mangle]
#[link_section = #section_name]
#[unsafe(no_mangle)]
#[unsafe(link_section = #section_name)]
#vis fn #fn_name(ctx: *mut ::aya_ebpf::bindings::xdp_md) -> u32 {
return #fn_name(::aya_ebpf::programs::XdpContext::new(ctx));
@ -86,8 +86,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "xdp"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "xdp")]
fn prog(ctx: *mut ::aya_ebpf::bindings::xdp_md) -> u32 {
return prog(::aya_ebpf::programs::XdpContext::new(ctx));
@ -112,8 +112,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "xdp.frags"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "xdp.frags")]
fn prog(ctx: *mut ::aya_ebpf::bindings::xdp_md) -> u32 {
return prog(::aya_ebpf::programs::XdpContext::new(ctx));
@ -138,8 +138,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "xdp/cpumap"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "xdp/cpumap")]
fn prog(ctx: *mut ::aya_ebpf::bindings::xdp_md) -> u32 {
return prog(::aya_ebpf::programs::XdpContext::new(ctx));
@ -164,8 +164,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "xdp/devmap"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "xdp/devmap")]
fn prog(ctx: *mut ::aya_ebpf::bindings::xdp_md) -> u32 {
return prog(::aya_ebpf::programs::XdpContext::new(ctx));
@ -204,8 +204,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "xdp.frags/cpumap"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "xdp.frags/cpumap")]
fn prog(ctx: *mut ::aya_ebpf::bindings::xdp_md) -> u32 {
return prog(::aya_ebpf::programs::XdpContext::new(ctx));
@ -230,8 +230,8 @@ mod tests {
.unwrap();
let expanded = prog.expand();
let expected = quote! {
#[no_mangle]
#[link_section = "xdp.frags/devmap"]
#[unsafe(no_mangle)]
#[unsafe(link_section = "xdp.frags/devmap")]
fn prog(ctx: *mut ::aya_ebpf::bindings::xdp_md) -> u32 {
return prog(::aya_ebpf::programs::XdpContext::new(ctx));

@ -8,6 +8,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -6,6 +6,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -1,11 +1,11 @@
use aya_log_common::DisplayHint;
use aya_log_parser::{parse, Fragment};
use aya_log_parser::{Fragment, parse};
use proc_macro2::{Ident, Span, TokenStream};
use quote::quote;
use syn::{
Error, Expr, LitStr, Result, Token,
parse::{Parse, ParseStream},
punctuated::Punctuated,
Error, Expr, LitStr, Result, Token,
};
pub(crate) struct LogArgs {
@ -146,7 +146,7 @@ pub(crate) fn log(args: LogArgs, level: Option<TokenStream>) -> Result<TokenStre
let slice = Ident::new("slice", Span::mixed_site());
let record = Ident::new("record", Span::mixed_site());
Ok(quote! {
match unsafe { &mut ::aya_log_ebpf::AYA_LOG_BUF }.get_ptr_mut(0).and_then(|ptr| unsafe { ptr.as_mut() }) {
match ::aya_log_ebpf::AYA_LOG_BUF.get_ptr_mut(0).and_then(|ptr| unsafe { ptr.as_mut() }) {
None => {},
Some(::aya_log_ebpf::LogBuf { buf }) => {
let _: Option<()> = (|| {
@ -166,7 +166,7 @@ pub(crate) fn log(args: LogArgs, level: Option<TokenStream>) -> Result<TokenStre
#size += #len.get();
)*
let #record = buf.get(..#size)?;
unsafe { &mut ::aya_log_ebpf::AYA_LOGS }.output(#ctx, #record, 0);
::aya_log_ebpf::AYA_LOGS.output(#ctx, #record, 0);
Some(())
})();
}

@ -6,6 +6,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -9,6 +9,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -60,19 +60,19 @@ use std::{
const MAP_NAME: &str = "AYA_LOGS";
use aya::{
Ebpf, Pod,
maps::{
perf::{AsyncPerfEventArray, Events, PerfBufferError},
Map, MapData, MapError, MapInfo,
perf::{AsyncPerfEventArray, Events, PerfBufferError},
},
programs::{loaded_programs, ProgramError},
programs::{ProgramError, loaded_programs},
util::online_cpus,
Ebpf, Pod,
};
use aya_log_common::{
Argument, DisplayHint, Level, LogValueLength, RecordField, LOG_BUF_CAPACITY, LOG_FIELDS,
Argument, DisplayHint, LOG_BUF_CAPACITY, LOG_FIELDS, Level, LogValueLength, RecordField,
};
use bytes::BytesMut;
use log::{error, Log, Record};
use log::{Log, Record, error};
use thiserror::Error;
#[expect(dead_code)] // TODO(https://github.com/rust-lang/rust/issues/120770): Remove when false positive is fixed.
@ -736,8 +736,8 @@ fn try_read<T: Pod>(mut buf: &[u8]) -> Result<(T, &[u8], &[u8]), ()> {
mod test {
use std::net::IpAddr;
use aya_log_common::{write_record_header, WriteToBuf};
use log::{logger, Level};
use aya_log_common::{WriteToBuf, write_record_header};
use log::{Level, logger};
use super::*;

@ -9,6 +9,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -12,15 +12,15 @@ use log::debug;
use object::{Endianness, SectionIndex};
use crate::{
Object,
btf::{
info::{FuncSecInfo, LineSecInfo},
relocation::Relocation,
Array, BtfEnum, BtfKind, BtfMember, BtfType, Const, Enum, FuncInfo, FuncLinkage, Int,
IntEncoding, LineInfo, Struct, Typedef, Union, VarLinkage,
info::{FuncSecInfo, LineSecInfo},
relocation::Relocation,
},
generated::{btf_ext_header, btf_header},
util::{bytes_of, HashMap},
Object,
util::{HashMap, bytes_of},
};
pub(crate) const MAX_RESOLVE_DEPTH: usize = 32;
@ -734,7 +734,7 @@ impl Object {
&mut self,
features: &BtfFeatures,
) -> Result<Option<&Btf>, BtfError> {
if let Some(ref mut obj_btf) = &mut self.btf {
if let Some(obj_btf) = &mut self.btf {
if obj_btf.is_empty() {
return Ok(None);
}
@ -752,8 +752,8 @@ impl Object {
}
unsafe fn read_btf_header(data: &[u8]) -> btf_header {
// safety: btf_header is POD so read_unaligned is safe
ptr::read_unaligned(data.as_ptr() as *const btf_header)
// Safety: Btf_header is POD so read_unaligned is safe
unsafe { ptr::read_unaligned(data.as_ptr().cast()) }
}
/// Data in the `.BTF.ext` section

@ -6,7 +6,7 @@ use object::Endianness;
use crate::{
generated::{bpf_func_info, bpf_line_info},
relocation::INS_SIZE,
util::{bytes_of, HashMap},
util::{HashMap, bytes_of},
};
/* The func_info subsection layout:

@ -11,16 +11,16 @@ use core::{mem, ops::Bound::Included, ptr};
use object::SectionIndex;
use crate::{
Function, Object,
btf::{
fields_are_compatible, types_are_compatible, Array, Btf, BtfError, BtfMember, BtfType,
IntEncoding, Struct, Union, MAX_SPEC_LEN,
Array, Btf, BtfError, BtfMember, BtfType, IntEncoding, MAX_SPEC_LEN, Struct, Union,
fields_are_compatible, types_are_compatible,
},
generated::{
bpf_core_relo, bpf_core_relo_kind::*, bpf_insn, BPF_ALU, BPF_ALU64, BPF_B, BPF_CALL,
BPF_DW, BPF_H, BPF_JMP, BPF_K, BPF_LD, BPF_LDX, BPF_ST, BPF_STX, BPF_W, BTF_INT_SIGNED,
BPF_ALU, BPF_ALU64, BPF_B, BPF_CALL, BPF_DW, BPF_H, BPF_JMP, BPF_K, BPF_LD, BPF_LDX,
BPF_ST, BPF_STX, BPF_W, BTF_INT_SIGNED, bpf_core_relo, bpf_core_relo_kind::*, bpf_insn,
},
util::HashMap,
Function, Object,
};
/// The error type returned by [`Object::relocate_btf`].
@ -58,7 +58,9 @@ enum RelocationError {
},
/// Invalid instruction index referenced by relocation
#[error("invalid instruction index #{index} referenced by relocation #{relocation_number}, the program contains {num_instructions} instructions")]
#[error(
"invalid instruction index #{index} referenced by relocation #{relocation_number}, the program contains {num_instructions} instructions"
)]
InvalidInstructionIndex {
/// The invalid instruction index
index: usize,
@ -69,7 +71,9 @@ enum RelocationError {
},
/// Multiple candidate target types found with different memory layouts
#[error("error relocating {type_name}, multiple candidate target types found with different memory layouts: {candidates:?}")]
#[error(
"error relocating {type_name}, multiple candidate target types found with different memory layouts: {candidates:?}"
)]
ConflictingCandidates {
/// The type name
type_name: String,
@ -127,7 +131,9 @@ enum RelocationError {
error: Cow<'static, str>,
},
#[error("applying relocation `{kind:?}` missing target BTF info for type `{type_id}` at instruction #{ins_index}")]
#[error(
"applying relocation `{kind:?}` missing target BTF info for type `{type_id}` at instruction #{ins_index}"
)]
MissingTargetDefinition {
kind: RelocationKind,
type_id: u32,
@ -250,7 +256,7 @@ impl Object {
return Err(BtfRelocationError {
section: section_name.to_string(),
error,
})
});
}
}
}
@ -748,7 +754,7 @@ impl<'a> AccessSpec<'a> {
relocation_kind: format!("{:?}", relocation.kind),
type_kind: format!("{:?}", ty.kind()),
error: "enum relocation on non-enum type",
})
});
}
},
@ -1003,7 +1009,7 @@ impl ComputedRelocation {
target.size,
)
.into(),
})
});
}
}
@ -1017,7 +1023,7 @@ impl ComputedRelocation {
relocation_number: rel.number,
index: ins_index,
error: format!("invalid target size {size}").into(),
})
});
}
} as u8;
ins.code = ins.code & 0xE0 | size | ins.code & 0x07;
@ -1040,7 +1046,7 @@ impl ComputedRelocation {
relocation_number: rel.number,
index: ins_index,
error: format!("invalid instruction class {class:x}").into(),
})
});
}
};

@ -1117,7 +1117,7 @@ unsafe fn read<T>(data: &[u8]) -> Result<T, BtfError> {
return Err(BtfError::InvalidTypeInfo);
}
Ok(ptr::read_unaligned::<T>(data.as_ptr() as *const T))
Ok(unsafe { ptr::read_unaligned(data.as_ptr().cast()) })
}
unsafe fn read_array<T>(data: &[u8], len: usize) -> Result<Vec<T>, BtfError> {
@ -1127,7 +1127,7 @@ unsafe fn read_array<T>(data: &[u8], len: usize) -> Result<Vec<T>, BtfError> {
let data = &data[0..mem::size_of::<T>() * len];
let r = data
.chunks(mem::size_of::<T>())
.map(|chunk| ptr::read_unaligned(chunk.as_ptr() as *const T))
.map(|chunk| unsafe { ptr::read_unaligned(chunk.as_ptr().cast()) })
.collect();
Ok(r)
}

@ -47,11 +47,7 @@ where
index % 8
};
let mask = 1 << bit_index;
if val {
byte | mask
} else {
byte & !mask
}
if val { byte | mask } else { byte & !mask }
}
#[inline]
pub fn set_bit(&mut self, index: usize, val: bool) {

@ -47,11 +47,7 @@ where
index % 8
};
let mask = 1 << bit_index;
if val {
byte | mask
} else {
byte & !mask
}
if val { byte | mask } else { byte & !mask }
}
#[inline]
pub fn set_bit(&mut self, index: usize, val: bool) {

@ -47,11 +47,7 @@ where
index % 8
};
let mask = 1 << bit_index;
if val {
byte | mask
} else {
byte & !mask
}
if val { byte | mask } else { byte & !mask }
}
#[inline]
pub fn set_bit(&mut self, index: usize, val: bool) {

@ -47,11 +47,7 @@ where
index % 8
};
let mask = 1 << bit_index;
if val {
byte | mask
} else {
byte & !mask
}
if val { byte | mask } else { byte & !mask }
}
#[inline]
pub fn set_bit(&mut self, index: usize, val: bool) {

@ -47,11 +47,7 @@ where
index % 8
};
let mask = 1 << bit_index;
if val {
byte | mask
} else {
byte & !mask
}
if val { byte | mask } else { byte & !mask }
}
#[inline]
pub fn set_bit(&mut self, index: usize, val: bool) {

@ -47,11 +47,7 @@ where
index % 8
};
let mask = 1 << bit_index;
if val {
byte | mask
} else {
byte & !mask
}
if val { byte | mask } else { byte & !mask }
}
#[inline]
pub fn set_bit(&mut self, index: usize, val: bool) {

@ -47,11 +47,7 @@ where
index % 8
};
let mask = 1 << bit_index;
if val {
byte | mask
} else {
byte & !mask
}
if val { byte | mask } else { byte & !mask }
}
#[inline]
pub fn set_bit(&mut self, index: usize, val: bool) {

@ -72,7 +72,13 @@ extern crate alloc;
extern crate std;
pub mod btf;
#[expect(clippy::all, missing_docs, non_camel_case_types, non_snake_case)]
#[expect(
clippy::all,
missing_docs,
non_camel_case_types,
non_snake_case,
unsafe_op_in_unsafe_fn
)]
pub mod generated;
pub mod links;
pub mod maps;

@ -1,8 +1,8 @@
//! Link type bindings.
use crate::{
generated::{bpf_attach_type, bpf_link_type},
InvalidTypeBinding,
generated::{bpf_attach_type, bpf_link_type},
};
impl TryFrom<u32> for bpf_link_type {

@ -12,9 +12,9 @@ use core::{ffi::CStr, mem, ptr, slice::from_raw_parts_mut, str::FromStr};
use log::debug;
use object::{
read::{Object as ElfObject, ObjectSection, Section as ObjSection},
Endianness, ObjectSymbol, ObjectSymbolTable, RelocationTarget, SectionIndex, SectionKind,
SymbolKind,
read::{Object as ElfObject, ObjectSection, Section as ObjSection},
};
use crate::{
@ -22,10 +22,10 @@ use crate::{
Array, Btf, BtfError, BtfExt, BtfFeatures, BtfType, DataSecEntry, FuncSecInfo, LineSecInfo,
},
generated::{
bpf_func_id::*, bpf_insn, bpf_map_info, bpf_map_type::BPF_MAP_TYPE_ARRAY, BPF_CALL,
BPF_F_RDONLY_PROG, BPF_JMP, BPF_K,
BPF_CALL, BPF_F_RDONLY_PROG, BPF_JMP, BPF_K, bpf_func_id::*, bpf_insn, bpf_map_info,
bpf_map_type::BPF_MAP_TYPE_ARRAY,
},
maps::{bpf_map_def, BtfMap, BtfMapDef, LegacyMap, Map, PinningType, MINIMUM_MAP_SIZE},
maps::{BtfMap, BtfMapDef, LegacyMap, MINIMUM_MAP_SIZE, Map, PinningType, bpf_map_def},
programs::{
CgroupSockAddrAttachType, CgroupSockAttachType, CgroupSockoptAttachType, XdpAttachType,
},
@ -326,7 +326,7 @@ impl FromStr for ProgramSection {
Some(_) => {
return Err(ParseError::InvalidProgramSection {
section: section.to_owned(),
})
});
}
},
},
@ -342,7 +342,7 @@ impl FromStr for ProgramSection {
_ => {
return Err(ParseError::InvalidProgramSection {
section: section.to_owned(),
})
});
}
}
}
@ -356,7 +356,7 @@ impl FromStr for ProgramSection {
_ => {
return Err(ParseError::InvalidProgramSection {
section: section.to_owned(),
})
});
}
}
}
@ -446,7 +446,7 @@ impl FromStr for ProgramSection {
_ => {
return Err(ParseError::InvalidProgramSection {
section: section.to_owned(),
})
});
}
})
}
@ -1150,7 +1150,7 @@ fn parse_version(data: &[u8], endianness: object::Endianness) -> Result<Option<u
_ => {
return Err(ParseError::InvalidKernelVersion {
data: data.to_vec(),
})
});
}
};
@ -1175,7 +1175,7 @@ fn get_map_field(btf: &Btf, type_id: u32) -> Result<u32, BtfError> {
other => {
return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0),
})
});
}
};
// Safety: union
@ -1184,7 +1184,7 @@ fn get_map_field(btf: &Btf, type_id: u32) -> Result<u32, BtfError> {
other => {
return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0),
})
});
}
};
Ok(arr.len)
@ -1260,7 +1260,7 @@ fn parse_btf_map_def(btf: &Btf, info: &DataSecEntry) -> Result<(String, BtfMapDe
other => {
return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0),
})
});
}
};
let map_name = btf.string_at(ty.name_offset)?;
@ -1273,7 +1273,7 @@ fn parse_btf_map_def(btf: &Btf, info: &DataSecEntry) -> Result<(String, BtfMapDe
other => {
return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0),
})
});
}
};

@ -1,8 +1,8 @@
//! Program type bindings.
use crate::{
generated::bpf_prog_type::{self, *},
InvalidTypeBinding,
generated::bpf_prog_type::{self, *},
};
impl TryFrom<u32> for bpf_prog_type {

@ -7,14 +7,14 @@ use log::debug;
use object::{SectionIndex, SymbolKind};
use crate::{
EbpfSectionKind,
generated::{
bpf_insn, BPF_CALL, BPF_JMP, BPF_K, BPF_PSEUDO_CALL, BPF_PSEUDO_FUNC, BPF_PSEUDO_MAP_FD,
BPF_PSEUDO_MAP_VALUE,
BPF_CALL, BPF_JMP, BPF_K, BPF_PSEUDO_CALL, BPF_PSEUDO_FUNC, BPF_PSEUDO_MAP_FD,
BPF_PSEUDO_MAP_VALUE, bpf_insn,
},
maps::Map,
obj::{Function, Object},
util::{HashMap, HashSet},
EbpfSectionKind,
};
#[cfg(feature = "std")]
@ -67,7 +67,9 @@ pub enum RelocationError {
},
/// Unknown function
#[error("program at section {section_index} and address {address:#x} was not found while relocating")]
#[error(
"program at section {section_index} and address {address:#x} was not found while relocating"
)]
UnknownProgram {
/// The function section index
section_index: usize,

@ -11,6 +11,6 @@ pub(crate) use hashbrown::HashSet;
/// bytes_of converts a <T> to a byte slice
pub(crate) unsafe fn bytes_of<T>(val: &T) -> &[u8] {
let size = mem::size_of::<T>();
slice::from_raw_parts(slice::from_ref(val).as_ptr().cast(), size)
let ptr: *const _ = val;
unsafe { slice::from_raw_parts(ptr.cast(), mem::size_of_val(val)) }
}

@ -7,6 +7,7 @@ authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -1,6 +1,6 @@
use std::{path::PathBuf, process::exit};
use aya_tool::generate::{generate, InputFile};
use aya_tool::generate::{InputFile, generate};
use clap::Parser;
#[derive(Parser)]

@ -1,5 +1,5 @@
use std::{
fs::{create_dir_all, File},
fs::{File, create_dir_all},
io::{self, Write},
path::Path,
};
@ -8,7 +8,7 @@ pub mod bindgen;
pub mod generate;
pub mod rustfmt;
pub use generate::{generate, InputFile};
pub use generate::{InputFile, generate};
pub fn write_to_file<T: AsRef<Path>>(path: T, code: &str) -> Result<(), io::Error> {
// Create parent directories if they don't exist already

@ -8,6 +8,9 @@ history and changelog. We also tag PRs on github with a [breaking change] label.
## Summary
- [v0.14.0](#v0140)
- MSRV has been bumped to 1.85.0.
- [v0.12.0](#v0120)
- In `aya::Bpf::programs`, `name` uses the function name from the ELF file.
- Maps API has been reworked.
@ -17,6 +20,15 @@ history and changelog. We also tag PRs on github with a [breaking change] label.
- BTF types have moved to the `aya-obj` crate.
- `aya::PerfEvent::attach` and `detach` signatures have changed.
## v0.14.0
### MSRV has been bumped to 1.85.0
The minimum supported Rust version has been bumped to 1.85.0. This is due to
the move to edition 2024 which was first available in this version.
To migrate you will need to ensure that you are using rustc 1.85.0 or later.
## v0.12.0
### In `aya::Bpf::programs`, `name` uses the function name from the ELF file

@ -5,11 +5,11 @@ description = "An eBPF library with a focus on developer experience and operabil
keywords = ["bpf", "ebpf", "kernel", "linux"]
readme = "README.md"
documentation = "https://docs.rs/aya"
rust-version = "1.80.0"
authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
edition.workspace = true
[dependencies]

@ -8,13 +8,13 @@ use std::{
};
use aya_obj::{
EbpfSectionKind, Features, Object, ParseError, ProgramSection,
btf::{Btf, BtfError, BtfFeatures, BtfRelocationError},
generated::{
bpf_map_type::{self, *},
BPF_F_SLEEPABLE, BPF_F_XDP_HAS_FRAGS,
bpf_map_type::{self, *},
},
relocation::EbpfRelocationError,
EbpfSectionKind, Features, Object, ParseError, ProgramSection,
};
use log::{debug, warn};
use thiserror::Error;
@ -55,7 +55,7 @@ unsafe_impl_pod!(i8, u8, i16, u16, i32, u32, i64, u64, u128, i128);
// It only makes sense that an array of POD types is itself POD
unsafe impl<T: Pod, const N: usize> Pod for [T; N] {}
pub use aya_obj::maps::{bpf_map_def, PinningType};
pub use aya_obj::maps::{PinningType, bpf_map_def};
pub(crate) static FEATURES: LazyLock<Features> = LazyLock::new(detect_features);
@ -239,17 +239,17 @@ impl<'a> EbpfLoader<'a> {
/// From Rust eBPF, a global variable can be defined as follows:
///
/// ```no_run
/// #[no_mangle]
/// #[unsafe(no_mangle)]
/// static VERSION: i32 = 0;
/// ```
///
/// Then it can be accessed using `core::ptr::read_volatile`:
///
/// ```no_run
/// # #[no_mangle]
/// # #[unsafe(no_mangle)]
/// # static VERSION: i32 = 0;
/// # unsafe fn try_test() {
/// let version = core::ptr::read_volatile(&VERSION);
/// # fn try_test() {
/// let version = unsafe { core::ptr::read_volatile(&VERSION) };
/// # }
/// ```
///
@ -403,7 +403,7 @@ impl<'a> EbpfLoader<'a> {
| ProgramSection::Lsm { sleepable: _ }
| ProgramSection::BtfTracePoint
| ProgramSection::Iter { sleepable: _ } => {
return Err(EbpfError::BtfError(err))
return Err(EbpfError::BtfError(err));
}
ProgramSection::KRetProbe
| ProgramSection::KProbe
@ -778,11 +778,7 @@ fn adjust_to_page_size(byte_size: u32, page_size: u32) -> u32 {
fn div_ceil(n: u32, rhs: u32) -> u32 {
let d = n / rhs;
let r = n % rhs;
if r > 0 && rhs > 0 {
d + 1
} else {
d
}
if r > 0 && rhs > 0 { d + 1 } else { d }
}
let pages_needed = div_ceil(byte_size, page_size);
page_size * pages_needed.next_power_of_two()

@ -54,10 +54,6 @@
missing_docs,
non_ascii_idents,
noop_method_call,
rust_2021_incompatible_closure_captures,
rust_2021_incompatible_or_patterns,
rust_2021_prefixes_incompatible_syntax,
rust_2021_prelude_collisions,
single_use_lifetimes,
trivial_numeric_casts,
unreachable_pub,
@ -176,7 +172,7 @@ impl AsRawFd for MockableFd {
impl FromRawFd for MockableFd {
unsafe fn from_raw_fd(fd: RawFd) -> Self {
let fd = OwnedFd::from_raw_fd(fd);
let fd = unsafe { OwnedFd::from_raw_fd(fd) };
Self::from_fd(fd)
}
}

@ -5,9 +5,9 @@ use std::{
};
use crate::{
maps::{check_bounds, check_kv_size, IterableMap, MapData, MapError},
sys::{bpf_map_lookup_elem, bpf_map_update_elem, SyscallError},
Pod,
maps::{IterableMap, MapData, MapError, check_bounds, check_kv_size},
sys::{SyscallError, bpf_map_lookup_elem, bpf_map_update_elem},
};
/// A fixed-size array.

@ -5,9 +5,9 @@ use std::{
};
use crate::{
maps::{check_bounds, check_kv_size, IterableMap, MapData, MapError, PerCpuValues},
sys::{bpf_map_lookup_elem_per_cpu, bpf_map_update_elem_per_cpu, SyscallError},
Pod,
maps::{IterableMap, MapData, MapError, PerCpuValues, check_bounds, check_kv_size},
sys::{SyscallError, bpf_map_lookup_elem_per_cpu, bpf_map_update_elem_per_cpu},
};
/// A per-CPU fixed-size array.

@ -6,9 +6,9 @@ use std::{
};
use crate::{
maps::{check_bounds, check_kv_size, MapData, MapError, MapKeys},
maps::{MapData, MapError, MapKeys, check_bounds, check_kv_size},
programs::ProgramFd,
sys::{bpf_map_delete_elem, bpf_map_update_elem, SyscallError},
sys::{SyscallError, bpf_map_delete_elem, bpf_map_update_elem},
};
/// An array of eBPF program file descriptors used as a jump table.

@ -6,9 +6,9 @@ use std::{
};
use crate::{
maps::{check_v_size, MapData, MapError},
sys::{bpf_map_lookup_elem_ptr, bpf_map_push_elem, SyscallError},
Pod,
maps::{MapData, MapError, check_v_size},
sys::{SyscallError, bpf_map_lookup_elem_ptr, bpf_map_push_elem},
};
/// A Bloom Filter.
@ -95,10 +95,10 @@ mod tests {
use super::*;
use crate::{
maps::{
test_utils::{self, new_map},
Map,
test_utils::{self, new_map},
},
sys::{override_syscall, SysResult, Syscall},
sys::{SysResult, Syscall, override_syscall},
};
fn new_obj_map() -> aya_obj::Map {

@ -5,9 +5,9 @@ use std::{
};
use crate::{
maps::{check_kv_size, hash_map, IterableMap, MapData, MapError, MapIter, MapKeys},
sys::{bpf_map_lookup_elem, SyscallError},
Pod,
maps::{IterableMap, MapData, MapError, MapIter, MapKeys, check_kv_size, hash_map},
sys::{SyscallError, bpf_map_lookup_elem},
};
/// A hash map that can be shared between eBPF programs and user space.
@ -115,10 +115,10 @@ mod tests {
use super::*;
use crate::{
maps::{
test_utils::{self, new_map},
Map,
test_utils::{self, new_map},
},
sys::{override_syscall, SysResult, Syscall},
sys::{SysResult, Syscall, override_syscall},
};
fn new_obj_map() -> aya_obj::Map {

@ -2,9 +2,9 @@
use std::os::fd::AsFd as _;
use crate::{
maps::MapError,
sys::{bpf_map_delete_elem, bpf_map_update_elem, SyscallError},
Pod,
maps::MapError,
sys::{SyscallError, bpf_map_delete_elem, bpf_map_update_elem},
};
#[expect(clippy::module_inception)]

@ -6,11 +6,11 @@ use std::{
};
use crate::{
Pod,
maps::{
check_kv_size, hash_map, IterableMap, MapData, MapError, MapIter, MapKeys, PerCpuValues,
IterableMap, MapData, MapError, MapIter, MapKeys, PerCpuValues, check_kv_size, hash_map,
},
sys::{bpf_map_lookup_elem_per_cpu, bpf_map_update_elem_per_cpu, SyscallError},
Pod,
sys::{SyscallError, bpf_map_lookup_elem_per_cpu, bpf_map_update_elem_per_cpu},
};
/// Similar to [`HashMap`](crate::maps::HashMap) but each CPU holds a separate value for a given key. Typically used to
@ -159,8 +159,8 @@ mod tests {
use super::*;
use crate::{
maps::{test_utils, Map},
sys::{override_syscall, SysResult},
maps::{Map, test_utils},
sys::{SysResult, override_syscall},
};
fn sys_error(value: i32) -> SysResult {

@ -10,11 +10,11 @@ use aya_obj::generated::{bpf_map_info, bpf_map_type};
use super::{MapError, MapFd};
use crate::{
FEATURES,
sys::{
bpf_get_object, bpf_map_get_fd_by_id, bpf_map_get_info_by_fd, iter_map_ids, SyscallError,
SyscallError, bpf_get_object, bpf_map_get_fd_by_id, bpf_map_get_info_by_fd, iter_map_ids,
},
util::bytes_of_bpf_name,
FEATURES,
};
/// Provides Provides metadata information about a loaded eBPF map.
@ -394,7 +394,7 @@ impl TryFrom<bpf_map_type> for MapType {
__MAX_BPF_MAP_TYPE => {
return Err(MapError::InvalidMapType {
map_type: map_type as u32,
})
});
}
})
}

@ -6,9 +6,9 @@ use std::{
};
use crate::{
maps::{check_kv_size, IterableMap, MapData, MapError, MapIter, MapKeys},
sys::{bpf_map_delete_elem, bpf_map_lookup_elem, bpf_map_update_elem, SyscallError},
Pod,
maps::{IterableMap, MapData, MapError, MapIter, MapKeys, check_kv_size},
sys::{SyscallError, bpf_map_delete_elem, bpf_map_lookup_elem, bpf_map_update_elem},
};
/// A Longest Prefix Match Trie.
@ -202,10 +202,10 @@ mod tests {
use super::*;
use crate::{
maps::{
test_utils::{self, new_map},
Map,
test_utils::{self, new_map},
},
sys::{override_syscall, SysResult, Syscall},
sys::{SysResult, Syscall, override_syscall},
};
fn new_obj_map() -> aya_obj::Map {

@ -59,21 +59,21 @@ use std::{
ptr,
};
use aya_obj::{generated::bpf_map_type, parse_map_info, EbpfSectionKind, InvalidTypeBinding};
use aya_obj::{EbpfSectionKind, InvalidTypeBinding, generated::bpf_map_type, parse_map_info};
use libc::{
c_int, c_void, getrlimit, off_t, rlim_t, rlimit, MAP_FAILED, RLIMIT_MEMLOCK, RLIM_INFINITY,
MAP_FAILED, RLIM_INFINITY, RLIMIT_MEMLOCK, c_int, c_void, getrlimit, off_t, rlim_t, rlimit,
};
use log::warn;
use thiserror::Error;
use crate::{
PinningType, Pod,
pin::PinError,
sys::{
bpf_create_map, bpf_get_object, bpf_map_freeze, bpf_map_get_fd_by_id, bpf_map_get_next_key,
bpf_map_update_elem_ptr, bpf_pin_object, mmap, munmap, SyscallError,
SyscallError, bpf_create_map, bpf_get_object, bpf_map_freeze, bpf_map_get_fd_by_id,
bpf_map_get_next_key, bpf_map_update_elem_ptr, bpf_pin_object, mmap, munmap,
},
util::{nr_cpus, KernelVersion},
PinningType, Pod,
util::{KernelVersion, nr_cpus},
};
pub mod array;
@ -92,7 +92,7 @@ pub mod xdp;
pub use array::{Array, PerCpuArray, ProgramArray};
pub use bloom_filter::BloomFilter;
pub use hash_map::{HashMap, PerCpuHashMap};
pub use info::{loaded_maps, MapInfo, MapType};
pub use info::{MapInfo, MapType, loaded_maps};
pub use lpm_trie::LpmTrie;
#[cfg(any(feature = "async_tokio", feature = "async_std"))]
#[cfg_attr(docsrs, doc(cfg(any(feature = "async_tokio", feature = "async_std"))))]
@ -912,13 +912,12 @@ impl<T: Pod> PerCpuValues<T> {
}
pub(crate) unsafe fn from_kernel_mem(mem: PerCpuKernelMem) -> Self {
let mem_ptr = mem.bytes.as_ptr() as usize;
let value_size = (mem::size_of::<T>() + 7) & !7;
let stride = (mem::size_of::<T>() + 7) & !7;
let mut values = Vec::new();
let mut offset = 0;
while offset < mem.bytes.len() {
values.push(ptr::read_unaligned((mem_ptr + offset) as *const _));
offset += value_size;
values.push(unsafe { ptr::read_unaligned(mem.bytes.as_ptr().add(offset).cast()) });
offset += stride;
}
Self {
@ -1005,15 +1004,15 @@ impl Drop for MMap {
#[cfg(test)]
mod test_utils {
use aya_obj::{
EbpfSectionKind,
generated::{bpf_cmd, bpf_map_type},
maps::LegacyMap,
EbpfSectionKind,
};
use crate::{
bpf_map_def,
maps::MapData,
sys::{override_syscall, Syscall},
sys::{Syscall, override_syscall},
};
pub(super) fn new_map(obj: aya_obj::Map) -> MapData {
@ -1072,7 +1071,7 @@ mod tests {
use libc::EFAULT;
use super::*;
use crate::sys::{override_syscall, Syscall};
use crate::sys::{Syscall, override_syscall};
fn new_obj_map() -> aya_obj::Map {
test_utils::new_obj_map::<u32>(bpf_map_type::BPF_MAP_TYPE_HASH)

@ -14,8 +14,8 @@ use bytes::BytesMut;
use tokio::io::unix::AsyncFd;
use crate::maps::{
perf::{Events, PerfBufferError, PerfEventArray, PerfEventArrayBuffer},
MapData, MapError, PinError,
perf::{Events, PerfBufferError, PerfEventArray, PerfEventArrayBuffer},
};
/// A `Future` based map that can be used to receive events from eBPF programs using the linux

@ -15,7 +15,7 @@ use thiserror::Error;
use crate::{
maps::MMap,
sys::{perf_event_ioctl, perf_event_open_bpf, PerfEventIoctlRequest, SyscallError},
sys::{PerfEventIoctlRequest, SyscallError, perf_event_ioctl, perf_event_open_bpf},
};
/// Perf buffer error.
@ -270,7 +270,7 @@ mod tests {
use assert_matches::assert_matches;
use super::*;
use crate::sys::{override_syscall, Syscall, TEST_MMAP_RET};
use crate::sys::{Syscall, TEST_MMAP_RET, override_syscall};
#[repr(C)]
#[derive(Debug)]

@ -13,8 +13,8 @@ use bytes::BytesMut;
use crate::{
maps::{
perf::{Events, PerfBuffer, PerfBufferError},
MapData, MapError, PinError,
perf::{Events, PerfBuffer, PerfBufferError},
},
sys::bpf_map_update_elem,
util::page_size,

@ -6,9 +6,9 @@ use std::{
};
use crate::{
maps::{check_kv_size, MapData, MapError},
sys::{bpf_map_lookup_and_delete_elem, bpf_map_push_elem, SyscallError},
Pod,
maps::{MapData, MapError, check_kv_size},
sys::{SyscallError, bpf_map_lookup_and_delete_elem, bpf_map_push_elem},
};
/// A FIFO queue.

@ -312,11 +312,11 @@ impl ProducerData {
}
fn next<'a>(&'a mut self, consumer: &'a mut ConsumerPos) -> Option<RingBufItem<'a>> {
let Self {
let &mut Self {
ref mmap,
data_offset,
pos_cache,
mask,
ref mut data_offset,
ref mut pos_cache,
ref mut mask,
} = self;
let pos = unsafe { mmap.ptr.cast().as_ref() };
let mmap_data = mmap.as_ref();

@ -5,12 +5,12 @@ use std::{
};
use crate::{
Pod,
maps::{
check_kv_size, hash_map, sock::SockMapFd, IterableMap, MapData, MapError, MapFd, MapIter,
MapKeys,
IterableMap, MapData, MapError, MapFd, MapIter, MapKeys, check_kv_size, hash_map,
sock::SockMapFd,
},
sys::{bpf_map_lookup_elem, SyscallError},
Pod,
sys::{SyscallError, bpf_map_lookup_elem},
};
/// A hash map of TCP or UDP sockets.

@ -6,8 +6,8 @@ use std::{
};
use crate::{
maps::{check_bounds, check_kv_size, sock::SockMapFd, MapData, MapError, MapFd, MapKeys},
sys::{bpf_map_delete_elem, bpf_map_update_elem, SyscallError},
maps::{MapData, MapError, MapFd, MapKeys, check_bounds, check_kv_size, sock::SockMapFd},
sys::{SyscallError, bpf_map_delete_elem, bpf_map_update_elem},
};
/// An array of TCP or UDP sockets.

@ -6,9 +6,9 @@ use std::{
};
use crate::{
maps::{check_kv_size, MapData, MapError},
sys::{bpf_map_lookup_and_delete_elem, bpf_map_update_elem, SyscallError},
Pod,
maps::{MapData, MapError, check_kv_size},
sys::{SyscallError, bpf_map_lookup_and_delete_elem, bpf_map_update_elem},
};
/// A LIFO stack.

@ -11,7 +11,7 @@ use std::{
use crate::{
maps::{IterableMap, MapData, MapError, MapIter, MapKeys},
sys::{bpf_map_delete_elem, bpf_map_lookup_elem_ptr, SyscallError},
sys::{SyscallError, bpf_map_delete_elem, bpf_map_lookup_elem_ptr},
};
/// A hash map of kernel or user space stack traces.

@ -10,10 +10,10 @@ use aya_obj::generated::bpf_cpumap_val;
use super::XdpMapError;
use crate::{
maps::{check_bounds, check_kv_size, IterableMap, MapData, MapError},
FEATURES, Pod,
maps::{IterableMap, MapData, MapError, check_bounds, check_kv_size},
programs::ProgramFd,
sys::{bpf_map_lookup_elem, bpf_map_update_elem, SyscallError},
Pod, FEATURES,
sys::{SyscallError, bpf_map_lookup_elem, bpf_map_update_elem},
};
/// An array of available CPUs.

@ -10,10 +10,10 @@ use aya_obj::generated::bpf_devmap_val;
use super::XdpMapError;
use crate::{
maps::{check_bounds, check_kv_size, IterableMap, MapData, MapError},
FEATURES, Pod,
maps::{IterableMap, MapData, MapError, check_bounds, check_kv_size},
programs::ProgramFd,
sys::{bpf_map_lookup_elem, bpf_map_update_elem, SyscallError},
Pod, FEATURES,
sys::{SyscallError, bpf_map_lookup_elem, bpf_map_update_elem},
};
/// An array of network devices.

@ -8,12 +8,12 @@ use std::{
use aya_obj::generated::bpf_devmap_val;
use super::{dev_map::DevMapValue, XdpMapError};
use super::{XdpMapError, dev_map::DevMapValue};
use crate::{
maps::{check_kv_size, hash_map, IterableMap, MapData, MapError, MapIter, MapKeys},
programs::ProgramFd,
sys::{bpf_map_lookup_elem, SyscallError},
FEATURES,
maps::{IterableMap, MapData, MapError, MapIter, MapKeys, check_kv_size, hash_map},
programs::ProgramFd,
sys::{SyscallError, bpf_map_lookup_elem},
};
/// An hashmap of network devices.

@ -6,8 +6,8 @@ use std::{
};
use crate::{
maps::{check_bounds, check_kv_size, MapData, MapError},
sys::{bpf_map_update_elem, SyscallError},
maps::{MapData, MapError, check_bounds, check_kv_size},
sys::{SyscallError, bpf_map_update_elem},
};
/// An array of AF_XDP sockets.

@ -8,10 +8,10 @@ use aya_obj::generated::{
use crate::{
programs::{
bpf_prog_get_fd_by_id, define_link_wrapper, id_as_key, load_program, query,
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramFd,
bpf_prog_get_fd_by_id, define_link_wrapper, id_as_key, load_program, query,
},
sys::{bpf_link_create, LinkTarget, ProgQueryTarget, SyscallError},
sys::{LinkTarget, ProgQueryTarget, SyscallError, bpf_link_create},
util::KernelVersion,
};

@ -8,13 +8,13 @@ use aya_obj::generated::{
};
use crate::{
VerifierLogLevel,
programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link,
ProgAttachLink, ProgramData, ProgramError,
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program,
},
sys::{bpf_link_create, LinkTarget, SyscallError},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
VerifierLogLevel,
};
/// A program used to inspect or filter network activity for a given cgroup.

@ -6,13 +6,13 @@ use aya_obj::generated::bpf_prog_type::BPF_PROG_TYPE_CGROUP_SOCK;
pub use aya_obj::programs::CgroupSockAttachType;
use crate::{
VerifierLogLevel,
programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link,
ProgAttachLink, ProgramData, ProgramError,
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program,
},
sys::{bpf_link_create, LinkTarget, SyscallError},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
VerifierLogLevel,
};
/// A program that is called on socket creation, bind and release.

@ -6,13 +6,13 @@ use aya_obj::generated::bpf_prog_type::BPF_PROG_TYPE_CGROUP_SOCK_ADDR;
pub use aya_obj::programs::CgroupSockAddrAttachType;
use crate::{
VerifierLogLevel,
programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link,
ProgAttachLink, ProgramData, ProgramError,
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program,
},
sys::{bpf_link_create, LinkTarget, SyscallError},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
VerifierLogLevel,
};
/// A program that can be used to inspect or modify socket addresses (`struct sockaddr`).

@ -6,13 +6,13 @@ use aya_obj::generated::bpf_prog_type::BPF_PROG_TYPE_CGROUP_SOCKOPT;
pub use aya_obj::programs::CgroupSockoptAttachType;
use crate::{
VerifierLogLevel,
programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link,
ProgAttachLink, ProgramData, ProgramError,
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program,
},
sys::{bpf_link_create, LinkTarget, SyscallError},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
VerifierLogLevel,
};
/// A program that can be used to get or set options on sockets.

@ -8,10 +8,10 @@ use aya_obj::generated::{
use crate::{
programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link,
ProgAttachLink, ProgramData, ProgramError,
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
define_link_wrapper, id_as_key, load_program,
},
sys::{bpf_link_create, LinkTarget, SyscallError},
sys::{LinkTarget, SyscallError, bpf_link_create},
util::KernelVersion,
};

@ -10,11 +10,11 @@ use object::Endianness;
use thiserror::Error;
use crate::{
Btf,
programs::{
define_link_wrapper, load_program, FdLink, FdLinkId, ProgramData, ProgramError, ProgramFd,
FdLink, FdLinkId, ProgramData, ProgramError, ProgramFd, define_link_wrapper, load_program,
},
sys::{self, bpf_link_create, BpfLinkCreateArgs, LinkTarget, SyscallError},
Btf,
sys::{self, BpfLinkCreateArgs, LinkTarget, SyscallError, bpf_link_create},
};
/// The type returned when loading or attaching an [`Extension`] fails.

@ -6,8 +6,8 @@ use aya_obj::{
};
use crate::programs::{
define_link_wrapper, load_program, utils::attach_raw_tracepoint, FdLink, FdLinkId, ProgramData,
ProgramError,
FdLink, FdLinkId, ProgramData, ProgramError, define_link_wrapper, load_program,
utils::attach_raw_tracepoint,
};
/// A program that can be attached to the entry point of (almost) any kernel

@ -6,8 +6,8 @@ use aya_obj::{
};
use crate::programs::{
define_link_wrapper, load_program, utils::attach_raw_tracepoint, FdLink, FdLinkId, ProgramData,
ProgramError,
FdLink, FdLinkId, ProgramData, ProgramError, define_link_wrapper, load_program,
utils::attach_raw_tracepoint,
};
/// A program that can be attached to the exit point of (almost) anny kernel

@ -10,15 +10,15 @@ use std::{
use aya_obj::generated::{bpf_prog_info, bpf_prog_type};
use super::{
utils::{boot_time, get_fdinfo},
ProgramError, ProgramFd,
utils::{boot_time, get_fdinfo},
};
use crate::{
FEATURES,
sys::{
bpf_get_object, bpf_prog_get_fd_by_id, bpf_prog_get_info_by_fd, iter_prog_ids, SyscallError,
SyscallError, bpf_get_object, bpf_prog_get_fd_by_id, bpf_prog_get_info_by_fd, iter_prog_ids,
},
util::bytes_of_bpf_name,
FEATURES,
};
/// Provides metadata information about a loaded eBPF program.

@ -14,10 +14,10 @@ use aya_obj::{
use crate::{
programs::{
define_link_wrapper, load_program, FdLink, LinkError, PerfLinkIdInner, PerfLinkInner,
ProgramData, ProgramError,
FdLink, LinkError, PerfLinkIdInner, PerfLinkInner, ProgramData, ProgramError,
define_link_wrapper, load_program,
},
sys::{bpf_create_iter, bpf_link_create, bpf_link_get_info_by_fd, LinkTarget, SyscallError},
sys::{LinkTarget, SyscallError, bpf_create_iter, bpf_link_create, bpf_link_get_info_by_fd},
};
/// A BPF iterator which allows to dump data from the kernel-space into the

@ -10,14 +10,13 @@ use aya_obj::generated::{bpf_link_type, bpf_prog_type::BPF_PROG_TYPE_KPROBE};
use thiserror::Error;
use crate::{
VerifierLogLevel,
programs::{
define_link_wrapper, load_program,
FdLink, LinkError, ProgramData, ProgramError, define_link_wrapper, load_program,
perf_attach::{PerfLinkIdInner, PerfLinkInner},
probe::{attach, ProbeKind},
FdLink, LinkError, ProgramData, ProgramError,
probe::{ProbeKind, attach},
},
sys::bpf_link_get_info_by_fd,
VerifierLogLevel,
};
/// A kernel probe.

@ -7,8 +7,8 @@ use std::{
};
use aya_obj::generated::{
bpf_attach_type, BPF_F_AFTER, BPF_F_ALLOW_MULTI, BPF_F_ALLOW_OVERRIDE, BPF_F_BEFORE, BPF_F_ID,
BPF_F_LINK, BPF_F_REPLACE,
BPF_F_AFTER, BPF_F_ALLOW_MULTI, BPF_F_ALLOW_OVERRIDE, BPF_F_BEFORE, BPF_F_ID, BPF_F_LINK,
BPF_F_REPLACE, bpf_attach_type,
};
use hashbrown::hash_set::{Entry, HashSet};
use thiserror::Error;
@ -16,7 +16,7 @@ use thiserror::Error;
use crate::{
pin::PinError,
programs::{MultiProgLink, MultiProgram, ProgramError, ProgramFd, ProgramId},
sys::{bpf_get_object, bpf_pin_object, bpf_prog_attach, bpf_prog_detach, SyscallError},
sys::{SyscallError, bpf_get_object, bpf_pin_object, bpf_prog_attach, bpf_prog_detach},
};
/// A Link.

@ -7,10 +7,10 @@ use aya_obj::generated::{
use crate::{
programs::{
id_as_key, load_program, query, CgroupAttachMode, Link, ProgramData, ProgramError,
ProgramFd, ProgramInfo,
CgroupAttachMode, Link, ProgramData, ProgramError, ProgramFd, ProgramInfo, id_as_key,
load_program, query,
},
sys::{bpf_prog_attach, bpf_prog_detach, bpf_prog_get_fd_by_id, ProgQueryTarget},
sys::{ProgQueryTarget, bpf_prog_attach, bpf_prog_detach, bpf_prog_get_fd_by_id},
};
/// A program used to decode IR into key events for a lirc device.

@ -6,8 +6,8 @@ use aya_obj::{
};
use crate::programs::{
define_link_wrapper, load_program, utils::attach_raw_tracepoint, FdLink, FdLinkId, ProgramData,
ProgramError,
FdLink, FdLinkId, ProgramData, ProgramError, define_link_wrapper, load_program,
utils::attach_raw_tracepoint,
};
/// A program that attaches to Linux LSM hooks. Used to implement security policy and

@ -79,12 +79,12 @@ use std::{
};
use aya_obj::{
VerifierLog,
btf::BtfError,
generated::{bpf_attach_type, bpf_link_info, bpf_prog_info, bpf_prog_type},
VerifierLog,
};
use info::impl_info;
pub use info::{loaded_programs, ProgramInfo, ProgramType};
pub use info::{ProgramInfo, ProgramType, loaded_programs};
use libc::ENOSPC;
use tc::SchedClassifierLink;
use thiserror::Error;
@ -120,17 +120,17 @@ pub use crate::programs::{
xdp::{Xdp, XdpError, XdpFlags},
};
use crate::{
VerifierLogLevel,
maps::MapError,
pin::PinError,
programs::{links::*, perf_attach::*},
sys::{
bpf_btf_get_fd_by_id, bpf_get_object, bpf_link_get_fd_by_id, bpf_link_get_info_by_fd,
bpf_load_program, bpf_pin_object, bpf_prog_get_fd_by_id, bpf_prog_query, iter_link_ids,
retry_with_verifier_logs, EbpfLoadProgramAttrs, NetlinkError, ProgQueryTarget,
SyscallError,
EbpfLoadProgramAttrs, NetlinkError, ProgQueryTarget, SyscallError, bpf_btf_get_fd_by_id,
bpf_get_object, bpf_link_get_fd_by_id, bpf_link_get_info_by_fd, bpf_load_program,
bpf_pin_object, bpf_prog_get_fd_by_id, bpf_prog_query, iter_link_ids,
retry_with_verifier_logs,
},
util::KernelVersion,
VerifierLogLevel,
};
/// Error type returned when working with programs.

@ -7,16 +7,15 @@ use std::{
use aya_obj::generated::bpf_attach_type::BPF_PERF_EVENT;
use crate::{
FEATURES,
programs::{
id_as_key,
probe::{detach_debug_fs, ProbeEvent},
FdLink, Link, ProgramError,
FdLink, Link, ProgramError, id_as_key,
probe::{ProbeEvent, detach_debug_fs},
},
sys::{
bpf_link_create, is_bpf_cookie_supported, perf_event_ioctl, BpfLinkCreateArgs, LinkTarget,
PerfEventIoctlRequest, SyscallError,
BpfLinkCreateArgs, LinkTarget, PerfEventIoctlRequest, SyscallError, bpf_link_create,
is_bpf_cookie_supported, perf_event_ioctl,
},
FEATURES,
};
#[derive(Debug, Hash, Eq, PartialEq)]

@ -16,12 +16,12 @@ pub use aya_obj::generated::{
use crate::{
programs::{
FdLink, LinkError, ProgramData, ProgramError,
links::define_link_wrapper,
load_program, perf_attach,
perf_attach::{PerfLinkIdInner, PerfLinkInner},
FdLink, LinkError, ProgramData, ProgramError,
},
sys::{bpf_link_get_info_by_fd, perf_event_open, SyscallError},
sys::{SyscallError, bpf_link_get_info_by_fd, perf_event_open},
};
/// The type of perf event

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save