X2-based Handover (with exact IEs) in LTE 4G
Inter-eNB handover over X2 — Handover Request/Ack, SN Status Transfer, RACH to target, Path Switch — with the real IEs.
An X2 handover is two eNBs shaking hands directly: the source prepares the target over X2, tells the UE to jump, and only afterwards asks the core to redirect the data path. Learn it step by step and any handover trace becomes readable.
Introduction
This document describes the complete signalling flow for a contention-free, intra-MME X2-based handover in an LTE/E-UTRAN network, in which a UE in RRC_CONNECTED is moved from a source eNB to a neighbouring target eNB that share a direct X2 interface and are anchored to the same MME and Serving Gateway. The source eNB configures event-A3 measurements over LTE-Uu and, upon receiving a MeasurementReport indicating that a neighbour cell has become an offset better than the serving cell, decides to hand the UE over and prepares the target directly across X2-C without involving the EPC for preparation. The target performs admission control, allocates a C-RNTI and a dedicated RACH preamble, and returns a Target eNB To Source eNB Transparent Container carrying the RRCConnectionReconfiguration handover command. After the UE detaches, performs contention-free RACH to the target, and sends RRCConnectionReconfigurationComplete, the target switches the S1-U downlink path via the S1AP Path Switch procedure toward the MME/S-GW and finally triggers X2AP UE Context Release toward the source. Lossless handover of RLC-AM bearers is achieved through X2AP SN Status Transfer and GTP-U data forwarding over X2-U. The behaviour follows 3GPP TS 36.300 (overall procedure), TS 36.423 (X2AP), and TS 36.331 (RRC).
X2 handover is the workhorse of intra-LTE mobility. Wherever two eNBs are neighbours and an operator has provisioned a direct X2 interface between them, this is the path a normal coverage or load handover takes — it is faster and lighter than routing preparation through the core, because the eNBs negotiate the move themselves and touch the MME only once, at the very end, to repoint the user-plane. It sits directly on the generic handover spine; here that spine is filled in with the exact X2AP and S1AP messages.
On this page
Why X2 handover exists
In plain words: imagine two adjacent shopkeepers who trust each other and have a private phone line between their shops. When a customer needs to move next door, the first shopkeeper rings the second directly — "I'm sending someone over, here's their order" — and only tells head office after the customer has arrived. That private line is X2. The slower alternative (S1) is having to route every such request through head office (the MME) first.
Concretely, X2 handover exists to make inter-eNB mobility fast and to keep the core network out of the critical path. Because the source prepares the target directly over X2-C and forwards in-flight data directly over X2-U, the interruption is short and the EPC is involved only for the final Path Switch. This matters because handovers happen constantly at cell edges; doing preparation eNB-to-eNB avoids the extra round trips and MME load that an S1 handover incurs. X2 handover is always intra-MME — if the target is under a different MME, or no X2 exists, the network must fall back to S1 handover instead.
A direct eNB-to-eNB relocation of a connected UE using X2AP for preparation and X2-U for data forwarding, with a single S1AP Path Switch to the MME at the end.
It is the fastest inter-eNB handover: the core is touched only once, so interruption and signalling load are minimised for the common cell-edge case.
HANDOVER REQUEST/ACKNOWLEDGE over X2-C prepares the target; SN Status Transfer + GTP-U forwarding keep AM bearers lossless; Path Switch then redirects the S1-U downlink and UE Context Release frees the source.
Call flow
The message-sequence chart below shows an intra-MME X2 handover end to end: the source eNB prepares the target directly over X2, commands the UE to retune, and only afterwards touches the core to switch the downlink path and release the source.
MeasurementReport(event A3) — the UE reports a neighbour has become offset-better than the serving cell.Handover Request(X2AP) — the source eNB prepares the target directly over X2, passing the UE context and E-RABs.Handover Request Acknowledge— the target admits the bearers and returns the RRC handover command in a transparent container.RRCConnectionReconfigurationwithmobilityControlInfo— the source commands the UE to retune to the target.SN Status Transferplus GTP-U data forwarding over X2-U keep AM bearers lossless.- The UE performs contention-free RACH and confirms with
RRCConnectionReconfigurationCompleteto the target. Path Switch Request(S1AP) — the target asks the MME to move the downlink path to itself.- The MME switches the path at the S-GW with
Modify Bearer Request/Response. Path Switch Request Acknowledge— the MME confirms and supplies fresh NCC/security context.UE Context Release(X2AP) — the target tells the source to free the UE context and forwarding tunnels.
Call flow at a glance
| Step | Message | Direction | Interface | Purpose |
|---|---|---|---|---|
| 1 | MeasurementReport (event A3) | UE → Source eNB | LTE-Uu | UE reports neighbour PCI has crossed A3 offset+hysteresis for TTT |
| 2 | HO Decision | Source eNB (internal) | eNB RRM | Source evaluates the report, selects target and decides X2 handover |
| 3 | HANDOVER REQUEST | Source eNB → Target eNB | X2-C | Source requests target to prepare UE context and E-RAB resources |
| 4 | Admission Control | Target eNB (internal) | eNB Admission | Target reserves resources, allocates C-RNTI and dedicated preamble |
| 5 | HANDOVER REQUEST ACKNOWLEDGE | Target eNB → Source eNB | X2-C | Target admits E-RABs and returns the HO command transparent container |
| 6 | RRCConnectionReconfiguration (HO Command) | Source eNB → UE | LTE-Uu | Source delivers mobilityControlInfo to command the handover |
| 7 | SN STATUS TRANSFER | Source eNB → Target eNB | X2-C | Source conveys UL/DL PDCP SN & HFN status for AM DRBs |
| 8 | Data Forwarding (GTP-U) | Source eNB → Target eNB | X2-U | Source forwards buffered/in-flight DL PDCP SDUs to target |
| 9 | Detach + Contention-Free RACH | UE → Target eNB | LTE-Uu | UE syncs to target, sends dedicated preamble and receives RAR |
| 10 | RRCConnectionReconfigurationComplete | UE → Target eNB | LTE-Uu | UE confirms handover completion on the target C-RNTI |
| 11 | PATH SWITCH REQUEST | Target eNB → MME | S1-MME | Target asks MME/S-GW to switch S1-U DL path to itself |
| 12 | Modify Bearer Request/Response | MME ↔ S-GW | S11 | S-GW switches DL user-plane to target and sends an end marker |
| 13 | PATH SWITCH REQUEST ACKNOWLEDGE | MME → Target eNB | S1-MME | MME confirms path switch and supplies fresh NCC/security context |
| 14 | UE CONTEXT RELEASE | Target eNB → Source eNB | X2-C | Target tells source to release UE context and forwarding resources |
Phase A — Measurement & Decision
The source eNB has previously configured the UE for event-triggered mobility measurements. When a neighbour cell becomes sufficiently stronger than the serving cell, the UE sends a MeasurementReport, and the source eNB's radio resource management turns that report into a handover decision. Because a direct X2 interface exists to the target eNB and both eNBs share the same MME and S-GW, the source can prepare the target itself over X2-C, keeping the core out of the loop until the final path switch.
Earlier in the connection the source eNB provisioned the UE with a measurement configuration inside an RRCConnectionReconfiguration, comprising a measObjectEUTRA (the EARFCN and neighbour list of the frequency to monitor), a reportConfigEUTRA carrying event A3 (neighbour becomes an offset better than the serving cell), and a measId that binds the object to the report. The UE performs L3 filtering on RSRP/RSRQ of detected cells and starts the timeToTrigger timer when the A3 entering condition (Mn + Ofn + Ocn − Hys > Ms + Ofs + Ocs + Off) is satisfied. When the condition persists for the whole timeToTrigger, the UE sends a MeasurementReport on SRB1 carrying the measId and the measResults for the serving cell and the best neighbour. This report is the trigger that leads the source eNB to run its handover decision algorithm; here the neighbour PCI 288 has become roughly 10 dB stronger than serving PCI 150.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| measId | 1 | Links measObjectId=1 and reportConfigId=1 into one active measurement |
| reportConfigEUTRA.triggerType.event.eventId | eventA3 | Selects A3: neighbour becomes an amount of offset better than serving |
| a3-Offset | 3 (1.5 dB) | Offset the neighbour must exceed the serving cell by before A3 fires |
| hysteresis | 2 (1.0 dB) | Guards against ping-pong by adding margin to the entering condition |
| timeToTrigger | ms320 | Neighbour must stay A3-better for 320 ms before a report is sent |
| measResult (serving, PCI 150) | rsrpResult 45 (-95 dBm), rsrqResult 17 (-11 dB) | Serving cell quality the neighbour is being compared against |
| measResultNeighCells (PCI 288) | rsrpResult 55 (-85 dBm), rsrqResult 21 (-9 dB) | Best neighbour that satisfied A3; becomes the handover target candidate |
| carrierFreq (EARFCN) | 1850 (Band 3 DL) | Frequency on which the neighbour was measured |
LTE Radio Resource Control (RRC) protocol
UL-DCCH-Message
message: c1 (0)
c1: measurementReport (1)
measurementReport
criticalExtensions: c1 (0)
measurementReport-r8
measResults
measId: 1
measResultPCell: rsrpResult 45 (-95dBm), rsrqResult 17 (-11dB)
measResultNeighCells: measResultListEUTRA (0)
MeasResultEUTRA: physCellId 288
measResult: rsrpResult 55 (-85dBm), rsrqResult 21 (-9dB)✅ Debugging steps
- Confirm the UE holds a valid
measConfigfor this neighbour: ameasObjectEUTRAon EARFCN 1850, areportConfigEUTRAwitheventA3, and ameasIdbinding them. - Verify the reported neighbour RSRP beats serving by more than
a3-Offset+hysteresis, sustained fortimeToTrigger. - Check the report actually reached the source on
SRB1(UL-DCCH) and carries the expectedmeasIdandphysCellId.
⚠ Common causes of failure
- Target PCI absent from the neighbour list / ANR, so it is never measured and no report is sent.
a3-Offset/hysteresis/timeToTriggerset too conservatively, so the report fires too late or not at all.- Poor serving downlink loses the
MeasurementReportonSRB1before the source receives it.
The source eNB feeds the MeasurementReport into its mobility/RRM algorithm. It checks that PCI 288 maps to a known neighbour relation with a usable X2 interface (via the Automatic Neighbour Relation table), verifies the target cell is served by the same MME and S-GW, and applies any cell-individual offsets, load, and hysteresis policy. Having confirmed the neighbour is a valid, stronger target, it decides on an X2-based handover rather than an S1 handover, derives the fresh access-stratum key material (KeNB* from the current KeNB and the target PCI/EARFCN, plus the Next Hop Chaining Count), and prepares to send the X2AP HANDOVER REQUEST. This step is entirely internal to the source eNB and produces no over-the-air or inter-node message; it is shown here for completeness of the flow.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| Selected target PCI | 288 | Neighbour chosen from the A3 report as the handover target |
| Target ECGI (from ANR) | PLMN 001-01, ECI 0x0112203 | Resolves the target PCI to a global cell identity for X2 preparation |
| X2 link state | up (target eNB 0x01122) | Confirms a direct X2 interface exists to prepare the target |
| MME / S-GW check | same MME & S-GW | Precondition for X2 (no MME relocation, intra-MME handover) |
| KeNB* derivation | from KeNB, PCI 288, EARFCN 1850 | Fresh AS key base handed to the target for security continuity |
| NCC (Next Hop Chaining Count) | 3 | Selects vertical/horizontal key derivation for the target keys |
| Handover type decision | X2 (intra-MME) | Chooses the fast eNB-to-eNB path over an S1 handover |
eNB Radio Resource Management (internal L3 trace)
Mobility event: A3 report accepted (measId 1)
serving: PCI 150, RSRP -95 dBm
best neighbour: PCI 288, RSRP -85 dBm (margin 10 dB)
Neighbour relation: PCI 288 => ECGI 001-01-0x0112203
x2-link: UP, noHO false, noX2 false
mme-check: same MME (GUMMEI 001-01-8001-01)
Decision: trigger X2 handover
derive KeNB* (target PCI 288, EARFCN 1850), NCC 3
next action: X2AP HandoverRequest✅ Debugging steps
- Confirm the target PCI resolves to an ECGI in the ANR table and that the neighbour relation is not flagged
noHO/noX2. - Verify the X2 link to the target eNB is UP (SCTP association established) before preparation is attempted.
- Check the MME/S-GW equality test passes — a different MME forces S1 handover instead.
⚠ Common causes of failure
- Missing or stale ANR entry, so the target PCI cannot be resolved to an ECGI and no X2 preparation is possible.
- X2 link down or
noX2set on the relation, forcing (or failing over to) S1 handover. - Target under a different MME, making X2 handover invalid.
Phase B — X2 Preparation
The source eNB runs the X2AP Handover Preparation procedure directly with the target eNB. It sends a HANDOVER REQUEST carrying the full UE context and E-RAB list, the target admits the bearers and allocates radio resources, and the target returns a HANDOVER REQUEST ACKNOWLEDGE containing the handover command as an opaque transparent container. No EPC signalling occurs in this phase.
The source eNB initiates handover preparation by sending an X2AP HANDOVER REQUEST to the target eNB across X2-C. This single message carries everything the target needs to admit the UE: the Old eNB UE X2AP ID that identifies the UE on the source side, a Cause, the Target Cell ID (target ECGI), the GUMMEI of the serving MME, and a full UE Context Information block. Inside that context are the MME UE S1AP ID, the UE Security Capabilities, the AS Security Information (the freshly derived KeNB* and the NCC), the UE Aggregate Maximum Bit Rate, the RRC context, and the E-RABs To Be Setup List. Each E-RAB entry gives the E-RAB ID, the E-RAB Level QoS Parameters (QCI plus Allocation and Retention Priority, and for GBR bearers the GBR/MBR bit rates), and the S-GW's uplink GTP tunnel endpoint (transport-layer address plus GTP-TEID) so the target knows where to send uplink user data. The RRC Context field carries a HandoverPreparationInformation container with the UE's radio capabilities and current AS configuration.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| Old eNB UE X2AP ID | 161 (0x00A1) | Identifies the UE on the source side of the X2 association |
| Cause | radioNetwork: handover-desirable-for-radio-reasons | Explains why the handover is being requested |
| Target Cell ID (ECGI) | PLMN 001-01, ECI 0x0112203 | Identifies the exact target cell to prepare |
| GUMMEI | PLMN 001-01, MMEGI 0x8001, MMEC 0x01 | Identifies the serving MME (must be the same MME for X2) |
| MME UE S1AP ID | 69 (0x00000045) | Carried so the target can reference the UE's S1 context at path switch |
| UE Security Capabilities | EEA0/EEA1/EEA2, EIA1/EIA2 | Lets target select ciphering/integrity algorithms for the UE |
| AS Security Information: KeNB* + NCC | KeNB* (256-bit), NCC = 3 | Key derivation material for the target access-stratum keys |
| E-RABs To Be Setup: E-RAB 5 | QCI 9, ARP priority 9; UL S-GW TEID 0x00A1F301 @ 10.20.30.40 | Non-GBR default data bearer and its uplink S1-U endpoint at the S-GW |
| E-RABs To Be Setup: E-RAB 6 | QCI 1, ARP priority 2, GBR/MBR 128 kbps; UL S-GW TEID 0x00A1F302 | GBR VoLTE bearer with guaranteed bit rate to honour at the target |
| UE-AMBR | DL 150 Mbps / UL 50 Mbps | Aggregate rate cap for non-GBR bearers enforced at the target |
| RRC Context | HandoverPreparationInformation (UE-EUTRA-Capability, AS-Config) | Gives target the UE capabilities and source AS configuration |
Stream Control Transmission Protocol, Dst Port: 36422 (36422)
DATA chunk (ordered, complete segment)
Payload protocol identifier: X2AP (27)
X2 Application Protocol
X2AP-PDU: initiatingMessage (0)
procedureCode: id-handoverPreparation (0)
HandoverRequest
Old eNB UE X2AP ID: 161
Cause: radioNetwork (handover-desirable-for-radio-reasons)
targetCell-ID (ECGI): PLMN 001-01, ECI 0x0112203
GUMMEI: PLMN 001-01, MMEGI 0x8001, MMEC 0x01
UE Context Information
MME UE S1AP ID: 69
UESecurityCapabilities: EEA0/1/2, EIA1/2
AS-SecurityInformation: KeNB* (256 bits), NCC 3
E-RABs ToBeSetup: E-RAB ID 5 (QCI 9, ARP 9), UL-GTP 10.20.30.40 TEID 0x00A1F301
E-RABs ToBeSetup: E-RAB ID 6 (QCI 1, ARP 2, GBR/MBR 128k), UL-GTP TEID 0x00A1F302
RRC-Context: HandoverPreparationInformation (207 octets)✅ Debugging steps
- Confirm the
HANDOVER REQUESTreached the target over the X2-C SCTP association (dst port 36422) with the correctOld eNB UE X2AP ID. - Verify every active E-RAB is present in the
E-RABs To Be Setup Listwith its QCI/ARP and the correct UL S-GW GTP endpoint. - Check the
AS Security Information(KeNB*, NCC) andUE Security Capabilitiesare present so the target can derive keys.
⚠ Common causes of failure
- SCTP association to the target down, so the request never arrives (X2 setup / transport problem).
- A bearer omitted or with wrong QoS, so it is not admitted or is admitted with the wrong resources.
- Missing/incorrect KeNB* or NCC, so target key derivation cannot proceed.
The target eNB runs admission control against the requested E-RABs and their QoS. For the GBR bearer (E-RAB 6, QCI 1) it verifies that the guaranteed bit rate can be reserved on the air interface and transport; for the non-GBR bearer (E-RAB 5, QCI 9) it admits it under the UE-AMBR budget. It then allocates a new C-RNTI for the UE in the target cell and reserves a dedicated contention-free RACH preamble and PRACH mask so the incoming UE can access the cell without contention. Finally it builds the RRCConnectionReconfiguration handover command containing mobilityControlInfo and stores the resulting DL/UL data-forwarding tunnel endpoints. Like the source's HO decision, this step is internal to the target eNB and generates no inter-node message; its outputs are returned to the source in the next step.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| Admission result (E-RAB 5) | admitted (QCI 9) | Non-GBR default bearer accepted under UE-AMBR |
| Admission result (E-RAB 6) | admitted (QCI 1, GBR reserved) | GBR VoLTE bearer passes CAC with its guaranteed bit rate reserved |
| Allocated C-RNTI | 0x5C7A | New cell radio identity the UE will use in the target cell |
| ra-PreambleIndex | 34 | Dedicated preamble reserved for contention-free RACH |
| ra-PRACH-MaskIndex | 0 | Ties the dedicated preamble to specific PRACH occasions |
| DL forwarding TEID (E-RAB 5) | 0x00B2C401 @ 10.60.70.80 | X2-U endpoint for the source to forward buffered DL data to |
| DL forwarding TEID (E-RAB 6) | 0x00B2C402 @ 10.60.70.80 | X2-U endpoint for the GBR bearer's forwarded DL data |
| Target keys derived | KeNB (from KeNB*), KRRCint/KRRCenc/KUPenc | AS keys the target will use once the UE arrives |
eNB Admission Control (internal L3 trace)
HandoverRequest received: Old X2AP ID 161, ECGI 001-01-0x0112203
Connection Admission Control
E-RAB 5 (QCI 9, non-GBR): admit under UE-AMBR
E-RAB 6 (QCI 1, GBR 128k): reserve GBR, admit
Radio resource allocation
C-RNTI: 0x5C7A
rach-ConfigDedicated: ra-PreambleIndex 34, ra-PRACH-MaskIndex 0
Data forwarding tunnels (X2-U)
E-RAB 5: DL-forward TEID 0x00B2C401
E-RAB 6: DL-forward TEID 0x00B2C402
Build RRCConnectionReconfiguration (mobilityControlInfo) => transparent container✅ Debugging steps
- Confirm CAC admitted every requested E-RAB, especially the GBR bearer whose guaranteed rate must be reservable.
- Verify a C-RNTI and a dedicated
ra-PreambleIndex/ra-PRACH-MaskIndexwere actually reserved for the incoming UE. - Check DL forwarding TEIDs were allocated so the source has somewhere to forward buffered data.
⚠ Common causes of failure
- GBR bearer rejected because the target cannot reserve the guaranteed bit rate (congestion) — the whole handover may be refused.
- No free C-RNTI or dedicated preamble at the target, forcing contention-based access or refusal.
- Target overloaded, so admission returns a
HANDOVER PREPARATION FAILUREinstead of an acknowledge.
The target eNB replies with a HANDOVER REQUEST ACKNOWLEDGE that completes the preparation phase. It carries the New eNB UE X2AP ID it has allocated for this UE, the E-RABs Admitted List (each entry giving the target's DL GTP tunnel endpoint and, where forwarding is proposed, the UL/DL forwarding GTP tunnel endpoints), and the Target eNB To Source eNB Transparent Container. That container wraps the RRCConnectionReconfiguration handover command, which contains mobilityControlInfo with the targetPhysCellId, the newUE-Identity (target C-RNTI), the rach-ConfigDedicated (the dedicated preamble), t304, and the target radioResourceConfigCommon. The source treats the container as opaque: it will forward it to the UE unmodified. Receiving this acknowledge gives the source everything it needs to command the handover.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| New eNB UE X2AP ID | 183 (0x00B7) | Target-side Xn UE identifier for the rest of the X2 dialogue |
| E-RABs Admitted: E-RAB 5 | DL S1-U TEID 0x00C05001; DL-fwd TEID 0x00B2C401 | Confirms admission and gives the forwarding endpoint for DL data |
| E-RABs Admitted: E-RAB 6 | DL S1-U TEID 0x00C05002; DL-fwd TEID 0x00B2C402 | Confirms the GBR bearer and its forwarding endpoint |
| Target eNB To Source eNB Transparent Container | RRCConnectionReconfiguration (mobilityControlInfo) | Opaque handover command the source forwards unmodified to the UE |
| mobilityControlInfo.targetPhysCellId | 288 | Target physical cell identity the UE will retune to |
| mobilityControlInfo.newUE-Identity (C-RNTI) | 0x5C7A | C-RNTI the UE will adopt in the target cell |
| rach-ConfigDedicated.ra-PreambleIndex | 34 | Dedicated preamble for contention-free RACH to the target |
| rach-ConfigDedicated.ra-PRACH-MaskIndex | 0 | PRACH occasion mask tied to the dedicated preamble |
| t304 | ms1000 | Handover supervision timer the UE runs during execution |
Stream Control Transmission Protocol, Src Port: 36422 (36422)
DATA chunk (ordered, complete segment)
Payload protocol identifier: X2AP (27)
X2 Application Protocol
X2AP-PDU: successfulOutcome (1)
procedureCode: id-handoverPreparation (0)
HandoverRequestAcknowledge
Old eNB UE X2AP ID: 161
New eNB UE X2AP ID: 183
E-RABs Admitted: E-RAB ID 5 (DL-GTP TEID 0x00C05001, DL-fwd TEID 0x00B2C401)
E-RABs Admitted: E-RAB ID 6 (DL-GTP TEID 0x00C05002, DL-fwd TEID 0x00B2C402)
TargeteNBtoSourceeNBTransparentContainer
RRCConnectionReconfiguration: mobilityControlInfo
targetPhysCellId: 288
newUE-Identity (C-RNTI): 0x5C7A
rach-ConfigDedicated: ra-PreambleIndex 34, ra-PRACH-MaskIndex 0
t304: ms1000✅ Debugging steps
- Confirm a
HANDOVER REQUEST ACKNOWLEDGE(not aPREPARATION FAILURE) came back, with aNew eNB UE X2AP ID. - Verify the transparent container decodes to an
RRCConnectionReconfigurationwithmobilityControlInfo(targetPCI 288, C-RNTI,rach-ConfigDedicated,t304). - Check the
E-RABs Admitted Listmatches what was requested and carries usable DL/forwarding TEIDs.
⚠ Common causes of failure
- Target returns
HANDOVER PREPARATION FAILURE(admission rejected), aborting the handover. - Some E-RABs admitted but not others, so the source must decide whether to proceed with reduced bearers.
- Malformed/absent transparent container, so the source has no valid command to forward.
Phase C — HO Execution
With the target prepared, the source commands the handover by delivering the transparent RRCConnectionReconfiguration to the UE, transfers PDCP status and forwards in-flight data for lossless AM bearers, and the UE detaches from the source, performs contention-free RACH to the target, and confirms completion.
The source eNB takes the Target eNB To Source eNB Transparent Container received in step 5 and delivers it to the UE as an RRCConnectionReconfiguration on SRB1, integrity-protected and ciphered with the current source AS keys. The decisive element is mobilityControlInfo, which instructs the UE to synchronise to the target cell: it contains the targetPhysCellId, the target carrierFreq, the newUE-Identity (target C-RNTI), the target radioResourceConfigCommon, the rach-ConfigDedicated (dedicated preamble and PRACH mask for contention-free access), and the t304 supervision timer. The securityConfigHO carries the nextHopChainingCount so the UE can derive the target AS keys. On receiving it the UE starts t304, applies the target configuration, derives KeNB and the target KRRCint/KRRCenc/KUPenc, and detaches from the source cell. This is the point at which the UE is committed to leaving the source.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| RRC message type | RRCConnectionReconfiguration (rrc-TransactionIdentifier 1) | Carries the handover command to the UE on SRB1 |
| mobilityControlInfo.targetPhysCellId | 288 | Target physical cell identity the UE retunes to |
| mobilityControlInfo.carrierFreq (EARFCN) | 1850 | Downlink EARFCN of the target cell for synchronisation |
| mobilityControlInfo.newUE-Identity (C-RNTI) | 0x5C7A | C-RNTI the UE will use in the target cell after RACH |
| rach-ConfigDedicated.ra-PreambleIndex | 34 | Dedicated preamble the UE transmits to the target for CFRA |
| rach-ConfigDedicated.ra-PRACH-MaskIndex | 0 | PRACH occasions on which the dedicated preamble is valid |
| mobilityControlInfo.t304 | ms1000 | Timer UE runs during HO; expiry triggers HO failure & re-establishment |
| securityConfigHO.nextHopChainingCount | 3 | Directs the UE to derive fresh AS keys from the target key chain |
LTE Radio Resource Control (RRC) protocol
DL-DCCH-Message
message: c1 (0)
c1: rrcConnectionReconfiguration (3)
rrcConnectionReconfiguration
rrc-TransactionIdentifier: 1
criticalExtensions: c1 (0)
rrcConnectionReconfiguration-r8
mobilityControlInfo
targetPhysCellId: 288
carrierFreq: dl-CarrierFreq 1850
newUE-Identity (C-RNTI): 0x5C7A
t304: ms1000
rach-ConfigDedicated: ra-PreambleIndex 34, ra-PRACH-MaskIndex 0
securityConfigHO: nextHopChainingCount 3✅ Debugging steps
- Confirm the command reached the UE on
SRB1(DL-DCCH) and that it containsmobilityControlInfo— without it, no handover. - Verify the UE started
t304and derived the target AS keys usingsecurityConfigHO.nextHopChainingCount. - Check
targetPhysCellId/carrierFreqmatch the prepared target from step 5.
⚠ Common causes of failure
- Command lost on a fading source downlink, so the UE never applies it and eventually hits RLF.
nextHopChainingCountmismatch, so target integrity verification of the completion later fails.- UE cannot apply the target
radioResourceConfigCommon(unsupported config), so it declares reconfiguration failure.
For lossless handover of RLC-AM bearers, the source eNB sends an X2AP SN STATUS TRANSFER so the target can continue PDCP numbering without loss or duplication. For each bearer in the E-RABs Subject To Status Transfer List it conveys the uplink PDCP receiver status (the next expected UL PDCP SN plus a receiveStatusOfUL-PDCP-SDUs bitmap marking already-received out-of-order SDUs) and the downlink COUNT the target should assign to the first forwarded or new DL PDCP SDU. COUNT values are expressed as HFN concatenated with the PDCP SN. This lets the target reorder uplink data correctly and resume downlink transmission at the exact next COUNT so nothing is duplicated or lost across the move.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| E-RABs Subject To Status Transfer: E-RAB ID | 5 | Identifies the AM bearer whose PDCP status is being transferred |
| DL COUNT (HFN + PDCP-SN) | HFN 0x002, SN 4095 → COUNT 0x0002FFF | Next DL PDCP COUNT the target must use for the first DL SDU |
| UL COUNT (HFN + PDCP-SN) | HFN 0x002, SN 3300 → COUNT 0x0002CE4 | Next expected UL PDCP COUNT so the target reorders uplink correctly |
| receiveStatusOfUL-PDCP-SDUs (bitmap) | 0b1101100… (len 128 bits) | Marks UL SDUs already received out-of-order to avoid re-delivery |
| E-RAB ID (second bearer) | 6 | Second AM bearer (VoLTE) included in the same status transfer |
| DL COUNT (E-RAB 6) | HFN 0x000, SN 210 → COUNT 0x00000D2 | Next DL COUNT for E-RAB 6 at the target |
| UL COUNT (E-RAB 6) | HFN 0x000, SN 205 → COUNT 0x00000CD | Next expected UL COUNT for E-RAB 6 at the target |
| pdcp-SN-Length | 12 bits | PDCP SN size in use; needed to interpret the HFN/SN split of COUNT |
Stream Control Transmission Protocol, Src Port: 36422 (36422)
DATA chunk (ordered, complete segment)
Payload protocol identifier: X2AP (27)
X2 Application Protocol
X2AP-PDU: initiatingMessage (0)
procedureCode: id-snStatusTransfer (4)
SNStatusTransfer
Old eNB UE X2AP ID: 161
New eNB UE X2AP ID: 183
E-RABs SubjectToStatusTransfer: E-RAB ID 5
receiveStatusofULPDCP-SDUs: 128 bits (first missing 3301)
ulCOUNTvalue: HFN 0x002, PDCP-SN 3300 (0x0002CE4)
dlCOUNTvalue: HFN 0x002, PDCP-SN 4095 (0x0002FFF)
E-RABs SubjectToStatusTransfer: E-RAB ID 6
ulCOUNTvalue: HFN 0x000, PDCP-SN 205 (0x00000CD)
dlCOUNTvalue: HFN 0x000, PDCP-SN 210 (0x00000D2)✅ Debugging steps
- Confirm every RLC-AM bearer appears in the
E-RABs Subject To Status Transfer Listwith UL/DL COUNT values. - Check the
pdcp-SN-Lengthmatches the bearer config so the HFN/SN split of COUNT is interpreted correctly. - Verify the DL COUNT lines up with the first forwarded PDCP SN in step 8 (no gap, no overlap).
⚠ Common causes of failure
- Status transfer missing for an AM bearer, so the target restarts PDCP numbering and causes loss/duplication.
- Wrong
pdcp-SN-Length, so COUNT is misread and the reorder window is off. - COUNT/forwarding mismatch, leaving a hole or overlap in the delivered SDU stream.
Using the DL forwarding tunnel endpoints received in the HANDOVER REQUEST ACKNOWLEDGE, the source eNB tunnels buffered and in-flight downlink PDCP SDUs to the target eNB over X2-U via GTP-U. For AM bearers the source forwards the PDCP SDUs that were not yet acknowledged by the UE, starting from the DL COUNT signalled in the SN Status Transfer, preserving their PDCP sequence numbers so the target can deliver them in order once the UE arrives. Uplink data that the source still receives before the UE detaches may likewise be forwarded to avoid loss. This forwarding overlaps in time with the UE's RACH to the target and continues until the source releases the context; an End Marker eventually closes each forwarding tunnel.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| GTP-U tunnel (DL forwarding, E-RAB 5) | dst 10.60.70.80 : TEID 0x00B2C401 | Target-provided endpoint that receives forwarded DL PDCP SDUs |
| GTP-U message type | G-PDU (0xFF) | Encapsulates a user-plane PDCP SDU inside GTP-U |
| Forwarded E-RAB ID | 5 | Bearer whose unacknowledged DL SDUs are being forwarded |
| First forwarded PDCP SN | 4095 | Starts at the DL COUNT boundary from SN Status Transfer (no gap) |
| Number of forwarded PDUs | 37 | Count of buffered/in-flight DL PDCP SDUs sent to the target |
| GTP-U Sequence Number | 4095 | Preserves ordering so the target reorders before delivery |
| End Marker | GTP-U End Marker (0xFE) | Signals that no more DL SDUs will be forwarded on this tunnel |
GPRS Tunneling Protocol
Flags: 0x30 (version 1, PT 1, E 0, S 1)
Message Type: G-PDU (0xff)
Length: 1392
TEID: 0x00b2c401
Sequence Number: 4095
T-PDU: forwarded DL PDCP SDU
E-RAB 5, first forwarded PDCP-SN 4095, total 37 PDUs
forwarding endpoint 10.60.70.80
[followed by GTP-U End Marker (0xfe) when buffer drained]✅ Debugging steps
- Confirm G-PDUs are flowing on the DL forwarding TEIDs the target allocated in step 5.
- Check the first forwarded PDCP SN matches the DL COUNT from the SN Status Transfer (continuity).
- Verify a GTP-U End Marker closes each tunnel once the source buffer is drained.
⚠ Common causes of failure
- X2-U transport blocked (firewall/MTU), so forwarded SDUs never reach the target and packets are lost.
- Forwarding to the wrong TEID/address, so the target buffers nothing for delivery.
- No End Marker, so the target waits and cannot cleanly order the last packets.
The UE detaches from the source cell, retunes to the target PCI 288 on EARFCN 1850, and performs a contention-free random access using the dedicated resources from rach-ConfigDedicated. It transmits the assigned ra-PreambleIndex on the PRACH occasions selected by the mask (Msg1), and the target eNB responds with a Random Access Response (Msg2/RAR) on PDCCH addressed by the RA-RNTI, containing a Timing Advance command, an uplink grant for Msg3, and a Temporary C-RNTI that equals the C-RNTI already assigned via mobilityControlInfo. Because the preamble is dedicated there is no contention resolution step, so the UE proceeds directly to send its handover confirm. The whole exchange must complete before t304 expires or the UE declares handover failure and attempts RRC re-establishment.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| Target PCI | 288 | Physical cell the UE synchronises to before RACH |
| ra-PreambleIndex (Msg1) | 34 | Dedicated CFRA preamble transmitted to the target |
| PRACH occasion / mask | ra-PRACH-MaskIndex 0, subframe 1 | Time/frequency RACH opportunity tied to the dedicated preamble |
| RAR: RA-RNTI | 0x0002 | Identifies the RAR on PDCCH for the UE's PRACH occasion |
| RAR: Timing Advance Command | TA = 31 (≈ 16.1 µs) | Adjusts UE uplink timing to the target cell |
| RAR: UL Grant | 6 PRBs, MCS 4, TPC 0 | Resources granted for the UE's Msg3 (the HO confirm) |
| RAR: Temporary C-RNTI | 0x5C7A | Confirms the C-RNTI already assigned via mobilityControlInfo |
| t304 status | running (1000 ms) | HO supervision timer; stopped on successful completion |
MAC-LTE
Radio Type: FDD
Direction: Downlink
RNTI Type: RA-RNTI
RNTI: 2 (RA-RNTI 0x0002)
MAC PDU (DL-SCH)
Random Access Response (RAR)
RAPID: 34 (dedicated preamble)
Timing Advance Command: 31 (~16.1 us)
UL Grant: 6 PRBs, MCS 4, TPC 0
Temporary C-RNTI: 0x5c7a✅ Debugging steps
- Confirm the UE transmitted the dedicated
ra-PreambleIndex 34on the masked PRACH occasion and received a RAR whoseRAPIDechoes it. - Check the RAR's Temporary C-RNTI equals the
newUE-Identity(0x5C7A) so no contention resolution is needed. - Verify the whole RACH completes well inside
t304.
⚠ Common causes of failure
- Dedicated preamble unanswered (weak target UL, wrong mask/occasion), so no RAR and
t304expires. - Poor target coverage at the moment of arrival (too-late HO), so RACH fails.
- TA/grant not applied correctly, so Msg3 (the confirm) cannot be sent.
Using the uplink grant from the RAR, the UE sends RRCConnectionReconfigurationComplete to the target eNB as Msg3 on SRB1, now identified by its target C-RNTI 0x5C7A and protected with the newly derived target AS keys. Reception of this message tells the target that the UE has successfully synchronised and applied the handover configuration; the target stops treating the UE as in-transit and resumes SRB/DRB traffic, delivering forwarded and buffered downlink PDCP SDUs in order. The UE stops timer t304. From this moment the UE is fully served by the target eNB on the air interface, and the target proceeds to switch the core-network user-plane path via S1AP.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| RRC message type | RRCConnectionReconfigurationComplete | Confirms the UE applied the handover RRCConnectionReconfiguration |
| rrc-TransactionIdentifier | 1 | Matches the transaction of the RRCConnectionReconfiguration command |
| C-RNTI (MAC) | 0x5C7A | UE now operates under the target-assigned C-RNTI |
| SRB | SRB1 | Signalling radio bearer carrying the completion message (Msg3) |
| PDCP SN (Msg3) | 0 | First PDCP PDU on the target uses fresh security with target keys |
| Integrity / ciphering | EIA2 / EEA2 (target keys) | Message protected with keys derived from KeNB* at the target |
| t304 | stopped | Handover supervision timer stopped on successful completion |
LTE Radio Resource Control (RRC) protocol
UL-DCCH-Message
message: c1 (0)
c1: rrcConnectionReconfigurationComplete (2)
rrcConnectionReconfigurationComplete
rrc-TransactionIdentifier: 1
criticalExtensions: rrcConnectionReconfigurationComplete-r8 (0)
rrcConnectionReconfigurationComplete-r8
[C-RNTI: 0x5C7A]
[SRB: SRB1, PDCP-SN 0, integrity EIA2]✅ Debugging steps
- Confirm the completion arrived at the target on
SRB1under C-RNTI 0x5C7A and passed integrity check with the target keys. - Verify
t304was stopped — this is the definitive radio-side success marker. - Check the target began delivering forwarded/buffered DL SDUs in order after receiving it.
⚠ Common causes of failure
- Integrity check fails at the target (key/NCC mismatch), so the completion is rejected and the UE is not admitted.
- Grant too small or lost, so the completion is not delivered before
t304expiry. - UE reverts to source on any of the above, triggering re-establishment.
Phase D — Path Switch & Release
Now that the UE is on the target cell, the target eNB switches the S1-U downlink user-plane away from the source by running the S1AP Path Switch procedure with the MME, which in turn asks the S-GW to repoint the bearer path over S11. The MME returns a fresh security parameter for the next handover, and the target finally tells the source to release the UE context over X2.
Having taken over the UE on the radio side, the target eNB initiates the S1AP Path Switch Request procedure toward the MME to redirect the downlink S1-U user-plane from the source eNB to itself. The message carries the target's eNB UE S1AP ID, the MME UE S1AP ID that identifies the UE's S1 context, the E-RAB To Be Switched in Downlink List (each entry giving the target eNB's Transport Layer Address and GTP-TEID for the downlink), the serving EUTRAN CGI (ECGI) and TAI, and the UE Security Capabilities. This is the only EPC interaction in an X2 handover and it happens after the radio handover has already succeeded.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| MME UE S1AP ID | 69 (0x00000045) | Identifies the UE's S1 association at the MME |
| eNB UE S1AP ID (target) | 167 (0x000000A7) | Target eNB's identifier for the UE over S1-MME |
| E-RAB To Be Switched in DL: E-RAB 5 | TLA 10.60.70.90, GTP-TEID 0x00C05001 | New DL S1-U endpoint at the target where the S-GW should send data |
| E-RAB To Be Switched in DL: E-RAB 6 | TLA 10.60.70.90, GTP-TEID 0x00C05002 | New DL S1-U endpoint for the GBR bearer at the target |
| E-UTRAN CGI (ECGI) | PLMN 001-01, ECI 0x0112203 | Reports the UE's new serving cell to the core |
| TAI | PLMN 001-01, TAC 0x0001 | Reports the UE's new tracking area |
| UE Security Capabilities | EEA0/1/2, EIA1/2 | Re-supplied so the MME can validate the security context |
Stream Control Transmission Protocol, Dst Port: 36412 (36412)
DATA chunk (ordered, complete segment)
Payload protocol identifier: S1AP (18)
S1 Application Protocol
S1AP-PDU: initiatingMessage (0)
procedureCode: id-PathSwitchRequest (3)
PathSwitchRequest
eNB-UE-S1AP-ID: 167
E-RABToBeSwitchedDLList
E-RAB ID 5: transportLayerAddress 10.60.70.90, GTP-TEID 0x00C05001
E-RAB ID 6: transportLayerAddress 10.60.70.90, GTP-TEID 0x00C05002
sourceMME-UE-S1AP-ID: 69
EUTRAN-CGI: PLMN 001-01, ECI 0x0112203
TAI: PLMN 001-01, TAC 0x0001
UESecurityCapabilities: EEA0/1/2, EIA1/2✅ Debugging steps
- Confirm the
PATH SWITCH REQUESTreached the MME over S1-MME (dst port 36412) with the correctMME UE S1AP ID. - Verify every bearer is in the
E-RAB To Be Switched in DL Listwith the target's new DL S1-U endpoint. - Check the ECGI/TAI report the correct new serving cell/tracking area.
⚠ Common causes of failure
- S1-MME association problem, so the request never reaches the MME and DL data stays pointed at the source.
- A bearer missing from the switch list, so its downlink continues to the wrong eNB.
- MME cannot match the
MME UE S1AP ID, returning a failure.
On receiving the Path Switch Request, the MME asks the Serving Gateway to switch the downlink S1-U path by sending a GTPv2-C Modify Bearer Request over S11, carrying the target eNB's S1-U F-TEID(s) as the new downlink endpoints for each bearer. The S-GW updates its bearer context so that downlink packets now flow to the target eNB and, to help the target reorder any last in-flight packets, sends one or more GTP-U End Marker packets on the old S1-U path toward the source eNB. It then returns a Modify Bearer Response confirming the switched bearers. Because this is an intra-S-GW handover the S-GW's own uplink F-TEID is unchanged, so the uplink endpoint the target uses stays the same.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| GTPv2-C message | Modify Bearer Request (34) / Response (35) | S11 procedure that repoints the downlink S1-U path |
| MME S11 TEID / S-GW S11 TEID | 0x0000E101 / 0x0000E202 | Control-plane tunnel identifiers for the UE's S11 session |
| Bearer Context: EBI | 5, 6 | EPS bearer identities being modified (map to E-RAB 5/6) |
| S1-U eNB F-TEID (DL, E-RAB 5) | 10.60.70.90 : TEID 0x00C05001 | New downlink endpoint at the target the S-GW will send DL data to |
| S1-U eNB F-TEID (DL, E-RAB 6) | 10.60.70.90 : TEID 0x00C05002 | New downlink endpoint for the GBR bearer at the target |
| End Marker | GTP-U End Marker (0xFE) on old path | S-GW marks end of the old DL stream so the target orders last packets |
| Cause (Response) | Request accepted (16) | Confirms the downlink path has been switched at the S-GW |
GPRS Tunneling Protocol V2
Flags: 0x48 (version 2, P 0, T 1)
Message Type: Modify Bearer Request (34)
TEID: 0x0000e202
Sequence Number: 0x000311
Bearer Context (EBI 5)
EPS Bearer ID (EBI): 5
F-TEID (S1-U eNodeB): 10.60.70.90, TEID 0x00C05001
Bearer Context (EBI 6)
EPS Bearer ID (EBI): 6
F-TEID (S1-U eNodeB): 10.60.70.90, TEID 0x00C05002
[S-GW sends GTP-U End Marker on old path, then Modify Bearer Response cause 16]✅ Debugging steps
- Confirm the MME issued a
Modify Bearer Requeston S11 carrying the target's DL S1-U F-TEIDs. - Verify the S-GW returned
Modify Bearer Responsecause "Request accepted (16)". - Check the S-GW sent a GTP-U End Marker on the old path so the target can order the last packets.
⚠ Common causes of failure
- S-GW rejects the modification, so DL keeps flowing to the source and the UE's downlink stalls.
- Wrong target F-TEID in the request, so DL is repointed to an invalid endpoint.
- No End Marker, so brief mis-ordering of the last in-flight packets.
With the downlink path switched at the S-GW, the MME returns an S1AP PATH SWITCH REQUEST ACKNOWLEDGE to the target eNB. It confirms the switched E-RABs and, if the S-GW's uplink endpoint changed, supplies the new UL S1-U transport address and GTP-TEID (unchanged here for an intra-S-GW handover). Crucially it carries the updated Security Context, including a new Next Hop parameter (NH) and an incremented Next Hop Chaining Count (NCC = 4) that the target will use as the security base for the UE's next handover. With this acknowledgement the user plane is fully anchored on the target and the EPC-side relocation is complete.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| MME UE S1AP ID | 69 (0x00000045) | Confirms the same UE S1 association at the MME |
| eNB UE S1AP ID | 167 (0x000000A7) | Confirms the target eNB UE identifier |
| E-RAB To Be Switched in UL List | E-RAB 5/6: 10.20.30.40 TEID 0x00A1F301/0x00A1F302 | Uplink S1-U endpoints at the S-GW (unchanged, intra-S-GW) |
| Security Context: NCC (nextHopChainingCount) | 4 | Fresh NCC the target uses to derive keys for the UE's next handover |
| Security Context: NH (NextHopParameter) | NH (256-bit) | Next-hop key material bound to the incremented NCC |
| UE-AMBR | DL 150 Mbps / UL 50 Mbps | Aggregate bit rate re-confirmed for the switched bearers |
| Criticality Diagnostics / result | successful (no failed bearers) | Indicates the path switch was accepted without failed E-RABs |
Stream Control Transmission Protocol, Src Port: 36412 (36412)
DATA chunk (ordered, complete segment)
Payload protocol identifier: S1AP (18)
S1 Application Protocol
S1AP-PDU: successfulOutcome (1)
procedureCode: id-PathSwitchRequest (3)
PathSwitchRequestAcknowledge
MME-UE-S1AP-ID: 69
eNB-UE-S1AP-ID: 167
E-RABToBeSwitchedULList
E-RAB ID 5: transportLayerAddress 10.20.30.40, GTP-TEID 0x00A1F301
E-RAB ID 6: transportLayerAddress 10.20.30.40, GTP-TEID 0x00A1F302
SecurityContext
nextHopChainingCount: 4
nextHopParameter (NH): 256 bits✅ Debugging steps
- Confirm a
PATH SWITCH REQUEST ACKNOWLEDGE(successfulOutcome) came back with no failed E-RABs. - Check the fresh
{NH, NCC}pair is stored at the target for the UE's next handover. - Verify any changed UL S1-U endpoints are applied (unchanged for intra-S-GW).
⚠ Common causes of failure
- MME returns failure or lists failed E-RABs, so those bearers are torn down.
- Target fails to store the new NH/NCC, breaking key derivation at the next handover.
- Acknowledge lost, so the target cannot confirm EPC-side completion.
Once the path switch is acknowledged and the user plane is confirmed on the target, the target eNB sends an X2AP UE CONTEXT RELEASE to the source eNB, signalling that the handover is fully complete and the source may free all UE-associated resources. On receipt the source eNB releases the UE's C-RNTI, its RLC/MAC/PDCP entities, the DRB and SRB resources, the reserved radio and transport resources, and tears down the X2-U data-forwarding tunnels. This ends the handover procedure: the UE is now served entirely by the target eNB with its S1-U user-plane anchored there, and no state remains at the source.
| IE / Field | Example Value | Why it matters |
|---|---|---|
| Old eNB UE X2AP ID | 161 (0x00A1) | Source-side X2 UE identifier whose context is to be released |
| New eNB UE X2AP ID | 183 (0x00B7) | Target-side X2 UE identifier confirming the association |
| Cause | radioNetwork: normal-release / successful-handover | Indicates the release is due to a completed successful handover |
| Released radio resources | C-RNTI, RLC/MAC/PDCP entities | Source-side UE radio state freed for reuse |
| Released bearers | E-RAB 5, E-RAB 6 | Data bearers whose source-side resources are released |
| Data forwarding tunnels | TEID 0x00B2C401 / 0x00B2C402 torn down | X2-U forwarding tunnels closed after release |
Stream Control Transmission Protocol, Src Port: 36422 (36422)
DATA chunk (ordered, complete segment)
Payload protocol identifier: X2AP (27)
X2 Application Protocol
X2AP-PDU: initiatingMessage (0)
procedureCode: id-uEContextRelease (5)
UEContextRelease
Old eNB UE X2AP ID: 161
New eNB UE X2AP ID: 183
Cause: radioNetwork (normal-release / successful-handover)
[source frees C-RNTI, RLC/MAC/PDCP, E-RAB 5 & 6]
[X2-U forwarding TEID 0x00B2C401 / 0x00B2C402 torn down]✅ Debugging steps
- Confirm the target sent
UE CONTEXT RELEASEonly after the path switch acknowledge (correct ordering). - Verify the source actually freed the C-RNTI, RLC/MAC/PDCP entities and torn down the X2-U forwarding tunnels.
- Check the cause indicates a successful handover, not an abnormal release.
⚠ Common causes of failure
- Release lost or never sent, so the source leaks the UE context and forwarding tunnels (resource exhaustion over time).
- Release sent too early (before path switch ack), risking data loss on still-forwarding tunnels.
- Wrong X2AP ID pairing, so the source cannot match and free the correct context.
Summary
An X2 handover is the generic handover spine filled in with concrete inter-node messages. In four phases: (A) the UE's A3 MeasurementReport drives the source's internal HO decision; (B) the source prepares the target directly over X2-C with HANDOVER REQUEST/ACKNOWLEDGE, the target admitting bearers and returning the RRCConnectionReconfiguration(mobilityControlInfo) in a transparent container; (C) the source commands the UE, sends SN Status Transfer and forwards data over X2-U, and the UE does contention-free RACH and confirms with RRCConnectionReconfigurationComplete; (D) the target runs the S1AP Path Switch so the S-GW repoints downlink, receives a fresh {NH, NCC}, and tells the source to release with UE Context Release.
The core is touched exactly once, at the path switch, which is what makes X2 the fast path. Losslessness for AM bearers comes from SN Status Transfer (COUNT continuity) plus GTP-U forwarding; a short interruption comes from contention-free RACH. To debug, walk the fourteen steps in order and find the first message that is missing or carries the wrong IE — the phase it belongs to (measurement, preparation, execution, path switch) points straight at the subsystem to investigate.
Q. In an X2 handover, when is the core network involved, and why only then?
A. Only once, at the very end, via the S1AP Path Switch Request (step 11) after the UE is already on the target. Preparation and data forwarding happen directly eNB-to-eNB over X2-C/X2-U, so the EPC is spared the critical-path signalling; it is needed only to repoint the S1-U downlink at the S-GW and to hand back a fresh security context.
Q. How is lossless handover achieved for RLC-AM bearers?
A. Two mechanisms together: SN Status Transfer conveys the UL receiver status and the next DL PDCP COUNT (HFN+SN) so the target resumes numbering exactly, and GTP-U data forwarding over X2-U carries the unacknowledged/in-flight DL PDCP SDUs starting at that COUNT. The target then delivers them in order once the UE arrives, avoiding both loss and duplication.
Q. Why is X2 handover always intra-MME, and what carries security forward?
A. Because X2 preparation assumes the same serving MME/S-GW — there is no MME relocation signalling on X2. Security continuity is carried by the {KeNB*, NCC} the source derives and sends in HANDOVER REQUEST, and the MME returns a fresh {NH, NCC} in Path Switch Request Acknowledge for the UE's next handover. If the target is under a different MME, or no X2 exists, the network uses S1 handover instead.
LTE ↔ NR: the NR equivalent is the Xn handover. The shape is identical — direct gNB-to-gNB preparation, then a single core interaction — but the names change: HANDOVER REQUEST/ACKNOWLEDGE become XnAP messages, the handover command is RRCReconfiguration with reconfigurationWithSync (not mobilityControlInfo), data forwarding runs over Xn-U, and the final step is the NGAP Path Switch Request to the AMF (which updates the UPF per PDU session) rather than S1AP to the MME. NR also adds conditional handover (CHO) and DAPS, which have no LTE X2 counterpart.
Related call flows & topics
Compare the same relocation done through the core, and dig into the protocol that carries it.