Skip to content

Send the gNB's uplink symbol mask in every L1-KPM indication - #11

Open
aferaudo wants to merge 1 commit into
mainfrom
feat/valid-symbol-mask
Open

aferaudo wants to merge 1 commit into
mainfrom
feat/valid-symbol-mask

Conversation

@aferaudo

@aferaudo aferaudo commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Every L1-KPM indication now carries validSymbolMask (valid_symbol_mask in JSON). Bit s set means symbol s of the slot is uplink. DL and guard symbols of a mixed slot are 0, and FDD sets all bits. The gNB computes the mask; this PR carries it from gNB to codelet to controller to dApp, the same way OAI's L1-KPM SM does.
  • gNB side: wineslab/ocudu-e3-private#4. The two shared headers are byte-identical to it, so merge both PRs together.

Type of change

  • Bug fix
  • New feature / enhancement
  • New Service Model
  • Refactor (no behavior change)
  • Documentation (docs/service-models.md and the codelet README)
  • Test / CI / packaging
  • Other (explain):

Linked issue

None.

Mandatory test checklist

  • Over the air. Setup: Foxconn RU, n78, 100 MHz, 4T4R, TDD 7 DL slots / 6 DL symbols / 2 UL slots / 4 UL symbols, a COTS phone, the adaptive_cpu dApp over JSON. Results:
    • every published slot (8, 9, 18, 19) had valid_symbol_mask = 0x3FFF;
    • iperf: 73 Mbit/s UL, 96 Mbit/s DL;
    • the dApp check passed.
  • Round trip. A small test encodes masks 0x3C00, 0x3FFF and 0 with the APER and JSON encoders. All three decode back to the same value, and nRxAnt is still 4.
  • Special slot over the air (0x3C00): not possible on our RU. ocudu-e3-private#4 explains why. The gNB's mask for slots 7 and 17 was checked offline instead.
  • Same code as the over-the-air run. Rebased onto main after Publish UL slots through a native gNB helper instead of a jbpf copy #8 was merged. The code changes are byte-identical to the commit that ran over the air; only the docs moved, into docs/service-models.md. CI builds it as well.
  • VERSION, libe3.pc, new dependencies: N/A, none changed.

CI checklist

  • build and measure is green for the head commit (to check once CI has run).
  • Commit policy, run locally with libe3's scripts/check_commit_trailers.py --base origin/main --head HEAD: it passes (Assisted-by trailer).

Twin-repo coordination

  • This PR does not change the E3 wire protocol or public ABI, OR a paired PR exists in each affected twin repo (link below).

Two contracts change:

  • gNB ↔ codelet: jbpf_ran_slot_ctx grows from 47 to 49 B, and the verifier checks 49. e3_slot_desc keeps its size: the mask uses 2 of its reserved bytes. Paired PR: wineslab/ocudu-e3-private#4.
  • Controller ↔ dApp: APER already carried the validSymbolMask presence bit since the grammar update in Publish UL slots through a native gNB helper instead of a jbpf copy #8, so there is no new grammar. A dApp that ignores the field keeps working, and a missing mask should be read as 0x3FFF.

Workflow confirmation

🤖 Generated with Claude Code

@aferaudo
aferaudo force-pushed the feat/valid-symbol-mask branch from 00547d3 to 7b242eb Compare October 13, 2026 14:48
The gNB now tells the slot hook which symbols of each slot are uplink
(valid_symbol_mask: bit s = symbol s is uplink; DL and guard symbols of
a mixed slot are 0; FDD sets all). Carry it to the dApp:

- codelet: copy it from jbpf_ran_slot_ctx into e3_slot_desc, which
  uses 2 of its reserved bytes (same size);
- controller: pass it through SlotSample and send it as
  validSymbolMask (APER) and valid_symbol_mask (JSON), like OAI's
  L1-KPM SM;
- verifier: the slot ctx is now 49 B, not 47.
- docs: describe the mask in docs/service-models.md.

jbpf_e3_slot_api.h and jbpf_e3_ids.h are byte-identical to the ocudu
side, so build the codelets against an ocudu tree with the same change.

Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
@aferaudo
aferaudo force-pushed the feat/valid-symbol-mask branch from 7b242eb to 1304a15 Compare October 13, 2026 23:40
@aferaudo
aferaudo changed the base branch from tests/native-memcpy to main October 13, 2026 23:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant