Standard compliance

Summary (1.11.0). This page lists, clause by clause, the 3GPP and ITU-R rules that govern handover in 5G and beyond-5G systems, and how HandoverLab models each of them: as the standard specifies it (follows), with a stated abstraction (abstraction), or not yet (not modelled, with the roadmap item). The clauses were read from the official texts (TS 38.331 V17.18.0 and V18.11.0, TS 38.133 V17.23.0, V18.15.0 and V19.6.0, TS 38.300 V17.17.0, V18.11.0 and V19.4.0, TS 38.321 V17.15.0, V18.10.0 and V19.4.0, TS 38.322 V17.4.0, TS 38.213 V18.9.0 and V19.5.0, TS 38.215 V18.5.0 and V19.4.0, TS 38.101-1 V19.7.0, TS 38.101-2 V19.5.0, TS 38.423 V18.9.0, TS 37.340 V18.7.0, TS 38.104 V18.15.0, TR 38.901 V17.0.0 and V19.5.0, TR 37.885 V15.3.0, TR 36.885 V14.0.0, TR 38.811 V15.4.0, TR 38.821 V16.2.0, TR 36.839 V11.1.0, TR 38.913 V19.0.0, TR 38.914 V20.1.0, ITU-R M.2410-0 and M.2412-0). The page ends with the comparison against ns-3 / 5G-LENA, against handover statistics measured in commercial 5G networks and, since 1.10.0, against the DAPS and LTM requirements of TS 38.133 and published 3GPP evaluations.

The options added in 1.9.0 make the handover command and the execution follow TS 38.331; in 1.x they were switched off by default, and since 2.0.0 they are the defaults (handoverlab.stability.LEGACY_1X switches them off again). The 3GPP protocol profile is:

scenario:
  protocol: {cmd_during_t310: receive, t304_s: 1.0, rlm_holdoff_s: 0.2}

The options added in 1.10.0 bring SSB beams with beam management and beam failure recovery (radio.beams), several carriers with measurement gaps (radio.layers), the measurement periods of TS 38.133 (protocol.meas_periods: ts38133) and its RLM evaluation periods (protocol.rlm_eval: ts38133); they are also off by default, and without them every result and fingerprint of 1.9.0 is unchanged (handoverlab verify checks that the engine of the new options gives the same event log as the engine of 1.x when no option is set).

Since 1.11.0 the highway follows TR 37.885 (wrap-around, LOS-only links, the two site layouts of TR 36.885; options layout.wrap, layout.highway_sites, radio.los_model), and every scenario card was checked against the texts (next section).

Scenario cards against the texts (1.11.0)

Every value of every built-in card that names a source, and every default it relies on, was looked up in the text of the source (TR 38.901 V17.0.0, TR 37.885 V15.3.0, TR 36.885 V14.0.0, ITU-R M.2412-0). Outcome:

Card Finding Action
highway-10ghz 35 m roadside offset of TR 36.885 A.1.3 option 1 combined with the 500 m spacing of option 2; 10 GHz (TR 37.885: 2 or 4 GHz below 6 GHz, 30 GHz above); LOS from a probability (Table 6.2.1-2: LOS only); no wrap-around (Table A-1) deprecated in 1.11.0, removed in 2.0.0; replaced by highway-tr37885-4ghz (option 1) and highway-tr37885-30ghz (option 2)
dense-urban-2layer the UMa macro layer had the UMi shadowing (7.82 dB NLOS, 10 m); the in-car users had no car penetration loss (M.2412-0 Annex 1 clause 3.3: 9 dB, 5 dB); no minimum BS-UT distance corrected: UMa 4 / 6 dB and 50 m, UMi 4 / 7.82 dB and 13 m per layer (TR 38.901 Tables 7.4.1-1, 7.5-6), 9 / 5 dB car loss, 35 m (Table 7.2-1)
urban-grid-28ghz-beams UE noise figure 7 dB (M.2412-0 Table 5b at 30 GHz: 10 dB) corrected to 10 dB
indoor-office-4ghz citations of the bandwidth and of the 12 sites (M.2412-0 Table 5a, clause 8.3.1); UE height 1 m of TR 38.901 with the link budget of M.2412 (1.5 m) citations corrected; the mixed source stated
urban-grid cards (urban-grid-10ghz, fr3-urban-15ghz, smoke, urban-grid-28ghz-beams) TR 37.885 has 500 m macro sites with UMa in the urban grid (ours: small cells on UMi); speeds 52-63 km/h around the 60 km/h of option A; users closer than the 10 m minimum distance of UMi stated on the cards as assumptions in 1.11.0; since 2.0.0 every vehicle drives at exactly 60 km/h in a lane of 3.5 m (profile v60) and the path loss is evaluated at 10 m or more (radio.pl_min_distance_m); the small cells on UMi remain an assumption
fr3-urban-15ghz "FR3 (7.125-24.25 GHz)" is not a range of TR 38.901, which studies "7-24 GHz" in Release 19 wording corrected

TR 38.901 V19.5.0 (Release 19, with the 7-24 GHz study) was compared with V17.0.0: the path loss of RMa, UMa, UMi and InH (Table 7.4.1-1), the LOS probabilities (Table 7.4.2-1) and the shadowing rows and correlation distances of Table 7.5-6 are unchanged; Release 19 changed small-scale spreads, which HandoverLab does not model, the IRR-glass loss of Table 7.4.3-1 (note 2: 25.4 + 0.11 f dB; the calibration against R1-165974 keeps the earlier 23 + 0.3 f dB, see radio calibration), and added the SMa scenario. Notes 1 and 5 of Table 7.4.1-1 take c = 3.0e8 m/s in the breakpoint distances; up to 1.12.0 HandoverLab took the exact speed of light (0.07 % longer breakpoints), since 2.0.0 it takes 3.0e8 m/s (radio.breakpoint_c_mps).

Since 2.1.0 the cards were checked again against TR 38.901 V19.5.0, TR 37.885 V15.3.0, TR 38.811 V15.4.0, TR 38.821 V16.2.0 and ITU-R M.2412-0:

Card Finding Action (2.1.0)
urban-grid cards (smoke, urban-grid-10ghz, fr3-urban-15ghz, urban-grid-28ghz-beams) UE antenna 1.5 m with the TR 37.885 urban option A (100 % vehicle type 2: antenna height 1.6 m, clause 6.1.2) radio.ue_height_m: 1.6
indoor-office-4ghz speeds spread +-10 % (M.2412-0 Table 5a: "Fixed and identical speed", 3 km/h); LOS probability of the mixed office with the 12-site layout of M.2412-0 clause 8.3.1, which takes Table A1-9 (InH_x: the open office) profile p3 (exactly 3 km/h); radio.pathloss: inh_office_open
rural-700mhz speeds spread +-10 % (M.2412-0 Table 5c: fixed, 120 km/h in car) profile v120
dense-urban-2layer 8.33 m/s for 30 km/h profile v30 (30/3.6 m/s)
highway cards lateral offset of up to 0.5 m in the lane, which TR 37.885 does not specify; shadowing half correlated between sites (a value of the TR 36.885 model; TR 37.885 clause 6.2.2 takes the shadowing of TR 38.901 for B2V links) profile v140c (lane centre); uncorrelated shadowing (below)
ntn-leo600-2ghz LOS probability of TR 38.811 with clutter loss in NLOS, while the baseline of TR 38.821 Table 6.1.1.1-5 is "Clear Sky, Line of sight" ntn.los_model: los

handoverlab.stability.LEGACY_CARDS lists the old card values.

Large-scale channel (TR 38.901 V19.5.0 clause 7; 2.1.0, radio.channel_detail)

radio.channel_detail: 3gpp (the default since 2.1.0) gives the rows below; simple gives the model of 2.0.0 and 1.x (Gaussian-shaped field correlation, shadowing 0.5-correlated between sites, no C'(h_UT), no height checks) and is part of handoverlab.stability.LEGACY_1X.

Rule Clause HandoverLab Status
Path loss of RMa, UMa, UMi street canyon, InH-Office, LOS and NLOS; breakpoints with c = 3.0e8 m/s Table 7.4.1-1, notes 1 and 5 radio.pathloss; every coefficient checked by verify --only pathloss follows
Applicability ranges: d2D >= 10 m; UMa/UMi 1.5 m <= h_UT <= 22.5 m; RMa 10 m <= h_BS <= 150 m, 1 m <= h_UT <= 10 m; d2D <= 5 km (RMa LOS 10 km); InH 1 m <= d3D <= 150 m Table 7.4.1-1 the formulas are evaluated at d2D >= 10 m (radio.pl_min_distance_m); heights outside the ranges are refused; links longer than the upper bound give a warning, and the formulas are used there (rural card: up to about 6.4 km) follows (heights, lower bound); abstraction above the upper bound
UMa effective environment height h_E: 1 m with probability 1 / (1 + C(d2D, h_UT)), otherwise uniform(12, 15, ..., h_UT - 1.5); LOS probability with C'(h_UT) Table 7.4.1-1 note 1; Table 7.4.2-1 both, per link (place-tied on the street grid, per user and site elsewhere); they differ from h_E = 1 m only for h_UT >= 13 m follows
LOS probability: RMa, UMi, UMa, InH mixed office and open office Table 7.4.2-1 radio.pathloss inh_office (mixed) or inh_office_open (open office) follows
Shadow fading: log-normal, autocorrelation R(dx) = exp(-|dx| / d_cor) 7.4.4, Eq. (7.4-5); Table 7.5-6 place-tied field generated exactly with this covariance on the raster (circulant embedding), unit variance between raster points; along a user's own path an AR(1) process, which has the same exponential autocorrelation. On the street grid the radio map (path loss and shadowing, radio.map_res_m, 1 m) is interpolated linearly between its pixels, which smooths the field below the pixel size follows (map raster: numerical setting)
LSPs of different BS-UT links uncorrelated, co-sited sectors equal 7.5 step 4 shadowing uncorrelated between sites (radio.shadow_site_corr unset); sectors of a site share the site's value follows
Separate LOS and NLOS shadowing parameters (sigma and d_cor) Tables 7.4.1-1, 7.5-6; 7.6.3.4 separate sigma; one d_cor per card (UMi street grid: the LOS 10 m also for NLOS, NLOS 13 m), and LOS and NLOS links share one unit realisation, so the shadowing keeps its sign when a link changes state abstraction (stated on the cards)
Spatially consistent LOS state: a realisation of a correlated random variable compared with the LOS probability; correlation distance of Table 7.6.3.1-2; site-specific (uncorrelated between sites) 7.6.3.1, 7.6.3.3, Table 7.6.3.4-1 street grid: a place-tied field with exp(-d / d_cor), applied to the links that the buildings leave clear, so the LOS share is P(clear) x Pr_LOS, below Table 7.4.2-1; open area and indoor: an AR(1) process along each user's path, not shared between users follows (state); abstraction (combination with the buildings, open-area process)
Soft LOS state, Eqs. (7.6-18), (7.6-19) 7.6.3.3 radio.soft_los: power weights LOS_soft^2 and 1 - LOS_soft^2 (no fast fading, so no cross term) follows (power level)
Multi-frequency: the same LOS state (Step 2) and LSPs (Step 4) on all frequencies of one link 7.6.5 layers with cosited: true reuse the random fields of the first layer; their pathloss, los_corr_m and shadow_decorr_m must equal those of the first layer (checked since 2.1.0); soft LOS may differ with the frequency, as 7.6.5 allows follows
O2I car penetration loss N(9, 5^2) per UT 7.4.3.2 radio.penetration_db, penetration_sd_db follows (option)
Fast fading: TDL-A .. TDL-E taps, Jakes Doppler per tap with f_D = |v| / lambda_0, LOS tap of TDL-D / -E at f_S = 0.7 f_D with K1 13.3 / 22 dB, delay scaling Eq. 7.7-1, K-factor change Eq. 7.7.6-1/-2 7.7.2 (Tables 7.7.2-1 to -5), 7.7.3, 7.7.6 radio.fast_fading (2.2.0, off by default), delay_spread_ns, fading_k_db: one TDL per scenario, independent per user-cell link, 32 sinusoids per Rayleigh tap, channel at 4 points of the PDCCH band and 8 of the carrier (guide); MIMO extension 7.7.5 and CDL not used follows (option; single-link TDL)

Map-based channel model (1.12.0, radio.map_file)

TR 38.901 V19.5.0 clause 8 defines a map-based hybrid model: deterministic ray tracing on a digitized map plus stochastic components of clause 7, "not calibrated and can be used per company basis", with the map format left to the implementation. For ray-traced maps HandoverLab follows the deterministic large-scale part of clause 8 (a path gain per site and pixel from a ray tracer, handoverlab.mapfile; clause 8.4 step 1: "Import digitized map") and does not model the random clusters added from step 4 on, nor the small-scale part (ray-level phases, Doppler), as nowhere else in HandoverLab. Maps from measurements can be read in the same format, but they are outside TR 38.901 (abstraction).

Non-terrestrial networks (2.0.0, layout.kind: ntn)

Rule Clause HandoverLab Status
Earth a sphere of radius 6371 km; satellite antenna 4 |J1(ka sin t) / (ka sin t)|^2 TR 38.811 V15.4.0 6.3, 6.4.1 so; since 2.1.0 ka is set so that the pattern has the tabled 3 dB beamwidth (next rows; until 2.0.0 ka came from the aperture, 0.16 % wider for 2 m) follows
LOS probability per elevation (reference elevations 10-90 degrees) TR 38.811 Table 6.6.1-1, 6.6.1 ntn.los_model: probability: the value of the nearest reference elevation, as 6.6.1 prescribes ("taken from the nearest reference elevation angle"; 6.6.2 likewise for shadowing and clutter), a spatially correlated state along each user's path follows (nearest reference elevation, as 6.6.1 and 6.6.2 prescribe); the process along the path is an abstraction (next row)
Propagation conditions of the system-level simulations: "Base-line: Clear Sky, Line of sight" TR 38.821 Tables 6.1.1.1-5, 6.1.1.1-7 ntn.los_model: los (since 2.1.0; the card ntn-leo600-2ghz uses it): every link LOS, no clutter loss, LOS shadowing follows (option)
Time variation of LOS state and shadowing TR 38.811 6.5.1: "Only drop-based simulations are considered" AR(1) processes in the user's own displacement only; the change of the line of sight with the moving satellite does not decorrelate them abstraction (not specified)
Basic path loss PLb = FSPL(d, fc) + SF + CL, FSPL = 32.45 + 20 log10 fc + 20 log10 d, slant range d TR 38.811 Eqs. 6.6-2..6.6-4, Tables 6.6.2-1..3 so, with the shadowing and clutter loss of the S band for suburban and rural areas follows
Atmospheric loss Azenith / sin(alpha) TR 38.811 Eq. 6.6-8 ntn.atm_zenith_db (0.045 dB, derived from the link budgets of TR 38.821 Table 6.1.3.3-1) follows
Ionospheric scintillation TR 38.821 Table 6.1.3.2-1 note 1 (link-budget margin, P3 curve for 1 % of the time); Table 6.1.1.1-5 note 2 (zero for the calibration) ntn.scintillation_db (2.2 dB, a fixed loss on every link) abstraction (link-budget margin; set 0 for the calibration of Table 6.1.1.1-5)
LEO-600 Set-1 S band, handheld UE, 19 beams on the UV plane, spacing sqrt(3) sin(HPBW / 2) from the 3 dB beamwidth ("Only the 3dB beam width parameters should be used"), reuse 1 TR 38.821 V16.2.0 Tables 6.1.1.1-1, -3, -4, -5 the card ntn-leo600-2ghz; since 2.1.0 the tabled 4.4127 degrees (ntn.hpbw_deg unset), spacing 0.06668 (Table 6.1.1.1-6, informative: 0.0668); reuse 3 and 2 not modelled follows (option 1)
Wrap-around for FRF = 1: two additional tiers of beams around the 19 beams TR 38.821 6.1.1.1, after Table 6.1.1.1-5 not modelled: only the 19 beams interfere abstraction
Central beam: baseline for C2/D2 at nadir (90 degrees, (0, 0) on the UV plane); case 2 from a target elevation allowed TR 38.821 Tables 6.1.1.1-4, 6.1.1.1-6 ntn.centre_elevation_deg (card: 30 degrees, the LEO target elevation of Table 6.1.3.2-1; not the baseline) follows (case 2, non-baseline)
Link budget of the S-band LEO cases TR 38.821 Table 6.1.3.3-1 verify --only ntn, N1: within 0.028 dB follows
Satellite speed 7.56 km/s, maximum round-trip delay 25.77 ms (C2) TR 38.821 Table 7.1-1 circular orbit from the altitude; the worst-case delay added to preparation and execution follows (one delay for every user)
condEventD1 / D2: entering Ml1 - Hys > Thresh1 and Ml2 + Hys < Thresh2, leaving Ml1 + Hys < Thresh1 or Ml2 - Hys > Thresh2; with D2 the reference locations move TS 38.331 V18 5.5.4.15, 5.5.4.15a rule cho_d2: reference locations = beam centres on the ground at time t follows
D1 / D2 configured together with A3, A4 or A5 TS 38.331 CondReconfigToAddMod cho_d2 requires D2 and A3; one time-to-trigger for both follows (one TTT, a simplification)
condEventT1, RACH-less NTN handover, earth-fixed beams, several satellites, feeder link, Doppler TS 38.331 5.5.4.16; TS 38.300 16.14 not modelled not modelled

Measurements and triggering

Rule Clause HandoverLab Status
L3 filter F_n = (1 - a) F_(n-1) + a M_n, a = 1/2^(k/4), default k = 4, in dB; the filter adapted to other input rates so that its time characteristics are kept, with k defined for a sample rate X = one intra-frequency L1 measurement period of the frequency range TS 38.331 V18.11.0 5.5.3.2 (second bullet) protocol.l3_k; the coefficient is converted to the L1 sample period with X of the carrier's frequency range: 200 ms in FR1 (and FR3), 480 ms in FR2-1 at an SMTC of 20 ms (TS 38.133 9.2.5.2), per cell with several carriers (since 2.1.0; 2.0.0: 200 ms everywhere) follows
L1 measurement period without gaps: FR1 max(200 ms, ceil(5 Kp) T_SMTC), FR2 max(400 ms, ceil(M_meas Kp K_layer1) T_SMTC) (M_meas 24 or 40 in FR2-1) TS 38.133 9.2.5.2 (Tables 9.2.5.2-1/-2), 9.2.5.1 (M_meas) default: L1 samples every protocol.l1_period_s (40 ms) into the time-equivalent filter. With protocol.meas_periods: ts38133 (1.10.0): the linear average of the samples over the period of the cell's frequency range (200 ms FR1, 480 ms FR2-1 at T_SMTC 20 ms, power class protocol.fr2_power_class), delivered once per period; Kp = K_layer1 = CSSF = 1 follows with the option
Inter-frequency measurements within gaps: gap patterns (MGL, MGRP); period FR1 Max(200 ms, Ceil(8 Kgap) Max(MGRP, T_SMTC)) CSSF, FR2 Max(400 ms, Ceil(Kgap M_meas_inter) Max(MGRP, T_SMTC)) CSSF; no reception from the serving cell during a gap TS 38.133 9.1.2 (Table 9.1.2-1), 9.3.4, 9.3.5 (Tables 9.3.5-1/-2), 9.1.5.2 radio.layers with meas_periods: ts38133: gap pattern protocol.gap_pattern (default 0: 6 ms every 40 ms), 320 ms (FR1) and 1.6 s (FR2-1) at T_SMTC 20 ms; Kgap = 1, CSSF = number of other carriers (equal sharing); every user has the gap pattern and gets no data for MGL / MGRP of the time follows with the option
L3 filter input rate: X = one intra-frequency L1 period of the frequency range TS 38.331 5.5.3.2 X of each cell's frequency range (since 2.1.0 also by default, see the first row); with meas_periods: ts38133 the coefficient is adapted to each cell's delivery period (a = 1/2^(k/4) exactly at the intra-frequency rate) follows
SS-RSRP accuracy: FR1 absolute +-4.5 dB (normal) / +-9 dB (extreme), relative +-2 / +-3 dB; FR2 absolute and relative +-6 / +-9 dB TS 38.133 10.1.2 and 10.1.3 (Tables 10.1.2.1.1-1, 10.1.2.1.2-1, 10.1.3.1.1-1, 10.1.3.1.2-1) Gaussian error radio.l1_error_db (1 dB) per L1 sample; the standard gives bounds, not a distribution abstraction (inside the bounds)
SS-RSRP, RSRQ, SINR definitions TS 38.215 5.1 received power per site (wideband), SINR with load-weighted interference; no RSRQ. With beams or layers (1.10.0): SS-RSRP per resource element as the power over the bandwidth spread evenly over the 12 N_RB subcarriers of the transmission bandwidth configuration (TS 38.101-1 V19.7.0 / TS 38.101-2 V19.5.0 Table 5.3.2-1; since 2.1.0 with channel_detail: 3gpp; a bandwidth without a table entry, FR3 and simple: B / SCS subcarriers, guard bands included), per SSB beam; the SSS power is not boosted relative to the data REs abstraction (flat spectrum)
Event A3: Mn + Ofn + Ocn - Hys > Mp + Ofp + Ocp + Off, cell individual offsets TS 38.331 5.5.4.4 gap_db > off_db with off_db = Off + Hys and per-cell-pair offsets (CIO) from the rule hooks; Ofn = Ofp = 0 (no offsetMO per measurement object) follows (entering condition); the leaving hysteresis is not separate; offsetMO not modelled
Time-to-trigger: the condition holds for all L3-filtered samples during TTT; TimeToTrigger ms0, 40, 64, 80, 100, 128, 160, 256, 320, 480, 512, 640, 1024, 1280, 2560, 5120 TS 38.331 5.5.4.1; TimeToTrigger (V18.11.0 p.1159) entry time per user and neighbour; the report at the expiry of the TTT, also between two measurement instants; since 2.1.0 the same for the CHO execution condition (5.3.5.13.4 uses the same wording; 2.0.0: at the next instant). Other values are accepted; handoverlab.standard, the verify group values and the study gate standard_values flag them follows
Report interval ReportInterval ms120 ... min30 TS 38.331 ReportConfigNR (V18.11.0 p.1053) protocol.report_interval_s (0.12 s); one reporting grid shared by all users, reportAmount infinite, no reportOnLeave (5.5.5, 5.5.4.1 use a timer per measId and UE) follows (value); abstraction (one grid)
Cell quality from the beams: the highest beam, or the linear average of up to nrofSS-BlocksToAverage beams above absThreshSS-BlocksConsolidation TS 38.331 5.5.3.3 default: one value per cell. With radio.beams (1.10.0): exactly this rule (ssb_avg, ssb_thresh_dbm) on the beam L1 values, then the L3 filter follows with the option
Event A5: Mp + Hys < Thresh1 and Mn + Ofn + Ocn - Hys > Thresh2 TS 38.331 5.5.4.6 rule a3a5 (1.10.0): A5 towards other carriers (thresholds per direction), A3 within a carrier; Ofn = Ocn = 0; with a3_inter the A3 towards other carriers shares the A5 time-to-trigger and entry time (one timer per cell, where 3GPP has two events) follows (entering condition); a3_inter: abstraction
Rule Clause HandoverLab Status
Qout = 10 % and Qin = 2 % BLER of a hypothetical PDCCH (Tables 8.1.2.1-1/-2: AL8 at +4 dB, AL4 at 0 dB to the SSS) TS 38.133 8.1.1, 8.1.2.1 SINR thresholds protocol.qout_db (-8 dB), qin_db (-6 dB) of TR 36.839 Table 5.2.1.3.1, with no BLER mapping; the 2 dB gap is the TR 36.839 value, not derived from the two hypothetical PDCCH abstraction (TR 36.839 thresholds)
Evaluation of out of sync Max(200, Ceil(10 P) T_SSB) and in sync Max(100, Ceil(5 P) T_SSB) ms in FR1 without DRX (200 / 100 ms for T_SSB <= 20 ms); FR2 with the factor N (8 in FR2-1, 12 in FR2-2) TS 38.133 8.1.2.2 (Tables 8.1.2.2-1/-2) filtered SINR with protocol.qout_window_s 0.2 s and qin_window_s 0.1 s (exponential averaging; fixed, whatever T_SSB); with protocol.rlm_eval: ts38133 (1.10.0) the windows of the serving cell's frequency range and T_SSB (FR2-1 at T_SSB 20 ms: 1.6 s and 0.8 s), P = 1 abstraction (window shape; ts38133 for the lengths)
RLM reference signals: up to N_RLM (2, 4 or 8 for L_max 4, 8, 64); out of sync when all RLM-RS are below Qout; without configured RLM-RS the RS of the active TCI state of the PDCCH TS 38.133 8.1.1 (Table 8.1.1-2); TS 38.213 5; TS 38.331 RadioLinkMonitoringConfig with radio.beams (1.10.0): rlm_rs: tci (default) the serving beam, rlm_rs: beams the N_RLM best beams of the last beam report (the best of them counts; since 2.1.0 only these N_RLM, 2.0.0 also the serving beam); the set changes with every report, as an implicit RRC reconfiguration; L_max for paired spectrum (the 1.88 GHz limit of unpaired Case C is not modelled) follows with the option
Out-of-sync / in-sync indications at least max(10 ms, T_RLM-RS) apart; N310 counts out-of-sync while T310 is stopped and is reset by in-sync, N311 counts in-sync while T310 runs and is reset by out-of-sync, both reset by a reconfiguration with sync; T310 starts at N310, stops at N311; defaults 1000 ms, n1, n1 TS 38.133 8.1.6; TS 38.331 7.2, 5.3.10.1-2 (NOTE 2), 9.2.3 t310_s, n310, n311 with these defaults and value sets; indications every max(10 ms, ssb_period_s) (since 2.1.0; 2.0.0: every step, and for N > 1 the counters were reset by an instant without indication) follows
T310 cannot start while T304 runs; with DAPS the source T310 starts on N310 out-of-sync while T304 runs, and its expiry is a source RLF that releases the source TS 38.331 5.3.10.1, 5.3.10.3 no link monitoring during an execution; for DAPS (with T304) the source link is monitored during the execution and a source RLF releases it (since 2.1.0) follows
RLF on T310 expiry, then re-establishment: T311 runs during cell selection (TS 38.304), the UE goes to RRC_IDLE if T311 expires TS 38.331 5.3.10.3, 5.3.7.2, Table 7.1-1 failure, then re-establishment that always succeeds, in the cell with the best L3 measurement, after protocol.reest_s (1 s); no cell suitability check, no T311 / T301 expiry, no RRC_IDLE abstraction (delay: TS 38.133 6.2.1.2.1 bounds it by 50 ms + cell identification, in FR1 200 ms for a known and 800 ms for an unknown cell (Table 6.2.1.2.1-1), + system information + PRACH; TR 36.842 Table E.1-2 assumes 250 ms)
RLF on an RA problem or on RLC max retransmissions TS 38.331 5.3.10.3; TS 38.321 5.1; TS 38.322 5.3.2 with radio.beams (1.10.0): a beam failure recovery whose random access reaches preambleTransMax is a radio-link failure; otherwise failures come from link monitoring and execution (no RLC model) follows for beam failure recovery; abstraction otherwise
T312 (optional, useT312) TS 38.331 5.3.10, 5.5.4.1 not modelled not modelled (optional feature)
Link monitoring restarts on a newly joined cell: the quality is evaluated over the last T_Evaluate_out TS 38.133 8.1.2.2 (interpretation; no clause defines a hold-off) protocol.rlm_holdoff_s (0.2 s, default since 2.0.0): no out-of-sync for this time after joining a cell, whatever the frequency range abstraction (interpretation of 8.1.2.2)
In-car penetration loss per user, 9 dB +- 5 dB TR 38.901 7.4.3.2 radio.penetration_db, penetration_sd_db, any speed follows (option)
Qout / Qin as the BLER of a hypothetical PDCCH on the faded channel TS 38.133 8.1, Tables 8.1.2.1-1/-2 (QPSK, 24 PRBs) with radio.fast_fading (2.2.0): the MIESM effective SINR of QPSK over the 24-PRB band against qout_db / qin_db (flat-channel SINRs); without it the wideband SINR abstraction (no link-level BLER curve)

Handover procedure

Rule Clause HandoverLab Status
Baseline handover steps: report, preparation, command, execution, completion TS 38.300 9.2.3.2.1 report after TTT, preparation prep_s (50 ms, TR 36.839 Table 5.2.4.1), command, execution exec_s (40 ms) follows (timing abstraction)
A command received while T310 runs is executed: "stop timer T310" (if no DAPS bearer is configured) and "start timer T304" TS 38.331 5.3.5.5.2 protocol.cmd_during_t310: receive (1.9.0, default since 2.0.0): the command is received at the first step with link-monitoring SINR >= Qout and stops T310 (with DAPS since 2.1.0 the source T310 goes on); T310 expiry first ends in RLF (too late). 1.x default lost: lost at once, stricter than TR 36.839 5.2.1 and 5.4.1 follows
A CHO configuration (RRCReconfiguration with conditionalReconfiguration) is stored whenever it is received; no condition on T310 TS 38.331 5.3.5.13.1, 5.3.5.13.3 since 2.0.0, with cmd_during_t310: receive: received like a command at the first step with SINR >= Qout, T310 goes on; with lost (1.x) lost while T310 runs follows
Lost command: no UE rule; the outcome follows from RLF detection TS 38.331 (none); TR 36.839 5.2.1 (evaluation rule: T310 running at reception = handover failure) see the row above follows with the option
T304: started at execution, stopped by a successful random access; expiry = handover failure, re-establishment; RA problems during T304 are not RLF; MAC retries TS 38.331 5.3.5.3, 5.3.5.8.3, 5.3.10.3; TS 38.321 5.1 protocol.t304_s: 1.0 (1.9.0, default since 2.0.0): the UE joins at the first step with target SINR >= Qout and fails only when T304 expires. 1.x default (none): the target must reach Qout at the end of the execution time (TR 36.839 5.2.1 state 3) follows
Interruption: T_interrupt = T_search + T_IU + T_processing (<= 20 ms) + T_delta (= Trs for a 20-PRB SSB) + T_margin (<= 2 ms); T_RRC 10 ms TS 38.133 6.1.1.2.2; TS 38.331 12 exec_s 40 ms (inside the bound); metric interruption_s_pm follows (abstraction)
Mobility interruption target 0 ms TR 38.913 7.7; ITU-R M.2410 4.12 measured per rule (DAPS and LTM reach it closely) measured
Xn handover preparation (TXnRELOCprep, no value in the spec) TS 38.423 8.2.1 preparation delay prep_s abstraction
Measurement-based admission control, multi-connectivity TS 38.300 9.2.3.2.1 (admission control), 4.5 (MR-DC) not modelled (admission always succeeds) abstraction

Conditional handover, DAPS, LTM and conditional LTM

Rule Clause HandoverLab Status
CHO: up to 8 candidates (maxNrofCondCells); execution condition with its time-to-trigger; execution starts T304, stops T310; choice among several triggered cells left to the UE; conditional configurations removed after a successful execution TS 38.331 5.3.5.13, 5.3.5.3; TS 38.300 9.2.3.4 rule cho: condEventA3 only (A4 / A5 not modelled), n_max (<= 8), execution offset and TTT, executed at the expiry of the TTT (since 2.1.0), the best triggered cell follows (condEventA3)
CHO / LTM recovery: after RLF, the stored configuration of the selected candidate is applied with a reconfiguration with sync (attemptCondReconfig, attemptLTM-Switch); T304 expiry then leads to re-establishment TS 38.331 5.3.7.3, 5.3.5.8.3 protocol.cho_recovery_s (0.4 s); since 2.1.0 the UE joins only when the candidate's SINR reaches Qout while T304 runs, otherwise it re-establishes (2.0.0: always joined) follows (delay abstraction)
DAPS: source link kept during execution; T310 not stopped; source RLF during T304 releases the source; at T304 expiry back to the source unless a source RLF was detected; not FR2 to FR2, not for NTN TS 38.300 V18.11.0 9.2.3.1 (FR2 to FR2), 9.2.3.2, 16.14.3.2.1 (NTN); TS 38.331 5.3.5.5.2, 5.3.10.1, 5.3.10.3, 5.3.5.8.3 rule daps with fallback and source_data; since 2.1.0 every item of this row (an FR2-to-FR2 handover of a DAPS rule is a baseline one; a DAPS rule on the NTN layout is refused); 2.0.0: T310 stopped, no source monitoring, fallback if the source SINR was at least Qout follows
LTM (Rel-18): candidates configured in advance, MAC CE cell switch on L1 reports, early TA / RACH-less, T304, T310 stops, the ltm-Config kept across a cell switch, recovery into a candidate TS 38.300 9.2.3.5 (Rel-18); TS 38.331 5.3.5.18 (5.3.5.18.6); TS 38.321 6.1.3.75 rule ltm: L3-based candidates, L1 switch condition, cmd_delay_s 10 ms (as a delay before the UE receives the command, during which it can wait or be lost; TS 38.133 counts T_cmd after reception), exec_s 20 ms (RACH-less), recovery; the other candidates stay configured after a switch (since 2.1.0; 2.0.0: released); after a switch T310 / N310 / N311 keep their configured values (5.3.5.18.6 applies the 9.2.3 defaults; equal unless changed) follows (timing abstraction; one gNB-CU is not modelled)
LTM delay D_LTM = T_HARQ + 3 ms + T_LTM-interrupt; T_LTM-processing 20 ms within FR1 or FR2, 40 ms between them (no ltm-FastUE-Processing) TS 38.133 V18.15.0 6.3, 6.3.1.3 10 ms + 20 ms; since 2.1.0 20 ms more for a switch between FR1 and FR2 follows (abstraction)
Conditional LTM (Rel-19): UE executes on L1 events LTM3/LTM5, up to 8 candidates, intra-gNB, RACH-less with a valid TA TS 38.300 V19.4.0 9.2.3.7; TS 38.331 Rel-19 (not in V18.11.0) rule cltm: a generic L1 switch offset evaluated by the UE, no command; not the LTM3 / LTM5 events with their hysteresis, offsets and TTT abstraction
RACH-less execution: LTM with early TA (Rel-18), conditional LTM (Rel-19); RACH-less L3 handover with a configured or dynamic grant TS 38.300 V18.11.0 9.2.3.5.1, V19.4.0 9.2.3.7.1; 9.2.3.6 (L3 handover) LTM and CLTM executions are RACH-less follows for LTM / CLTM; RACH-less L3 handover not separate

Beams and beam failure recovery (1.10.0, radio.beams)

Rule Clause HandoverLab Status
Antenna: uniform rectangular panel, element pattern (3 dB widths 65 deg, 30 dB limits, 8 dBi), DFT weights for the electrical tilt TR 38.901 7.3, Table 7.3-1, Eq. 7.3-1 sectors panels per site, panel = [M, N] at lambda/2, tilt tilt_deg; horizontal DFT weights of the same form steer n_ssb SSB beams spread over the sector (the codebook is a deployment choice) follows (codebook: assumption)
At most L_max SSBs per cell (4 up to 3 GHz, 8 in FR1, 64 in FR2) TS 38.133 Table 8.1.1-2 checked on n_ssb follows
Multi-frequency: the same LOS state, large-scale parameters and blockers on all frequencies of one link TR 38.901 7.6.5 layers with cosited: true reuse the random fields of the first layer; other layers have their own sites and fields follows
Serving beam (TCI state) from L1-RSRP beam reports; L1-RSRP over max(T_Report, ceil(M P N) T_SSB), N = 8 in FR2 (Table 9.5.4.1-2); MAC-CE TCI switch delay T_HARQ + 3 ms + TO_k (T_first-SSB + 2 ms) TS 38.133 9.5.4.1, 8.10.3 beam L1 values averaged with the time constant of that period (M = 3, with T_Report = report_s and N = 8 in FR2 since 2.1.0), reports every report_s, switch to the best beam when it is switch_db better, tci_delay_s (10 ms: TO_k = 0, a TCI state in the active list) later abstraction (switch decision)
BFD-RS: without failureDetectionResources the periodic CSI-RS of the active TCI states of the PDCCH (at most 2); an SSB may be in the set q0 TS 38.213 6; TS 38.133 8.5.1; TS 38.331 RadioLinkMonitoringConfig the SSB of the serving beam (one BFD-RS, as TS 38.133 8.5.1 allows) follows (abstraction: SSB instead of CSI-RS)
Beam failure instance when the quality of all BFD-RS over T_Evaluate_BFD = Max(50, Ceil(5 P N) T_SSB) is worse than Qout_LR (10 % BLER of a hypothetical PDCCH at 0 dB to the SSS, Table 8.5.2.1-1, where Qout of RLM has +4 dB, Table 8.1.2.1-1); indications at least max(2 ms, T_SSB) apart TS 38.133 8.5.1, 8.5.2.1, 8.5.2.2, 8.5.4; TS 38.213 6 SINR of the serving beam averaged with the time constant T_Evaluate_BFD (FR1 100 ms, FR2-1 800 ms at T_SSB 20 ms) against Qout_LR = protocol.qout_db + 4 dB in SSB SINR (since 2.1.0; 2.0.0: qout_db), an indication every max(2 ms, T_SSB) follows (window shape: abstraction)
BFI_COUNTER, beamFailureDetectionTimer (pbfd1-10, in indication periods), beamFailureInstanceMaxCount (n1-n10); an indication starts or restarts the timer; counter reset on timer expiry, on a new BFD-RS and on successful recovery TS 38.321 5.17; TS 38.331 RadioLinkMonitoringConfig bfd_timer, bfi_max with these value sets; since 2.1.0 an indication that falls on the timer's expiry restarts it (2.0.0 reset the counter first, so with pbfd1 it never passed 1) follows
Recovery by random access on the SpCell: contention-free on a candidate SSB of candidateBeamRSList with SS-RSRP above rsrp-ThresholdSSB while beamFailureRecoveryTimer (ms10-ms200) runs, otherwise contention-based; success ends the recovery; preambleTransMax failed attempts = random-access problem TS 38.321 5.1.1-5.1.4, 5.17; TS 38.331 BeamFailureRecoveryConfig candidateBeamRSList = all SSBs of the cell, with contention-free resources for each; candidate beams from the filtered beam values (the candidate beam detection period of Tables 8.5.5.2-1/-2 equals the L1 period with M = 3 in FR1 and FR2-1 when T_Report <= ceil(3 N) T_SSB); one attempt takes ra_attempt_s (contention-based: twice), succeeds if the chosen beam's SINR >= Qout; preamble_max from the preambleTransMax values follows (RA timing and success: abstraction)
Random-access problem of the SpCell while T300, T301, T304, T311, T319 are not running = RLF TS 38.331 5.3.10.3 the recovery's RA problem is an RLF (beam failure recovery does not run during an execution) follows
Relation of beam failure recovery to T310 TS 38.133 8.1 (RLM) and 8.5 (BFD) are separate; TS 38.321 5.17 does not touch T310 the two run side by side: recovery does not stop T310, T310 expiry is an RLF during a recovery; a recovered beam ends out-of-sync through RLM. The coupling is not specified (implementation) follows; coupling stated
Interference of a cell (not specified) a cell with beams interferes with the mean gain of its beams towards the user (a cell serving on all its beams), scaled by its load; without beams the abstraction of 1.x abstraction

What the beam model leaves out: CSI-RS beams and their refinement (data beams equal SSB beams), UE receive beamforming (only the factor N of TS 38.133), two BFD-RS sets (multi-TRP), SCell beam failure recovery, DRX, measurement gaps that overlap the serving SSBs (P = 1), and fast fading. FR3 (7.125-24.25 GHz) has no RRM requirements yet; there HandoverLab uses the FR1 formulas (N = 1) and the FR2 limit of 64 SSBs. The evaluation periods of TS 38.133 are minimum requirements (the longest time a UE may take); HandoverLab uses them as the averaging time constants, a conservative reading.

Data plane (2.2.0, protocol.scheduler)

What the texts specify Clause HandoverLab Status
Slots: 2^mu slots per 1 ms subframe TS 38.211 Table 4.3.2-1 slot length 1 ms / 2^mu of the carrier's subcarrier spacing follows
MCS index table 1 for PDSCH (Q_m, target code rate) TS 38.214 Table 5.1.3.1-1 the 29 rows; the highest MCS with a block-error probability of at most 10 % at the reported SINR follows (table); link adaptation: implementation
Transport block size TS 38.214 5.1.3.2, Table 5.1.3.2-1 steps 1 to 4; 12 PDSCH symbols, 12 DMRS REs per PRB, xOverhead 0, one layer follows
HARQ entity per serving cell, parallel processes, retransmission decoded with the earlier data TS 38.321 5.3.2.1, 5.3.2.2 8 processes per user (TS 38.331: absent nrofHARQ-ProcessesForPDSCH), chase combining, at most harq_max_tx transmissions after harq_rtt_slots follows (combining and the number of transmissions: implementation choices)
Block errors of a transport block not specified (receiver property) normal approximation of the finite-blocklength error probability on the BICM bit channel, with an implementation loss abstraction
Scheduling not specified (gNB) round robin in frequency or proportional fair in time abstraction

Beyond 5G: what is not modelled yet

Rule Clause Status
NTN mobility: CHO with condEventT1 (time), RACH-less NTN handover, earth-fixed beams, several satellites TS 38.331 5.5.4.16; TS 38.300 16.14 not modelled (D1 and D2 follow since 2.0.0, see above)
6G TR 38.914 V20.1.0 sets requirements only (mobility interruption 0 ms between TRxPs of one base station; speeds up to 1000-1200 km/h) no 6G procedure is specified yet

Definitions used in the metrics

Rule Clause HandoverLab
Too-late, too-early and wrong-cell handover: too late = RLF after a long stay, re-establishment in a different cell; too early = RLF shortly after a handover or a handover failure, re-establishment in the source; wrong cell = the same in a cell other than source and target TS 38.300 V18.11.0 15.5.2.2.2 outcome labels too_late, too_early, wrong_cell with exactly these cells (since 2.1.0); a re-establishment in the serving cell (the target after a handover, or the same cell) is labelled coverage (coverage_failures_pm), as the clause defines no class for it; one class per failure (an RLF shortly after a handover belongs to that handover). "Shortly after" is the time of stay of the service (t_min_s, 2-7 s) from the completion, where 15.5.2.2.2 uses an OAM timer (e.g. Tstore_UE_cntxt) from the handover initialisation
Ping-pong: handover back within the minimum time of stay (MTS = 1 s) TR 36.839 5.2.2 (TS 38.300 defines ping-pong only between systems) protocol.pingpong_s = 1 s
Unnecessary handover: a completed handover after which the user stays shorter than the minimum time of its service or gains too little SINR, while the source would not have failed HandoverLab definition (TS 38.300 15.5.2.3 defines an unnecessary handover only between systems; TR 36.839 5.2.2 uses the time of stay against MTS = 1 s) unnecessary_pm with t_min_s and theta_q_db per service (assumptions, traffic.services)
RRC messages: MeasurementReport, RRCReconfiguration and RRCReconfigurationComplete; one RRCReconfiguration carries all conditional candidates (condReconfigToAddModList); the LTM cell switch command is a MAC CE TS 38.331 5.3.5.3, 5.3.5.13; TS 38.300 9.2.3.4.2, 9.2.3.5.2 rrc_messages_pm: counted message by message (since 2.1.0; 2.0.0 counted per candidate and the LTM command, without the Complete of configurations and releases); re-establishment messages are not counted
Handover failure rate = failures / attempts; failures in state 2 (from the A3 entering condition, i.e. also during the TTT, to the reception of the command) and state 3 (target below Qout at the end of execution) TR 36.839 5.2.1 failure causes rlf_in_preparation (from the report on: an RLF during the TTT counts as rlf_without_handover), command_lost, execution_failure

Comparison with ns-3 / 5G-LENA on the same rules

The ns-3 / 5G-LENA build of the comparison study was read at the source (contrib/nr, src/lte):

Rule ns-3 / 5G-LENA HandoverLab (3GPP profile)
Command received while T310 runs (TS 38.331 5.3.5.5.2) executed and T310 stopped in the stock code; the study build switched on a TR 36.839 rule (Tr36839HandoverFailure) that counts it as a failure executed when the link reaches Qout
Out-of-sync detection in about 200 ms (TS 38.133 8.1.2.2) 20 frames of 10 control receptions, 0.65-0.83 s at light traffic 0.2 s
In-car loss per user (TR 38.901 7.4.3.2) only at 30-120 km/h any speed, per user
T304 at the UE (TS 38.331 5.3.5.8.3) handover joining timeout of 200 ms at the target gNB UE timer, 1 s
Link monitoring restart on the new cell yes yes (rlm_holdoff_s)
Re-establishment (TS 38.331 5.3.7) yes (UseRrcReestablishment) yes (fixed outage)
CHO, DAPS, LTM, conditional LTM (Rel-16 to 19) none all four
Beam failure recovery none none
Large-scale channel calibration (TR 38.901 7.8.1) calibrated by its authors calibrated (see radio calibration)
Fast fading, packet-level PHY/MAC/RLC yes options since 2.2.0: TDL fast fading, a slot scheduler with MCS, TBS and HARQ; no RLC / PDCP

Reading. On the rules of the handover procedure and on the procedures of Releases 16 to 19, HandoverLab with the 3GPP profile follows the normative texts more closely; on the physical layer (fast fading, packets, scheduling) ns-3 models more. Neither models beam failure recovery.

Fresh ns-3 hold-out (1.9.0)

48 new ns-3 runs (ns3-urban-3.5ghz, ISD 200 and 400 m, 12 and 20 m/s -- speeds never used before --, A3 2/4/6 dB x 160/480 ms, two seeds) were compared with HandoverLab on 24 conditions. The configuration and the limits were fixed in writing before the runs; nothing was tuned.

Metric (24 conditions) Limit 1.3.0 configuration 3GPP profile
Handovers: median ratio, rank [0.8, 1.25], >= 0.9 0.93, 0.97 (pass) 0.93, 0.97 (pass)
Unnecessary handovers: median ratio, rank [0.8, 1.25], >= 0.9 0.95, 0.97 (pass) 0.98, 0.97 (pass)
Failures: ratio of the means [0.67, 1.5] 0.84 (pass) 0.18 (fail)
Failures: rank >= 0.8 0.68 (fail) 0.64 (fail)

The 1.3.0 configuration (in-car loss, ideal execution, restart of link monitoring) meets the failure level of ns-3 on data it had never seen. The 3GPP profile has far fewer failures than ns-3 because the ns-3 build counts every command that arrives during T310 as a failure (the TR 36.839 evaluation rule), while the profile follows TS 38.331. The order of the failure rates over the conditions agrees in neither configuration: ns-3 failures grow much more with the time-to-trigger.

Comparison with commercial 5G networks (1.9.0)

Handover statistics measured in commercial networks were taken from Xu et al. (SIGCOMM 2020), Hassan et al. (SIGCOMM 2022), Ghoshal et al. (IMC 2023; arXiv 2511.03116), Kalntis et al. (IMC 2024) and Liu et al. (MobiCom 2024). Six cases with acceptance bands (mostly a factor of 2) were fixed in writing before the first run; nothing was tuned.

Case Measured Default 3GPP profile
C1 handovers per minute, walking, 3.5 GHz, A3 3 dB / 320 ms 4.84 1.58 (fail) 1.58 (fail)
C2 ping-pong within 15 s, A3 6 dB / 256 ms (Verizon setting) 25 % 26.9 % (pass) 27.0 % (pass)
C2 ping-pong within 15 s, A3 8 dB / 640 ms (AT&T setting) 15.5 % 3.2 % (fail) 4.0 % (fail)
C3 time between handovers, driving 11 m/s 9.2 s 24.6 s (fail) 22.7 s (fail)
C4 handover failures per handover (TR 36.839 states 2 and 3) 0.04-1.5 % 8.8 % (fail) 1.9 % (fail, 1.25x above)
C6 km per handover, low band at 120 km/h 0.4-0.9 km 0.75 km (pass) 0.51 km (pass)
C5 interruption 27-76 ms; report to command 70-179 ms -- 40 ms; 50 ms same

The 3GPP profile brings the handover failure rate from about six times above the measured range to just above it. In the mid band HandoverLab gives fewer handovers than the measured networks, whose irregular, multi-layer deployments (LTE, 5G low/mid band, mmWave) the simulated grids do not have.

DAPS and LTM against TS 38.133 and published 3GPP evaluations (1.10.0)

The checks and their bands were fixed in writing before the comparison (no value was changed after it); handoverlab verify (group extended) repeats V1 and V2. The 3GPP contributions were read in the documents downloaded from the 3GPP server (RAN1 and RAN2 TDocs of 2019-2022, TR 36.881).

Check Reference HandoverLab Result
V1a LTM interruption, FR1-FR1, known cell and TCI state, fast RRC processing, RACH-less, T_LTM-IU = 0 TS 38.133 6.3.1.3: 0 + 20 + 0 + 0 + 0 = 20 ms LTM exec_s 20 ms pass (equal)
V1b the same, RACH-based, SSB-to-PRACH association period 10 ms up to 20 + 10 + 10 = 40 ms (no default for this case) report only
V1c LTM command delay T_cmd = T_HARQ + 3 ms TS 38.133 6.3.1.2; band [3, 10] ms cmd_delay_s 10 ms pass (at the upper end)
V1d DAPS, FR1 intra-frequency, 30 kHz: T_interrupt1 + T_interrupt2 TS 38.133 6.1.3.2.2: 2 ms (sync), 3 ms (async) interruption_s 0 ms pass
V1e interruption the engine applies per execution the configured value LTM 20.000 ms (189 executions), DAPS 2.000 ms (156) pass
V2a L3 handover interruption 45.5-49.5 ms (TR 36.881, LTE), 80 ms (R1-2007151, agreed RAN1 model, FR2), about 75 ms (R2-2206982), about 120 ms (R2-2208200), 50-90 ms (Ericsson); band [22.75, 240] ms protocol.exec_s 40 ms pass, but below every reference: the default is optimistic
V2b LTM interruption [44, 70] ms without enhancements (R2-2207806), about 66 ms from the RAN2 time chart (R2-2209256, RACH-based), 20-30 ms with early synchronisation (Ericsson); band [10, 140] ms 20 ms pass (the enhanced, RACH-less case)
V2c ratio LTM / L3 interruption 0.22-0.60 (Ericsson); band [0.11, 1.0] 0.50 pass
V2d DAPS interruption about 0 ms (R2-1907308, R2-1901361, R2-2206982), 2 ms (TS 38.133, as cited by Nokia); band [0, 4] ms 0 ms pass
V2e interruption per UE-minute against A3 (urban grid, 30 users at 30 m/s, seeds 720-722) field trials (Ericsson with KDDI and AT&T, 2026): "up to 25 %" less interruption with LTM, conditions not published DAPS 65 % less, LTM 63 % less (1.39 s, 0.48 s, 0.51 s per UE-minute) report only: the simulated gain is larger than the field claims, as its L3 baseline includes re-establishments and its LTM case is the best one

The LTM and DAPS parameters therefore sit at the fast end of what 3GPP specifies and evaluates; for a pessimistic study set exec_s of ltm to 40-70 ms and protocol.exec_s to 50-90 ms.

Sectors and two-layer deployments against measured handover counts (1.10.0)

1.9.0 gave fewer mid-band handovers than measured. Two explanations were tested with a plan fixed before the runs (fresh seeds 710-712, the 3GPP protocol profile, the bands of the 1.9.0 comparison, every number reported):

H1, three sectors per site (Xu 2020: "Each gNB consists of 2 or 3 sectors"). The deployment of the 1.9.0 cases with one change, radio.beams: {sectors: 3, n_ssb: 8, panel: [4, 8], tilt_deg: 100}:

Case Measured Band Without sectors Three sectors with SSB beams
C1 handovers per UE-minute, walking, A3 3 dB / 320 ms 4.84 [2.42, 9.68] 1.78 (fail) 2.44 (pass, at the lower edge)
C2 ping-pong within 15 s, A3 6 dB / 256 ms 25 % [12.5, 50] % 25.3 % (pass) 14.8 % (pass)
C2 ping-pong within 15 s, A3 8 dB / 640 ms 15.5 % [7.75, 32] % 9.4 % (pass) 4.6 % (fail)
C3 time between handovers, driving 11 m/s 9.2 s [4.6, 18.4] s 21.9 s (fail) 13.4 s (pass)
C4 failures per handover 0.04-1.5 % [0.04, 1.5] % 0.12 % (pass) 0 % (fail: below the range)

Sectors explain a large part of the missing handovers (C1 +37 %, C3 from 21.9 to 13.4 s), but the case C2 with the AT&T setting and C4 now fail: with sectors the 8 dB / 640 ms setting returns to the previous cell less often than measured, and no execution failure or lost command occurred.

H2, two layers (the ITU-R M.2412 dense urban deployment, card dense-urban-2layer, rule a3a5 with the dominant AT&T and Verizon settings of Ghoshal 2025). H2a uses the A5 thresholds in both directions as written in the plan; H2b (fixed in an addendum before its runs, after a 20 s software smoke run showed the layer alternation) uses the study's other dominant A5 setting (-115 / -108 dBm) from the micro to the macro layer:

Run Time between handovers Band Failures per handover Inter-frequency share
driving, H2a, two layers 1.0 s (fail) [4.6, 18.4] s 6.9 % (fail) 97 % (alternation between the layers)
driving, H2b, two layers 3.8 s (fail: too many) [4.6, 18.4] s 3.5 % (fail) 19 %
driving, macro layer alone 7.2 s (pass) [4.6, 18.4] s 1.6 % (fail, just above) --
walking, H2a, two layers 0.8 s (fail) [11.05, 44.2] s 0.39 % (pass) 99 %
walking, H2b, two layers 16.3 s (pass) [11.05, 44.2] s 0.14 % (pass) 1 %
walking, macro layer alone 18.7 s (pass) [11.05, 44.2] s 0.64 % (pass) --

Measured dwell (M2HO): 15.5 s in sub-6 GHz cells, 7.2 s in mmWave cells. Simulated, driving H2b: 3.7 s in micro cells (most users stay on the micro layer, mean SINR 0.9 dB); walking H2b: 14.4 s. The hypothesis "multi-layer deployments explain the missing handovers" is not supported in this form: the two-layer deployment gives too many handovers when driving, and the macro layer with three sectors at 200 m alone already reaches the measured range. What matters most is the sectorisation and the site density, which the 1.9.0 scenarios lacked. A symmetric A5 configuration makes users alternate between layers; the result depends strongly on the A5 thresholds per direction, which the measurement studies report only as distributions.