Files
RuView/docs
ruv 832a8efa6a fix(firmware): recover stalled CSI capture and stop discarding accepted frames (#1941)
A C6 node's CSI callbacks stopped for 473 s while Wi-Fi, ping, ESP-NOW,
the console and RUVIEW_HELLO stayed healthy. The uplink watchdog cannot
see this: adaptive-controller and mesh packets keep sendto() succeeding.

Capture watchdog (ADR-364):
- the CSI callback stamps raw-callback and CSI-send liveness (uint32 ms)
- a pure, host-tested policy (csi_stall_policy.c) escalates one
  CSI_STALL_TIMEOUT_S (15 s) step at a time: re-arm the capture path,
  force reassociation, restart; paused while the link is down, armed
  only after first capture, off under power duty-cycling, radio-only
  liveness when a source-MAC filter is active
- test-only CONFIG_CSI_STALL_INJECT_MODE to prove the ladder on silicon

Send gate: a second 20 ms gate timed from the send, not the accept,
discarded frames the mesh-aligned process gate accepted 10-20 ms apart
(seq steps were only +1/+2). It is now a burst guard at the process
gate's floor.

MEASURED on ESP32-C6 node 42 (scripts/benchmark-esp32-csi.py, new):
- sequence loss 21-28% -> 0.08-0.15%; 0 false triggers over 855 s
- injected transient stall: detected +15.0 s, re-armed, host outage
  15.2-15.3 s, no reassoc/reboot (2 runs)
- injected persistent stall: re-arm, reassoc, restart; outage 52.9 s
Host tests (make host_tests) pass; ASan/UBSan clean; C6 and S3 build
with no new warnings.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-09-29 11:14:40 -04:00
..