Repository navigation
cell M6: the switch's own interruption (inter-frequency DAPS) - #560
Conversation
…e retune, fresh DL first, A3 frozen in flight The UE loop's pass after a switch is scheduled for the target's first superframe; the TSF is placed for the target's uplink slot right after the switch's retune (Kestrel's first beacon after a TSF step fires at the old phase: guarded against the target's active span); the CU seeds the target identity's uplink slot from the handover command; a DL frame after a switch leads with not-yet-offered PDUs (an offered one only just before the fresh PDU that would push it out of the UE's reorder window); a UE's A3 is frozen while its handover is in flight. Rig (m6_daps_xch, 4 runs per case): DL gap across the switch 122-123 ms with visits (225 before), no uplink lost before the switch. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
PR Summary by QodoReduce inter-frequency DAPS switch interruption
AI Description
Diagram
High-Level Assessment
Files changed (5)
|
Code Review by Qodo
1.
|
…s before the fresh one, placement retried, expedited pass kept, A3 restarted after a failed flight - pick_dl_pdus: an answer may have been lost, so every queued offered PDU the fresh one would push out of the UE's reorder window goes first (selftest: a 40-PDU backlog, every answer lost, through DlStreamRx: no gap). - switch_place: the stale TBTT counted from the expedited restart; a failed clock read/write keeps the placement pending, retried before the restart. - The expedited pass survives a failed clock read (2 ms retry, bounded). - The CU restarts a frozen A3 when its flight ends without the move. - cell.dl logs sn0/fresh/offered after visit answers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Review fixes pushed:
Rig on the fixed build: m6_daps_xch 3 runs per case passes (switch gap 123 ms in 4/6 visit runs; the two 225 ms runs had no fresh PDU queued yet at the first frame — cadence, per the new log). Regression passes: three_ho, measgap, crossing3, handover, daps, daps_dl, crossing. |
|
Qodo's re-review: all 5 findings resolved, 0 new; only alternatives remain. Adding skip-qodo-gate. |
Part of #260 (M6), epic #254. Follows #559.
The DL gap across an inter-frequency DAPS switch was ~2 superframes (225 ms) after #559's review fixes; the first uplink after the switch fired at the source's phase. This PR removes the switch's own share of the interruption.
UE (
examples/cell)cell.ue.switch_place). Kestrel's first beacon after a TSF step fires at the old phase (predicted 57.2 ms, observed 57.3); if that stale TBTT would land in the target's active span, the restart is held past it.DU (
examples/cell)pick_dl_pdus: a DL frame leads with not-yet-offered PDUs; an offered PDU goes only just before the fresh one that would push it out of the UE's reorder window while still recoverable. cell M6: DAPS across channels, downlink — the target answers each visit with its DL PDUs #559's rule (offered first once 24 sns behind) let a large offered backlog lead after the switch. Selftests: plain order, offered/fresh split, the lost-answer backlog, a 40-PDU backlog with a fresh PDU in the first frame.CU (
tools/ran-controller)m6_three_ho; no second command).Rig (testrig
m6_daps_xch.sh, 4 runs per case, cells on 149/157):Re-run on the final build (2 per case): 122–123 ms in 3 of 4 visit runs, 225 in one, where the first frame after the switch had no new PDU yet (100 ms PDU cadence); details in
docs/cell-m6.md. Regression on the rig: measgap, three_ho (3 runs), crossing3, handover, daps, daps_dl, crossing all pass.🤖 Generated with Claude Code