diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index b998a6c..1f1075f 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1405,5 +1405,5 @@ Timeouts and deadlines that are watchdogs in everything but name: | CAD timeout | `Dispatcher::checkSend()` | 4 s (~20 retry attempts) → `ERR_EVENT_CAD_TIMEOUT` + `recoverRxState()`, rather than falling through to TX. See [5.2.2](#522-cad-timeout-recovery). | | Chip-side TX timeout | SX126x `SetTx` deadline (`patch 0003`, "Scale the chip-side Tx timeout from airtime instead of a fixed 10 s"; airtime +25% +500 ms, floored at 10 s, clamped 262143 ms); LR2021 `TIMEOUT` IRQ handler | The chip stops the transmission when this fires, so a fixed value is a truncation, not a safeguard — at SF12/BW62.5 the old flat 10 s cut every packet from 76 bytes up. | | Serial partial-frame resync | `ZephyrCompanionUSB.cpp` (`USB_FRAME_TIMEOUT_MS`) | 2 s. Parser-level only — deliberately **not** a session or idle timeout; an idle-but-connected companion sits in `RX_IDLE` indefinitely. | -| TCP send timeout | `TcpCompanionTransport.c` | Native Linux and WiFi companions. A peer that can't accept a frame in the window is wedged → close it, rather than hang the whole queue. | +| TCP send timeout | `TcpCompanionTransport.c` (`TX_SEND_TIMEOUT_SEC`, `SO_SNDTIMEO`) | 2 s per send. Native Linux and WiFi companions. A peer that can't accept a frame in the window is wedged → close it, rather than hang the whole queue. Needs `CONFIG_NET_CONTEXT_SNDTIMEO`, which `ZEPHCORE_TRANSPORT_TCP` selects; before 1.18.1 it was off, the option silently failed and sends waited up to 10 s per attempt (`NET_SOCKET_MAX_SEND_WAIT`). | | Bounded RXTO wait | `patches/zephyr/0010-uarte-pm-suspend-bounded-rxto-wait.patch` | `uarte_pm_suspend()` busy-waits for RXTO with no timeout upstream. Landing in the STOPRX race with bytes in flight spins forever on the main thread and wedges the entire mesh (observed: RAK3401 1W repeater on 1.16.6, CLI answering only `-> busy`). Backstop for the GPS UART PM path in [7.3](#73-gps-adaptersgps). | diff --git a/releasenotes/RELEASE_NOTES_1.18.1-zephcore.md b/releasenotes/RELEASE_NOTES_1.18.1-zephcore.md index 32a7816..fc40609 100644 --- a/releasenotes/RELEASE_NOTES_1.18.1-zephcore.md +++ b/releasenotes/RELEASE_NOTES_1.18.1-zephcore.md @@ -24,6 +24,10 @@ becomes 5). ## Other changes +- **WiFi companions no longer freeze when the app stops reading.** If an app connected over WiFi + stopped reading (for example in the middle of a contact sync), the node could stop answering on + USB, Bluetooth and WiFi, and stay stuck as long as that connection stayed open. The node now + drops such a connection after 2 seconds, and the app can reconnect. - **`set leds.hb off` and `hb` now also stop the message blink.** Before, a node with the heartbeat LED off still flashed on every DM and channel message. `set leds on` with `set leds.hb off` now keeps a T1000-E dark in use while it still blinks three times when you switch it off with the buzzer muted; diff --git a/zephcore/Kconfig b/zephcore/Kconfig index b767cb6..a1f9bc1 100644 --- a/zephcore/Kconfig +++ b/zephcore/Kconfig @@ -461,6 +461,7 @@ menu "Companion TCP Transport" config ZEPHCORE_TRANSPORT_TCP bool "Companion over a TCP socket" default n + select NET_CONTEXT_SNDTIMEO help Serve the companion protocol over TCP (TcpCompanionTransport), as one more interface in the MultiSerialInterface beside BLE and USB: the