Skip to content

M1 — Single-cell scheduled MAC (src/cell/ DU library + examples/cell node) #255

Closed

Description

@josephnef

Part of the 5G-NR RAN EPIC #254. Phase A, first demoable capability.

Goal: one gNB-DU serves N UEs on a shared, TSF-locked fixed-grid slot grid — per-UE registry, a QoS scheduler that emits a grant map (DCI-style), collision-free scheduled DL (within the M0-measured guard), and scheduled UL with per-UE timing advance.

Restricted numerology (from the architecture review)

M1 deliberately uses a fixed grid — variable-length slots and mini-slots follow once M0 has measured real airtime/scheduling distributions:

  • fixed superframe; fixed beacon/TBTT period in integer TU;
  • one periodic uplink opportunity per UE;
  • an explicit DL→UL turnaround guard;
  • no channel or bandwidth switching inside M1.

5G mapping

  • gNB-DU = the AP node; SSB = the hardware beacon; DCI/PDCCH = the grant map {ue, dl_slot, ul_slot, rate, pwr, ta} (delivery mechanism decided in M0 — likely a slow static beacon grant + scheduled unicast deltas, since there is no atomic beacon-update API); timing advance = the per-UE UL phase loop (corrects clock/actuation phase, not propagation — indoor propagation is ns).

Deliverables (the reusable DU MAC library src/cell/)

Reuses

PinBeaconTbtt, StartBeacon, ReadTsf, examples/tdma/tdma.h, examples/timesync/, RadiotapBuilder.h.

Risks (from EPIC)

  • send_packet UL has no sub-slot air-departure control → UL must ride the HW-beacon-steered path, not naive send_packet.
  • Half-duplex UE turnaround bounds adjacent DL-RX / UL-TX mini-slot sizing.
  • ~ms FastRetune ⇒ slots ≫ retune time if a slot ever changes channel.

Dependencies

M0 (#261) — the four feasibility contracts (DL guard, grant delivery, unicast-ACK matrix, per-UE attribution) gate this milestone's design.

Test — tests/cell_2ue.sh

2 USB stations under the Radxa 8821CE DU; each gets its DL+UL slot; each station's arrival-TSF-mod-period lands in-slot, zero collisions. Reuse timesync_ta_analyze.py for arrival-phase RMS. Plus a headless selftest: GrantMap round-trip + SlotGrid phase math, in the CMake selftests aggregate.

Activity

  1. josephnef commented on Nov 13, 2026

    @josephnef
    CollaboratorAuthor

    Closing: every M1 deliverable is in.

    The tests live in testrig (m1_cell_2ue.sh, m1_qos.sh), not tests/cell_2ue.sh. Not yet in the DU: priority preemption at admission (preempt_for, headless).

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