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.
This commit is contained in:
@@ -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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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 {
|
|||||||
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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user