>
Home5G NRPHY — Physical LayerPHY Measurements
📶 PHY — Physical LayerIntermediate

PHY Measurements (RSRP/RSRQ/SINR/RSSI) in 5G NR

The measurement quantities the UE reports, and how RSSI, RSRP, RSRQ and SINR relate.

📚 3GPP-basedTS 38.215TS 38.133

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
  1. 01Why the Network Has to Ask
  2. 02measConfig: Three Lists and One Indirection
  3. 03MeasObjectNR: What Measure This Means
  4. 04The Quantities and Their Integer Encodings
  5. 05Beam Level and Cell Level: Consolidation
  6. 06Layer-3 Filtering
  7. 07The Event Framework: Machinery Common to All Events
  8. 08A1 and A2: the Serving Cell Against a Threshold
  9. 09A3 and A6: a Neighbour Against a Serving Cell
  10. 10A4 and A5: a Neighbour Against a Threshold
  11. 11B1 and B2: Inter-RAT
  12. 12timeToTrigger and Hysteresis Together
  13. 13reportConfigNR: Report Types and Content Controls
  14. 14The MeasurementReport Message
  15. 15Measurements in RRC_IDLE and RRC_INACTIVE
  16. 16Failure Modes and What Each One Means
  17. 17Configuration Reference (ASN.1)
  18. 18Illustrative Message Traces
  19. 19Release Deltas: Rel-15 to Rel-18
  20. 20Reading Measurements in Logs: A Checklist
  21. 21Glossary
  22. 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 measurementsWhat it needsTypical configurationCompanion document
Intra-frequency handoverNeighbour better than the serving cell by a marginA3 on the serving measObject, timeToTrigger 160-320 ms22 Handover Overview, 23 Xn Handover
Inter-frequency handover / redirectionServing cell poor and a specific other carrier usableA2 to arm, then A5 or A4 on the other carrier22 Handover Overview, 21 Measurement Gaps and SMTC
Conditional handover (CHO)The same conditions, evaluated by the UE after the commandcondTriggerConfig with condEventA3 / condEventA525 Conditional HO and DAPS
SCell / PSCell additionIs the other carrier worth activatingA4 on the candidate carrier, or early measurements from idle26 UE Capability for what the UE supports
Beam managementWhich SSB or CSI-RS beam to useincludeBeamMeasurements, reportQuantityRS-Indexes12 Beam Failure Recovery
Coverage optimisation / MDTWhat the radio looked like where the user wasLogged MDT, or periodical reporting with location infothis document, §15
ANR and PCI-confusion resolutionThe full CGI behind a PCIreportCGI, bounded by T32117 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.

💡
Key point

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.

Figure 1. The whole cycle, once. Configuration comes down in 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.

Figure 2. The three-way binding. A 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.
FieldType and rangePurposeConsequence of getting it wrong
measObjectToAddModList1..64 entries, measObjectId INTEGER (1..64)Carrier and reference-signal definitionsWrong ssbFrequency or ssbSubcarrierSpacing and the UE searches the wrong raster point -- reports nothing, silently
reportConfigToAddModList1..64 entries, reportConfigId INTEGER (1..64)Events, thresholds, periodicity, report contentsWrong threshold branch (rsrp vs rsrq) changes the threshold by tens of dB (§4)
measIdToAddModList1..64 entries, measId INTEGER (1..64)The bindings that actually runA binding that names the wrong object measures the right event on the wrong carrier
quantityConfig1..2 QuantityConfigNR entriesLayer-3 filter coefficients, per quantity and per RS typeOver-filtering delays every event that uses the object (§6)
s-MeasureConfigCHOICE ssb-RSRP / csi-RSRP, RSRP-Range 0..127Gate: measure neighbours only when the SpCell is below thisSet too high and neighbour measurement never starts (§2.3)
measGapConfigMeasGapConfigGap patterns for other-frequency measurementNo gap where a gap is needed = no inter-frequency results at all
measGapSharingConfigMeasGapSharingConfigHow gap time is divided between measurement purposesStarves one purpose of gap time; see 21 Measurement Gaps and SMTC
measObjectToRemoveList etc.Lists of IDsDelta configuration -- processed before the add/mod listsRemoving 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.

⚠️
Common pitfall

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.

⚠️
Common pitfall

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.

FieldValuesWhat it controlsNotes
ssbFrequencyARFCN-ValueNR 0..3279165The SSB's centre frequency (Point-A-independent, on the global synchronisation raster)Absent only for CSI-RS-only objects
ssbSubcarrierSpacingkHz15, kHz30, kHz120, kHz240How to demodulate the SSBMust match the neighbour's actual SSB SCS, not the serving cell's
smtc1SSB-MTC: periodicity sf5..sf160 + offset, duration sf1..sf5The primary measurement window for this carrierSee 21 Measurement Gaps and SMTC -- misalignment here is the most common measurement fault of all
smtc2periodicity sf5..sf80 + pci-ListA shorter-periodicity override for the listed PCIsUsed when a subset of neighbours transmits SSB more often
refFreqCSI-RSARFCN-ValueNRReference point for the CSI-RS resources used for mobilityRequired before any rsType csi-rs event can work
referenceSignalConfigssb-ConfigMobility, csi-rs-ResourceConfigMobilityssb-ToMeasure bitmap, deriveSSB-IndexFromCell, ssb-PositionQCL-CommonderiveSSB-IndexFromCell = true asserts neighbour SSB timing is aligned with the serving cell
absThreshSS-BlocksConsolidationThresholdNR (RSRP/RSRQ/SINR range)Beams below this are excluded from the cell-quality averageOptional; absent means use the best beam only (§5)
nrofSS-BlocksToAverageINTEGER (2..16)Ceiling on how many beams are averagedOptional; absent means use the best beam only
quantityConfigIndexINTEGER (1..2)Which QuantityConfigNR (filter coefficients) appliesLets one carrier be filtered hard and another lightly
offsetMOQ-OffsetRangeList, six offsets, dB-24..dB24Ofn / Ofp -- the per-frequency, per-quantity offsetOne offset per (quantity, RS type) combination
cellsToAddModListCellsToAddMod: physCellId + cellIndividualOffsetOcn / Ocs -- the per-cell, per-quantity offsetNot a permit list: listing a cell only gives it an offset
blackCellsToAddModListPCI-RangeIndex + PCI-Range (start + n4..n1008)PCIs the UE must not measure or report on this carrierRanges, not single PCIs -- easy to exclude more than intended
whiteCellsToAddModListsame shapeIf an event sets useWhiteCellList, only these PCIs are consideredSilently disables everything else for that event
measCycleSCellsf160, sf256, sf320, sf512, sf640, sf1024, sf1280How often to measure a deactivated SCell's carrierTrades 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.

📘
Spec detail

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.

⚠️
Common pitfall

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

QuantityDefinitionUnitWhat it tells you
SS-RSRPLinear 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.dBmAbsolute 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-RSRPSame, over the resource elements carrying CSI-RS configured for mobility TS 38.215 cl. 5.1.2.dBmFiner-grained and more frequent than SSB, but only where CSI-RS mobility resources are configured.
SS-RSSILinear 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.dBmNot reported on its own. It is the denominator of RSRQ.
SS-RSRQN 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.dBHow much of the received power is this cell. Falls when neighbours load up, even though RSRP is unchanged.
SS-SINRLinear 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.dBThe 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.

Figure 3. The three rulers side by side. Reading a report without knowing which quantity a field holds is how -12.5 dB gets recorded as -95 dBm.
Range typeValue 0Values 1..126Value 127Conversion
RSRP-Rangebelow -156 dBm1 dB bins; bin N covers [N-157, N-156) dBm-30 dBm or abovedBm = N - 157
RSRQ-Rangebelow -43 dB0.5 dB bins from -43 dB upwards20 dB or abovedB = 0.5N - 43.5
SINR-Rangebelow -23 dB0.5 dB bins from -23 dB upwards40 dB or abovedB = 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.

🧮
Worked calculation

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

⚠️
Common pitfall

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.

📘
Spec detail

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.

  1. If neither nrofSS-BlocksToAverage nor absThreshSS-BlocksConsolidation is configured for the object, cell quality is the highest beam measurement. The cell is as good as its best beam.
  2. Otherwise, take the beams whose measurement is above absThreshSS-BlocksConsolidation, keep at most nrofSS-BlocksToAverage of the highest of them, and average them in the linear power domain.
  3. If no beam is above the threshold, fall back to rule 1 -- the highest beam alone.
Figure 4. Three of eight beams clear the threshold, so three are averaged even though four were permitted. Raise the threshold above -82 dBm and the rule-3 fallback silently turns this into best beam only.
🧮
Worked calculation

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.

ConfigurationCell quality becomesEffect on A3-style mobility
No threshold, no countBest beamMost 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-4Average of the best few good beamsBalanced. 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 UEPessimistic. Cells look worse than they are; handover is late and the reported value correlates poorly with post-handover throughput.
Threshold above every beamBest 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:

Layer-3 filter, 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.

filterCoefficientaSamples to reach 90% of a stepApprox. settling time at 200 ms/sampleWhere it fits
fc01.00010.2 sNo filtering. Raw L1 straight into the event. Only for lab work.
fc10.84120.4 sAlmost unfiltered.
fc20.70730.6 sVery fast; noisy in fading.
fc30.59530.6 sFast.
fc40.50040.8 sThe default. Halves the error each sample. Sensible for most mobility.
fc50.42051.0 sSlightly smoother than default.
fc60.35461.2 sCommon for inter-frequency objects.
fc80.25091.8 sHeavy. Pedestrian or fixed UEs.
fc90.210102.0 sHeavy. Visibly late for vehicular speeds (see the figure).
fc110.149153.0 sVery heavy.
fc130.105214.2 sVery heavy.
fc150.074306.0 sEffectively a long-term average.
fc170.053438.6 sStationary-UE territory.
fc190.0376112.2 sThe 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.

Figure 5. A 12 dB step, filtered two ways. Both filters converge to the same value; fc9 takes 600 ms longer to cross the threshold that matters, before timeToTrigger has even started.
🧮
Worked calculation

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.

⚠️
Common pitfall

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.

SymbolMeaningSourceUnits
MsMeasurement result of the serving cell (A1, A2, A6)Consolidated cell quality, L3-filtered, no offsets applieddBm (RSRP) or dB (RSRQ, SINR)
MpMeasurement result of the SpCell (A3, A5, B2)As above, for the PCell or PSCelldBm or dB
MnMeasurement result of the neighbour under testAs above, for the candidate celldBm or dB
Ofn / OfpFrequency-specific offset of the neighbour's / SpCell's frequencyoffsetMO in the respective MeasObjectNRdB (Q-OffsetRange)
Ocn / Ocp / OcsCell-specific offset of the neighbour / SpCell / serving cellcellIndividualOffset in cellsToAddModList; 0 if the cell is not listeddB (Q-OffsetRange)
HysHysteresis for this eventhysteresis in the event configurationdB (0.5 dB units)
OffEvent offseta3-Offset, a6-OffsetdB (0.5 dB units, signed)
ThreshAbsolute thresholda1-Threshold, a2-Threshold, a4-Threshold, a5-Threshold1/2, b1-Threshold, b2-Threshold1/2The 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.

Figure 6. The state the UE holds per (measId, cell) pair. A single sample that fails the condition resets the timer -- it does not pause it.
  1. The entering condition becomes true for a cell -> start timeToTrigger for that cell.
  2. Any sample inside the window fails the entering condition -> the timer is reset, not paused. Nothing is reported (§12).
  3. The timer expires with every sample satisfying the condition -> the cell is added to cellsTriggeredList and the UE initiates the measurement reporting procedure. This is the first MeasurementReport.
  4. While the cell stays in cellsTriggeredList, further reports are sent every reportInterval until reportAmount reports have been sent.
  5. The leaving condition becomes true and holds for timeToTrigger -> the cell is removed from cellsTriggeredList, and a final report is sent only if reportOnLeave is true.
💡
Key point

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-Measure permits neighbour measurement at all (§2.3).
  • Restricts the candidate set to cells detected on the measObject's frequency, excluding every PCI inside a blacklisted PCI-Range, and -- if the event sets useWhiteCellList -- keeping only the whitelisted PCIs.
  • Consolidates beams into a cell quality per candidate (§5), then L3 filters it (§6).
  • Applies offsetMO and, for cells present in cellsToAddModList, cellIndividualOffset, per quantity.
  • Evaluates the entering and leaving conditions for that measId against 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.

A1 and A2 conditions
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.
Figure 7. One serving-cell trace crossing both events. The grey band is the deliberate gap between them: A2 has left but A1 has not entered, so no measurement activity is being switched either way.
EventFires whenTypical operational useTypical threshold
A1Serving cell recovers above a thresholdCancel 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
A2Serving cell degrades below a thresholdArm 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.

⚠️
Common pitfall

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.

A3 and A6 conditions
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.
Figure 8. A3 with every mechanism visible at once: the 3 dB offset, the 4 dB dead band from 2 x hysteresis, and two timeToTrigger windows of which only the second completes.
🧮
Worked calculation

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.

KnobEffect on A3ScopeWhen to reach for it
a3-OffsetRaises the bar for every neighbour of every cell using this reportConfigPer reportConfigGlobal mobility aggressiveness. 2-3 dB is a common starting point.
offsetMO (Ofn)Favours or penalises an entire carrierPer measObjectLoad-balancing a whole frequency layer, or compensating a systematic level difference between bands.
cellIndividualOffset (Ocn)Favours or penalises one PCIPer cell within a measObjectOne badly behaved neighbour: a cell with a known coverage overshoot, or one you want the UE to prefer for capacity reasons.
hysteresisWidens the dead band symmetricallyPer event within a reportConfigPing-pong that survives timeToTrigger tuning.
timeToTriggerRequires the condition to persistPer eventFast 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.

A4 and A5 conditions
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.
Figure 9. A5's AND arms at the later of its two halves. The serving cell here passes its threshold 400 ms before the neighbour passes its; nothing happens in between, which is exactly the intended conservatism.
EventQuestion askedUsed forFailure characteristic
A4Is this neighbour good enough, on its own terms?Inter-frequency load balancing; SCell and PSCell candidate discovery; blind-spot coverage layersFires 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.
A5Is my serving cell bad AND is this neighbour good?Conservative inter-frequency handover; coverage-triggered fallback to a low bandBoth 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.

📘
Spec detail

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.

B1 and B2 conditions
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.
⚠️
Common pitfall

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.

EventObjectServing sideNeighbour sideUsed for
B1MeasObjectEUTRAnot consideredE-UTRA RSRP or RSRQ against b1-ThresholdEUTRAEPS fallback candidate discovery; inter-RAT redirection
B2MeasObjectEUTRANR SpCell against b2-Threshold1E-UTRA against b2-Threshold2EUTRACoverage-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.

HysteresistimeToTrigger
DomainAmplitude (dB)Time (ms)
Configured ashysteresis, INTEGER (0..30) in 0.5 dB unitstimeToTrigger, ENUMERATED ms0..ms5120
SuppressesState flapping when the quantity sits near the thresholdTriggering on short-lived excursions of any size
CostThe event fires later by Hys dB, and leaves later by Hys dBThe event fires later by up to timeToTrigger ms
Failure if too smallPing-pong: repeated handover between two cellsHandover on transients; handover to a cell the UE has already left
Failure if too largeHandover so late that the source cell is unusable; the dead band swallows the whole usable overlap regionThe condition never persists long enough in a fast fade -- the event enters and leaves without ever reporting
Interacts withThe offsets, additivelyThe L3 filter (§6), additively in delay

Table 13. The two anti-ping-pong mechanisms. Both cost latency; neither can do the other's job.

🧮
Worked calculation

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.

🔍
What you see in logs

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:

StageTypical contributionSet by
L1 measurement periodUp to ~200 ms per sample, longer with gapsSMTC periodicity, gap pattern, measCycleSCell TS 38.133 cl. 9
L3 filter settling0.2 s (fc0) to 12 s (fc19)filterCoefficient in quantityConfig
Event persistence0 to 5120 mstimeToTrigger
Report transmissionA few ms, plus SR/BSR latency if the UE has no grantUplink scheduling; see 10 BSR, PHR, SR
Network decision and preparationTens of ms over Xn, more over NG23 Xn Handover, 24 NG / N2 Handover
Handover executionTens of ms including RACH at the target22 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

reportTypeWhat it doesKey fieldsNotes
eventTriggeredReport when an event's entering condition is satisfied for timeToTriggereventId, rsType, reportInterval, reportAmountThe subject of §7-12
periodicalReport every reportInterval, unconditionallyreportInterval, reportAmount, reportQuantityCellDrive tests, MDT, and continuous monitoring of a known-marginal UE
reportCGIAcquire and report the full CGI of a specific PCIcellForWhichToReportCGI, si-RequestForHOBounded by T321. Requires the UE to read the neighbour's SIB1, so it is expensive; used for ANR and to resolve PCI confusion
reportSFTDReport SFN and frame timing difference between the PCell and a neighbourreportSFTD-Meas, reportRSRPNeeded to set up dual connectivity and to judge synchronisation
condTriggerConfigConfigure the UE to evaluate the condition and execute a stored handovercondEventA3 / condEventA5 and their thresholdsRel-16 conditional handover; see 25 Conditional HO and DAPS. No MeasurementReport is sent when it fires
cli-Periodical / cli-EventTriggeredReport cross-link interference (SRS-RSRP or CLI-RSSI)i1-Threshold for eventI1Rel-16, for dynamic TDD deployments

Table 15. ReportConfigNR.reportType branches. Only the first two produce the ordinary MeasurementReport flow described in §14.

FieldValuesTypicalEffect
rsTypessb, csi-rsssbWhich reference signal the event and the report use. csi-rs requires refFreqCSI-RS and CSI-RS mobility resources in the measObject.
reportIntervalms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, ms20480, ms40960, min1, min6, min12, min30ms1024Spacing of the 2nd and subsequent reports for one triggered cell. Also the period for periodical.
reportAmountr1, r2, r4, r8, r16, r32, r64, infinityr1 or r8How many reports one trigger produces. infinity with a short interval is a signalling generator.
reportQuantityCell3 booleans: rsrp, rsrq, sinrall threeWhich cell-level quantities appear. Costs report size, not measurement effort.
maxReportCellsINTEGER (1..8)4Maximum neighbours in one report, best first. Too small and the actual best target can be pushed out by cells that triggered earlier.
reportQuantityRS-Indexes3 booleansrsrp onlyWhich quantities appear per beam. Only meaningful with includeBeamMeasurements.
maxNrofRS-IndexesToReportINTEGER (1..32)4Maximum beams per cell in the report. FR2 reports get large quickly.
includeBeamMeasurementsBOOLEANtrue on FR2Adds rsIndexResults to every cell in the report -- the target needs this to prepare the right beam.
reportAddNeighMeassetup / absentsetupAdds measResultBestNeighCell to the serving-cell results, i.e. the best neighbour on the serving frequency, whether or not it triggered.
reportOnLeaveBOOLEANfalseSend a report when the leaving condition completes. Useful for cancelling a prepared conditional handover.
useWhiteCellListBOOLEANfalseRestrict 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.

⚠️
Common pitfall

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.

Figure 10. 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.
ElementContentsPresent when
measIdThe binding that firedAlways. Resolve it against measIdToAddModList before reading anything else.
measResultServingMOListOne entry per serving cell, each naming its servCellId and carrying that cell's own resultsAlways. The PCell is servCellId 0.
measResultBestNeighCellBest neighbour on the serving frequency, triggered or notreportAddNeighMeas is set up
measResultNeighCellsUp to maxReportCells neighbours, best first, for the frequency of this measId's measObjectEvent and periodical reports where neighbours exist. Absent for A1/A2, which have no neighbour term.
resultsSSB-Cell / resultsCSI-RS-CellConsolidated cell quality per RS typeAccording to rsType and reportQuantityCell
rsIndexResultsPer-beam results, ssb-Index plus quantitiesincludeBeamMeasurements is true
cgi-InfoPLMN, TAC, cell identity read from the neighbour's SIB1reportCGI 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.

🔍
What you see in logs

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.

StepMessage / IEContents
1. ConfigureSIB11 (measIdleConfigSIB) or measIdleConfigDedicated in RRCReleasemeasIdleCarrierListNR / -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. AnnounceRRCSetupComplete / RRCResumeComplete / RRCReconfigurationCompleteidleMeasAvailable -- a bare flag saying results exist
4. RequestUEInformationRequestidleModeMeasurementReq
5. DeliverUEInformationResponsemeasResultIdleNR / 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.

⚠️
Common pitfall

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 MDTLogged MDT
Configured byOrdinary measConfig in RRC_CONNECTEDLoggedMeasurementConfiguration
UE stateRRC_CONNECTED onlyLogs in RRC_IDLE, RRC_INACTIVE and RRC_CONNECTED
DeliveryMeasurementReport, as it happensStored, then fetched later by UEInformationRequest
TriggerEvents or periodical reportingPeriodical (LoggedPeriodicalReportConfig) or event-based (LoggedEventTriggerConfig)
ExtrasLocation information where configured and availableTime stamps, location, and optionally Bluetooth, WLAN and sensor measurements
UseLive optimisation and troubleshootingCoverage mapping without a drive-test vehicle

Table 19. The two MDT flavours. Only the first uses the machinery in §2-14.

🔍
What you see in logs

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

FailureDetected byWhat the UE doesDiagnostic pointer
measId bound to a measObject that was never configuredUE RRC, at reconfigurationNetwork configuration error. Implementations differ: some ignore the measId, some fail the whole reconfigurationIf 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 itNothing -- this is specified behaviourStops evaluating and reporting for those measIds TS 38.331 cl. 5.5.2.2Reporting stops with no error anywhere. Look for a measObjectToRemoveList in the preceding reconfiguration.
Trigger state reset by an unrelated editNothingClears cellsTriggeredList, restarts timeToTrigger, resets numberOfReportsSentA UE that stops reporting a still-triggered cell immediately after any reportConfig or measObject modification (§2.1).
Threshold encoded on the wrong MeasTriggerQuantity branchNobodyConfigures successfully and never (or always) triggersCheck the branch name, not the integer. -101 dBm and -15.5 dB are both '56' (§4.2).
s-Measure above the working RSRP rangeNobodyNever measures neighbours, so no neighbour event can fireA2 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 intendedNobodyExcludes those cells from evaluation and from the reportSpecific PCIs never appear as neighbours anywhere. Expand the range arithmetic: start PCI plus the range value.
useWhiteCellList true with an inadequate whitelistNobodyEvaluates only whitelisted PCIs -- possibly noneAn event that is configured, armed and provably never triggers on a carrier with visible neighbours.
No measurement gap where one is neededNobodyCannot measure the other carrier at allInter-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 burstNobodyMeasures noise; the cell is never detectedThe most common measurement misconfiguration in NR. Neighbour absent from every report despite good coverage.
timeToTrigger longer than the fade or the overlap crossingNobodyTimer starts, resets, no report is sentAn absence of evidence (§12). Correlate UE speed against the overlap geometry.
filterCoefficient too high for the UE's speedNobody, until RLFReports a stale value; the event fires late or not at allRLF with no preceding measurement report. Check quantityConfig first.
absThreshSS-BlocksConsolidation above every beamNobodyFalls back to best-beam-only cell qualityCell qualities systematically higher than expected, and handovers to cells with one usable beam.
maxReportCells too small under dense neighboursNobodyReports the best N only; the true best target may be absent if it triggered laterHandovers to a second-best cell while the scanner shows a better one.
rsType csi-rs with no refFreqCSI-RS in the objectUE RRCCannot perform the measurementAn event on a carrier whose measObject was written for SSB only.
PCI confusion: two cells with the same PCI in rangeThe network, eventuallyReports a PCI that resolves to two different cellsHandover preparation failures to a plausible target. Resolve with reportCGI, bounded by T321.
reportAmount infinity with a short reportIntervalThe uplinkReports forever, every interval, per triggered cellSRB1 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.

💡
Key point

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

🔍
ABOUT THESE 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

[RRC] RRCReconfiguration -- measConfig
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 gate

Listing 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

[RRC/MEAS] A3 entering condition and MeasurementReport
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

[MEAS] timeToTrigger reset, and an A2 report
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 term

Listing 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

[MEAS] s-Measure gating
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

[RRC] Early measurement configuration and retrieval
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

ReleaseChangeWhy it matters when reading measurements
Rel-15The whole framework: measConfig, A1-A6, B1-B2, SSB and CSI-RS measurement, beam consolidation, L3 filtering, s-MeasureConfig, reportCGI, reportSFTDEverything in §2-14 is Rel-15 unless noted otherwise.
Rel-16Conditional handover: condTriggerConfig with condEventA3 and condEventA5A 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-16Early 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-16MDT for NR: LoggedMeasurementConfiguration, logged and immediate MDT, location and Bluetooth/WLAN/sensor informationA second, parallel measurement subsystem with its own configuration message and its own retrieval procedure (§15.2).
Rel-16Cross-link interference: eventI1, cli-Periodical, cli-EventTriggered, SRS-RSRP and CLI-RSSIA reportConfig may measure other UEs, not cells. The report shape is different.
Rel-16Idle-mode measurement relaxation for stationary and low-mobility UEs; MeasObjectUTRA-FDD for legacy fallbackA UE may legitimately measure far less often than the broadcast parameters suggest.
Rel-17RedCap 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-17Terminology cleanup: excludedCellsToAddModList and allowedCellsToAddModList replace the black/white list names, useAllowedCellList replaces useWhiteCellListTwo spellings for the same fields, in circulation simultaneously across tools and vendor documentation.
Rel-17Multiple concurrent measurement gap patterns, pre-configured and network-controlled small gapsInter-frequency measurement becomes cheaper, so more inter-frequency measIds become viable. See 21 Measurement Gaps and SMTC.
Rel-18L1/L2-triggered mobility (LTM): L1 beam and cell measurement reporting driving cell switch below RRCA 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-18Further CHO enhancements including candidate SCG configurations, and continued MDT/AI-data-collection workMore 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

  1. Resolve the measId first. A report says measId 3 and nothing else. Find the measIdToAddModList entry, then the measObject and the reportConfig it names. Until you have done that, you do not know which carrier or which event you are looking at.
  2. Read the threshold's CHOICE branch, not its integer. rsrp 56 is -101 dBm; rsrq 56 is -15.5 dB; sinr 56 is 4.5 dB. Then convert every reported value with the matching ruler (§4.2).
  3. 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 offsetMO or a cellIndividualOffset.
  4. Check s-Measure against 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.
  5. Check the filter before believing any value. filterCoefficient fc9 or higher means the reported number lags reality by seconds. Reconcile against timestamps, not against your expectation of the geometry (§6).
  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).
  7. For a neighbour that never appears, work down the exclusion list: blacklisted PCI-Range, useWhiteCellList, missing gap, SMTC misalignment, s-Measure, wrong ssbFrequency. All six produce exactly the same observable -- nothing.
  8. Distinguish no report from no trigger. An event that entered and reset its timeToTrigger leaves no trace on the network side (§12). If the UE-side log shows timer starts without expiries, timeToTrigger is too long for the fade.
  9. Look upstream for a reset. Reporting that stops for a cell that is still clearly triggered usually follows a reportConfig or measObject modification in an earlier reconfiguration (§2.1).
  10. Count the reports against reportAmount and reportInterval. A single report where you expected a stream means r1; an endless stream means infinity with a short interval, and it is worth checking whether SRB1 is coping.

21. Glossary

TermExpansionMeaning in this document
measConfigMeasurement ConfigurationThe RRC IE carrying all measurement configuration; always a delta against VarMeasConfig.
measIdMeasurement IdentityINTEGER (1..64) binding one measObject to one reportConfig. The only identifier in a report.
measObjectMeasurement ObjectWhat to measure: carrier, reference signals, SMTC, per-cell offsets, exclusion lists.
reportConfigReporting ConfigurationWhen 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-RSRPSSB Reference Signal Received PowerAverage power of the SSS resource elements. The default mobility quantity.
SS-RSRQSSB Reference Signal Received QualityN x RSRP / RSSI. Falls with load even when RSRP is constant.
SS-SINRSSB Signal to Interference plus Noise RatioSSS 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.
HysHysteresisHalf the dead band, in dB. Applied against the event when entering and in its favour when leaving.
TTTtimeToTriggerMinimum continuously-satisfied duration before the state changes. Any failing sample resets it.
s-Measure--SpCell RSRP threshold above which neighbour measurement is not required.
SMTCSSB Measurement Timing ConfigurationThe window in which the UE looks for a carrier's SSBs; see 21 Measurement Gaps and SMTC.
MDTMinimisation of Drive TestsImmediate (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 measId in 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 RRCReconfiguration procedure that carries measConfig, and what a UE does when it cannot comply.
  • 13 RRC Overview and 14 RRC States -- where VarMeasConfig lives 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 MeasurementReport gets an uplink grant when the UE has nothing else to send.
  • 26 UE Capability -- which measurement features, quantities and concurrent measId counts a given UE actually supports.