Bump edition to 2024

This seems to reveal that the way we generated BPF programs (with
mutable statics) is always going to trip `static_mut_refs`, which is now
deny-by-default. See [static-mut-references].

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

[static-mut-references]: https://doc.rust-lang.org/nightly/edition-guide/rust-2024/static-mut-references.html
reviewable/pr1194/r3
Tamir Duberstein 3 months ago
parent 38d6305868
commit 3ddbf5bd83
No known key found for this signature in database

@ -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 {

@ -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

@ -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"))))]
@ -916,13 +916,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 {
@ -1009,15 +1008,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 {
@ -1076,7 +1075,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

@ -13,11 +13,11 @@ use libc::pid_t;
use crate::{
programs::{
kprobe::KProbeError, perf_attach, perf_attach::PerfLinkInner, perf_attach_debugfs,
trace_point::read_sys_fs_trace_point_id, uprobe::UProbeError, utils::find_tracefs_path,
Link, ProgramData, ProgramError,
Link, ProgramData, ProgramError, kprobe::KProbeError, perf_attach,
perf_attach::PerfLinkInner, perf_attach_debugfs, trace_point::read_sys_fs_trace_point_id,
uprobe::UProbeError, utils::find_tracefs_path,
},
sys::{perf_event_open_probe, perf_event_open_trace_point, SyscallError},
sys::{SyscallError, perf_event_open_probe, perf_event_open_trace_point},
util::KernelVersion,
};

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

Loading…
Cancel
Save