Bump edition to 2024

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

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

@ -52,7 +52,8 @@ authors = ["Aya Contributors"]
license = "MIT OR Apache-2.0" 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 {
@ -146,7 +146,7 @@ pub(crate) fn log(args: LogArgs, level: Option<TokenStream>) -> Result<TokenStre
let slice = Ident::new("slice", Span::mixed_site()); let slice = Ident::new("slice", Span::mixed_site());
let record = Ident::new("record", Span::mixed_site()); let record = Ident::new("record", Span::mixed_site());
Ok(quote! { Ok(quote! {
match unsafe { &mut ::aya_log_ebpf::AYA_LOG_BUF }.get_ptr_mut(0).and_then(|ptr| unsafe { ptr.as_mut() }) { match ::aya_log_ebpf::AYA_LOG_BUF.get_ptr_mut(0).and_then(|ptr| unsafe { ptr.as_mut() }) {
None => {}, None => {},
Some(::aya_log_ebpf::LogBuf { buf }) => { Some(::aya_log_ebpf::LogBuf { buf }) => {
let _: Option<()> = (|| { let _: Option<()> = (|| {
@ -166,7 +166,7 @@ pub(crate) fn log(args: LogArgs, level: Option<TokenStream>) -> Result<TokenStre
#size += #len.get(); #size += #len.get();
)* )*
let #record = buf.get(..#size)?; let #record = buf.get(..#size)?;
unsafe { &mut ::aya_log_ebpf::AYA_LOGS }.output(#ctx, #record, 0); ::aya_log_ebpf::AYA_LOGS.output(#ctx, #record, 0);
Some(()) Some(())
})(); })();
} }

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

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

@ -5,11 +5,11 @@ description = "An eBPF library with a focus on developer experience and operabil
keywords = ["bpf", "ebpf", "kernel", "linux"] 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"))))]
@ -912,13 +912,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 {
@ -1005,15 +1004,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 {
@ -1072,7 +1071,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

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

Loading…
Cancel
Save