RRC Overview in 5G NR
The control-plane brain of the air interface and the services it provides.
Every layer below RRC in the NR access stratum arrives at the UE unconfigured. PHY does not know which bandwidth part to use, MAC does not know which logical channels exist or what their priorities are, RLC does not know whether a bearer is acknowledged or unacknowledged mode, and PDCP does not know its sequence number length or whether to cipher. None of those layers has any way to ask. RRC is the single mechanism that tells them, and it is the only protocol in the access stratum with the authority to do so.
Contents
- 01What RRC Is For, and What Would Break Without It
- 02RRC's Responsibilities, and Which Document Covers Each
- 03RRC in the Control-Plane Stack
- 04Signalling Radio Bearers: SRB0 Through SRB4
- 05What PDCP Does to an RRC Message
- 06ASN.1 and Unaligned PER: Why RRC Is Encoded This Way
- 07Decoding Unaligned PER by Hand: RRCSetupRequest, Bit by Bit
- 08Extension Markers, Critical and Non-Critical Extensions
- 09The RRC Message Catalogue, by Direction and Logical Channel
- 10rrc-TransactionIdentifier and Request/Response Correlation
- 11RRC Segmentation, and Why Large Reconfigurations Need It
- 12RRC Across a Split gNB: F1AP, E1AP and What Each Log Shows
- 13RRC State, Registration State and Connection Management State
- 14The RRC Timer Landscape: an Index
- 15Failure Modes and What Each One Means
- 16Configuration and Structure Reference (ASN.1)
- 17Illustrative Message Traces
- 18Release Deltas: Rel-15 to Rel-18
- 19Reading RRC in Logs: A Checklist
- 20Glossary
- 21References
1. What RRC Is For, and What Would Break Without It
Every layer below RRC in the NR access stratum arrives at the UE unconfigured. PHY does not know which bandwidth part to use, MAC does not know which logical channels exist or what their priorities are, RLC does not know whether a bearer is acknowledged or unacknowledged mode, and PDCP does not know its sequence number length or whether to cipher. None of those layers has any way to ask. RRC is the single mechanism that tells them, and it is the only protocol in the access stratum with the authority to do so.
That gives RRC an unusual shape for a protocol. It is not a data transport -- it moves almost no bytes. It is a configuration language with a small transaction protocol wrapped around it. The bulk of TS 38.331 is not procedure text at all; it is roughly 800 pages of ASN.1 describing the configuration a gNB may hand a UE. The procedures that carry that configuration -- setup, reconfiguration, resume, release, re-establishment -- fit into a couple of dozen pages, and are the subject of the companion 15 RRC Procedures.
Three consequences follow, and all three show up in logs:
- RRC is bootstrap-critical. The very first RRC exchange happens before any security context exists, before the UE has a permanent identity, and before any bearer other than a transparent one exists. That is why SRB0 exists at all, and why it is the strange bearer it is (§4).
- RRC is version-critical. A Rel-15 UE and a Rel-18 gNB must interoperate on the very first message. The encoding rules and the extension conventions in §6 to §8 exist entirely to make that work, and when they fail they fail silently.
- RRC is where the NAS rides. The gNB never interprets a NAS message; it copies an octet string from an RRC IE into an NGAP IE and back. That relationship is what makes §13 confusing in practice -- two independent state machines, one carried inside the other.
The single most useful mental model for reading RRC in a gNB log: an RRC message is a delta against a configuration both sides believe they share. Almost nothing in RRCReconfiguration is absolute. If the two sides' beliefs diverge -- because a previous reconfiguration was lost, or because a re-establishment reset one side -- every subsequent message is interpreted against the wrong baseline and the symptoms appear several messages later, somewhere unrelated. The companion 15 RRC Procedures works a delta-configuration example through in full.
2. RRC's Responsibilities, and Which Document Covers Each
TS 38.300 clause 7 enumerates the functions. Rather than restate them, here is the same list with a pointer to where in this document set each one is treated in depth, because RRC is broad enough that no single document can carry all of it:
| Function | What RRC actually does | Messages involved | Covered in |
|---|---|---|---|
| Broadcast of system information | Encodes MIB and SIBs, schedules them, answers on-demand SI requests | MIB, SIB1, SystemInformation, RRCSystemInfoRequest | 17 System Information, 18 MIB and SIB1 IEs |
| Paging | Constructs the Paging message and its record list; distinguishes CN-initiated from RAN-initiated | Paging | 19 Paging |
| Connection control | Establish, suspend, resume, release, re-establish; activate security | RRCSetup*, RRCResume*, RRCRelease, RRCReestablishment*, SecurityModeCommand | 14 RRC States, 15 RRC Procedures, 27 AS Security Mode |
| Radio bearer management | Adds, modifies and releases SRBs and DRBs; hands PDCP/RLC/MAC their configuration | RRCReconfiguration carrying radioBearerConfig | 15 RRC Procedures, 09 LCP |
| Mobility | Configures measurements, receives reports, executes handover, configures conditional and DAPS variants | RRCReconfiguration with measConfig / reconfigurationWithSync, MeasurementReport, MobilityFromNRCommand | 20 Measurements and Events, 21 Measurement Gaps and SMTC, 22-25 Handover family |
| QoS management | Maps QoS flows to DRBs via SDAP configuration | RRCReconfiguration carrying sdap-Config | 09 LCP |
| Recovery from failure | Declares RLF, selects a cell, attempts re-establishment, stores and later surrenders an RLF report | RRCReestablishmentRequest, UEInformationRequest/Response | 16 RLM and RLF |
| UE capability transfer | Asks the UE what it supports, per RAT, and gates every optional feature on the answer | UECapabilityEnquiry, UECapabilityInformation | 26 UE Capability |
| NAS transport | Carries opaque NAS PDUs in both directions without interpreting them | DLInformationTransfer, ULInformationTransfer, plus piggybacking in RRCSetupComplete | 01 Registration Process, §13 here |
| UE assistance / power saving | Receives unsolicited UE preferences on DRX, bandwidth, overheating and release | UEAssistanceInformation | 11 DRX, 15 RRC Procedures |
| Detection of and recovery from radio problems | Configures RLM reference signals, N310/N311, T310 | RRCReconfiguration carrying radioLinkMonitoringConfig | 16 RLM and RLF |
Table 1. RRC functions per TS 38.300 cl. 7, with the companion document that carries each one. This document covers the layer, the encoding and the architecture; the state machine and the procedures have documents of their own.
3. RRC in the Control-Plane Stack
RRC is a layer-3 peer entity: one instance in the UE, one in the gNB-CU-CP. Below it, the control plane reuses exactly the same PDCP, RLC, MAC and PHY entities as the user plane -- with different configuration and, for one bearer, with layers missing.
Two differences from the user plane are worth stating explicitly, because both change what you can conclude from a log:
- There is no SDAP in the control plane. SDAP exists to map QoS flows onto DRBs. Signalling has no QoS flows, so an SRB starts at PDCP.
- RRC messages are never segmented by RLC in a way you can ignore. SRB1-4 run RLC-AM, so a long RRC message is segmented, retransmitted and reassembled below RRC and reaches RRC intact or not at all. But above RLC there is a hard ceiling: PDCP supports a maximum SDU size of 9000 octets TS 38.323, and an RRC message larger than that cannot be sent at all without the RRC-level segmentation of §11.
The logical channel identities differ between directions and this trips people up. On UL-SCH, CCCH appears at two LCIDs -- 52 for the 48-bit form and 0 for the 64-bit form (CCCH1, used only by RRCResumeRequest1) -- because the codepoint carries the length so the subheader needs no L field. On DL-SCH, CCCH is LCID 0 with an ordinary variable-length subheader, because a downlink RRCSetup has no fixed size. DCCH is LCID 1-4 in both directions. See the companion 07 MAC PDU and Control Elements for the full codepoint space.
4. Signalling Radio Bearers: SRB0 Through SRB4
There are five signalling radio bearers in NR and they are not variants of one thing -- each exists to solve a problem the others cannot. The ordering SRB0 -> SRB1 -> SRB2 is a security timeline: SRB0 is the bearer you use when you have nothing, SRB1 is the bearer that carries the transition into having something, and SRB2 is the bearer that exists only once you already have it. SRB3 and SRB4 are later additions with narrower jobs.
| SRB | Logical channel | RLC mode | Default priority | Security | What it carries |
|---|---|---|---|---|---|
| SRB0 | CCCH | TM -- no header, no SN, no ARQ | Highest; MAC serves CCCH ahead of any DCCH | None, ever. No PDCP entity exists. | RRCSetupRequest, RRCResumeRequest, RRCResumeRequest1, RRCReestablishmentRequest, RRCSystemInfoRequest up; RRCSetup, RRCReject down |
| SRB1 | DCCH, LCID 1 | AM | 1 | Integrity and ciphering from SecurityModeCommand onward; before that, plaintext with a zeroed MAC-I | Almost every RRC message, plus the first NAS messages before SRB2 exists (piggybacked in RRCSetupComplete, then in UL/DLInformationTransfer) |
| SRB2 | DCCH, LCID 2 | AM | 3 | Always protected. SRB2 is only ever configured after AS security activation. | NAS messages once it exists, and RRC messages carrying logged measurement information |
| SRB3 | DCCH, LCID 3 | AM | 1 | Protected with the SN's keys, not the MN's | RRC messages exchanged directly between the UE and the Secondary Node in NR-DC / EN-DC, bypassing the MN |
| SRB4 | DCCH, LCID 4 | AM | 5 | Protected | Application-layer (QoE) measurement reports -- MeasurementReportAppLayer. Rel-17. |
Table 2. The five SRBs. Priorities are the default logicalChannelConfig values in TS 38.331 cl. 9.2.1; a gNB may override them per bearer with logicalChannelConfig set to explicitValue.
4.1 Why SRB0 is built the way it is
SRB0 has to work when the UE has no C-RNTI, no security keys, no PDCP state and no configuration beyond what it read from SIB1. Every layer that would need per-UE state is therefore removed: no PDCP means no sequence number to synchronise and no key to have; RLC transparent mode means no header at all, so no reassembly state; and CCCH is a common channel, so no dedicated logical channel needs to have been configured. What is left is a bare octet string handed to MAC.
The cost is that SRB0 messages must be small and are unprotected. Small, because with no RLC segmentation a message must fit one transport block -- which is why RRCSetupRequest is exactly 48 bits and RRCResumeRequest1 exactly 64 (§7). Unprotected, because there is nothing to protect with -- which is why RRCReestablishmentRequest and the resume requests carry a shortMAC-I computed with the old key instead of relying on PDCP integrity (see the companion 16 RLM and RLF for how shortMAC-I is computed).
4.2 Why SRB2 exists at all
SRB1 could carry every NAS message. SRB2 exists for two reasons, and only the second is about security. The first is priority: NAS signalling is not latency-critical in the way RRC signalling is. A large NAS PDU on SRB1 would compete on equal terms with a MeasurementReport or an RRCReconfigurationComplete, and could delay a handover. Putting NAS on a lower-priority logical channel means logical channel prioritisation in MAC drains RRC first TS 38.321 cl. 5.4.3.1 -- see the companion 09 LCP. The second is a structural guarantee: because SRB2 is only ever configured after SecurityModeCommand, anything you see on SRB2 was, by construction, integrity-protected and ciphered. There is no plaintext-on-SRB2 case to reason about.
A gNB that configures SRB2 in the same RRCReconfiguration that first carries a masterKeyUpdate, or before SecurityModeComplete has been received, is violating TS 38.331 cl. 5.3.5.3. Compliant UEs reject the reconfiguration -- and because NR has no reconfiguration failure message, rejecting it means reverting and initiating re-establishment. The symptom is a connection that restarts immediately after security activation, with the DRBs never coming up -- which reads like a bearer problem and is actually an ordering problem. Check the message order before you check the bearer configuration.
4.3 SRB3 and the split-signalling case
In NR-DC the UE has two RRC-capable nodes: a Master Node and a Secondary Node. Most signalling goes through the MN, which embeds SN-originated RRC in an MN message. SRB3 short-circuits that: it is a DCCH terminated at the SN, so the SN can reconfigure its own cell group without an MN round trip. It is configured by the MN (srb3-ToRelease / the SN's RRCReconfiguration inside secondaryCellGroup) but keyed by the SN, and it may only carry a restricted subset of messages -- an SN cannot, for example, release the connection.
5. What PDCP Does to an RRC Message
On SRB1-4 the RRC PDU is a PDCP SDU. PDCP prepends a two-octet header carrying a 12-bit sequence number -- SRBs always use a 12-bit SN, there is no 18-bit option as there is for DRBs -- ciphers the data part, and appends a four-octet MAC-I computed over the header and the plaintext data TS 38.323 cl. 6.2.2.1.
An RRC message costs more on the wire than its PER encoding suggests. Take a 214-octet RRCReconfiguration on SRB1:
RRC PDU (unaligned PER, rounded up to octets) ...... 214 octets
PDCP header (4 R bits + 12-bit SN) ................. +2
PDCP MAC-I ......................................... +4
RLC-AM header (D/C, P, SI, 12-bit SN) .............. +2
MAC subheader (R/F/LCID + 2-octet L, since L > 255) . +3
----------------------------------------------------------
Bytes MAC must schedule ............................ 225 octets
That is 5.1% overhead, and it is why segmentation thresholds are expressed against the PDCP SDU size and not the RRC message size: the 9000-octet PDCP SDU limit is a limit on the RRC PDU, before any of the above is added.
MAC-I is present on an SRB from the very first PDU, even before integrity protection is configured -- TS 38.323 requires the field to be there and padded with zeros. A four-octet trailer of zeros on SRB1 in RRCSetupComplete is therefore correct, not a broken integrity computation. The first PDU with a non-zero MAC-I is SecurityModeComplete, and that is a useful landmark when you are trying to establish where security actually took effect.
6. ASN.1 and Unaligned PER: Why RRC Is Encoded This Way
RRC messages are defined in ASN.1 and encoded with unaligned Packed Encoding Rules ITU-T X.691, as mandated by TS 38.331 clause 8. Unaligned means exactly what it says: fields are packed bit-adjacent with no padding to octet boundaries, anywhere, ever. A 4-bit enumeration followed by a 39-bit bit string followed by a 2-bit choice index occupies 45 consecutive bits starting wherever the previous field ended.
The choice was not arbitrary. Compare the alternatives:
| Encoding | Size of a 48-bit message | Self-describing? | Why RRC does or does not use it |
|---|---|---|---|
| BER / DER | ~15-25 octets | Yes -- tag and length on every field | Rejected. The tag-length overhead per field is larger than most RRC fields. |
| Aligned PER | 8-10 octets | No -- needs the schema | Rejected. Padding to octet boundaries would push RRCSetupRequest past what a minimum-size MSG3 grant can carry. |
| Unaligned PER | exactly 6 octets | No -- needs the schema | Chosen. Minimum size, deterministic length for fixed-shape messages, and forward-compatible through open types (§8). |
| XER / JSON | hundreds of octets | Yes | Never considered for the air interface. Used only in some O-RAN and test-tool representations of the same structures. |
Table 3. Why unaligned PER. The RRCSetupRequest case is the binding constraint: it must fit inside MSG3, which the gNB sizes before it knows anything about the UE. See the companion 03 Random Access.
Three properties of unaligned PER decide everything about how you read RRC in a log:
- You cannot decode a byte without the schema. There is no tag, no length prefix on most fields, and no alignment to anchor on. A one-bit error in your assumed ASN.1 version shifts every subsequent field, and the result is usually a plausible-looking wrong answer rather than a decode failure.
- Field sizes are minimal, not natural. An
INTEGER (0..3)is two bits. AnENUMERATEDwith sixteen members and no extension marker is four bits. ACHOICEwith two alternatives costs one bit of index.OPTIONALfields cost one bit each in a preamble bitmap at the front of the enclosing SEQUENCE. - Extensibility is bought with open types. A field after an extension marker is encoded as a length-prefixed octet string, so a decoder that does not know the field can still skip exactly the right number of bytes. That is the whole mechanism of §8, and the length prefix is the only place in an RRC message where you get a free anchor.
The preamble bitmap is the field people forget. A SEQUENCE with n OPTIONAL or DEFAULT members starts with an n-bit bitmap saying which are present -- in declaration order, before any content. If you are hand-decoding an RRCReconfiguration, the first bits after the transaction identifier are not radioBearerConfig; they are the presence bits for radioBearerConfig, secondaryCellGroup, measConfig, lateNonCriticalExtension and nonCriticalExtension. Skip them and every offset afterwards is wrong.
7. Decoding Unaligned PER by Hand: RRCSetupRequest, Bit by Bit
RRCSetupRequest is the right message to learn on. It is the only RRC message with a genuinely fixed length -- 48 bits, always, by design so that the 48-bit CCCH LCID codepoint and the UE Contention Resolution Identity MAC CE both work -- and it exercises choice indices, bit strings, enumerations and padding in six octets.
UL-CCCH-Message ::= SEQUENCE {
message UL-CCCH-MessageType
}
UL-CCCH-MessageType ::= CHOICE {
c1 CHOICE {
rrcSetupRequest RRCSetupRequest,
rrcResumeRequest RRCResumeRequest,
rrcReestablishmentRequest RRCReestablishmentRequest,
rrcSystemInfoRequest RRCSystemInfoRequest
},
messageClassExtension SEQUENCE {}
}
RRCSetupRequest ::= SEQUENCE {
ue-Identity InitialUE-Identity,
establishmentCause EstablishmentCause,
spare BIT STRING (SIZE (1))
}
InitialUE-Identity ::= CHOICE {
ng-5G-S-TMSI-Part1 BIT STRING (SIZE (39)),
randomValue BIT STRING (SIZE (39))
}
EstablishmentCause ::= ENUMERATED {
emergency, highPriorityAccess, mt-Access, mo-Signalling,
mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, mps-PriorityAccess,
mcs-PriorityAccess, spare6, spare5, spare4, spare3, spare2, spare1
}Listing 1. Verbatim from TS 38.331 clause 6.2.2, apart from line breaks. Note that RRCSetupRequest has no extension marker -- that is deliberate and is what makes the 48-bit length permanent.
7.1 The bit budget
Adding up what unaligned PER charges for each field:
UL-CCCH-Message SEQUENCE, 1 mandatory member, no ext marker ..... 0 bits
UL-CCCH-MessageType CHOICE, 2 alternatives ...................... 1 bit
c1 CHOICE, 4 alternatives ....................................... 2 bits
RRCSetupRequest SEQUENCE, 3 mandatory members, no ext marker .... 0 bits
InitialUE-Identity CHOICE, 2 alternatives ....................... 1 bit
BIT STRING (SIZE (39)), fixed length -> no length determinant ... 39 bits
EstablishmentCause, 16 members, no ext marker ................... 4 bits
spare BIT STRING (SIZE (1)) ..................................... 1 bit
----------------------------------------------------------------------
Total ......................................................... 48 bits
Six octets exactly, with nothing wasted and nothing left over. That coincidence is not a coincidence: the message was designed backwards from six octets.
7.2 The bits themselves
RRCSetupRequest with randomValue = 0x3F2A19C4B7 and establishmentCause = mo-Signalling. Follow the colour boundaries and notice that not one of them lands on an octet boundary except by luck -- the 39-bit identity straddles five octets and the establishment cause straddles none.Reading it back out of the six octets 17 E5 43 38 96 E6:
Six octets on the wire: 17 E5 43 38 96 E6
bit 0 8 16 24 32 40 47
| | | | | | |
00010111 11100101 01000011 00111000 10010110 11100110
Field by field, in encoding order:
bits n field
-------- --- ------------------------------------------------------
0 1 UL-CCCH-MessageType CHOICE index = 0 -> c1
1 - 2 2 c1 CHOICE index = 0 -> rrcSetupRequest
3 1 InitialUE-Identity CHOICE index = 1 -> randomValue
4 - 42 39 randomValue = 0 0111 1110 0101 0100 0011 0011 1000
1001 0110 111 = 0x3F2A19C4B7
43 - 46 4 establishmentCause = 3 -> mo-Signalling
47 1 spare = 0
-------- --- ------------------------------------------------------
total 48 = 6 octets exactly, nothing left over
-- Sanity checks that catch a wrong-schema decode:
-- * total length is exactly 6 octets, no more, no less
-- * the spare bit is 0 (a 1 here means you are off by some bits)
-- * establishmentCause index 10..15 are spare6..spare1 and must not
-- appear from a compliant UEListing 2. Hand-decoding the six octets. The three sanity checks at the bottom are the practical value of this exercise: they tell you whether your bit offset is right without needing a decoder.
RRCResumeRequest1 is the same exercise at 64 bits, and the reason two resume messages exist is purely an encoding-length problem: RRCResumeRequest carries a 24-bit shortI-RNTI and fits in 48 bits, while RRCResumeRequest1 carries the 40-bit fullI-RNTI and does not. Two messages, two CCCH LCID codepoints, one underlying procedure. The companion 14 RRC States covers which one a UE picks and why.
8. Extension Markers, Critical and Non-Critical Extensions
A Rel-15 UE will be handed messages built by Rel-18 gNBs for the next decade. TS 38.331 handles this with three distinct mechanisms, and confusing them is the source of a whole class of interoperability bugs. All three appear in the same messages, and they behave differently on failure.
| Mechanism | Looks like | What an old decoder does | Failure mode |
|---|---|---|---|
Extension marker (...) | A ... inside a SEQUENCE, CHOICE or ENUMERATED | For a SEQUENCE: reads a 1-bit extension-present flag, then a count and length-prefixed open types it can skip. For an ENUMERATED: values beyond the marker are length-prefixed and recognisable as unknown. | None. This is the graceful path. |
Critical extension (criticalExtensions CHOICE) | Every message body is wrapped: criticalExtensions CHOICE { <name> <name>-IEs, criticalExtensionsFuture SEQUENCE {} } | If the CHOICE index selects criticalExtensionsFuture, the UE cannot interpret the body at all and must ignore the message per TS 38.331 cl. 10. | Message silently ignored. No response, no failure message. Looks like a lost message. |
Non-critical extension (nonCriticalExtension) | The last OPTIONAL field of every -IEs SEQUENCE, itself a SEQUENCE whose last field is another nonCriticalExtension | One presence bit. If set and the decoder does not know the extension SEQUENCE's contents, it uses the extension marker inside it to skip. | New field ignored, rest of the message applied. Behaviour degrades, nothing breaks. |
Table 4. The three forward-compatibility mechanisms in TS 38.331. Only the middle one loses the whole message, and it is the only one that produces no observable error.
8.1 The nonCriticalExtension chain
This is the idiom you will actually see in decoded logs, and it looks strange the first time. Each release appends its new fields inside a new nested SEQUENCE hung off the previous release's nonCriticalExtension, producing a chain that gets one level deeper every release:
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
}
RRCReconfiguration-v1540-IEs ::= SEQUENCE {
otherConfig-v1540 OtherConfig-v1540 OPTIONAL, -- Need M
nonCriticalExtension RRCReconfiguration-v1560-IEs OPTIONAL
}
-- ... and so on through v1560, v1610, v1640, v1650, v1660, v1700, ...Listing 3. Abridged from TS 38.331. Note where masterCellGroup lives: in the v1530 extension, not the base IEs. The most important IE in the message is one level down the chain because it was added after the base structure was frozen.
This is why a decoded RRCReconfiguration in a log shows masterCellGroup nested under nonCriticalExtension. It is not an extension in any meaningful sense -- every single reconfigurationWithSync in every deployed network uses it. The nesting depth is a fossil of when the field was standardised, nothing more. Do not read depth as importance.
8.2 What a Rel-15 UE does with a Rel-17 IE
Concretely: a Rel-18 gNB sends RRCReconfiguration containing a Rel-17 IE inside nonCriticalExtension -> ... -> RRCReconfiguration-v1700-IEs. A Rel-15 UE decodes the base IEs, reaches nonCriticalExtension, finds its presence bit set, and decodes as far as RRCReconfiguration-v1560-IEs -- the last version it knows. At that point it hits that SEQUENCE's own nonCriticalExtension presence bit, does not recognise the type, and uses the open-type length determinant to step over the remainder. It then applies everything it did understand and answers with RRCReconfigurationComplete. The gNB gets a success it must not over-interpret.
A successful RRCReconfigurationComplete does not mean the UE applied everything you sent. It means the UE applied everything it understood and found no contradiction. The only reliable way to know whether a Rel-17 feature is actually active is the UE capability exchange -- see the companion 26 UE Capability. Gating a feature on a successful reconfiguration instead of on a capability bit is a recurring root cause of "the feature is configured but nothing happens" tickets.
lateNonCriticalExtension is the odd sibling. It is an OCTET STRING rather than a typed SEQUENCE, and exists so a later release can add fields to an earlier release's structure -- a field that logically belongs in the v1530 block but was only invented in Rel-16 goes here. It is rare in practice and, being an octet string, will show up in a log as an undecoded blob unless your decoder has the inner schema.
9. The RRC Message Catalogue, by Direction and Logical Channel
Every RRC message belongs to exactly one of seven top-level PDU types, and the PDU type determines the logical channel, which determines the SRB, which determines the security treatment. Knowing which bucket a message is in tells you, without looking anything up, whether it can be ciphered, whether it can be segmented, and whether it can be lost silently.
| Top-level PDU | Direction | Channel | SRB | CHOICE width of c1 | Messages |
|---|---|---|---|---|---|
BCCH-BCH-Message | DL | BCCH -> BCH -> PBCH | -- | n/a (top-level CHOICE, 1 bit) | MIB only |
BCCH-DL-SCH-Message | DL | BCCH -> DL-SCH | -- | 1 bit | SIB1, SystemInformation (carrying SIB2..SIB25 and the posSIBs) |
PCCH-Message | DL | PCCH -> PCH -> DL-SCH | -- | 1 bit | Paging |
DL-CCCH-Message | DL | CCCH -> DL-SCH (LCID 0) | SRB0 | 2 bits | RRCReject, RRCSetup |
DL-DCCH-Message | DL | DCCH -> DL-SCH | SRB1/2/3/4 | 4 bits | RRCReconfiguration, RRCResume, RRCRelease, RRCReestablishment, SecurityModeCommand, DLInformationTransfer, UECapabilityEnquiry, CounterCheck, MobilityFromNRCommand, DLDedicatedMessageSegment, UEInformationRequest, DLInformationTransferMRDC, LoggedMeasurementConfiguration |
UL-CCCH-Message | UL | CCCH -> UL-SCH (LCID 52) | SRB0 | 2 bits | RRCSetupRequest, RRCResumeRequest, RRCReestablishmentRequest, RRCSystemInfoRequest |
UL-CCCH1-Message | UL | CCCH1 -> UL-SCH (LCID 0) | SRB0 | 2 bits | RRCResumeRequest1 -- separated purely because it is 64 bits, not 48 |
UL-DCCH-Message | UL | DCCH -> UL-SCH | SRB1/2/3/4 | 4 bits | MeasurementReport, RRCReconfigurationComplete, RRCSetupComplete, RRCReestablishmentComplete, RRCResumeComplete, SecurityModeComplete, SecurityModeFailure, ULInformationTransfer, LocationMeasurementIndication, UECapabilityInformation, CounterCheckResponse, UEAssistanceInformation, FailureInformation, ULInformationTransferMRDC, SCGFailureInformation, SCGFailureInformationEUTRA |
Table 5. The seven RRC PDU types, TS 38.331 cl. 6.2.1. The CHOICE width column is the number of bits the message-type index costs in unaligned PER, and it is the first thing you decode in any RRC PDU.
The c1 CHOICE in DL-DCCH-MessageType and UL-DCCH-MessageType is full -- sixteen alternatives, four bits, all consumed. Every message added since is reached through messageClassExtension -> c2, a second CHOICE layer:
| Direction | Reached via | Message | Release | Purpose |
|---|---|---|---|---|
| UL | c2 | ULDedicatedMessageSegment | Rel-16 | One segment of an oversized uplink RRC message (§11) |
| UL | c2 | DedicatedSIBRequest | Rel-16 | Ask for a specific SIB over dedicated signalling instead of on-demand broadcast |
| UL | c2 | MCGFailureInformation | Rel-16 | Report an MCG failure over the SCG leg instead of declaring RLF -- see the companion 16 RLM and RLF |
| UL | c2 | UEInformationResponse | Rel-16 | RLF report, connection establishment failure report, RA report, logged measurements |
| UL | c2 | SidelinkUEInformationNR | Rel-16 | NR sidelink resource interest |
| UL | c2 | ULInformationTransferIRAT | Rel-16 | Carries a V2X / inter-RAT container |
| UL | c2 | IABOtherInformation | Rel-16 | IAB-node-specific information (an IAB-MT is an RRC endpoint too) |
| UL | c2 | MBSInterestIndication | Rel-17 | Multicast/broadcast service interest |
| UL | c2 | UEPositioningAssistanceInfo | Rel-17 | UE Rx-Tx timing-error-group information for positioning |
| UL | c2 | MeasurementReportAppLayer | Rel-17 | The application-layer / QoE report that SRB4 exists to carry |
| DL | c1 slots 10-13 | DLDedicatedMessageSegment, UEInformationRequest, DLInformationTransferMRDC, LoggedMeasurementConfiguration | Rel-16 | The downlink c1 still had spare slots in Rel-16, so these did not need c2 |
Table 6. Messages beyond the first sixteen. The asymmetry is an accident of history: the uplink c1 filled up in Rel-15 and the downlink one did not, so uplink additions are one CHOICE layer deeper. Later Rel-17/18 additions continue in c2.
This asymmetry has a practical consequence for hand-decoding. The first four bits of a UL-DCCH-Message after the 1-bit top-level index are the c1 message-type index only if that top-level index selected c1. If the top-level index is 1 (messageClassExtension) you are in c2 and the message-type index has a different width. Decoders that assume c1 will read a Rel-16 UEInformationResponse as a garbled MeasurementReport.
10. rrc-TransactionIdentifier and Request/Response Correlation
RRC-TransactionIdentifier is an INTEGER (0..3) -- two bits, four values, and that is all the transaction state RRC has. The network picks a value for a downlink message that expects a reply; the UE echoes the same value in the reply. There is no sequence number, no timestamp and no nonce.
| Message | Carries a transaction id? | Consequence |
|---|---|---|
RRCSetup / RRCSetupComplete | Yes / Yes | Correlatable, though only one setup can be outstanding anyway |
RRCResume / RRCResumeComplete | Yes / Yes | Correlatable |
RRCReestablishment / RRCReestablishmentComplete | Yes / Yes | Correlatable |
RRCReconfiguration / RRCReconfigurationComplete | Yes / Yes | The important one. Several reconfigurations can be in flight; the id is the only thing tying a Complete to its Request. |
SecurityModeCommand / SecurityModeComplete / SecurityModeFailure | Yes / Yes / Yes | Correlatable, including the failure case |
UECapabilityEnquiry / UECapabilityInformation | Yes / Yes | Correlatable across a long, possibly segmented response |
CounterCheck / CounterCheckResponse | Yes / Yes | Correlatable |
UEInformationRequest / UEInformationResponse | Yes / Yes | Correlatable |
RRCRelease | Yes / (no reply exists) | The id is present but has nothing to correlate against |
DLInformationTransfer | Yes / (no reply exists) | Present. The uplink counterpart is not a reply. |
ULInformationTransfer | No | Cannot be correlated to a DLInformationTransfer. NAS does its own correlation, at NAS level, and RRC has no visibility of it. |
MeasurementReport | No | Unsolicited. Correlate by measId against the measConfig instead -- see the companion 20 Measurements and Events. |
UEAssistanceInformation, FailureInformation, SCGFailureInformation | No | All unsolicited UE-initiated messages. Nothing to echo. |
Table 7. Which messages carry rrc-TransactionIdentifier. The pattern is exact: network-initiated request/response pairs carry it, UE-initiated and unsolicited messages do not.
Four values is not many. A gNB that issues four reconfigurations without waiting for the corresponding Completes will reuse an identifier, and a delayed RRCReconfigurationComplete from the earlier transaction is then indistinguishable from the reply to the later one. TS 38.331 does not forbid multiple outstanding transactions, so this is legal and wrong at the same time. Symptom in a log: a reconfiguration that appears to complete, followed by behaviour matching the previous configuration. Well-behaved implementations serialise reconfigurations on a bearer and increment the id modulo 4.
One further correlation subtlety: the transaction identifier is scoped to the procedure, not to the SRB. A SecurityModeCommand with rrc-TransactionIdentifier = 1 and an RRCReconfiguration with rrc-TransactionIdentifier = 1 are unrelated transactions that happen to share a value, and both may be outstanding simultaneously. Match on message type and identifier, never on identifier alone.
11. RRC Segmentation, and Why Large Reconfigurations Need It
PDCP supports a maximum SDU size of 9000 octets. Until Rel-16, an RRC message larger than that simply could not be delivered. That was tolerable in Rel-15 and stopped being tolerable almost immediately, for two reasons pulling in the same direction:
- The capability response outgrew it. A UE supporting many bands, many band combinations, carrier aggregation, dual connectivity and several feature sets can encode tens of kilobytes into a single
UECapabilityInformation. The combinatorics are multiplicative, so this scales badly -- see the companion 26 UE Capability. - Reconfigurations outgrew it too. An
RRCReconfigurationcarrying asecondaryCellGroupwith many SCells, a largemeasConfigand areconfigurationWithSyncall in one message is routinely several kilobytes, and a full configuration for an NR-DC UE with dedicated SIB delivery can exceed the limit.
Rel-16 added a segmentation container in each direction: ULDedicatedMessageSegment and DLDedicatedMessageSegment. Both work the same way and both are ordinary RRC messages on SRB1, which is the key structural point -- the segments themselves get RLC-AM delivery guarantees, PDCP ciphering and integrity protection, exactly like any other RRC message.
UECapabilityInformation, and the failure variant. The failure is silent by construction: there is no negative acknowledgement for a reassembly gap, so the enquiring gNB sees only that no answer ever arrived.Encoded UECapabilityInformation = 12 418 octets, PDCP SDU limit 9000, implementation segment size 6144 octets:
segments needed = ceil(12418 / 6144) = 3
segment 0 ....... 6144 octets rrc-MessageSegmentType = notLastSegment
segment 1 ....... 6144 octets notLastSegment
segment 2 ....... 130 octets lastSegment
------------
12 418 octets, reassembled
Each segment then pays the per-message overhead of §5 -- three PDCP headers and three MAC-I fields instead of one, so about 18 extra octets. Negligible against 12 KB, but it does mean a segmented message consumes three transaction-free RRC messages' worth of scheduling opportunities rather than one.
| Aspect | Behaviour | Where it bites |
|---|---|---|
| Ordering | Segments are reassembled by segmentNumber, not by arrival order | RLC-AM already delivers in order on an SRB, so out-of-order segments should not occur; if they do, suspect two overlapping segmented transactions |
| Gap handling | A missing segmentNumber means every stored segment for that message is discarded | No error message exists. The procedure just never completes and the governing timer, if any, expires |
| Interleaving | Segments of two different messages must not be interleaved | A gNB that issues a second UECapabilityEnquiry while the first response is still segmenting can lose both |
| Capability gating | The UE indicates support for uplink RRC segmentation in its capabilities; downlink segmentation is likewise gated | A Rel-15 UE cannot segment. If its capability response would exceed 9000 octets it must instead reduce what it reports, which is a silent capability loss |
| Which messages | Only the dedicated-message containers exist. There is no segmentation for CCCH messages or for broadcast | An oversized SIB is a system-information problem with a different solution -- see the companion 17 System Information |
Table 8. RRC segmentation behaviour. Note the absence of any negative acknowledgement: every failure path here is silent.
The practical diagnostic: if a UECapabilityEnquiry is never answered and you can see uplink activity on SRB1 at roughly the right time, count the ULDedicatedMessageSegment messages and check for a gap in segmentNumber. A gap means reassembly was abandoned. An absence of segments altogether means the UE either did not support segmentation or did not need it, and the enquiry failed for some other reason.
12. RRC Across a Split gNB: F1AP, E1AP and What Each Log Shows
In a split deployment the RRC entity does not live in the same box as the radio. TS 38.401 clause 6 defines the split: a gNB-CU hosts RRC and PDCP, one or more gNB-DUs host RLC, MAC and PHY, and the CU is itself optionally split into a gNB-CU-CP (RRC and PDCP-C) and one or more gNB-CU-UPs (SDAP and PDCP-U). This is not an implementation detail you can ignore, because it decides which log file contains which half of the truth.
| Interface | Between | Protocol | Spec | What it carries of RRC |
|---|---|---|---|---|
| Uu | UE and gNB-DU | NR air interface | TS 38.2xx / 38.3xx | The actual RRC PDUs, inside PDCP inside RLC inside MAC |
| F1-C | gNB-DU and gNB-CU-CP | F1AP over SCTP | TS 38.473 | RRC PDUs as an opaque RRC-Container IE, plus the DU to CU RRC Information and CU to DU RRC Information containers |
| F1-U | gNB-DU and gNB-CU-UP | GTP-U over UDP | TS 38.425 | Nothing. User data and the NR user plane protocol only. |
| E1 | gNB-CU-CP and gNB-CU-UP | E1AP over SCTP | TS 38.463 | No RRC PDUs, but the consequences of RRC: PDCP and SDAP configuration, UP security keys and algorithms, DRB and QoS flow setup |
| Xn-C | gNB-CU-CP and a neighbour gNB | XnAP over SCTP | TS 38.423 | RRC containers during handover and context retrieval -- HandoverPreparationInformation, RETRIEVE UE CONTEXT |
| NG-C / N2 | gNB-CU-CP and AMF | NGAP over SCTP | TS 38.413 | NAS PDUs lifted out of RRC, plus the UE context |
Table 9. Where RRC appears on each interface. If you are looking for the contents of an RRC message and you only have an F1-U or NG-U capture, you are looking in the wrong place.
12.1 The F1AP RRC message transfer procedures
There are exactly three F1AP procedures whose job is to move an RRC message, plus two UE-context procedures that can carry one as a passenger TS 38.473 cl. 8.4, 8.3:
| F1AP message | Direction | Key IEs | When it is used |
|---|---|---|---|
| INITIAL UL RRC MESSAGE TRANSFER | DU -> CU-CP | gNB-DU UE F1AP ID, NR CGI, C-RNTI, RRC-Container, DU to CU RRC Information, SUL Access Indication | The first uplink RRC message from a UE the CU has never seen -- i.e. MSG3's CCCH SDU. This is the message that creates UE context at the CU. |
| UL RRC MESSAGE TRANSFER | DU -> CU-CP | gNB-CU UE F1AP ID, gNB-DU UE F1AP ID, SRB ID, RRC-Container | Every subsequent uplink RRC message. SRB ID says which SRB, so the CU knows which PDCP entity to hand the container to. |
| DL RRC MESSAGE TRANSFER | CU-CP -> DU | both F1AP IDs, SRB ID, RRC-Container, optionally old gNB-DU UE F1AP ID, Execute Duplication | Every downlink RRC message on an existing UE context. |
| UE CONTEXT SETUP REQUEST / RESPONSE | CU-CP -> DU / DU -> CU-CP | SRBs To Be Setup List, DRBs To Be Setup List, RRC-Container, DU To CU RRC Information | Creates the DU-side context. Can carry an RRC message so that context creation and the RRC message that depends on it are one round trip. |
| UE CONTEXT MODIFICATION REQUEST / RESPONSE | CU-CP -> DU / DU -> CU-CP | bearer add/mod/release lists, RRC-Container, Transmission Action Indicator | Bearer changes and handover execution. Usually carries the RRCReconfiguration that tells the UE about the same change. |
Table 10. F1AP procedures that carry RRC. The RRC-Container is always an opaque octet string to F1AP -- and on SRB1+ it is a PDCP PDU, not a decodable RRC PDU.
12.2 Who owns which part of the configuration
The division of labour inside masterCellGroup is the part that surprises people. The CU-CP owns the RRC message, but it does not author the lower-layer configuration inside it. The DU does, and the CU-CP copies it in verbatim:
| Configuration | Authored by | Travels as | Ends up in |
|---|---|---|---|
CellGroupConfig -- RLC bearers, MAC config, PHY config, SpCell and SCell configuration | gNB-DU | DU to CU RRC Information -> CellGroupConfig IE on F1AP | masterCellGroup (an OCTET STRING CONTAINING CellGroupConfig) inside RRCReconfiguration |
RadioBearerConfig -- SRB and DRB lists, PDCP and SDAP config, security config | gNB-CU-CP | authored directly in the RRC message; PDCP/SDAP parts mirrored to the CU-UP over E1AP | radioBearerConfig inside RRCReconfiguration |
MeasConfig -- measurement objects, report configs, gaps | gNB-CU-CP | authored directly; sent to the DU only as an opaque container | measConfig inside RRCReconfiguration |
| UE capability information | UE | CU to DU RRC Information -> UE-CapabilityRAT-ContainerList | Used by the DU to decide what lower-layer configuration is legal |
SecurityConfig -- algorithms and key set indicator | gNB-CU-CP | RRC message for the AS part; Security Information over E1AP for the UP part | securityConfig inside radioBearerConfig |
Table 11. Who authors what. A configuration mismatch between the CU's view and the DU's is possible and is the most annoying class of bug in a split gNB, because each side's log looks internally consistent.
This split is the reason for the single most common frustration in split-gNB log analysis: the DU log tells you *when* an RRC message was scheduled and how big it was; the CU-CP log tells you *what it said*. Neither alone is enough. Worse, the DU's timestamps are the ones that correlate with the radio events, while the CU's are the ones that correlate with the message content -- and the two clocks are not necessarily the same clock. Always establish the F1AP UE ID pair (gNB-CU UE F1AP ID, gNB-DU UE F1AP ID) early; it is the only identifier that appears in both logs for the same UE.
The C-RNTI appears in the INITIAL UL RRC MESSAGE TRANSFER and then never again on F1AP. After that, F1AP identifies the UE by the F1AP ID pair. If you try to follow a UE across a CU log by C-RNTI you will lose it at the second message, and if you try to follow it across a DU log by F1AP ID you will find it but with no message contents. Build the mapping once, from the initial transfer, and carry it.
13. RRC State, Registration State and Connection Management State
This is the classic confusion in the whole control plane, and it comes from the fact that there are three state machines, not one, in two different specifications, with names that partly overlap:
| State machine | Spec | Peer entities | States | What it is about |
|---|---|---|---|---|
| RRC state | TS 38.331 cl. 4.2.1 | UE and gNB | RRC_IDLE, RRC_INACTIVE, RRC_CONNECTED | Whether an AS-level connection and context exist, and who owns mobility |
| Registration management (RM) state | TS 24.501 cl. 5.1.2 / TS 23.501 cl. 5.3.2 | UE and AMF | 5GMM-DEREGISTERED, 5GMM-REGISTERED | Whether the UE is registered with a 5GC and has a 5G-GUTI |
| Connection management (CM) state | TS 24.501 cl. 5.1.3 / TS 23.501 cl. 5.3.3 | UE and AMF | 5GMM-IDLE, 5GMM-CONNECTED, and 5GMM-CONNECTED with RRC inactive indication | Whether a NAS signalling connection (N1) exists between UE and AMF |
Table 12. Three state machines. TS 23.501 calls the CM states CM-IDLE and CM-CONNECTED; TS 24.501 calls the same things 5GMM-IDLE and 5GMM-CONNECTED. They are the same states, differently named, which does not help.
The relationship between them is nearly one-to-one but not quite, and the gaps are where the confusion lives:
RRC_INACTIVE always implies a registered, CM-CONNECTED UE with a retained N2 association.- Connected does not imply registered. During initial registration the UE is
RRC_CONNECTEDand5GMM-DEREGISTEREDfor the whole time betweenRRCSetupCompleteandRegistration Accept. That is normal and it is where the companion 01 Registration Process starts. - Inactive implies CM-CONNECTED. From the AMF's point of view the UE never left; the N2 association and the UE context in the core are untouched. TS 24.501 names this
5GMM-CONNECTED with RRC inactive indication. This is why suspending a UE toRRC_INACTIVEgenerates no core-network signalling at all -- which is most of the point of the state. - Idle with CM-CONNECTED is a transient inconsistency, and it is real. After an RLF the UE goes to
RRC_IDLEimmediately; the AMF learns nothing until the gNB tells it. During that window the AMF will happily send downlink data that has nowhere to go. This is the window that paging exists to close -- see the companion 19 Paging. - Identities are per-state and per-layer. In
RRC_IDLEthe UE has no AS identity at all but retains a NAS 5G-GUTI. InRRC_INACTIVEit has an I-RNTI. InRRC_CONNECTEDit has a C-RNTI. The companion 14 RRC States has the full identity table.
The practical rule for log reading: an RRC state transition is a radio event; a 5GMM state transition is a core-network event; and neither implies the other in real time. If a trace shows the UE in RRC_IDLE and the AMF still believes it is CM-CONNECTED, that is not a bug in the trace -- it is the normal consequence of the two state machines being updated by different messages at different times. The reconciliation happens through NGAP UE CONTEXT RELEASE REQUEST from the gNB, and until that is sent the mismatch persists.
14. The RRC Timer Landscape: an Index
RRC's timers are scattered across the procedures they bound, and TS 38.331 clause 7.1 collects them. This is the index; each timer is treated where it does its work.
| Timer | Configured in | Values | Started by | Stopped by | On expiry | Covered in |
|---|---|---|---|---|---|---|
T300 | UE-TimersAndConstants (SIB1) | ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000 | Sending RRCSetupRequest | Receiving RRCSetup or RRCReject | Reset MAC, release resources, go to RRC_IDLE, log a connEstFailReport | 15 RRC Procedures |
T301 | UE-TimersAndConstants | same set as T300 | Sending RRCReestablishmentRequest | Receiving RRCReestablishment or RRCSetup | Go to RRC_IDLE with release cause RRC connection failure | 16 RLM and RLF |
T302 | RRCReject waitTime, 1-16 s | 1..16 seconds | Receiving RRCReject with a wait time | Cell reselection, or PLMN selection | Access is barred for that duration; the UE may not retry | 15 RRC Procedures |
T304 | ReconfigurationWithSync | ms50, ms100, ms150, ms200, ms500, ms1000, ms2000, ms10000 | Receiving RRCReconfiguration with reconfigurationWithSync | Successful random access at the target and RRCReconfigurationComplete | Handover failure -> revert to the source configuration and attempt re-establishment | 22-25 Handover family |
T310 | UE-TimersAndConstants | ms0, ms50, ms100, ms200, ms500, ms1000, ms2000 | N310 consecutive out-of-sync indications | N311 consecutive in-sync indications, or handover, or re-establishment | Radio Link Failure declared | 16 RLM and RLF |
T311 | UE-TimersAndConstants | ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000 | Initiating RRC re-establishment | Selecting a suitable cell and sending RRCReestablishmentRequest | Go to RRC_IDLE | 16 RLM and RLF |
T319 | UE-TimersAndConstants | same set as T300 | Sending RRCResumeRequest or RRCResumeRequest1 | Receiving RRCResume, RRCSetup, RRCRelease or RRCReject | Go to RRC_IDLE; the stored AS context is discarded | 14 RRC States |
T320 | RRCRelease cellReselectionPriorities, or SIB | min5, min10, min20, min30, min60, min120, min180 | Receiving dedicated cell reselection priorities | New dedicated priorities, or entering RRC_CONNECTED | Discard the dedicated priorities and revert to the broadcast ones | 14 RRC States |
T380 | SuspendConfig | min5, min10, min20, min30, min60, min120, min360, min720 | Entering RRC_INACTIVE | Leaving RRC_INACTIVE | Initiate a periodic RAN Notification Area Update | 14 RRC States |
T390 | UAC-BarringInfoSet uac-BarringTime | s4, s8, s16, s32, s64, s128, s256, s512, scaled by a random factor | A unified access control barring check failing for an access category | Barring being lifted for that category | Access attempts for that access category are allowed again | 17 System Information |
T316 | RLF-TimersAndConstants (Rel-16) | ms50, ms100, ms200, ms400, ms600, ms1000, ms1500, ms2000 | Sending MCGFailureInformation over the SCG | Receiving an RRCReconfiguration with reconfigurationWithSync, or RRCRelease | Declare full RLF and initiate re-establishment | 16 RLM and RLF |
T331 | MeasIdleConfig (Rel-16) | sec30 .. sec900 | Receiving an idle/inactive measurement configuration | Entering RRC_CONNECTED and reporting the results | Stop idle-mode measurement logging | 20 Measurements and Events |
Table 13. The RRC timers, TS 38.331 cl. 7.1. Values are the ASN.1 enumeration members; the configured value is per-cell in UE-TimersAndConstants in SIB1 unless stated otherwise. This table is an index -- each timer's real behaviour is in the companion document named in the last column.
T310 uniquely has a zero value, ms0. Configuring it means RLF is declared the instant N310 out-of-sync indications accumulate, with no recovery window at all. It exists for test purposes and appears in the field only by accident -- but when it does, the symptom is spectacular: perfectly healthy UEs declaring RLF on any brief fade. If you see mass re-establishment with no coverage explanation, check t310 in SIB1 before anything else.
15. Failure Modes and What Each One Means
RRC's failure modes are unusual in one specific way: most of them are silent. There is no general-purpose RRC error message. A UE that cannot make sense of a message discards it and says nothing, and the network learns only from the absence of the expected reply.
| Failure | Detected by | What the UE does | Observable as | Diagnostic pointer |
|---|---|---|---|---|
| PER decode fails -- the bit stream does not match the UE's ASN.1 | UE RRC | Discard the message. No response of any kind TS 38.331 cl. 10.4 | Nothing at all. The gNB's timer for the procedure expires. | Version skew between the gNB's encoder and the UE's decoder, or a corrupted container across F1AP. Compare the F1AP RRC-Container length against the CU's encoded length. |
criticalExtensions selects criticalExtensionsFuture | UE RRC | Ignore the whole message body | Nothing. Identical on the wire to a decode failure. | The gNB is using a critical extension the UE does not support. This is always a gNB bug or a capability-gating bug -- critical extensions must be gated on capability. |
| Unknown value in an extended ENUMERATED, or an unknown extension addition | UE RRC | Skip the unknown part using its open-type length, apply the rest | A successful Complete message that under-delivers | Not a failure. But it means the Complete does not prove the feature is active -- check capabilities (§8.2). |
| A mandatory field is absent, or a value is outside the range the UE supports | UE RRC | For RRCReconfiguration on SRB1: continue with the configuration used before the message and initiate re-establishment TS 38.331 cl. 5.3.5.8. On SRB3: send SCGFailureInformation with cause scg-reconfigFailure. | An RRCReestablishmentRequest, seconds after a reconfiguration that looked like it succeeded | There is no reconfiguration failure message in NR, so the re-establishment is the only evidence. Diff the configuration you sent against what the UE said it supports. |
| PDCP integrity check fails on an SRB | UE PDCP, not RRC | Discard the PDU and indicate the failure to upper layers; RRC does not see the message at all | Nothing at RRC level. Some implementations log a PDCP integrity failure counter. | Key mismatch (wrong nextHopChainingCount or keySetChangeIndicator) or a replay. See the companion 27 AS Security Mode. |
| Segment reassembly gap (§11) | Receiving RRC | Discard every stored segment for that message | Nothing. The segmented message never completes. | Count segmentNumber values. A gap is conclusive. |
| RRC message exceeds 9000 octets and segmentation is unsupported | Sending RRC / PDCP | The message cannot be sent. A UE must reduce what it reports instead. | A truncated or absent UECapabilityInformation | Check the UE's segmentation capability. A Rel-15 UE with a very large capability set is the classic case. |
rrc-TransactionIdentifier in a reply does not match any outstanding transaction | gNB RRC | Not the UE's problem; the UE echoed what it was given | A Complete the gNB cannot attribute | Identifier reuse with multiple outstanding transactions (§10). Serialise reconfigurations. |
| SRB2 or a DRB configured before AS security activation | UE RRC | Refuse the reconfiguration: revert and re-establish | A connection that restarts immediately after security activation | Message ordering, not bearer configuration (§4.2). |
F1AP RRC-Container delivered on the wrong SRB ID | gNB-CU-CP PDCP | Nothing -- the UE never sees a well-formed message | Silence, or a PDCP integrity failure if the SRB's keys differ | A split-gNB integration bug. The SRB ID IE is how the CU picks the PDCP entity; getting it wrong routes the PDU to the wrong deciphering context. |
Table 14. RRC failure modes. Most of these are invisible on the air. The only explicit negative responses anywhere in RRC are SecurityModeFailure, SCGFailureInformation and MCGFailureInformation -- a reconfiguration the UE cannot apply produces a re-establishment, not a failure message.
Because most RRC failures are silent, the primary diagnostic signal in RRC is a missing message, not an error message. Build your log reading around expected request/response pairs and their governing timers (§14): for every downlink message that expects a reply, either the reply arrives or a timer expires. The timer expiry is your error message. This is a genuinely different mindset from reading MAC or PHY logs, where failures announce themselves.
16. Configuration and Structure Reference (ASN.1)
16.1 SRB configuration
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
...
}
SRB-ToAddMod ::= SEQUENCE {
srb-Identity SRB-Identity, -- INTEGER (1..3)
reestablishPDCP ENUMERATED {true} OPTIONAL, -- Need N
discardOnPDCP ENUMERATED {true} OPTIONAL, -- Need N
pdcp-Config PDCP-Config OPTIONAL, -- Need M
...,
[[
srb-Identity-v1700 SRB-Identity-v1700 OPTIONAL -- Need N
]] -- Rel-17: adds SRB4
}
SecurityConfig ::= SEQUENCE {
securityAlgorithmConfig SecurityAlgorithmConfig OPTIONAL, -- Need M
keyToUse ENUMERATED {master, secondary}
OPTIONAL, -- Need M
...
}Listing 4. Abridged from TS 38.331. Two things worth noting: srb-Identity is INTEGER (1..3), so SRB4 had to be added by a Rel-17 extension addition group rather than by widening the range -- and there is no srb-ToReleaseList, because SRB1 and SRB2 are never released while the connection lives.
16.2 The extension idiom, in ASN.1
-- 1. Extension marker inside a SEQUENCE.
-- Costs one bit; everything after it is length-prefixed.
SomeConfig ::= SEQUENCE {
fieldA INTEGER (0..7),
..., -- extension marker
[[ -- extension addition group
fieldB-r16 INTEGER (0..15) OPTIONAL -- Need R
]],
[[
fieldC-r17 ENUMERATED {true} OPTIONAL -- Need R
]]
}
-- 2. Critical extension. If the decoder picks the Future branch it
-- cannot interpret the body at all.
SomeMessage ::= SEQUENCE {
rrc-TransactionIdentifier RRC-TransactionIdentifier,
criticalExtensions CHOICE {
someMessage SomeMessage-IEs,
criticalExtensionsFuture SEQUENCE {}
}
}
-- 3. Non-critical extension chain. Each release hangs its additions
-- off the previous release's nonCriticalExtension.
SomeMessage-IEs ::= SEQUENCE {
field1 Field1,
lateNonCriticalExtension OCTET STRING OPTIONAL,
nonCriticalExtension SomeMessage-v1610-IEs OPTIONAL
}
-- Need codes, TS 38.331 cl. 6.1:
-- Need M absent -> maintain the currently configured value
-- Need N absent -> no action; the field is a one-shot instruction
-- Need R absent -> release the corresponding configuration
-- Need S absent -> the value is specified elsewhereListing 5. The three mechanisms side by side, plus the Need codes -- which are the single most important annotation in TS 38.331 and are comments, not ASN.1. They define delta-configuration semantics; the companion 15 RRC Procedures works through what each one means in practice.
The Need codes are where delta configuration is actually specified, and they are the difference between "the field was absent so nothing changed" (Need M) and "the field was absent so the configuration was released" (Need R). Two IEs sitting next to each other in the same SEQUENCE can have different Need codes, so absence does not mean one thing -- it means whatever that field's comment says. Reading a reconfiguration without the Need codes in front of you is guesswork.
17. 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.
17.1 The same message at four layers
One RRCSetupRequest, seen as the DU's MAC sees it, as the DU's F1AP sees it, as the CU-CP's RRC sees it, and as a decoder sees it. All four views are the same six octets.
09:41:02.118 [DU MAC-UL] C-RNTI 0x4601 TB 8 octets
subheader R/F/LCID = 0/0/52 -- CCCH, 48 bits, no L field
SDU ...................... 17 E5 43 38 96 E6
-- RLC-TM: no header, so the SDU is the RLC PDU is the RRC PDU
09:41:02.119 [DU F1AP-TX] INITIAL UL RRC MESSAGE TRANSFER
gNB-DU UE F1AP ID ........ 41
NR CGI ................... plmn + nci (cell identity)
C-RNTI ................... 0x4601
RRC-Container ............ 17 E5 43 38 96 E6 -- 6 octets
DU to CU RRC Information
cellGroupConfig ........ (OCTET STRING, 118 octets)
SUL Access Indication .... absent
09:41:02.121 [CU-CP F1AP-RX] INITIAL UL RRC MESSAGE TRANSFER
-> allocate gNB-CU UE F1AP ID 1907
-> create UE context, bind (1907, 41)
-> hand RRC-Container to RRC as an SRB0 CCCH PDU
09:41:02.121 [CU-CP RRC] UL-CCCH-Message decoded
c1 = rrcSetupRequest
ue-Identity
randomValue .......... 0x3F2A19C4B7 -- 39 bits
establishmentCause ..... mo-Signalling
spare .................. 0
-- 48 bits consumed, 0 remaining: length check passesListing 6. The same six octets at four layers. Note that the F1AP RRC-Container here is byte-identical to the MAC SDU, because SRB0 has no PDCP. From RRCSetupComplete onward that stops being true.
17.2 A downlink reconfiguration, with the extension chain visible
09:41:02.284 [CU-CP RRC-DL] DL-DCCH-Message on SRB1, LCID 1
c1 = rrcReconfiguration
rrc-TransactionIdentifier ......... 1
criticalExtensions = rrcReconfiguration
radioBearerConfig
srb-ToAddModList
SRB-ToAddMod srb-Identity ... 2
drb-ToAddModList
DRB-ToAddMod
cnAssociation = sdap-Config
pdu-Session ............. 1
sdap-HeaderDL ........... present
sdap-HeaderUL ........... present
mappedQoS-FlowsToAdd .... { 1 }
drb-Identity ............... 1
pdcp-Config
drb discardTimer ....... ms100
pdcp-SN-SizeUL ..... len18bits
pdcp-SN-SizeDL ..... len18bits
t-Reordering ............ ms50
nonCriticalExtension -- v1530
masterCellGroup ................ (OCTET STRING, 214 octets)
dedicatedNAS-MessageList
[0] ......................... (NAS PDU, 96 octets)
nonCriticalExtension -- v1540
otherConfig-v1540
overheatingAssistanceConfig present
09:41:02.301 [CU-CP RRC-UL] UL-DCCH-Message on SRB1
c1 = rrcReconfigurationComplete
rrc-TransactionIdentifier ......... 1 -- matches
-- transaction 1 closedListing 7. masterCellGroup -- the largest and most important IE in the message -- sits two levels down the nonCriticalExtension chain, and otherConfig-v1540 one level below that. Depth here records standardisation history, not importance.
17.3 Two failures, one silent and one loud
10:07:55.402 [CU-CP RRC-DL] DL-DCCH-Message on SRB1
c1 = ueCapabilityEnquiry
rrc-TransactionIdentifier ......... 2
criticalExtensions = criticalExtensionsFuture
-- gNB encoded a critical extension this UE does not have
10:07:55.417 [UE RRC] DL-DCCH-Message received on SRB1, 4 octets
c1 index .......................... 6 -> ueCapabilityEnquiry
rrc-TransactionIdentifier ......... 2
criticalExtensions CHOICE index ... 1 -> criticalExtensionsFuture
-- TS 38.331 cl. 10: message not comprehended -> ignore it
-- no response is generated, and no failure is reported
10:07:55.417 ... nothing on SRB1 in either direction ...
10:08:00.402 [CU-CP RRC] no UECapabilityInformation for transaction 2
-- gNB-internal guard timer expired after 5000 ms
-- gNB proceeds with a default capability assumption
-- Contrast with a refused configuration, on a different procedure:
10:12:31.884 [CU-CP RRC-DL] rrcReconfiguration txn 3
radioBearerConfig -> drb-ToAddModList -> DRB 2
pdcp-Config -> drb -> pdcp-SN-SizeUL len18bits
10:12:31.902 [UE RRC] cannot comply: 18-bit UL SN is not supported
on this band combination
-> continue with the configuration in force before txn 3
-> initiate re-establishment (TS 38.331 cl. 5.3.5.8)
10:12:31.903 [UE RRC-UL] rrcReestablishmentRequest on SRB0
reestablishmentCause reconfigurationFailure
-- there is NO RRCReconfigurationFailure message in NR.
-- The re-establishment IS the error report, and the cause
-- field is the only hint you get.Listing 8. Two failure paths for comparison. The first produces nothing observable at all; the second produces a re-establishment in some cell, with reestablishmentCause = reconfigurationFailure as the only clue. Neither tells you which field was the problem.
17.4 A segmented uplink capability response
10:22:14.006 [CU-CP RRC-DL] ueCapabilityEnquiry txn 0
ue-CapabilityRAT-RequestList
[0] rat-Type ............ nr
[1] rat-Type ............ eutra-nr
[2] rat-Type ............ eutra
10:22:14.188 [UE RRC] encoded UECapabilityInformation = 12418 octets
-- exceeds the 9000-octet PDCP SDU limit
-- ul-RRC-Segmentation supported -> segment at 6144 octets
10:22:14.190 [RRC-UL] ulDedicatedMessageSegment (c2, Rel-16)
segmentNumber ..................... 0
rrc-MessageSegmentType ............ notLastSegment
rrc-MessageSegmentContainer ....... 6144 octets
10:22:14.226 [RRC-UL] ulDedicatedMessageSegment
segmentNumber ..................... 1
rrc-MessageSegmentType ............ notLastSegment
rrc-MessageSegmentContainer ....... 6144 octets
10:22:14.241 [RRC-UL] ulDedicatedMessageSegment
segmentNumber ..................... 2
rrc-MessageSegmentType ............ lastSegment
rrc-MessageSegmentContainer ....... 130 octets
10:22:14.242 [CU-CP RRC] reassembled 6144+6144+130 = 12418 octets
PER-decode as UL-DCCH -> c1? no -> messageClassExtension
-> c2 -> ueCapabilityInformation
rrc-TransactionIdentifier ......... 0 -- matches the enquiry
ue-CapabilityRAT-ContainerList ..... 3 containersListing 9. A three-segment capability response. The transaction identifier lives in the reassembled message, not in the segments -- so until reassembly completes there is nothing to correlate the segments against, which is why interleaving two segmented messages is unrecoverable.
17.5 The RRC / NAS state mismatch after RLF
11:03:47.551 [UE RRC] T310 expired -> Radio Link Failure declared
RRC state ......... RRC_CONNECTED -> (re-establishment)
5GMM state ........ 5GMM-REGISTERED, 5GMM-CONNECTED (unchanged)
11:03:47.551 [UE RRC] T311 started (ms10000), cell selection begins
11:03:47.560 [CU-CP] UE 1907: no uplink for 9 ms; RLC max retx not yet hit
-- the gNB does not yet know anything is wrong
11:03:47.560 [AMF] UE is CM-CONNECTED; downlink NAS may still be sent
11:03:52.118 [UE RRC] T311 expired, no suitable cell found
-> to RRC_IDLE, release cause = rrc-Connection-Failure
-> RLF report stored for later retrieval
5GMM state ........ still 5GMM-REGISTERED, 5GMM-CONNECTED
11:03:54.900 [CU-CP] RLC max retransmissions on SRB1 -> UE unreachable
11:03:54.901 [CU-CP] NGAP UE CONTEXT RELEASE REQUEST, cause = radio
connection with UE lost
11:03:54.930 [AMF] NGAP UE CONTEXT RELEASE COMMAND
-- AMF now moves the UE to CM-IDLE. Mismatch window: ~7.4 s
11:04:09.220 [UE RRC] RRCSetupRequest, establishmentCause mo-Signalling
(NAS Service Request follows in RRCSetupComplete)Listing 10. Seven and a half seconds during which the UE is in RRC_IDLE and the AMF believes it is CM-CONNECTED. Downlink data arriving in that window is buffered or discarded with no indication to anyone. This is a normal consequence of two state machines, not a fault.
18. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading RRC |
|---|---|---|
| Rel-15 | The whole baseline: three RRC states, SRB0-3, unaligned PER, the critical / non-critical extension idiom, F1AP and E1AP splits | Everything in §3 to §10 and §12 is Rel-15. The c1 CHOICEs in both DCCH directions are already full. |
| Rel-16 | RRC segmentation in both directions (UL/DLDedicatedMessageSegment) | An RRC message can now arrive in pieces, and a reassembly gap is a new silent failure mode (§11). |
| Rel-16 | UEInformationRequest / UEInformationResponse promoted into RRC proper, carrying RLF, connEstFail and RA reports | The UE is now a queryable diagnostic store. See the companion 16 RLM and RLF. |
| Rel-16 | MCGFailureInformation, T316 -- report an MCG failure over the SCG instead of declaring RLF | An MCG radio problem no longer necessarily means re-establishment. |
| Rel-16 | DedicatedSIBRequest, dedicatedSIB1-Delivery, LoggedMeasurementConfiguration | System information can now reach a UE over dedicated signalling, so absence of a broadcast SIB no longer implies the UE lacks it. |
| Rel-16 | IAB: IABOtherInformation; NR-U; NR sidelink (SidelinkUEInformationNR) | New RRC endpoints that are not handsets. An IAB-MT runs the same RRC state machine. |
| Rel-17 | SRB4 and MeasurementReportAppLayer for application-layer / QoE measurement collection | A fifth SRB, and srb-Identity had to be extended by an addition group to express it (§16.1). |
| Rel-17 | Small Data Transmission -- RRC and user data from RRC_INACTIVE without transitioning to RRC_CONNECTED | A completed uplink transmission no longer implies a state change. See the companion 14 RRC States. |
| Rel-17 | MBSInterestIndication, UEPositioningAssistanceInfo, NTN and RedCap configuration throughout | More c2 messages. A decoder that only knows c1 will mis-decode them (§9). |
| Rel-17 | Extended T304 and NTN-specific timing; multi-SIM (MUSIM) release and paging assistance | The UE may now legitimately ask to be released so it can serve another SIM -- a release with no radio cause at all. |
| Rel-18 | L1/L2-triggered mobility (LTM): cell switch executed by a MAC CE against an RRC-preconfigured candidate | A mobility event can now occur with no RRC message at the execution point. Absence of RRCReconfiguration is no longer evidence of no handover. |
| Rel-18 | Network energy saving, network-controlled repeaters, further AI/ML measurement reporting | New measConfig and otherConfig extensions deeper in the nonCriticalExtension chain. |
Table 15. RRC changes by release. Feature presence must always be confirmed against the capability exchange rather than inferred from a successful reconfiguration -- see the companion 26 UE Capability.
19. Reading RRC in Logs: A Checklist
1. Establish which log you are holding. A DU log has timing, sizes and scheduling but no RRC message bodies once security is on. A CU-CP log has bodies but timestamps that do not line up with radio events. Decide which question you are answering before you start reading (§12).
2. Build the identifier map first. From the INITIAL UL RRC MESSAGE TRANSFER, record the (gNB-CU UE F1AP ID, gNB-DU UE F1AP ID, C-RNTI) triple. The C-RNTI disappears from F1AP after that message; the F1AP ID pair is the only identifier present in both logs.
3. Read the SRB, not just the message. SRB0 means no security and a message you can decode in full anywhere. SRB1 means the container is a PDCP PDU. SRB2 means the message is NAS and, by construction, was protected. SRB3 means the SN's keys, not the MN's (§4).
4. Check the integrity trailer at the security boundary. A zeroed MAC-I before SecurityModeComplete is correct. The first non-zero one is your landmark for where AS security actually took effect (§5).
5. Match every request to its response by transaction identifier *and* message type. There are only four rrc-TransactionIdentifier values. If a Complete cannot be attributed, look for identifier reuse across multiple outstanding transactions -- there are only four values (§10).
6. When a reply is missing, name the timer. RRC has no general error message, so a missing reply plus an expired timer is the error. Use the index in §14 to find which timer bounds the procedure you are watching.
7. Distinguish the three silent failures. A PER decode failure, a criticalExtensionsFuture selection and a segment reassembly gap all look identical from outside: nothing happens. Tell them apart by checking (a) the container length against the encoder's, (b) the criticalExtensions CHOICE index in the encoded message, (c) the segmentNumber sequence (§15).
8. Do not read a successful Complete as full compliance. The UE applied what it understood. Check the capability exchange before concluding a Rel-16 or Rel-17 feature is active (§8.2).
9. Read extension depth as history, not importance. masterCellGroup sits two levels down inside nonCriticalExtension and is the most important IE in the message (§8.1).
10. Keep the RRC and 5GMM state machines in separate columns. An RRC_IDLE UE that the AMF still believes is CM-CONNECTED is normal for several seconds after an RLF. Do not chase it as a bug (§13).
20. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
| RRC | Radio Resource Control | The layer-3 control protocol of TS 38.331; the only entity with the authority to configure PDCP, RLC, MAC and PHY in the UE. |
| SRB | Signalling Radio Bearer | A radio bearer carrying RRC and/or NAS signalling. Five exist: SRB0-4 (§4). |
| DRB | Data Radio Bearer | A radio bearer carrying user data. Drawn in §3 only to show where the control plane diverges. |
| CCCH / DCCH | Common / Dedicated Control Channel | The logical channels SRB0 and SRB1-4 map to. CCCH is common (no dedicated identity needed), DCCH is per-UE. |
| PER | Packed Encoding Rules | The ASN.1 encoding rules RRC uses, in the unaligned variant: no padding to octet boundaries anywhere (§6). |
| Open type | -- | A length-prefixed encoding used for anything after an extension marker, so an old decoder can skip exactly the right number of bytes (§6, §8). |
| Extension marker | ... in ASN.1 | Marks a SEQUENCE, CHOICE or ENUMERATED as extensible. Costs one bit and buys forward compatibility. |
| Critical extension | criticalExtensions CHOICE | A version break. Selecting criticalExtensionsFuture means the receiver must ignore the whole message, silently (§8). |
| Non-critical extension | nonCriticalExtension | A per-release nested SEQUENCE appended to a message. Skippable, so old receivers degrade rather than fail (§8.1). |
| Need code | Need M / N / R / S | The ASN.1 comment that defines what absence of an OPTIONAL field means: maintain, no action, release, or specified elsewhere (§16.2). |
MAC-I | Message Authentication Code for Integrity | A 32-bit PDCP trailer on every SRB PDU; zeroed until integrity protection is configured (§5). |
rrc-TransactionIdentifier | -- | INTEGER (0..3). The entirety of RRC's transaction state; echoed by the UE in a reply (§10). |
| gNB-CU / gNB-DU | Central Unit / Distributed Unit | The TS 38.401 functional split. RRC and PDCP in the CU, RLC/MAC/PHY in the DU (§12). |
| CU-CP / CU-UP | Central Unit Control Plane / User Plane | The further split of the CU. RRC and PDCP-C in the CP, SDAP and PDCP-U in the UP, joined by E1. |
RRC-Container | -- | The F1AP and XnAP IE that carries an RRC PDU as an opaque octet string. On SRB1+ its contents are a PDCP PDU, not a decodable RRC PDU. |
| 5GMM | 5G Mobility Management | The NAS protocol of TS 24.501 and its two state machines: registration management and connection management (§13). |
| I-RNTI / C-RNTI | Inactive / Cell RNTI | The AS identities held in RRC_INACTIVE and RRC_CONNECTED respectively. See the companion 14 RRC States. |
21. References
- 3GPP TS 38.331 -- NR Radio Resource Control (RRC) protocol specification. Clause 4.2.1 (RRC states), 4.2.2 (signalling radio bearers), 6.1 (general and the Need codes), 6.2.1 (message class definitions and the seven PDU types), 6.2.2 (message definitions, including
RRCSetupRequestandRRCReconfiguration), 6.3.2 (RadioBearerConfig,SRB-ToAddMod,SecurityConfig), 7.1 (UE timers and constants), 8 (protocol data units and encoding), 9.2.1 (default SRB configurations), 10 (handling of unknown, unforeseen and erroneous protocol data). - 3GPP TS 38.300 -- NR and NG-RAN overall description. Clause 7 (RRC functions and states), clause 6 (protocol stack and bearers).
- 3GPP TS 38.323 -- PDCP specification. Clause 6.2.2.1 (Control plane PDCP Data PDU format), clause 6.3.4 (
MAC-I), and the maximum supported PDCP SDU size. - 3GPP TS 38.322 -- RLC specification. Transparent mode (used by SRB0) and acknowledged mode (used by SRB1-4).
- 3GPP TS 38.321 -- MAC specification. Clause 5.4.3.1 (logical channel prioritisation, which is what SRB priorities feed), Tables 6.2.1-1 and 6.2.1-2 (LCID codepoints for DL-SCH and UL-SCH).
- 3GPP TS 38.401 -- NG-RAN architecture description. Clause 6 (functional split, F1 and E1, and the RRC message transfer flows).
- 3GPP TS 38.473 -- F1 application protocol (F1AP). Clause 8.3 (UE context management) and clause 8.4 (RRC message transfer).
- 3GPP TS 38.463 -- E1 application protocol (E1AP). Bearer context management.
- 3GPP TS 38.413 -- NG application protocol (NGAP). NAS transport and UE context release.
- 3GPP TS 38.423 -- Xn application protocol (XnAP). RRC containers during handover and UE context retrieval.
- 3GPP TS 24.501 -- Non-Access-Stratum (NAS) protocol for 5G System. Clause 5.1.2 (registration management states), 5.1.3 (connection management states, including
5GMM-CONNECTED with RRC inactive indication). - 3GPP TS 23.501 -- System architecture for the 5G System. Clause 5.3.2 and 5.3.3 (RM and CM states, under the CM-IDLE / CM-CONNECTED naming).
- ITU-T X.680 / X.691 -- ASN.1 notation and Packed Encoding Rules. X.691 is the normative definition of unaligned PER, including open types, length determinants and extension additions.
Companion documents in this set
- 14 RRC States -- the state machine this document only sketches: every state in depth, every transition,
suspendConfig, RAN notification areas and context fetch over Xn. - 15 RRC Procedures -- the procedure-by-procedure reference, including delta configuration worked through with add/mod/release lists.
- 01 Registration Process -- what the NAS payload inside
RRCSetupCompletegoes on to do, and the security activation timeline SRB0 -> SRB1 -> SRB2 mirrors. - 06 Channel Mapping -- the CCCH / DCCH / DTCH to transport channel chain below the stack in §3.
- 07 MAC PDU and Control Elements -- the LCID codepoint space and the subheader shapes that carry CCCH and DCCH.
- 09 LCP -- logical channel prioritisation, which is what the SRB priorities in §4 actually feed.
- 16 RLM and RLF --
shortMAC-I, re-establishment, and the RLF report thatUEInformationRequestretrieves. - 17 System Information / 18 MIB and SIB1 IEs -- the broadcast side of RRC, including
UE-TimersAndConstantsand the UAC barring configuration behindT390. - 19 Paging -- how the network reaches a UE in the states where RRC has no dedicated channel to it.
- 20 Measurements and Events --
measConfigandMeasurementReport, the largest single consumer ofRRCReconfiguration. - 22-25 Handover family --
reconfigurationWithSync,T304, and the Xn and NG signalling that wraps them. - 26 UE Capability -- why
UECapabilityInformationneeds segmentation, and why a capability bit is the only reliable proof a feature is active. - 27 AS Security Mode --
SecurityModeCommand, the keys behind theMAC-Iin §5, and whatkeyToUseselects.