THE SERVER'S KEEPALIVE, AND THE GROUP A PHONE LEAVES. This build is
released together with server srtp-build440. That server keeps every
silent connection alive with a repeat of its last probe echo, so a phone
dozing on Wi-Fi with the UDP relay leg is woken by it instead of
sleeping past the server's timeout — a night that used to cost 599
restarts now costs none. When the phone changes networks, this client
names the group of connections it leaves right behind its first hello
on the new one, so the server drops the old group within seconds
instead of feeding it for two and a half minutes; an older server
ignores the notice. A repeated pong is read as the server's keepalive
rather than as a gap, and counted ("pong repeats"). On cellular with
the UDP relay leg nothing the server sends reaches a dozing phone,
keepalive or not — the TCP relay leg, the default, is unaffected.
CSQTT UNDER A RELAY THAT STOPS TAKING BYTES (TCP). One relay connection
whose far side stopped reading used to block the whole uplink until
that worker was found dead, thirty to sixty seconds later. Every relay
write now runs under a one-second bound — "Bounded relay writes" in the
csqtt profile, on by default: a relay that has not taken the packet
within a second is judged stalled, the worker restarts on a fresh
allocation and the other workers carry on. With one connection blocked
on the router under an upload the worker was back in 80 ms and the
upload read 44.5 Mbit/s, against 31.5 with the bound off. A write that
finds its connection gone — a reset, a broken pipe — ends that worker's
session at once, and it re-dials under the usual backoff, instead of
feeding a dead socket until the keepalive noticed (290 packets in the
field). Only the bound's own expiry is read as a stall; a kernel's
error keeps its name. "write stalls" and "dead writes" are counted in
the log.
Also: the idle-relay probe tool (tools/turn_idle_probe) sends no TCP
keepalive of its own, so what it measures is the relay's.
Deploy with server srtp-build440. A client of this line still needs
srtp-build306 or newer (its downlink scheduler) and works with 306 —
without the keepalive and the group notice.