From 4a11c6adc783099386a3c8ac82da34cf82915224 Mon Sep 17 00:00:00 2001 From: WGH Date: Sat, 6 Sep 2025 05:41:20 +0300 Subject: [PATCH] Calculate cmsg buffer size statically Although generic const fn max hasn't been stabilized yet[1], it's possible to write a concrete impl for usize. Follow-up to #178 and #225. [1] https://github.com/rust-lang/rust/issues/92391 --- phantun/src/utils.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/phantun/src/utils.rs b/phantun/src/utils.rs index d0617c4..1b68c1f 100644 --- a/phantun/src/utils.rs +++ b/phantun/src/utils.rs @@ -62,13 +62,11 @@ pub async fn udp_recv_pktinfo( buf: &mut [u8], ) -> std::io::Result<(usize, SocketAddr, IpAddr)> { sock.async_io(Interest::READABLE, || { - // according to documented struct definition in RFC 3542, - // sizeof(in6_pktinfo) should always be larger than sizeof(in_pktinfo), - // this assert just double checks that. The goal is to avoid - // a heap allocation with Vec at runtime. - assert!(cmsg_space::() >= cmsg_space::()); - - let mut control_message_buffer = [0u8; cmsg_space::()]; + const CONTROL_MESSAGE_BUFFER_SIZE: usize = max_usize( + cmsg_space::(), + cmsg_space::(), + ); + let mut control_message_buffer = [0u8; CONTROL_MESSAGE_BUFFER_SIZE]; let iov = &mut [std::io::IoSliceMut::new(buf)]; let res = nix::sys::socket::recvmsg::( sock.as_raw_fd(), @@ -151,3 +149,7 @@ pub fn assign_ipv6_address(device_name: &str, local: Ipv6Addr, peer: Ipv6Addr) { .unwrap(); rtnl.send(&nl_header).unwrap(); } + +const fn max_usize(a: usize, b: usize) -> usize { + if a > b { a } else { b } +}