ostp/ostp-client/src
ospab 88e0634f09 fix: two independent causes of the tunnel freezing at 0 b/s
Both produce the same reported symptom - traffic stops dead, the session
itself looks fine, and only a manual reconnect recovers it.

1. protocol.rs: a retry could be charged to a frame that was never sent.
   The retransmit loop is budget-limited per tick, but it bumped `retries`
   and reset `last_sent` for every due frame regardless of whether the
   budget actually allowed a send. The budget is smallest exactly when loss
   is heaviest (it is derived from cwnd, which collapses under loss), so
   under real packet loss frames accumulated "phantom retries" they never
   received - measured at 40 retries charged for 8 frames actually sent in
   one tick. After max_retries+2 such rounds the zombie eviction dropped
   them as dead. That data was never delivered and never would be: the
   stream stalls permanently while pings keep flowing, so nothing upstream
   notices anything is wrong. Retries/timers are now only charged on an
   actual transmit, and the loop stops scanning once the budget is spent
   (sent_history is in send order, so this also keeps retransmit priority
   oldest-first). Covered by a new test that asserts retries charged ==
   datagrams emitted; verified it fails against the old code.

2. bridge.rs: the stall detector was reset by datagrams that never
   validated. `last_valid_recv` - "last VALID recv" - was assigned before
   decryption, so a datagram that failed to decrypt still refreshed it on
   its way to the error return. Anything landing on that port kept the
   client convinced the tunnel was healthy: frames from a session the
   server had already evicted, stale retransmits, or plain garbage from an
   off-path source that knows the ip:port. The 25s background reconnect in
   handle_keepalive therefore never fired. It also made the UI health
   indicator report a dead tunnel as fine, and gave any off-path sender a
   trivial way to pin a client in a dead session indefinitely. Now set only
   after the datagram authenticates and decrypts.
2026-07-30 00:36:17 +03:00
..
bin feat(tun): implement process bypass for TCP/UDP and IP bypass for UDP using existing Extended tables 2026-06-14 00:02:08 +03:00
transport §A: remove WSS + Reality (TLS-mimicry); bump to 0.4.0 / AGPL-3.0 2026-06-27 16:29:42 +03:00
tui Initial public release: Ospab Stealth Transport Protocol v0.1.0 2026-05-14 21:41:54 +03:00
tunnel fix(client): stop leaking a socket+task per direct-bypassed SOCKS5 UDP flow 2026-07-21 18:07:49 +03:00
app.rs feat: NetworkChanged command for instant mobile reconnect, lower stall threshold 25s->8s 2026-05-21 00:29:49 +03:00
bridge.rs fix: two independent causes of the tunnel freezing at 0 b/s 2026-07-30 00:36:17 +03:00
config.rs refactor: remove dead stealth_sni config field across the whole stack 2026-07-10 01:04:56 +03:00
lib.rs feat(client): one authoritative config migrator, manual-only 2026-07-08 18:45:04 +03:00
logging.rs refactor(logging): consolidate all logs into one ostp.log, Windows clears on start 2026-07-09 14:32:08 +03:00
migrate.rs refactor: remove dead stealth_sni config field across the whole stack 2026-07-10 01:04:56 +03:00
runner.rs refactor(logging): consolidate all logs into one ostp.log, Windows clears on start 2026-07-09 14:32:08 +03:00
signal.rs feat: v0.2.0 — BBR congestion control, 0-RTT session resumption, management REST API, fallback server, multi-listener 2026-05-17 21:05:44 +03:00
sysproxy.rs docs: update CLI arguments to subcommands 2026-07-10 03:05:30 +03:00