Repository navigation
Conversation
…their slot, CU PDUs on time, 32 PDUs per DL frame - DU: a DL frame's PDUs are picked and the frame built CELL_DL_PICK_LEAD_US (3 ms) before its slot, not right after the previous frame (a PDU arriving in between waited a superframe). - CU: the main loop's poll also wakes for the DL stream's next PDU (a fixed 50 ms let PDUs leave up to 50 ms late): spacing at the DU 99-102 ms. - kDlMaxPdus 8 -> 32: after a switch the out-of-window offered PDUs (~8 on the rig) filled the frame and held the fresh one a superframe. - cell.dl.pdu_in (a DAPS target's PDU arrivals), cell.dl pick_ms, answer t_ms: the timestamps that found these. Rig (m6_daps_xch, 4 runs per case): DL gap across the switch 122-123 ms in 7 of 8 visit runs, 166 in one (the source's frame had the newest PDU); before, 6 of 24 at 225 ms. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
PR Summary by QodoReduce downlink gaps at inter-frequency DAPS switches
AI Description
Diagram
High-Level Assessment
Files changed (4)
|
Code Review by Qodo
1.
|
…e, a frame too late for its slot is skipped; DUs serve DL in slot order - pick_dl_pdus: out-of-window offered PDUs never take the first fresh one's place (a queue with gaps could fill a frame with them); selftest 1..32 + 101. - A DL frame whose submission would start more than CELL_DL_GUARD_US into its slot is not aired (cell.dl.late_skip); PDUs and HARQ attempt go back. - That skip found a DU serving its UEs in grant order: with two UEs the one whose slot comes first was aired ~4 ms late into the other's slot, every frame. Now in DL-slot order. The m6_daps_dl crossing's longest DL silence went from 3.6-4.3 s to 0.39-1.03 s. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Review fixes pushed:
What the skip found: a DU with two UEs served them in grant order, not slot order. The UE whose slot comes first, a handed-over UE at position 1 next to the DU's own at 2, had every frame aired ~4.1 ms late into the other UE's slot. That was 404 of 404 frames in a crossing on the merged code; with the skip they were dropped, 440 per run. The DU now serves in DL-slot order. Rig on the final build: every M6 regression passes with 0 late skips (daps_dl, three_ho, crossing3, crossing, measgap, handover, daps), and so does m6_daps_xch (switch gap 122–123 ms, 166 where the source had the newest PDU). The daps_dl crossing's longest DL silence dropped from 3.6–4.3 s to 0.39–1.03 s. |
|
Qodo's re-review: both findings resolved, 0 new; only alternatives remain. Adding skip-qodo-gate. |
Part of #260 (M6), epic #254. Follows #560.
After #560, about 1 visit run in 4 still had a 225 ms DL gap across an inter-frequency DAPS switch. Timestamps on the target DU's clock found three causes:
CELL_DL_PICK_LEAD_US(3 ms) before its slot. DL send lateness is unchanged (p50 3 µs, p99 8 µs).poll(…, 50)meant a due PDU went out only when something woke the loop. The poll now also wakes for the next PDU; spacing at the DU is 99–102 ms in every run (one gap was >119 ms before).kDlMaxPdus8 → 32 (a fixed-length frame: +96 bytes, ~32 µs at 24 Mb/s), with astatic_assertthat the queue's out-of-window maximum plus the fresh one fit.New logs:
cell.dl.pdu_in(a DAPS target's PDU arrivals),pick_msoncell.dl,t_msoncell.daps.visit_dl.Rig (testrig
m6_daps_xch.sh, 4 runs per case, cells 149 → 157):The 166 ms run: the source's own frame had delivered the newest PDU before the last answer; the target's first frame carried the next one. Every first target frame carried the fresh PDU. Before: 6 of 24 visit runs at 225 ms. Regression on the rig passes: measgap, three_ho, crossing3, handover, daps, daps_dl, crossing.
🤖 Generated with Claude Code