|  |  | @ -477,10 +477,14 @@ pub(crate) fn bpf_prog_get_fd_by_id(prog_id: u32) -> Result<OwnedFd, SyscallErro | 
			
		
	
		
		
			
				
					
					|  |  |  |     }) |  |  |  |     }) | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | fn bpf_obj_get_info_by_fd<T>(fd: BorrowedFd<'_>) -> Result<T, SyscallError> { |  |  |  | fn bpf_obj_get_info_by_fd<T, F: FnOnce(&mut T)>( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     fd: BorrowedFd<'_>, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     init: F, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | ) -> Result<T, SyscallError> { | 
			
		
	
		
		
			
				
					
					|  |  |  |     let mut attr = unsafe { mem::zeroed::<bpf_attr>() }; |  |  |  |     let mut attr = unsafe { mem::zeroed::<bpf_attr>() }; | 
			
		
	
		
		
			
				
					
					|  |  |  |     // info gets entirely populated by the kernel
 |  |  |  |     let mut info = unsafe { mem::zeroed() }; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     let info = MaybeUninit::zeroed(); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     init(&mut info); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     attr.info.bpf_fd = fd.as_raw_fd() as u32; |  |  |  |     attr.info.bpf_fd = fd.as_raw_fd() as u32; | 
			
		
	
		
		
			
				
					
					|  |  |  |     attr.info.info = &info as *const _ as u64; |  |  |  |     attr.info.info = &info as *const _ as u64; | 
			
		
	
	
		
		
			
				
					|  |  | @ -489,7 +493,7 @@ fn bpf_obj_get_info_by_fd<T>(fd: BorrowedFd<'_>) -> Result<T, SyscallError> { | 
			
		
	
		
		
			
				
					
					|  |  |  |     match sys_bpf(bpf_cmd::BPF_OBJ_GET_INFO_BY_FD, &mut attr) { |  |  |  |     match sys_bpf(bpf_cmd::BPF_OBJ_GET_INFO_BY_FD, &mut attr) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         Ok(code) => { |  |  |  |         Ok(code) => { | 
			
		
	
		
		
			
				
					
					|  |  |  |             assert_eq!(code, 0); |  |  |  |             assert_eq!(code, 0); | 
			
		
	
		
		
			
				
					
					|  |  |  |             Ok(unsafe { info.assume_init() }) |  |  |  |             Ok(info) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         Err((code, io_error)) => { |  |  |  |         Err((code, io_error)) => { | 
			
		
	
		
		
			
				
					
					|  |  |  |             assert_eq!(code, -1); |  |  |  |             assert_eq!(code, -1); | 
			
		
	
	
		
		
			
				
					|  |  | @ -501,13 +505,19 @@ fn bpf_obj_get_info_by_fd<T>(fd: BorrowedFd<'_>) -> Result<T, SyscallError> { | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | pub(crate) fn bpf_prog_get_info_by_fd(fd: RawFd) -> Result<bpf_prog_info, SyscallError> { |  |  |  | pub(crate) fn bpf_prog_get_info_by_fd( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     fd: RawFd, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     map_ids: &mut [u32], | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | ) -> Result<bpf_prog_info, SyscallError> { | 
			
		
	
		
		
			
				
					
					|  |  |  |     let fd = unsafe { BorrowedFd::borrow_raw(fd) }; |  |  |  |     let fd = unsafe { BorrowedFd::borrow_raw(fd) }; | 
			
		
	
		
		
			
				
					
					|  |  |  |     bpf_obj_get_info_by_fd::<bpf_prog_info>(fd) |  |  |  |     bpf_obj_get_info_by_fd(fd, |info: &mut bpf_prog_info| { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         info.nr_map_ids = map_ids.len() as _; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         info.map_ids = map_ids.as_mut_ptr() as _; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     }) | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | pub(crate) fn bpf_map_get_info_by_fd(fd: BorrowedFd<'_>) -> Result<bpf_map_info, SyscallError> { |  |  |  | pub(crate) fn bpf_map_get_info_by_fd(fd: BorrowedFd<'_>) -> Result<bpf_map_info, SyscallError> { | 
			
		
	
		
		
			
				
					
					|  |  |  |     bpf_obj_get_info_by_fd::<bpf_map_info>(fd) |  |  |  |     bpf_obj_get_info_by_fd(fd, |_| {}) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | pub(crate) fn bpf_link_get_fd_by_id(link_id: u32) -> Result<OwnedFd, SyscallError> { |  |  |  | pub(crate) fn bpf_link_get_fd_by_id(link_id: u32) -> Result<OwnedFd, SyscallError> { | 
			
		
	
	
		
		
			
				
					|  |  | @ -525,26 +535,18 @@ pub(crate) fn bpf_link_get_fd_by_id(link_id: u32) -> Result<OwnedFd, SyscallErro | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | pub(crate) fn bpf_link_get_info_by_fd(fd: BorrowedFd<'_>) -> Result<bpf_link_info, SyscallError> { |  |  |  | pub(crate) fn bpf_link_get_info_by_fd(fd: BorrowedFd<'_>) -> Result<bpf_link_info, SyscallError> { | 
			
		
	
		
		
			
				
					
					|  |  |  |     bpf_obj_get_info_by_fd::<bpf_link_info>(fd) |  |  |  |     bpf_obj_get_info_by_fd(fd, |_| {}) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | pub(crate) fn btf_obj_get_info_by_fd( |  |  |  | pub(crate) fn btf_obj_get_info_by_fd( | 
			
		
	
		
		
			
				
					
					|  |  |  |     prog_fd: RawFd, |  |  |  |     fd: RawFd, | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     buf: &[u8], |  |  |  |     buf: &mut [u8], | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | ) -> Result<bpf_btf_info, io::Error> { |  |  |  | ) -> Result<bpf_btf_info, SyscallError> { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     let mut attr = unsafe { mem::zeroed::<bpf_attr>() }; |  |  |  |     let fd = unsafe { BorrowedFd::borrow_raw(fd) }; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     let mut info = unsafe { mem::zeroed::<bpf_btf_info>() }; |  |  |  |     bpf_obj_get_info_by_fd(fd, |info: &mut bpf_btf_info| { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     let buf_size = buf.len() as u32; |  |  |  |         info.btf = buf.as_mut_ptr() as _; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     info.btf = buf.as_ptr() as u64; |  |  |  |         info.btf_size = buf.len() as _; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     info.btf_size = buf_size; |  |  |  |     }) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     attr.info.bpf_fd = prog_fd as u32; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     attr.info.info = &info as *const bpf_btf_info as u64; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     attr.info.info_len = mem::size_of::<bpf_btf_info>() as u32; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     match sys_bpf(bpf_cmd::BPF_OBJ_GET_INFO_BY_FD, &mut attr) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Ok(_) => Ok(info), |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         Err((_, err)) => Err(err), |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | pub(crate) fn bpf_raw_tracepoint_open(name: Option<&CStr>, prog_fd: RawFd) -> SysResult<OwnedFd> { |  |  |  | pub(crate) fn bpf_raw_tracepoint_open(name: Option<&CStr>, prog_fd: RawFd) -> SysResult<OwnedFd> { | 
			
		
	
	
		
		
			
				
					|  |  | 
 |