Fix IPv6 UDP buffers: create socket with socket2 before tokio
All checks were successful
CI / test (push) Successful in 1m27s

The into_std/from_std conversion lost the buffer settings. Now create
the raw socket with socket2 first, set SO_SNDBUF/SO_RCVBUF to 4MB,
then wrap with tokio. Also logs actual buffer sizes for debugging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-03-31 19:04:27 +04:00
parent 6ba57864a0
commit 4e3b2939ca

View File

@@ -643,13 +643,25 @@ async fn run_udp_test_server(
} else { } else {
format!("0.0.0.0:{}", server_udp_port).parse().unwrap() format!("0.0.0.0:{}", server_udp_port).parse().unwrap()
}; };
let udp = UdpSocket::bind(bind_addr).await?; // Create socket with socket2 FIRST to set buffer sizes before tokio wraps it
let domain = if peer.is_ipv6() {
// Enlarge send/receive buffers — IPv6 on macOS has small defaults socket2::Domain::IPV6
let std_sock = udp.into_std()?; } else {
let sock2 = socket2::Socket::from(std_sock); socket2::Domain::IPV4
let _ = sock2.set_send_buffer_size(4 * 1024 * 1024); // 4MB };
let sock2 = socket2::Socket::new(domain, socket2::Type::DGRAM, Some(socket2::Protocol::UDP))?;
sock2.set_nonblocking(true)?;
let _ = sock2.set_send_buffer_size(4 * 1024 * 1024);
let _ = sock2.set_recv_buffer_size(4 * 1024 * 1024); let _ = sock2.set_recv_buffer_size(4 * 1024 * 1024);
if peer.is_ipv6() {
let _ = sock2.set_only_v6(true);
}
sock2.bind(&bind_addr.into())?;
tracing::debug!(
"UDP socket: sndbuf={}, rcvbuf={}",
sock2.send_buffer_size().unwrap_or(0),
sock2.recv_buffer_size().unwrap_or(0),
);
let udp = UdpSocket::from_std(sock2.into())?; let udp = UdpSocket::from_std(sock2.into())?;
let client_udp_addr = SocketAddr::new(peer.ip(), client_udp_port); let client_udp_addr = SocketAddr::new(peer.ip(), client_udp_port);