|
@@ -1,6 +1,4 @@
|
|
|
-use std::{
|
|
|
- ffi::CStr, mem::MaybeUninit, net::UdpSocket, num::NonZeroU32, ptr::NonNull, time::Duration,
|
|
|
-};
|
|
|
+use std::{ffi::CStr, mem::MaybeUninit, net::UdpSocket, num::NonZeroU32, time::Duration};
|
|
|
|
|
|
use aya::{
|
|
|
maps::{Array, CpuMap, XskMap},
|
|
@@ -33,9 +31,14 @@ fn af_xdp() {
|
|
|
#[repr(align(16384))]
|
|
|
struct PacketMap(MaybeUninit<[u8; 4096]>);
|
|
|
|
|
|
- let mem = Box::new(PacketMap(MaybeUninit::uninit()));
|
|
|
- let mem = NonNull::new(Box::leak(mem).0.as_mut_ptr()).unwrap();
|
|
|
- let umem = unsafe { Umem::new(UmemConfig::default(), mem).unwrap() };
|
|
|
+ // Safety: don't access alloc down the line.
|
|
|
+ let mut alloc = Box::new(PacketMap(MaybeUninit::uninit()));
|
|
|
+ let umem = {
|
|
|
+ // Safety: this is a shared buffer between the kernel and us, uninitialized memory is valid.
|
|
|
+ let mem = unsafe { alloc.0.assume_init_mut() }.as_mut().into();
|
|
|
+ // Safety: we cannot access `mem` further down the line because it falls out of scope.
|
|
|
+ unsafe { Umem::new(UmemConfig::default(), mem).unwrap() }
|
|
|
+ };
|
|
|
|
|
|
let mut iface = IfInfo::invalid();
|
|
|
iface
|