From b8fa6d4580dc444fe9f69fe2365176296d1a0925 Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Tue, 31 Mar 2026 19:28:42 +0400 Subject: [PATCH] Fix IPv6 UDP server TX: use connected socket for single-connection pcap analysis proved: connected send() achieves 462k pps on IPv6, while unconnected send_to() hits ENOBUFS at 5k pps then stalls. Reverted the "always unconnected for IPv6" workaround. Now only multi-connection mode uses unconnected sockets. Single-connection always connects, which works for both IPv4 and IPv6 TX and RX. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/server.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/server.rs b/src/server.rs index 714d2d6..51d00ed 100644 --- a/src/server.rs +++ b/src/server.rs @@ -678,12 +678,11 @@ async fn run_udp_test_server( // (base_port, base_port+1, ..., base_port+N-1) all to our single server port. // A connect()'d UDP socket only accepts from the one connected address, // silently dropping packets from the other ports. - // So: only connect() for single-connection mode (enables send() without addr). - // For multi-connection, we leave the socket unconnected and use send_to()/recv_from(). - // Don't connect() UDP socket when: - // - Multi-connection mode (MikroTik sends from multiple source ports) - // - IPv6 (macOS connected IPv6 UDP sockets have receive issues) - let use_unconnected = cmd.tcp_conn_count > 0 || peer.is_ipv6(); + // Only use unconnected socket for multi-connection mode (MikroTik sends + // from multiple source ports). For single-connection, always connect() — + // this is critical for IPv6 where send_to() hits ENOBUFS but send() works. + // recv_from() works fine on connected sockets for single source. + let use_unconnected = cmd.tcp_conn_count > 0; if !use_unconnected { udp.connect(client_udp_addr).await?; }