diff --git a/ostp-client/src/bridge.rs b/ostp-client/src/bridge.rs index d8374f3..7acdc0a 100644 --- a/ostp-client/src/bridge.rs +++ b/ostp-client/src/bridge.rs @@ -446,7 +446,7 @@ impl Bridge { _ = keepalive_tick.tick() => { if self.running { // 1. Connection Liveness Check & Silent Background Reconnect - if self.last_valid_recv.elapsed().as_secs() > 8 { + if self.last_valid_recv.elapsed().as_secs() > 25 { let elapsed = self.last_valid_recv.elapsed().as_secs(); if elapsed > 180 { // Hard timeout after 3 minutes of total silence @@ -591,7 +591,7 @@ impl Bridge { } proxy_ev = proxy_rx.recv(), if self.running && sessions_opt.as_ref().map(|s| { // Backpressure: suspend proxy reads when ARQ window is saturated - s.iter().all(|ses| ses.machine.in_flight_count() < 256) + s.iter().all(|ses| ses.machine.in_flight_count() < ses.machine.cwnd_packets().clamp(16, 256)) }).unwrap_or(true) => { if let Some(ev) = proxy_ev { if let Some(sessions) = sessions_opt.as_mut() { diff --git a/ostp-core/src/protocol.rs b/ostp-core/src/protocol.rs index e9a0de5..acafffe 100644 --- a/ostp-core/src/protocol.rs +++ b/ostp-core/src/protocol.rs @@ -154,6 +154,10 @@ impl ProtocolMachine { self.sent_history.iter().filter(|f| f.is_retransmittable).count() } + pub fn cwnd_packets(&self) -> usize { + self.cc.cwnd_packets() as usize + } + pub fn state(&self) -> OstpState { self.state } diff --git a/ostp-server/src/lib.rs b/ostp-server/src/lib.rs index 162d6dd..9a1fd1a 100644 --- a/ostp-server/src/lib.rs +++ b/ostp-server/src/lib.rs @@ -464,7 +464,7 @@ async fn run_server_loop( let mut last_empty_app_log = Instant::now() - Duration::from_secs(10); let mut peer_last_seen: HashMap = HashMap::new(); let mut peer_available: HashMap = HashMap::new(); - let peer_timeout = Duration::from_secs(15); + let peer_timeout = Duration::from_secs(45); loop { tokio::select! {