From f0a93b4161a670f7b5d9d6ec7e48c241907e2845 Mon Sep 17 00:00:00 2001 From: ospab Date: Sun, 17 May 2026 02:19:59 +0300 Subject: [PATCH] perf: heavily tune UDP socket buffers via socket2 to support 10Gbps+ micro-burst resilience --- Cargo.lock | 12 +++++++----- ostp-client/Cargo.toml | 1 + ostp-client/src/bridge.rs | 11 ++++++++--- ostp-server/Cargo.toml | 1 + ostp-server/src/lib.rs | 9 ++++++++- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 05abac9..ed1a755 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -745,7 +745,7 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "ostp" -version = "0.1.55" +version = "0.1.56" dependencies = [ "anyhow", "base64", @@ -762,7 +762,7 @@ dependencies = [ [[package]] name = "ostp-client" -version = "0.1.55" +version = "0.1.56" dependencies = [ "anyhow", "bytes", @@ -773,13 +773,14 @@ dependencies = [ "rand", "serde", "serde_json", + "socket2", "tokio", "tracing", ] [[package]] name = "ostp-core" -version = "0.1.55" +version = "0.1.56" dependencies = [ "anyhow", "async-trait", @@ -812,7 +813,7 @@ dependencies = [ [[package]] name = "ostp-server" -version = "0.1.55" +version = "0.1.56" dependencies = [ "anyhow", "bytes", @@ -820,13 +821,14 @@ dependencies = [ "rand", "serde", "serde_json", + "socket2", "tokio", "tracing", ] [[package]] name = "ostp-tun-helper" -version = "0.1.55" +version = "0.1.56" dependencies = [ "anyhow", "chrono", diff --git a/ostp-client/Cargo.toml b/ostp-client/Cargo.toml index 810bc5d..6cc94c3 100644 --- a/ostp-client/Cargo.toml +++ b/ostp-client/Cargo.toml @@ -16,3 +16,4 @@ serde_json = "1.0" json_comments = "0.2" portable-atomic.workspace = true chrono = "0.4" +socket2 = "0.6.3" diff --git a/ostp-client/src/bridge.rs b/ostp-client/src/bridge.rs index 55f6852..3cb32c3 100644 --- a/ostp-client/src/bridge.rs +++ b/ostp-client/src/bridge.rs @@ -609,9 +609,14 @@ impl Bridge { max_sent_history: 65536, // Greatly expanded to guarantee that oldest unacked packets are not prematurely popped and lost })?; - let socket = UdpSocket::bind(&self.local_bind_addr) - .await - .with_context(|| format!("failed to bind local udp {}", self.local_bind_addr))?; + let addr = self.local_bind_addr.parse::().map_err(|e| anyhow::anyhow!("invalid bind addr: {}", e))?; + let domain = if addr.is_ipv6() { socket2::Domain::IPV6 } else { socket2::Domain::IPV4 }; + let sock = socket2::Socket::new(domain, socket2::Type::DGRAM, Some(socket2::Protocol::UDP))?; + let _ = sock.set_recv_buffer_size(33554432); // 32MB + let _ = sock.set_send_buffer_size(33554432); // 32MB + sock.bind(&addr.into())?; + sock.set_nonblocking(true)?; + let socket = UdpSocket::from_std(sock.into())?; if self.turn_enabled { let turn_addr = if self.turn_server.contains(':') { diff --git a/ostp-server/Cargo.toml b/ostp-server/Cargo.toml index f5f1ffe..33fda7b 100644 --- a/ostp-server/Cargo.toml +++ b/ostp-server/Cargo.toml @@ -13,3 +13,4 @@ ostp-core = { path = "../ostp-core" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" rand.workspace = true +socket2 = "0.6.3" diff --git a/ostp-server/src/lib.rs b/ostp-server/src/lib.rs index dd852ed..436bd39 100644 --- a/ostp-server/src/lib.rs +++ b/ostp-server/src/lib.rs @@ -116,7 +116,14 @@ pub async fn run_server( } }); - let socket = UdpSocket::bind(&bind_addr).await?; + let addr = bind_addr.parse::().map_err(|e| anyhow::anyhow!("invalid bind addr: {}", e))?; + let domain = if addr.is_ipv6() { socket2::Domain::IPV6 } else { socket2::Domain::IPV4 }; + let sock = socket2::Socket::new(domain, socket2::Type::DGRAM, Some(socket2::Protocol::UDP))?; + let _ = sock.set_recv_buffer_size(33554432); // 32MB + let _ = sock.set_send_buffer_size(33554432); // 32MB + sock.bind(&addr.into())?; + sock.set_nonblocking(true)?; + let socket = UdpSocket::from_std(sock.into())?; let protocol_config = ProtocolConfig { role: NoiseRole::Responder, psk: [0u8; 32],