RRC States (Idle / Inactive / Connected) in 5G NR
The three RRC states, what context each holds, and the transitions between them — with a state diagram.
LTE had two RRC states, and for the traffic LTE was designed around -- web pages, downloads, voice -- two were enough. What changed was not the radio; it was the traffic. A modern handset with thirty background applications generates a near-continuous stream of small, frequent, independent transactions: a keep-alive, a presence update, a push acknowledgement, a few hundred bytes of telemetry. Each one is far too small to justify a connection and far too frequent to leave the connection up between them.
Contents
- 01Why NR Has Three States and Not Two
- 02The State Machine at a Glance
- 03RRC_IDLE, in Detail
- 04RRC_INACTIVE, in Detail
- 05RRC_CONNECTED, in Detail
- 06The Three States Side by Side, and What Each Costs
- 07RRC_IDLE and RRC_CONNECTED: Setup, Release and the RLF Path
- 08Suspend: RRC_CONNECTED to RRC_INACTIVE
- 09Resume: RRC_INACTIVE to RRC_CONNECTED
- 10Context Fetch over Xn When the UE Resumes Elsewhere
- 11The Four Answers to a Resume Request
- 12The RAN Notification Area Update: INACTIVE to INACTIVE
- 13Cell Reselection in RRC_IDLE and RRC_INACTIVE
- 14Rel-17 Small Data Transmission: Sending Without Leaving INACTIVE
- 15Timers, Counters and Parameter Reference
- 16Failure Modes and What Each One Means
- 17Configuration Reference (ASN.1)
- 18Illustrative Message Traces
- 19Release Deltas: Rel-15 to Rel-18
- 20Reading RRC States in Logs: A Checklist
- 21Glossary
- 22References
1. Why NR Has Three States and Not Two
LTE had two RRC states, and for the traffic LTE was designed around -- web pages, downloads, voice -- two were enough. What changed was not the radio; it was the traffic. A modern handset with thirty background applications generates a near-continuous stream of small, frequent, independent transactions: a keep-alive, a presence update, a push acknowledgement, a few hundred bytes of telemetry. Each one is far too small to justify a connection and far too frequent to leave the connection up between them.
Both two-state options are bad. Keeping the UE in RRC_CONNECTED between bursts burns UE battery on PDCCH monitoring and burns gNB resources on a context that is doing nothing. Releasing to RRC_IDLE means the next burst pays for a full RRC establishment, a NAS Service Request through the AMF, AS security re-activation and a bearer reconfiguration -- roughly twenty messages and a couple of hundred milliseconds to move four hundred bytes.
RRC_INACTIVE splits the difference by separating two things LTE conflated: the radio connection and the access-stratum context. In RRC_INACTIVE the radio connection is gone -- no C-RNTI, no dedicated channels, no PDCCH monitoring except at paging occasions, so the power profile is essentially that of RRC_IDLE. But the AS context, including the security keys and the whole bearer configuration, is retained at both the UE and the last serving gNB. Resuming therefore does not re-negotiate anything; it re-attaches to something that never went away.
The decisive property is what the core network sees. From the AMF's point of view a UE in RRC_INACTIVE is still CM-CONNECTED: the N2 association is up, the UE context is intact, and the N3 tunnel still terminates at the anchor gNB. Suspending a UE generates zero NGAP messages, and so does resuming it at the same gNB. That is where the saving actually comes from -- not from the four fewer messages on the air, but from not having to talk to the core at all.
The cost is the complexity this document exists to describe. A context held in two places must be kept consistent, findable and securely verifiable across cell changes the network does not control. Everything from §8 onwards is machinery for that one problem.
2. The State Machine at a Glance
RRC_IDLE and RRC_INACTIVE in either direction, and no arrow into RRC_INACTIVE originates at the UE.| Transition | Who decides | Trigger | Messages | Timer | See |
|---|---|---|---|---|---|
| IDLE -> CONNECTED | UE initiates, network grants | Upper layers request a connection; response to paging; periodic registration update | RRCSetupRequest / RRCSetup / RRCSetupComplete | T300 | §7.1 |
| CONNECTED -> IDLE | Network | Inactivity, load, or an explicit NAS-driven release | RRCRelease without suspendConfig | -- | §7.2 |
| CONNECTED -> IDLE | UE, forced | Unrecovered radio link failure: T310 then T311 both expire | none -- the UE leaves unilaterally | T310, T311 | §7.3 |
| CONNECTED -> INACTIVE | Network only | Inactivity, with an expectation of more traffic soon | RRCRelease with suspendConfig | starts T380 | §8 |
| INACTIVE -> CONNECTED | UE initiates, network grants | Uplink data or signalling; response to RAN paging | RRCResumeRequest[1] / RRCResume / RRCResumeComplete | T319 | §9 |
| INACTIVE -> IDLE | Either | T319 expiry, an RRCRelease answering a resume request, a fallback RRCSetup, or a CN paging message addressed to the 5G-S-TMSI | varies -- see §11 | T319 | §11 |
| INACTIVE -> INACTIVE | UE initiates, network re-suspends | T380 expiry, or reselection to a cell outside the RNA | RRCResumeRequest[1] with resumeCause = rna-Update, answered by RRCRelease with a fresh suspendConfig | T380, T319 | §12 |
Table 1. The seven transitions. Only two of them are UE-initiated state entries, and neither of those is an entry into RRC_INACTIVE -- suspension is always a network decision.
A UE cannot ask to be suspended, and it cannot refuse. There is no suspendPreference in UEAssistanceInformation; the closest thing is releasePreference, which asks to be released and can carry a preferred RRC state as a hint (Rel-16). Whether the gNB honours it is entirely a gNB scheduler decision. If you are looking for why a particular UE never enters RRC_INACTIVE, look at the gNB's inactivity policy and at the UE's capability signalling, not at the UE's behaviour.
3. RRC_IDLE, in Detail
RRC_IDLE is the state with the least state. No AS context exists anywhere in the RAN -- if the UE were to vanish, no gNB would notice, because no gNB is holding anything for it. What survives is entirely at NAS level: assuming the UE completed registration, it is 5GMM-REGISTERED and holds a 5G-GUTI, and the AMF holds a registration context for it. There is no UE-associated N2 logical connection, so the AMF is CM-IDLE for that UE.
3.1 What the UE does
- Monitors paging. The UE computes its paging frame and paging occasion from its 5G-S-TMSI and the
PCCH-Configin SIB1, and monitors PDCCH for theP-RNTIthere. The cycle isdefaultPagingCycle(rf32,rf64,rf128orrf256-- 320 ms to 2.56 s) or the UE-specific DRX cycle if NAS configured one. See the companion 19 Paging. - Reads system information. MIB, SIB1 and whichever other SIBs the UE needs, including on-demand SI requests via
RRCSystemInfoRequeston SRB0 or a MSG1-based request. See the companion 17 System Information. - Measures and reselects. Entirely autonomously, per TS 38.304 (§13). The network has no visibility of which cell an idle UE is camped on, which is exactly why paging must be broadcast across a whole tracking area.
- Performs access barring checks. Unified Access Control gates every access attempt by access category and access identity, using the
uac-BarringInfoin SIB1, withT390per category on failure. - Optionally logs measurements. A
MeasIdleConfigreceived while connected (Rel-16) makes the UE measure and log inRRC_IDLEunderT331, and report the results on its next transition toRRC_CONNECTED. See the companion 20 Measurements and Events.
3.2 What the UE cannot do
It cannot send or receive user data, cannot be reached by any dedicated signalling, and cannot be handed over -- there is nothing to hand over. To do anything it must run the establishment procedure of §7.1, and that is unavoidably expensive because it rebuilds everything from nothing: RRC connection, AS security, bearers.
RRC_IDLE and 5GMM-DEREGISTERED are not the same thing and are not even correlated. A UE can be RRC_IDLE and fully registered (the steady state of a phone in a pocket), or RRC_CONNECTED and deregistered (the whole of initial registration, before Registration Accept). If you are reading a trace and reasoning about "is the UE attached", you are asking a NAS question and the RRC state will not answer it. The companion 13 RRC Overview §13 has the full state cross-product.
4. RRC_INACTIVE, in Detail
This is the state worth understanding properly, because it is the one where a mismatch between the UE's belief and the network's belief is possible -- in RRC_IDLE there is nothing to mismatch, and in RRC_CONNECTED there is an active link to detect it. In RRC_INACTIVE two parties hold a copy of the same context and neither is talking to the other.
4.1 What suspendConfig actually configures
Everything about the state is set up by one IE inside the RRCRelease that puts the UE there. It is small, and every field in it matters:
| Field | Type / range | Need | Typical | What it does and what happens if it is wrong |
|---|---|---|---|---|
fullI-RNTI | BIT STRING (SIZE(40)) | M (mandatory) | vendor-allocated | The 40-bit inactive identity. Implementations conventionally encode the anchor gNB's identity in part of it, so any gNB in the RNA can work out whom to ask for the context (§10). Used when the target cell broadcasts useFullResumeID. |
shortI-RNTI | BIT STRING (SIZE(24)) | M (mandatory) | vendor-allocated | The 24-bit form, used when useFullResumeID is absent so that RRCResumeRequest fits in 48 bits (§9.2). Sixteen bits fewer means sixteen bits less anchor identification, which is why short I-RNTIs are only safe in small RNAs. |
ran-PagingCycle | ENUMERATED {rf32, rf64, rf128, rf256} | M (mandatory) | rf128 | The RAN paging DRX cycle, 320 ms to 2.56 s. Longer saves UE power and delays every downlink-initiated resume by up to one cycle. |
ran-NotificationAreaInfo | CHOICE of cellList or ran-AreaConfigList | Need M | a cell list of 8-32 cells | The area inside which the UE may reselect without telling anyone (§4.4). Absent means keep the previously configured area, which is what a re-suspend during an RNA update relies on. |
t380 | ENUMERATED {min5, min10, min20, min30, min60, min120, min360, min720} | Need R | min60 | The periodic RNA update timer. Need R means absent releases it -- so a UE suspended without t380 never sends a periodic update at all, and the anchor has no protocol-level way to learn the UE is still there. |
nextHopChainingCount | INTEGER (0..7) | M (mandatory) | incremented per suspend | Selects horizontal or vertical key derivation on resume (§9.3). A UE that stored a different NCC from the one the gNB used derives a different K_gNB, and the resume fails with an integrity error the UE cannot report. |
sl-UEIdentityRemote | RNTI-Value | Need M (Rel-17) | absent | Sidelink remote-UE identity for a relay scenario. |
ran-ExtendedPagingCycle | extended cycle values | Need R (Rel-17) | absent | Longer RAN paging cycles for power-sensitive devices, beyond rf256. |
Table 2. SuspendConfig, TS 38.331 clause 6.3.2. Four of the six Rel-15 fields are mandatory, which tells you that the state has no usable default configuration -- it is entirely explicit.
4.2 Two I-RNTIs, and why there are two
The UE is always given both, and which one it uses is decided by the cell it resumes in, not by the anchor. If that cell's SIB1 contains useFullResumeID, the UE sends RRCResumeRequest1 carrying the 40-bit fullI-RNTI; if not, it sends RRCResumeRequest carrying the 24-bit shortI-RNTI TS 38.331 cl. 5.3.13.3. The reason is purely an encoding-length one: RRCResumeRequest must fit the 48-bit CCCH codepoint that MSG3 can carry cheaply, and 40 bits of identity plus 16 bits of MAC-I plus a cause does not fit. RRCResumeRequest1 uses the 64-bit CCCH1 codepoint instead (§9.2).
This is a cell-by-cell decision, so a network can be inconsistent about it. If cell A broadcasts useFullResumeID and neighbouring cell B does not, a UE suspended in A and resuming in B sends a 24-bit identity into a network that allocated identities assuming 40 bits were available for anchor addressing. The symptom is a resume success rate that is fine everywhere except at specific cell borders, with fallback RRCSetup in place of RRCResume. Audit useFullResumeID for consistency across every cell in every RNA.
4.3 The stored UE Inactive AS Context: kept and discarded
On suspension the UE stores what TS 38.331 clause 5.3.8.3 calls the UE Inactive AS Context. What is in it, and what is deliberately left out, decides what a resume has to redo:
| Item | Kept or discarded | Why, and what it is used for on resume |
|---|---|---|
K_gNB and K_RRCint | Kept | K_RRCint computes the resumeMAC-I that proves the UE is who it says (§9.3); K_gNB (or the NH) is the input to the new key derivation. Ciphering keys are not kept -- they are re-derived. |
| ROHC and EHC state | Kept | Header compression context survives, so the first packet after resume does not need a full-header refresh. |
| QoS flow to DRB mapping rules | Kept | SDAP does not need to be reconfigured, so no sdap-Config has to be re-sent. |
| The source cell's C-RNTI | Kept | Used only as an input to the resumeMAC-I computation. It is not reused as an identity -- the UE gets a fresh C-RNTI on resume. |
Source PCI and source cellIdentity | Kept | Also inputs to resumeMAC-I. This is how the network knows which context the UE thinks it has. |
All other RRC configuration -- bearers, PDCP, RLC, measurement configuration, otherConfig | Kept | This is the bulk of it, and the reason RRCResume can be a few dozen octets rather than a few hundred. |
Parameters inside reconfigurationWithSync of the PCell | Discarded | They describe a synchronisation to a cell the UE has since left. Keeping them would be actively wrong. |
Parameters inside reconfigurationWithSync of the NR PSCell, and mrdc-SecondaryCellGroupConfig | Discarded | Dual connectivity does not survive suspension. An NR-DC UE resumes with the master cell group only and must be re-given an SCG. |
| SCell configuration | Discarded in effect | SCells are released at suspension; carrier aggregation has to be rebuilt after resume, which is a real latency cost for a high-throughput UE. |
Table 3. The UE Inactive AS Context, TS 38.331 cl. 5.3.8.3. The pattern is consistent: anything describing a relationship to a specific cell is discarded; anything describing the bearer and security state is kept.
SCells and the SCG being discarded is the hidden cost of RRC_INACTIVE for high-throughput UEs. A UE with four aggregated carriers resumes on the PCell alone and then needs at least one more RRCReconfiguration -- and for NR-DC, SN addition signalling over Xn -- before it reaches full throughput. For bursty small-packet traffic that does not matter. For a UE that suspends between large transfers, it can cost more than it saves.
4.4 The RAN Notification Area
The RNA is the area inside which the anchor gNB believes it can page the UE. It exists because RAN paging is not broadcast network-wide: the anchor sends an XnAP RAN PAGING message to the gNBs covering the RNA and those gNBs page over the air. Outside the RNA, nobody pages, so a UE that reselects out of its RNA must tell the network -- that is the RNA update of §12.
There are two ways to express an RNA, and they scale differently:
| Form | ASN.1 | Granularity | Bounds | When to use it |
|---|---|---|---|---|
| Cell list | cellList -> PLMN-RAN-AreaCellList | Individual cells, by CellIdentity | Up to 32 cells per PLMN entry | Small, well-understood areas. Precise: the anchor pages exactly those cells and no others. |
| RAN area list | ran-AreaConfigList -> PLMN-RAN-AreaConfigList | Tracking areas, optionally narrowed by RAN-AreaCode | Up to 16 RAN areas per PLMN entry; RAN-AreaCode is INTEGER (0..255) | Large areas. Coarser, so RAN paging covers more cells than strictly necessary, but the UE needs no per-cell list. |
Table 4. RAN-NotificationAreaInfo, TS 38.331 clause 6.3.2. A RAN area is signalled in SIB1 per cell (ran-AreaCode inside the tracking area information), so a UE can evaluate membership without a cell list.
The RNA must be a subset of the AMF's registration area, and every cell in it must have Xn connectivity to the anchor. Both constraints are easy to violate in a live network -- a new cell added to a RAN area without Xn to the anchor is inside the RNA as far as the UE is concerned and unreachable as far as the anchor is concerned. The symptom is a UE that never answers RAN paging in one specific area, recovers via CN paging after the anchor gives up, and shows up as a spike in RRCSetupRequest with establishmentCause = mt-Access instead of RRCResumeRequest.
4.5 RAN paging and CN paging
A UE in RRC_INACTIVE monitors for both, at possibly different cycles, and the two mean completely different things:
| RAN paging | CN paging | |
|---|---|---|
| Initiated by | The anchor gNB, when downlink data or signalling arrives for a UE it holds a context for | The AMF, when it has downlink NAS or data for a UE it believes is CM-IDLE |
| Identity in the paging record | fullI-RNTI -- the AS identity | ng-5G-S-TMSI -- the NAS identity |
| Distributed over | XnAP RAN PAGING to the gNBs covering the RNA | NGAP PAGING to every gNB in the registration area |
| Cycle | ran-PagingCycle from suspendConfig | defaultPagingCycle from SIB1, or the UE-specific cycle from NAS |
| UE response | Resume: RRCResumeRequest[1] with resumeCause = mt-Access. The UE stays in the resume path. | Enter idle. The UE moves to RRC_IDLE, informs NAS, and establishes with RRCSetupRequest, establishmentCause = mt-Access |
| What it tells you diagnostically | Normal operation | The AMF thinks the UE is CM-IDLE, i.e. the RAN context is gone. Either the anchor released it, or the UE and network disagree about the state. |
Table 5. RAN versus CN paging for a UE in RRC_INACTIVE. The full paging-occasion arithmetic is in the companion 19 Paging.
Seeing CN paging answered by a UE that your logs say is in RRC_INACTIVE is always informative and never good. It means the AMF moved that UE to CM-IDLE, which only happens after the gNB sent an NGAP UE CONTEXT RELEASE REQUEST -- so the anchor had already given up on the context while the UE still believed it had one. Look for what made the anchor release: its own inactivity timer, a failed RAN paging attempt, or a cell or node restart.
For DRX purposes the UE uses the shortest applicable cycle, so configuring a long ran-PagingCycle does not lengthen the UE's monitoring interval if the cell's defaultPagingCycle is shorter TS 38.304 cl. 7.1. That asymmetry catches people trying to tune inactive-mode power consumption: the RAN cycle can only ever be the binding constraint if it is the shortest of the three.
5. RRC_CONNECTED, in Detail
RRC_CONNECTED is the state where the network is in charge. The UE has a C-RNTI, dedicated logical channels, an active security context and a scheduler that knows about it. Crucially, mobility inverts: the UE no longer decides which cell to use. It measures what it is told to measure, reports when a configured event fires, and moves when it receives an RRCReconfiguration containing reconfigurationWithSync.
- Identity. A 16-bit C-RNTI, scoped to one cell and reassigned at every handover. Possibly also a
CS-RNTIfor configured grants, anMCS-C-RNTI, and group RNTIs (SFI-RNTI,INT-RNTI,TPC-*-RNTI). - Channels. PDCCH in its configured search spaces for its own C-RNTI; DCCH on SRB1/SRB2 (and SRB3/SRB4 if configured); DTCH per DRB; SSB and CSI-RS for measurement and beam management; the RLM reference signals.
- Still monitors paging -- but for
Short Messageonly, carryingsystemInfoModificationandetwsAndCmasIndication. A connected UE is not paged for itself. - DRX. Connected-mode DRX if configured, which is a completely different mechanism from paging DRX:
drx-onDurationTimer,drx-InactivityTimer, short and long cycles. See the companion 11 DRX. - Radio Link Monitoring is active.
N310out-of-sync indications startT310; ifN311in-sync indications do not arrive before it expires, the UE declares Radio Link Failure (§7.3). See the companion 16 RLM and RLF.
The mobility inversion is the single most consequential difference between RRC_CONNECTED and the other two states, and it changes what you can conclude from a log. In RRC_IDLE and RRC_INACTIVE a cell change leaves no trace at the network at all unless it crosses an RNA or tracking area boundary. In RRC_CONNECTED every cell change is a signalled, logged, network-decided event. A UE that appears to teleport between cells was almost certainly not connected while it moved.
6. The Three States Side by Side, and What Each Costs
| RRC_IDLE | RRC_INACTIVE | RRC_CONNECTED | |
|---|---|---|---|
| AS context at the UE | None | UE Inactive AS Context (§4.3) | Full active configuration |
| AS context in the RAN | None anywhere | Held by the anchor gNB -- the last serving gNB, which may not be the cell the UE is camped on | Held by the serving gNB |
| State at the AMF | 5GMM-REGISTERED, CM-IDLE. No UE-associated N2 connection. | 5GMM-CONNECTED with RRC inactive indication. N2 up, N3 terminating at the anchor. | 5GMM-CONNECTED. N2 and N3 both up and in use. |
| AS identity | None | fullI-RNTI (40 bits) and shortI-RNTI (24 bits) | C-RNTI (16 bits, per cell) |
| NAS identity | 5G-GUTI | 5G-GUTI | 5G-GUTI |
| Channels monitored | PDCCH / P-RNTI at CN paging occasions; BCCH | PDCCH / P-RNTI at both RAN and CN paging occasions; BCCH; CG-SDT resources if configured (Rel-17) | PDCCH / C-RNTI in configured search spaces; DCCH; DTCH; SSB, CSI-RS, RLM RS; P-RNTI for Short Messages only |
| Who owns mobility | UE -- cell reselection (§13) | UE -- cell reselection, plus RNA tracking (§12) | Network -- handover, on the basis of UE measurement reports |
| DRX | Paging DRX: defaultPagingCycle or the UE-specific cycle | Shortest of ran-PagingCycle, the UE-specific cycle and defaultPagingCycle | Connected-mode DRX (drx-Config) if configured; otherwise continuous PDCCH monitoring |
| Security | No AS security context | Keys stored on both sides; re-derived on resume (§9.3) | Active integrity and ciphering on SRBs and DRBs |
| Can send user data? | No | Only via Rel-17 SDT (§14) | Yes |
| Can be handed over? | No | No | Yes |
| RLM active? | No | No | Yes |
Table 6. The three states across every dimension that matters when reading a log. The RRC_INACTIVE column is almost always the middle value -- except for the anchor-gNB row, which has no analogue in either neighbour and is where the complexity lives.
6.1 What each state costs to leave
Signalling to get one 400-byte uplink packet onto the air, counting messages on the Uu interface and on NGAP:
from RRC_IDLE (registered, no PDU session active)
Uu: MSG1, MSG2, MSG3, MSG4, RRCSetupComplete,
SecurityModeCommand/Complete,
RRCReconfiguration/Complete = 9 messages
NGAP: INITIAL UE MESSAGE, DL/UL NAS TRANSPORT x2,
INITIAL CONTEXT SETUP REQ/RESP,
PDU SESSION RESOURCE SETUP REQ/RESP = 9+ messages
approximate elapsed time ................... ~150-300 ms
from RRC_INACTIVE, resuming at the anchor gNB
Uu: MSG1, MSG2, MSG3 (RRCResumeRequest1),
MSG4 (CR CE + RRCResume), RRCResumeComplete = 5 messages
NGAP: none = 0 messages
approximate elapsed time ................... ~20-50 ms
from RRC_INACTIVE, resuming at a different gNB
Uu: 5 messages, as above
Xn: RETRIEVE UE CONTEXT REQ/RESP, UE CONTEXT RELEASE = 3
NGAP: PATH SWITCH REQUEST / ACKNOWLEDGE = 2
approximate elapsed time ................... ~35-70 ms
from RRC_INACTIVE with Rel-17 RA-SDT (§14)
Uu: MSG1, MSG2, MSG3 carrying the data itself = 3 messages
no state change at all
already RRC_CONNECTED
Uu: scheduling request, grant, data = 3 messages
approximate elapsed time ................... ~4-10 ms
Timings are order-of-magnitude and dominated by core-network round trips in the first case and by nothing at all in the last.
The five-to-nine ratio on the air understates the benefit. The real saving is the nine-plus NGAP messages and the AMF and SMF processing behind them, which is where most of the two hundred milliseconds and essentially all of the core-network load sit. Multiply by the number of handsets in a busy cell and by the transaction rate of a background notification service, and RRC_INACTIVE is the difference between a core network that copes and one that does not.
7. RRC_IDLE and RRC_CONNECTED: Setup, Release and the RLF Path
7.1 IDLE to CONNECTED: RRCSetup
Triggered by upper layers -- a NAS Service Request, a registration procedure, an answer to CN paging -- the UE runs random access and sends RRCSetupRequest in MSG3 on SRB0. T300 starts when the request is submitted to lower layers and stops on RRCSetup or RRCReject.
| Step | Message | SRB / channel | Carries | Timer |
|---|---|---|---|---|
| 1 | RRCSetupRequest | SRB0 / UL-CCCH, 48 bits | ue-Identity (5G-S-TMSI-Part1 or a 39-bit random value), establishmentCause | starts T300 |
| 2 | RRCSetup | SRB0 / DL-CCCH | radioBearerConfig establishing SRB1, masterCellGroup | stops T300 |
| 2' | RRCReject | SRB0 / DL-CCCH | waitTime 1-16 s | stops T300, starts T302 |
| 3 | RRCSetupComplete | SRB1 / UL-DCCH | selectedPLMN-Identity, dedicatedNAS-Message (the piggybacked NAS PDU), registeredAMF, s-NSSAI-List | -- |
Table 7. RRC connection establishment. Everything after step 3 -- security, capability, bearers -- is separate procedures; see the companion 15 RRC Procedures and 01 Registration Process.
T300 expiry is not a radio link failure. The UE resets MAC, releases the connection, stores a connEstFailReport and returns to RRC_IDLE to reselect. That report is retrievable later via UEInformationRequest and is the intended way to diagnose repeated establishment failures -- see the companion 16 RLM and RLF.
7.2 CONNECTED to IDLE: RRCRelease
A network decision, delivered on SRB1. Without suspendConfig the UE releases everything and enters RRC_IDLE. Three optional IEs make an ordinary release into a mobility instruction, and all three are worth recognising in a log:
| IE | Need | Effect on the UE | Why a network uses it |
|---|---|---|---|
redirectedCarrierInfo | Need N | The UE performs cell selection on the indicated NR or E-UTRA carrier first, instead of following its normal reselection priorities | Steer a UE off a loaded carrier, or off NR entirely to LTE, at the moment of release |
cellReselectionPriorities | Need R | Dedicated per-frequency cellReselectionPriority values that override the broadcast ones, valid until t320 expires | Per-UE traffic steering in idle mode -- e.g. keep IoT devices off the capacity layer |
deprioritisationReq | Need N | The UE deprioritises either the current frequency or all of NR (deprioritisationType = frequency or nr) for deprioritisationTimer (min5 to min30) | Push a UE away after a failed or unwanted access attempt; the nr form is a blunt instrument that moves the UE to LTE for minutes |
suspendConfig | Need R | The UE enters RRC_INACTIVE instead of RRC_IDLE (§8) | The whole subject of this document |
Table 8. RRCRelease-IEs, TS 38.331 clause 6.2.2. The message is only "just a release" when none of these are present.
deprioritisationReq with deprioritisationType = nr removes the UE from NR for up to thirty minutes. It is intended for cases where a specific UE cannot be served, but it is occasionally used as a load valve, and the effect on a KPI dashboard is dramatic and delayed: NR traffic drops for half an hour after the event that caused it, long after anyone would think to correlate. If NR attach rates dip on a schedule you cannot explain, count deprioritisationReq in your release messages.
7.3 CONNECTED to IDLE the hard way: radio link failure
The UE can also leave RRC_CONNECTED unilaterally. N310 consecutive out-of-sync indications from Radio Link Monitoring start T310; if N311 in-sync indications do not arrive before it expires, the UE declares Radio Link Failure. It then starts T311 and attempts re-establishment: select a suitable cell, send RRCReestablishmentRequest with a shortMAC-I, and hope the target can retrieve the context. If T311 expires with no suitable cell, or if T301 expires after the request, the UE goes to RRC_IDLE with release cause RRC connection failure and stores an RLF report.
RLF and re-establishment are the subject of the companion 16 RLM and RLF, which covers T310, T311, T301, shortMAC-I and the RLF report in full. The state-machine point for this document is narrower and worth stating on its own: radio link failure never leads to the inactive state. A UE that loses its link either recovers into RRC_CONNECTED through re-establishment or lands in RRC_IDLE. There is no failure path into RRC_INACTIVE, because suspension requires a working link to deliver the suspendConfig over.
8. Suspend: RRC_CONNECTED to RRC_INACTIVE
The trigger is always a gNB decision, almost always an inactivity timer, and the message is an ordinary RRCRelease on SRB1 with suspendConfig present. What makes it interesting is the sequence of internal actions on the UE side, because they determine what a resume has to do.
RRCRelease is internal to the UE; nothing is acknowledged, and the gNB has no protocol confirmation that the UE actually entered RRC_INACTIVE rather than losing the message and going nowhere.1. Store the UE Inactive AS Context -- keys, ROHC/EHC state, QoS flow mapping, source C-RNTI, source PCI and cellIdentity, and the rest of the configuration (§4.3).
2. Reset MAC and release the default MAC cell group configuration.
3. Re-establish the RLC entity for SRB1 and apply the default SRB1 configuration. This is the step people miss: SRB1 is left in a state from which it can be brought back cheaply, precisely so the resume response can be delivered on it.
4. Suspend SRB1, SRB2 and every DRB. SRB0 stays -- it is the only bearer that survives, and it is what carries the resume request.
5. Indicate PDCP suspend to lower layers for all DRBs.
6. Start the periodic update timer. T380 runs if t380 was configured -- and does not exist at all if it was not.
7. Enter the state and select a cell. The UE is now in RRC_INACTIVE and performs cell selection per TS 38.304.
An RRCRelease carrying suspendConfig is not acknowledged. If it is lost on the air -- which RLC-AM makes unlikely but not impossible, particularly if the UE's link is already failing, which is often why it went inactive -- the gNB believes the UE is in RRC_INACTIVE and holds a context, while the UE is still in RRC_CONNECTED with a connection that will shortly fail RLM. The UE then declares RLF and attempts re-establishment, not resume. Seeing RRCReestablishmentRequest shortly after you sent a suspending RRCRelease is exactly this, and it is not a UE bug.
One consequence of the suspension being silent at NGAP level is that the anchor gNB is now holding resources -- the context, the N3 tunnel endpoint, the I-RNTI allocation -- with no protocol timer forcing it to let go. T380 is a UE timer that makes the UE check in; if t380 was not configured, nothing at all obliges the UE to contact the anchor again. Every implementation therefore runs its own context ageing timer, and how long it is set to is one of the most important undocumented parameters in the system (§16).
9. Resume: RRC_INACTIVE to RRC_CONNECTED
Triggered by uplink data, uplink signalling, or RAN paging. The UE runs random access and sends its resume request in MSG3 on SRB0, starting T319.
9.1 What the UE does before and after sending the request
The subtlety in the resume procedure is that the UE restores SRB1 before it has any response TS 38.331 cl. 5.3.13.3. It re-establishes PDCP and RLC for SRB1, applies the default SRB1 configuration, derives the new keys, and configures lower layers to apply integrity protection and ciphering with them. Only then does it wait. This is why RRCResume and RRCRelease -- both DL-DCCH messages -- can be the response, while RRCSetup and RRCReject -- both DL-CCCH -- are also possible answers on SRB0.
| Response | Channel / SRB | Meaning | Where the UE ends up |
|---|---|---|---|
RRCResume | DL-DCCH / SRB1, protected | Context found and verified; resume the connection | RRC_CONNECTED |
RRCRelease | DL-DCCH / SRB1, protected | Context found and verified, but the network does not want the connection. With suspendConfig: re-suspended. Without: released. | RRC_INACTIVE or RRC_IDLE |
RRCSetup | DL-CCCH / SRB0, unprotected | Context not found, or resumeMAC-I verification failed. Fall back to establishment. | RRC_CONNECTED, but from scratch |
RRCReject | DL-CCCH / SRB0, unprotected | Congestion. waitTime starts T302. | RRC_INACTIVE -- the UE stays where it was |
| nothing | -- | T319 expires | RRC_IDLE, context discarded |
Table 9. The five possible outcomes of a resume request. Two arrive protected on SRB1 and two arrive in the clear on SRB0, and that difference is itself diagnostic: an SRB0 answer means the network could not or would not use the stored context.
9.2 RRCResumeRequest1 bit by bit
Both resume requests are fixed-length by design, for the same reason RRCSetupRequest is: they have to fit a CCCH codepoint that MSG3 can carry without a length field. RRCResumeRequest is 48 bits and uses UL-SCH LCID 52; RRCResumeRequest1 is 64 bits and uses LCID 0 (the CCCH1 channel).
RRCResumeRequest1, all 64 bits. The 40-bit I-RNTI and the 16-bit MAC-I both straddle octet boundaries, which is where hand-decoding a resume request goes wrong. The companion 13 RRC Overview §7 works the same exercise on RRCSetupRequest.Bit budget for the two forms:
RRCResumeRequest1 (UL-CCCH1-Message)
UL-CCCH1-MessageType CHOICE, 2 alternatives ..... 1 bit
c1 CHOICE, 4 alternatives ....................... 2 bits
resumeIdentity I-RNTI-Value, SIZE(40) .......... 40 bits
resumeMAC-I BIT STRING SIZE(16) ................ 16 bits
resumeCause ENUMERATED, 16 members ............. 4 bits
spare BIT STRING SIZE(1) ....................... 1 bit
----------------------------------------------------------
total ....................................... 64 bits = 8 octets
RRCResumeRequest (UL-CCCH-Message)
same, but resumeIdentity is ShortI-RNTI-Value, SIZE(24)
1 + 2 + 24 + 16 + 4 + 1 ..................... 48 bits = 6 octets
Sixteen bits of I-RNTI is the entire difference between the two messages, and it is what makes anchor addressing in a large RNA possible.
9.3 Key handling on resume, and why it looks backwards
This is the part that reliably confuses people, and the confusion is reasonable: the resume request is integrity-protected under the old key while the new key is derived in parallel, and the response arrives protected under the new key. Both things happen before either side has confirmed anything to the other.
1. The UE computes the resume MAC-I with the old integrity key. resumeMAC-I is the 16 least significant bits of a MAC-I computed over VarResumeMAC-Input -- the source PCI, the target cell's CellIdentity and the source C-RNTI -- using the integrity algorithm and key that were in force in the source cell TS 38.331 cl. 5.3.13.3. This proves two things at once: that the UE holds the old key, and that it is resuming into this cell and not replaying a request captured elsewhere.
2. In parallel, the UE derives the new key. It computes a fresh K_gNB from the nextHopChainingCount it stored from suspendConfig, together with the target cell's physical cell identity and downlink ARFCN, exactly as in a handover TS 33.501 cl. 6.11. If the stored NCC differs from the one associated with the current key, the derivation is vertical and uses a fresh Next Hop from the AMF's chain; if it is the same, the derivation is horizontal and chains from the current K_gNB.
3. From that it derives the four AS keys. K_RRCint, K_RRCenc, K_UPint and K_UPenc all come from the new K_gNB, and SRB1 is configured to use them.
4. The network does the same two things independently. It verifies resumeMAC-I with the stored old key -- which requires the anchor, since only the anchor has it -- and derives the same new K_gNB from the NH and NCC.
5. The response arrives protected under the new keys. RRCResume is integrity protected and ciphered with them, and the UE's ability to decode and check it is the implicit confirmation that both sides derived the same key. There is no explicit key confirmation message.
Because the resumeMAC-I check needs the old key and the old key lives at the anchor, a UE resuming at a different gNB cannot be verified locally. The new gNB must forward the resumeMAC-I to the anchor and let the anchor check it -- which is exactly what the RETRIEVE UE CONTEXT REQUEST of §10 is for. The security design and the Xn procedure are the same mechanism seen from two directions.
There is no way for the UE to report a key mismatch. If the two sides derive different keys -- most often because the UE never received the suspendConfig that carried the current NCC, or because a re-suspension updated the NCC and the update was lost -- the UE cannot integrity-check RRCResume, discards it at PDCP, and simply waits. T319 expires and the UE goes to RRC_IDLE. From the gNB side the resume looks like it succeeded up to the point where RRCResumeComplete never arrives. This asymmetry -- gNB thinks success, UE thinks silence -- is the signature of an NCC problem. See the companion 27 AS Security Mode for the key hierarchy.
10. Context Fetch over Xn When the UE Resumes Elsewhere
A UE in RRC_INACTIVE reselects freely inside its RNA, so by the time it resumes it is often camped on a cell belonging to a different gNB than the one holding its context. The whole reason fullI-RNTI is 40 bits is to make this case solvable: implementations encode the anchor's identity into part of the I-RNTI, so the receiving gNB can work out whom to ask.
| # | Message | Interface | Key content | If it fails |
|---|---|---|---|---|
| 1 | RRCResumeRequest1 | Uu | fullI-RNTI, resumeMAC-I, resumeCause | T319 eventually expires -> RRC_IDLE |
| 2 | RETRIEVE UE CONTEXT REQUEST | Xn-C (XnAP) | I-RNTI, resumeMAC-I, the new cell's NR CGI | No Xn to the anchor: the new gNB has no way to get the context and must answer RRCSetup |
| 3 | RETRIEVE UE CONTEXT RESPONSE | Xn-C (XnAP) | The full UE context: security information including the Next Hop and NCC, bearer configuration, PDU session resources, UE capabilities | RETRIEVE UE CONTEXT FAILURE if the anchor has aged the context out or the resumeMAC-I does not verify -> RRCSetup fallback |
| 4-5 | RRCResume / RRCResumeComplete | Uu | The resumed configuration, keyed from the supplied NH | As §9.3 -- a key mismatch produces silence |
| 6-7 | PATH SWITCH REQUEST / ACKNOWLEDGE | NG-C (NGAP) | Move the N3 tunnel endpoint from the anchor to the new gNB | The UE is connected but downlink user data still arrives at the anchor; some implementations forward it over Xn-U in the interim |
| 8 | UE CONTEXT RELEASE | Xn-C (XnAP) | Tells the anchor it may discard the stored context and free the I-RNTI | The anchor keeps a stale context until its own ageing timer fires -- wasteful but not incorrect |
Table 10. Resume with context fetch, TS 38.423 and TS 38.413. The pattern is Xn handover's, reused: retrieve, re-key, switch the path, release. See the companion 23 Xn Handover.
Data forwarding is the part that differs between implementations. Between the retrieval and the path switch there is a window in which downlink data for the UE is still arriving at the anchor. The Xn procedures allow the anchor to forward it to the new gNB over Xn-U, and whether a given deployment does so is a configuration choice with an observable consequence: without forwarding, the first packets after a resume-elsewhere are lost and recovered by TCP, which shows up as a latency spike rather than as an error anywhere.
The absence of an Xn link is the single most common cause of resume failures in a real network, and it is geographically specific. Every cell in an RNA needs Xn to the anchor, and RNAs are configured per-UE while Xn is configured per-node-pair -- so the two drift apart as the network grows. The signature is unmistakable once you look for it: resume attempts in a particular set of cells that are always answered with RRCSetup rather than RRCResume, at a rate that does not vary with load or radio conditions.
11. The Four Answers to a Resume Request
T319. Only the RRCReject path leaves the UE in RRC_INACTIVE with its context intact.| Outcome | What the network did | What the UE does | State after | What it costs |
|---|---|---|---|---|
RRCSetup fallback | Could not find or could not verify the context | Discard the stored UE Inactive AS Context, treat the RRCSetup as an establishment from RRC_IDLE, tell NAS that a Service Request is needed | RRC_CONNECTED, from scratch | Full security re-activation and bearer setup, plus NAS signalling to the AMF. The most expensive outcome. |
RRCRelease without suspendConfig | Found and verified the context, but does not want a connection | Release everything and enter RRC_IDLE | RRC_IDLE | The stored context, deliberately. Common as the answer to an RNA update when the network is shedding contexts. |
RRCRelease with suspendConfig | Found and verified, and wants the UE to stay suspended | Store the new suspendConfig, restart T380, remain in RRC_INACTIVE | RRC_INACTIVE | Nothing but the signalling. This is the normal RNA update answer (§12). |
RRCReject | Congestion or admission control | Stop T319, reset MAC, start T302 with the waitTime, and if the resume was an RNA update set pendingRNA-Update | RRC_INACTIVE -- unchanged | Nothing. The context survives and the UE retries after T302. |
| No response | Possibly nothing -- the request may never have arrived | T319 expires: go to RRC_IDLE with release cause RRC resume failure, discard the stored context | RRC_IDLE | The stored context, and the whole resume attempt. |
Table 11. Every answer to a resume request and its cost. Note that RRCReject is the only one that preserves the stored context, which makes it the cheapest rejection available to a loaded gNB.
RRCReject in response to a resume leaves the UE in RRC_INACTIVE TS 38.331 cl. 5.3.13.6 -- it does not send the UE to RRC_IDLE. This is easy to get wrong because RRCReject in response to an RRCSetupRequest does leave the UE in RRC_IDLE, but only because it was already there. For a loaded cell this makes RRCReject the right rejection to use against resumes: the context is preserved, so the retry after T302 is still cheap. Rejecting with RRCRelease instead throws away the context and guarantees the retry is expensive.
There is one further INACTIVE-to-IDLE path that does not involve a resume request at all: a Paging message whose paging record contains the UE's ng-5G-S-TMSI rather than its fullI-RNTI. That is CN paging, and it means the AMF believes the UE is CM-IDLE. The UE enters RRC_IDLE, informs upper layers, and establishes with RRCSetupRequest (§4.5).
12. The RAN Notification Area Update: INACTIVE to INACTIVE
An RNA update is a full resume followed by an immediate re-suspend, and it exists so the anchor knows the UE is still reachable and still inside a set of cells the anchor can page. There are two triggers:
- Periodic, on
T380expiry. The UE has not moved out of the RNA but the anchor has not heard from it fort380, so it checks in. - Mobility, on reselection to a cell outside the configured RNA. The UE evaluates membership from the cell's
cellIdentity(for acellListRNA) or from the tracking area code andran-AreaCodebroadcast in SIB1 (for aran-AreaConfigListRNA).
Both use resumeCause = rna-Update, and both are answered by an RRCRelease carrying a fresh suspendConfig -- which restarts T380 and, in the mobility case, carries a new RNA appropriate to where the UE now is. If the anchor changed (the update was received by a different gNB, which fetched the context over Xn), the new gNB becomes the anchor and issues new I-RNTIs.
T380 and the two update triggers over two hours. The important behaviour is that a mobility update restarts T380, so the two triggers are not independent -- movement suppresses the periodic timer entirely.Signalling cost of periodic RNA updates for one stationary UE left in RRC_INACTIVE for 12 hours:
with t380 = min60
updates = 12 x 60 / 60 = 12
each update = MSG1, MSG2, MSG3, MSG4, RRCRelease = 5 Uu messages
total = 12 x 5 = 60 Uu messages purely to say "still here"
with t380 = min720 (the maximum)
updates = 12 x 60 / 720 = 1
total = 5 Uu messages
with t380 absent (Need R -- the timer is released)
updates = 0. The anchor never hears from the UE again unless
the UE has data or leaves the RNA.
Multiply the first case by ten thousand suspended UEs in a busy cluster and periodic RNA updates become a measurable fraction of RACH load -- roughly 600 000 messages over the same 12 hours, all of them carrying no information beyond the UE's continued existence.
The trade is reachability confidence against signalling. A short t380 means the anchor learns quickly when a UE has gone away, so it can release the context and free the N3 tunnel. A long t380 means the anchor may hold a context for a UE that was switched off eleven hours ago, and will discover this only when a RAN paging attempt goes unanswered.
An RNA update at a different gNB is indistinguishable, on the air, from an ordinary resume: same message, same resumeCause field width, same random access. The only thing that distinguishes them is the resumeCause value (rna-Update) and the answer (RRCRelease with suspendConfig rather than RRCResume). When counting resume attempts for a KPI, separate rna-Update from the data-driven causes -- mixing them makes resume success rate look worse than it is, because an RNA update that ends in RRCRelease is a success that never reaches RRC_CONNECTED.
13. Cell Reselection in RRC_IDLE and RRC_INACTIVE
In both non-connected states the UE chooses its own cell, using the rules in TS 38.304. The network's only influence is the parameters it broadcasts, plus per-UE cellReselectionPriorities handed out in an RRCRelease (§7.2). Understanding the shape of the decision matters because it explains cell changes that no network log records.
13.1 The S-criteria: is a cell usable at all?
Before ranking anything, a cell must be suitable. That is the S-criteria, evaluated on the measured RSRP and RSRQ:
Srxlev = Q_rxlevmeas - (q-RxLevMin + q-RxLevMinOffset)
- P_compensation - Qoffset_temp
Squal = Q_qualmeas - (q-QualMin + q-QualMinOffset)
- Qoffset_temp
A cell is suitable when Srxlev > 0 AND Squal > 0
Q_rxlevmeas measured RSRP of the cell
Q_qualmeas measured RSRQ of the cell
q-RxLevMin minimum required RSRP, broadcast in SIB1/SIB2/SIB4
q-QualMin minimum required RSRQ
q-RxLevMinOffset offset applied only when evaluating a higher-priority
PLMN while camped elsewhere
P_compensation max(p-Max - P_PowerClass, 0) -- an uplink-limited
correction, so a cell can be inaudible in the uplink
despite a strong downlink
Qoffset_temp a temporary penalty applied after a failed accessSrxlev with q-RxLevMin = -110 dBm, measured RSRP = -102 dBm, p-Max = 23 dBm, UE power class 3 (23 dBm):
P_compensation = max(23 - 23, 0) = 0 dB
Srxlev = -102 - (-110 + 0) - 0 - 0 = +8 dB -> suitable
Now the same cell with p-Max = 26 dBm, which an operator might set to allow higher-power devices:
P_compensation = max(26 - 23, 0) = 3 dB
Srxlev = -102 - (-110) - 3 = +5 dB -> still suitable, but 3 dB
of margin has quietly disappeared for every power-class-3 UE
At RSRP -108 dBm the same UE would compute Srxlev = -1 dB and consider the cell unsuitable -- while a power-class-2 UE (26 dBm) at the same spot computes 0 dB - 0 = +2 dB and camps happily. Two UEs, same place, different verdicts.
13.2 The reselection decision
Three cases, evaluated in this order TS 38.304 cl. 5.2.4.5:
| Case | Condition | Held for | Effect | What it is for |
|---|---|---|---|---|
| Higher priority frequency | Srxlev_n > threshX-HighP (and Squal_n > threshX-HighQ if signalled) | t-ReselectionNR (or the inter-RAT equivalent) | Reselect to the best suitable cell on that frequency, regardless of how good the serving cell is | Absolute steering. This is how a network keeps UEs on a preferred layer. |
| Equal priority frequency | R_n > R_s, where R_s = Q_meas,s + q-Hyst - Qoffset_temp and R_n = Q_meas,n - q-OffsetCell - Qoffset_temp | t-ReselectionNR | Reselect to the best-ranked cell | Ordinary intra- and inter-frequency mobility. q-Hyst is what stops ping-ponging. |
| Lower priority frequency | Srxlev_s < threshServing-LowP and Srxlev_n > threshX-LowP | t-ReselectionNR | Reselect down | Coverage fallback -- only when the serving cell is genuinely poor. |
Table 12. The three reselection cases. Note the asymmetry: going up in priority needs only the target to be good enough, while going down needs the serving cell to be bad as well.
13.3 What the UE can skip, and mobility state scaling
Measuring costs power, so the UE is allowed to skip measurements when the serving cell is comfortably good. If Srxlev_s > s-IntraSearchP and Squal_s > s-IntraSearchQ, intra-frequency measurements may be skipped; s-NonIntraSearchP and s-NonIntraSearchQ do the same for inter-frequency and inter-RAT measurements of equal or lower priority -- higher-priority frequencies must always be measured, which is the mechanism that makes priority steering reliable.
The UE also scales t-ReselectionNR by its own estimated mobility state. It counts reselections in a sliding window (t-CrMax): more than n-CellChangeMedium puts it in medium-mobility state, more than n-CellChangeHigh in high-mobility state, and each applies a scaling factor from t-ReselectionNR-SF -- typically shortening the timer so a fast-moving UE reselects sooner.
None of this exists in RRC_CONNECTED. There the UE measures what measConfig tells it to, evaluates the A1-A6 and B1-B2 events, and reports; the network decides. The parameter names are different, the hysteresis mechanisms are different, and the timers are different. Comparing an idle-mode reselection threshold with a connected-mode event threshold is meaningless -- see the companion 20 Measurements and Events. The one shared consequence is that a poorly tuned reselection configuration produces UEs that resume on the wrong cell, which is then blamed on the resume procedure.
For a UE in RRC_INACTIVE there is one extra step after every reselection: check whether the new cell is inside the RNA, and if not, start an RNA update (§12). That check is the only thing that distinguishes inactive-mode reselection from idle-mode reselection; everything else in this section applies identically to both.
14. Rel-17 Small Data Transmission: Sending Without Leaving INACTIVE
RRC_INACTIVE made resuming cheap. Rel-17 asked the obvious follow-up question: for a payload of a few hundred bytes, why transition at all? Small Data Transmission lets a UE in RRC_INACTIVE send user data -- and receive a response -- without ever entering RRC_CONNECTED. Two flavours exist:
| RA-SDT | CG-SDT | |
|---|---|---|
| Full name | Random-access-based Small Data Transmission | Configured-grant-based Small Data Transmission |
| How the data is sent | Multiplexed with the resume request in MSG3 (4-step) or in the MSGA payload (2-step) | On a pre-allocated PUSCH resource configured before suspension, with no random access at all |
| Prerequisite | None beyond configuration | A valid timing advance -- the UE must still be inside the timing window of the cell it was configured in, which in practice means it has not moved |
| Messages on the air | MSG1, MSG2, MSG3-with-data (3) | One PUSCH transmission (1) |
| Where it is configured | sdt-Config in suspendConfig, plus common parameters broadcast in SIB1 | As RA-SDT, plus a configured-grant configuration tied to the specific cell |
Table 13. The two SDT variants. CG-SDT is dramatically cheaper and dramatically more fragile -- losing timing alignment or changing cell invalidates it.
The UE may use SDT only when several conditions all hold:
- The data volume is below the configured threshold. A data-volume threshold broadcast by the cell bounds what counts as "small"; a larger buffer forces an ordinary resume.
- The measured RSRP is above the configured threshold. SDT is transmitted before any closed-loop power control or link adaptation, so it is only allowed in good coverage -- the same reasoning that gates 2-step random access on
msgA-RSRP-Threshold, in the companion 03 Random Access. - Every radio bearer with pending data is SDT-enabled. The network marks specific bearers as usable for SDT. If any bearer with buffered data is not on that list, the UE must resume normally -- so a single background bearer can disable SDT for the whole UE.
- For CG-SDT, the timing advance must still be valid. Otherwise the UE falls back to RA-SDT or to an ordinary resume.
The network's response decides what happens next, and this is the part that changes how you read logs. It may send a downlink response and leave the UE in RRC_INACTIVE; it may keep the SDT procedure open for further transmissions; it may send RRCRelease to end it; or it may send RRCResume and pull the UE into RRC_CONNECTED after all -- for instance because more data arrived than the UE declared. A Rel-17 SDT timer bounds the procedure in the same way T319 bounds a resume.
A completed random access procedure no longer implies a state transition. Before Rel-17, a UE that ran RACH from RRC_INACTIVE and got a MSG4 was on its way to RRC_CONNECTED. With SDT it may send data, get an acknowledgement and remain suspended throughout, with no RRCResumeComplete anywhere. Any log analysis or KPI that infers "resume succeeded" from "RACH succeeded from INACTIVE" will silently miscount as soon as SDT is enabled.
15. Timers, Counters and Parameter Reference
| Parameter | Configured in | Values | Typical | Effect, and what a wrong value looks like |
|---|---|---|---|---|
T300 | UE-TimersAndConstants in SIB1 | ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000 | ms1000 | Bounds establishment. Too short and marginal-coverage UEs give up before the network answers; too long and a UE waits a second before reselecting to a cell that would have worked. |
T302 | RRCReject waitTime | 1..16 seconds | 8 s | Access barring after a reject. Applies to the access category, not the whole UE. |
T319 | UE-TimersAndConstants in SIB1 | same set as T300 | ms1000 | Bounds resume. On expiry the UE goes to RRC_IDLE and discards the stored context -- so a short T319 in a network with slow Xn context fetch destroys contexts that would have resumed fine. |
T320 | cellReselectionPriorities in RRCRelease, or SIB | min5, min10, min20, min30, min60, min120, min180 | min30 | Validity of dedicated reselection priorities. On expiry the UE reverts to the broadcast priorities, which can look like spontaneous traffic re-steering. |
T380 | t380 in SuspendConfig | min5, min10, min20, min30, min60, min120, min360, min720 | min60 | Periodic RNA update. Short means signalling load (§12); long or absent means stale contexts at the anchor. |
T310 / T311 / T301 | UE-TimersAndConstants in SIB1 | see the companion 16 RLM and RLF | -- | The RLF and re-establishment chain that takes a UE out of RRC_CONNECTED the hard way (§7.3). |
ran-PagingCycle | SuspendConfig | rf32, rf64, rf128, rf256 | rf128 | RAN paging DRX, 320 ms to 2.56 s. Only binding if it is shorter than the CN paging cycle (§4.5). |
defaultPagingCycle | PCCH-Config in SIB1 | rf32, rf64, rf128, rf256 | rf128 | CN paging DRX for the cell. See the companion 19 Paging. |
nextHopChainingCount | SuspendConfig | INTEGER (0..7) | incremented per suspend | Selects horizontal or vertical key derivation on resume. A mismatch produces silent resume failure (§9.3). |
useFullResumeID | SIB1 | present / absent | present | Selects RRCResumeRequest1 (40-bit I-RNTI) over RRCResumeRequest (24-bit). Must be consistent across every cell in an RNA (§4.2). |
q-RxLevMin | SIB1, SIB2, SIB4 per frequency | -70 .. -22 in units of 2 dBm | -110 dBm | The floor of the S-criteria (§13.1). Too high and the UE declares usable cells unsuitable and camps further away. |
q-Hyst | SIB2 | dB0 .. dB24 | dB2 or dB4 | Ranking hysteresis for the serving cell. Too small and the UE ping-pongs between two cells; too large and it clings to a fading cell. |
t-ReselectionNR | SIB2 / SIB4 | 0 .. 7 seconds | 1 or 2 s | How long a reselection condition must hold. Scaled by the mobility state (§13.3). |
cellReselectionPriority | SIB2 / SIB4 per frequency, or dedicated in RRCRelease | INTEGER (0..7) | varies per layer | Absolute frequency priority. 0 is the lowest; a frequency with no priority signalled is not considered for reselection at all. |
threshX-HighP / threshX-LowP | SIB2 / SIB4 per frequency | ReselectionThreshold, 0..31 in 2 dB steps | varies | Entry thresholds for higher- and lower-priority reselection (§13.2). |
s-IntraSearchP / s-NonIntraSearchP | SIB2 | ReselectionThreshold, 0..31 in 2 dB steps | varies | Above these the UE may stop measuring. Set too high and the UE measures constantly, costing idle-mode battery for nothing. |
Table 14. Parameters governing the three states and the transitions between them. Timer enumerations are from TS 38.331 clause 7.1 and 6.3.2; reselection parameters are from TS 38.331 SIB2 / SIB4 and are evaluated per TS 38.304.
16. Failure Modes and What Each One Means
| Failure | Detected by | What the UE does | Observable as | Diagnostic pointer |
|---|---|---|---|---|
T319 expiry -- no answer to the resume request | UE RRC | Go to RRC_IDLE with release cause RRC resume failure, discard the stored context | A resume attempt followed by an RRCSetupRequest about a second later | Either the request never arrived (coverage, RACH), or the network took too long -- most often an Xn context fetch that did not complete inside T319. Check T319 against your Xn round-trip time. |
resumeMAC-I verification fails at the anchor | Anchor gNB | Nothing -- the UE is answered with RRCSetup and falls back | RRCSetup in response to RRCResumeRequest | Key desynchronisation, an I-RNTI collision, or a replayed request. Check whether the source PCI and cellIdentity the UE used match what the anchor stored. |
| I-RNTI does not resolve -- the anchor already discarded the context | Anchor gNB | Answered with RRCSetup; discards its own stored context | RRCSetup fallback, correlated with long inactive durations | The anchor's own context ageing timer is shorter than the UE's expectation. Compare it against t380: an ageing timer shorter than t380 guarantees this. |
| No Xn between the resuming cell's gNB and the anchor | The new gNB | Answered with RRCSetup | RRCSetup fallback that is geographically clustered and insensitive to load or radio quality | The highest-value check in this table. Cross-check every cell in every RNA against the Xn topology (§10). |
useFullResumeID inconsistent across the RNA | Neither side, explicitly | Sends RRCResumeRequest with a 24-bit identity where the network expected 40 bits | Fallback RRCSetup at specific cell borders only | Audit useFullResumeID per cell. Symptom and cause look nothing alike (§4.2). |
nextHopChainingCount mismatch | Nobody, explicitly | Cannot integrity-check RRCResume; discards it at PDCP and waits for T319 | gNB sees a successful RRCResume with no RRCResumeComplete; UE sees silence | The signature asymmetry of a key problem. Usually a lost suspendConfig update (§9.3). |
Suspending RRCRelease lost on the air | UE RLM, eventually | Stays in RRC_CONNECTED, then declares RLF and attempts re-establishment | RRCReestablishmentRequest shortly after a suspend the gNB believes succeeded | Not a UE bug (§8). Look at the radio quality at the moment of suspension -- a link bad enough to lose the release is a link bad enough to have triggered the inactivity in the first place. |
| RAN paging unanswered because a cell in the RNA has no Xn to the anchor | Anchor gNB, by timeout | Nothing -- the UE never heard the page | The anchor gives up, the AMF eventually CN-pages, and the UE arrives as RRCSetupRequest with establishmentCause = mt-Access | Same root cause as the Xn row, seen from the downlink direction (§4.4). |
t380 absent from suspendConfig | Nobody | Never sends a periodic RNA update | Anchor gNBs accumulating contexts for UEs that have gone away | Check whether t380 is actually being sent. It is Need R, so omitting it releases the timer rather than applying a default. |
CN paging received while in RRC_INACTIVE | UE RRC | Enter RRC_IDLE, inform NAS, establish with RRCSetupRequest | A UE your logs say is suspended answering a CN page | The AMF has moved the UE to CM-IDLE, so the gNB must have sent an NGAP UE CONTEXT RELEASE REQUEST. Find out why (§4.5). |
| SCells and the SCG discarded at suspension | Neither -- by design | Resumes on the PCell alone | Throughput after a resume that ramps over several hundred milliseconds | Expected behaviour, not a fault. If it matters for the traffic, the UE should not be suspended (§4.3). |
Table 15. State-transition failure modes. Four of the eleven manifest as an RRCSetup in response to a resume request, and telling them apart is most of the diagnostic work.
A fallback setup in response to a resume request is the single most informative event in this whole document. An RRCSetup answering an RRCResumeRequest means the context was unusable, and there are exactly four reasons: the anchor threw it away, the anchor was unreachable, the MAC-I did not verify, or the identity was the wrong width. Each has a different fix and all four look identical on the air. Instrument the anchor's decision, not the UE's experience.
17. Configuration Reference (ASN.1)
17.1 RRCRelease and SuspendConfig
RRCRelease-IEs ::= SEQUENCE {
redirectedCarrierInfo RedirectedCarrierInfo OPTIONAL, -- Need N
cellReselectionPriorities CellReselectionPriorities OPTIONAL, -- Need R
suspendConfig SuspendConfig OPTIONAL, -- Need R
deprioritisationReq SEQUENCE {
deprioritisationType ENUMERATED {frequency, nr},
deprioritisationTimer ENUMERATED {min5, min10, min15, min30}
} OPTIONAL, -- Need N
lateNonCriticalExtension OCTET STRING OPTIONAL,
nonCriticalExtension RRCRelease-v1540-IEs OPTIONAL
}
SuspendConfig ::= SEQUENCE {
fullI-RNTI I-RNTI-Value, -- BIT STRING (SIZE(40))
shortI-RNTI ShortI-RNTI-Value, -- BIT STRING (SIZE(24))
ran-PagingCycle PagingCycle, -- rf32|rf64|rf128|rf256
ran-NotificationAreaInfo RAN-NotificationAreaInfo OPTIONAL, -- Need M
t380 PeriodicRNAU-TimerValue OPTIONAL, -- Need R
nextHopChainingCount NextHopChainingCount, -- INTEGER (0..7)
...,
[[
sl-UEIdentityRemote-r17 RNTI-Value OPTIONAL, -- Need M
srs-PosRRC-Inactive-r17 SetupRelease {SRS-PosRRC-Inactive-r17}
OPTIONAL, -- Need M
ran-ExtendedPagingCycle-r17 ExtendedPagingCycle-r17
OPTIONAL -- Need R
]]
}
PeriodicRNAU-TimerValue ::= ENUMERATED {
min5, min10, min20, min30, min60, min120, min360, min720 }
RAN-NotificationAreaInfo ::= CHOICE {
cellList PLMN-RAN-AreaCellList,
ran-AreaConfigList PLMN-RAN-AreaConfigList,
...
}
PLMN-RAN-AreaCell ::= SEQUENCE {
plmn-Identity PLMN-Identity OPTIONAL,
ran-AreaCells SEQUENCE (SIZE (1..32)) OF CellIdentity
}
RAN-AreaConfig ::= SEQUENCE {
trackingAreaCode TrackingAreaCode,
ran-AreaCodeList SEQUENCE (SIZE (1..32)) OF RAN-AreaCode OPTIONAL
} -- RAN-AreaCode 0..255Listing 1. Abridged from TS 38.331 clause 6.2.2 and 6.3.2. ... marks extension markers and omitted members. The [[ ]] block is a Rel-17 extension addition group.
17.2 The resume requests and what the MAC-I is computed over
RRCResumeRequest ::= SEQUENCE {
resumeIdentity ShortI-RNTI-Value, -- BIT STRING (SIZE(24))
resumeMAC-I BIT STRING (SIZE (16)),
resumeCause ResumeCause,
spare BIT STRING (SIZE (1))
} -- 48 bits total
RRCResumeRequest1 ::= SEQUENCE {
resumeIdentity I-RNTI-Value, -- BIT STRING (SIZE(40))
resumeMAC-I BIT STRING (SIZE (16)),
resumeCause ResumeCause,
spare BIT STRING (SIZE (1))
} -- 64 bits total
ResumeCause ::= ENUMERATED {
emergency, highPriorityAccess, mt-Access, mo-Signalling,
mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, rna-Update,
mps-PriorityAccess, mcs-PriorityAccess,
spare1, spare2, spare3, spare4, spare5 }
-- The input the 16-bit resumeMAC-I is computed over, using the
-- K_RRCint and integrity algorithm in force in the SOURCE cell:
VarResumeMAC-Input ::= SEQUENCE {
sourcePhysCellId PhysCellId, -- INTEGER (0..1007)
targetCellIdentity CellIdentity, -- BIT STRING (SIZE (36))
source-c-RNTI RNTI-Value -- INTEGER (0..65535)
}
RRCResume-IEs ::= SEQUENCE {
radioBearerConfig RadioBearerConfig OPTIONAL, -- Need M
masterCellGroup OCTET STRING (CONTAINING CellGroupConfig)
OPTIONAL, -- Need M
measConfig MeasConfig OPTIONAL, -- Need M
fullConfig ENUMERATED {true} OPTIONAL, -- Need N
lateNonCriticalExtension OCTET STRING OPTIONAL,
nonCriticalExtension RRCResume-v1560-IEs OPTIONAL
}Listing 2. Abridged from TS 38.331 clause 6.2.2 and 6.3.2. Note that RRCResume can carry a whole radioBearerConfig and masterCellGroup -- resume is not obliged to restore the stored configuration unchanged, and fullConfig forces the UE to discard it entirely and start from the message.
VarResumeMAC-Input includes the target cell's identity. That is the anti-replay mechanism: a resumeMAC-I computed for cell A does not verify in cell B, so an attacker cannot capture a resume request and replay it elsewhere. It also means the UE must know the target cell's 36-bit CellIdentity before it can build the request -- so it must have read SIB1 in the new cell. A UE that resumes without a valid SIB1 cannot compute a verifiable MAC-I at all.
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.
18.1 The suspension
14:22:08.114 [gNB] UE 0x4601: inactivity timer expired (10 s)
policy .................. suspend (bursty traffic profile)
allocate fullI-RNTI ..... 0x0A1234C05F
allocate shortI-RNTI .... 0x1234C0
NCC to signal ........... 3
14:22:08.116 [RRC-DL] DL-DCCH-Message on SRB1, LCID 1
c1 = rrcRelease
rrc-TransactionIdentifier ....... 2
criticalExtensions = rrcRelease
suspendConfig
fullI-RNTI ................. 0x0A1234C05F
shortI-RNTI ................ 0x1234C0
ran-PagingCycle ............ rf128 -- 1.28 s
ran-NotificationAreaInfo
cellList
PLMN-RAN-AreaCell[0]
ran-AreaCells ........ 12 CellIdentity values
t380 ....................... min60
nextHopChainingCount ....... 3
14:22:08.131 [UE RRC] RRCRelease with suspendConfig -> suspend
store UE Inactive AS Context:
K_gNB, K_RRCint ......... retained
ROHC / EHC state ........ retained
QoS flow -> DRB map ..... retained (1 flow -> DRB 1)
source C-RNTI ........... 0x4601
source PCI .............. 41
source cellIdentity ..... (36 bits)
reconfigurationWithSync . DISCARDED
SCell configuration ..... DISCARDED (2 SCells released)
reset MAC; re-establish RLC for SRB1; suspend SRB1/SRB2/DRB1
start T380 (min60); enter RRC_INACTIVE; run cell selection
-- nothing on NGAP. The AMF is unchanged: 5GMM-CONNECTED with RRC
-- inactive indication, N2 up, N3 still terminating at this gNB.Listing 3. A suspension end to end. The two DISCARDED lines are the ones worth noting: an NR-DC or carrier-aggregated UE loses that configuration and has to be given it again after resume.
18.2 A successful resume at the anchor
14:26:41.902 [UE RRC] uplink data on DRB 1, 412 bytes
volume above sdt threshold -> ordinary resume
SIB1 of this cell contains useFullResumeID
-> use RRCResumeRequest1 with the 40-bit fullI-RNTI
14:26:41.904 [MAC-UL] RA preamble 17, RA-RNTI 1204
14:26:41.911 [MAC-DL] RAR: TA 189, UL grant, TC-RNTI 0x51A3
14:26:41.916 [MAC-UL] MSG3 on PUSCH, TC-RNTI 0x51A3, 10 octets
subheader LCID 0 -- CCCH1, 64-bit form
SDU ..................... 0A 24 68 98 0B F9 C4 E1
UL-CCCH1-Message
c1 = rrcResumeRequest1
resumeIdentity ...... 0x0A1234C05F
resumeMAC-I ......... 0x9C4E
resumeCause ......... mo-Data
spare ............... 0
start T319 (ms1000)
14:26:41.917 [UE RRC] re-establish PDCP and RLC for SRB1
derive K_gNB* from stored NH, NCC 3, target PCI 41
derive K_RRCint / K_RRCenc; apply to SRB1
14:26:41.919 [gNB RRC] I-RNTI 0x0A1234C05F -> local context (anchor = self)
recompute resumeMAC-I over VarResumeMAC-Input:
sourcePhysCellId ...... 41
targetCellIdentity .... (this cell, 36 bits)
source-c-RNTI ......... 0x4601
computed 0x9C4E, received 0x9C4E -- MATCH
derive the same K_gNB* from NH with NCC 3
14:26:41.926 [MAC-DL] PDSCH to TC-RNTI 0x51A3
LCID 62 UE Contention Resolution Identity (echoes MSG3)
LCID 1 SRB1: DL-DCCH-Message, PDCP SN 0, MAC-I non-zero
c1 = rrcResume
rrc-TransactionIdentifier ... 0
criticalExtensions = rrcResume
masterCellGroup ........... (OCTET STRING, 96 octets)
-- TC-RNTI 0x51A3 promoted to C-RNTI
14:26:41.927 [UE RRC] stop T319; restore the stored context;
resume SRB1, SRB2 and DRB 1;
discard the UE Inactive AS Context
14:26:41.934 [RRC-UL] rrcResumeComplete txn 0 on SRB1
14:26:41.941 [MAC-UL] DRB 1: 412 bytes on DTCH
-- 37 ms from data arrival to data on the air. No NGAP, no Xn.Listing 4. A resume at the anchor. Note the MAC-I on the very first downlink SRB1 PDU: unlike the setup case, security is already active on the first protected message, under keys derived independently by both sides.
18.3 A resume that falls back to setup
16:55:02.338 [RRC-UL] rrcResumeRequest1
resumeIdentity .......... 0x0A1234C05F
resumeMAC-I ............. 0x71B0
resumeCause ............. mo-Data
start T319 (ms1000)
16:55:02.341 [gNB RRC] fullI-RNTI decodes to anchor gNB-ID 0x0A12
which is not this node -> retrieve over Xn
16:55:02.342 [XnAP-TX] RETRIEVE UE CONTEXT REQUEST
I-RNTI .................. 0x0A1234C05F
resumeMAC-I ............. 0x71B0
new cell NR CGI ......... (this cell)
16:55:02.389 [XnAP-RX] RETRIEVE UE CONTEXT FAILURE
cause ................... unknown-or-already-allocated-
gNB-CU-UE-F1AP-ID / context not
available
-- the anchor aged this context out 4 minutes ago;
-- its local inactivity ageing timer is 30 min, t380 was 60
16:55:02.392 [RRC-DL] DL-CCCH-Message on SRB0
c1 = rrcSetup
rrc-TransactionIdentifier ... 0
radioBearerConfig -> srb-ToAddModList -> srb-Identity 1
masterCellGroup ............. (OCTET STRING, 208 octets)
-- note: SRB0, in the clear. That alone tells the UE the
-- stored context was not usable.
16:55:02.395 [UE RRC] RRCSetup received while T319 running
-> stop T319
-> discard the stored UE Inactive AS Context
-> inform upper layers: RRC connection was NOT resumed;
a NAS Service Request is required
-> apply the RRCSetup as an establishment from RRC_IDLE
16:55:02.408 [RRC-UL] rrcSetupComplete on SRB1
dedicatedNAS-Message ........ (NAS Service Request)
-- SecurityModeCommand, UECapabilityEnquiry and a full
-- RRCReconfiguration all follow. Cost: ~9 more messages.Listing 5. The fallback path, with its root cause visible: the anchor's own context ageing timer was shorter than the t380 it signalled, so the UE was checking in on a schedule the anchor had already stopped waiting for.
18.4 An RNA update, and a CN page received while inactive
15:22:08.118 [UE RRC] T380 expired (min60 since 14:22:08)
-> initiate RAN Notification Area Update
15:22:08.140 [RRC-UL] rrcResumeRequest1
resumeIdentity .......... 0x0A1234C05F
resumeMAC-I ............. 0x2D77
resumeCause ............. rna-Update -- not mo-Data
start T319
15:22:08.166 [RRC-DL] DL-DCCH-Message on SRB1
c1 = rrcRelease
suspendConfig
fullI-RNTI ............ 0x0A1234C05F -- unchanged
shortI-RNTI ........... 0x1234C0
ran-PagingCycle ....... rf128
ran-NotificationAreaInfo ABSENT -- Need M: keep the
-- existing RNA
t380 .................. min60
nextHopChainingCount .. 4 -- incremented
15:22:08.171 [UE RRC] stop T319; store the new suspendConfig;
restart T380; remain in RRC_INACTIVE
-- five messages on the air, no NGAP, no state change
-- Two hours later, a different story:
17:41:19.002 [MAC-DL] PDCCH / P-RNTI at a CN paging occasion
17:41:19.003 [RRC-DL] PCCH-Message
paging
pagingRecordList
PagingRecord[0]
ue-Identity = ng-5G-S-TMSI ..... matches this UE
accessType .................... non3GPP absent
-- CN paging, NOT RAN paging: the record carries the NAS
-- identity, not the fullI-RNTI
17:41:19.004 [UE RRC] matching ng-5G-S-TMSI while in RRC_INACTIVE
-> enter RRC_IDLE
-> discard the UE Inactive AS Context
-> inform upper layers about the paging
17:41:19.088 [RRC-UL] rrcSetupRequest
ue-Identity = ng-5G-S-TMSI-Part1
establishmentCause ...... mt-Access
-- diagnostic: the AMF believed this UE was CM-IDLE, so the
-- anchor must already have sent NGAP UE CONTEXT RELEASE
-- REQUEST. Find out why it gave up on the context.Listing 6. Two INACTIVE events with opposite meanings. The RNA update is routine housekeeping; the CN page proves the RAN and the core had already diverged about this UE's state.
18.5 A silent key mismatch
18:02:44.511 [RRC-UL] rrcResumeRequest1 resumeCause mo-Data
resumeIdentity .......... 0x0A1234C05F
resumeMAC-I ............. 0x2D77
start T319 (ms1000)
UE derives K_gNB* using its stored NCC = 3
18:02:44.519 [gNB RRC] context found; resumeMAC-I verifies
(it is computed with the OLD K_RRCint, which
both sides still agree on)
gNB derives K_gNB* using NCC = 4
-- the last suspendConfig it sent carried NCC 4; the UE
-- never received it and is still using NCC 3
18:02:44.526 [RRC-DL] rrcResume on SRB1, PDCP SN 0, MAC-I 0x8A31F0C2
-- ciphered and integrity-protected under the gNB's keys
18:02:44.528 [UE PDCP] SRB1 PDCP SN 0: integrity check FAILED
-> discard the PDU; indicate the failure to upper layers
-> RRC never sees a message, so RRC does nothing
-- there is no RRC-level way to report this
18:02:44.529 [gNB RRC] RRCResume sent; waiting for RRCResumeComplete
18:02:45.511 [UE RRC] T319 expired
-> RRC_IDLE, release cause RRC resume failure
-> discard the stored UE Inactive AS Context
18:02:45.98x [gNB RRC] no RRCResumeComplete; guard timer expires
-> release the UE context, NGAP UE CONTEXT RELEASE REQUEST
-- Signature: resumeMAC-I verified (so the OLD keys matched) but the
-- response was never acknowledged (so the NEW keys did not). That pair
-- of facts together points at nextHopChainingCount and nothing else.Listing 7. The NCC mismatch, which is the hardest resume failure to diagnose because the gNB's log shows every step succeeding. The combination of a verified resumeMAC-I and an absent RRCResumeComplete is the only evidence, and it is conclusive.
19. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading state transitions |
|---|---|---|
| Rel-15 | The three-state model itself: RRC_INACTIVE, SuspendConfig, both I-RNTIs, RAN paging, RAN Notification Areas, RETRIEVE UE CONTEXT over Xn | The baseline. Everything in §3 to §13 is Rel-15. |
| Rel-16 | MeasIdleConfig and T331: measure and log while in RRC_IDLE or RRC_INACTIVE, report on the next transition to connected | A UE can now bring measurement history out of a non-connected state. See the companion 20 Measurements and Events. |
| Rel-16 | UEInformationRequest / Response carrying RLF, connEstFail and RA reports | The failure history of previous transitions is retrievable after the fact. See the companion 16 RLM and RLF. |
| Rel-16 | releasePreference in UEAssistanceInformation, with a preferred RRC state | The UE can now hint that it wants to be released, and indicate a preferred state -- but the decision is still the gNB's (§2). |
| Rel-16 | NR-U: RRC_INACTIVE on unlicensed spectrum; LBT failure as a distinct condition | A resume can now fail for channel-access reasons with no radio problem at all. |
| Rel-17 | Small Data Transmission (RA-SDT and CG-SDT): data from RRC_INACTIVE with no state change | The most significant change to the state model since Rel-15. A successful RACH from RRC_INACTIVE no longer implies a transition (§14). |
| Rel-17 | ran-ExtendedPagingCycle, eDRX in RRC_IDLE and RRC_INACTIVE | RAN paging cycles beyond rf256, so a resume triggered by downlink data can be delayed far longer than 2.56 s. |
| Rel-17 | RedCap: reduced-capability UEs with their own initial BWP and access resources, frequently long-lived in RRC_INACTIVE | Two UE classes with different suspension economics in the same cell. |
| Rel-17 | srs-PosRRC-Inactive in SuspendConfig: positioning reference transmissions while suspended | A UE in RRC_INACTIVE can now be transmitting on a schedule, which changes what "inactive" looks like on the uplink. |
| Rel-17 | MUSIM: a UE can request release to serve another SIM | A release with no radio or traffic cause at all. Do not look for a coverage explanation. |
| Rel-17 | NTN: RRC_IDLE and RRC_INACTIVE under satellite mobility, with pre-compensated timing | Reselection is driven by ephemeris and location, not only by measurements, so §13 is necessary but not sufficient there. |
| Rel-18 | L1/L2-triggered mobility (LTM) in RRC_CONNECTED; further network energy saving; SDT enhancements | Cell changes in RRC_CONNECTED may now occur with no RRCReconfiguration, so the clean "connected mobility is always signalled" rule of §5 acquires an exception. |
Table 16. State-model changes by release. Rel-17 SDT is the one that changes how logs must be read; the rest add parameters and cases.
20. Reading RRC States in Logs: A Checklist
1. Check every release message for a suspend configuration. RRCRelease is the same message either way, and the presence of suspendConfig is the whole difference between RRC_IDLE and RRC_INACTIVE. Getting this wrong invalidates everything downstream (§8).
2. Record the I-RNTI pair and the NCC from each suspend. The values inside suspendConfig are the only handles you have on the suspended UE. The NCC in particular is the value you will need if a later resume fails silently (§9.3).
3. On a resume, read the cause before anything else. A resumeCause of rna-Update is housekeeping that legitimately ends in RRCRelease; mo-Data, mt-Access and the rest are real resumes that should end in RRCResume. Mixing them corrupts every resume-success KPI (§12).
4. Note which SRB the response arrived on. RRCResume and RRCRelease come back protected on SRB1, meaning the context was used. RRCSetup and RRCReject come back in the clear on SRB0, meaning it was not. That is a one-glance verdict on whether the state machine worked (§9.1).
5. For every fallback setup, determine which of the four causes it was: the anchor discarded the context, there is no Xn to the anchor, the resumeMAC-I did not verify, or the I-RNTI width was wrong. All four produce an identical RRCSetup on the air and have four different fixes (§16).
6. Compare the resume timer against your Xn context-fetch round-trip time. If a fetch can take longer than T319, resumes at non-anchor gNBs will fail under load and succeed when idle -- which reads as a capacity problem and is a timer problem (§16).
7. Compare the anchor's context ageing timer against the periodic update timer. If the ageing timer is shorter than t380, every long-lived suspended UE eventually resumes into a context that is not there (§18.3).
8. When a resume looks successful at the gNB but the Complete never arrives, suspect the NCC. A verified resumeMAC-I plus a missing RRCResumeComplete is the signature of a key mismatch and of nothing else (§18.5).
9. Treat CN paging answered from the inactive state as an alarm. A UE in RRC_INACTIVE that answers a CN page proves the anchor had already released the context while the UE still believed it had one (§4.5).
10. Audit the resume-identity flag and the Xn topology against every configured RNA. useFullResumeID and Xn connectivity are both per-cell facts that RNAs assume and neither is checked anywhere. This is the highest-yield configuration audit in the state machine (§4.2, §10).
11. Once SDT is enabled, stop inferring state from RACH. A completed random access from RRC_INACTIVE may leave the UE exactly where it was (§14).
21. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
RRC_IDLE | -- | No AS context anywhere in the RAN, no AS identity, UE-controlled reselection, CN paging only (§3). |
RRC_INACTIVE | -- | AS context retained at the UE and the anchor gNB, I-RNTI as identity, UE-controlled reselection inside an RNA, RAN and CN paging (§4). |
RRC_CONNECTED | -- | Full active context, C-RNTI, network-controlled handover, RLM active (§5). |
| Anchor gNB | -- | The last serving gNB, which holds the UE Inactive AS Context. Not necessarily the gNB of the cell the UE is camped on. |
| UE Inactive AS Context | -- | The bundle the UE and the anchor both store at suspension: keys, ROHC state, QoS mapping, source cell identifiers and the bearer configuration (§4.3). |
I-RNTI | Inactive RNTI | The AS identity in RRC_INACTIVE. fullI-RNTI is 40 bits, shortI-RNTI 24; which is used depends on the resuming cell's useFullResumeID (§4.2). |
| RNA | RAN Notification Area | The set of cells inside which the UE may reselect without informing the network, and across which the anchor can RAN-page it (§4.4). |
| RNAU | RAN Notification Area Update | A resume with resumeCause = rna-Update, answered by a re-suspend. Triggered by T380 expiry or by leaving the RNA (§12). |
resumeMAC-I | -- | A 16-bit truncated MAC-I over VarResumeMAC-Input, computed with the old K_RRCint. Proves both possession of the old key and that the request is for this specific cell (§9.3). |
NCC | nextHopChainingCount | INTEGER (0..7) in suspendConfig, selecting horizontal or vertical key derivation on resume. A mismatch fails silently (§9.3). |
NH | Next Hop | The key-chain value supplied by the AMF and used for vertical key derivation. See the companion 27 AS Security Mode. |
| S-criteria | -- | The Srxlev > 0 and Squal > 0 test that decides whether a cell is suitable to camp on, before any ranking happens (§13.1). |
R_s / R_n | Ranking of serving / neighbour cell | The rank values compared for equal-priority reselection; R_s includes q-Hyst, which is what suppresses ping-pong (§13.2). |
Treselection | t-ReselectionNR and its inter-RAT equivalents | How long a reselection condition must hold before the UE acts; scaled by mobility state (§13.3). |
| SDT | Small Data Transmission | Rel-17 feature allowing user data to be sent from RRC_INACTIVE with no state transition (§14). |
| CM-IDLE / CM-CONNECTED | Connection Management states | The TS 23.501 names for what TS 24.501 calls 5GMM-IDLE and 5GMM-CONNECTED. RRC_INACTIVE corresponds to 5GMM-CONNECTED with RRC inactive indication. |
22. References
- 3GPP TS 38.331 -- NR RRC protocol specification. Clause 4.2.1 (RRC states), 5.3.3 (RRC connection establishment and
T300), 5.3.8 (RRC connection release, including 5.3.8.3, suspension), 5.3.13 (RRC connection resume, including 5.3.13.3 request contents andresumeMAC-I, and 5.3.13.6 reception ofRRCReject), 5.3.15 (RRCReject), 6.2.2 (RRCRelease,RRCResumeRequest,RRCResumeRequest1,RRCResume), 6.3.2 (SuspendConfig,RAN-NotificationAreaInfo,CellReselectionPriorities), 7.1 (UE timers and constants), 7.4 (VarResumeMAC-Input). - 3GPP TS 38.304 -- UE procedures in idle mode and RRC_INACTIVE state. Clause 5.2.3 (cell selection criterion S), 5.2.4 (cell reselection, priorities, ranking and
Treselection), 5.2.4.3 (measurement rules and the search thresholds), clause 7 (paging occasions and the DRX cycle a UE inRRC_INACTIVEuses). - 3GPP TS 38.300 -- NR and NG-RAN overall description. Clause 4.2.3 (RRC states and the state model), clause 9.2.2 (RRC_INACTIVE state management, RAN paging and RNA).
- 3GPP TS 33.501 -- Security architecture and procedures for 5G System. Clause 6.8 (AS key derivation, horizontal and vertical), clause 6.11 (RRC_INACTIVE state security, including key handling on suspend and resume).
- 3GPP TS 38.423 -- Xn application protocol (XnAP). Retrieve UE Context, RAN Paging, and UE Context Release procedures.
- 3GPP TS 38.413 -- NG application protocol (NGAP). Path Switch Request, Paging, and UE Context Release procedures.
- 3GPP TS 24.501 -- NAS protocol for 5G System. Clause 5.1.3 (connection management states, including
5GMM-CONNECTED with RRC inactive indication). - 3GPP TS 38.321 -- NR MAC protocol specification. Clause 5.1 (random access, which every resume runs), and the CCCH / CCCH1 LCID codepoints that make the two resume-request lengths matter.
Companion documents in this set
- 13 RRC Overview -- the layer, the SRBs, unaligned PER, the message catalogue, and the RRC-versus-5GMM state cross-product.
- 15 RRC Procedures -- setup, resume, release, reconfiguration and the rest, procedure by procedure, with delta configuration worked through.
- 01 Registration Process -- what the NAS side of an IDLE-to-CONNECTED transition actually costs.
- 03 Random Access -- every resume begins with a RACH; the triggers table there lists resume among them.
- 11 DRX -- connected-mode DRX, which is a different mechanism from the paging DRX of §3 and §4.
- 16 RLM and RLF --
T310,T311,T301, re-establishment and the RLF report: the other way out ofRRC_CONNECTED(§7.3). - 17 System Information -- SIB1,
UE-TimersAndConstants,useFullResumeIDand the reselection parameters of §13. - 19 Paging -- paging frames and occasions, and the RAN-versus-CN paging distinction of §4.5 in full.
- 20 Measurements and Events -- connected-mode measurement reporting, and the Rel-16 idle/inactive measurement logging that crosses the boundary.
- 23 Xn Handover -- the procedures §10 reuses: context transfer, key re-derivation and path switch.
- 26 UE Capability -- what is discarded and what is retained across suspension is partly capability-dependent.
- 27 AS Security Mode -- the key hierarchy,
K_gNB, the NH chain and the NCC that §9.3 depends on.