mirror of https://github.com/ospab/ostp.git
fix(tun): resolve OS error 10049 for TCP bypass on Windows and fix 16GB memory leak by bounding smoltcp channels
This commit is contained in:
parent
c36e7373e8
commit
e0a13702ea
|
|
@ -315,7 +315,7 @@ impl Bridge {
|
||||||
self.metrics.connection_state.store(1, Ordering::Relaxed);
|
self.metrics.connection_state.store(1, Ordering::Relaxed);
|
||||||
|
|
||||||
let session_count = if self.mux_enabled { self.mux_sessions.max(1) } else { 1 };
|
let session_count = if self.mux_enabled { self.mux_sessions.max(1) } else { 1 };
|
||||||
let (udp_tx, udp_rx) = mpsc::channel(100000);
|
let (udp_tx, udp_rx) = mpsc::channel(1024);
|
||||||
let mut sessions = Vec::with_capacity(session_count);
|
let mut sessions = Vec::with_capacity(session_count);
|
||||||
let mut rtt_sum = 0.0;
|
let mut rtt_sum = 0.0;
|
||||||
let mut successful_sessions = 0;
|
let mut successful_sessions = 0;
|
||||||
|
|
@ -412,7 +412,7 @@ impl Bridge {
|
||||||
self.last_valid_recv = Instant::now() - Duration::from_secs(100);
|
self.last_valid_recv = Instant::now() - Duration::from_secs(100);
|
||||||
|
|
||||||
let session_count = if self.mux_enabled { self.mux_sessions.max(1) } else { 1 };
|
let session_count = if self.mux_enabled { self.mux_sessions.max(1) } else { 1 };
|
||||||
let (udp_tx, udp_rx) = mpsc::channel(100000);
|
let (udp_tx, udp_rx) = mpsc::channel(1024);
|
||||||
let mut new_sessions = Vec::with_capacity(session_count);
|
let mut new_sessions = Vec::with_capacity(session_count);
|
||||||
let mut successful_sessions = 0;
|
let mut successful_sessions = 0;
|
||||||
let mut rtt_sum = 0.0;
|
let mut rtt_sum = 0.0;
|
||||||
|
|
@ -548,7 +548,7 @@ impl Bridge {
|
||||||
self.metrics.connection_state.store(1, Ordering::Relaxed);
|
self.metrics.connection_state.store(1, Ordering::Relaxed);
|
||||||
|
|
||||||
let session_count = if self.mux_enabled { self.mux_sessions.max(1) } else { 1 };
|
let session_count = if self.mux_enabled { self.mux_sessions.max(1) } else { 1 };
|
||||||
let (udp_tx, udp_rx) = mpsc::channel(100000);
|
let (udp_tx, udp_rx) = mpsc::channel(1024);
|
||||||
let mut new_sessions = Vec::with_capacity(session_count);
|
let mut new_sessions = Vec::with_capacity(session_count);
|
||||||
let mut successful_sessions = 0;
|
let mut successful_sessions = 0;
|
||||||
let mut rtt_sum = 0.0;
|
let mut rtt_sum = 0.0;
|
||||||
|
|
|
||||||
|
|
@ -104,9 +104,9 @@ pub async fn run_native_tunnel(
|
||||||
|
|
||||||
// ── 7. Build smoltcp network stack ────────────────────────────────────────
|
// ── 7. Build smoltcp network stack ────────────────────────────────────────
|
||||||
let (stack, tcp_runner, udp_socket, tcp_listener) = StackBuilder::default()
|
let (stack, tcp_runner, udp_socket, tcp_listener) = StackBuilder::default()
|
||||||
.stack_buffer_size(100_000)
|
.stack_buffer_size(1024)
|
||||||
.tcp_buffer_size(100_000)
|
.tcp_buffer_size(1024)
|
||||||
.udp_buffer_size(100_000)
|
.udp_buffer_size(1024)
|
||||||
.enable_tcp(true)
|
.enable_tcp(true)
|
||||||
.enable_udp(true)
|
.enable_udp(true)
|
||||||
.mtu(config.ostp.mtu)
|
.mtu(config.ostp.mtu)
|
||||||
|
|
@ -454,9 +454,9 @@ pub async fn run_native_tunnel_from_fd(
|
||||||
let tun_stream = tokio::io::unix::AsyncFd::new(file)?;
|
let tun_stream = tokio::io::unix::AsyncFd::new(file)?;
|
||||||
|
|
||||||
let (stack, tcp_runner, udp_socket, tcp_listener) = StackBuilder::default()
|
let (stack, tcp_runner, udp_socket, tcp_listener) = StackBuilder::default()
|
||||||
.stack_buffer_size(100_000)
|
.stack_buffer_size(1024)
|
||||||
.tcp_buffer_size(100_000)
|
.tcp_buffer_size(1024)
|
||||||
.udp_buffer_size(100_000)
|
.udp_buffer_size(1024)
|
||||||
.enable_tcp(true)
|
.enable_tcp(true)
|
||||||
.enable_udp(true)
|
.enable_udp(true)
|
||||||
.mtu(config.ostp.mtu)
|
.mtu(config.ostp.mtu)
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ pub async fn run_udp_nat(
|
||||||
if payload.is_empty() { continue; }
|
if payload.is_empty() { continue; }
|
||||||
|
|
||||||
if !sessions.contains_key(&src) {
|
if !sessions.contains_key(&src) {
|
||||||
let (session_tx, mut session_rx) = mpsc::channel::<(Vec<u8>, SocketAddr)>(100000);
|
let (session_tx, mut session_rx) = mpsc::channel::<(Vec<u8>, SocketAddr)>(1024);
|
||||||
sessions.insert(src, session_tx);
|
sessions.insert(src, session_tx);
|
||||||
|
|
||||||
let proxy_addr_clone = proxy_addr.clone();
|
let proxy_addr_clone = proxy_addr.clone();
|
||||||
|
|
@ -89,8 +89,14 @@ pub async fn run_udp_nat(
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(sender) = sessions.get(&src) {
|
if let Some(sender) = sessions.get(&src) {
|
||||||
if sender.send((payload, dst)).await.is_err() {
|
match sender.try_send((payload, dst)) {
|
||||||
sessions.remove(&src);
|
Err(mpsc::error::TrySendError::Closed(_)) => {
|
||||||
|
sessions.remove(&src);
|
||||||
|
}
|
||||||
|
Err(mpsc::error::TrySendError::Full(_)) => {
|
||||||
|
// Drop packet to avoid blocking the TUN interface loop
|
||||||
|
}
|
||||||
|
Ok(_) => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue