From 42a9f2f08fef426b8da326dca99793101927e2e8 Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Mon, 22 Sep 2025 22:42:33 +0200 Subject: [PATCH] Enable multiple PDU Sessions in handover request logic - Process all PDU sessions in handover request instead of only the first one - Add DevAssert for bounds checking on nb_of_pdusessions - Fix logic error where multiple PDU sessions were ignored in handover scenarios --- openair2/RRC/NR/rrc_gNB_NGAP.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index dba6fde8ae..77682998f4 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -1138,14 +1138,19 @@ int rrc_gNB_process_Handover_Request(gNB_RRC_INST *rrc, instance_t instance, nga activate_srb(UE, SRB2); nr_rrc_pdcp_config_security(UE, false); - // Copy PDU Session Resource Setup item to RRC struct and do PDU Session Resource Setup procedure - pdusession_t to_setup = { - .nssai = msg->pduSessionResourceSetupList->nssai, - .pdu_session_type = msg->pduSessionResourceSetupList->pdu_session_type , - .pdusession_id = msg->pduSessionResourceSetupList->pdusession_id, - }; - cp_pdusession_transfer_to_pdusession(&to_setup, &msg->pduSessionResourceSetupList->pdusessionTransfer); - if (!trigger_bearer_setup(rrc, UE, msg->nb_of_pdusessions, &to_setup, msg->ue_ambr.br_dl)) { + // Process all PDU Session Resource Setup items from handover request + DevAssert(msg->nb_of_pdusessions <= NGAP_MAX_PDU_SESSION); + pdusession_t to_setup[NGAP_MAX_PDU_SESSION]; + for (int i = 0; i < msg->nb_of_pdusessions; i++) { + ho_request_pdusession_t *ho_pdu = &msg->pduSessionResourceSetupList[i]; + pdusession_t *pdu = &to_setup[i]; + pdu->nssai = ho_pdu->nssai; + pdu->pdu_session_type = ho_pdu->pdu_session_type; + pdu->pdusession_id = ho_pdu->pdusession_id; + cp_pdusession_transfer_to_pdusession(pdu, &ho_pdu->pdusessionTransfer); + } + + if (!trigger_bearer_setup(rrc, UE, msg->nb_of_pdusessions, to_setup, msg->ue_ambr.br_dl)) { LOG_E(NR_RRC, "Failed to establish PDU session: handover failed\n"); ngap_handover_failure_t fail = { .amf_ue_ngap_id = msg->amf_ue_ngap_id,