Repository navigation
Description
Part of the 5G-NR RAN EPIC #254. Phase A.
Goal: make the scheduled cell reliable — per-UE hardware ACK (or a decided fallback), HARQ retransmission, and per-UE link adaptation of rate/power.
5G mapping
HARQ retransmission; per-UE link adaptation feeding the DCI grant (rate/pwr fields).
ACK framing corrected (from the architecture review)
The old "multi-MACID" framing was wrong: one ACK-responder MAC per physical node is normally sufficient — the AP has one BSSID and ACKs all UE uplinks addressed to it; each UE adapter ACKs its own downlinks. Multiple responder MACs are only needed if one adapter emulates several logical stations. The real capability question — does an injected unicast descriptor to an arbitrary UE request ACK, and does TxReport report the outcome? — is validated in M0 (#261), contract 3. M2 consumes that result.
Deliverables (into src/cell/)
- hook up per-UE hardware ACK on the confirmed unicast path (AP↔UE, per M0's capability matrix). examples/cell: M1 reference DU / UE / witness node + 2-UE on-air test #518: each UE arms
SetAckResponderon its MAC (8852CE 1036/1036 in the M0 contracts on Kestrel/PCIe: beacon update/stop, PPDU-status pairing fix, PCIe-capable probes #515 matrix). -
src/cell/Harq.h— software HARQ with an explicit UE-feedback protocol. A no-ACK/broadcastTxReport"TX complete" only proves the frame aired, not that a UE received it — so HARQ requires: sequence number + HARQ process ID, cumulative-ACK/bitmap feedback, NACK + timeout rules, retransmission deadline + attempt limit, and receiver-side duplicate suppression. Hardware-ACK'd unicast can useTxReport(SW_DEFINE-matched) directly; the no-ACK path uses the feedback protocol. cell: M2 core — software HARQ with UE feedback + per-UE link adaptation #519 (+ examples/cell: M2 — DL HARQ from UE feedback + per-UE link adaptation (rig: attenuated UE recovered) #521 integrity/plausibility): Kestrel has no per-frame TX report, so all HARQ rides the explicit UE feedback; ctestcell_m2. -
src/cell/LinkAdapt.h— per-UE rate/power from the per-UE RX-quality window (M0 contract 4; NOT device-wideGetRxQuality) + retry rate, written into the grant map. cell: M2 core — software HARQ with UE feedback + per-UE link adaptation #519/examples/cell: M2 — DL HARQ from UE feedback + per-UE link adaptation (rig: attenuated UE recovered) #521: per-UE DL rate from the UE-reported DL SNR + HARQ retransmission ratio, published in the grant at its effective superframe.
Reuses
SetAckResponder, SetAmpduMode, TxReport (state/retries/sw_define), M0's per-UE attribution.
Dependencies
M0 (#261) (ACK/TxReport matrix + per-UE attribution) and M1 (#255).
Test — tests/cell_reliability.sh
Attenuate one UE → HARQ recovers the flow vs a no-HARQ baseline; that UE's grant rate steps down (link adaptation); the other UE is untouched. Headless selftest: HARQ state machine (seq/PID, NACK/timeout, dedup) + link-adapt rate-step logic in the selftests aggregate.
Activity
cell: M2 core — software HARQ with UE feedback + per-UE link adaptation
cell: M2 core — software HARQ with UE feedback + per-UE link adaptati…
examples/cell: M2 — DL HARQ from UE feedback + per-UE link adaptation…
josephnef commentedon Nov 5, 2026
M2 is done. #519 (core:
src/cell/Harq.h,src/cell/LinkAdapt.h) and #521 (examples/cellintegration) are merged.CELL_PSKis set. Feedback older than the last applied (a replay) is refused.Rig test (
testrig scripts/m2_cell_reliability.sh; RTL8852CE PCIe, ch149, 120 s per arm, every role keyed): UE1's DL sent 10 dB down.The UL stayed 100 % in slot in every arm. The headless selftest (ctest
cell_m2) includes a 30 %-loss channel simulation: HARQ 400/400 delivered exactly once, against 280/400 for the baseline. Details are indocs/cell-m2.md. The test script lives in testrig rather than attests/cell_reliability.sh.