From c99ccdcb0d0a6a10823ef11b1d5dc6353ca09fc0 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Wed, 26 Aug 2026 19:01:53 +0800 Subject: [PATCH] webrtc: take dcsctp's retransmission timings and IPv6-safe MTU webrtc-sctp ships RFC 4960's RTO.Initial/RTO.Min (3000/1000), TCP's values for arbitrary public paths. On this workload they set the recovery time outright: a request/response exchange keeps one chunk in flight, so no later SACK ever raises miss_indicator to the 3 that arms fast retransmit, and the T3 floor is the only way back. A single loss during a handshake or a first keyframe therefore costs whole seconds. The fork now carries dcsctp's numbers instead - the SCTP implementation Google wrote to replace usrsctp for Chrome's WebRTC data channels, the same realtime workload: rto_initial 500, rto_min 400, a 220ms floor under the RTT variance, and mtu 1191. INITIAL_MTU 1228 plus DTLS/UDP/IPv6 overhead is 1313, past the 1280 minimum, so every full-size chunk fragmented on an IPv6 path. Both patch entries move to the new branch, which also carries the Windows IPv6 byte-swap fix, so one rev matches the whole webrtc 0.13 stack. --- Cargo.lock | 5 ++--- Cargo.toml | 9 +++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45aeeaf5c..66c6e6311 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9706,8 +9706,7 @@ dependencies = [ [[package]] name = "webrtc-sctp" version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07439c134425d51d2f10907aaf2f815fdfb587dce19fe94a4ae8b5faf2aae5ae" +source = "git+https://github.com/rustdesk-org/webrtc?rev=56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833#56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833" dependencies = [ "arc-swap", "async-trait", @@ -9747,7 +9746,7 @@ dependencies = [ [[package]] name = "webrtc-util" version = "0.11.0" -source = "git+https://github.com/rustdesk-org/webrtc?rev=ac9e74ec2dc502d9afce8d5fc3c9644f2139aee7#ac9e74ec2dc502d9afce8d5fc3c9644f2139aee7" +source = "git+https://github.com/rustdesk-org/webrtc?rev=56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833#56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833" dependencies = [ "async-trait", "bitflags 1.3.2", diff --git a/Cargo.toml b/Cargo.toml index dca4e6b9c..73771f2c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -215,10 +215,15 @@ exclude = ["vdi/host"] # This allows building and running on systems without libxdo installed (e.g., Wayland-only) [patch.crates-io] libxdo-sys = { path = "libs/libxdo-sys-stub" } -# webrtc-util reads the Windows adapter list's IPv6 addresses as host-order u16 groups, so every +# One branch off upstream v0.13.0, the tag whose crate versions match this stack. +# webrtc-util: reads the Windows adapter list's IPv6 addresses as host-order u16 groups, so every # one comes out byte-swapped, fails to bind, and ICE gathers no IPv6 host candidate on Windows. +# webrtc-sctp: RFC 4960's 1s RTO floor makes a single loss cost 1-3s on a link whose RTT is 24-64ms, +# and fast retransmit cannot cover a request/response exchange; INITIAL_MTU 1228 also fragments on +# IPv6. The fork commit carries the arithmetic. # Pinned by rev, not branch: a fork branch can be rewritten out from under the lockfile. -webrtc-util = { git = "https://github.com/rustdesk-org/webrtc", rev = "ac9e74ec2dc502d9afce8d5fc3c9644f2139aee7" } +webrtc-util = { git = "https://github.com/rustdesk-org/webrtc", rev = "56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833" } +webrtc-sctp = { git = "https://github.com/rustdesk-org/webrtc", rev = "56d097c54f9ea1e48c0dfbeb6ce7e66d2e66e833" } [package.metadata.winres] LegalCopyright = "Copyright © 2026 Purslane Tech Pte. Ltd. All rights reserved."