Commit 5b2b570d authored by Jaroslava Fiedlerova's avatar Jaroslava Fiedlerova

Merge remote-tracking branch 'origin/fix-up-ho-fail' into integration_2025_w45 (!3739)

Bugfix: save old tunnel info to remain the user plane connection while rolling
back to source DU due to handover failure

This MR closes issue #984 that UE lost the data plane connection while rolling
back to the source DU due to handover failure.
parents 89fbe3c7 579d263a
...@@ -1283,6 +1283,20 @@ static rrc_gNB_ue_context_t *rrc_gNB_get_ue_context_source_cell(gNB_RRC_INST *rr ...@@ -1283,6 +1283,20 @@ static rrc_gNB_ue_context_t *rrc_gNB_get_ue_context_source_cell(gNB_RRC_INST *rr
return NULL; return NULL;
} }
/**
* @brief Rollback F1-U DL TL and TEID in RRC
*/
static void f1u_dl_gtp_rollback(gNB_RRC_UE_t *UE)
{
DevAssert(UE != NULL);
DevAssert(UE->ho_context->source != NULL);
FOR_EACH_SEQ_ARR(drb_t *, drb, &UE->drbs) {
drb->du_tunnel_config = UE->ho_context->source->old_du_tunnel_config;
LOG_W(NR_RRC, "DRB id %d rollback to tunnel TEID %x\n", drb->drb_id, drb->du_tunnel_config.teid);
}
}
static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc, static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
sctp_assoc_t assoc_id, sctp_assoc_t assoc_id,
const NR_RRCReestablishmentRequest_IEs_t *req, const NR_RRCReestablishmentRequest_IEs_t *req,
...@@ -1361,6 +1375,7 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc, ...@@ -1361,6 +1375,7 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
} }
source_ctx->ho_cancel(rrc, UE); source_ctx->ho_cancel(rrc, UE);
f1u_dl_gtp_rollback(UE);
/* we need the original CellGroupConfig */ /* we need the original CellGroupConfig */
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->masterCellGroup); ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->masterCellGroup);
......
...@@ -160,6 +160,12 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc, ...@@ -160,6 +160,12 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc,
ho_ctx->source->du_ue_id = ue_data.secondary_ue; ho_ctx->source->du_ue_id = ue_data.secondary_ue;
ho_ctx->source->old_rnti = ue->rnti; ho_ctx->source->old_rnti = ue->rnti;
// Save the GTP-U tunnel info for source DU before process UE context setup request/response
// since tunnel info will be updated by calling store_du_f1u_tunnel() in rrc_CU_process_ue_context_setup_response()
FOR_EACH_SEQ_ARR(drb_t *, drb, &ue->drbs) {
ho_ctx->source->old_du_tunnel_config = drb->du_tunnel_config;
}
int result = asn_copy(&asn_DEF_NR_CellGroupConfig, (void **)&ho_ctx->source->old_cellGroupConfig, ue->masterCellGroup); int result = asn_copy(&asn_DEF_NR_CellGroupConfig, (void **)&ho_ctx->source->old_cellGroupConfig, ue->masterCellGroup);
AssertFatal(result == 0, "error during asn_copy() of CellGroupConfig\n"); AssertFatal(result == 0, "error during asn_copy() of CellGroupConfig\n");
} }
......
...@@ -56,6 +56,8 @@ typedef struct nr_ho_source_cu { ...@@ -56,6 +56,8 @@ typedef struct nr_ho_source_cu {
ho_cancel_t ho_cancel; ho_cancel_t ho_cancel;
/// status transfer /// status transfer
ho_status_transfer_t ho_status_transfer; ho_status_transfer_t ho_status_transfer;
/// old (source) downlink tunnel
gtpu_tunnel_t old_du_tunnel_config;
} nr_ho_source_cu_t; } nr_ho_source_cu_t;
/* acknowledgement of handover request. buf+len is the RRC Reconfiguration */ /* acknowledgement of handover request. buf+len is the RRC Reconfiguration */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment