From 040b25bf008b85564c38866480e0c3af9f8e3617 Mon Sep 17 00:00:00 2001 From: Rakesh Mundlamuri Date: Mon, 29 Dec 2025 18:51:08 +0530 Subject: [PATCH] Add NGAP DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT message decoding Reference: 3GPP 38.413 v16.0.0 Mandatory fields: Routing ID (supported) NRPPa-PDU (supported) --- openair2/COMMON/ngap_messages_def.h | 4 ++ openair2/COMMON/ngap_messages_types.h | 9 +++++ .../ngap_gNB_NRPPa_transport_procedures.c | 37 +++++++++++++++++++ .../ngap_gNB_NRPPa_transport_procedures.h | 3 ++ 4 files changed, 53 insertions(+) diff --git a/openair2/COMMON/ngap_messages_def.h b/openair2/COMMON/ngap_messages_def.h index 95d29baab2..a82b3cb849 100644 --- a/openair2/COMMON/ngap_messages_def.h +++ b/openair2/COMMON/ngap_messages_def.h @@ -94,3 +94,7 @@ MESSAGE_DEF(NGAP_DOWNLINKUEASSOCIATEDNRPPA, MESSAGE_PRIORITY_MED, ngap_downlink_ue_associated_nrppa_t, ngap_downlink_ue_associated_nrppa) +MESSAGE_DEF(NGAP_DOWNLINKNONUEASSOCIATEDNRPPA, + MESSAGE_PRIORITY_MED, + ngap_downlink_non_ue_associated_nrppa_t, + ngap_downlink_non_ue_associated_nrppa) diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h index b33cb34b09..e05f44f0b5 100644 --- a/openair2/COMMON/ngap_messages_types.h +++ b/openair2/COMMON/ngap_messages_types.h @@ -80,6 +80,7 @@ #define NGAP_DL_RAN_STATUS_TRANSFER(mSGpTR) (mSGpTR)->ittiMsg.ngap_dl_ran_status_transfer #define NGAP_DOWNLINKUEASSOCIATEDNRPPA(mSGpTR) (mSGpTR)->ittiMsg.ngap_downlink_ue_associated_nrppa +#define NGAP_DOWNLINKNONUEASSOCIATEDNRPPA(mSGpTR) (mSGpTR)->ittiMsg.ngap_downlink_non_ue_associated_nrppa //-------------------------------------------------------------------------------------------// /* Length of the transport layer address string @@ -1040,4 +1041,12 @@ typedef struct { byte_array_t nrppa_pdu; } ngap_downlink_ue_associated_nrppa_t; +// Downlink NON UE Associated NRPPA Transport message (9.2.9.3 3GPP 38.413 v16.0.0) +typedef struct { + // Routing ID (Mandatory) + byte_array_t routing_id; + // NRPPa pdu (Mandatory) + byte_array_t nrppa_pdu; +} ngap_downlink_non_ue_associated_nrppa_t; + #endif /* NGAP_MESSAGES_TYPES_H_ */ diff --git a/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.c b/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.c index 67b1db1578..37b5e3b344 100644 --- a/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.c +++ b/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.c @@ -275,3 +275,40 @@ int ngap_gNB_handle_downlink_ue_associated_nrppa_transport(sctp_assoc_t assoc_id return 0; } + +// handle DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT (9.2.9.3 of TS 38.413 Version 16.0.0) +int ngap_gNB_handle_downlink_non_ue_associated_nrppa_transport(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu) +{ + DevAssert(pdu != NULL); + ngap_gNB_amf_data_t *amf_desc_p = NULL; + + if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) { + NGAP_ERROR("[SCTP %d] Received NRPPa downlink message for non existing AMF context\n", assoc_id); + return -1; + } + + ngap_gNB_instance_t *ngap_gNB_instance = NULL; + ngap_gNB_instance = amf_desc_p->ngap_gNB_instance; + + MessageDef *msg = itti_alloc_new_message(TASK_NGAP, 0, NGAP_DOWNLINKNONUEASSOCIATEDNRPPA); + ngap_downlink_non_ue_associated_nrppa_t *dl_non_ue_assoc_nrppa = &NGAP_DOWNLINKNONUEASSOCIATEDNRPPA(msg); + + // Prepare the NGAP message to forward to NRPPA + NGAP_DownlinkNonUEAssociatedNRPPaTransport_t *container; + NGAP_DownlinkNonUEAssociatedNRPPaTransportIEs_t *ie; + + // IE: 9.3.1.1 Message Type + container = &pdu->choice.initiatingMessage->value.choice.DownlinkNonUEAssociatedNRPPaTransport; + + // IE: 9.3.3.13 Routing ID + NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNonUEAssociatedNRPPaTransportIEs_t, ie, container, NGAP_ProtocolIE_ID_id_RoutingID, true); + dl_non_ue_assoc_nrppa->routing_id = create_byte_array(ie->value.choice.RoutingID.size, ie->value.choice.RoutingID.buf); + + // IE: 9.3.3.14 NRPPa-PDU + NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNonUEAssociatedNRPPaTransportIEs_t, ie, container, NGAP_ProtocolIE_ID_id_NRPPa_PDU, true); + dl_non_ue_assoc_nrppa->nrppa_pdu = create_byte_array(ie->value.choice.NRPPa_PDU.size, ie->value.choice.NRPPa_PDU.buf); + + itti_send_msg_to_task(TASK_NRPPA, ngap_gNB_instance->instance, msg); + + return 0; +} diff --git a/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.h b/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.h index c045ce31aa..a180888029 100644 --- a/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.h +++ b/openair3/NGAP/ngap_gNB_NRPPa_transport_procedures.h @@ -31,4 +31,7 @@ int ngap_gNB_uplink_non_ue_associated_nrppa_transport(instance_t instance, const // DOWNLINK UE ASSOCIATED NRPPA TRANSPORT (9.2.9.1 of TS 38.413 Version 16.0.0) int ngap_gNB_handle_downlink_ue_associated_nrppa_transport(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu); +// DOWNLINK UE ASSOCIATED NRPPA TRANSPORT (9.2.9.3 of TS 38.413 Version 16.0.0) +int ngap_gNB_handle_downlink_non_ue_associated_nrppa_transport(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu); + #endif /* NGAP_GNB_NRPPA_PROCEDURES_H_ */