>
Home5G NRRRC — Radio Resource ControlRRC Overview
🗂️ RRC — Radio Resource ControlBeginner

RRC Overview in 5G NR

The control-plane brain of the air interface and the services it provides.

📚 3GPP-basedTS 38.331

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
  1. 01What RRC Is For, and What Would Break Without It
  2. 02RRC's Responsibilities, and Which Document Covers Each
  3. 03RRC in the Control-Plane Stack
  4. 04Signalling Radio Bearers: SRB0 Through SRB4
  5. 05What PDCP Does to an RRC Message
  6. 06ASN.1 and Unaligned PER: Why RRC Is Encoded This Way
  7. 07Decoding Unaligned PER by Hand: RRCSetupRequest, Bit by Bit
  8. 08Extension Markers, Critical and Non-Critical Extensions
  9. 09The RRC Message Catalogue, by Direction and Logical Channel
  10. 10rrc-TransactionIdentifier and Request/Response Correlation
  11. 11RRC Segmentation, and Why Large Reconfigurations Need It
  12. 12RRC Across a Split gNB: F1AP, E1AP and What Each Log Shows
  13. 13RRC State, Registration State and Connection Management State
  14. 14The RRC Timer Landscape: an Index
  15. 15Failure Modes and What Each One Means
  16. 16Configuration and Structure Reference (ASN.1)
  17. 17Illustrative Message Traces
  18. 18Release Deltas: Rel-15 to Rel-18
  19. 19Reading RRC in Logs: A Checklist
  20. 20Glossary
  21. 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.
💡
Key Point

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:

FunctionWhat RRC actually doesMessages involvedCovered in
Broadcast of system informationEncodes MIB and SIBs, schedules them, answers on-demand SI requestsMIB, SIB1, SystemInformation, RRCSystemInfoRequest17 System Information, 18 MIB and SIB1 IEs
PagingConstructs the Paging message and its record list; distinguishes CN-initiated from RAN-initiated
Paging
19 Paging
Connection controlEstablish, suspend, resume, release, re-establish; activate securityRRCSetup*, RRCResume*, RRCRelease, RRCReestablishment*, SecurityModeCommand14 RRC States, 15 RRC Procedures, 27 AS Security Mode
Radio bearer managementAdds, modifies and releases SRBs and DRBs; hands PDCP/RLC/MAC their configurationRRCReconfiguration carrying radioBearerConfig15 RRC Procedures, 09 LCP
MobilityConfigures measurements, receives reports, executes handover, configures conditional and DAPS variantsRRCReconfiguration with measConfig / reconfigurationWithSync, MeasurementReport, MobilityFromNRCommand20 Measurements and Events, 21 Measurement Gaps and SMTC, 22-25 Handover family
QoS managementMaps QoS flows to DRBs via SDAP configurationRRCReconfiguration carrying sdap-Config09 LCP
Recovery from failureDeclares RLF, selects a cell, attempts re-establishment, stores and later surrenders an RLF reportRRCReestablishmentRequest, UEInformationRequest/Response16 RLM and RLF
UE capability transferAsks the UE what it supports, per RAT, and gates every optional feature on the answerUECapabilityEnquiry, UECapabilityInformation26 UE Capability
NAS transportCarries opaque NAS PDUs in both directions without interpreting themDLInformationTransfer, ULInformationTransfer, plus piggybacking in RRCSetupComplete01 Registration Process, §13 here
UE assistance / power savingReceives unsolicited UE preferences on DRX, bandwidth, overheating and release
UEAssistanceInformation
11 DRX, 15 RRC Procedures
Detection of and recovery from radio problemsConfigures RLM reference signals, N310/N311, T310RRCReconfiguration carrying radioLinkMonitoringConfig16 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.

RRC in the control planeRRC in the Control Plane, and What Carries It Down to the AirSRB0 is the only bearer with no PDCP entity at all -- that single fact explains most of what followsNASAS layer 3Radio bearersPDCPRLCLogical channelsMAC / PHYNASUE <-> AMF, transparent to the gNBIP / applicationUE <-> data networkRRCTS 38.331 -- this documentSDAPQoS flow -> DRB mappingSRB0no securitySRB1RRC + NASSRB2NAS onlySRB3 / 4SN / assistanceDRB 1 .. nuser dataPDCP-C12-bit SN, integrity + ciphering, 32-bit MAC-IPDCP-Uciphering, ROHC/EHC, reorderingRLC-TMno headerRLC-AMARQ, in-order delivery, t-ReassemblyRLC-AM or UMper-DRB choiceCCCHLCID 52 / 0DCCHLCID 1 .. 4DTCHLCID 5 .. 32MAC -> PHY (UL-SCH / DL-SCH -> PUSCH / PDSCH)carried inside RRCThe left half of this diagram is the control plane; the right half is drawn only to show where it diverges. SRB0 skips PDCPentirely and uses RLC transparent mode, so it has no sequence number, no ARQ and no security -- see the companion06 Channel Mapping document for the channel chain below MAC.
Figure 1. The control-plane chain. The asymmetry that matters is SRB0's: it has no PDCP entity, which is what makes it usable before any security context or sequence-number state exists, and also what makes it undetectable to any reordering or duplicate-detection logic.

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.
📘
Spec Detail

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.

SRBLogical channelRLC modeDefault prioritySecurityWhat it carries
SRB0CCCHTM -- no header, no SN, no ARQHighest; MAC serves CCCH ahead of any DCCHNone, ever. No PDCP entity exists.RRCSetupRequest, RRCResumeRequest, RRCResumeRequest1, RRCReestablishmentRequest, RRCSystemInfoRequest up; RRCSetup, RRCReject down
SRB1DCCH, LCID 1AM1Integrity and ciphering from SecurityModeCommand onward; before that, plaintext with a zeroed MAC-IAlmost every RRC message, plus the first NAS messages before SRB2 exists (piggybacked in RRCSetupComplete, then in UL/DLInformationTransfer)
SRB2DCCH, LCID 2AM3Always protected. SRB2 is only ever configured after AS security activation.NAS messages once it exists, and RRC messages carrying logged measurement information
SRB3DCCH, LCID 3AM1Protected with the SN's keys, not the MN'sRRC messages exchanged directly between the UE and the Secondary Node in NR-DC / EN-DC, bypassing the MN
SRB4DCCH, LCID 4AM5ProtectedApplication-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.

⚠️
Common Pitfall

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.

How an RRC Message Looks Once PDCP Has Wrapped It (SRB1/2/3/4)How an RRC Message Looks Once PDCP Has Wrapped It (SRB1/2/3/4)PDCP Control-plane Data PDU, TS 38.323 cl. 6.2.2.1bit76543210Oct 1RRRRPDCP SN (bits 11..8)Oct 2PDCP SN (bits 7..0) -- 12-bit SN, always, for SRBsOct 3Data: the PER-encoded RRC PDU, ciphered (octet 1)Oct 4... variable length ...Oct 5MAC-I (bits 31..24)Oct 6MAC-I (bits 23..16)Oct 7MAC-I (bits 15..8)Oct 8MAC-I (bits 7..0) -- 32 bits, NIA-computedThe MAC-I field is present on an SRB even before integrity is activated -- it is simply set to all zeros untilSecurityModeCommand takes effect. A log line showing a 4-octet trailer of zeros on SRB1 is therefore normal, not abroken integrity check.
Figure 2. The PDCP Control-plane Data PDU. Everything between the header and the MAC-I is the PER-encoded RRC message from §7, and once ciphering is active it is opaque to any tool that does not hold the key -- including the gNB-DU.
🧮
Worked Calculation

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.

🔍
What You See In Logs

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:

EncodingSize of a 48-bit messageSelf-describing?Why RRC does or does not use it
BER / DER~15-25 octetsYes -- tag and length on every fieldRejected. The tag-length overhead per field is larger than most RRC fields.
Aligned PER8-10 octetsNo -- needs the schemaRejected. Padding to octet boundaries would push RRCSetupRequest past what a minimum-size MSG3 grant can carry.
Unaligned PERexactly 6 octetsNo -- needs the schemaChosen. Minimum size, deterministic length for fixed-shape messages, and forward-compatible through open types (§8).
XER / JSONhundreds of octetsYesNever 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. An ENUMERATED with sixteen members and no extension marker is four bits. A CHOICE with two alternatives costs one bit of index. OPTIONAL fields 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.
⚠️
Common Pitfall

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

🧮
Worked Calculation

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 in Unaligned PER: All 48 BitsRRCSetupRequest in Unaligned PER: All 48 Bitsue-Identity = randomValue 0x3F2A19C4B7, establishmentCause = mo-Signalling -> 17 E5 43 38 96 E6bit76543210Oct 100 010 1 1 1Oct 21 1 1 0 0 1 0 1Oct 30 1 0 0 0 0 1 1Oct 40 0 1 1 1 0 0 0Oct 51 0 0 1 0 1 1 0Oct 61 1 10 0 1 10Gold = UL-CCCH-MessageType CHOICE index (1 bit, 2 alternatives). Purple = c1 CHOICE index (2 bits, 4 alternatives).Teal = InitialUE-Identity CHOICE index (1 bit). Blue = the 39-bit identity, which straddles five octets. Orange =establishmentCause (4 bits, 16 enumerated values). Grey = the one spare bit that makes the total exactly 48.
Figure 3. A complete 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:

[RRC-UL-CCCH] RRCSetupRequest, decoded by hand
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 UE

Listing 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.

📘
Spec Detail

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.

MechanismLooks likeWhat an old decoder doesFailure mode
Extension marker (...)A ... inside a SEQUENCE, CHOICE or ENUMERATEDFor 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 nonCriticalExtensionOne 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.

🔍
What You See In Logs

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

What a UE Does With an RRC Message It Does Not Fully UnderstandWhat a UE Does With an RRC Message It Does Not Fully UnderstandForward compatibility in practice, TS 38.331 cl. 10RRC PDU received on SRBnoASN.1 violation:discard the message,no response at allPER decode succeedsagainst the UE's ownASN.1 version?yesyesNot comprehended:ignore the wholemessage bodycriticalExtensions CHOICE= criticalExtensionsFuture?nonoMandatory field missingor value not comprehended:treat per TS 38.331 cl. 10Every mandatory fieldpresent and in range?yesyesSkip it using itsopen-type length,act on the restUnknown extension additionor nonCriticalExtensionpresent?noconfig cannot be appliedCannot comply: revert,then re-establish(cl. 5.3.5.8)Apply the configuration, send theCompletion message with the samerrc-TransactionIdentifierThe two branches on the left are what forward compatibility buys: an old UE steps over new fields without failing. The twoon the right are the cases where it cannot, and they look completely different in a log -- one produces silence, the otherproduces a re-establishment attempt in some other cell. Note that NR has no RRCReconfigurationFailure message.
Figure 4. The decision chain. The two left-hand exits are what forward compatibility buys you; the two right-hand exits are where it runs out. Note that only one of the four failure exits produces anything observable on the air.

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.

⚠️
Common Pitfall

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 PDUDirectionChannelSRBCHOICE width of c1Messages
BCCH-BCH-Message
DLBCCH -> BCH -> PBCH--n/a (top-level CHOICE, 1 bit)MIB only
BCCH-DL-SCH-Message
DLBCCH -> DL-SCH--1 bitSIB1, SystemInformation (carrying SIB2..SIB25 and the posSIBs)
PCCH-Message
DLPCCH -> PCH -> DL-SCH--1 bit
Paging
DL-CCCH-Message
DLCCCH -> DL-SCH (LCID 0)SRB02 bitsRRCReject, RRCSetup
DL-DCCH-Message
DLDCCH -> DL-SCHSRB1/2/3/44 bitsRRCReconfiguration, RRCResume, RRCRelease, RRCReestablishment, SecurityModeCommand, DLInformationTransfer, UECapabilityEnquiry, CounterCheck, MobilityFromNRCommand, DLDedicatedMessageSegment, UEInformationRequest, DLInformationTransferMRDC, LoggedMeasurementConfiguration
UL-CCCH-Message
ULCCCH -> UL-SCH (LCID 52)SRB02 bitsRRCSetupRequest, RRCResumeRequest, RRCReestablishmentRequest, RRCSystemInfoRequest
UL-CCCH1-Message
ULCCCH1 -> UL-SCH (LCID 0)SRB02 bitsRRCResumeRequest1 -- separated purely because it is 64 bits, not 48
UL-DCCH-Message
ULDCCH -> UL-SCHSRB1/2/3/44 bitsMeasurementReport, 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:

DirectionReached viaMessageReleasePurpose
UL
c2
ULDedicatedMessageSegment
Rel-16One segment of an oversized uplink RRC message (§11)
UL
c2
DedicatedSIBRequest
Rel-16Ask for a specific SIB over dedicated signalling instead of on-demand broadcast
UL
c2
MCGFailureInformation
Rel-16Report an MCG failure over the SCG leg instead of declaring RLF -- see the companion 16 RLM and RLF
UL
c2
UEInformationResponse
Rel-16RLF report, connection establishment failure report, RA report, logged measurements
UL
c2
SidelinkUEInformationNR
Rel-16NR sidelink resource interest
UL
c2
ULInformationTransferIRAT
Rel-16Carries a V2X / inter-RAT container
UL
c2
IABOtherInformation
Rel-16IAB-node-specific information (an IAB-MT is an RRC endpoint too)
UL
c2
MBSInterestIndication
Rel-17Multicast/broadcast service interest
UL
c2
UEPositioningAssistanceInfo
Rel-17UE Rx-Tx timing-error-group information for positioning
UL
c2
MeasurementReportAppLayer
Rel-17The application-layer / QoE report that SRB4 exists to carry
DLc1 slots 10-13DLDedicatedMessageSegment, UEInformationRequest, DLInformationTransferMRDC, LoggedMeasurementConfigurationRel-16The 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.

⚠️
Common Pitfall

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.

MessageCarries a transaction id?Consequence
RRCSetup / RRCSetupCompleteYes / YesCorrelatable, though only one setup can be outstanding anyway
RRCResume / RRCResumeCompleteYes / YesCorrelatable
RRCReestablishment / RRCReestablishmentCompleteYes / YesCorrelatable
RRCReconfiguration / RRCReconfigurationCompleteYes / YesThe important one. Several reconfigurations can be in flight; the id is the only thing tying a Complete to its Request.
SecurityModeCommand / SecurityModeComplete / SecurityModeFailureYes / Yes / YesCorrelatable, including the failure case
UECapabilityEnquiry / UECapabilityInformationYes / YesCorrelatable across a long, possibly segmented response
CounterCheck / CounterCheckResponseYes / YesCorrelatable
UEInformationRequest / UEInformationResponseYes / YesCorrelatable
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
NoCannot be correlated to a DLInformationTransfer. NAS does its own correlation, at NAS level, and RRC has no visibility of it.
MeasurementReport
NoUnsolicited. Correlate by measId against the measConfig instead -- see the companion 20 Measurements and Events.
UEAssistanceInformation, FailureInformation, SCGFailureInformationNoAll 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.

⚠️
Common Pitfall

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 RRCReconfiguration carrying a secondaryCellGroup with many SCells, a large measConfig and a reconfigurationWithSync all 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.

Segmenting an RRC Message That Will Not Fit (Rel-16)Segmenting an RRC Message That Will Not Fit (Rel-16)UEgNBUECapabilityEnquirySRB1, rrc-TransactionIdentifier = 2, five RAT-Type entries requestedencoded UECapabilityInformation = 12 418 octets> 9000-octet PDCP SDU limit -> segmentation requiredULDedicatedMessageSegmentsegmentNumber 0 | rrc-MessageSegmentType notLastSegment | container 6144 octets1ULDedicatedMessageSegmentsegmentNumber 1 | notLastSegment | container 6144 octets2ULDedicatedMessageSegmentsegmentNumber 2 | lastSegment | container 130 octets3concatenate containers in segmentNumber order, then PER-decodethe 12 418 octets as one UECapabilityInformationfailure variantsegmentNumber 0, notLastSegmentsegmentNumber 1, notLastSegmentsegmentNumber 2, lastSegmentgap at segmentNumber 1 -> discard every stored segment.No error message exists: the enquiry simply never completes.Segments travel as ordinary RRC messages on SRB1, so RLC-AM guarantees delivery of each one -- but nothing at RRClevel retransmits a segment the receiver threw away, which is why reassembly failures show up as a silent absence ofUECapabilityInformation.
Figure 5. Segmentation of an oversized 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.
🧮
Worked Calculation

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.

AspectBehaviourWhere it bites
OrderingSegments are reassembled by segmentNumber, not by arrival orderRLC-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 handlingA missing segmentNumber means every stored segment for that message is discardedNo error message exists. The procedure just never completes and the governing timer, if any, expires
InterleavingSegments of two different messages must not be interleavedA gNB that issues a second UECapabilityEnquiry while the first response is still segmenting can lose both
Capability gatingThe UE indicates support for uplink RRC segmentation in its capabilities; downlink segmentation is likewise gatedA 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 messagesOnly the dedicated-message containers exist. There is no segmentation for CCCH messages or for broadcastAn 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.

🔍
What You See In Logs

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.

CU/DU and CP/UP splitWhere RRC Actually Runs: the CU / DU and CP / UP SplitsTS 38.401 cl. 6 -- the functional split that most gNB logs are organised aroundUEgNB-DURLC · MAC · PHYCellGroupConfig ownergNB-CU-CPRRC · PDCP-CSRB0-4, security, mobilitygNB-CU-UPSDAP · PDCP-UDRBs, QoS flowsAMFNeighbourgNBUPFUuF1-C(F1AP / SCTP)F1-U(GTP-U / UDP)E1(E1AP / SCTP)NG-C / N2Xn-CXn-UNG-U / N3RRC and the SRBs terminate in the CU-CP; the DU contributes only the lower-layer configuration, which the CU-CP copiesverbatim into masterCellGroup. This is why a DU log tells you when an RRC message was scheduled but not what it said,and a CU-CP log tells you the opposite.
Figure 6. The functional split and the interfaces between the parts. F1-C and E1 are SCTP-based application protocols carrying structured messages; F1-U and NG-U are GTP-U tunnels carrying user data. Only F1-C and E1 ever contain RRC.
InterfaceBetweenProtocolSpecWhat it carries of RRC
UuUE and gNB-DUNR air interfaceTS 38.2xx / 38.3xxThe actual RRC PDUs, inside PDCP inside RLC inside MAC
F1-CgNB-DU and gNB-CU-CPF1AP over SCTPTS 38.473RRC PDUs as an opaque RRC-Container IE, plus the DU to CU RRC Information and CU to DU RRC Information containers
F1-UgNB-DU and gNB-CU-UPGTP-U over UDPTS 38.425Nothing. User data and the NR user plane protocol only.
E1gNB-CU-CP and gNB-CU-UPE1AP over SCTPTS 38.463No RRC PDUs, but the consequences of RRC: PDCP and SDAP configuration, UP security keys and algorithms, DRB and QoS flow setup
Xn-CgNB-CU-CP and a neighbour gNBXnAP over SCTPTS 38.423RRC containers during handover and context retrieval -- HandoverPreparationInformation, RETRIEVE UE CONTEXT
NG-C / N2gNB-CU-CP and AMFNGAP over SCTPTS 38.413NAS 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 messageDirectionKey IEsWhen it is used
INITIAL UL RRC MESSAGE TRANSFERDU -> CU-CPgNB-DU UE F1AP ID, NR CGI, C-RNTI, RRC-Container, DU to CU RRC Information, SUL Access IndicationThe 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 TRANSFERDU -> CU-CPgNB-CU UE F1AP ID, gNB-DU UE F1AP ID, SRB ID, RRC-ContainerEvery subsequent uplink RRC message. SRB ID says which SRB, so the CU knows which PDCP entity to hand the container to.
DL RRC MESSAGE TRANSFERCU-CP -> DUboth F1AP IDs, SRB ID, RRC-Container, optionally old gNB-DU UE F1AP ID, Execute DuplicationEvery downlink RRC message on an existing UE context.
UE CONTEXT SETUP REQUEST / RESPONSECU-CP -> DU / DU -> CU-CPSRBs To Be Setup List, DRBs To Be Setup List, RRC-Container, DU To CU RRC InformationCreates 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 / RESPONSECU-CP -> DU / DU -> CU-CPbearer add/mod/release lists, RRC-Container, Transmission Action IndicatorBearer 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.

The Same RRC Messages, Seen Across a Split gNBThe Same RRC Messages, Seen Across a Split gNBSRB0 / CCCHSRB1 / DCCHDRB setupUEgNB-DUgNB-CU-CPgNB-CU-UPRRCSetupRequestSRB0 / CCCH / UL-SCH -- 6 octets, RLC-TM1F1AP INITIAL UL RRCMESSAGE TRANSFERDU UE F1AP ID 41 | C-RNTI 0x4601 | NR CGI2RRC-Container = exactly those 6 octets, plusDU to CU RRC Information carrying the DU's CellGroupConfigCU-CP allocates a CU UE F1AP ID, builds RRCSetup,pastes the DU's CellGroupConfig into masterCellGroupF1AP DL RRCMESSAGE TRANSFERSRB ID 0 | DL-CCCH RRCSetup, in the clear3RRCSetupSRB0 / CCCH / DL-SCH, beside the CR identity CE4RRCSetupCompleteSRB1 / DCCH, LCID 1, RLC-AM, PDCP SN 05F1AP UL RRCMESSAGE TRANSFERSRB ID 1 | the container is a PDCP-C PDU6The CU-CP lifts the dedicatedNAS-Message out of RRCSetupComplete andforwards it to the AMF in an NGAP INITIAL UE MESSAGE (off this diagram).later in the same call, when the first DRB is addedE1AP BEARER CONTEXTSETUP REQUESTPDCP + SDAP config | UP keys | NG-U DL TEID7E1AP BEARER CONTEXTSETUP RESPONSEF1-U uplink tunnel endpoint at the CU-UP8F1AP UE CONTEXTMODIFICATION REQUESTDRB list + F1-U endpoints + RRCReconfiguration9RRCReconfigurationSRB1 / DCCH -- integrity protected, ciphered10Steps 2, 3, 6 and 9 exist only inside the gNB and never appear on the air. Steps 1 and 4 are the only two RRC messagesa DU-side trace can decode in full, because SRB0 has no PDCP and therefore no ciphering.
Figure 7. One connection establishment and one bearer setup, drawn across the split so that the internal hops are visible. The DU never sees an RRC message body once security is on; the CU-UP never sees an RRC message at all.

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:

ConfigurationAuthored byTravels asEnds up in
CellGroupConfig -- RLC bearers, MAC config, PHY config, SpCell and SCell configurationgNB-DUDU to CU RRC Information -> CellGroupConfig IE on F1APmasterCellGroup (an OCTET STRING CONTAINING CellGroupConfig) inside RRCReconfiguration
RadioBearerConfig -- SRB and DRB lists, PDCP and SDAP config, security configgNB-CU-CPauthored directly in the RRC message; PDCP/SDAP parts mirrored to the CU-UP over E1APradioBearerConfig inside RRCReconfiguration
MeasConfig -- measurement objects, report configs, gapsgNB-CU-CPauthored directly; sent to the DU only as an opaque containermeasConfig inside RRCReconfiguration
UE capability informationUECU to DU RRC Information -> UE-CapabilityRAT-ContainerListUsed by the DU to decide what lower-layer configuration is legal
SecurityConfig -- algorithms and key set indicatorgNB-CU-CPRRC message for the AS part; Security Information over E1AP for the UP partsecurityConfig 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.

🔍
What You See In Logs

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.

⚠️
Common Pitfall

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 machineSpecPeer entitiesStatesWhat it is about
RRC stateTS 38.331 cl. 4.2.1UE and gNBRRC_IDLE, RRC_INACTIVE, RRC_CONNECTEDWhether an AS-level connection and context exist, and who owns mobility
Registration management (RM) stateTS 24.501 cl. 5.1.2 / TS 23.501 cl. 5.3.2UE and AMF5GMM-DEREGISTERED, 5GMM-REGISTEREDWhether the UE is registered with a 5GC and has a 5G-GUTI
Connection management (CM) stateTS 24.501 cl. 5.1.3 / TS 23.501 cl. 5.3.3UE and AMF5GMM-IDLE, 5GMM-CONNECTED, and 5GMM-CONNECTED with RRC inactive indicationWhether 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 State Against 5GMM State: the Legal CombinationsRRC State Against 5GMM State: the Legal CombinationsTwo independent state machines; only seven of the nine cells are reachableNormal.UE has no registrationand no connection.Not possible.INACTIVE presumes aretained N2 association.Transient and normal.Initial registration:RRC up, RegistrationAccept not yet received.The steady state of anidle phone. CN pagingapplies.Not possible.Suspending the RRCconnection keeps the UE5GMM-CONNECTED.Transient only, duringservice request beforethe AMF marks the UE5GMM-CONNECTED.Brief mismatch after anRRCRelease the AMF hasnot yet learned of, orafter RLF.24.501 calls this5GMM-CONNECTED withRRC inactive indication.RAN paging applies.The fully active state.Data and signalling bothflow.5GMM-DEREGISTERED['5GMM-REGISTERED', '5GMM-IDLE']['5GMM-REGISTERED', '5GMM-CONNECTED']RRC_IDLERRC_INACTIVERRC_CONNECTEDRRC state (AS, TS 38.331)NAS state (TS 24.501)Steady, expectedTransient onlyCannot occurThe two impossible cells are both in the RRC_INACTIVE column, and for the same reason: RRC_INACTIVE is definedas a suspended connection, so the N2 association and the 5GMM-CONNECTED state must both still exist.
Figure 8. Every combination of RRC state and NAS state, marked with whether it is a steady state, a transient, or impossible. The two impossible cells are the useful ones: they tell you that 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_CONNECTED and 5GMM-DEREGISTERED for the whole time between RRCSetupComplete and Registration 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 to RRC_INACTIVE generates 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_IDLE immediately; 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_IDLE the UE has no AS identity at all but retains a NAS 5G-GUTI. In RRC_INACTIVE it has an I-RNTI. In RRC_CONNECTED it has a C-RNTI. The companion 14 RRC States has the full identity table.
💡
Key Point

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.

TimerConfigured inValuesStarted byStopped byOn expiryCovered in
T300
UE-TimersAndConstants (SIB1)ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000Sending RRCSetupRequestReceiving RRCSetup or RRCRejectReset MAC, release resources, go to RRC_IDLE, log a connEstFailReport15 RRC Procedures
T301
UE-TimersAndConstants
same set as T300Sending RRCReestablishmentRequestReceiving RRCReestablishment or RRCSetupGo to RRC_IDLE with release cause RRC connection failure16 RLM and RLF
T302
RRCReject waitTime, 1-16 s1..16 secondsReceiving RRCReject with a wait timeCell reselection, or PLMN selectionAccess is barred for that duration; the UE may not retry15 RRC Procedures
T304
ReconfigurationWithSync
ms50, ms100, ms150, ms200, ms500, ms1000, ms2000, ms10000Receiving RRCReconfiguration with reconfigurationWithSyncSuccessful random access at the target and RRCReconfigurationCompleteHandover failure -> revert to the source configuration and attempt re-establishment22-25 Handover family
T310
UE-TimersAndConstants
ms0, ms50, ms100, ms200, ms500, ms1000, ms2000N310 consecutive out-of-sync indicationsN311 consecutive in-sync indications, or handover, or re-establishmentRadio Link Failure declared16 RLM and RLF
T311
UE-TimersAndConstants
ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000Initiating RRC re-establishmentSelecting a suitable cell and sending RRCReestablishmentRequestGo to RRC_IDLE16 RLM and RLF
T319
UE-TimersAndConstants
same set as T300Sending RRCResumeRequest or RRCResumeRequest1Receiving RRCResume, RRCSetup, RRCRelease or RRCRejectGo to RRC_IDLE; the stored AS context is discarded14 RRC States
T320
RRCRelease cellReselectionPriorities, or SIBmin5, min10, min20, min30, min60, min120, min180Receiving dedicated cell reselection prioritiesNew dedicated priorities, or entering RRC_CONNECTEDDiscard the dedicated priorities and revert to the broadcast ones14 RRC States
T380
SuspendConfig
min5, min10, min20, min30, min60, min120, min360, min720Entering RRC_INACTIVELeaving RRC_INACTIVEInitiate a periodic RAN Notification Area Update14 RRC States
T390
UAC-BarringInfoSet uac-BarringTime
s4, s8, s16, s32, s64, s128, s256, s512, scaled by a random factorA unified access control barring check failing for an access categoryBarring being lifted for that categoryAccess attempts for that access category are allowed again17 System Information
T316
RLF-TimersAndConstants (Rel-16)ms50, ms100, ms200, ms400, ms600, ms1000, ms1500, ms2000Sending MCGFailureInformation over the SCGReceiving an RRCReconfiguration with reconfigurationWithSync, or RRCReleaseDeclare full RLF and initiate re-establishment16 RLM and RLF
T331
MeasIdleConfig (Rel-16)sec30 .. sec900Receiving an idle/inactive measurement configurationEntering RRC_CONNECTED and reporting the resultsStop idle-mode measurement logging20 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.

⚠️
Common Pitfall

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.

FailureDetected byWhat the UE doesObservable asDiagnostic pointer
PER decode fails -- the bit stream does not match the UE's ASN.1UE RRCDiscard the message. No response of any kind TS 38.331 cl. 10.4Nothing 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 criticalExtensionsFutureUE RRCIgnore the whole message bodyNothing. 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 additionUE RRCSkip the unknown part using its open-type length, apply the restA successful Complete message that under-deliversNot 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 supportsUE RRCFor 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 succeededThere 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 SRBUE PDCP, not RRCDiscard the PDU and indicate the failure to upper layers; RRC does not see the message at allNothing 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 RRCDiscard every stored segment for that messageNothing. The segmented message never completes.Count segmentNumber values. A gap is conclusive.
RRC message exceeds 9000 octets and segmentation is unsupportedSending RRC / PDCPThe message cannot be sent. A UE must reduce what it reports instead.A truncated or absent UECapabilityInformationCheck 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 transactiongNB RRCNot the UE's problem; the UE echoed what it was givenA Complete the gNB cannot attributeIdentifier reuse with multiple outstanding transactions (§10). Serialise reconfigurations.
SRB2 or a DRB configured before AS security activationUE RRCRefuse the reconfiguration: revert and re-establishA connection that restarts immediately after security activationMessage ordering, not bearer configuration (§4.2).
F1AP RRC-Container delivered on the wrong SRB IDgNB-CU-CP PDCPNothing -- the UE never sees a well-formed messageSilence, or a PDCP integrity failure if the SRB's keys differA 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.

💡
Key Point

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 elsewhere

Listing 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.

📘
Spec Detail

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

🔍
About These Traces

Illustrative trace. Field names and encodings follow 3GPP; the values are constructed for this document and are not a capture from any deployed or lab network.

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.

[MAC / F1AP / RRC] One RRCSetupRequest, four views
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 passes

Listing 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

[RRC] RRCReconfiguration with a two-deep extension chain
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 closed

Listing 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

[RRC] criticalExtensionsFuture, and a refused reconfiguration
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

[RRC] Uplink RRC segmentation, three segments
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 containers

Listing 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

[RRC / NGAP] The RRC-versus-NAS state mismatch window
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

ReleaseChangeWhy it matters when reading RRC
Rel-15The whole baseline: three RRC states, SRB0-3, unaligned PER, the critical / non-critical extension idiom, F1AP and E1AP splitsEverything in §3 to §10 and §12 is Rel-15. The c1 CHOICEs in both DCCH directions are already full.
Rel-16RRC 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-16UEInformationRequest / UEInformationResponse promoted into RRC proper, carrying RLF, connEstFail and RA reportsThe UE is now a queryable diagnostic store. See the companion 16 RLM and RLF.
Rel-16MCGFailureInformation, T316 -- report an MCG failure over the SCG instead of declaring RLFAn MCG radio problem no longer necessarily means re-establishment.
Rel-16DedicatedSIBRequest, dedicatedSIB1-Delivery, LoggedMeasurementConfigurationSystem information can now reach a UE over dedicated signalling, so absence of a broadcast SIB no longer implies the UE lacks it.
Rel-16IAB: IABOtherInformation; NR-U; NR sidelink (SidelinkUEInformationNR)New RRC endpoints that are not handsets. An IAB-MT runs the same RRC state machine.
Rel-17SRB4 and MeasurementReportAppLayer for application-layer / QoE measurement collectionA fifth SRB, and srb-Identity had to be extended by an addition group to express it (§16.1).
Rel-17Small Data Transmission -- RRC and user data from RRC_INACTIVE without transitioning to RRC_CONNECTEDA completed uplink transmission no longer implies a state change. See the companion 14 RRC States.
Rel-17MBSInterestIndication, UEPositioningAssistanceInfo, NTN and RedCap configuration throughoutMore c2 messages. A decoder that only knows c1 will mis-decode them (§9).
Rel-17Extended T304 and NTN-specific timing; multi-SIM (MUSIM) release and paging assistanceThe UE may now legitimately ask to be released so it can serve another SIM -- a release with no radio cause at all.
Rel-18L1/L2-triggered mobility (LTM): cell switch executed by a MAC CE against an RRC-preconfigured candidateA mobility event can now occur with no RRC message at the execution point. Absence of RRCReconfiguration is no longer evidence of no handover.
Rel-18Network energy saving, network-controlled repeaters, further AI/ML measurement reportingNew 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

TermExpansionMeaning in this document
RRCRadio Resource ControlThe layer-3 control protocol of TS 38.331; the only entity with the authority to configure PDCP, RLC, MAC and PHY in the UE.
SRBSignalling Radio BearerA radio bearer carrying RRC and/or NAS signalling. Five exist: SRB0-4 (§4).
DRBData Radio BearerA radio bearer carrying user data. Drawn in §3 only to show where the control plane diverges.
CCCH / DCCHCommon / Dedicated Control ChannelThe logical channels SRB0 and SRB1-4 map to. CCCH is common (no dedicated identity needed), DCCH is per-UE.
PERPacked Encoding RulesThe 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.1Marks a SEQUENCE, CHOICE or ENUMERATED as extensible. Costs one bit and buys forward compatibility.
Critical extensioncriticalExtensions CHOICEA 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 codeNeed M / N / R / SThe 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 IntegrityA 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-DUCentral Unit / Distributed UnitThe TS 38.401 functional split. RRC and PDCP in the CU, RLC/MAC/PHY in the DU (§12).
CU-CP / CU-UPCentral Unit Control Plane / User PlaneThe 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.
5GMM5G Mobility ManagementThe NAS protocol of TS 24.501 and its two state machines: registration management and connection management (§13).
I-RNTI / C-RNTIInactive / Cell RNTIThe 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 RRCSetupRequest and RRCReconfiguration), 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 RRCSetupComplete goes 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 that UEInformationRequest retrieves.
  • 17 System Information / 18 MIB and SIB1 IEs -- the broadcast side of RRC, including UE-TimersAndConstants and the UAC barring configuration behind T390.
  • 19 Paging -- how the network reaches a UE in the states where RRC has no dedicated channel to it.
  • 20 Measurements and Events -- measConfig and MeasurementReport, the largest single consumer of RRCReconfiguration.
  • 22-25 Handover family -- reconfigurationWithSync, T304, and the Xn and NG signalling that wraps them.
  • 26 UE Capability -- why UECapabilityInformation needs segmentation, and why a capability bit is the only reliable proof a feature is active.
  • 27 AS Security Mode -- SecurityModeCommand, the keys behind the MAC-I in §5, and what keyToUse selects.