Skip to content

M2 — Reliability & link adaptation (per-UE ACK, HARQ, rate/power) #256

Closed

Description

@josephnef

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/)

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

  1. josephnef commented on Nov 5, 2026

    @josephnef
    CollaboratorAuthor

    M2 is done. #519 (core: src/cell/Harq.h, src/cell/LinkAdapt.h) and #521 (examples/cell integration) are merged.

    • Hardware ACK: each UE arms the ACK responder on its own MAC.
    • HARQ: driven by explicit UE feedback in the uplink beacon (cumulative base + 32-seq bitmap, with the report's generation superframe). It has NACK/timeout rules, an attempt limit, receiver duplicate suppression, and a window low edge so abandoned gaps clear. It also ignores implausible feedback, and a refused submission spends no attempt. Kestrel has no per-frame TX report, so this path carries all of it.
    • Link adaptation: per-UE DL rate from the UE-reported DL SNR plus the retransmission ratio. It is judged only over windows the UE was present for, and published in the grant at its effective superframe.
    • Integrity: the feedback IE and the DL body are versioned, and HMAC-tagged when CELL_PSK is 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.

    arm UE1 delivered UE2 (control)
    baseline 686/1155 1155/1155
    HARQ 620/654 1155/1155
    HARQ + LA 1133/1136, 54 → 6 Mb/s 1155/1155 at 54 Mb/s

    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 in docs/cell-m2.md. The test script lives in testrig rather than at tests/cell_reliability.sh.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions