RRC Connection Procedures in 5G NR
Setup, reconfiguration, release, re-establishment and resume — the core RRC flows with exact IEs.
TS 38.331 organises its normative behaviour into procedures, and almost every one of them has the same five parts. Learning the shape once means you can read a procedure you have never seen before and know what questions to ask of it:
Contents
- 01What an RRC Procedure Is, and the Shape They All Share
- 02The Master Message Table
- 03RRC Connection Establishment
- 04RRC Connection Resume
- 05RRC Connection Release
- 06RRC Connection Re-establishment
- 07RRC Reconfiguration: the Big One
- 08Delta Configuration: Add, Modify, Release and the Need Codes
- 09What the gNB Decides Before It Answers
- 10Security Mode Command
- 11UE Capability Enquiry and Transfer
- 12UE Information Request and Response
- 13The Smaller Procedures
- 14A Whole Session, Procedure by Procedure
- 15The RRC Timer Landscape
- 16Failure Modes and What Each One Means
- 17Configuration Reference (ASN.1)
- 18Illustrative Message Traces
- 19Release Deltas: Rel-15 to Rel-18
- 20Reading RRC Procedures in Logs: A Checklist
- 21Glossary
- 22References
1. What an RRC Procedure Is, and the Shape They All Share
TS 38.331 organises its normative behaviour into procedures, and almost every one of them has the same five parts. Learning the shape once means you can read a procedure you have never seen before and know what questions to ask of it:
| Part | What it is | Where to find it | Why it matters at 2am |
|---|---|---|---|
| Trigger | The condition that makes one side start the procedure. Either an upper-layer request, a timer, a measurement, or the arrival of a message. | The initiation sub-clause, e.g. TS 38.331 cl. 5.3.3.2 for establishment | The trigger decides what a failure means. The same four messages mean different things depending on why they started -- exactly as in the companion 03 Random Access. |
| Message exchange | One to three messages, almost always request / response, occasionally request / response / complete. | The actions sub-clauses and clause 6.2.2 for the encodings | Knowing the expected reply is what lets you notice its absence, which is RRC's main error signal. |
| Key IEs | The fields that actually carry the intent, as opposed to the wrapper. | Clause 6.2.2 (messages) and 6.3.2 (information elements) | Most procedures have one or two IEs that decide everything, and several dozen that are wrapper. |
| Governing timer | A T3xx that bounds the wait for the response. | Clause 7.1, plus the IE that configures it | The timer expiry is the error message. See §15. |
| Failure behaviour | What the initiating side does when the response does not arrive or cannot be applied. | The expiry and failure sub-clauses | Almost always: discard, revert, and either try something cheaper or fall back to RRC_IDLE. |
Table 1. The anatomy of an RRC procedure. Every section from §3 to §13 is organised around these five questions.
Two structural facts about RRC procedures are worth stating before any specific one. First, almost all of them are network-initiated. The UE initiates exactly four: establishment, resume, re-establishment, and the unsolicited reports (MeasurementReport, UEAssistanceInformation, FailureInformation, SCGFailureInformation). Everything else starts at the gNB. Second, there is almost no way to say no. There is no reconfiguration failure message in NR at all: a UE that cannot apply an RRCReconfiguration received on SRB1 reverts to its previous configuration and initiates re-establishment TS 38.331 cl. 5.3.5.8, so the way you learn that a reconfiguration was refused is that the connection restarts. The only explicit negative responses anywhere in the protocol are SecurityModeFailure, SCGFailureInformation and MCGFailureInformation.
The absence of a cause value in RRC failure messages is a deliberate design choice, not an oversight: a UE that cannot parse or apply a configuration may not be able to describe why in terms the network would understand, and a wrong cause value is worse than none. The practical consequence is that diagnosing a refused configuration always means diffing what you sent against what the UE said it supports. Keep the UECapabilityInformation next to the reconfiguration when you investigate.
2. The Master Message Table
Every RRC message, with the four facts you need before you can read it in a log: which direction it travels, which logical channel and SRB carry it, which procedure owns it, and which timer it starts or stops. Downlink first.
| Message | Channel / SRB | Owning procedure | Timer effect | Detail in |
|---|---|---|---|---|
MIB | BCCH-BCH | System information broadcast | -- | 18 MIB and SIB1 IEs |
SIB1, SystemInformation | BCCH-DL-SCH | System information broadcast | -- | 17 System Information |
Paging | PCCH | Paging | -- | 19 Paging |
RRCSetup | DL-CCCH / SRB0 | Connection establishment | stops T300 | §3 |
RRCReject | DL-CCCH / SRB0 | Establishment or resume | stops T300 / T319, starts T302 | §3, §4 |
RRCResume | DL-DCCH / SRB1 | Connection resume | stops T319 | §4, 14 RRC States |
RRCRelease | DL-DCCH / SRB1 | Connection release | stops T319; starts T380 if suspendConfig; starts T320 if cellReselectionPriorities | §5 |
RRCReestablishment | DL-DCCH / SRB1 | Re-establishment | stops T301 | §6, 16 RLM and RLF |
RRCReconfiguration | DL-DCCH / SRB1 or SRB3 | Reconfiguration | starts T304 if reconfigurationWithSync; stops T316 | §7 |
SecurityModeCommand | DL-DCCH / SRB1 | AS security activation | -- | §10, 27 AS Security Mode |
UECapabilityEnquiry | DL-DCCH / SRB1 | Capability transfer | -- | §11, 26 UE Capability |
UEInformationRequest | DL-DCCH / SRB1 | UE information | -- | §12 |
CounterCheck | DL-DCCH / SRB1 | Counter check | -- | §13.4 |
MobilityFromNRCommand | DL-DCCH / SRB1 | Mobility from NR | starts T304 | §13.5 |
DLInformationTransfer | DL-DCCH / SRB1 or SRB2 | NAS transport | -- | §13.1 |
DLInformationTransferMRDC | DL-DCCH / SRB1 | MR-DC transport | -- | 22 Handover Overview |
DLDedicatedMessageSegment | DL-DCCH / SRB1 | RRC segmentation | -- | 13 RRC Overview |
LoggedMeasurementConfiguration | DL-DCCH / SRB1 | Logged measurement configuration | starts the loggingDuration timer | 20 Measurements and Events |
Table 2. Downlink RRC messages. Note that only two messages ever travel on DL-CCCH, and both of them are answers to a CCCH request (§9).
| Message | Channel / SRB | Owning procedure | Timer effect | Detail in |
|---|---|---|---|---|
RRCSetupRequest | UL-CCCH / SRB0, 48 bits | Connection establishment | starts T300 | §3 |
RRCResumeRequest | UL-CCCH / SRB0, 48 bits | Connection resume | starts T319 | §4, 14 RRC States |
RRCResumeRequest1 | UL-CCCH1 / SRB0, 64 bits | Connection resume | starts T319 | §4, 14 RRC States |
RRCReestablishmentRequest | UL-CCCH / SRB0, 48 bits | Re-establishment | starts T301 | §6, 16 RLM and RLF |
RRCSystemInfoRequest | UL-CCCH / SRB0 | On-demand system information | -- | 17 System Information |
RRCSetupComplete | UL-DCCH / SRB1 | Connection establishment | -- | §3 |
RRCResumeComplete | UL-DCCH / SRB1 | Connection resume | -- | §4 |
RRCReestablishmentComplete | UL-DCCH / SRB1 | Re-establishment | -- | §6 |
RRCReconfigurationComplete | UL-DCCH / SRB1 or SRB3 | Reconfiguration | stops T304 | §7 |
SecurityModeComplete | UL-DCCH / SRB1 | AS security activation | -- | §10 |
SecurityModeFailure | UL-DCCH / SRB1 | AS security activation | -- | §10 |
UECapabilityInformation | UL-DCCH / SRB1 | Capability transfer | -- | §11 |
UEInformationResponse | UL-DCCH / SRB1 | UE information | -- | §12 |
CounterCheckResponse | UL-DCCH / SRB1 | Counter check | -- | §13.4 |
MeasurementReport | UL-DCCH / SRB1 | Measurement reporting | -- | §13.2, 20 Measurements and Events |
UEAssistanceInformation | UL-DCCH / SRB1 | UE assistance | -- | §13.3 |
FailureInformation | UL-DCCH / SRB1 | Failure information | -- | §16 |
SCGFailureInformation | UL-DCCH / SRB1 | SCG failure | -- | 16 RLM and RLF |
MCGFailureInformation | UL-DCCH / SRB1 or SRB3 | MCG failure | starts T316 | 16 RLM and RLF |
ULInformationTransfer | UL-DCCH / SRB1 or SRB2 | NAS transport | -- | §13.1 |
ULDedicatedMessageSegment | UL-DCCH / SRB1 | RRC segmentation | -- | 13 RRC Overview |
MeasurementReportAppLayer | UL-DCCH / SRB4 | Application-layer measurement reporting (Rel-17) | -- | 13 RRC Overview |
DedicatedSIBRequest | UL-DCCH / SRB1 | Dedicated system information request | -- | 17 System Information |
LocationMeasurementIndication | UL-DCCH / SRB1 | Location measurement | -- | -- |
Table 3. Uplink RRC messages. Only five travel on CCCH, all five are fixed-length or nearly so, and all five are sent before the UE has a usable dedicated channel.
The two tables above are the fastest way to sanity-check a log. If you see a message on an SRB it does not belong on, you are either looking at a mislabelled trace or at a genuine implementation bug -- and the second is more common than it should be in split-gNB deployments, where the SRB ID IE on F1AP decides which PDCP entity handles the container (see the companion 13 RRC Overview §12).
3. RRC Connection Establishment
| Purpose | Create an RRC connection and SRB1 where none existed, so that NAS signalling and, later, bearers can be set up. |
| Trigger | Upper layers request a connection: a NAS Service Request, a registration procedure, an answer to CN paging, an emergency call, or a periodic registration update. Also used as the fallback when a resume or re-establishment cannot use a stored context (§9). |
| Messages | RRCSetupRequest (SRB0) -> RRCSetup (SRB0) -> RRCSetupComplete (SRB1). Or RRCSetupRequest -> RRCReject. |
| Key IEs | ue-Identity (a 5G-S-TMSI-Part1 if the UE has one, else a 39-bit random value); establishmentCause; then in the response radioBearerConfig establishing SRB1 and masterCellGroup; then in the Complete selectedPLMN-Identity, dedicatedNAS-Message, registeredAMF and s-NSSAI-List. |
| Timer | T300, started when the request is submitted to lower layers, stopped on RRCSetup or RRCReject. |
| Failure | T300 expiry: reset MAC, release the connection, store a connEstFailReport, return to RRC_IDLE and reselect. RRCReject: start T302 and wait. Neither is a radio link failure. |
Table 4. RRC connection establishment, TS 38.331 clause 5.3.3.
The interesting field is establishmentCause, because it is the only thing the network knows about the UE's intent before any NAS message arrives, and it drives admission control and prioritisation:
| Value | Meaning | Typical admission treatment |
|---|---|---|
emergency | An emergency call | Never rejected. Admitted even over capacity, and even for a UE that fails authentication. |
highPriorityAccess | A UE with a high-priority access class | Preferential admission; exempt from most barring. |
mt-Access | Answering a page | Preferential -- the network asked for this one, so rejecting it wastes the paging it already spent. |
mo-Signalling | UE-originated signalling with no user data | Ordinary. Registration and periodic updates arrive here. |
mo-Data | UE-originated user data | Ordinary; the first to be rejected under load. |
mo-VoiceCall | UE-originated voice | Preferential over mo-Data in most policies. |
mo-VideoCall, mo-SMS | As named (Rel-15 additions to the LTE set) | Policy-dependent. |
mps-PriorityAccess | Multimedia Priority Service | Preferential, by regulation in some markets. |
mcs-PriorityAccess | Mission Critical Service | Preferential, by regulation. |
spare6 .. spare1 | Reserved -- six of the sixteen codepoints | Never sent by a compliant UE. Seeing one means a decoder offset error or a non-compliant device. |
Table 5. EstablishmentCause, TS 38.331 clause 6.3.2. Sixteen enumerated values, four bits, no extension marker -- so the set is frozen for the life of the release.
establishmentCause is UE-asserted and unverified. It arrives on SRB0, before security, before authentication, before the network knows anything about the subscriber. A UE claiming emergency gets admitted on that claim alone, and the claim is checked -- if at all -- much later, at NAS level. This is by design (emergency calls must work for unauthenticated devices) and it is also why access-class barring and Unified Access Control operate on the broadcast side, in the UE, rather than on the network's evaluation of the cause.
One structural detail that matters when reading a split-gNB log: RRCSetup is built by the gNB-CU-CP but its masterCellGroup is authored by the gNB-DU and copied in verbatim. A malformed cell group in an RRCSetup is therefore a DU-side problem visible only in a CU-side decode. The companion 13 RRC Overview §12.2 has the full division of labour.
4. RRC Connection Resume
| Purpose | Restore a connection from RRC_INACTIVE using a context both sides already hold, instead of building a new one. |
| Trigger | Uplink data or signalling; an answer to RAN paging; T380 expiry or reselection out of the RAN Notification Area (in which case resumeCause is rna-Update). |
| Messages | RRCResumeRequest or RRCResumeRequest1 (SRB0) -> RRCResume (SRB1) -> RRCResumeComplete (SRB1). Also answerable with RRCSetup, RRCRelease or RRCReject -- see §9. |
| Key IEs | resumeIdentity (the 24-bit shortI-RNTI or the 40-bit fullI-RNTI, chosen by whether the cell broadcasts useFullResumeID); resumeMAC-I, a 16-bit truncated MAC-I computed with the old K_RRCint; resumeCause. In the response, masterCellGroup, optional radioBearerConfig and measConfig, and optionally fullConfig. |
| Timer | T319, started on sending the request. |
| Failure | T319 expiry: go to RRC_IDLE with release cause RRC resume failure and discard the stored context. An RRCSetup answer means the context was unusable; an RRCReject answer leaves the UE in RRC_INACTIVE. |
Table 6. RRC connection resume, TS 38.331 clause 5.3.13.
Resume is covered in depth in the companion 14 RRC States, including the key re-derivation, the RAN Notification Area, and the context fetch over Xn when the UE resumes at a different gNB. Two procedure-level points belong here.
A resume response may carry a full configuration. RRCResume is not obliged to restore the stored context unchanged. It can contain a radioBearerConfig, a masterCellGroup and a measConfig, and it can carry fullConfig, which tells the UE to throw the stored configuration away entirely and treat the message as absolute (§8.4). A network that has changed its bearer configuration since the UE was suspended uses exactly this.
The response arrives on SRB1, already protected. The UE restores SRB1 and derives the new keys before it has any response, which is why RRCResume and RRCRelease can be delivered protected on SRB1 while RRCSetup and RRCReject arrive in the clear on SRB0. In a log, the SRB the answer arrives on is a one-glance verdict on whether the stored context was used at all.
5. RRC Connection Release
| Purpose | End the RRC connection, either to RRC_IDLE or -- with suspendConfig -- to RRC_INACTIVE. Optionally also steer the UE's subsequent idle-mode behaviour. |
| Trigger | Always a network decision: an inactivity timer, admission or load control, a NAS-driven release, or a UE releasePreference the gNB chose to honour. |
| Messages | RRCRelease (SRB1). There is no response and no acknowledgement at RRC level. |
| Key IEs | suspendConfig, redirectedCarrierInfo, cellReselectionPriorities (with t320), deprioritisationReq. |
| Timer | Starts T380 if suspendConfig is present; starts T320 if cellReselectionPriorities is present; stops T319 if a resume was in progress. |
| Failure | None defined -- the message is unacknowledged. If it is lost, the UE stays where it was and eventually declares RLF. |
Table 7. RRC connection release, TS 38.331 clause 5.3.8.
The three steering IEs are worth recognising in a log because each has an effect that outlives the connection by minutes:
| IE | Sub-fields | Duration of the effect | What it does to the UE |
|---|---|---|---|
redirectedCarrierInfo | CHOICE of nr (CarrierInfoNR: carrierFreq, ssbSubcarrierSpacing, optional smtc) or eutra (EUTRA-CarrierInfo) | One cell-selection attempt | The UE tries cell selection on the indicated carrier first, before falling back to its normal reselection priorities. A one-shot nudge, not a lasting policy. |
cellReselectionPriorities | freqPriorityListNR, freqPriorityListEUTRA, t320 | t320: min5 .. min180 | Replaces the broadcast cellReselectionPriority per frequency with per-UE values. On t320 expiry the UE reverts to the broadcast set -- which looks like spontaneous re-steering if you are not watching for it. |
deprioritisationReq | deprioritisationType = frequency or nr; deprioritisationTimer = min5, min10, min15, min30 | 5 to 30 minutes | The UE deprioritises either the current frequency or all of NR. The nr form moves the UE to LTE for the duration. |
suspendConfig | See the companion 14 RRC States §4.1 | Until resumed or T319/T380 intervenes | The UE enters RRC_INACTIVE instead of RRC_IDLE. |
Table 8. The four optional IEs of RRCRelease. A release with none of them is a plain release; a release with all four is a mobility policy.
deprioritisationReq with deprioritisationType = nr is the most consequential single field in RRCRelease and the easiest to overlook. It removes the UE from NR for up to half an hour, and the effect on a KPI dashboard is both dramatic and delayed -- NR traffic falls for thirty minutes after whatever caused it, long after anyone would think to correlate the two. If NR attach rates dip on a schedule nobody can explain, count deprioritisationReq in your release messages first.
6. RRC Connection Re-establishment
| Purpose | Recover a connection after a failure, reusing the stored context, without going all the way back to RRC_IDLE and a NAS Service Request. |
| Trigger | Radio link failure (T310 expiry, RLC maximum retransmissions, or random access problem on the SpCell); handover failure (T304 expiry); integrity check failure on an SRB; RRCReconfiguration failure. All of these are covered in the companion 16 RLM and RLF. |
| Messages | RRCReestablishmentRequest (SRB0, 48 bits) -> RRCReestablishment (SRB1) -> RRCReestablishmentComplete (SRB1). May instead be answered with RRCSetup. |
| Key IEs | In the request: c-RNTI and physCellId of the cell the UE failed in, a 16-bit shortMAC-I, and reestablishmentCause. In the response: only nextHopChainingCount. |
| Timer | T311 bounds the cell selection that precedes the request; T301 bounds the wait for the response. |
| Failure | T311 or T301 expiry: go to RRC_IDLE with release cause RRC connection failure and store an RLF report. |
Table 9. RRC connection re-establishment, TS 38.331 clause 5.3.7.
RRCReestablishment carries nothing but the chaining count -- nextHopChainingCount and nothing else: no bearer configuration, no cell group, no measurement configuration. All it does is re-key SRB1. Everything else the UE needs comes in a separate RRCReconfiguration immediately afterwards, and until that arrives the UE has SRB1 and nothing else: SRB2 and every DRB are suspended. That is why a successful re-establishment still shows a user-plane gap, and why the reconfiguration that follows it usually carries fullConfig when the target gNB is not the one that failed.
reestablishmentCause has four codepoints -- reconfigurationFailure, handoverFailure, otherFailure and one spare -- so two bits. It is coarse on purpose: the detail lives in the RLF report the UE stores and later surrenders (§12), not in the request it sends before security is available. The 48-bit budget of the request and the shortMAC-I computation are worked through in the companion 16 RLM and RLF §9.
7. RRC Reconfiguration: the Big One
| Purpose | Change anything about the UE's configuration: add, modify or release bearers; reconfigure MAC, RLC, PDCP, SDAP and the physical layer; set up or change measurements; update security keys; and -- through reconfigurationWithSync -- move the UE to a different cell. |
| Trigger | Anything the network decides. There is no single trigger, which is why the message is so hard to reason about generically. |
| Messages | RRCReconfiguration (SRB1, or SRB3 in NR-DC) -> RRCReconfigurationComplete. That is the only response; there is no failure message -- see the Failure row. |
| Key IEs | radioBearerConfig, secondaryCellGroup, measConfig, and inside the Rel-15 non-critical extension masterCellGroup, fullConfig, dedicatedNAS-MessageList, masterKeyUpdate, otherConfig. |
| Timer | T304 if reconfigurationWithSync is present. Otherwise none -- the procedure is bounded only by a gNB-internal guard timer. |
| Failure | The UE continues with the configuration in force before the message and initiates re-establishment TS 38.331 cl. 5.3.5.8 -- or, if the message arrived on SRB3, sends SCGFailureInformation with cause scg-reconfigFailure. If reconfigurationWithSync was present and random access at the target fails, T304 expiry instead: revert to the source configuration and re-establish. |
Table 10. RRC reconfiguration, TS 38.331 clause 5.3.5. One message, essentially unlimited scope.
7.1 The IE tree
RRCReconfiguration. Both cell groups use the same CellGroupConfig type, but they enter the message at different depths -- secondaryCellGroup is a root IE and masterCellGroup is a Rel-15 non-critical extension.| IE | Need | Contains | Authored by | What it configures |
|---|---|---|---|---|
radioBearerConfig | M | srb-ToAddModList, srb3-ToRelease, drb-ToAddModList, drb-ToReleaseList, securityConfig | gNB-CU-CP | PDCP and SDAP per bearer, plus the security algorithms and keyToUse. This is the bearer half of a bearer change. |
masterCellGroup | M (in the v1530 extension) | An OCTET STRING containing a CellGroupConfig: rlc-BearerToAddModList / ToReleaseList, mac-CellGroupConfig, physicalCellGroupConfig, spCellConfig, sCellToAddModList / ToReleaseList | gNB-DU, copied in verbatim by the CU-CP | RLC, MAC and PHY for the master cell group. This is the lower-layer half of a bearer change. |
secondaryCellGroup | M | The same CellGroupConfig type, for the SCG in NR-DC | The Secondary Node, relayed by the MN | The secondary cell group. Absent for a UE without dual connectivity. |
measConfig | M | measObjectToAddModList / ToRemoveList, reportConfigToAddModList / ToRemoveList, measIdToAddModList / ToRemoveList, quantityConfig, measGapConfig, s-MeasureConfig | gNB-CU-CP | What to measure, when to report it, and the measurement gaps. See the companion 20 Measurements and Events and 21 Measurement Gaps and SMTC. |
masterKeyUpdate | N (v1530) | keySetChangeIndicator, nextHopChainingCount, nas-Container | gNB-CU-CP | Re-key the AS security context, horizontally or vertically. See the companion 27 AS Security Mode. |
fullConfig | N (v1530) | ENUMERATED {true} -- one bit | gNB-CU-CP | Discard everything and treat the message as absolute (§8.4). The single most consequential bit in the message. |
dedicatedNAS-MessageList | N (v1530) | A list of OCTET STRINGs | the AMF, relayed | Piggybacks NAS messages so a bearer setup and its NAS accept arrive together. |
otherConfig | M (v1530) | delayBudgetReportingConfig, overheatingAssistanceConfig, and the Rel-16 preference configurations | gNB-CU-CP | Enables the UE assistance reports of §13.3. Nothing the UE volunteers is volunteered unless enabled here. |
conditionalReconfiguration | M (v1610) | condReconfigToAddModList / ToRemoveList, each entry carrying execution conditions and a nested RRCReconfiguration | gNB-CU-CP | Conditional handover: a whole reconfiguration stored for later, executed by the UE when a measurement condition fires. See the companion 25 Conditional HO and DAPS. |
Table 11. The IEs of RRCReconfiguration that carry real intent. The Authored by column is what makes reconfiguration bugs hard in a split gNB: one message, three authors.
7.2 The two halves of a bearer change
A single logical change -- "add a DRB" -- requires edits in two different IEs authored by two different nodes. radioBearerConfig carries the PDCP and SDAP configuration and the DRB identity; masterCellGroup -> rlc-BearerToAddModList carries the RLC configuration and the logical channel, with a servedRadioBearer field pointing back at the DRB identity. The two must agree, and nothing in the protocol checks that they do.
The classic failure is a half-done release: the gNB puts DRB 2 in drb-ToReleaseList but forgets the corresponding entry in rlc-BearerToReleaseList. A well-formed release populates both. The observable symptom is an RLC entity and logical channel that persist with nothing above them -- MAC continues to include the logical channel in logical channel prioritisation, and BSR reporting may account for a bearer that no longer exists. In a split gNB the two lists are authored by the CU-CP and the DU respectively, which is precisely why they drift apart.
7.3 reconfigurationWithSync
This is the only IE in RRC that makes a UE change cell. It lives deep: masterCellGroup -> spCellConfig -> reconfigurationWithSync. Its presence changes the whole character of the procedure -- the UE resets MAC, re-establishes PDCP and RLC, applies a new C-RNTI, runs random access on the target, and sends its RRCReconfigurationComplete in the target cell.
| Field | Type | Need | What it does |
|---|---|---|---|
spCellConfigCommon | ServingCellConfigCommon | M | The target cell's common configuration -- physCellId, SSB position, TDD pattern, initial BWPs, rach-ConfigCommon. Enough for the UE to access a cell it has only measured. |
newUE-Identity | RNTI-Value, INTEGER (0..65535) | mandatory | The C-RNTI the UE will use in the target. Assigned before the UE has ever transmitted there, which is what makes contention-free access possible. |
t304 | ENUMERATED {ms50, ms100, ms150, ms200, ms500, ms1000, ms2000, ms10000} | mandatory | Bounds the whole execution. Expiry means handover failure. |
rach-ConfigDedicated | CHOICE of uplink or supplementaryUplink, each a RACH-ConfigDedicated | N | A dedicated preamble and occasion, i.e. contention-free random access. Absent means the UE uses contention-based access on the target -- slower and collision-prone. See the companion 03 Random Access. |
smtc | SSB-MTC | S (extension) | The SSB measurement timing configuration to use in the target before a measConfig arrives. |
Table 12. ReconfigurationWithSync, TS 38.331 clause 6.3.2. Note that newUE-Identity and t304 are mandatory -- there is no cell-change without a pre-assigned identity and a deadline.
reconfigurationWithSync, and its failure path. The message is built by the target and relayed unmodified by the source, so its contents are a target-side artefact appearing in a source-side log.rach-ConfigDedicated absent from a reconfigurationWithSync means the handover will use contention-based random access at the target. That is legal and it works, but it adds a contention-resolution round trip and a collision probability to a procedure bounded by T304 -- and T304 was probably sized assuming contention-free access. The symptom is handover failures that correlate with target-cell load rather than with radio conditions. Check whether the target is running out of dedicated preambles: totalNumberOfRA-Preambles in its RACH-ConfigCommon bounds the contention-based pool and the remainder is all the scheduler has to hand out.
7.4 What the first octet tells you
RRCReconfiguration. Everything about which IEs are in the message is decided in the first eight bits, before any content.Bit budget for the header of an RRCReconfiguration:
rrc-TransactionIdentifier INTEGER (0..3) ............ 2 bits
criticalExtensions CHOICE, 2 alternatives ............ 1 bit
RRCReconfiguration-IEs preamble bitmap:
radioBearerConfig present? ......................... 1 bit
secondaryCellGroup present? ....................... 1 bit
measConfig present? ............................... 1 bit
lateNonCriticalExtension present? ................. 1 bit
nonCriticalExtension present? ..................... 1 bit
--------------------------------------------------------------
Header total ....................................... 8 bits
Exactly one octet, and it answers "what is in this message" without decoding any content. The second octet then opens RadioBearerConfig: one extension-marker bit plus its own five-bit preamble (srb-ToAddModList, srb3-ToRelease, drb-ToAddModList, drb-ToReleaseList, securityConfig), leaving two bits for the first list's length determinant.
8. Delta Configuration: Add, Modify, Release and the Need Codes
RRC configuration is a delta protocol. An RRCReconfiguration does not describe the configuration the UE should have; it describes the change from the configuration the network believes the UE already has. Two mechanisms express that delta, and misunderstanding either produces bugs that surface several messages later.
8.1 The list mechanism
Every collection in RRC configuration is expressed as a pair of lists: an add-or-modify list keyed by an identity, and a release-or-remove list of bare identities. The rules are simple and the consequences are not:
1. Release lists are processed first. Within each list-based IE the UE handles the ToReleaseList or ToRemoveList before the ToAddModList TS 38.331 cl. 5.3.5.5, 5.3.5.6, 5.5.2. Releasing and re-adding the same identity in one message is therefore a legal, well-defined way to replace an object.
2. An entry in an add-or-modify list whose identity already exists is a modification, not a replacement. Fields present in the entry are applied; fields absent from it follow their own Need codes. It is not a clean slate.
3. An identity absent from both lists is untouched. This is the default and it is why a reconfiguration that adds one bearer can be eighty octets rather than two thousand.
4. The naming is inconsistent across the spec. radioBearerConfig and CellGroupConfig use ToReleaseList; measConfig uses ToRemoveList. Grepping for the wrong one is a genuine and common waste of an afternoon.
8.2 The Need codes
The list mechanism handles collections. Individual optional fields are governed by Need codes, which are ASN.1 comments in TS 38.331 and carry no encoding at all -- they exist only in the specification text, and they define what the absence of a field means:
| Code | Full name | Absent means | Typical use | The mistake it causes |
|---|---|---|---|---|
| Need M | Maintain | Keep the currently configured value. The field is genuinely optional on a modification. | measConfig, radioBearerConfig, mac-CellGroupConfig -- anything you might want to leave alone | None, usually. This is the intuitive behaviour and the one people assume applies everywhere. |
| Need N | No action | No action. The field is a one-shot instruction that has no persistent state. | reestablishPDCP, recoverPDCP, fullConfig, redirectedCarrierInfo, dedicatedNAS-MessageList | Expecting a Need N field to persist. reestablishPDCP re-establishes PDCP once; it is not a mode. |
| Need R | Release | Release the corresponding configuration. Absence is an instruction, not silence. | t380 in suspendConfig, suspendConfig in RRCRelease, outOfOrderDelivery in PDCP-Config | The expensive one. Omitting a Need R field deletes what it configured. A gNB that rebuilds a suspendConfig without t380 has just disabled periodic RAN Notification Area updates. |
| Need S | Specified elsewhere | The value is specified somewhere else -- a default in the spec, or another IE. | t-Reordering in PDCP-Config, rlmInSyncOutOfSyncThreshold | Assuming a spec default is a vendor default. Read the clause. |
| Cond X | Conditional presence | Presence is mandatory under condition X and absent otherwise. Most commonly Cond Setup: mandatory when the object is created, omissible when it is modified. | discardTimer, pdcp-SN-SizeUL and pdcp-SN-SizeDL in PDCP-Config; cnAssociation in DRB-ToAddMod | Sending a modification without a Cond Setup field and expecting a reset. It keeps the old value -- which is usually what you wanted, but it is not a reset. |
Table 13. The Need codes, TS 38.331 clause 6.1. These are comments in the ASN.1 and are the entire definition of delta semantics. Two fields side by side in the same SEQUENCE can behave completely differently when absent.
8.3 A worked example
This is where delta configuration is best understood: one starting configuration, one message, and the resulting configuration worked out field by field. Start with a UE that has three DRBs and three measurement identities.
SRBs .................. SRB1, SRB2
DRBs
DRB 1 pdu-Session 1, QoS flow 1 pdcp: discardTimer ms100,
SN-SizeUL/DL len18bits
DRB 2 pdu-Session 1, QoS flow 2 pdcp: discardTimer ms50,
SN-SizeUL/DL len12bits
DRB 3 pdu-Session 2, QoS flow 5 pdcp: discardTimer infinity,
SN-SizeUL/DL len18bits
RLC bearers (in masterCellGroup)
LCID 4 -> DRB 1 LCID 5 -> DRB 2 LCID 6 -> DRB 3
measConfig
measObjectId 1 NR, ARFCN 632628 (f1)
measObjectId 2 NR, ARFCN 646666 (f2)
reportConfigId 1 eventA3, offset 3 dB, hysteresis 1 dB, TTT 320 ms
reportConfigId 2 eventA2, threshold -110 dBm
measId 1 -> measObjectId 1, reportConfigId 1
measId 2 -> measObjectId 2, reportConfigId 1
measId 3 -> measObjectId 1, reportConfigId 2Listing 1. The starting configuration. Everything below is expressed relative to this.
Now the reconfiguration. Note how little it says:
RRCReconfiguration
rrc-TransactionIdentifier ......... 2
radioBearerConfig
drb-ToReleaseList ............... { 2 }
drb-ToAddModList
DRB-ToAddMod
drb-Identity ................ 3 -- exists -> MODIFY
pdcp-Config
drb discardTimer ......... ms100 -- was infinity
headerCompression ... notUsed
-- pdcp-SN-SizeUL/DL absent: Cond Setup, so KEPT at len18bits
DRB-ToAddMod
drb-Identity ................ 4 -- new -> ADD
cnAssociation = sdap-Config
pdu-Session ............... 2
sdap-HeaderDL/UL .......... present
mappedQoS-FlowsToAdd ...... { 6 }
pdcp-Config
drb discardTimer ......... ms100
pdcp-SN-SizeUL/DL .... len18bits -- mandatory at setup
headerCompression ... notUsed
nonCriticalExtension
masterCellGroup
rlc-BearerToReleaseList ....... { 5 } -- the other half of
-- releasing DRB 2
rlc-BearerToAddModList
RLC-BearerConfig logicalChannelIdentity 7
servedRadioBearer = drb-Identity 4
measConfig
measObjectToRemoveList .......... { 2 }
measObjectToAddModList
MeasObjectToAddMod measObjectId 3, NR ARFCN 620000 (f3)
reportConfigToAddModList
ReportConfigToAddMod reportConfigId 3, eventA5
measIdToAddModList
MeasIdToAddMod measId 4 -> measObjectId 3, reportConfigId 3Listing 2. The reconfiguration. Six list entries, and note what is not here: no mention of DRB 1, of SRB1 or SRB2, of measId 1, 2 or 3, or of quantityConfig.
And the result, worked out one object at a time:
| Object | Appears in the message as | Result | Why |
|---|---|---|---|
| SRB1, SRB2 | not mentioned | unchanged | Absent from both lists means untouched. |
| DRB 1 | not mentioned | unchanged | Same. discardTimer stays ms100, SN stays 18 bits. |
| DRB 2 | drb-ToReleaseList { 2 } | released | PDCP and SDAP entities released, drb-Identity 2 freed. |
| LCID 5 | rlc-BearerToReleaseList { 5 } | released | The other half of releasing DRB 2 -- a separate list in a separate IE (§7.2). |
| DRB 3 | drb-ToAddModList, identity exists | discardTimer becomes ms100; the SN size stays at len18bits | The identity exists, so this is a modification. pdcp-SN-SizeUL/DL are Cond Setup: absent on a modification means keep. |
| DRB 4 | drb-ToAddModList, identity is new | added | New identity, so cnAssociation and the SN sizes are mandatory and present. |
| LCID 7 | rlc-BearerToAddModList | added, serving DRB 4 | servedRadioBearer ties it to drb-Identity 4. |
| measObject 1 | not mentioned | unchanged | Untouched. |
| measObject 2 | measObjectToRemoveList { 2 } | removed | Explicit. |
| measObject 3 | measObjectToAddModList | added | Explicit. |
| reportConfig 1, 2 | not mentioned | unchanged | Untouched. |
| reportConfig 3 | reportConfigToAddModList | added | Explicit. |
| measId 1 | not mentioned | unchanged | Untouched. |
| measId 2 | not mentioned anywhere | removed | It referenced measObjectId 2. Removing a measObject removes every measId associated with it TS 38.331 cl. 5.5.2.4. Nothing in the message says so. |
| measId 3 | not mentioned | unchanged | Untouched. |
| measId 4 | measIdToAddModList | added | Explicit. |
quantityConfig, measGapConfig | not mentioned | unchanged | Both are Need M. |
Table 14. The resulting configuration, object by object. Sixteen objects, one of which changed without appearing in the message at all.
Accounting for the message:
list entries carried in the message ............... 6
drb-ToReleaseList 1
drb-ToAddModList 2
rlc-BearerToReleaseList 1
rlc-BearerToAddModList 1
measObjectToRemoveList 1 ... plus 3 add/mod entries
objects whose state actually changed .............. 8
released: DRB 2, LCID 5, measObject 2, measId 2
modified: DRB 3
added: DRB 4, LCID 7, measObject 3, reportConfig 3, measId 4
The discrepancy is measId 2, removed as a side effect of removing the measObject it pointed at. If the network wanted to keep measuring f2 under a different object identity, it had to re-add measId 2 in the same message -- and if it wanted to modify measObject 2 rather than replace it, it should have put measObject 2 in measObjectToAddModList and not in measObjectToRemoveList at all. Those two routes produce an identical measObject and completely different measId sets.
Remove-and-re-add is not equivalent to modify, and the difference is invisible in the resulting object. Putting measObjectId 2 in the remove list and then in the add/mod list gives you a measObject 2 identical to a modified one -- and silently destroys every measId that referenced it. Symptom: a measurement report you configured and tested that stops firing after some unrelated reconfiguration, with no error anywhere. Always prefer modification over remove-and-re-add for measurement objects, and if you must remove one, re-add its measIds explicitly.
8.4 fullConfig, and when to reach for it
fullConfig is an ENUMERATED {true} -- one bit -- that switches the message from delta to absolute. When it is present the UE releases the entire dedicated configuration, applies the default configuration from TS 38.331 clause 9.2, and then applies the message. Two things survive: SRB1's PDCP and RLC entities, and the AS security context, because both are needed to have delivered the message in the first place.
| Delta reconfiguration | fullConfig reconfiguration | |
|---|---|---|
| Typical encoded size | 50 - 300 octets | 1500 - 4000 octets, sometimes more |
| What the UE keeps | Everything not mentioned | Only SRB1 and the security context |
| User-plane interruption | None, unless reestablishPDCP or recoverPDCP is set per bearer | Every DRB is released and re-established: PDCP state, ROHC context and reordering buffers all reset |
| When it is correct | Any change within one gNB that has a coherent view of the UE's configuration | Inter-RAT handover into NR; handover between nodes that cannot exchange a delta; re-establishment at a node that lacks the full context; recovery from a suspected configuration mismatch |
| When it is a mistake | When the two sides' views have already diverged -- a delta against the wrong baseline compounds the problem | Any routine change. It works, which is exactly why it gets used as a reflex, and it costs a user-plane gap every time |
Table 15. Delta versus full. fullConfig is the correct answer to "I do not know what this UE has" and the wrong answer to everything else.
Cost of reaching for fullConfig when a delta would do. Take the worked example of §8.3 -- add one DRB, modify one, release one:
as a delta ................................ 88 octets
as fullConfig, the same end state must restate
SRB2, DRB 1, DRB 3, DRB 4, the whole
masterCellGroup and the whole measConfig .. ~2 100 octets
size ratio ................................ ~24x
On the air that is one PDSCH transmission against two or three, which nobody would notice. The cost that matters is different: fullConfig releases and re-establishes every DRB, so PDCP state, ROHC context and reordering buffers all reset on all of them. A delta with no reestablishPDCP causes zero interruption. The ratio in bytes is 24:1; the ratio in user-visible interruption is not a ratio at all, because one of the two numbers is zero.
8.5 The failure path, and why it is so expensive
If the UE cannot comply with any part of the message it must apply none of it. It continues with the configuration that was in force before the message arrived -- and then, because NR provides no reconfiguration failure message, it initiates the connection re-establishment procedure TS 38.331 cl. 5.3.5.8.
| Where the message arrived | What the UE does | What you see |
|---|---|---|
| SRB1, MCG transmission not suspended | Continue with the pre-message configuration, then initiate re-establishment (clause 5.3.7) | An RRCReestablishmentRequest on SRB0 in some cell, with reestablishmentCause = reconfigurationFailure. Seconds of user-plane outage. |
| SRB1, MCG transmission suspended | Continue with the pre-message configuration, then report an MCG failure or, if that is not possible, go to RRC_IDLE | MCGFailureInformation over the SCG, or a UE that simply disappears. |
| SRB3, i.e. the reconfiguration was for the secondary cell group | Continue with the pre-message configuration, then initiate the SCG failure information procedure | SCGFailureInformation with failureType = scg-reconfigFailure. The MCG connection survives. |
Table 16. What happens when a UE cannot comply, TS 38.331 clause 5.3.5.8. Only the SRB3 case produces a message that names the problem, and only because the SCG failure procedure already existed.
NR has no reconfiguration failure message at all -- there is no RRCReconfigurationFailure anywhere in TS 38.331. This surprises people who come to the protocol from the abstract, and it changes the diagnostic picture completely: a reconfiguration the UE cannot apply does not cost you a message, it costs you the connection. The evidence is an RRCReestablishmentRequest carrying reestablishmentCause = reconfigurationFailure, and that two-bit cause value is the entire error report. If you are looking for a failure message and not finding one, look for a re-establishment instead.
Reversion is atomic and it is the UE's obligation, but the network has no way to confirm it happened. After a refused reconfiguration the two sides should agree on the pre-message configuration -- and if the UE's revert was partial, they do not, and every subsequent delta is computed against a baseline the UE does not have. Since the recovery path is a re-establishment anyway, the target gNB will normally follow RRCReestablishment with a fullConfig reconfiguration: it costs an interruption that has already been paid for, and it guarantees agreement.
9. What the gNB Decides Before It Answers
Three of the five uplink CCCH messages are requests for a connection, and the gNB has to choose its answer before it knows very much. The choice is worth drawing out because the answer is the most informative single field in any access trace.
RRCSetup tells you that a stored context was unusable but not which one.| Request | What the gNB must check | Answer if it passes | Answer if it fails | Where the answer travels |
|---|---|---|---|---|
RRCSetupRequest | Admission control, cell load, Unified Access Control policy, whether the AMF is reachable | RRCSetup | RRCReject with a waitTime | SRB0 either way |
RRCResumeRequest[1] | That the I-RNTI resolves to a context (locally or over Xn), and that resumeMAC-I verifies against the stored K_RRCint | RRCResume, or RRCRelease (with or without suspendConfig) if the gNB does not want the connection | RRCSetup -- fall back to establishment | SRB1 on success, SRB0 on fallback |
RRCReestablishmentRequest | That the c-RNTI and physCellId identify a context, and that shortMAC-I verifies | RRCReestablishment, carrying only the NCC | RRCSetup -- fall back to establishment | SRB1 on success, SRB0 on fallback |
Table 17. Three requests, and what has to be true for each to be granted. The last column is the diagnostic shortcut: an answer on SRB0 means no stored context was used.
The SRB the answer arrives on is a free, unambiguous verdict, and it costs nothing to check. RRCResume, RRCRelease and RRCReestablishment are DL-DCCH messages and arrive on SRB1, integrity-protected under a key derived from a stored context -- so their arrival proves the context was found and verified. RRCSetup and RRCReject are DL-CCCH messages and arrive in the clear on SRB0. If your log records the logical channel, you never have to guess whether a resume actually resumed.
The gNB also chooses between delta and full configuration on every reconfiguration, and the criterion is not load or size but confidence -- see §8.4. In practice three situations force fullConfig: inbound inter-RAT handover, handover between nodes that cannot exchange a delta configuration, and re-establishment or resume at a node that retrieved a context it does not fully trust.
10. Security Mode Command
| Purpose | Activate AS-level integrity protection and ciphering on SRBs, and select the algorithms. |
| Trigger | The gNB, after it has received the AS security context from the AMF in the NGAP INITIAL CONTEXT SETUP REQUEST. Always before SRB2 or any DRB is configured. |
| Messages | SecurityModeCommand (SRB1) -> SecurityModeComplete (SRB1), or -> SecurityModeFailure (SRB1). |
| Key IEs | securityConfigSMC -> securityAlgorithmConfig, carrying cipheringAlgorithm and integrityProtAlgorithm. |
| Timer | None in TS 38.331. Bounded only by a gNB-internal guard timer. |
| Failure | SecurityModeFailure: the UE could not apply the configuration and continues with the previous security configuration, which for an initial activation means no security at all. It does not release the connection. |
Table 18. AS security mode command, TS 38.331 clause 5.3.4. Full treatment in the companion 27 AS Security Mode.
The asymmetry in how the two messages are protected is the part worth remembering, because it is a landmark in any log:
| Message | Integrity protected? | Ciphered? | Why |
|---|---|---|---|
SecurityModeCommand | Yes, with the new K_RRCint | No | The UE must be able to read the algorithm selection before it can apply ciphering. Integrity protection is applied immediately because the UE derives the key from material it already has from NAS. |
SecurityModeComplete | Yes | Yes | By the time the UE answers it has applied both. This is the first fully protected uplink RRC message in the connection. |
SecurityModeFailure | No | No | Sent unprotected precisely because the UE could not apply the security configuration. That is also why it cannot be trusted, and why a gNB should treat it as a reason to release rather than to retry. |
Table 19. Protection of the security mode messages, per TS 33.501. Downlink ciphering begins after the gNB receives SecurityModeComplete.
| Algorithm | Ciphering | Integrity | Notes |
|---|---|---|---|
| Null | nea0 | nia0 | nea0 (no ciphering) is deployable and used in some networks. nia0 (no integrity) is permitted only for unauthenticated emergency calls. |
| SNOW 3G | nea1 | nia1 | Inherited from LTE. |
| AES | nea2 | nia2 | 128-NEA2 / 128-NIA2. The most widely deployed pair. |
| ZUC | nea3 | nia3 | Mandatory to support in some markets. |
| Reserved | spare4 .. spare1 | spare4 .. spare1 | Four spare codepoints each; three bits of the enumeration are unused. |
Table 20. CipheringAlgorithm and IntegrityProtAlgorithm, TS 38.331 clause 6.3.3. Both are eight-member enumerations, so three bits each on the wire.
The first non-zero MAC-I on SRB1 is your marker for where AS security actually took effect. Before SecurityModeComplete, PDCP still emits a four-octet MAC-I trailer on every SRB PDU, padded with zeros TS 38.323. A trailer of zeros in RRCSetupComplete is correct; a trailer of zeros in a message after SecurityModeComplete is not, and points at a security configuration that was accepted and not applied.
11. UE Capability Enquiry and Transfer
| Purpose | Find out what the UE supports, per radio access technology, so that every optional feature can be gated on the answer. |
| Trigger | The gNB, normally once per connection soon after security activation, or when it needs a capability set it does not have cached. |
| Messages | UECapabilityEnquiry (SRB1) -> UECapabilityInformation (SRB1), the latter often segmented. |
| Key IEs | ue-CapabilityRAT-RequestList, each entry carrying a rat-Type and an optional capabilityRequestFilter; the response carries a ue-CapabilityRAT-ContainerList of opaque containers. |
| Timer | None in TS 38.331. |
| Failure | Silence. If the response never arrives -- because it was too large to send, or because segment reassembly failed -- the gNB must proceed on a default assumption. |
Table 21. UE capability transfer, TS 38.331 clause 5.6.1. Full treatment in the companion 26 UE Capability.
rat-Type | What it asks for | Container contents |
|---|---|---|
nr | NR standalone capabilities | UE-NR-Capability: bands, band combinations, feature sets, per-feature-set-per-CC capabilities |
eutra-nr | EN-DC and NE-DC capabilities | UE-MRDC-Capability: the band combinations that span both RATs |
eutra | E-UTRA capabilities | An UE-EUTRA-Capability encoded per TS 36.331, nested inside an NR message |
utra-fdd | UTRA FDD capabilities (Rel-16) | For inter-RAT mobility to UMTS, where it still exists |
Table 22. RAT-Type, TS 38.331 clause 6.3.3. The containers are opaque OCTET STRINGs so that a Rel-15 decoder can pass a Rel-18 capability set through without understanding it.
capabilityRequestFilter exists because the unfiltered answer is enormous. A UE supporting many bands encodes band combinations combinatorially, and tens of kilobytes is routine. The filter lets the gNB say "only the bands I actually operate", which is the difference between a segmented multi-kilobyte response and a single PDSCH. A gNB that omits the filter and then cannot reassemble the response has caused its own problem -- and the failure is silent, because reassembly gaps produce no error message (see the companion 13 RRC Overview §11).
12. UE Information Request and Response
| Purpose | Retrieve diagnostic information the UE stored during an earlier failure, so the network can find out what went wrong after the fact. |
| Trigger | The gNB, after the UE indicated in a Complete message that a report is available. Never spontaneous. |
| Messages | UEInformationRequest (SRB1) -> UEInformationResponse (SRB1). Rel-16 promoted both into RRC proper. |
| Key IEs | Boolean request flags -- rlf-ReportReq, rach-ReportReq, connEstFailReportReq and their later companions -- and the correspondingly named report structures in the response. |
| Timer | None. |
| Failure | An empty response. A report that has already been handed over is gone, and there is no way to distinguish "already given away" from "never had one". |
Table 23. UE information, TS 38.331 clause 5.7.10. The report contents are covered in the companion 16 RLM and RLF.
| Report | Requested by | Stored when | What it tells you |
|---|---|---|---|
| RLF report | rlf-ReportReq | The UE declared radio link failure or handover failure | The failed cell and its measurements at the moment of failure, the neighbour measurements, whether it was an RLF or a handover failure, the time since failure, and the previous PCell. The single most useful diagnostic object in NR. |
| Connection establishment failure report | connEstFailReportReq | T300 expired, or random access exhausted during establishment | The cell the UE failed to access, its measured RSRP and RSRQ, and how many preambles were sent. See the companion 03 Random Access. |
| Random access report | rach-ReportReq | Any random access procedure completed | Attempt counts, whether contention-free or contention-based resources were used, and whether the procedure fell back. Useful for tuning rach-ConfigCommon without a drive test. |
| Logged measurement results | the logged-measurement request flag | A LoggedMeasurementConfiguration was in force | Immobile MDT-style measurement logs collected in RRC_IDLE or RRC_INACTIVE. See the companion 20 Measurements and Events. |
| Successful handover report | the Rel-17 request flag | A handover completed but only just | The complement of the RLF report: handovers that worked but were close to failing, which is where mobility tuning actually pays. |
Table 24. What a UE will surrender if asked. Every one of these is pull-only and single-use.
A report a gNB does not ask for is lost permanently. The UE holds it until either someone asks or its validity period expires, and it discards it the moment it has been sent, so exactly one gNB ever sees any given report. There is no message that says "I had one and you did not ask". If your network is not requesting RLF reports as a matter of policy, then every radio link failure it has ever had is undiagnosable, and no amount of network-side logging will recover the UE-side view.
13. The Smaller Procedures
13.1 NAS transport: DL and UL Information Transfer
The simplest procedures in RRC. Both messages are envelopes: they carry a dedicatedNAS-Message, which is an OCTET STRING, and RRC does not look inside it. They exist for NAS PDUs that have no RRC message to piggyback on -- unlike the initial NAS message, which rides in RRCSetupComplete, and unlike accept messages, which often ride in RRCReconfiguration's dedicatedNAS-MessageList.
| DLInformationTransfer | ULInformationTransfer | |
|---|---|---|
| SRB | SRB2 once it exists, SRB1 before that | SRB2 once it exists, SRB1 before that |
rrc-TransactionIdentifier | Present | Absent |
| Correlation | None available -- the uplink message is not a reply | None. NAS does its own correlation at NAS level, invisible to RRC. |
| Rel-16 additions | referenceTimeInfo, for delivering an accurate time reference to the UE | -- |
| Failure behaviour | None. Unacknowledged at RRC level; NAS retransmits if it cares. | None. |
Table 25. The two NAS transport messages. The transaction identifier asymmetry catches people: DLInformationTransfer has one and ULInformationTransfer does not, so the two cannot be paired at RRC level at all.
13.2 Measurement report
MeasurementReport is UE-initiated and unsolicited: no request precedes it and no transaction identifier correlates it. It carries a measResults structure whose first field is the measId that triggered it, and that measId is the only link back to the measConfig that configured the event. Correlate on measId, and keep the measConfig that established it -- a report against a measId you cannot find in your configuration means the configuration you think the UE has is not the one it has. Full treatment in the companion 20 Measurements and Events.
13.3 UE assistance information
UEAssistanceInformation is the UE telling the network what it would prefer. It is UE-initiated and unsolicited -- but only for the report types the network has explicitly enabled in otherConfig. Nothing here is volunteered by default.
| Report | Release | What the UE is saying | Enabled by | What a network usually does |
|---|---|---|---|---|
delayBudgetReport | Rel-15 | A preferred adjustment to the connected-mode DRX cycle, as a signed offset from -1280 ms to +1280 ms in seventeen steps | delayBudgetReportingConfig in otherConfig | Adjust drx-LongCycle. Mostly used by devices trading latency for battery. |
overheatingAssistance | Rel-15 | The UE is thermally limited and would like fewer carriers, less bandwidth or fewer MIMO layers: reducedMaxCCs, reducedMaxBW-FR1/FR2, reducedMaxMIMO-LayersFR1/FR2 | overheatingAssistanceConfig | Honour it. A UE that overheats will throttle anyway, and it will do so less gracefully. |
idc-Assistance | Rel-16 | In-device coexistence: which carrier frequencies and combinations are being interfered with by the device's own Bluetooth, WLAN or GNSS | idc-AssistanceConfig | Avoid the named frequencies in measurement and carrier configuration. |
drx-Preference | Rel-16 | Preferred drx-InactivityTimer, long cycle, short cycle and short cycle timer | drx-PreferenceConfig | Feed into the DRX configuration. See the companion 11 DRX. |
maxBW-Preference | Rel-16 | A preferred reduced aggregated bandwidth per frequency range | maxBW-PreferenceConfig | Reduce the configured bandwidth part or carrier set. |
releasePreference | Rel-16 | The UE would like the connection released, and names a preferred RRC state: idle, inactive, connected or outOfConnected | releasePreferenceConfig | The closest the UE gets to asking to be suspended -- and it is a hint, not a request. See the companion 14 RRC States. |
Table 26. UEAssistanceInformation report types. Every one is gated on a matching configuration in otherConfig, and every one has a prohibit timer that suppresses repeats.
If a UE never sends the assistance report you are waiting for, check otherConfig before you check the UE. Each report type needs its own enabling configuration, and each carries a prohibit timer -- overheatingIndicationProhibitTimer and its equivalents -- that suppresses a repeat for a configured interval after each report. A prohibit timer set to sixty seconds means a UE that is heating up rapidly reports once and then goes quiet for a minute, which reads exactly like the problem having gone away.
13.4 Counter check
A rarely-used integrity auxiliary. DRBs are usually ciphered but not integrity-protected, which leaves room for an attacker to insert or delete packets: the ciphering keystream stays synchronised only if both sides have processed the same number of PDUs, so an inserted or dropped packet shifts the COUNT. CounterCheck asks the UE to confirm its counters match.
| Direction | Message | Field | Width | Why |
|---|---|---|---|---|
| gNB -> UE | CounterCheck | drb-CountMSB-InfoList, each entry drb-Identity + countMSB-Uplink + countMSB-Downlink | INTEGER (0..33554431) -- the 25 most significant bits of the 32-bit COUNT | Only the MSBs are checked, so ordinary in-flight skew of up to 127 PDUs does not raise a false alarm. |
| UE -> gNB | CounterCheckResponse | drb-CountInfoList, each entry drb-Identity + count-Uplink + count-Downlink | INTEGER (0..4294967295) -- the full 32-bit COUNT | The UE returns the whole value so the gNB can see exactly how far apart the two are. |
Table 27. Counter check, TS 38.331 clause 5.3.6. The MSB-only request and full-value response is deliberate: it makes the check insensitive to normal skew and precise about real divergence.
If the counts differ, TS 38.331 leaves the reaction to the network. In practice a mismatch is treated as evidence of tampering and the connection is released. The procedure is cheap to run and almost never run, which means that when you do see it in a log it is either a conformance test or somebody's security policy, not a routine event.
13.5 Mobility from NR
| Purpose | Hand the UE over to another radio access technology -- in practice E-UTRA. |
| Trigger | The gNB, on a B1 or B2 inter-RAT measurement event, or on coverage or policy grounds. |
| Messages | MobilityFromNRCommand (SRB1). There is no NR-side response: success is the UE appearing on the target RAT. |
| Key IEs | targetRAT-Type; targetRAT-MessageContainer, an OCTET STRING holding a complete target-RAT RRC message; nas-SecurityParamFromNR. |
| Timer | T304. |
| Failure | T304 expiry: revert to the NR configuration and initiate re-establishment. There is no failure message on the NR side. |
Table 28. Mobility from NR, TS 38.331 clause 5.4.3.
targetRAT-MessageContainer holds an entire E-UTRA RRCConnectionReconfiguration with mobilityControlInfo, encoded per TS 36.331 and completely opaque to the NR decoder. Your NR-side tool will show it as a blob. To read it you need an LTE decoder and the container's octets -- and that is the only place the target configuration exists, so a failed inter-RAT handover cannot be diagnosed from an NR-only trace at all.
14. A Whole Session, Procedure by Procedure
Putting the pieces together, this is what a typical session actually runs, with the decisions and the alternatives at each step:
| # | Procedure | What happens | Timer | Alternative outcome |
|---|---|---|---|---|
| 1 | Establishment (§3) | RRCSetupRequest / RRCSetup / RRCSetupComplete. The Complete carries the first NAS message. | T300 | RRCReject and T302; or T300 expiry, a connEstFailReport and a return to RRC_IDLE. |
| 2 | Security mode (§10) | SecurityModeCommand / SecurityModeComplete. Integrity and ciphering become active on SRB1. | none | SecurityModeFailure, and the connection continues unprotected -- which the gNB should not accept. |
| 3 | Capability transfer (§11) | UECapabilityEnquiry / UECapabilityInformation, possibly segmented. | none | Silence, and the gNB proceeds on defaults -- under-configuring everything. |
| 4 | Reconfiguration (§7) | One RRCReconfiguration sets up SRB2, the first DRBs and the measurement configuration. | none | The UE cannot comply: it reverts -- at this point to a connection with no bearers at all -- and re-establishes. |
| 5 | NAS transport (§13.1) | DLInformationTransfer / ULInformationTransfer carry NAS throughout the session. | none | None at RRC level. |
| 6 | Measurement reporting (§13.2) | MeasurementReport whenever a configured event fires. | none | None -- unsolicited and unacknowledged. |
| 7 | Reconfiguration with sync (§7.3) | RRCReconfiguration with reconfigurationWithSync moves the UE to another cell. | T304 | T304 expiry: revert to the source configuration and re-establish. |
| 8 | Re-establishment (§6) | Only if something failed: RRCReestablishmentRequest / RRCReestablishment / Complete, then a reconfiguration to restore the bearers. | T311, T301 | Fallback RRCSetup, or RRC_IDLE and an RLF report. |
| 9 | UE information (§12) | UEInformationRequest / Response retrieves whatever the UE stored from step 8. | none | An empty response. |
| 10 | Release (§5) | RRCRelease, with suspendConfig for RRC_INACTIVE or without it for RRC_IDLE. | starts T380 or T320 | Message lost: the UE stays connected and eventually declares RLF. |
Table 29. A session's procedures in order, with the alternative outcome for each. Steps 1-4 happen once, 5-7 repeat, 8-9 happen only on failure, and 10 happens once.
Steps 1 to 4 are worth memorising as a block, because their order is load-bearing. Security must precede SRB2 and any DRB; capability should precede any feature-dependent configuration; and the reconfiguration that sets up bearers must come after both. A gNB that reorders these produces a revert-and-re-establish at step 4, and the symptom looks like a bearer problem. Check the order before you check the configuration.
15. The RRC Timer Landscape
| Timer | Started by | Stopped by | On expiry | Configured in |
|---|---|---|---|---|
T300 | Sending RRCSetupRequest | Receiving RRCSetup or RRCReject | Reset MAC, release resources, store a connEstFailReport, go to RRC_IDLE | UE-TimersAndConstants in SIB1 |
T301 | Sending RRCReestablishmentRequest | Receiving RRCReestablishment or RRCSetup | Go to RRC_IDLE, release cause RRC connection failure | UE-TimersAndConstants |
T302 | Receiving RRCReject with a waitTime | Cell reselection, or PLMN selection | Barring lifts for the access category | RRCReject waitTime, 1-16 s |
T304 | Receiving reconfigurationWithSync, or MobilityFromNRCommand | Successful random access at the target and the Complete message | Handover failure: revert to the source configuration and re-establish | ReconfigurationWithSync t304 |
T310 | N310 consecutive out-of-sync indications | N311 in-sync indications, or handover, or re-establishment | Declare radio link failure | UE-TimersAndConstants |
T311 | Initiating re-establishment | Selecting a suitable cell and sending the request | Go to RRC_IDLE | UE-TimersAndConstants |
T316 | Sending MCGFailureInformation over the SCG | Receiving reconfigurationWithSync or RRCRelease | Declare full RLF and re-establish | RLF-TimersAndConstants (Rel-16) |
T319 | Sending RRCResumeRequest[1] | Receiving RRCResume, RRCSetup, RRCRelease or RRCReject | Go to RRC_IDLE; discard the stored AS context | UE-TimersAndConstants |
T320 | Receiving dedicated cellReselectionPriorities | New priorities, or entering RRC_CONNECTED | Revert to the broadcast reselection priorities | CellReselectionPriorities t320 |
T380 | Entering RRC_INACTIVE | Leaving RRC_INACTIVE | Initiate a periodic RAN Notification Area Update | SuspendConfig t380 |
T390 | An access barring check failing for an access category | Barring being lifted | Access is allowed again for that category | UAC-BarringInfoSet uac-BarringTime, scaled by a random factor |
Table 30. RRC timers, TS 38.331 clause 7.1. Every one of these is the error message for the procedure it bounds -- RRC has no others.
Sizing T319 against your Xn context-fetch round-trip time is the single most commonly-missed timer interaction in this table. T319 bounds the UE's wait for a resume response, and if the UE resumed at a gNB that does not hold its context, that response cannot be produced until an XnAP RETRIEVE UE CONTEXT exchange completes. T319 = ms100 and an Xn round trip of 60 ms under load is a resume procedure that succeeds when the network is quiet and fails when it is busy -- which is indistinguishable from a capacity problem and is a timer problem. See the companion 14 RRC States §10.
16. Failure Modes and What Each One Means
| Failure | Detected by | What happens | Observable as | Diagnostic pointer |
|---|---|---|---|---|
The UE cannot comply with an RRCReconfiguration | UE RRC | Applies none of the message, keeps the previous configuration, and initiates re-establishment (§8.5) | An RRCReestablishmentRequest with reestablishmentCause = reconfigurationFailure. No failure message exists. | Diff the configuration you sent against UECapabilityInformation. The usual culprits are an unsupported SN size, an unsupported band combination in secondaryCellGroup, or a bandwidth part the UE cannot form. |
SecurityModeFailure | UE RRC | The UE continues with the previous security configuration -- which on initial activation means none | An unprotected uplink message on SRB1 | An algorithm the UE does not support, or a key derivation mismatch. The gNB should release rather than retry (§10). |
T304 expiry | UE RRC | Revert to the source configuration and initiate re-establishment | A gap, then RRCReestablishmentRequest in some cell | Random access at the target failed. Check whether rach-ConfigDedicated was present -- contention-based access at the target inside a T304 sized for contention-free access is a common cause (§7.3). |
T300 / T301 / T319 expiry | UE RRC | Go to RRC_IDLE and, for T319, discard the stored context | A request with no answer, then a fresh RRCSetupRequest | Either the request never arrived, or the network took too long. §15 for the timer sizing that causes the second case. |
RRCReject | gNB | The UE starts T302 and waits. From RRC_INACTIVE, it stays there. | An explicit downlink message on SRB0 with a waitTime | Admission or load control. A rising RRCReject rate against a flat RRCSetupRequest rate is a capacity signal, not a radio one. |
| A measId removed as a side effect | Nobody | The measId disappears because the measObject it referenced was removed | A measurement report that stops firing, with no error anywhere | The highest-value item in this table. Diff the measId set before and after every reconfiguration that touches measObjectToRemoveList (§8.3). |
| A DRB released without its RLC bearer | Nobody | The PDCP and SDAP entities go away; the RLC entity and logical channel remain | A logical channel that MAC still schedules with nothing above it | drb-ToReleaseList and rlc-BearerToReleaseList are separate lists in separately-authored IEs. Populate both (§7.2). |
fullConfig used where a delta would do | Nobody | Every DRB is released and re-established | A user-plane gap of tens of milliseconds on every bearer, on a reconfiguration that should have been transparent | Look for fullConfig in routine reconfigurations. It is a reflex in some implementations (§8.4). |
rrc-TransactionIdentifier reuse | gNB | A Complete cannot be attributed to a Request | Behaviour matching the previous configuration after a reconfiguration that appeared to succeed | Only four identifier values exist. Serialise reconfigurations per bearer. See the companion 13 RRC Overview §10. |
FailureInformation from the UE | UE RLC or PDCP | The UE reports a failure on one specific RLC bearer rather than declaring RLF | An uplink message naming a cellGroupId, a logicalChannelIdentity and a failureType | Rel-16. It lets a single-bearer RLC failure be repaired with a reconfiguration instead of costing the whole connection. |
| A capability response that never arrives | gNB, by timeout | The gNB proceeds on a default capability assumption | Silence after UECapabilityEnquiry | Either the response exceeded 9000 octets with no segmentation support, or segment reassembly failed. Count ULDedicatedMessageSegment messages and look for a segmentNumber gap (§11). |
| A UE assistance report that never arrives | Nobody | The UE was never enabled to send it, or a prohibit timer suppressed it | The absence of UEAssistanceInformation | Check otherConfig before you check the UE (§13.3). |
Table 31. Procedure failure modes. Five of the twelve are detected by nobody at all -- they have no error message and no timer, and they surface as behaviour that is merely wrong.
The five silent rows in that table share a property worth naming: they are all cases where the message was legal, was applied successfully, and did something other than what the author intended. No protocol mechanism can catch those. The only defence is to compute the expected resulting configuration from the delta before you send it, and compare it against what you meant -- which is exactly the exercise of §8.3, and the reason it is worth doing by hand once.
17. Configuration Reference (ASN.1)
17.1 RRCReconfiguration and its extension chain
RRCReconfiguration ::= SEQUENCE {
rrc-TransactionIdentifier RRC-TransactionIdentifier,
criticalExtensions CHOICE {
rrcReconfiguration RRCReconfiguration-IEs,
criticalExtensionsFuture SEQUENCE {}
}
}
RRCReconfiguration-IEs ::= SEQUENCE {
radioBearerConfig RadioBearerConfig OPTIONAL, -- Need M
secondaryCellGroup OCTET STRING (CONTAINING CellGroupConfig)
OPTIONAL, -- Need M
measConfig MeasConfig OPTIONAL, -- Need M
lateNonCriticalExtension OCTET STRING OPTIONAL,
nonCriticalExtension RRCReconfiguration-v1530-IEs OPTIONAL
}
RRCReconfiguration-v1530-IEs ::= SEQUENCE {
masterCellGroup OCTET STRING (CONTAINING CellGroupConfig)
OPTIONAL, -- Need M
fullConfig ENUMERATED {true} OPTIONAL, -- Need N
dedicatedNAS-MessageList SEQUENCE (SIZE(1..maxDRB)) OF
DedicatedNAS-Message OPTIONAL, -- Need N
masterKeyUpdate MasterKeyUpdate OPTIONAL, -- Need N
dedicatedSIB1-Delivery OCTET STRING (CONTAINING SIB1)
OPTIONAL, -- Need N
dedicatedSystemInformationDelivery OCTET STRING
(CONTAINING SystemInformation)
OPTIONAL, -- Need N
otherConfig OtherConfig OPTIONAL, -- Need M
nonCriticalExtension RRCReconfiguration-v1540-IEs OPTIONAL
}
-- ... the chain continues through v1540, v1560, v1610 (which adds
-- conditionalReconfiguration and daps-Config), v1640, v1650, v1660,
-- v1700 and beyond.Listing 3. Abridged from TS 38.331 clause 6.2.2. masterCellGroup lives in the v1530 extension while secondaryCellGroup is a root IE -- an ordering fossil, not a hierarchy.
17.2 The list-based IEs
RadioBearerConfig ::= SEQUENCE {
srb-ToAddModList SRB-ToAddModList OPTIONAL, -- Need N
srb3-ToRelease ENUMERATED {true} OPTIONAL, -- Need N
drb-ToAddModList DRB-ToAddModList OPTIONAL, -- Need N
drb-ToReleaseList DRB-ToReleaseList OPTIONAL, -- Need N
securityConfig SecurityConfig OPTIONAL, -- Need M
...
}
DRB-ToAddMod ::= SEQUENCE {
cnAssociation CHOICE {
eps-BearerIdentity INTEGER (0..15),
sdap-Config SDAP-Config
} OPTIONAL, -- Cond DRBSetup
drb-Identity DRB-Identity, -- INTEGER (1..32)
reestablishPDCP ENUMERATED {true} OPTIONAL, -- Need N
recoverPDCP ENUMERATED {true} OPTIONAL, -- Need N
pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP
...
}
CellGroupConfig ::= SEQUENCE {
cellGroupId CellGroupId,
rlc-BearerToAddModList SEQUENCE (SIZE(1..maxLC-ID)) OF
RLC-BearerConfig OPTIONAL, -- Need N
rlc-BearerToReleaseList SEQUENCE (SIZE(1..maxLC-ID)) OF
LogicalChannelIdentity
OPTIONAL, -- Need N
mac-CellGroupConfig MAC-CellGroupConfig OPTIONAL, -- Need M
physicalCellGroupConfig PhysicalCellGroupConfig
OPTIONAL, -- Need M
spCellConfig SpCellConfig OPTIONAL, -- Need M
sCellToAddModList SEQUENCE (SIZE (1..maxNrofSCells)) OF
SCellConfig OPTIONAL, -- Need N
sCellToReleaseList SEQUENCE (SIZE (1..maxNrofSCells)) OF
SCellIndex OPTIONAL, -- Need N
...
}
MeasConfig ::= SEQUENCE {
measObjectToRemoveList MeasObjectToRemoveList OPTIONAL, -- Need N
measObjectToAddModList MeasObjectToAddModList OPTIONAL, -- Need N
reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL, -- Need N
reportConfigToAddModList ReportConfigToAddModList OPTIONAL, -- Need N
measIdToRemoveList MeasIdToRemoveList OPTIONAL, -- Need N
measIdToAddModList MeasIdToAddModList OPTIONAL, -- Need N
s-MeasureConfig CHOICE { ssb-RSRP RSRP-Range,
csi-RSRP RSRP-Range } OPTIONAL, -- Need M
quantityConfig QuantityConfig OPTIONAL, -- Need M
measGapConfig MeasGapConfig OPTIONAL, -- Need M
measGapSharingConfig MeasGapSharingConfig OPTIONAL, -- Need M
...
}Listing 4. Abridged from TS 38.331 clause 6.3.2. Note the naming: bearers and cell groups use ToReleaseList, measurements use ToRemoveList. Same mechanism, two words.
17.3 The mobility and synchronisation IEs
SpCellConfig ::= SEQUENCE {
servCellIndex ServCellIndex OPTIONAL, -- Cond SCG
reconfigurationWithSync ReconfigurationWithSync
OPTIONAL, -- Cond ReconfWithSync
rlf-TimersAndConstants SetupRelease {RLF-TimersAndConstants}
OPTIONAL, -- Need M
rlmInSyncOutOfSyncThreshold ENUMERATED {n1}
OPTIONAL, -- Need S
spCellConfigDedicated ServingCellConfig
OPTIONAL, -- Need M
...
}
ReconfigurationWithSync ::= SEQUENCE {
spCellConfigCommon ServingCellConfigCommon OPTIONAL, -- Need M
newUE-Identity RNTI-Value, -- INTEGER (0..65535)
t304 ENUMERATED {ms50, ms100, ms150, ms200, ms500,
ms1000, ms2000, ms10000},
rach-ConfigDedicated CHOICE {
uplink RACH-ConfigDedicated,
supplementaryUplink RACH-ConfigDedicated
} OPTIONAL, -- Need N
...,
[[
smtc SSB-MTC OPTIONAL -- Need S
]]
}
MobilityFromNRCommand-IEs ::= SEQUENCE {
targetRAT-Type ENUMERATED {eutra, spare3, spare2,
spare1, ..., utra-fdd-v1610},
targetRAT-MessageContainer OCTET STRING,
nas-SecurityParamFromNR OCTET STRING OPTIONAL, -- Cond
lateNonCriticalExtension OCTET STRING OPTIONAL,
nonCriticalExtension SEQUENCE {} OPTIONAL
}
RRCReestablishment-IEs ::= SEQUENCE {
nextHopChainingCount NextHopChainingCount, -- INTEGER (0..7)
lateNonCriticalExtension OCTET STRING OPTIONAL,
nonCriticalExtension SEQUENCE {} OPTIONAL
}Listing 5. Abridged from TS 38.331 clause 6.2.2 and 6.3.2. RRCReestablishment-IEs is shown in full -- it really does carry nothing but the chaining count.
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 delta reconfiguration of §8.3, as a log
09:15:22.104 [CU-CP RRC-DL] DL-DCCH-Message on SRB1, LCID 1, 88 octets
c1 = rrcReconfiguration
rrc-TransactionIdentifier ......... 2
radioBearerConfig
drb-ToReleaseList ............... { 2 }
drb-ToAddModList
[0] drb-Identity .............. 3 -- MODIFY
pdcp-Config.drb.discardTimer ms100
pdcp-Config.drb.headerCompression notUsed
[1] drb-Identity .............. 4 -- ADD
cnAssociation.sdap-Config
pdu-Session ............. 2
mappedQoS-FlowsToAdd .... { 6 }
pdcp-Config.drb.pdcp-SN-SizeUL len18bits
pdcp-Config.drb.pdcp-SN-SizeDL len18bits
nonCriticalExtension -- v1530
masterCellGroup (OCTET STRING, 31 octets)
cellGroupId ................... 0
rlc-BearerToReleaseList ....... { 5 }
rlc-BearerToAddModList
[0] logicalChannelIdentity .. 7
servedRadioBearer = drb-Identity 4
measConfig
measObjectToRemoveList .......... { 2 }
measObjectToAddModList
[0] measObjectId .............. 3 (NR, 620000)
reportConfigToAddModList
[0] reportConfigId ............ 3 (eventA5)
measIdToAddModList
[0] measId 4 -> measObjectId 3, reportConfigId 3
09:15:22.131 [UE RRC] applying, in order:
drb-ToReleaseList { 2 } -> DRB 2 released
rlc-BearerToRelease { 5 } -> LCID 5 released
measObjectToRemove { 2 } -> measObject 2 removed
-> measId 2 removed as a
consequence (cl. 5.5.2.4)
drb-ToAddModList -> DRB 3 modified, DRB 4 added
rlc-BearerToAddMod -> LCID 7 added
measObject/reportConfig/measId add lists applied
DRB 3 pdcp-SN-Size unchanged (Cond Setup, absent = keep)
09:15:22.138 [UE RRC-UL] rrcReconfigurationComplete txn 2 on SRB1
-- Resulting measId set: { 1, 3, 4 }. measId 2 is gone and no list in
-- the message mentioned it. This is the bug class of section 8.3.Listing 6. The worked example as it appears in a CU-CP log, with the UE's application order shown. The last three lines are the whole point of §8.
18.2 A reconfiguration with sync, and its failure
10:41:07.882 [RRC-UL] measurementReport
measResults.measId ................ 1
measResultServingMOList[0] RSRP ... -104 dBm
measResultNeighCells.measResultListNR
[0] physCellId 118, RSRP ........ -96 dBm
10:41:07.905 [RRC-DL] rrcReconfiguration txn 3 on SRB1, 1412 octets
nonCriticalExtension.masterCellGroup
spCellConfig
reconfigurationWithSync
spCellConfigCommon
physCellId ................ 118
downlinkConfigCommon.frequencyInfoDL
absoluteFrequencySSB .... 632640
newUE-Identity ................ 0x7C12
t304 .......................... ms200
rach-ConfigDedicated.uplink
cfra.occasions ............ (dedicated)
cfra.resources.ssb
ssb-ResourceList[0]
ra-PreambleIndex ...... 48
masterKeyUpdate
keySetChangeIndicator ........... false
nextHopChainingCount ............ 5
-- T304 (ms200) starts on receipt
10:41:07.912 [UE RRC] reset MAC; re-establish PDCP+RLC for SRB1, SRB2,
DRB 1, DRB 2; derive K_gNB* with NCC 5;
apply spCellConfigCommon; C-RNTI := 0x7C12
10:41:07.921 [MAC-UL] PCI 118: CFRA preamble 48, RA-RNTI 1417
10:41:07.929 [MAC-DL] PCI 118: RAR, TA 212, UL grant
10:41:07.938 [RRC-UL] rrcReconfigurationComplete txn 3 on SRB1
-- T304 stopped at 33 ms of 200. Handover complete.
-- The same handover, with the CFRA resource unavailable:
11:02:44.610 [RRC-DL] rrcReconfiguration txn 1
reconfigurationWithSync
newUE-Identity .............. 0x33A0
t304 ........................ ms200
rach-ConfigDedicated ........ ABSENT
-- no dedicated preamble: the UE must use CBRA at the target
11:02:44.620 [MAC-UL] PCI 118: CBRA preamble 19 (random), attempt 1
11:02:44.641 [MAC-UL] PCI 118: CBRA preamble 44, attempt 2
11:02:44.669 [MAC-UL] PCI 118: CBRA preamble 07, attempt 3
11:02:44.810 [UE RRC] T304 expired (200 ms)
-> revert to the SOURCE configuration
-> initiate re-establishment: T311 started
-> store an RLF report, connectionFailureType = hof
11:02:44.980 [RRC-UL] rrcReestablishmentRequest on SRB0, PCI 41,
c-RNTI 0x4601, reestablishmentCause handoverFailureListing 7. A handover that works, and the same handover without a dedicated preamble. The second one fails on contention, inside a T304 that was sized for contention-free access.
18.3 A reconfiguration the UE refuses, and its real cost
12:18:03.441 [RRC-DL] rrcReconfiguration txn 0 on SRB1
radioBearerConfig
drb-ToAddModList
[0] drb-Identity .............. 5
pdcp-Config.drb.pdcp-SN-SizeUL len18bits
pdcp-Config.drb.pdcp-SN-SizeDL len18bits
nonCriticalExtension.secondaryCellGroup
sCellToAddModList
[0] sCellIndex ................ 3
[1] sCellIndex ................ 4
12:18:03.459 [UE RRC] evaluating the message
drb-Identity 5, 18-bit UL SN ......... supported
sCellIndex 3 ......................... supported
sCellIndex 4 ......................... NOT supported on
this band combination
-> cannot comply with the whole message
-> revert to the configuration in force before txn 0
(DRB 5 is NOT added; SCell 3 is NOT added)
-> NR has no reconfiguration failure message, so:
-> initiate re-establishment (TS 38.331 cl. 5.3.5.8)
12:18:03.463 [UE RRC] T311 started; cell selection
12:18:03.508 [RRC-UL] rrcReestablishmentRequest on SRB0 (same cell)
c-RNTI ............................ 0x4601
physCellId ........................ 41
shortMAC-I ........................ 0x2F81
reestablishmentCause .............. reconfigurationFailure
-- two bits of cause value. That is the entire error report.
12:18:03.541 [RRC-DL] rrcReestablishment txn 0 on SRB1
nextHopChainingCount .............. 6
-- and nothing else: SRB2 and every DRB are still suspended
12:18:03.559 [RRC-UL] rrcReestablishmentComplete txn 0
12:18:03.572 [RRC-DL] rrcReconfiguration txn 1
nonCriticalExtension.fullConfig ..... true
(2088 octets: SRB2, DRB 1, DRB 2, whole masterCellGroup,
whole measConfig -- all restated absolutely)
12:18:03.688 [RRC-UL] rrcReconfigurationComplete txn 1
-- 247 ms of user-plane outage, for one unsupported SCellListing 8. The real cost of a refused reconfiguration: not a failure message but a re-establishment and a full reconfiguration. Note that SCell 3 was not added even though the UE supported it -- the message is applied whole or not at all -- and that reestablishmentCause is the only diagnostic the network ever receives.
18.4 Retrieving the RLF report the handover failure produced
11:03:02.118 [RRC-UL] rrcSetupComplete on SRB1
-- the UE indicates that an RLF report is available
11:03:02.204 [RRC-DL] ueInformationRequest txn 1 on SRB1
rlf-ReportReq ..................... true
rach-ReportReq .................... true
connEstFailReportReq .............. true
11:03:02.281 [RRC-UL] ueInformationResponse txn 1 on SRB1
rlf-Report
measResultLastServCell
rsrpResult ................... -118 dBm
rsrqResult ................... -19 dB
measResultNeighCells
[0] physCellId 118, rsrp ..... -96 dBm
c-RNTI ......................... 0x4601
previousPCellId ................ PCI 41
failedPCellId .................. PCI 118
connectionFailureType .......... hof
timeSinceFailure ............... 18 s
rach-Report
numberOfPreamblesSent .......... 3
contentionDetected ............. true
connEstFailReport ................ ABSENT
-- Read together: the target (PCI 118) was measured at -96 dBm, which is
-- fine, and three contention-based preambles collided. So the handover
-- decision was correct and the execution failed on contention -- which
-- points at the absent rach-ConfigDedicated of 18.2, not at coverage.
-- connEstFailReport is absent because there was no establishment failure,
-- not because the request was refused.Listing 9. The RLF and RACH reports together, and the conclusion they support. Either report alone would have been misleading.
18.5 UE assistance information, and the prohibit timer
13:44:19.006 [RRC-DL] rrcReconfiguration txn 2
nonCriticalExtension.otherConfig
overheatingAssistanceConfig = setup
overheatingIndicationProhibitTimer s30
releasePreferenceConfig-r16 = setup
releasePreferenceProhibitTimer s10
-- until this message, the UE was not permitted to send
-- either report at all
13:47:52.330 [RRC-UL] ueAssistanceInformation on SRB1
overheatingAssistance
reducedMaxCCs
reducedCCsDL ................. 1
reducedCCsUL ................. 1
reducedMaxMIMO-LayersFR1
reducedMIMO-LayersFR1-DL ..... 2
-- prohibit timer s30 starts; no repeat before 13:48:22
13:47:58.114 [UE internal] temperature still rising
-- a second report would be sent now, but the prohibit
-- timer suppresses it. The network sees nothing further.
13:48:05.900 [RRC-DL] rrcReconfiguration txn 3
sCellToReleaseList ................ { 3, 4 }
-- gNB honours the request: two SCells released
13:49:31.442 [RRC-UL] ueAssistanceInformation on SRB1
releasePreference
preferredRRC-State ............. inactive
-- a hint, not a request. The gNB may ignore it entirely.
13:49:31.610 [RRC-DL] rrcRelease txn 4
suspendConfig ..................... present
-- honoured: the UE goes to RRC_INACTIVEListing 10. The whole assistance loop: enable, report, prohibit, act. The suppressed second report at 13:47:58 is invisible to the network and reads exactly like the problem resolving itself.
19. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading procedures |
|---|---|---|
| Rel-15 | Every procedure in §3 to §13 in its base form: establishment, resume, release, re-establishment, reconfiguration, security mode, capability transfer, counter check, NAS transport, measurement reporting, mobility from NR | The baseline. Note that the uplink c1 message-type CHOICE is already full at sixteen entries. |
| Rel-16 | RRC segmentation in both directions | A capability response or a large reconfiguration can now arrive in pieces, and a reassembly gap is a new silent failure mode. |
| Rel-16 | UEInformationRequest / UEInformationResponse promoted into RRC, carrying RLF, RACH and connEstFail reports | The UE becomes a queryable diagnostic store (§12). Before this, the UE-side view of a failure was simply unavailable. |
| Rel-16 | conditionalReconfiguration: a whole RRCReconfiguration stored for later execution against measurement conditions | A reconfiguration can now be nested inside a reconfiguration, and the executing message never travels on the air at execution time. See the companion 25 Conditional HO and DAPS. |
| Rel-16 | DAPS handover: daps-Config per bearer, daps-SourceRelease | The UE keeps the source connection while establishing the target, so a handover reconfiguration no longer implies a clean break. |
| Rel-16 | MCGFailureInformation and T316 | An MCG radio problem reported over the SCG instead of declaring RLF -- a whole new recovery path with its own timer (§15). |
| Rel-16 | FailureInformation with failureInfoRLC-Bearer | A single-bearer RLC failure can be repaired with a reconfiguration instead of costing the connection (§16). |
| Rel-16 | UEAssistanceInformation extensions: idc-Assistance, drx-Preference, maxBW-Preference, maxCC-Preference, maxMIMO-LayerPreference, minSchedulingOffsetPreference, releasePreference | Seven new report types, each with its own enabling configuration and prohibit timer (§13.3). |
| Rel-16 | DedicatedSIBRequest, dedicatedSIB1-Delivery, LoggedMeasurementConfiguration | System information over dedicated signalling, so the absence of a broadcast SIB no longer implies the UE lacks it. |
| Rel-17 | SRB4 and MeasurementReportAppLayer for application-layer / QoE reporting | A fifth SRB with its own priority, carrying reports RRC does not interpret. |
| Rel-17 | Small Data Transmission from RRC_INACTIVE | A completed random access no longer implies a state transition or a resume procedure. See the companion 14 RRC States. |
| Rel-17 | SCG activation and deactivation; MUSIM release request; successful-handover reporting; NR positioning procedures | More procedures that produce no failure and no timer -- they simply change what the UE does. |
| Rel-18 | L1/L2-triggered mobility (LTM): cell switch executed by a MAC CE against candidates preconfigured by RRC | The most significant change to reconfiguration since Rel-15: a cell change with no RRC message at all at the execution point -- no RRCReconfiguration is sent. T304 does not apply. |
| Rel-18 | Network energy saving, network-controlled repeaters, AI/ML measurement reporting | New measConfig and otherConfig extensions, deeper in the nonCriticalExtension chain. |
Table 32. Procedure changes by release. Feature presence must be confirmed against the capability exchange, never inferred from a successful Complete -- see the companion 26 UE Capability.
20. Reading RRC Procedures in Logs: A Checklist
1. Pair every request with its response, or name the timer. RRC has no generic error message, so a missing response plus an expired timer is the error. §15 maps every procedure to its timer.
2. Match on message type *and* transaction identifier. There are only four identifier values, and a SecurityModeCommand and an RRCReconfiguration can legitimately share one (§2, and the companion 13 RRC Overview §10).
3. Read the SRB the answer arrived on. An answer to a CCCH request on SRB1 means a stored context was found and verified; an answer on SRB0 means it was not. This one check resolves most resume and re-establishment questions instantly (§9).
4. On every reconfiguration, decode the first octet first. In an RRCReconfiguration, two bits of transaction identifier, one CHOICE bit and five presence bits tell you what is in the message before you decode any content (§7.4).
5. Look for a synchronised reconfiguration before anything else. The presence of reconfigurationWithSync turns a configuration change into a cell change, starts T304, and means the Complete will arrive in a different cell (§7.3).
6. Check whether the message is absolute. fullConfig is one bit that changes the message from delta to absolute and costs a PDCP re-establishment on every bearer. In a routine reconfiguration it is a smell (§8.4).
7. For any list-based change, compute the resulting configuration. Release lists apply before add/modify lists, absent fields follow their Need codes, and a measId can vanish because the measObject it pointed at was removed. Do the §8.3 exercise on anything suspicious.
8. Check that bearer changes touch both halves. A DRB lives in radioBearerConfig and its RLC bearer lives in CellGroupConfig, and in a split gNB the two are authored by different nodes (§7.2).
9. Find the first non-zero integrity trailer on SRB1. The first non-zero MAC-I is where AS security actually took effect, regardless of what the SecurityModeComplete claims (§10).
10. When a UE never sends something, check whether it was enabled. UEAssistanceInformation report types need otherConfig; capability responses need a capabilityRequestFilter small enough to encode; RLF reports need somebody to ask (§11, §12, §13.3).
11. Ask for the reports. An RLF report a gNB does not request is gone forever, and no network-side logging replaces it (§12).
21. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
| Procedure | -- | A named message exchange in TS 38.331 with a trigger, a governing timer and a defined failure behaviour (§1). |
| Delta configuration | -- | The principle that an RRCReconfiguration describes the change from an assumed current configuration, not the configuration itself (§8). |
ToAddModList / ToReleaseList | -- | The add-or-modify and release list pair that expresses a delta on a collection. measConfig calls the second one ToRemoveList (§8.1). |
| Need code | Need M / N / R / S | An ASN.1 comment defining what absence of an optional field means: maintain, no action, release, or specified elsewhere (§8.2). |
| Cond X | Conditional presence | Presence is mandatory under condition X. Cond Setup means mandatory at creation and omissible at modification (§8.2). |
fullConfig | -- | A one-bit IE switching a reconfiguration from delta to absolute, at the cost of releasing and re-establishing every bearer (§8.4). |
reconfigurationWithSync | -- | The only IE that makes a UE change cell. Carries newUE-Identity, t304 and optionally a dedicated random access configuration (§7.3). |
masterCellGroup / secondaryCellGroup | -- | The two CellGroupConfig instances. Both carry RLC, MAC and PHY configuration; the master one lives in a Rel-15 non-critical extension (§7.1). |
rrc-TransactionIdentifier | -- | INTEGER (0..3). The whole of RRC's transaction state, echoed by the UE in a reply (§2). |
resumeMAC-I / shortMAC-I | -- | 16-bit truncated message authentication codes proving possession of an old key, used in resume and re-establishment requests respectively (§4, §6). |
establishmentCause / resumeCause / reestablishmentCause | -- | UE-asserted, unverified reasons for a CCCH request. The first has sixteen codepoints, the second sixteen, the third four (§3, §6). |
COUNT | -- | The 32-bit PDCP counter (HFN concatenated with the sequence number) that CounterCheck compares (§13.4). |
otherConfig | -- | The IE that enables each UEAssistanceInformation report type and sets its prohibit timer. Nothing is volunteered without it (§13.3). |
targetRAT-MessageContainer | -- | An OCTET STRING inside MobilityFromNRCommand holding a complete message from another RAT's RRC, opaque to NR decoders (§13.5). |
22. References
- 3GPP TS 38.331 -- NR RRC protocol specification. Clause 5.3.3 (connection establishment and
T300), 5.3.4 (AS security mode command), 5.3.5 (connection reconfiguration, including 5.3.5.3 the application order, 5.3.5.5 cell group configuration, 5.3.5.6 radio bearer configuration, and 5.3.5.11 full configuration), 5.3.6 (counter check), 5.3.7 (connection re-establishment), 5.3.8 (connection release), 5.3.13 (connection resume), 5.3.15 (RRCReject), 5.4.3 (mobility from NR), 5.5.2 (measurement configuration, including 5.5.2.4 measurement object removal), 5.6.1 (UE capability transfer), 5.7.4 (UE assistance information), 5.7.10 (UE information), 6.1 (Need codes and general IE conventions), 6.2.2 (message definitions), 6.3.2 (information elements), 7.1 (UE timers and constants), 9.2 (default configurations). - 3GPP TS 38.300 -- NR and NG-RAN overall description. Clause 9.2 (RRC procedures in the overall architecture, and the interaction with NGAP and XnAP).
- 3GPP TS 33.501 -- Security architecture and procedures for 5G System. Clause 6.7 (security mode command procedure and the protection asymmetry of §10), clause 6.9 (key handling at handover), clause 6.11 (RRC_INACTIVE security).
- 3GPP TS 38.323 -- PDCP specification. The
MAC-Ifield, the 9000-octet maximum SDU size that forces segmentation, and PDCP re-establishment and recovery -- whatreestablishPDCPandrecoverPDCPactually do. - 3GPP TS 38.322 -- RLC specification. RLC re-establishment, and the maximum retransmission condition that is one of the RLF triggers.
- 3GPP TS 38.321 -- NR MAC protocol specification. Clause 5.1 (random access, which every CCCH procedure runs first), and logical channel prioritisation, which the SRB priorities feed.
- 3GPP TS 38.473 / TS 38.463 / TS 38.423 / TS 38.413 -- F1AP, E1AP, XnAP and NGAP. RRC messages travel inside all four as opaque containers; see the companion 13 RRC Overview §12.
- 3GPP TS 36.331 -- E-UTRA RRC protocol specification. Needed to decode the
targetRAT-MessageContainerofMobilityFromNRCommand(§13.5). - ITU-T X.680 / X.691 -- ASN.1 notation and Packed Encoding Rules. The preamble bitmaps and extension additions of §7.4.
Companion documents in this set
- 13 RRC Overview -- the layer, the SRBs, unaligned PER, the full message catalogue, transaction correlation, segmentation and the CU/DU split.
- 14 RRC States -- the state machine,
suspendConfig, resume in depth, RAN Notification Areas and cell reselection. - 01 Registration Process -- steps 1 to 4 of §14 in their NAS context, message by message.
- 03 Random Access -- every CCCH procedure begins with a RACH, and the
rach-ConfigDedicatedof §7.3 is its contention-free form. - 09 LCP -- logical channel prioritisation, which is what the RLC bearer configuration of §7.2 feeds.
- 11 DRX --
mac-CellGroupConfig->drx-Config, and the DRX preferences of §13.3. - 16 RLM and RLF --
T310,T311,T301,shortMAC-I, and the contents of the RLF report that §12 retrieves. - 17 System Information --
UE-TimersAndConstants, where most of §15's timers are configured, and the UAC barring behindT390. - 20 Measurements and Events --
measConfigandMeasurementReportin full, including the event definitions behind the worked example of §8.3. - 21 Measurement Gaps and SMTC --
measGapConfigand thesmtcinreconfigurationWithSync. - 22-25 Handover family --
reconfigurationWithSyncin its mobility context, conditional reconfiguration and DAPS. - 26 UE Capability -- what
UECapabilityInformationcontains, why it needs segmentation, and why a capability bit is the only proof a feature is active. - 27 AS Security Mode -- the key hierarchy,
masterKeyUpdate, and the algorithms of §10.