From 9bf79cd2c92a66b90360a072631230c8cf0ef05f Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Tue, 22 Jul 2025 15:35:16 +0200 Subject: [PATCH] PDU session release: refactor NGAP PDU Session Release command/response * There is no IE corresponding to PDU sessions failed to release in the PDU SESSION RESOURCE RELEASE RESPONSE message. This was removed and the corresponding code was refactored and cleaned up. * In the Release Command handler, only established PDU Session are set to be released. The Response message is filled accordingly. --- openair2/COMMON/ngap_messages_types.h | 8 +------- openair2/RRC/NR/rrc_gNB_NGAP.c | 21 ++++++--------------- openair3/NGAP/ngap_gNB_nas_procedures.c | 5 ++--- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h index 1c5fa90868..2c4b0f8a0a 100644 --- a/openair2/COMMON/ngap_messages_types.h +++ b/openair2/COMMON/ngap_messages_types.h @@ -918,19 +918,13 @@ typedef struct ngap_pdusession_release_command_s { } ngap_pdusession_release_command_t; typedef struct ngap_pdusession_release_resp_s { - /* AMF UE id */ + // AMF UE NGAP ID uint64_t amf_ue_ngap_id; // RAN UE NGAP ID uint32_t gNB_ue_ngap_id; // PDU Session Resource Released List uint16_t nb_of_pdusessions_released; pdusession_release_t pdusession_release[NGAP_MAX_PDU_SESSION]; - - /* Number of pdusession failed to be released in list */ - uint8_t nb_of_pdusessions_failed; - /* list of pdusessions that failed to be released */ - pdusession_failed_t pdusessions_failed[NGAP_MAX_PDU_SESSION]; - } ngap_pdusession_release_resp_t; /** 9.2.3.14 Uplink RAN Status Transfer (3GPP TS 38.413) diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index 90a0522886..34666e3538 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -1489,7 +1489,6 @@ void rrc_gNB_send_NGAP_HANDOVER_CANCEL(int module_id, gNB_RRC_UE_t *UE, ngap_cau void rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, uint8_t xid) { - int pdu_sessions_released = 0; MessageDef *msg_p; msg_p = itti_alloc_new_message (TASK_RRC_GNB, rrc->module_id, NGAP_PDUSESSION_RELEASE_RESPONSE); ngap_pdusession_release_resp_t *resp = &NGAP_PDUSESSION_RELEASE_RESPONSE(msg_p); @@ -1499,17 +1498,15 @@ void rrc_gNB_send_NGAP_PDUSESSION_RELEASE_RESPONSE(gNB_RRC_INST *rrc, gNB_RRC_UE FOR_EACH_SEQ_ARR(rrc_pdu_session_param_t *, session, &UE->pduSessions) { if (xid == session->xid) { const pdusession_t *pdusession = &session->param; - resp->pdusession_release[pdu_sessions_released].pdusession_id = pdusession->pdusession_id; + if (session->status == PDU_SESSION_STATUS_TORELEASE) { + DevAssert(resp->nb_of_pdusessions_released < NGAP_MAX_PDU_SESSION); + resp->pdusession_release[resp->nb_of_pdusessions_released++].pdusession_id = pdusession->pdusession_id; + } session->status = PDU_SESSION_STATUS_RELEASED; - pdu_sessions_released++; } } - resp->nb_of_pdusessions_released = pdu_sessions_released; - resp->nb_of_pdusessions_failed = 0; - DevAssert(resp->nb_of_pdusessions_released < NGAP_MAX_PDU_SESSION); - - LOG_I(NR_RRC, "NGAP PDUSESSION RELEASE RESPONSE: rrc_ue_id %u release_pdu_sessions %d\n", resp->gNB_ue_ngap_id, pdu_sessions_released); + LOG_I(NR_RRC, "NGAP PDUSESSION RELEASE RESPONSE: rrc_ue_id %u release_pdu_sessions %d\n", resp->gNB_ue_ngap_id, resp->nb_of_pdusessions_released); itti_send_msg_to_task (TASK_NGAP, rrc->module_id, msg_p); } @@ -1538,13 +1535,7 @@ int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_ for (int pdusession = 0; pdusession < cmd->nb_pdusessions_torelease; pdusession++) { rrc_pdu_session_param_t *pduSession = find_pduSession(&UE->pduSessions, cmd->pdusession_release_params[pdusession].pdusession_id); if (!pduSession) { - LOG_I(NR_RRC, "no pdusession_id, AMF requested to close it id=%d\n", cmd->pdusession_release_params[pdusession].pdusession_id); - rrc_pdu_session_param_t item = {0}; - item.status = PDU_SESSION_STATUS_FAILED; - item.param.pdusession_id = cmd->pdusession_release_params[pdusession].pdusession_id; - ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID}; - item.cause = cause; - seq_arr_push_back(&UE->pduSessions, &item, sizeof(item)); + LOG_E(NR_RRC, "Failed to release non-existing PDU Session %d\n", cmd->pdusession_release_params[pdusession].pdusession_id); continue; } if (pduSession->status == PDU_SESSION_STATUS_FAILED) { diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c index b5db821e36..fe86d7c5e0 100644 --- a/openair3/NGAP/ngap_gNB_nas_procedures.c +++ b/openair3/NGAP/ngap_gNB_nas_procedures.c @@ -1206,11 +1206,10 @@ int ngap_gNB_pdusession_release_resp(instance_t instance, ngap_pdusession_releas /* UE associated signalling -> use the allocated stream */ ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance, ue_context_p->amf_ref->assoc_id, buffer, length, ue_context_p->tx_stream); - NGAP_INFO("pdusession_release_response sended gNB_UE_NGAP_ID %u amf_ue_ngap_id %lu nb_of_pdusessions_released %d nb_of_pdusessions_failed %d\n", + NGAP_INFO("pdusession_release_response sended gNB_UE_NGAP_ID %u amf_ue_ngap_id %lu nb_of_pdusessions_released %d \n", pdusession_release_resp_p->gNB_ue_ngap_id, (uint64_t)ue_context_p->amf_ue_ngap_id, - pdusession_release_resp_p->nb_of_pdusessions_released, - pdusession_release_resp_p->nb_of_pdusessions_failed); + pdusession_release_resp_p->nb_of_pdusessions_released); return 0; }