PHY Measurements (RSRP/RSRQ/SINR/RSSI) in 5G NR
The measurement quantities the UE reports, and how RSSI, RSRP, RSRQ and SINR relate.
A gNB schedules, beamforms and hands over on the strength of numbers it cannot measure itself. Everything it knows about the downlink comes from the UE, and everything the UE reports is shaped by a configuration the gNB wrote: which frequency, which reference signal, which quantity, how heavily filtered, and under exactly which inequality a report is allowed to leave the UE. This document covers the measConfig structure and its three-way indirection, the exact definitions and integer encodings of RSRP, RSRQ and SINR, beam-to-cell consolidation, layer-3 filtering, all eight standard events with their entering and leaving inequalities worked through with real numbers, the report message itself, idle-mode and logged measurements, and the failure modes that make a correctly configured cell look like a coverage hole.
Contents
- 01Why the Network Has to Ask
- 02measConfig: Three Lists and One Indirection
- 03MeasObjectNR: What Measure This Means
- 04The Quantities and Their Integer Encodings
- 05Beam Level and Cell Level: Consolidation
- 06Layer-3 Filtering
- 07The Event Framework: Machinery Common to All Events
- 08A1 and A2: the Serving Cell Against a Threshold
- 09A3 and A6: a Neighbour Against a Serving Cell
- 10A4 and A5: a Neighbour Against a Threshold
- 11B1 and B2: Inter-RAT
- 12timeToTrigger and Hysteresis Together
- 13reportConfigNR: Report Types and Content Controls
- 14The MeasurementReport Message
- 15Measurements in RRC_IDLE and RRC_INACTIVE
- 16Failure Modes and What Each One Means
- 17Configuration Reference (ASN.1)
- 18Illustrative Message Traces
- 19Release Deltas: Rel-15 to Rel-18
- 20Reading Measurements in Logs: A Checklist
- 21Glossary
- 22References
1. Why the Network Has to Ask
The gNB owns every mobility decision in RRC_CONNECTED. It decides when to hand a UE over, which cell to hand it to, when to add an SCell or a PSCell, and when to give up on the current beam. Not one of those decisions can be made from information the gNB has locally, because all of them turn on downlink quality at the UE's antenna -- and the gNB cannot observe its own downlink from the other end of it. Uplink soundings tell it about the uplink. Its own neighbour list tells it what exists, not what is receivable. The only instrument pointing the right way is the UE.
So the network asks. But it does not ask an open question: a UE that reported everything it could see, continuously, would spend its battery measuring and its uplink reporting. Instead the gNB installs a measurement configuration -- measConfig, carried in RRCReconfiguration TS 38.331 cl. 5.5.2 -- that specifies precisely what to measure, how to smooth it, and the inequality that must hold before a report is permitted to leave the UE. Everything in this document is either part of that configuration or a consequence of it.
| Consumer of measurements | What it needs | Typical configuration | Companion document |
|---|---|---|---|
| Intra-frequency handover | Neighbour better than the serving cell by a margin | A3 on the serving measObject, timeToTrigger 160-320 ms | 22 Handover Overview, 23 Xn Handover |
| Inter-frequency handover / redirection | Serving cell poor and a specific other carrier usable | A2 to arm, then A5 or A4 on the other carrier | 22 Handover Overview, 21 Measurement Gaps and SMTC |
| Conditional handover (CHO) | The same conditions, evaluated by the UE after the command | condTriggerConfig with condEventA3 / condEventA5 | 25 Conditional HO and DAPS |
| SCell / PSCell addition | Is the other carrier worth activating | A4 on the candidate carrier, or early measurements from idle | 26 UE Capability for what the UE supports |
| Beam management | Which SSB or CSI-RS beam to use | includeBeamMeasurements, reportQuantityRS-Indexes | 12 Beam Failure Recovery |
| Coverage optimisation / MDT | What the radio looked like where the user was | Logged MDT, or periodical reporting with location info | this document, §15 |
| ANR and PCI-confusion resolution | The full CGI behind a PCI | reportCGI, bounded by T321 | 17 System Information |
Table 1. Every measurement configuration exists to serve one of these. If you cannot name which one a measId serves, it is either vestigial or misconfigured.
Nothing is measured for reporting purposes until a measId exists that references both a measObject and a reportConfig. A UE that is not reporting a neighbour you can see from the drive-test log is very often a UE that was never asked about it -- check the measIdToAddModList before you check the radio.
RRCReconfiguration; measurement, consolidation, filtering and event evaluation all happen inside the UE with nothing on the air; a single MeasurementReport goes up; the network decides. Sections 2 to 14 expand each band in turn.Measurement in RRC_IDLE and RRC_INACTIVE is a different animal, driven by broadcast reselection parameters and, from Rel-16, by an explicit idle-measurement configuration whose results are handed over later (§15). The companion 14 RRC States document covers the state model; 15 RRC Procedures covers the reconfiguration procedure that carries measConfig and what happens when the UE cannot comply with it.
2. measConfig: Three Lists and One Indirection
measConfig is built from three independently addressable lists. A measObject says what to measure. A reportConfig says when and how to report. A measId is a small integer that binds exactly one of each into a complete rule, and it is the measId -- not the object, not the report configuration -- that appears in the resulting MeasurementReport.
measObject can be referenced by many measIds and so can a reportConfig; the pairing is what carries meaning, which is why a report identifies itself by measId alone.| Field | Type and range | Purpose | Consequence of getting it wrong |
|---|---|---|---|
measObjectToAddModList | 1..64 entries, measObjectId INTEGER (1..64) | Carrier and reference-signal definitions | Wrong ssbFrequency or ssbSubcarrierSpacing and the UE searches the wrong raster point -- reports nothing, silently |
reportConfigToAddModList | 1..64 entries, reportConfigId INTEGER (1..64) | Events, thresholds, periodicity, report contents | Wrong threshold branch (rsrp vs rsrq) changes the threshold by tens of dB (§4) |
measIdToAddModList | 1..64 entries, measId INTEGER (1..64) | The bindings that actually run | A binding that names the wrong object measures the right event on the wrong carrier |
quantityConfig | 1..2 QuantityConfigNR entries | Layer-3 filter coefficients, per quantity and per RS type | Over-filtering delays every event that uses the object (§6) |
s-MeasureConfig | CHOICE ssb-RSRP / csi-RSRP, RSRP-Range 0..127 | Gate: measure neighbours only when the SpCell is below this | Set too high and neighbour measurement never starts (§2.3) |
measGapConfig | MeasGapConfig | Gap patterns for other-frequency measurement | No gap where a gap is needed = no inter-frequency results at all |
measGapSharingConfig | MeasGapSharingConfig | How gap time is divided between measurement purposes | Starves one purpose of gap time; see 21 Measurement Gaps and SMTC |
measObjectToRemoveList etc. | Lists of IDs | Delta configuration -- processed before the add/mod lists | Removing an object silently removes every measId bound to it |
Table 2. MeasConfig top level TS 38.331 cl. 5.5.2. The UE stores the merged result in VarMeasConfig and the per-measId trigger state in VarMeasReportList.
2.1 Delta configuration, and why it bites
measConfig is always a delta against VarMeasConfig. The UE applies the remove lists first, then the add/mod lists, in the order given in TS 38.331 cl. 5.5.2.1. An entry in an add/mod list whose ID already exists is a replacement, not a merge: fields absent from the new entry are absent afterwards. That alone catches people out, but the sharper edge is what a replacement does to trigger state.
Modifying a reportConfig removes the reporting entry in VarMeasReportList for every measId associated with it, resets numberOfReportsSent, stops the periodical reporting timer and clears cellsTriggeredList TS 38.331 cl. 5.5.2.8. The same is true when a measObject is modified TS 38.331 cl. 5.5.2.5. So a reconfiguration that nudges a3-Offset by 1 dB also un-triggers every cell that was already triggered on that configuration, and every timeToTrigger starts again from zero. In a log this looks like a UE that inexplicably stopped reporting a cell it had been reporting for a minute -- the cause is three messages earlier, in a reportConfigToAddModList you would not otherwise have read.
2.2 Why the indirection exists at all
One reportConfig shared by several measIds is how a network applies one mobility policy to several carriers, and one measObject shared by several measIds is how it applies several policies to one carrier -- an A3 for handover and an A2 for arming inter-frequency search, both on the serving frequency. The cost of the flexibility is that the consequences of a change are not local, and that a report says only measId 3: you must resolve the binding yourself before the report means anything.
2.3 s-Measure: the gate before all of this
s-MeasureConfig is a single RSRP-Range threshold on the SpCell. While the SpCell's RSRP is above it, the UE is not required to measure non-serving cells at all TS 38.331 cl. 5.5.3.1. The intent is battery: a UE sitting in the middle of a good cell has no business burning receive time on neighbour search, and no handover is imminent. The cost is that every neighbour-based event -- A3, A4, A5, B1, B2 -- is invisible above the gate, so the UE's first neighbour sample arrives only after the serving cell has already degraded past it, and the L3 filter then starts from that first sample.
s-Measure set generously -- say rsrp 68, i.e. -89 dBm -- combined with filterCoefficient fc8 on neighbour RSRP is a classic late-handover recipe. The UE does not begin measuring the neighbour until the serving cell is already at -89 dBm, then needs several hundred milliseconds of filter settling before the A3 inequality can even be true, then timeToTrigger on top. Symptom: A3 reports that arrive with the serving cell already below -105 dBm, and occasional radio link failures on a route where the neighbour was strong the whole time. Omitting s-MeasureConfig entirely means always measure, which is the safe default for mobility-critical carriers.
3. MeasObjectNR: What Measure This Means
A MeasObjectNR is a carrier plus everything the UE needs in order to find and interpret reference signals on it. Most of the fields exist because SSB-based measurement is beam-swept and window-scheduled, so where in time to look is as much a part of the definition as where in frequency.
| Field | Values | What it controls | Notes |
|---|---|---|---|
ssbFrequency | ARFCN-ValueNR 0..3279165 | The SSB's centre frequency (Point-A-independent, on the global synchronisation raster) | Absent only for CSI-RS-only objects |
ssbSubcarrierSpacing | kHz15, kHz30, kHz120, kHz240 | How to demodulate the SSB | Must match the neighbour's actual SSB SCS, not the serving cell's |
smtc1 | SSB-MTC: periodicity sf5..sf160 + offset, duration sf1..sf5 | The primary measurement window for this carrier | See 21 Measurement Gaps and SMTC -- misalignment here is the most common measurement fault of all |
smtc2 | periodicity sf5..sf80 + pci-List | A shorter-periodicity override for the listed PCIs | Used when a subset of neighbours transmits SSB more often |
refFreqCSI-RS | ARFCN-ValueNR | Reference point for the CSI-RS resources used for mobility | Required before any rsType csi-rs event can work |
referenceSignalConfig | ssb-ConfigMobility, csi-rs-ResourceConfigMobility | ssb-ToMeasure bitmap, deriveSSB-IndexFromCell, ssb-PositionQCL-Common | deriveSSB-IndexFromCell = true asserts neighbour SSB timing is aligned with the serving cell |
absThreshSS-BlocksConsolidation | ThresholdNR (RSRP/RSRQ/SINR range) | Beams below this are excluded from the cell-quality average | Optional; absent means use the best beam only (§5) |
nrofSS-BlocksToAverage | INTEGER (2..16) | Ceiling on how many beams are averaged | Optional; absent means use the best beam only |
quantityConfigIndex | INTEGER (1..2) | Which QuantityConfigNR (filter coefficients) applies | Lets one carrier be filtered hard and another lightly |
offsetMO | Q-OffsetRangeList, six offsets, dB-24..dB24 | Ofn / Ofp -- the per-frequency, per-quantity offset | One offset per (quantity, RS type) combination |
cellsToAddModList | CellsToAddMod: physCellId + cellIndividualOffset | Ocn / Ocs -- the per-cell, per-quantity offset | Not a permit list: listing a cell only gives it an offset |
blackCellsToAddModList | PCI-RangeIndex + PCI-Range (start + n4..n1008) | PCIs the UE must not measure or report on this carrier | Ranges, not single PCIs -- easy to exclude more than intended |
whiteCellsToAddModList | same shape | If an event sets useWhiteCellList, only these PCIs are considered | Silently disables everything else for that event |
measCycleSCell | sf160, sf256, sf320, sf512, sf640, sf1024, sf1280 | How often to measure a deactivated SCell's carrier | Trades SCell activation latency against UE power |
Table 3. MeasObjectNR, abridged to the fields that change observable behaviour TS 38.331. Q-OffsetRange runs dB-24..dB24, in 1 dB steps between -6 and +6 and 2 dB steps outside.
Later releases renamed the exclusion and permit lists as part of a terminology cleanup -- excludedCellsToAddModList and allowedCellsToAddModList, with useAllowedCellList in the event configuration. The semantics are unchanged, but decoders, vendor documentation and log formats moved at different times, so both spellings are in circulation and refer to the same fields.
A blacklisted PCI range is not merely not reported -- the UE excludes those cells from event evaluation entirely, and from the measResultNeighCells list. PCI-Range is a start PCI plus a range value, and the range values are coarse: n4, n8, n12, n16, n24, n32, n48, n64, n84, n96, n128, n168, n252, n504, n1008. Blacklisting one troublesome PCI with n24 because that was the smallest convenient value quietly removes twenty-four cells from the candidate set. Symptom: a specific corridor where no handover candidate is ever reported, with perfectly healthy neighbours in the scanner.
4. The Quantities and Their Integer Encodings
4.1 What the three quantities actually measure
| Quantity | Definition | Unit | What it tells you |
|---|---|---|---|
| SS-RSRP | Linear average of the power contributions of the resource elements carrying the SSS, over the SS/PBCH blocks of the measured cell. May additionally use PBCH DM-RS or CSI-RS if configured TS 38.215 cl. 5.1.1. | dBm | Absolute received strength of a beam. Says nothing about interference -- a cell at -80 dBm in a hostile interference environment is not a good cell. |
| CSI-RSRP | Same, over the resource elements carrying CSI-RS configured for mobility TS 38.215 cl. 5.1.2. | dBm | Finer-grained and more frequent than SSB, but only where CSI-RS mobility resources are configured. |
| SS-RSSI | Linear average of the total received power observed in the OFDM symbols of the configured measurement time resources, over the measurement bandwidth, from all sources including noise TS 38.215 cl. 5.1.3. | dBm | Not reported on its own. It is the denominator of RSRQ. |
| SS-RSRQ | N x SS-RSRP / SS-RSSI, where N is the number of resource blocks in the SS-RSSI measurement bandwidth TS 38.215 cl. 5.1.4. | dB | How much of the received power is this cell. Falls when neighbours load up, even though RSRP is unchanged. |
| SS-SINR | Linear average of the power of the SSS resource elements divided by the linear average of the noise-plus-interference power over the same resource elements TS 38.215 cl. 5.1.5. | dB | The closest thing to will this link work. Most directly related to achievable MCS. |
Table 4. Measurement quantity definitions. All are defined at the UE's antenna connector and, for the reported value, over the combined signal from all receive branches.
RSRP moves with distance and blockage. RSRQ moves with load -- both the serving cell's own load, because a busier cell radiates more total power into RSSI, and neighbour load. SINR moves with both plus noise. This is why an event configured on RSRP and an event configured on RSRQ can disagree completely about whether a cell is deteriorating, and why mobility is conventionally triggered on RSRP (stable, geometric) while RSRQ and SINR are carried along in the report as diagnostics.
4.2 The encodings: three rulers, one integer
All three quantities are carried as INTEGER (0..127) -- RSRP-Range, RSRQ-Range, SINR-Range. The mapping from integer to physical value is different for each, and the integer is what appears both in a threshold you configure and in a report you read.
| Range type | Value 0 | Values 1..126 | Value 127 | Conversion |
|---|---|---|---|---|
RSRP-Range | below -156 dBm | 1 dB bins; bin N covers [N-157, N-156) dBm | -30 dBm or above | dBm = N - 157 |
RSRQ-Range | below -43 dB | 0.5 dB bins from -43 dB upwards | 20 dB or above | dB = 0.5N - 43.5 |
SINR-Range | below -23 dB | 0.5 dB bins from -23 dB upwards | 40 dB or above | dB = 0.5N - 23.5 |
Table 5. Reporting-range mappings TS 38.133 cl. 10.1.6, 10.1.11, 10.1.16. The conversions give each bin's lower edge; the bin edges at the extremes of the RSRQ and SINR tables are open-ended, so check the tables themselves at the very ends of the range.
RSRP-Range 71 in a report:
71 - 157 = -86 dBm -- strictly, -86 dBm <= SS-RSRP < -85 dBm
Configuring a threshold of -110 dBm:
-110 + 157 = 47 -> a2-Threshold rsrp 47
The same integer through the other two rulers:
SINR-Range 71 -> 0.5 x 71 - 23.5 = 12.0 dB
RSRQ-Range 71 -> 0.5 x 71 - 43.5 = -8.0 dB
And backwards, an SINR threshold of 3 dB:
(3 + 23.5) / 0.5 = 53 -> a4-Threshold sinr 53
MeasTriggerQuantity is a CHOICE with three branches -- rsrp, rsrq, sinr -- all three of which are INTEGER (0..127). Encode a threshold of 56 on the wrong branch and it decodes cleanly, configures successfully, and means -101 dBm instead of -15.5 dB. There is no error anywhere: the event simply never triggers, or triggers permanently. Always read the branch name in the decode, never just the number.
Hysteresis and the event offsets do not use these ranges. Hysteresis is INTEGER (0..30) in units of 0.5 dB, so hysteresis 4 is 2 dB. MeasTriggerQuantityOffset (the a3-Offset / a6-Offset family) is INTEGER (-30..30), also in 0.5 dB units, so a3-Offset 6 is 3 dB. Q-OffsetRange (offsetMO, cellIndividualOffset) is an enumeration whose members are named in whole dB: dB3 is 3 dB. Three different unit conventions in one event definition.
5. Beam Level and Cell Level: Consolidation
An NR cell does not have a signal strength. It has one per SS/PBCH block, up to 4 in FR1 below 3 GHz, 8 in FR1 above it, and 64 in FR2, and the UE measures each one separately. Events, however, compare cells. The step in between is consolidation, and it is configurable TS 38.331 cl. 5.5.3.3.
- If neither
nrofSS-BlocksToAveragenorabsThreshSS-BlocksConsolidationis configured for the object, cell quality is the highest beam measurement. The cell is as good as its best beam. - Otherwise, take the beams whose measurement is above
absThreshSS-BlocksConsolidation, keep at mostnrofSS-BlocksToAverageof the highest of them, and average them in the linear power domain. - If no beam is above the threshold, fall back to rule 1 -- the highest beam alone.
Beams: -103, -88, -82, -95, -110, -89, -101, -120 dBm.
absThreshSS-BlocksConsolidation rsrp 67 -> -90 dBm. nrofSS-BlocksToAverage 4.
Above -90 dBm: SSB #2 (-82), SSB #1 (-88), SSB #5 (-89). Three, so all three are used.
Linear: -82 dBm = 6.310e-9 mW
-88 dBm = 1.585e-9 mW
-89 dBm = 1.259e-9 mW
sum = 9.154e-9 mW, mean = 3.051e-9 mW
cell quality = 10 log10(3.051e-9) = -85.15 dBm
Reported as RSRP-Range: floor(-85.15) + 157 = 71.
Averaging in dB instead would have given (-82 - 88 - 89)/3 = -86.33 dBm, 1.2 dB pessimistic. The linear average is always the more optimistic of the two, and the gap grows with the spread between beams.
| Configuration | Cell quality becomes | Effect on A3-style mobility |
|---|---|---|
| No threshold, no count | Best beam | Most optimistic. A cell with one good beam and seven poor ones looks as good as a uniformly good cell -- and after handover the UE has one usable beam. |
| Threshold set, count 2-4 | Average of the best few good beams | Balanced. Rewards cells with several usable beams, which is what you actually want to hand over to. |
| Threshold very low, count 8+ | Average over nearly all beams, including the ones behind the UE | Pessimistic. Cells look worse than they are; handover is late and the reported value correlates poorly with post-handover throughput. |
| Threshold above every beam | Best beam (rule 3 fallback) | Silently identical to the first row. This is the trap: the configuration looks careful and does nothing. |
Table 6. Consolidation policy and its consequence. The same radio produces cell qualities several dB apart under these four settings.
Beam-level results are not discarded. If includeBeamMeasurements is true the report carries per-SSB or per-CSI-RS-resource results as well as the consolidated cell value (§13), which is what lets a target cell be told which beam to prepare -- see the companion 12 Beam Failure Recovery document for the beam-level view of the same measurements.
6. Layer-3 Filtering
Physical-layer measurements are noisy on a scale of tens of milliseconds. Events must not be. Between the two sits a single-pole IIR filter, applied to every measurement quantity before any event is evaluated and before any value is reported TS 38.331 cl. 5.5.3.2:
F_n = (1 - a) x F_(n-1) + a x M_n a = 1 / 2^(k/4) k = filterCoefficient M_n = the latest measurement result from the physical layer F_n = the filtered result, used for event evaluation and reporting F_0 = M_1 first sample after (re)configuration filtering is performed in the same domain as reporting -- i.e. on dB/dBm values for these quantities, not on linear power
The input rate is not specified; the filter's behaviour is defined assuming one input sample per measurement period, which for SSB-based measurements is conventionally taken as 200 ms. Every number below assumes that, so a 'sample' is 200 ms of wall clock.
| filterCoefficient | a | Samples to reach 90% of a step | Approx. settling time at 200 ms/sample | Where it fits |
|---|---|---|---|---|
| fc0 | 1.000 | 1 | 0.2 s | No filtering. Raw L1 straight into the event. Only for lab work. |
| fc1 | 0.841 | 2 | 0.4 s | Almost unfiltered. |
| fc2 | 0.707 | 3 | 0.6 s | Very fast; noisy in fading. |
| fc3 | 0.595 | 3 | 0.6 s | Fast. |
| fc4 | 0.500 | 4 | 0.8 s | The default. Halves the error each sample. Sensible for most mobility. |
| fc5 | 0.420 | 5 | 1.0 s | Slightly smoother than default. |
| fc6 | 0.354 | 6 | 1.2 s | Common for inter-frequency objects. |
| fc8 | 0.250 | 9 | 1.8 s | Heavy. Pedestrian or fixed UEs. |
| fc9 | 0.210 | 10 | 2.0 s | Heavy. Visibly late for vehicular speeds (see the figure). |
| fc11 | 0.149 | 15 | 3.0 s | Very heavy. |
| fc13 | 0.105 | 21 | 4.2 s | Very heavy. |
| fc15 | 0.074 | 30 | 6.0 s | Effectively a long-term average. |
| fc17 | 0.053 | 43 | 8.6 s | Stationary-UE territory. |
| fc19 | 0.037 | 61 | 12.2 s | The slowest available. Unsuitable for any moving UE. |
Table 7. FilterCoefficient members and their consequences. fc7, fc10, fc12, fc14, fc16 and fc18 are not defined in the enumeration. Settling times assume one input sample per 200 ms.
timeToTrigger has even started.12 dB step from -100 to -88 dBm, samples 200 ms apart, threshold -92 dBm.
fc4, a = 0.5:
F1 = -100.00 (= M_1)
F2 = 0.5(-100) + 0.5(-88) = -94.00
F3 = 0.5(-94) + 0.5(-88) = -91.00 <- crosses -92 at t = 400 ms
F4 = -89.50 F5 = -88.75 F6 = -88.38
F7 = -88.19 F8 = -88.09 F9 = -88.05
fc9, a = 1/2^2.25 = 0.2102:
F1 = -100.00
F2 = -100 + 0.2102(12) = -97.48
F3 = -97.48 + 0.2102(9.48) = -95.49
F4 = -93.91 F5 = -92.67
F6 = -91.69 <- crosses -92 at t = 1000 ms
F7 = -90.92 F8 = -90.30 F9 = -89.82
Delay difference: 600 ms, on top of which timeToTrigger still has to run. With timeToTrigger ms320 the two configurations report at 720 ms and 1320 ms after the step.
A high filterCoefficient is the most effective way to break handover while leaving every threshold looking correct. The event definitions are unchanged, the offsets are unchanged, the thresholds are unchanged -- the UE is simply comparing a stale number. On a fast fade the filtered value may never reach the threshold at all before the serving cell fails, and the observable outcome is not a late handover but a radio link failure with no preceding measurement report (see the companion 16 RLM and RLF document). If you see RLF without reports, check quantityConfig before you check anything else.
Cell-level and beam-level results are filtered independently: QuantityConfigNR carries quantityConfigCell and, optionally, quantityConfigRS-Index, each with separate coefficients for RSRP, RSRQ and SINR, and each with separate values for SSB and CSI-RS. A single quantityConfig therefore contains up to twelve filter coefficients, and quantityConfigIndex in the measObject selects which of the two configured sets applies to that carrier.
7. The Event Framework: Machinery Common to All Events
Eight standard events share one evaluation machine. Learn the machine once and each event is just a different inequality plugged into it.
| Symbol | Meaning | Source | Units |
|---|---|---|---|
| Ms | Measurement result of the serving cell (A1, A2, A6) | Consolidated cell quality, L3-filtered, no offsets applied | dBm (RSRP) or dB (RSRQ, SINR) |
| Mp | Measurement result of the SpCell (A3, A5, B2) | As above, for the PCell or PSCell | dBm or dB |
| Mn | Measurement result of the neighbour under test | As above, for the candidate cell | dBm or dB |
| Ofn / Ofp | Frequency-specific offset of the neighbour's / SpCell's frequency | offsetMO in the respective MeasObjectNR | dB (Q-OffsetRange) |
| Ocn / Ocp / Ocs | Cell-specific offset of the neighbour / SpCell / serving cell | cellIndividualOffset in cellsToAddModList; 0 if the cell is not listed | dB (Q-OffsetRange) |
| Hys | Hysteresis for this event | hysteresis in the event configuration | dB (0.5 dB units) |
| Off | Event offset | a3-Offset, a6-Offset | dB (0.5 dB units, signed) |
| Thresh | Absolute threshold | a1-Threshold, a2-Threshold, a4-Threshold, a5-Threshold1/2, b1-Threshold, b2-Threshold1/2 | The relevant reporting range |
Table 8. The variables in every entering and leaving condition TS 38.331 cl. 5.5.4. Note which events use Ms and which use Mp -- A6 compares against the SCell it is configured on, not the PCell.
7.1 Entering, leaving, and the dead band
Every event has two inequalities. The entering condition adds hysteresis against the event, the leaving condition adds it in favour; the 2 x Hys-wide region between them is a dead band in which neither is true and nothing changes state. timeToTrigger then applies to both: the condition must hold on every measurement taken during the timer for the transition to happen TS 38.331 cl. 5.5.4.1.
measId, cell) pair. A single sample that fails the condition resets the timer -- it does not pause it.- The entering condition becomes true for a cell -> start
timeToTriggerfor that cell. - Any sample inside the window fails the entering condition -> the timer is reset, not paused. Nothing is reported (§12).
- The timer expires with every sample satisfying the condition -> the cell is added to
cellsTriggeredListand the UE initiates the measurement reporting procedure. This is the firstMeasurementReport. - While the cell stays in
cellsTriggeredList, further reports are sent everyreportIntervaluntilreportAmountreports have been sent. - The leaving condition becomes true and holds for
timeToTrigger-> the cell is removed fromcellsTriggeredList, and a final report is sent only ifreportOnLeaveis true.
The trigger quantity and the reported quantities are configured separately. The event's threshold or offset carries its own quantity branch (rsrp, rsrq or sinr), while reportQuantityCell is a set of three booleans saying which quantities to include in the report. Triggering on RSRP and reporting all three is the usual arrangement, and it is why a report can show an RSRQ that looks fine for an event that fired on RSRP.
7.2 What the UE decides before it evaluates anything
For each configured measId, on each measurement period, the UE:
- Checks whether
s-Measurepermits neighbour measurement at all (§2.3). - Restricts the candidate set to cells detected on the
measObject's frequency, excluding every PCI inside a blacklistedPCI-Range, and -- if the event setsuseWhiteCellList-- keeping only the whitelisted PCIs. - Consolidates beams into a cell quality per candidate (§5), then L3 filters it (§6).
- Applies
offsetMOand, for cells present incellsToAddModList,cellIndividualOffset, per quantity. - Evaluates the entering and leaving conditions for that
measIdagainst each candidate, and advances the per-cell state machine.
None of this is visible outside the UE. The gNB sees a report, or it sees nothing, and nothing is the ambiguous case: it could mean the condition was never true, the neighbour was never measured, the neighbour was excluded, or the UE never had a gap in which to look. §16 separates those.
8. A1 and A2: the Serving Cell Against a Threshold
A1 and A2 are the only events that involve no neighbour at all. They compare the serving cell against an absolute threshold and are, in practice, a pair of switches for arming and disarming other measurement activity.
Event A1 -- serving becomes better than threshold [TS 38.331 5.5.4.2] entering (A1-1): Ms - Hys > Thresh leaving (A1-2): Ms + Hys < Thresh Event A2 -- serving becomes worse than threshold [TS 38.331 5.5.4.3] entering (A2-1): Ms + Hys < Thresh leaving (A2-2): Ms - Hys > Thresh Ms is the serving cell measurement, with no offsets applied at all.
| Event | Fires when | Typical operational use | Typical threshold |
|---|---|---|---|
| A1 | Serving cell recovers above a threshold | Cancel inter-frequency measurement: remove gaps, deactivate A4/A5 measIds, stop the neighbour search that A2 started. Also used to cancel an in-progress mobility decision. | 6-10 dB above the A2 threshold |
| A2 | Serving cell degrades below a threshold | Arm everything else: install measGapConfig, add inter-frequency and inter-RAT measIds, raise report frequency. Sometimes used directly as a blind-redirection trigger. | -100 to -110 dBm RSRP, or an RSRQ/SINR equivalent |
Table 9. A1 and A2 in service. They are almost always configured together, and almost always with a gap between the thresholds.
Configure a1-Threshold equal to a2-Threshold and the two events chatter. Hysteresis stops each event individually from oscillating, but it does not stop A1 and A2 from alternating around a shared value: the serving cell sits near the threshold, A2 enters, gaps are configured, the cell drifts up 4 dB, A2 leaves and A1 enters, gaps are released, the cell drifts down. Each cycle is two RRCReconfiguration messages. Symptom: a UE with a steady RSRP generating a continuous stream of gap configuration changes, and inter-frequency measurements that never last long enough to produce a result.
9. A3 and A6: a Neighbour Against a Serving Cell
A3 is the workhorse of intra-frequency mobility. It asks a relative question -- is this neighbour better than my SpCell by a configured margin -- which makes it robust against absolute level: the same configuration works at the cell edge and at the cell centre, because both sides of the inequality move together.
Event A3 -- neighbour becomes offset better than SpCell [5.5.4.4] entering (A3-1): Mn + Ofn + Ocn - Hys > Mp + Ofp + Ocp + Off leaving (A3-2): Mn + Ofn + Ocn + Hys < Mp + Ofp + Ocp + Off Event A6 -- neighbour becomes offset better than SCell [5.5.4.7] entering (A6-1): Mn + Ocn - Hys > Ms + Ocs + Off leaving (A6-2): Mn + Ocn + Hys < Ms + Ocs + Off A6 has no Ofn/Ofs terms: neighbour and SCell are on the same frequency by construction, so the frequency offsets cancel.
timeToTrigger windows of which only the second completes.Real numbers, all offsets non-zero -- the case that catches people out.
Mn = -87.5 dBm neighbour PCI 301, consolidated and filtered
Mp = -95.0 dBm SpCell PCI 188
Ofn = +2 dB offsetMO.rsrpOffsetSSB in the neighbour object
Ocn = -3 dB cellIndividualOffset for PCI 301
Ofp = 0 dB SpCell's own measObject offsetMO
Ocp = +1 dB cellIndividualOffset for PCI 188
Off = +3 dB a3-Offset 6, in 0.5 dB units
Hys = 2 dB hysteresis 4, in 0.5 dB units
Entering condition A3-1:
left = -87.5 + 2 - 3 - 2 = -90.5
right = -95.0 + 0 + 1 + 3 = -91.0
-90.5 > -91.0 -> true, by 0.5 dB
Leaving condition A3-2:
left = -87.5 + 2 - 3 + 2 = -86.5
-86.5 < -91.0 -> false
The margin is half a decibel. Drop Ocn to -4 dB, or Ocp to +2 dB, and this handover does not happen. Note also that the offsets pull in opposite directions here: Ofn helps the neighbour, Ocn penalises it, and Ocp helps it by penalising the SpCell.
| Knob | Effect on A3 | Scope | When to reach for it |
|---|---|---|---|
a3-Offset | Raises the bar for every neighbour of every cell using this reportConfig | Per reportConfig | Global mobility aggressiveness. 2-3 dB is a common starting point. |
offsetMO (Ofn) | Favours or penalises an entire carrier | Per measObject | Load-balancing a whole frequency layer, or compensating a systematic level difference between bands. |
cellIndividualOffset (Ocn) | Favours or penalises one PCI | Per cell within a measObject | One badly behaved neighbour: a cell with a known coverage overshoot, or one you want the UE to prefer for capacity reasons. |
hysteresis | Widens the dead band symmetrically | Per event within a reportConfig | Ping-pong that survives timeToTrigger tuning. |
timeToTrigger | Requires the condition to persist | Per event | Fast fading and corner effects (§12). |
Table 10. Four ways to make A3 fire later, at four different scopes. Reaching for the wrong scope is how a fix for one cell becomes a regression across a market.
9.1 A6 and secondary cells
A6 exists because in carrier aggregation the interesting comparison is often not against the PCell. An SCell on a capacity layer should be replaced when a better cell appears on that layer, and the PCell's quality is irrelevant to that decision. A6 therefore compares the neighbour against the serving cell of the same measObject -- the SCell -- and its result drives SCell change rather than handover. Because both cells are on one carrier, only per-cell offsets appear in the inequality.
10. A4 and A5: a Neighbour Against a Threshold
A4 and A5 ask absolute questions about a neighbour, which is what makes them the natural inter-frequency events: comparing a mid-band neighbour against a low-band serving cell relatively, as A3 does, would mean encoding the whole link-budget difference into offsets.
Event A4 -- neighbour becomes better than threshold [5.5.4.5]
entering (A4-1): Mn + Ofn + Ocn - Hys > Thresh
leaving (A4-2): Mn + Ofn + Ocn + Hys < Thresh
Event A5 -- SpCell worse than threshold1 AND neighbour [5.5.4.6]
better than threshold2
entering (A5-1 AND A5-2):
Mp + Hys < Thresh1
and Mn + Ofn + Ocn - Hys > Thresh2
leaving (A5-3 OR A5-4):
Mp - Hys > Thresh1
or Mn + Ofn + Ocn + Hys < Thresh2
Entering needs BOTH; leaving needs only ONE. Note that Thresh1 has
no offsets applied -- the SpCell half of A5 is a bare comparison.| Event | Question asked | Used for | Failure characteristic |
|---|---|---|---|
| A4 | Is this neighbour good enough, on its own terms? | Inter-frequency load balancing; SCell and PSCell candidate discovery; blind-spot coverage layers | Fires while the serving cell is still excellent, producing handovers that were never necessary. Almost always paired with an A2 that arms it, or given a high threshold. |
| A5 | Is my serving cell bad AND is this neighbour good? | Conservative inter-frequency handover; coverage-triggered fallback to a low band | Both halves must hold simultaneously, so a UE whose serving cell collapses faster than the neighbour rises never triggers. Watch for A5 configured with threshold1 so low that RLF wins the race. |
Table 11. A4 versus A5. The difference is whether the serving cell's state is part of the question.
A5's leaving condition is an OR, and that asymmetry is deliberate: the UE should stop advertising a candidate as soon as either reason to consider it disappears. It also means A5 leaves much more readily than it enters, so a marginal situation can generate an enter/leave/enter sequence in which each entry is a fresh first report -- a plausible source of apparently duplicated reports for the same cell.
11. B1 and B2: Inter-RAT
B1 and B2 are the inter-RAT counterparts of A4 and A5. The measured object is an E-UTRA carrier (or, from Rel-16, a UTRA-FDD carrier for specific fallback cases), and the measurement quantity is that RAT's -- so a B1 threshold is an E-UTRA RSRP-Range, whose mapping is not the NR one.
Event B1 -- inter-RAT neighbour becomes better than thresh [5.5.4.8]
entering (B1-1): Mn + Ofn + Ocn - Hys > Thresh
leaving (B1-2): Mn + Ofn + Ocn + Hys < Thresh
Event B2 -- SpCell worse than thresh1 AND inter-RAT [5.5.4.9]
neighbour better than thresh2
entering (B2-1 AND B2-2):
Mp + Hys < Thresh1
and Mn + Ofn + Ocn - Hys > Thresh2
leaving (B2-3 OR B2-4):
Mp - Hys > Thresh1
or Mn + Ofn + Ocn + Hys < Thresh2
Mn is an E-UTRA measurement. Thresh2 is b2-Threshold2EUTRA, and
Thresh1 is an NR threshold on the NR SpCell.E-UTRA RSRP-Range is INTEGER (0..97) and maps as dBm = N - 141, not N - 157. b1-ThresholdEUTRA rsrp 40 is therefore -101 dBm, and an NR a4-Threshold rsrp 40 is -117 dBm. A tool that applies the NR conversion to an E-UTRA threshold is wrong by 16 dB, in the direction that makes an unreasonable configuration look reasonable.
| Event | Object | Serving side | Neighbour side | Used for |
|---|---|---|---|---|
| B1 | MeasObjectEUTRA | not considered | E-UTRA RSRP or RSRQ against b1-ThresholdEUTRA | EPS fallback candidate discovery; inter-RAT redirection |
| B2 | MeasObjectEUTRA | NR SpCell against b2-Threshold1 | E-UTRA against b2-Threshold2EUTRA | Coverage-driven inter-RAT handover or redirection to LTE |
Table 12. Inter-RAT events. In an SA network these usually exist for voice fallback and for coverage-edge redirection rather than for routine mobility.
Inter-RAT measurement needs a measurement gap in essentially every case, and the gap must be long enough to acquire an entirely different synchronisation structure -- see the companion 21 Measurement Gaps and SMTC document. A B1 that never reports is far more often a gap or gap-sharing problem than a threshold problem.
12. timeToTrigger and Hysteresis Together
Hysteresis and timeToTrigger both suppress spurious triggering, but they suppress different things and they do not substitute for each other. Hysteresis works in the amplitude domain: it separates the entering and leaving thresholds so a signal hovering at the boundary cannot flip state on measurement noise. timeToTrigger works in the time domain: it requires the condition to persist, so a brief but genuinely large excursion -- a corner, a passing vehicle, a fast fade -- does not produce a handover.
| Hysteresis | timeToTrigger | |
|---|---|---|
| Domain | Amplitude (dB) | Time (ms) |
| Configured as | hysteresis, INTEGER (0..30) in 0.5 dB units | timeToTrigger, ENUMERATED ms0..ms5120 |
| Suppresses | State flapping when the quantity sits near the threshold | Triggering on short-lived excursions of any size |
| Cost | The event fires later by Hys dB, and leaves later by Hys dB | The event fires later by up to timeToTrigger ms |
| Failure if too small | Ping-pong: repeated handover between two cells | Handover on transients; handover to a cell the UE has already left |
| Failure if too large | Handover so late that the source cell is unusable; the dead band swallows the whole usable overlap region | The condition never persists long enough in a fast fade -- the event enters and leaves without ever reporting |
| Interacts with | The offsets, additively | The L3 filter (§6), additively in delay |
Table 13. The two anti-ping-pong mechanisms. Both cost latency; neither can do the other's job.
The case that produces no log line at all.
A3, timeToTrigger ms320, samples every 200 ms, entering threshold -90 dBm (from Mp -95, Off 3, Hys 2).
t = 400 ms Mn = -89.5 entering true -> TTT starts, expiry 720 ms
t = 600 ms Mn = -91.5 entering FALSE -> TTT reset
The condition was true for one sample and 200 ms. timeToTrigger needed 320 ms of continuously-true samples, which would have required the sample at 600 ms to hold. It did not, so the timer is discarded and no MeasurementReport is sent. Nothing is transmitted; nothing appears in a gNB log; the neighbour was 5.5 dB better than the trigger point and the network never heard about it.
Note also what did not happen: the cell never entered cellsTriggeredList, so the leaving condition is irrelevant, and reportOnLeave would not have produced a report either. The dead band matters only for cells that are already triggered.
This is the single hardest measurement failure to diagnose, because the evidence is an absence. On the UE side you may see the L3-filtered values and the timer start; on the network side there is no message at all. If a route shows handovers happening reliably in one direction and unreliably in the other, suspect a timeToTrigger that is long relative to the time the UE spends in the overlap region -- and remember that the overlap crossing time halves when the UE's speed doubles, while timeToTrigger does not.
12.1 The full delay budget
The latency from the radio changed to the target cell has the UE is the sum of several independent delays, and tuning any one of them in isolation is usually disappointing:
| Stage | Typical contribution | Set by |
|---|---|---|
| L1 measurement period | Up to ~200 ms per sample, longer with gaps | SMTC periodicity, gap pattern, measCycleSCell TS 38.133 cl. 9 |
| L3 filter settling | 0.2 s (fc0) to 12 s (fc19) | filterCoefficient in quantityConfig |
| Event persistence | 0 to 5120 ms | timeToTrigger |
| Report transmission | A few ms, plus SR/BSR latency if the UE has no grant | Uplink scheduling; see 10 BSR, PHR, SR |
| Network decision and preparation | Tens of ms over Xn, more over NG | 23 Xn Handover, 24 NG / N2 Handover |
| Handover execution | Tens of ms including RACH at the target | 22 Handover Overview, 03 Random Access |
Table 14. Where the milliseconds go between a radio change and a completed handover. The first three are all measurement configuration, and together they usually dominate.
13. reportConfigNR: Report Types and Content Controls
| reportType | What it does | Key fields | Notes |
|---|---|---|---|
eventTriggered | Report when an event's entering condition is satisfied for timeToTrigger | eventId, rsType, reportInterval, reportAmount | The subject of §7-12 |
periodical | Report every reportInterval, unconditionally | reportInterval, reportAmount, reportQuantityCell | Drive tests, MDT, and continuous monitoring of a known-marginal UE |
reportCGI | Acquire and report the full CGI of a specific PCI | cellForWhichToReportCGI, si-RequestForHO | Bounded by T321. Requires the UE to read the neighbour's SIB1, so it is expensive; used for ANR and to resolve PCI confusion |
reportSFTD | Report SFN and frame timing difference between the PCell and a neighbour | reportSFTD-Meas, reportRSRP | Needed to set up dual connectivity and to judge synchronisation |
condTriggerConfig | Configure the UE to evaluate the condition and execute a stored handover | condEventA3 / condEventA5 and their thresholds | Rel-16 conditional handover; see 25 Conditional HO and DAPS. No MeasurementReport is sent when it fires |
cli-Periodical / cli-EventTriggered | Report cross-link interference (SRS-RSRP or CLI-RSSI) | i1-Threshold for eventI1 | Rel-16, for dynamic TDD deployments |
Table 15. ReportConfigNR.reportType branches. Only the first two produce the ordinary MeasurementReport flow described in §14.
| Field | Values | Typical | Effect |
|---|---|---|---|
rsType | ssb, csi-rs | ssb | Which reference signal the event and the report use. csi-rs requires refFreqCSI-RS and CSI-RS mobility resources in the measObject. |
reportInterval | ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, ms20480, ms40960, min1, min6, min12, min30 | ms1024 | Spacing of the 2nd and subsequent reports for one triggered cell. Also the period for periodical. |
reportAmount | r1, r2, r4, r8, r16, r32, r64, infinity | r1 or r8 | How many reports one trigger produces. infinity with a short interval is a signalling generator. |
reportQuantityCell | 3 booleans: rsrp, rsrq, sinr | all three | Which cell-level quantities appear. Costs report size, not measurement effort. |
maxReportCells | INTEGER (1..8) | 4 | Maximum neighbours in one report, best first. Too small and the actual best target can be pushed out by cells that triggered earlier. |
reportQuantityRS-Indexes | 3 booleans | rsrp only | Which quantities appear per beam. Only meaningful with includeBeamMeasurements. |
maxNrofRS-IndexesToReport | INTEGER (1..32) | 4 | Maximum beams per cell in the report. FR2 reports get large quickly. |
includeBeamMeasurements | BOOLEAN | true on FR2 | Adds rsIndexResults to every cell in the report -- the target needs this to prepare the right beam. |
reportAddNeighMeas | setup / absent | setup | Adds measResultBestNeighCell to the serving-cell results, i.e. the best neighbour on the serving frequency, whether or not it triggered. |
reportOnLeave | BOOLEAN | false | Send a report when the leaving condition completes. Useful for cancelling a prepared conditional handover. |
useWhiteCellList | BOOLEAN | false | Restrict this event to the measObject's whitelist. A true here with an empty list disables the event completely. |
Table 16. Content and cadence controls in EventTriggerConfig and PeriodicalReportConfig. These decide report size, and report size decides whether the report needs RLC segmentation on SRB1.
maxReportCells 8, includeBeamMeasurements true and maxNrofRS-IndexesToReport 32, on FR2, with all three quantities enabled at both cell and beam level: eight cells x (three cell quantities + 32 beams x three quantities) is well over two thousand bits of measurement results before any ASN.1 overhead. That segments across several RLC PDUs on SRB1, at the exact moment the uplink is marginal enough to be triggering mobility. Symptom: measurement reports that arrive late or not at all specifically at the cell edge, with RLC retransmissions in the same window. Trim maxNrofRS-IndexesToReport first -- four beams is enough to prepare a target.
14. The MeasurementReport Message
MeasurementReport travels on SRB1 (DCCH -> UL-SCH -> PUSCH) and carries exactly one measId. If two events trigger on the same measurement period, the UE initiates the reporting procedure separately for each, producing two messages. The message body is a MeasResults:
MeasResults ::= SEQUENCE {
measId MeasId,
measResultServingMOList MeasResultServMOList,
measResultNeighCells CHOICE {
measResultListNR MeasResultListNR,
measResultListEUTRA MeasResultListEUTRA,
measResultListUTRA-FDD-r16 MeasResultListUTRA-FDD-r16,
...
} OPTIONAL,
...
}
MeasResultServMO ::= SEQUENCE {
servCellId ServCellIndex,
measResultServingCell MeasResultNR,
measResultBestNeighCell MeasResultNR OPTIONAL,
...
}
MeasResultNR ::= SEQUENCE {
physCellId PhysCellId OPTIONAL,
measResult SEQUENCE {
cellResults SEQUENCE {
resultsSSB-Cell MeasQuantityResults OPTIONAL,
resultsCSI-RS-Cell MeasQuantityResults OPTIONAL
},
rsIndexResults SEQUENCE {
resultsSSB-Indexes ResultsPerSSB-IndexList OPTIONAL,
resultsCSI-RS-Indexes ResultsPerCSI-RS-IndexList OPTIONAL
} OPTIONAL
},
cgi-Info CGI-Info OPTIONAL,
...
}
MeasQuantityResults ::= SEQUENCE {
rsrp RSRP-Range OPTIONAL,
rsrq RSRQ-Range OPTIONAL,
sinr SINR-Range OPTIONAL
}Listing 1. MeasResults and its children, abridged from TS 38.331; ... marks omitted extension additions.
MeasQuantityResults as bits. Three presence flags then three 7-bit integers, none of them octet-aligned -- and the whole block shifts with whatever precedes it.| Element | Contents | Present when |
|---|---|---|
measId | The binding that fired | Always. Resolve it against measIdToAddModList before reading anything else. |
measResultServingMOList | One entry per serving cell, each naming its servCellId and carrying that cell's own results | Always. The PCell is servCellId 0. |
measResultBestNeighCell | Best neighbour on the serving frequency, triggered or not | reportAddNeighMeas is set up |
measResultNeighCells | Up to maxReportCells neighbours, best first, for the frequency of this measId's measObject | Event and periodical reports where neighbours exist. Absent for A1/A2, which have no neighbour term. |
resultsSSB-Cell / resultsCSI-RS-Cell | Consolidated cell quality per RS type | According to rsType and reportQuantityCell |
rsIndexResults | Per-beam results, ssb-Index plus quantities | includeBeamMeasurements is true |
cgi-Info | PLMN, TAC, cell identity read from the neighbour's SIB1 | reportCGI only |
Table 17. What is in a report, and what its absence means. An A3 report with an empty measResultNeighCells is a decoder or configuration problem, not a radio one.
The serving-cell results in a report are the UE's own consolidated, filtered view -- not the gNB's. They are the correct number to compare against the event thresholds, and they routinely differ by a couple of dB from anything the gNB computed from uplink soundings or from its own power settings. When reconciling a report against a threshold, use the numbers in the report and nothing else.
15. Measurements in RRC_IDLE and RRC_INACTIVE
A UE in RRC_IDLE or RRC_INACTIVE is already measuring: cell reselection needs it, driven by broadcast parameters and specified in TS 38.304 rather than by measConfig. From Rel-16 the network can also harvest that effort for its own purposes, in two distinct ways.
15.1 Early measurement reporting
The problem it solves is SCell and PSCell setup latency. A UE that has just connected has no inter-frequency measurements, so carrier aggregation cannot be configured until gaps have been installed and a measurement cycle has completed -- typically hundreds of milliseconds into a connection that may only last a few seconds. Early measurements move that work into idle mode, where it is free.
| Step | Message / IE | Contents |
|---|---|---|
| 1. Configure | SIB11 (measIdleConfigSIB) or measIdleConfigDedicated in RRCRelease | measIdleCarrierListNR / -EUTRA, per carrier: frequency, SSB configuration, qualityThreshold, reportQuantities; plus measIdleDuration (up to 300 s) |
| 2. Measure | -- (UE stores in VarMeasIdleConfig / VarMeasIdleReport) | The UE measures the listed carriers while idle, for at most measIdleDuration, and keeps the results that clear qualityThreshold |
| 3. Announce | RRCSetupComplete / RRCResumeComplete / RRCReconfigurationComplete | idleMeasAvailable -- a bare flag saying results exist |
| 4. Request | UEInformationRequest | idleModeMeasurementReq |
| 5. Deliver | UEInformationResponse | measResultIdleNR / measResultIdleEUTRA: per-carrier, per-cell RSRP and RSRQ, optionally with beam results |
Table 18. Early measurement reporting, Rel-16. The results are not a MeasurementReport and do not involve measId at all.
Early measurement results are stale by construction. They were taken at some point inside a window up to 300 seconds long, possibly at a different location, and the UE reports them without any statement of when. They are good enough to choose which carrier to configure an SCell on; they are not evidence about current radio conditions, and they should never be reconciled against a connected-mode report as though they were contemporaneous.
15.2 Logged MDT
Logged Minimisation of Drive Tests turns the UE into a recorder. The network sends a LoggedMeasurementConfiguration -- a dedicated RRC message, not part of measConfig -- and the UE then logs measurements at loggingInterval for up to loggingDuration, inside an optional areaConfiguration, storing them in VarLogMeasReport together with time and, where available, location. Retrieval uses the same UEInformationRequest / UEInformationResponse pair, and availability is announced with logMeasAvailable.
| Immediate MDT | Logged MDT | |
|---|---|---|
| Configured by | Ordinary measConfig in RRC_CONNECTED | LoggedMeasurementConfiguration |
| UE state | RRC_CONNECTED only | Logs in RRC_IDLE, RRC_INACTIVE and RRC_CONNECTED |
| Delivery | MeasurementReport, as it happens | Stored, then fetched later by UEInformationRequest |
| Trigger | Events or periodical reporting | Periodical (LoggedPeriodicalReportConfig) or event-based (LoggedEventTriggerConfig) |
| Extras | Location information where configured and available | Time stamps, location, and optionally Bluetooth, WLAN and sensor measurements |
| Use | Live optimisation and troubleshooting | Coverage mapping without a drive-test vehicle |
Table 19. The two MDT flavours. Only the first uses the machinery in §2-14.
A UE arriving with idleMeasAvailable or logMeasAvailable set in RRCSetupComplete is telling you it has stored measurements. If the network never issues the corresponding UEInformationRequest, that data is discarded on the next release and the idle measurement effort was spent for nothing. It is worth checking that the request actually goes out -- the flag is easy to miss in a RRCSetupComplete full of NAS payload.
16. Failure Modes and What Each One Means
| Failure | Detected by | What the UE does | Diagnostic pointer |
|---|---|---|---|
measId bound to a measObject that was never configured | UE RRC, at reconfiguration | Network configuration error. Implementations differ: some ignore the measId, some fail the whole reconfiguration | If you see RRCReconfigurationFailure after a measConfig change, diff the three lists and check every binding resolves. Remember the remove lists are processed first. |
Object removed, dependent measIds silently removed with it | Nothing -- this is specified behaviour | Stops evaluating and reporting for those measIds TS 38.331 cl. 5.5.2.2 | Reporting stops with no error anywhere. Look for a measObjectToRemoveList in the preceding reconfiguration. |
| Trigger state reset by an unrelated edit | Nothing | Clears cellsTriggeredList, restarts timeToTrigger, resets numberOfReportsSent | A UE that stops reporting a still-triggered cell immediately after any reportConfig or measObject modification (§2.1). |
Threshold encoded on the wrong MeasTriggerQuantity branch | Nobody | Configures successfully and never (or always) triggers | Check the branch name, not the integer. -101 dBm and -15.5 dB are both '56' (§4.2). |
s-Measure above the working RSRP range | Nobody | Never measures neighbours, so no neighbour event can fire | A2 fires but A3/A4/A5 never do. Compare s-MeasureConfig against the serving RSRP in the reports you do get. |
Blacklisted PCI-Range wider than intended | Nobody | Excludes those cells from evaluation and from the report | Specific PCIs never appear as neighbours anywhere. Expand the range arithmetic: start PCI plus the range value. |
useWhiteCellList true with an inadequate whitelist | Nobody | Evaluates only whitelisted PCIs -- possibly none | An event that is configured, armed and provably never triggers on a carrier with visible neighbours. |
| No measurement gap where one is needed | Nobody | Cannot measure the other carrier at all | Inter-frequency and inter-RAT measIds produce nothing while intra-frequency works fine. See 21 Measurement Gaps and SMTC. |
| SMTC window not overlapping the neighbour's SSB burst | Nobody | Measures noise; the cell is never detected | The most common measurement misconfiguration in NR. Neighbour absent from every report despite good coverage. |
timeToTrigger longer than the fade or the overlap crossing | Nobody | Timer starts, resets, no report is sent | An absence of evidence (§12). Correlate UE speed against the overlap geometry. |
filterCoefficient too high for the UE's speed | Nobody, until RLF | Reports a stale value; the event fires late or not at all | RLF with no preceding measurement report. Check quantityConfig first. |
absThreshSS-BlocksConsolidation above every beam | Nobody | Falls back to best-beam-only cell quality | Cell qualities systematically higher than expected, and handovers to cells with one usable beam. |
maxReportCells too small under dense neighbours | Nobody | Reports the best N only; the true best target may be absent if it triggered later | Handovers to a second-best cell while the scanner shows a better one. |
rsType csi-rs with no refFreqCSI-RS in the object | UE RRC | Cannot perform the measurement | An event on a carrier whose measObject was written for SSB only. |
| PCI confusion: two cells with the same PCI in range | The network, eventually | Reports a PCI that resolves to two different cells | Handover preparation failures to a plausible target. Resolve with reportCGI, bounded by T321. |
reportAmount infinity with a short reportInterval | The uplink | Reports forever, every interval, per triggered cell | SRB1 congestion that scales with the number of triggered neighbours. |
Table 20. Measurement failure modes. Note how many are detected by nobody: the measurement framework has almost no error reporting, because not triggering is a legitimate outcome of every event.
Twelve of the sixteen rows above produce no error indication of any kind. The framework cannot distinguish a condition that was never satisfied from a condition that could never be satisfied, so a misconfiguration looks exactly like good radio conditions. This is why measurement debugging starts with the configuration and not with the logs, and why a measConfig decode is worth keeping alongside every trace.
17. Configuration Reference (ASN.1)
MeasConfig ::= SEQUENCE {
measObjectToRemoveList MeasObjectToRemoveList OPTIONAL,
measObjectToAddModList MeasObjectToAddModList OPTIONAL,
reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL,
reportConfigToAddModList ReportConfigToAddModList OPTIONAL,
measIdToRemoveList MeasIdToRemoveList OPTIONAL,
measIdToAddModList MeasIdToAddModList OPTIONAL,
s-MeasureConfig CHOICE {
ssb-RSRP RSRP-Range,
csi-RSRP RSRP-Range
} OPTIONAL,
quantityConfig QuantityConfig OPTIONAL,
measGapConfig MeasGapConfig OPTIONAL,
measGapSharingConfig MeasGapSharingConfig OPTIONAL,
...
}
MeasIdToAddMod ::= SEQUENCE {
measId MeasId, -- INTEGER (1..64)
measObjectId MeasObjectId, -- INTEGER (1..64)
reportConfigId ReportConfigId -- INTEGER (1..64)
}
QuantityConfigNR ::= SEQUENCE {
quantityConfigCell QuantityConfigRS,
quantityConfigRS-Index QuantityConfigRS OPTIONAL
}
QuantityConfigRS ::= SEQUENCE {
ssb-FilterConfig FilterConfig,
csi-RS-FilterConfig FilterConfig
}
FilterConfig ::= SEQUENCE {
filterCoefficientRSRP FilterCoefficient DEFAULT fc4,
filterCoefficientRSRQ FilterCoefficient DEFAULT fc4,
filterCoefficientRS-SINR FilterCoefficient DEFAULT fc4
}Listing 2. MeasConfig, the binding, and the filter configuration, abridged from TS 38.331.
MeasObjectNR ::= SEQUENCE {
ssbFrequency ARFCN-ValueNR OPTIONAL,
ssbSubcarrierSpacing SubcarrierSpacing OPTIONAL,
smtc1 SSB-MTC OPTIONAL,
smtc2 SSB-MTC2 OPTIONAL,
refFreqCSI-RS ARFCN-ValueNR OPTIONAL,
referenceSignalConfig ReferenceSignalConfig,
absThreshSS-BlocksConsolidation ThresholdNR OPTIONAL,
absThreshCSI-RS-Consolidation ThresholdNR OPTIONAL,
nrofSS-BlocksToAverage INTEGER (2..16) OPTIONAL,
nrofCSI-RS-ResourcesToAverage INTEGER (2..16) OPTIONAL,
quantityConfigIndex INTEGER (1..2),
offsetMO Q-OffsetRangeList,
cellsToRemoveList PCI-List OPTIONAL,
cellsToAddModList CellsToAddModList OPTIONAL,
blackCellsToRemoveList PCI-RangeIndexList OPTIONAL,
blackCellsToAddModList CellsToAddModList OPTIONAL,
whiteCellsToRemoveList PCI-RangeIndexList OPTIONAL,
whiteCellsToAddModList CellsToAddModList OPTIONAL,
...,
[[ freqBandIndicatorNR FreqBandIndicatorNR OPTIONAL,
measCycleSCell ENUMERATED {sf160, sf256, sf320,
sf512, sf640, sf1024, sf1280}
OPTIONAL ]]
}
Q-OffsetRangeList ::= SEQUENCE {
rsrpOffsetSSB Q-OffsetRange DEFAULT dB0,
rsrqOffsetSSB Q-OffsetRange DEFAULT dB0,
sinrOffsetSSB Q-OffsetRange DEFAULT dB0,
rsrpOffsetCSI-RS Q-OffsetRange DEFAULT dB0,
rsrqOffsetCSI-RS Q-OffsetRange DEFAULT dB0,
sinrOffsetCSI-RS Q-OffsetRange DEFAULT dB0
}
CellsToAddMod ::= SEQUENCE {
physCellId PhysCellId, -- INTEGER (0..1007)
cellIndividualOffset Q-OffsetRangeList
}Listing 3. MeasObjectNR, abridged. Note that both the frequency offset and the per-cell offset are six offsets, one per (quantity, RS type) pair -- Ofn and Ocn are quantity-specific.
ReportConfigNR ::= SEQUENCE {
reportType CHOICE {
periodical PeriodicalReportConfig,
eventTriggered EventTriggerConfig,
reportCGI ReportCGI,
...,
reportSFTD ReportSFTD-NR,
condTriggerConfig CondTriggerConfig,
cli-Periodical CLI-PeriodicalReportConfig,
cli-EventTriggered CLI-EventTriggerConfig
}
}
EventTriggerConfig ::= SEQUENCE {
eventId CHOICE {
eventA1 SEQUENCE {
a1-Threshold MeasTriggerQuantity,
reportOnLeave BOOLEAN,
hysteresis Hysteresis, -- INTEGER (0..30)
timeToTrigger TimeToTrigger
},
eventA2 SEQUENCE { a2-Threshold MeasTriggerQuantity, ... },
eventA3 SEQUENCE {
a3-Offset MeasTriggerQuantityOffset,
reportOnLeave BOOLEAN,
hysteresis Hysteresis,
timeToTrigger TimeToTrigger,
useWhiteCellList BOOLEAN
},
eventA4 SEQUENCE { a4-Threshold MeasTriggerQuantity, ... },
eventA5 SEQUENCE {
a5-Threshold1 MeasTriggerQuantity,
a5-Threshold2 MeasTriggerQuantity, ...
},
eventA6 SEQUENCE { a6-Offset MeasTriggerQuantityOffset, ... },
...
},
rsType NR-RS-Type, -- ssb | csi-rs
reportInterval ReportInterval,
reportAmount ENUMERATED {r1,r2,r4,r8,r16,r32,r64,
infinity},
reportQuantityCell MeasReportQuantity,
maxReportCells INTEGER (1..8),
reportQuantityRS-Indexes MeasReportQuantity OPTIONAL,
maxNrofRS-IndexesToReport INTEGER (1..32) OPTIONAL,
includeBeamMeasurements BOOLEAN,
reportAddNeighMeas ENUMERATED {setup} OPTIONAL,
...
}
MeasTriggerQuantity ::= CHOICE {
rsrp RSRP-Range, -- INTEGER (0..127)
rsrq RSRQ-Range, -- INTEGER (0..127)
sinr SINR-Range -- INTEGER (0..127)
}
MeasTriggerQuantityOffset ::= CHOICE {
rsrp INTEGER (-30..30), -- 0.5 dB units
rsrq INTEGER (-30..30),
sinr INTEGER (-30..30)
}
TimeToTrigger ::= ENUMERATED {ms0, ms40, ms64, ms80, ms100, ms128,
ms160, ms256, ms320, ms480, ms512, ms640,
ms1024, ms1280, ms2560, ms5120}Listing 4. ReportConfigNR and the event configuration, abridged. Every event carries its own hysteresis and timeToTrigger -- they are not global.
18. Illustrative Message Traces
Illustrative trace. Field names and encodings follow 3GPP; the values are constructed for this document and are not a capture from any deployed or lab network.
One scenario throughout: a UE with C-RNTI 0x4A17 on PCell PCI 188, carrier ssbFrequency 632628, with a neighbour PCI 301 on the same carrier and an inter-frequency carrier at 646656.
18.1 The measurement configuration being installed
09:41:12.204 [RRC-DL] RRCReconfiguration (SRB1, transaction 2)
measConfig
measObjectToAddModList
MeasObjectToAddMod measObjectId 1
measObjectNR
ssbFrequency ................... 632628 -- serving carrier
ssbSubcarrierSpacing ........... kHz30
smtc1 periodicityAndOffset sf20 : 4 -- window every 20 ms
duration ................ sf5
absThreshSS-BlocksConsolidation
rsrp .................... 67 -- -90 dBm
nrofSS-BlocksToAverage ......... 4
quantityConfigIndex ............ 1
offsetMO rsrpOffsetSSB ........ dB0
cellsToAddModList
CellsToAddMod physCellId 301
cellIndividualOffset rsrpOffsetSSB ... dB-3 -- Ocn = -3 dB
CellsToAddMod physCellId 188
cellIndividualOffset rsrpOffsetSSB ... dB1 -- Ocp = +1 dB
blackCellsToAddModList
PCI-RangeElement pci-RangeIndex 1
pci-Range start 640 range n4 -- PCI 640..643 excluded
MeasObjectToAddMod measObjectId 2
measObjectNR
ssbFrequency ................... 646656 -- inter-frequency
ssbSubcarrierSpacing ........... kHz30
smtc1 periodicityAndOffset sf40 : 12
duration ................ sf5
quantityConfigIndex ............ 2 -- heavier filtering
reportConfigToAddModList
ReportConfigToAddMod reportConfigId 1
reportConfigNR reportType eventTriggered
eventId eventA3
a3-Offset rsrp .............. 6 -- +3.0 dB
reportOnLeave ................. FALSE
hysteresis .................... 4 -- 2.0 dB
timeToTrigger ................. ms320
useWhiteCellList .............. FALSE
rsType ......................... ssb
reportInterval ................. ms1024
reportAmount ................... r8
reportQuantityCell rsrp TRUE rsrq TRUE sinr TRUE
maxReportCells ................. 4
reportQuantityRS-Indexes rsrp TRUE rsrq FALSE sinr FALSE
maxNrofRS-IndexesToReport ...... 4
includeBeamMeasurements ........ TRUE
reportAddNeighMeas ............. setup
ReportConfigToAddMod reportConfigId 2
reportConfigNR reportType eventTriggered
eventId eventA2
a2-Threshold rsrp ............ 57 -- -100 dBm
hysteresis .................... 4
timeToTrigger ................. ms640
measIdToAddModList
measId 1 measObjectId 1 reportConfigId 1 -- A3 intra-frequency
measId 2 measObjectId 1 reportConfigId 2 -- A2 on serving
measId 3 measObjectId 2 reportConfigId 1 -- A3 inter-frequency
quantityConfig
quantityConfigNR-List
[1] quantityConfigCell ssb-FilterConfig
filterCoefficientRSRP ...... fc4 -- a = 0.5
quantityConfigRS-Index ssb-FilterConfig
filterCoefficientRSRP ...... fc2
[2] quantityConfigCell ssb-FilterConfig
filterCoefficientRSRP ...... fc6 -- a = 0.354
s-MeasureConfig ssb-RSRP .......... 76 -- -81 dBm gateListing 5. A complete measConfig. Three measIds, two of them sharing reportConfigId 1 -- editing that one reportConfig would reset both.
18.2 A3 triggering, with beam measurements
09:43:58.112 [UE-MEAS] measId 1 A3 evaluation
PCI 188 (SpCell) cell RSRP -95.0 dBm (rsrp 62)
PCI 301 cell RSRP -87.5 dBm (rsrp 70)
Mn + Ofn + Ocn - Hys = -87.5 + 0 - 3 - 2 = -92.5
Mp + Ofp + Ocp + Off = -95.0 + 0 + 1 + 3 = -91.0
-92.5 > -91.0 ? NO -- entering condition false
09:44:00.318 [UE-MEAS] measId 1 A3 evaluation
PCI 301 cell RSRP -85.0 dBm (rsrp 72)
-85.0 + 0 - 3 - 2 = -90.0 > -91.0 ? YES
-> start timeToTrigger ms320 for PCI 301
09:44:00.518 [UE-MEAS] measId 1 PCI 301 still satisfies A3-1
09:44:00.638 [UE-MEAS] measId 1 timeToTrigger expired
-> PCI 301 added to cellsTriggeredList
-> initiate measurement reporting, numberOfReportsSent 0
09:44:00.641 [RRC-UL] MeasurementReport (SRB1)
measResults
measId ......................... 1
measResultServingMOList
MeasResultServMO servCellId 0
measResultServingCell physCellId 188
cellResults resultsSSB-Cell
rsrp ...................... 62 -- -95 dBm
rsrq ...................... 46 -- -20.5 dB
sinr ...................... 57 -- 5.0 dB
rsIndexResults resultsSSB-Indexes
ssb-Index 2 rsrp ....... 64 -- -93 dBm, best serving beam
ssb-Index 1 rsrp ....... 61 -- -96 dBm
measResultBestNeighCell physCellId 301 -- reportAddNeighMeas
cellResults resultsSSB-Cell rsrp 72
measResultNeighCells measResultListNR
MeasResultNR physCellId 301
cellResults resultsSSB-Cell
rsrp ....................... 72 -- -85 dBm (consolidated)
rsrq ....................... 53 -- -17.0 dB
sinr ....................... 71 -- 12.0 dB
rsIndexResults resultsSSB-Indexes
ssb-Index 5 rsrp ........ 75 -- -82 dBm, best beam
ssb-Index 4 rsrp ........ 69 -- -88 dBm
ssb-Index 6 rsrp ........ 68 -- -89 dBm
ssb-Index 3 rsrp ........ 54 -- -103 dBm, below absThresh
MeasResultNR physCellId 442
cellResults resultsSSB-Cell rsrp 58 -- -99 dBm, reported but
-- not triggered
-- 3 beams above -90 dBm averaged in linear power -> cell rsrp 72,
-- i.e. 3 dB below the best beam. The event compares the 72.Listing 6. The trigger arithmetic and the resulting report. The four beams reported per cell are maxNrofRS-IndexesToReport, and PCI 442 is included because maxReportCells is 4, not because it triggered.
18.3 An event that enters and leaves without reporting
09:47:31.002 [UE-MEAS] measId 1 PCI 301 cell RSRP -89.5 dBm
-89.5 - 3 - 2 = -94.5 > -95.0 ? YES
-> start timeToTrigger ms320 (expiry 09:47:31.322)
09:47:31.202 [UE-MEAS] measId 1 PCI 301 cell RSRP -91.5 dBm
-91.5 - 3 - 2 = -96.5 > -95.0 ? NO
-> entering condition not satisfied on this sample
-> timeToTrigger for PCI 301 RESET (not paused)
09:47:31.402 [UE-MEAS] measId 1 PCI 301 cell RSRP -92.0 dBm (no timer)
09:47:31.602 [UE-MEAS] measId 1 PCI 301 cell RSRP -93.5 dBm (no timer)
-- Nothing was transmitted. No MeasurementReport exists for this
-- excursion, on either side of the air interface. PCI 301 was never
-- in cellsTriggeredList, so reportOnLeave is irrelevant too.
-- On the network side the only observable is silence.
09:47:33.410 [UE-MEAS] measId 2 A2 evaluation (serving degrading)
Ms + Hys < Thresh: -99.0 + 2 = -97.0 < -100.0 ? NO
09:47:34.010 [UE-MEAS] measId 2 Ms = -103.0 dBm
-103.0 + 2 = -101.0 < -100.0 ? YES
-> start timeToTrigger ms640
09:47:34.650 [RRC-UL] MeasurementReport measId 2 (A2, serving only)
measResultServingMOList physCellId 188 rsrp 54
measResultNeighCells ... absent -- A2 has no neighbour termListing 7. The invisible failure of §12, followed by an A2 report to show the contrast: A2 carries no neighbour list at all, which is correct and not a truncated decode.
18.4 s-Measure suppressing neighbour measurement
09:39:02.660 [UE-MEAS] s-MeasureConfig ssb-RSRP 76 -> -81 dBm
09:39:02.660 [UE-MEAS] SpCell PCI 188 cell RSRP -74.0 dBm
-74.0 > -81.0 -> neighbour measurement not required
measId 1 (A3) : not evaluated, no neighbour results
measId 3 (A3 inter-freq) : not evaluated
measId 2 (A2) : evaluated -- serving-only event
09:40:44.118 [UE-MEAS] SpCell PCI 188 cell RSRP -82.5 dBm
-82.5 < -81.0 -> begin neighbour measurement
09:40:44.118 [UE-MEAS] measId 1 L3 filter initialised, F_0 = M_1
09:40:44.318 [UE-MEAS] measId 1 PCI 301 first filtered sample -101.0
-- The neighbour was receivable at -88 dBm for the previous 100
-- seconds. The UE was not looking, and the filter now has to settle
-- from its first sample before A3 can be true.Listing 8. Why an aggressive s-Measure shows up as late handover rather than as an error. Every neighbour-based measId is dormant above the gate.
18.5 Early measurements collected in idle
07:12:40.006 [RRC-DL] RRCRelease
measIdleConfigDedicated
measIdleCarrierListNR
MeasIdleCarrierNR carrierFreq 646656 ssbSubcarrierSpacing kHz30
frequencyBandList ............. 78
measCellListNR ................ PCI 512, 513, 514
reportQuantities .............. both -- RSRP and RSRQ
qualityThreshold idleRSRP-Threshold ... 62 -- -95 dBm
measIdleDuration ................ sec120
07:14:55.884 [RRC-UL] RRCSetupComplete
selectedPLMN-Identity ......... 1
idleMeasAvailable ............. TRUE -- results are stored
dedicatedNAS-Message .......... (NAS Service Request)
07:14:56.101 [RRC-DL] UEInformationRequest
idleModeMeasurementReq ........ TRUE
07:14:56.140 [RRC-UL] UEInformationResponse
measResultIdleNR
measResultServingCell rsrp 71 rsrq 55
measResultsPerCarrierListIdleNR
carrierFreq 646656
measResultsPerCellListIdleNR
physCellId 513 rsrp 74 rsrq 58 -- -83 dBm, measured in idle
physCellId 512 rsrp 66 rsrq 51 -- -91 dBm
-- These values were taken at an unstated moment inside a 120 s
-- window. They are adequate for choosing an SCell carrier and are
-- not evidence about conditions at 07:14:56.Listing 9. Early measurement reporting end to end. Note that no measId and no MeasurementReport are involved.
19. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading measurements |
|---|---|---|
| Rel-15 | The whole framework: measConfig, A1-A6, B1-B2, SSB and CSI-RS measurement, beam consolidation, L3 filtering, s-MeasureConfig, reportCGI, reportSFTD | Everything in §2-14 is Rel-15 unless noted otherwise. |
| Rel-16 | Conditional handover: condTriggerConfig with condEventA3 and condEventA5 | A configured event may fire and produce no MeasurementReport -- the UE executes a stored handover instead. Absence of a report no longer implies absence of a trigger. See 25 Conditional HO and DAPS. |
| Rel-16 | Early measurements in RRC_IDLE / RRC_INACTIVE (measIdleConfigSIB, measIdleConfigDedicated, idleMeasAvailable) | Measurement results can arrive in UEInformationResponse with no measId attached and unknown age (§15.1). |
| Rel-16 | MDT for NR: LoggedMeasurementConfiguration, logged and immediate MDT, location and Bluetooth/WLAN/sensor information | A second, parallel measurement subsystem with its own configuration message and its own retrieval procedure (§15.2). |
| Rel-16 | Cross-link interference: eventI1, cli-Periodical, cli-EventTriggered, SRS-RSRP and CLI-RSSI | A reportConfig may measure other UEs, not cells. The report shape is different. |
| Rel-16 | Idle-mode measurement relaxation for stationary and low-mobility UEs; MeasObjectUTRA-FDD for legacy fallback | A UE may legitimately measure far less often than the broadcast parameters suggest. |
| Rel-17 | RedCap relaxed measurement in RRC_CONNECTED; NTN mobility events condEventD1 (distance) and condEventT1 (time) | Mobility conditions that are not radio measurements at all. A handover can be triggered by position or by a clock. |
| Rel-17 | Terminology cleanup: excludedCellsToAddModList and allowedCellsToAddModList replace the black/white list names, useAllowedCellList replaces useWhiteCellList | Two spellings for the same fields, in circulation simultaneously across tools and vendor documentation. |
| Rel-17 | Multiple concurrent measurement gap patterns, pre-configured and network-controlled small gaps | Inter-frequency measurement becomes cheaper, so more inter-frequency measIds become viable. See 21 Measurement Gaps and SMTC. |
| Rel-18 | L1/L2-triggered mobility (LTM): L1 beam and cell measurement reporting driving cell switch below RRC | A cell change can occur with no MeasurementReport and no RRCReconfiguration in the trace at all -- the trigger is an L1 report and the command is a MAC CE. |
| Rel-18 | Further CHO enhancements including candidate SCG configurations, and continued MDT/AI-data-collection work | More cases where the UE evaluates conditions the network configured but never hears the outcome of. |
Table 21. Measurement-relevant changes by release. Confirm feature presence against the UE capability exchange -- see the companion 26 UE Capability document.
20. Reading Measurements in Logs: A Checklist
- Resolve the
measIdfirst. A report says measId 3 and nothing else. Find themeasIdToAddModListentry, then themeasObjectand thereportConfigit names. Until you have done that, you do not know which carrier or which event you are looking at. - Read the threshold's CHOICE branch, not its integer.
rsrp 56is -101 dBm;rsrq 56is -15.5 dB;sinr 56is 4.5 dB. Then convert every reported value with the matching ruler (§4.2). - Recompute the entering inequality by hand, with all four offsets and the hysteresis, from the values in the report itself (§9). If your arithmetic says the event should not have fired, you have missed an
offsetMOor acellIndividualOffset. - Check
s-Measureagainst the serving RSRP in the reports you do have. If the serving cell has been above the gate, the absence of neighbour reports is configured behaviour, not a radio finding. - Check the filter before believing any value.
filterCoefficientfc9 or higher means the reported number lags reality by seconds. Reconcile against timestamps, not against your expectation of the geometry (§6). - Compare cell-level against beam-level results in the same report. A cell value far below the best beam means many weak beams are being averaged in; a cell value equal to the best beam means consolidation is in its best-beam fallback (§5).
- For a neighbour that never appears, work down the exclusion list: blacklisted
PCI-Range,useWhiteCellList, missing gap, SMTC misalignment,s-Measure, wrongssbFrequency. All six produce exactly the same observable -- nothing. - Distinguish no report from no trigger. An event that entered and reset its
timeToTriggerleaves no trace on the network side (§12). If the UE-side log shows timer starts without expiries,timeToTriggeris too long for the fade. - Look upstream for a reset. Reporting that stops for a cell that is still clearly triggered usually follows a
reportConfigormeasObjectmodification in an earlier reconfiguration (§2.1). - Count the reports against
reportAmountandreportInterval. A single report where you expected a stream meansr1; an endless stream meansinfinitywith a short interval, and it is worth checking whether SRB1 is coping.
21. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
measConfig | Measurement Configuration | The RRC IE carrying all measurement configuration; always a delta against VarMeasConfig. |
measId | Measurement Identity | INTEGER (1..64) binding one measObject to one reportConfig. The only identifier in a report. |
measObject | Measurement Object | What to measure: carrier, reference signals, SMTC, per-cell offsets, exclusion lists. |
reportConfig | Reporting Configuration | When and how to report: event or periodical, thresholds, hysteresis, timeToTrigger, report contents. |
VarMeasConfig | -- | The UE variable holding the merged measurement configuration. |
VarMeasReportList | -- | The UE variable holding per-measId trigger state, including cellsTriggeredList and numberOfReportsSent. |
| SS-RSRP | SSB Reference Signal Received Power | Average power of the SSS resource elements. The default mobility quantity. |
| SS-RSRQ | SSB Reference Signal Received Quality | N x RSRP / RSSI. Falls with load even when RSRP is constant. |
| SS-SINR | SSB Signal to Interference plus Noise Ratio | SSS power over noise-plus-interference on the same resource elements. |
| Cell quality | -- | The consolidated value derived from beam measurements (§5); what events actually compare. |
| Mn / Mp / Ms | -- | Neighbour / SpCell / serving-cell measurement in an event inequality. |
| Ofn / Ocn | -- | Frequency-specific and cell-specific offsets applied to the neighbour: offsetMO and cellIndividualOffset. |
| Hys | Hysteresis | Half the dead band, in dB. Applied against the event when entering and in its favour when leaving. |
| TTT | timeToTrigger | Minimum continuously-satisfied duration before the state changes. Any failing sample resets it. |
s-Measure | -- | SpCell RSRP threshold above which neighbour measurement is not required. |
| SMTC | SSB Measurement Timing Configuration | The window in which the UE looks for a carrier's SSBs; see 21 Measurement Gaps and SMTC. |
| MDT | Minimisation of Drive Tests | Immediate (live reports) or logged (stored and fetched later) measurement collection for optimisation. |
22. References
- 3GPP TS 38.331 -- NR RRC protocol specification. Clause 5.5 (measurements): 5.5.2 (measurement configuration, 5.5.2.1 order of processing, 5.5.2.2 object removal, 5.5.2.5 object addition/modification, 5.5.2.8 report configuration addition/modification), 5.5.3.1 (
s-Measure), 5.5.3.2 (layer-3 filtering), 5.5.3.3 (cell quality derivation), 5.5.4 (measurement report triggering, 5.5.4.1 general, 5.5.4.2-5.5.4.7 events A1-A6, 5.5.4.8-5.5.4.9 events B1-B2), 5.5.5 (measurement reporting). IEs:MeasConfig,MeasObjectNR,ReportConfigNR,EventTriggerConfig,QuantityConfig,MeasResults,MeasQuantityResults. - 3GPP TS 38.215 -- Physical layer measurements. Clause 5.1.1 (SS-RSRP), 5.1.2 (CSI-RSRP), 5.1.3 (SS-RSSI), 5.1.4 (SS-RSRQ), 5.1.5 (SS-SINR), 5.1.6-5.1.8 (CSI-RS equivalents).
- 3GPP TS 38.133 -- Requirements for support of radio resource management. Clause 9 (measurement procedures and measurement periods), clause 10.1 (measurement reporting mappings: 10.1.6 SS-RSRP, 10.1.11 SS-RSRQ, 10.1.16 SS-SINR), clause 9.3 (measurement accuracy).
- 3GPP TS 38.300 -- NR overall description. Clause 9.2.4 (measurements) and 9.2.3 (mobility in RRC_CONNECTED), for how measurements sit in the mobility architecture.
- 3GPP TS 38.304 -- UE procedures in idle and inactive. Cell reselection measurement rules, which are separate from
measConfig. - 3GPP TS 37.320 -- Radio measurement collection for MDT. The framework behind §15.2.
Companion documents in this set
- 21 Measurement Gaps and SMTC -- the timing and gap machinery every inter-frequency and inter-RAT
measIdin this document depends on. Read it next if any neighbour is missing from your reports. - 22 Handover Overview -- what the network does with an A3 or A5 report; 23 Xn Handover and 24 NG / N2 Handover for the inter-node signalling.
- 25 Conditional HO and DAPS --
condTriggerConfig, where the UE evaluates the event and acts without reporting. - 15 RRC Procedures -- the
RRCReconfigurationprocedure that carriesmeasConfig, and what a UE does when it cannot comply. - 13 RRC Overview and 14 RRC States -- where
VarMeasConfiglives and which states retain it. - 12 Beam Failure Recovery -- the beam-level view of the same SSB and CSI-RS measurements.
- 16 RLM and RLF -- what happens when measurement is too slow, and
T312, which a measurement report can start. - 02 Radio Frame Structure -- SFN, subframes and the SSB burst structure that SMTC windows are positioned against.
- 10 BSR, PHR, SR -- how a
MeasurementReportgets an uplink grant when the UE has nothing else to send. - 26 UE Capability -- which measurement features, quantities and concurrent
measIdcounts a given UE actually supports.