Repository navigation
stream timing: five more per-frame bytes in addr1, a group DA every receiver delivers - #482
Conversation
…eceiver delivers addr1 (the DA) now carries a FrameTimingExt on the stream's data frames: stdin read->send for THIS frame, the previous frame's send_packet wall time (kestrel-air's T_WRITE) and the TX frame counter's low byte. The DA stays a group address (03:... = group + locally administered + version), so nothing ACKs it and every TX descriptor path still derives BMC from it; the broadcast address a demo writes without the extension decodes as "none". The marker frame, the hop sync marker and the Jaguar1 clock beacon keep ff. Measured first (tests/mcast_da_rx_check.sh + tests/mcast_da_tx.cpp): the monitor RX of the 8822BU, 8812CU, 8821AU, 8832CU and MT7612U delivers the 03:... DA at parity with broadcast (ratios 0.99-1.01, ~1400 frames each per 15 s). The RTL8733B was not plugged. rxdemo decodes it into rx.frame tq_us / tw_us / ctr; the analyzer checks the per-frame tw median against the marker's window p50 (same quantity, two carriers: 70/70 us on the 8812CU, 20/20 on the 8821AU) and that the extension is on >= 90% of telemetry frames. Full matrix on the 8812CU (floor, delay 20.08 ms, hop, corrupt, svctx, svctx-live, duplex) and floors on the 8821AU and 8832CU all PASS with the extension live. Closes #474. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PR Summary by QodoAdd per-frame stream timing telemetry in the group destination address
AI Description
Diagram
High-Level Assessment
Files changed (13)
|
Code Review by Qodo
1.
|
… teardown, analyzer gaps - tests/mcast_da_tx.cpp builds its group DA with FrameTimingExt::encode, so the receiver gate measures the bytes the stream frames actually carry (07:… = 0x03 | version<<2), not a hand-written 03:…; docs and comments say 07. Re-measured on all five receiver families at parity (1.00-1.01). - Both on-air injectors tear down through DeviceSession on every return path (device, interface, handle, context). - tests/mcast_da_rx_check.sh exits 77 when no cell could be measured — a skipped matrix is not a pass. - Analyzer: ext_present is evaluated whenever telemetry frames exist (a vanished extension fails, it does not skip); the frame-vs-marker write time comparison uses only markers aired after the warm-up. - src/StreamTelemetry.h: a reference to docs/stream-timing.md instead of a second copy of the measurement. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
What
Follow-up #474 from the stream-timing PR. The per-frame field in addr3 had no room for a per-frame write time or queue time; both were windowed in the marker only.
FrameTimingExton the stream's data frames: stdin read→send_packetfor this frame, the previous frame'ssend_packetwall time (kestrel-air's T_WRITE), and the TX frame counter's low byte. The DA stays a group address (03:…= group + locally administered + version), so nothing ACKs it and every TX descriptor path still derives BMC from it. A broadcast DA decodes as "no extension". The marker, the hop sync marker and the Jaguar1 clock beacon keepff.tq_us,tw_us,ctrtorx.frame; the analyzer cross-checks the per-frametwmedian against the marker's window p50 of the same quantity.Measured first
tests/mcast_da_rx_check.sh(new, withtests/mcast_da_tx.cpp): an injector alternates the broadcast and the03:…DA; each receiver family counts both by body tag, 15 s per cell.The RTL8733B was not plugged and is unmeasured (said so in the doc).
With the extension live
Full matrix on the 8812CU → CF-924AC pair: floor, delay (20.08 ms on 9.8 %), hop, corrupt, svctx, svctx-live, duplex — all PASS. Floors on the 8821AU and 8832CU PASS. Per-frame
twmedian vs marker p50: 70/70 µs (8812CU), 20/20 µs (8821AU). Headless: selftest KAT for the extension (broadcast, unicast-looking and other-version DAs rejected),ctest85/85.Closes #474.
🤖 Generated with Claude Code