From 4c7c3d767226091889e394ec033b73179a7a1bab Mon Sep 17 00:00:00 2001 From: fanyang Date: Sun, 28 Jun 2026 22:40:52 +0800 Subject: [PATCH] fix: add loopback to connector bind addresses for localhost connections set_bind_addr_for_peer_connector collected all local interface IPs as bind addresses but omitted 127.0.0.1. When connecting to localhost, the connector would bind to a non-loopback IP (e.g. 172.17.0.2 in Docker) and fail with connect timeout because routing from non-loopback to loopback doesn't work. Fix: prepend 127.0.0.1:0 to the bind address list. The connector tries all bind addresses, so loopback will be attempted first and succeed for localhost connections. Benchmark results in Docker (4 threads, 1400B, 10s): Ring: 508K pps, MpscTunnelSender::send 138ns UDP: 440K pps, MpscTunnelSender::send 294ns TCP: 440K pps, MpscTunnelSender::send 376ns All three tunnel types now converge and benefit from noop_waker sync send. --- easytier/src/connector/mod.rs | 2 ++ scripts/setup-bench-netns.sh | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100755 scripts/setup-bench-netns.sh diff --git a/easytier/src/connector/mod.rs b/easytier/src/connector/mod.rs index a5e72b89..584d080e 100644 --- a/easytier/src/connector/mod.rs +++ b/easytier/src/connector/mod.rs @@ -70,6 +70,8 @@ async fn set_bind_addr_for_peer_connector( let ips = global_ctx.get_ip_collector().collect_ip_addrs().await; if is_ipv4 { let mut bind_addrs = vec![]; + // Always include loopback so localhost connections work + bind_addrs.push(std::net::SocketAddr::from(([127, 0, 0, 1], 0))); for ipv4 in ips.interface_ipv4s { let socket_addr = SocketAddrV4::new(ipv4.into(), 0).into(); bind_addrs.push(socket_addr); diff --git a/scripts/setup-bench-netns.sh b/scripts/setup-bench-netns.sh new file mode 100755 index 00000000..441b3a97 --- /dev/null +++ b/scripts/setup-bench-netns.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e + +NS_NAME="et_bench" + +echo "=== Creating netns: $NS_NAME ===" +# Clean up old ns +sudo ip netns del "$NS_NAME" 2>/dev/null || true + +# Create namespace +sudo ip netns add "$NS_NAME" + +# Enable loopback inside namespace +sudo ip netns exec "$NS_NAME" ip link set lo up + +echo "=== netns $NS_NAME ready ===" +echo "Both instances will share this namespace's loopback." +echo "TCP/UDP connections to 127.0.0.1 will work inside it." +echo "" +echo "Now run the bench with HOTPATH_NETNS=$NS_NAME:" +echo " HOTPATH_TUNNEL=tcp HOTPATH_NETNS=$NS_NAME HOTPATH_BENCH_SECS=15 \\" +echo " cargo run --profile hotpath --features hotpath --example cpu_hotspot_ring"