@ -3,7 +3,7 @@ use std::{
ffi ::{ CStr , CString } ,
ffi ::{ CStr , CString } ,
io ,
io ,
mem ::{ self , MaybeUninit } ,
mem ::{ self , MaybeUninit } ,
os ::fd ::{ FromRawFd as _ , OwnedFd , RawFd } ,
os ::fd ::{ AsRawFd, BorrowedFd , FromRawFd as _ , OwnedFd , RawFd } ,
slice ,
slice ,
} ;
} ;
@ -35,7 +35,7 @@ use crate::{
pub ( crate ) fn bpf_create_map (
pub ( crate ) fn bpf_create_map (
name : & CStr ,
name : & CStr ,
def : & obj ::Map ,
def : & obj ::Map ,
btf_fd : Option < RawFd > ,
btf_fd : Option < BorrowedFd< ' _ > > ,
kernel_version : KernelVersion ,
kernel_version : KernelVersion ,
) -> SysResult < c_long > {
) -> SysResult < c_long > {
let mut attr = unsafe { mem ::zeroed ::< bpf_attr > ( ) } ;
let mut attr = unsafe { mem ::zeroed ::< bpf_attr > ( ) } ;
@ -75,7 +75,7 @@ pub(crate) fn bpf_create_map(
_ = > {
_ = > {
u . btf_key_type_id = m . def . btf_key_type_id ;
u . btf_key_type_id = m . def . btf_key_type_id ;
u . btf_value_type_id = m . def . btf_value_type_id ;
u . btf_value_type_id = m . def . btf_value_type_id ;
u . btf_fd = btf_fd . unwrap_or_default( ) as u32 ;
u . btf_fd = btf_fd . map( | fd | fd . as_raw_fd ( ) ) . unwrap_or_default( ) as u32 ;
}
}
}
}
}
}
@ -115,7 +115,7 @@ pub(crate) struct BpfLoadProgramAttrs<'a> {
pub ( crate ) license : & ' a CStr ,
pub ( crate ) license : & ' a CStr ,
pub ( crate ) kernel_version : u32 ,
pub ( crate ) kernel_version : u32 ,
pub ( crate ) expected_attach_type : Option < bpf_attach_type > ,
pub ( crate ) expected_attach_type : Option < bpf_attach_type > ,
pub ( crate ) prog_btf_fd : Option < RawFd > ,
pub ( crate ) prog_btf_fd : Option < BorrowedFd< ' a > > ,
pub ( crate ) attach_btf_obj_fd : Option < u32 > ,
pub ( crate ) attach_btf_obj_fd : Option < u32 > ,
pub ( crate ) attach_btf_id : Option < u32 > ,
pub ( crate ) attach_btf_id : Option < u32 > ,
pub ( crate ) attach_prog_fd : Option < RawFd > ,
pub ( crate ) attach_prog_fd : Option < RawFd > ,
@ -161,7 +161,7 @@ pub(crate) fn bpf_load_program(
let func_info_buf = aya_attr . func_info . func_info_bytes ( ) ;
let func_info_buf = aya_attr . func_info . func_info_bytes ( ) ;
if let Some ( btf_fd ) = aya_attr . prog_btf_fd {
if let Some ( btf_fd ) = aya_attr . prog_btf_fd {
u . prog_btf_fd = btf_fd as u32 ;
u . prog_btf_fd = btf_fd . as_raw_fd ( ) as u32 ;
if aya_attr . line_info_rec_size > 0 {
if aya_attr . line_info_rec_size > 0 {
u . line_info = line_info_buf . as_ptr ( ) as * const _ as u64 ;
u . line_info = line_info_buf . as_ptr ( ) as * const _ as u64 ;
u . line_info_cnt = aya_attr . line_info . len ( ) as u32 ;
u . line_info_cnt = aya_attr . line_info . len ( ) as u32 ;
@ -464,21 +464,8 @@ pub(crate) fn bpf_prog_get_fd_by_id(prog_id: u32) -> Result<OwnedFd, io::Error>
let mut attr = unsafe { mem ::zeroed ::< bpf_attr > ( ) } ;
let mut attr = unsafe { mem ::zeroed ::< bpf_attr > ( ) } ;
attr . __bindgen_anon_6 . __bindgen_anon_1 . prog_id = prog_id ;
attr . __bindgen_anon_6 . __bindgen_anon_1 . prog_id = prog_id ;
// SAFETY: BPF_PROG_GET_FD_BY_ID returns a new file descriptor.
match sys_bpf ( bpf_cmd ::BPF_PROG_GET_FD_BY_ID , & attr ) {
unsafe { fd_sys_bpf ( bpf_cmd ::BPF_PROG_GET_FD_BY_ID , & attr ) . map_err ( | ( _ , e ) | e ) }
Ok ( v ) = > {
let v = v . try_into ( ) . map_err ( | _err | {
// _err is std::num::TryFromIntError or std::convert::Infallible depending on
// target, so we can't ascribe.
io ::Error ::new (
io ::ErrorKind ::InvalidData ,
format! ( "bpf_prog_get_fd_by_id: invalid fd returned: {}" , v ) ,
)
} ) ? ;
Ok ( unsafe { OwnedFd ::from_raw_fd ( v ) } )
}
Err ( ( _ , err ) ) = > Err ( err ) ,
}
}
}
pub ( crate ) fn bpf_prog_get_info_by_fd ( prog_fd : RawFd ) -> Result < bpf_prog_info , io ::Error > {
pub ( crate ) fn bpf_prog_get_info_by_fd ( prog_fd : RawFd ) -> Result < bpf_prog_info , io ::Error > {
@ -561,7 +548,7 @@ pub(crate) fn bpf_load_btf(
raw_btf : & [ u8 ] ,
raw_btf : & [ u8 ] ,
log_buf : & mut [ u8 ] ,
log_buf : & mut [ u8 ] ,
verifier_log_level : VerifierLogLevel ,
verifier_log_level : VerifierLogLevel ,
) -> SysResult < c_long > {
) -> SysResult < OwnedFd > {
let mut attr = unsafe { mem ::zeroed ::< bpf_attr > ( ) } ;
let mut attr = unsafe { mem ::zeroed ::< bpf_attr > ( ) } ;
let u = unsafe { & mut attr . __bindgen_anon_7 } ;
let u = unsafe { & mut attr . __bindgen_anon_7 } ;
u . btf = raw_btf . as_ptr ( ) as * const _ as u64 ;
u . btf = raw_btf . as_ptr ( ) as * const _ as u64 ;
@ -571,7 +558,23 @@ pub(crate) fn bpf_load_btf(
u . btf_log_buf = log_buf . as_mut_ptr ( ) as u64 ;
u . btf_log_buf = log_buf . as_mut_ptr ( ) as u64 ;
u . btf_log_size = log_buf . len ( ) as u32 ;
u . btf_log_size = log_buf . len ( ) as u32 ;
}
}
sys_bpf ( bpf_cmd ::BPF_BTF_LOAD , & attr )
// SAFETY: `BPF_BTF_LOAD` returns a newly created fd.
unsafe { fd_sys_bpf ( bpf_cmd ::BPF_BTF_LOAD , & attr ) }
}
// SAFETY: only use for bpf_cmd that return a new file descriptor on success.
unsafe fn fd_sys_bpf ( cmd : bpf_cmd , attr : & bpf_attr ) -> SysResult < OwnedFd > {
let fd = sys_bpf ( cmd , attr ) ? ;
let fd = fd . try_into ( ) . map_err ( | _ | {
(
fd ,
io ::Error ::new (
io ::ErrorKind ::InvalidData ,
format! ( "{cmd:?}: invalid fd returned: {fd}" ) ,
) ,
)
} ) ? ;
Ok ( OwnedFd ::from_raw_fd ( fd ) )
}
}
pub ( crate ) fn bpf_btf_get_fd_by_id ( id : u32 ) -> Result < RawFd , io ::Error > {
pub ( crate ) fn bpf_btf_get_fd_by_id ( id : u32 ) -> Result < RawFd , io ::Error > {