From 7254e59df911af627ee7410b7bf7eb5ae432af55 Mon Sep 17 00:00:00 2001 From: Guido Casati Date: Wed, 24 Sep 2025 15:34:01 +0200 Subject: [PATCH] Introduced MAX_QOS_FLOWS (64) and replaced QOSFLOW_MAX_VALUE The maximum number of QoS flows is 64. - Replace QOSFLOW_MAX_VALUE with MAX_QOS_FLOWS constant - Move MAX_QOS_FLOWS definition to common/platform_constants.h - Remove duplicate QOSFLOW_MAX_VALUE definition from ngap_messages_types.h This improves maintainability by centralizing the QoS flow limit constant and eliminates duplicate definitions across different header files. --- common/platform_constants.h | 3 +++ openair2/COMMON/ngap_messages_types.h | 14 ++++++-------- openair2/RRC/NR/nr_rrc_defs.h | 2 +- openair2/RRC/NR/rrc_gNB_NGAP.c | 14 +++++++------- openair2/RRC/NR/rrc_gNB_radio_bearers.c | 6 +++--- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/common/platform_constants.h b/common/platform_constants.h index 00c68bd5b8..4000ffb001 100644 --- a/common/platform_constants.h +++ b/common/platform_constants.h @@ -97,4 +97,7 @@ #define UNUSED_VARIABLE(vARIABLE) (void)(vARIABLE) #define NUM_PRACH_RX_FOR_NOISE_ESTIMATE 100 +// SDAP +#define MAX_QOS_FLOWS 64 + #endif /* __PLATFORM_CONSTANTS_H__ */ diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h index d5a5aca5aa..a07f798005 100644 --- a/openair2/COMMON/ngap_messages_types.h +++ b/openair2/COMMON/ngap_messages_types.h @@ -91,8 +91,6 @@ #define NGAP_MAX_NB_AMF_IP_ADDRESS 10 #define NGAP_IMSI_LENGTH 16 -#define QOSFLOW_MAX_VALUE 64 - #define NGAP_MAX_NO_TAI_PAGING 16 // 9.2.4.1 3GPP TS 38.413 /* Security key length used within gNB @@ -241,7 +239,7 @@ typedef struct ngap_mobility_restriction_s{ /* PDU Session Resource Setup Request Transfer (9.3.4.1 3GPP TS 38.413) */ typedef struct { uint8_t nb_qos; - pdusession_level_qos_parameter_t qos[QOSFLOW_MAX_VALUE]; + pdusession_level_qos_parameter_t qos[MAX_QOS_FLOWS]; pdu_session_type_t pdu_session_type; // UPF endpoint of the NG-U (N3) transport bearer gtpu_tunnel_t n3_incoming; @@ -272,7 +270,7 @@ typedef struct pdusession_setup_s { uint8_t nb_of_qos_flow; /* qos flow list(1 ~ 64) */ - pdusession_associate_qosflow_t associated_qos_flows[QOSFLOW_MAX_VALUE]; + pdusession_associate_qosflow_t associated_qos_flows[MAX_QOS_FLOWS]; } pdusession_setup_t; typedef struct qos_flow_tobe_modified_s { @@ -286,7 +284,7 @@ typedef struct pdusession_modify_s { uint8_t nb_of_qos_flow; // qos_flow_add_or_modify - qos_flow_tobe_modified_t qos[QOSFLOW_MAX_VALUE]; + qos_flow_tobe_modified_t qos[MAX_QOS_FLOWS]; } pdusession_modify_t; /* Cause (9.3.1.2 of 3GPP TS 38.413) */ @@ -506,7 +504,7 @@ typedef struct { uint8_t pdusession_id; // QoS Flow Information List uint8_t nb_of_qos_flow; - qosflow_info_t qos_flow_info[QOSFLOW_MAX_VALUE]; + qosflow_info_t qos_flow_info[MAX_QOS_FLOWS]; } pdusession_resource_info_t; /* 3GPP TS 38.413 9.3.1.97 */ @@ -627,7 +625,7 @@ typedef struct { typedef struct { // QoS Flow Setup Response List uint8_t nb_of_qos_flow; - pdusession_associate_qosflow_t qos_setup_list[QOSFLOW_MAX_VALUE]; + pdusession_associate_qosflow_t qos_setup_list[MAX_QOS_FLOWS]; // DL NG-U UP TNL Information uint32_t gtp_teid; transport_layer_addr_t gNB_addr; @@ -657,7 +655,7 @@ typedef struct { typedef struct { // QoS Flow to be Forwarded List uint8_t nb_of_qos_flow; - pdusession_associate_qosflow_t qos_setup_list[QOSFLOW_MAX_VALUE]; + pdusession_associate_qosflow_t qos_setup_list[MAX_QOS_FLOWS]; // UL Forwarding UP TNL Information uint32_t gtp_teid; transport_layer_addr_t gNB_addr; diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h index 3491154923..65bb3095e7 100644 --- a/openair2/RRC/NR/nr_rrc_defs.h +++ b/openair2/RRC/NR/nr_rrc_defs.h @@ -132,7 +132,7 @@ typedef struct drb_s { int pdusession_id; int sdap_HeaderDL; int sdap_HeaderUL; - int mappedQoS_FlowsToAdd[QOSFLOW_MAX_VALUE]; + int mappedQoS_FlowsToAdd[MAX_QOS_FLOWS]; } sdap_config; } cnAssociation; struct pdcp_config_s { diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c index e584912a38..4effc47935 100644 --- a/openair2/RRC/NR/rrc_gNB_NGAP.c +++ b/openair2/RRC/NR/rrc_gNB_NGAP.c @@ -176,7 +176,7 @@ static void cp_pdusession_transfer_to_pdusession(pdusession_t *dst, const pduses dst->n3_incoming = src->n3_incoming; /* QoS handling */ DevAssert(!dst->qos.data); - DevAssert(src->nb_qos < QOSFLOW_MAX_VALUE); + DevAssert(src->nb_qos < MAX_QOS_FLOWS); // Initialise mapped QoS list per PDU Session seq_arr_init(&dst->qos, sizeof(nr_rrc_qos_t)); // Add QoS flow to list @@ -355,7 +355,7 @@ bool trigger_bearer_setup(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, pdusession FOR_EACH_SEQ_ARR(nr_rrc_qos_t *, qos, &session->qos) { pdusession_level_qos_parameter_t *qos_session = &qos->qos; - DevAssert(drb->numQosFlow2Setup < QOSFLOW_MAX_VALUE); + DevAssert(drb->numQosFlow2Setup < MAX_QOS_FLOWS); qos_flow_to_setup_t *qos_flow = &drb->qosFlows[drb->numQosFlow2Setup++]; qos_characteristics_t *qos_char = &qos_flow->qos_params.qos_characteristics; qos_flow->qfi = qos_session->qfi; @@ -515,7 +515,7 @@ static pdusession_setup_t fill_ngap_pdusession_setup(pdusession_t *session) out.pdu_session_type = session->pdu_session_type; out.n3_outgoing = cp_gtp_tunnel(session->n3_outgoing); FOR_EACH_SEQ_ARR(nr_rrc_qos_t *, qos_session, &session->qos) { - DevAssert(out.nb_of_qos_flow < QOSFLOW_MAX_VALUE); + DevAssert(out.nb_of_qos_flow < MAX_QOS_FLOWS); pdusession_associate_qosflow_t *q = &out.associated_qos_flows[out.nb_of_qos_flow++]; q->qfi = qos_session->qos.qfi; q->qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL; @@ -882,7 +882,7 @@ void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t ins static void nr_rrc_update_qos(seq_arr_t *list, const int nb_qos, const pdusession_level_qos_parameter_t *in_qos) { DevAssert(nb_qos == 1); - DevAssert(nb_qos < QOSFLOW_MAX_VALUE); + DevAssert(nb_qos < MAX_QOS_FLOWS); for (uint8_t i = 0; i < nb_qos; ++i) { nr_rrc_qos_t *qos = find_qos(list, in_qos[i].qfi); if (qos) { @@ -1012,7 +1012,7 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE pdusession_modify_t *p = &resp->pdusessions[pdu_sessions_done++]; p->pdusession_id = session->param.pdusession_id; FOR_EACH_SEQ_ARR(nr_rrc_qos_t *, qos_session, &session->param.qos) { - DevAssert(p->nb_of_qos_flow < QOSFLOW_MAX_VALUE); + DevAssert(p->nb_of_qos_flow < MAX_QOS_FLOWS); qos_flow_tobe_modified_t *q = &p->qos[p->nb_of_qos_flow++]; q->qfi = qos_session->qos.qfi; } @@ -1414,7 +1414,7 @@ void rrc_gNB_send_NGAP_HANDOVER_REQUEST_ACKNOWLEDGE(gNB_RRC_INST *rrc, gNB_RRC_U memcpy(transfer->gNB_addr.buffer, session->param.n3_outgoing.addr.buffer, session->param.n3_outgoing.addr.length); transfer->gNB_addr.length = session->param.n3_outgoing.addr.length; FOR_EACH_SEQ_ARR(nr_rrc_qos_t *, qos, &session->param.qos) { - DevAssert(transfer->nb_of_qos_flow < QOSFLOW_MAX_VALUE); + DevAssert(transfer->nb_of_qos_flow < MAX_QOS_FLOWS); pdusession_associate_qosflow_t *qos_setup = &transfer->qos_setup_list[transfer->nb_of_qos_flow++]; qos_setup->qfi = qos->qos.qfi; qos_setup->qos_flow_mapping_ind = QOSFLOW_MAPPING_INDICATION_DL; @@ -1662,7 +1662,7 @@ void rrc_gNB_send_NGAP_HANDOVER_REQUIRED(gNB_RRC_INST *rrc, pdusession_resource_info_t *pdu_info = &msg.source2target->pdu_session_resource[msg.source2target->nb_pdu_session_resource++]; pdu_info->pdusession_id = session->pdusession_id; FOR_EACH_SEQ_ARR(nr_rrc_qos_t *, qos, &session->qos) { - DevAssert(pdu_info->nb_of_qos_flow < QOSFLOW_MAX_VALUE); + DevAssert(pdu_info->nb_of_qos_flow < MAX_QOS_FLOWS); qosflow_info_t *qos_flow = &pdu_info->qos_flow_info[pdu_info->nb_of_qos_flow++]; qos_flow->qfi = qos->qos.qfi; } diff --git a/openair2/RRC/NR/rrc_gNB_radio_bearers.c b/openair2/RRC/NR/rrc_gNB_radio_bearers.c index ab68a4c367..ccf3fbe99f 100644 --- a/openair2/RRC/NR/rrc_gNB_radio_bearers.c +++ b/openair2/RRC/NR/rrc_gNB_radio_bearers.c @@ -60,7 +60,7 @@ nr_rrc_qos_t *add_qos(seq_arr_t *qos, const pdusession_level_qos_parameter_t *in DevAssert(qos); DevAssert(in); - if (seq_arr_size(qos) == QOSFLOW_MAX_VALUE) { + if (seq_arr_size(qos) == MAX_QOS_FLOWS) { LOG_W(NR_RRC, "Reached maximum number of QoS flows = %ld\n", seq_arr_size(qos)); return NULL; } @@ -270,7 +270,7 @@ drb_t *generateDRB(gNB_RRC_UE_t *ue, FOR_EACH_SEQ_ARR(nr_rrc_qos_t *, qos_session, &pduSession->qos) { qos_session->drb_id = est_drb->drb_id; // Map DRB to QoS est_drb->cnAssociation.sdap_config.mappedQoS_FlowsToAdd[qos_flow_index++] = qos_session->qos.qfi; - DevAssert(qos_flow_index <= QOSFLOW_MAX_VALUE); + DevAssert(qos_flow_index <= MAX_QOS_FLOWS); } /* PDCP Configuration */ set_default_drb_pdcp_config(&est_drb->pdcp_config, do_drb_integrity, do_drb_ciphering, pdcp_config, ue->redcap_cap); @@ -299,7 +299,7 @@ NR_DRB_ToAddMod_t *generateDRB_ASN1(const drb_t *drb_asn1) SDAP_config->sdap_HeaderUL = drb_asn1->cnAssociation.sdap_config.sdap_HeaderUL; SDAP_config->defaultDRB = drb_asn1->cnAssociation.sdap_config.defaultDRB; - for (int qos_flow_index = 0; qos_flow_index < QOSFLOW_MAX_VALUE; qos_flow_index++) { + for (int qos_flow_index = 0; qos_flow_index < MAX_QOS_FLOWS; qos_flow_index++) { if (drb_asn1->cnAssociation.sdap_config.mappedQoS_FlowsToAdd[qos_flow_index] != 0) { asn1cSequenceAdd(sdapFlows->list, NR_QFI_t, qfi); *qfi = drb_asn1->cnAssociation.sdap_config.mappedQoS_FlowsToAdd[qos_flow_index];