|
@@ -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>() };
|
|
|
- // info gets entirely populated by the kernel
|
|
|
- let info = MaybeUninit::zeroed();
|
|
|
+ let mut info = unsafe { mem::zeroed() };
|
|
|
+
|
|
|
+ init(&mut info);
|
|
|
|
|
|
attr.info.bpf_fd = fd.as_raw_fd() as u32;
|
|
|
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) {
|
|
|
Ok(code) => {
|
|
|
assert_eq!(code, 0);
|
|
|
- Ok(unsafe { info.assume_init() })
|
|
|
+ Ok(info)
|
|
|
}
|
|
|
Err((code, io_error)) => {
|
|
|
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) };
|
|
|
- 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> {
|
|
|
- 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> {
|
|
@@ -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> {
|
|
|
- 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(
|
|
|
- prog_fd: RawFd,
|
|
|
- buf: &[u8],
|
|
|
-) -> Result<bpf_btf_info, io::Error> {
|
|
|
- let mut attr = unsafe { mem::zeroed::<bpf_attr>() };
|
|
|
- let mut info = unsafe { mem::zeroed::<bpf_btf_info>() };
|
|
|
- let buf_size = buf.len() as u32;
|
|
|
- info.btf = buf.as_ptr() as u64;
|
|
|
- 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),
|
|
|
- }
|
|
|
+ fd: RawFd,
|
|
|
+ buf: &mut [u8],
|
|
|
+) -> Result<bpf_btf_info, SyscallError> {
|
|
|
+ let fd = unsafe { BorrowedFd::borrow_raw(fd) };
|
|
|
+ bpf_obj_get_info_by_fd(fd, |info: &mut bpf_btf_info| {
|
|
|
+ info.btf = buf.as_mut_ptr() as _;
|
|
|
+ info.btf_size = buf.len() as _;
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
pub(crate) fn bpf_raw_tracepoint_open(name: Option<&CStr>, prog_fd: RawFd) -> SysResult<OwnedFd> {
|