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" license = "MIT OR Apache-2.0"
repository = "https://github.com/aya-rs/aya" repository = "https://github.com/aya-rs/aya"
homepage = "https://aya-rs.dev" 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 # 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 # unused crates defined in this section. It would be nice to teach either of

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

@ -5,7 +5,7 @@ use std::{
process::{Child, Command, Stdio}, 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. // Re-export `cargo_metadata` to having to encode the version downstream and risk mismatches.
pub use cargo_metadata; pub use cargo_metadata;
use cargo_metadata::{Artifact, CompilerMessage, Message, Package, Target}; use cargo_metadata::{Artifact, CompilerMessage, Message, Package, Target};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -1,11 +1,11 @@
use aya_log_common::DisplayHint; use aya_log_common::DisplayHint;
use aya_log_parser::{parse, Fragment}; use aya_log_parser::{Fragment, parse};
use proc_macro2::{Ident, Span, TokenStream}; use proc_macro2::{Ident, Span, TokenStream};
use quote::quote; use quote::quote;
use syn::{ use syn::{
Error, Expr, LitStr, Result, Token,
parse::{Parse, ParseStream}, parse::{Parse, ParseStream},
punctuated::Punctuated, punctuated::Punctuated,
Error, Expr, LitStr, Result, Token,
}; };
pub(crate) struct LogArgs { pub(crate) struct LogArgs {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -72,7 +72,13 @@ extern crate alloc;
extern crate std; extern crate std;
pub mod btf; 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 generated;
pub mod links; pub mod links;
pub mod maps; pub mod maps;

@ -1,8 +1,8 @@
//! Link type bindings. //! Link type bindings.
use crate::{ use crate::{
generated::{bpf_attach_type, bpf_link_type},
InvalidTypeBinding, InvalidTypeBinding,
generated::{bpf_attach_type, bpf_link_type},
}; };
impl TryFrom<u32> for 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 log::debug;
use object::{ use object::{
read::{Object as ElfObject, ObjectSection, Section as ObjSection},
Endianness, ObjectSymbol, ObjectSymbolTable, RelocationTarget, SectionIndex, SectionKind, Endianness, ObjectSymbol, ObjectSymbolTable, RelocationTarget, SectionIndex, SectionKind,
SymbolKind, SymbolKind,
read::{Object as ElfObject, ObjectSection, Section as ObjSection},
}; };
use crate::{ use crate::{
@ -22,10 +22,10 @@ use crate::{
Array, Btf, BtfError, BtfExt, BtfFeatures, BtfType, DataSecEntry, FuncSecInfo, LineSecInfo, Array, Btf, BtfError, BtfExt, BtfFeatures, BtfType, DataSecEntry, FuncSecInfo, LineSecInfo,
}, },
generated::{ generated::{
bpf_func_id::*, bpf_insn, bpf_map_info, bpf_map_type::BPF_MAP_TYPE_ARRAY, BPF_CALL, BPF_CALL, BPF_F_RDONLY_PROG, BPF_JMP, BPF_K, bpf_func_id::*, bpf_insn, bpf_map_info,
BPF_F_RDONLY_PROG, BPF_JMP, BPF_K, 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::{ programs::{
CgroupSockAddrAttachType, CgroupSockAttachType, CgroupSockoptAttachType, XdpAttachType, CgroupSockAddrAttachType, CgroupSockAttachType, CgroupSockoptAttachType, XdpAttachType,
}, },
@ -326,7 +326,7 @@ impl FromStr for ProgramSection {
Some(_) => { Some(_) => {
return Err(ParseError::InvalidProgramSection { return Err(ParseError::InvalidProgramSection {
section: section.to_owned(), section: section.to_owned(),
}) });
} }
}, },
}, },
@ -342,7 +342,7 @@ impl FromStr for ProgramSection {
_ => { _ => {
return Err(ParseError::InvalidProgramSection { return Err(ParseError::InvalidProgramSection {
section: section.to_owned(), section: section.to_owned(),
}) });
} }
} }
} }
@ -356,7 +356,7 @@ impl FromStr for ProgramSection {
_ => { _ => {
return Err(ParseError::InvalidProgramSection { return Err(ParseError::InvalidProgramSection {
section: section.to_owned(), section: section.to_owned(),
}) });
} }
} }
} }
@ -446,7 +446,7 @@ impl FromStr for ProgramSection {
_ => { _ => {
return Err(ParseError::InvalidProgramSection { return Err(ParseError::InvalidProgramSection {
section: section.to_owned(), section: section.to_owned(),
}) });
} }
}) })
} }
@ -1150,7 +1150,7 @@ fn parse_version(data: &[u8], endianness: object::Endianness) -> Result<Option<u
_ => { _ => {
return Err(ParseError::InvalidKernelVersion { return Err(ParseError::InvalidKernelVersion {
data: data.to_vec(), data: data.to_vec(),
}) });
} }
}; };
@ -1175,7 +1175,7 @@ fn get_map_field(btf: &Btf, type_id: u32) -> Result<u32, BtfError> {
other => { other => {
return Err(BtfError::UnexpectedBtfType { return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0), type_id: other.btf_type().unwrap_or(0),
}) });
} }
}; };
// Safety: union // Safety: union
@ -1184,7 +1184,7 @@ fn get_map_field(btf: &Btf, type_id: u32) -> Result<u32, BtfError> {
other => { other => {
return Err(BtfError::UnexpectedBtfType { return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0), type_id: other.btf_type().unwrap_or(0),
}) });
} }
}; };
Ok(arr.len) Ok(arr.len)
@ -1260,7 +1260,7 @@ fn parse_btf_map_def(btf: &Btf, info: &DataSecEntry) -> Result<(String, BtfMapDe
other => { other => {
return Err(BtfError::UnexpectedBtfType { return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0), type_id: other.btf_type().unwrap_or(0),
}) });
} }
}; };
let map_name = btf.string_at(ty.name_offset)?; 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 => { other => {
return Err(BtfError::UnexpectedBtfType { return Err(BtfError::UnexpectedBtfType {
type_id: other.btf_type().unwrap_or(0), type_id: other.btf_type().unwrap_or(0),
}) });
} }
}; };

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

@ -7,14 +7,14 @@ use log::debug;
use object::{SectionIndex, SymbolKind}; use object::{SectionIndex, SymbolKind};
use crate::{ use crate::{
EbpfSectionKind,
generated::{ generated::{
bpf_insn, BPF_CALL, BPF_JMP, BPF_K, BPF_PSEUDO_CALL, BPF_PSEUDO_FUNC, BPF_PSEUDO_MAP_FD, BPF_CALL, BPF_JMP, BPF_K, BPF_PSEUDO_CALL, BPF_PSEUDO_FUNC, BPF_PSEUDO_MAP_FD,
BPF_PSEUDO_MAP_VALUE, BPF_PSEUDO_MAP_VALUE, bpf_insn,
}, },
maps::Map, maps::Map,
obj::{Function, Object}, obj::{Function, Object},
util::{HashMap, HashSet}, util::{HashMap, HashSet},
EbpfSectionKind,
}; };
#[cfg(feature = "std")] #[cfg(feature = "std")]
@ -67,7 +67,9 @@ pub enum RelocationError {
}, },
/// Unknown function /// 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 { UnknownProgram {
/// The function section index /// The function section index
section_index: usize, section_index: usize,

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

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

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

@ -1,5 +1,5 @@
use std::{ use std::{
fs::{create_dir_all, File}, fs::{File, create_dir_all},
io::{self, Write}, io::{self, Write},
path::Path, path::Path,
}; };
@ -8,7 +8,7 @@ pub mod bindgen;
pub mod generate; pub mod generate;
pub mod rustfmt; 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> { pub fn write_to_file<T: AsRef<Path>>(path: T, code: &str) -> Result<(), io::Error> {
// Create parent directories if they don't exist already // 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"] keywords = ["bpf", "ebpf", "kernel", "linux"]
readme = "README.md" readme = "README.md"
documentation = "https://docs.rs/aya" documentation = "https://docs.rs/aya"
rust-version = "1.80.0"
authors.workspace = true authors.workspace = true
license.workspace = true license.workspace = true
repository.workspace = true repository.workspace = true
homepage.workspace = true homepage.workspace = true
rust-version.workspace = true
edition.workspace = true edition.workspace = true
[dependencies] [dependencies]

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

@ -54,10 +54,6 @@
missing_docs, missing_docs,
non_ascii_idents, non_ascii_idents,
noop_method_call, 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, single_use_lifetimes,
trivial_numeric_casts, trivial_numeric_casts,
unreachable_pub, unreachable_pub,
@ -176,7 +172,7 @@ impl AsRawFd for MockableFd {
impl FromRawFd for MockableFd { impl FromRawFd for MockableFd {
unsafe fn from_raw_fd(fd: RawFd) -> Self { 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) Self::from_fd(fd)
} }
} }

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

@ -5,9 +5,9 @@ use std::{
}; };
use crate::{ 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, 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. /// A per-CPU fixed-size array.

@ -6,9 +6,9 @@ use std::{
}; };
use crate::{ use crate::{
maps::{check_bounds, check_kv_size, MapData, MapError, MapKeys}, maps::{MapData, MapError, MapKeys, check_bounds, check_kv_size},
programs::ProgramFd, 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. /// An array of eBPF program file descriptors used as a jump table.

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

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

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

@ -6,11 +6,11 @@ use std::{
}; };
use crate::{ use crate::{
Pod,
maps::{ 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}, sys::{SyscallError, bpf_map_lookup_elem_per_cpu, bpf_map_update_elem_per_cpu},
Pod,
}; };
/// Similar to [`HashMap`](crate::maps::HashMap) but each CPU holds a separate value for a given key. Typically used to /// 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 super::*;
use crate::{ use crate::{
maps::{test_utils, Map}, maps::{Map, test_utils},
sys::{override_syscall, SysResult}, sys::{SysResult, override_syscall},
}; };
fn sys_error(value: i32) -> SysResult { 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 super::{MapError, MapFd};
use crate::{ use crate::{
FEATURES,
sys::{ 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, util::bytes_of_bpf_name,
FEATURES,
}; };
/// Provides Provides metadata information about a loaded eBPF map. /// Provides Provides metadata information about a loaded eBPF map.
@ -394,7 +394,7 @@ impl TryFrom<bpf_map_type> for MapType {
__MAX_BPF_MAP_TYPE => { __MAX_BPF_MAP_TYPE => {
return Err(MapError::InvalidMapType { return Err(MapError::InvalidMapType {
map_type: map_type as u32, map_type: map_type as u32,
}) });
} }
}) })
} }

@ -6,9 +6,9 @@ use std::{
}; };
use crate::{ 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, 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. /// A Longest Prefix Match Trie.
@ -202,10 +202,10 @@ mod tests {
use super::*; use super::*;
use crate::{ use crate::{
maps::{ maps::{
test_utils::{self, new_map},
Map, Map,
test_utils::{self, new_map},
}, },
sys::{override_syscall, SysResult, Syscall}, sys::{SysResult, Syscall, override_syscall},
}; };
fn new_obj_map() -> aya_obj::Map { fn new_obj_map() -> aya_obj::Map {

@ -59,21 +59,21 @@ use std::{
ptr, 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::{ 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 log::warn;
use thiserror::Error; use thiserror::Error;
use crate::{ use crate::{
PinningType, Pod,
pin::PinError, pin::PinError,
sys::{ sys::{
bpf_create_map, bpf_get_object, bpf_map_freeze, bpf_map_get_fd_by_id, bpf_map_get_next_key, SyscallError, bpf_create_map, bpf_get_object, bpf_map_freeze, bpf_map_get_fd_by_id,
bpf_map_update_elem_ptr, bpf_pin_object, mmap, munmap, SyscallError, bpf_map_get_next_key, bpf_map_update_elem_ptr, bpf_pin_object, mmap, munmap,
}, },
util::{nr_cpus, KernelVersion}, util::{KernelVersion, nr_cpus},
PinningType, Pod,
}; };
pub mod array; pub mod array;
@ -92,7 +92,7 @@ pub mod xdp;
pub use array::{Array, PerCpuArray, ProgramArray}; pub use array::{Array, PerCpuArray, ProgramArray};
pub use bloom_filter::BloomFilter; pub use bloom_filter::BloomFilter;
pub use hash_map::{HashMap, PerCpuHashMap}; 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; pub use lpm_trie::LpmTrie;
#[cfg(any(feature = "async_tokio", feature = "async_std"))] #[cfg(any(feature = "async_tokio", feature = "async_std"))]
#[cfg_attr(docsrs, doc(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 { pub(crate) unsafe fn from_kernel_mem(mem: PerCpuKernelMem) -> Self {
let mem_ptr = mem.bytes.as_ptr() as usize; let stride = (mem::size_of::<T>() + 7) & !7;
let value_size = (mem::size_of::<T>() + 7) & !7;
let mut values = Vec::new(); let mut values = Vec::new();
let mut offset = 0; let mut offset = 0;
while offset < mem.bytes.len() { while offset < mem.bytes.len() {
values.push(ptr::read_unaligned((mem_ptr + offset) as *const _)); values.push(unsafe { ptr::read_unaligned(mem.bytes.as_ptr().add(offset).cast()) });
offset += value_size; offset += stride;
} }
Self { Self {
@ -1009,15 +1008,15 @@ impl Drop for MMap {
#[cfg(test)] #[cfg(test)]
mod test_utils { mod test_utils {
use aya_obj::{ use aya_obj::{
EbpfSectionKind,
generated::{bpf_cmd, bpf_map_type}, generated::{bpf_cmd, bpf_map_type},
maps::LegacyMap, maps::LegacyMap,
EbpfSectionKind,
}; };
use crate::{ use crate::{
bpf_map_def, bpf_map_def,
maps::MapData, maps::MapData,
sys::{override_syscall, Syscall}, sys::{Syscall, override_syscall},
}; };
pub(super) fn new_map(obj: aya_obj::Map) -> MapData { pub(super) fn new_map(obj: aya_obj::Map) -> MapData {
@ -1076,7 +1075,7 @@ mod tests {
use libc::EFAULT; use libc::EFAULT;
use super::*; use super::*;
use crate::sys::{override_syscall, Syscall}; use crate::sys::{Syscall, override_syscall};
fn new_obj_map() -> aya_obj::Map { fn new_obj_map() -> aya_obj::Map {
test_utils::new_obj_map::<u32>(bpf_map_type::BPF_MAP_TYPE_HASH) 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 tokio::io::unix::AsyncFd;
use crate::maps::{ use crate::maps::{
perf::{Events, PerfBufferError, PerfEventArray, PerfEventArrayBuffer},
MapData, MapError, PinError, 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 /// 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::{ use crate::{
maps::MMap, 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. /// Perf buffer error.
@ -270,7 +270,7 @@ mod tests {
use assert_matches::assert_matches; use assert_matches::assert_matches;
use super::*; use super::*;
use crate::sys::{override_syscall, Syscall, TEST_MMAP_RET}; use crate::sys::{Syscall, TEST_MMAP_RET, override_syscall};
#[repr(C)] #[repr(C)]
#[derive(Debug)] #[derive(Debug)]

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

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

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

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

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

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

@ -11,7 +11,7 @@ use std::{
use crate::{ use crate::{
maps::{IterableMap, MapData, MapError, MapIter, MapKeys}, 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. /// 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 super::XdpMapError;
use crate::{ use crate::{
maps::{check_bounds, check_kv_size, IterableMap, MapData, MapError}, FEATURES, Pod,
maps::{IterableMap, MapData, MapError, check_bounds, check_kv_size},
programs::ProgramFd, programs::ProgramFd,
sys::{bpf_map_lookup_elem, bpf_map_update_elem, SyscallError}, sys::{SyscallError, bpf_map_lookup_elem, bpf_map_update_elem},
Pod, FEATURES,
}; };
/// An array of available CPUs. /// An array of available CPUs.

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

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

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

@ -8,10 +8,10 @@ use aya_obj::generated::{
use crate::{ use crate::{
programs::{ programs::{
bpf_prog_get_fd_by_id, define_link_wrapper, id_as_key, load_program, query,
CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError, ProgramFd, 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, util::KernelVersion,
}; };

@ -8,13 +8,13 @@ use aya_obj::generated::{
}; };
use crate::{ use crate::{
VerifierLogLevel,
programs::{ programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link, CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
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, util::KernelVersion,
VerifierLogLevel,
}; };
/// A program used to inspect or filter network activity for a given cgroup. /// 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; pub use aya_obj::programs::CgroupSockAttachType;
use crate::{ use crate::{
VerifierLogLevel,
programs::{ programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link, CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
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, util::KernelVersion,
VerifierLogLevel,
}; };
/// A program that is called on socket creation, bind and release. /// 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; pub use aya_obj::programs::CgroupSockAddrAttachType;
use crate::{ use crate::{
VerifierLogLevel,
programs::{ programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link, CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
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, util::KernelVersion,
VerifierLogLevel,
}; };
/// A program that can be used to inspect or modify socket addresses (`struct sockaddr`). /// 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; pub use aya_obj::programs::CgroupSockoptAttachType;
use crate::{ use crate::{
VerifierLogLevel,
programs::{ programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link, CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
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, util::KernelVersion,
VerifierLogLevel,
}; };
/// A program that can be used to get or set options on sockets. /// A program that can be used to get or set options on sockets.

@ -8,10 +8,10 @@ use aya_obj::generated::{
use crate::{ use crate::{
programs::{ programs::{
define_link_wrapper, id_as_key, load_program, CgroupAttachMode, FdLink, Link, CgroupAttachMode, FdLink, Link, ProgAttachLink, ProgramData, ProgramError,
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, util::KernelVersion,
}; };

@ -10,11 +10,11 @@ use object::Endianness;
use thiserror::Error; use thiserror::Error;
use crate::{ use crate::{
Btf,
programs::{ 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}, sys::{self, BpfLinkCreateArgs, LinkTarget, SyscallError, bpf_link_create},
Btf,
}; };
/// The type returned when loading or attaching an [`Extension`] fails. /// The type returned when loading or attaching an [`Extension`] fails.

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

@ -6,8 +6,8 @@ use aya_obj::{
}; };
use crate::programs::{ use crate::programs::{
define_link_wrapper, load_program, utils::attach_raw_tracepoint, FdLink, FdLinkId, ProgramData, FdLink, FdLinkId, ProgramData, ProgramError, define_link_wrapper, load_program,
ProgramError, utils::attach_raw_tracepoint,
}; };
/// A program that can be attached to the exit point of (almost) anny kernel /// 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 aya_obj::generated::{bpf_prog_info, bpf_prog_type};
use super::{ use super::{
utils::{boot_time, get_fdinfo},
ProgramError, ProgramFd, ProgramError, ProgramFd,
utils::{boot_time, get_fdinfo},
}; };
use crate::{ use crate::{
FEATURES,
sys::{ 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, util::bytes_of_bpf_name,
FEATURES,
}; };
/// Provides metadata information about a loaded eBPF program. /// Provides metadata information about a loaded eBPF program.

@ -14,10 +14,10 @@ use aya_obj::{
use crate::{ use crate::{
programs::{ programs::{
define_link_wrapper, load_program, FdLink, LinkError, PerfLinkIdInner, PerfLinkInner, FdLink, LinkError, PerfLinkIdInner, PerfLinkInner, ProgramData, ProgramError,
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 /// 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 thiserror::Error;
use crate::{ use crate::{
VerifierLogLevel,
programs::{ programs::{
define_link_wrapper, load_program, FdLink, LinkError, ProgramData, ProgramError, define_link_wrapper, load_program,
perf_attach::{PerfLinkIdInner, PerfLinkInner}, perf_attach::{PerfLinkIdInner, PerfLinkInner},
probe::{attach, ProbeKind}, probe::{ProbeKind, attach},
FdLink, LinkError, ProgramData, ProgramError,
}, },
sys::bpf_link_get_info_by_fd, sys::bpf_link_get_info_by_fd,
VerifierLogLevel,
}; };
/// A kernel probe. /// A kernel probe.

@ -7,8 +7,8 @@ use std::{
}; };
use aya_obj::generated::{ 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_AFTER, BPF_F_ALLOW_MULTI, BPF_F_ALLOW_OVERRIDE, BPF_F_BEFORE, BPF_F_ID, BPF_F_LINK,
BPF_F_LINK, BPF_F_REPLACE, BPF_F_REPLACE, bpf_attach_type,
}; };
use hashbrown::hash_set::{Entry, HashSet}; use hashbrown::hash_set::{Entry, HashSet};
use thiserror::Error; use thiserror::Error;
@ -16,7 +16,7 @@ use thiserror::Error;
use crate::{ use crate::{
pin::PinError, pin::PinError,
programs::{MultiProgLink, MultiProgram, ProgramError, ProgramFd, ProgramId}, 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. /// A Link.

@ -7,10 +7,10 @@ use aya_obj::generated::{
use crate::{ use crate::{
programs::{ programs::{
id_as_key, load_program, query, CgroupAttachMode, Link, ProgramData, ProgramError, CgroupAttachMode, Link, ProgramData, ProgramError, ProgramFd, ProgramInfo, id_as_key,
ProgramFd, ProgramInfo, 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. /// A program used to decode IR into key events for a lirc device.

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

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

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

@ -16,12 +16,12 @@ pub use aya_obj::generated::{
use crate::{ use crate::{
programs::{ programs::{
FdLink, LinkError, ProgramData, ProgramError,
links::define_link_wrapper, links::define_link_wrapper,
load_program, perf_attach, load_program, perf_attach,
perf_attach::{PerfLinkIdInner, PerfLinkInner}, 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 /// The type of perf event

@ -13,11 +13,11 @@ use libc::pid_t;
use crate::{ use crate::{
programs::{ programs::{
kprobe::KProbeError, perf_attach, perf_attach::PerfLinkInner, perf_attach_debugfs, Link, ProgramData, ProgramError, kprobe::KProbeError, perf_attach,
trace_point::read_sys_fs_trace_point_id, uprobe::UProbeError, utils::find_tracefs_path, perf_attach::PerfLinkInner, perf_attach_debugfs, trace_point::read_sys_fs_trace_point_id,
Link, ProgramData, ProgramError, 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, util::KernelVersion,
}; };

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

Loading…
Cancel
Save