diff --git a/openair2/COMMON/nrppa_messages_def.h b/openair2/COMMON/nrppa_messages_def.h index d20bf1960a..bb5d534856 100644 --- a/openair2/COMMON/nrppa_messages_def.h +++ b/openair2/COMMON/nrppa_messages_def.h @@ -32,3 +32,7 @@ MESSAGE_DEF(NRPPA_POSITIONING_INFORMATION_RESP, MESSAGE_PRIORITY_MED, nrppa_positioning_information_resp_t, nrppa_positioning_information_resp) +MESSAGE_DEF(NRPPA_POSITIONING_ACTIVATION_REQ, + MESSAGE_PRIORITY_MED, + nrppa_positioning_activation_req_t, + nrppa_positioning_activation_req) diff --git a/openair2/COMMON/nrppa_messages_types.h b/openair2/COMMON/nrppa_messages_types.h index 4522604422..077c5a89b0 100644 --- a/openair2/COMMON/nrppa_messages_types.h +++ b/openair2/COMMON/nrppa_messages_types.h @@ -28,6 +28,7 @@ #define NRPPA_TRP_INFORMATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.nrppa_trp_information_resp #define NRPPA_POSITIONING_INFORMATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrppa_positioning_information_req #define NRPPA_POSITIONING_INFORMATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.nrppa_positioning_information_resp +#define NRPPA_POSITIONING_ACTIVATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrppa_positioning_activation_req /* Structure of Positioning related NRPPA messages */ /* IE structures for Positioning related messages as per TS 38.455 V16.7.1*/ @@ -570,6 +571,22 @@ typedef struct nrppa_trp_information_list_s { uint32_t trp_information_item_length; } nrppa_trp_information_list_t; +typedef union nrppa_srs_type_c { + uint8_t *srs_resource_set_id; + bool *aperiodic; +} nrppa_srs_type_u; + +typedef enum nrppa_srs_type_e { + NRPPA_SRS_TYPE_PR_NOTHING, + NRPPA_SRS_TYPE_PR_SEMIPERSISTENTSRS, + NRPPA_SRS_TYPE_PR_APERIODICSRS +} nrppa_srs_type_pr; + +typedef struct nrppa_srs_type_s { + nrppa_srs_type_pr present; + nrppa_srs_type_u choice; +} nrppa_srs_type_t; + typedef struct nrppa_trp_information_req_s { // IE 9.2.4 (mandatory) uint16_t transaction_id; @@ -599,4 +616,11 @@ typedef struct nrppa_positioning_information_resp_s { nrppa_srs_configuration_t *srs_configuration; } nrppa_positioning_information_resp_t; +typedef struct nrppa_positioning_activation_req_s { + // IE 9.2.4 (mandatory) + uint16_t transaction_id; + // (mandatory) + nrppa_srs_type_t srs_type; +} nrppa_positioning_activation_req_t; + #endif // NRPPA_MESSAGES_TYPES_H_ diff --git a/openair3/NRPPA/nrppa_gNB_decoder.c b/openair3/NRPPA/nrppa_gNB_decoder.c index 94524fd060..340ff63baa 100644 --- a/openair3/NRPPA/nrppa_gNB_decoder.c +++ b/openair3/NRPPA/nrppa_gNB_decoder.c @@ -40,7 +40,11 @@ static int nrppa_gNB_decode_initiating_message(NRPPA_NRPPA_PDU_t *pdu) LOG_I(NRPPA, "Positioning Information Request initiating message\n"); free(res.buffer); break; - + case NRPPA_ProcedureCode_id_positioningActivation: + res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_NRPPA_NRPPA_PDU, pdu); + LOG_I(NRPPA, "Positioning Activation initiating message\n"); + free(res.buffer); + break; default: AssertFatal(false, "Unknown procedure ID (%d) for initiating message\n", (int)pdu->choice.initiatingMessage->procedureCode); return -1; diff --git a/openair3/NRPPA/nrppa_gNB_handlers.c b/openair3/NRPPA/nrppa_gNB_handlers.c index 99299ecb64..4689351b11 100644 --- a/openair3/NRPPA/nrppa_gNB_handlers.c +++ b/openair3/NRPPA/nrppa_gNB_handlers.c @@ -57,7 +57,9 @@ nrppa_message_decoded_callback nrppa_messages_callback[][3] = { {0, 0, 0}, // NRPPA_ProcedureCode_id_MeasurementAbort ((NRPPA_ProcedureCode_t)14) {0, 0, 0}, // NRPPA_ProcedureCode_id_MeasurementFailureIndication ((NRPPA_ProcedureCode_t)15) {nrppa_gNB_handle_trp_information_request, 0, 0}, // NRPPA_ProcedureCode_id_tRPInformationExchange ((NRPPA_ProcedureCode_t)16) - {0, 0, 0}, // NRPPA_ProcedureCode_id_positioningActivation ((NRPPA_ProcedureCode_t)17) + {nrppa_gNB_handle_positioning_activation_request, + 0, + 0}, // NRPPA_ProcedureCode_id_positioningActivation ((NRPPA_ProcedureCode_t)17) {0, 0, 0}, // NRPPA_ProcedureCode_id_positioningDeactivation ((NRPPA_ProcedureCode_t)18) }; diff --git a/openair3/NRPPA/nrppa_gNB_location_information_transfer.c b/openair3/NRPPA/nrppa_gNB_location_information_transfer.c index 5d1a43c0a6..dfaa7f1efc 100644 --- a/openair3/NRPPA/nrppa_gNB_location_information_transfer.c +++ b/openair3/NRPPA/nrppa_gNB_location_information_transfer.c @@ -985,6 +985,37 @@ void free_positioning_information_response(nrppa_positioning_information_resp_t } } +void decode_nrppa_srstype(NRPPA_SRSType_t *srs_type, nrppa_srs_type_t *out) +{ + switch (srs_type->present) { + case NRPPA_SRSType_PR_NOTHING: + out->present = NRPPA_SRS_TYPE_PR_NOTHING; + break; + case NRPPA_SRSType_PR_semipersistentSRS: + out->present = NRPPA_SRS_TYPE_PR_SEMIPERSISTENTSRS; + out->choice.srs_resource_set_id = calloc_or_fail(1, sizeof(*out->choice.srs_resource_set_id)); + *out->choice.srs_resource_set_id = srs_type->choice.semipersistentSRS->sRSResourceSetID; + break; + case NRPPA_SRSType_PR_aperiodicSRS: + out->present = NRPPA_SRS_TYPE_PR_APERIODICSRS; + out->choice.aperiodic = calloc_or_fail(1, sizeof(*out->choice.aperiodic)); + *out->choice.aperiodic = srs_type->choice.aperiodicSRS->aperiodic; + break; + default: + AssertFatal(false, "received illegal SRS type\n"); + break; + } +} + +void free_positioning_activation_request(nrppa_positioning_activation_req_t *msg) +{ + if (msg->srs_type.present == NRPPA_SRS_TYPE_PR_SEMIPERSISTENTSRS) { + free(msg->srs_type.choice.srs_resource_set_id); + } else if (msg->srs_type.present == NRPPA_SRS_TYPE_PR_APERIODICSRS) { + free(msg->srs_type.choice.aperiodic); + } +} + int nrppa_gNB_handle_trp_information_request(nrppa_gnb_ue_info_t *nrppa_msg_info, const NRPPA_NRPPA_PDU_t *pdu) { LOG_I(NRPPA, "Processing Received TRP Information Request \n"); @@ -1244,3 +1275,40 @@ int nrppa_gNB_positioning_information_response(instance_t instance, MessageDef * free(buffer); return length; } + +int nrppa_gNB_handle_positioning_activation_request(nrppa_gnb_ue_info_t *nrppa_msg_info, const NRPPA_NRPPA_PDU_t *pdu) +{ + LOG_I(NRPPA, "Processing Received Positioning Activation Request \n"); + DevAssert(pdu != NULL); + DevAssert(nrppa_msg_info != NULL); + + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NRPPA_NRPPA_PDU, pdu); + } + + // Preparing positioning information request for RRC + MessageDef *msg = itti_alloc_new_message(TASK_RRC_GNB, 0, NRPPA_POSITIONING_ACTIVATION_REQ); + nrppa_positioning_activation_req_t *req = &NRPPA_POSITIONING_ACTIVATION_REQ(msg); + + // Processing Received PositioningActivationRequest + NRPPA_PositioningActivationRequest_t *container = NULL; + NRPPA_PositioningActivationRequestIEs_t *ie = NULL; + + // IE 9.2.3 Message type : mandatory + container = &pdu->choice.initiatingMessage->value.choice.PositioningActivationRequest; + + // IE 9.2.4 nrppatransactionID : mandatory + req->transaction_id = pdu->choice.initiatingMessage->nrppatransactionID; + + // IE SRSType : mandatory + NRPPA_FIND_PROTOCOLIE_BY_ID(NRPPA_PositioningActivationRequestIEs_t, ie, container, NRPPA_ProtocolIE_ID_id_SRSType, true); + decode_nrppa_srstype(&ie->value.choice.SRSType, &req->srs_type); + + nrppa_store_ue_context(nrppa_msg_info, req->transaction_id); + + LOG_I(NRPPA, "Forwarding to RRC Positioning Activation Request transaction id = %d\n", req->transaction_id); + + itti_send_msg_to_task(TASK_RRC_GNB, 0, msg); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu); + return 0; +} diff --git a/openair3/NRPPA/nrppa_gNB_location_information_transfer.h b/openair3/NRPPA/nrppa_gNB_location_information_transfer.h index 31ab194345..d86c7b2744 100644 --- a/openair3/NRPPA/nrppa_gNB_location_information_transfer.h +++ b/openair3/NRPPA/nrppa_gNB_location_information_transfer.h @@ -32,5 +32,8 @@ int nrppa_gNB_handle_positioning_information_request(nrppa_gnb_ue_info_t *nrppa_ int nrppa_gNB_positioning_information_response(instance_t instance, MessageDef *msg_p); NRPPA_SRSCarrier_List_t encode_srs_carrier_list_nrppa(const nrppa_srs_carrier_list_t *in_list); void free_positioning_information_response(nrppa_positioning_information_resp_t *msg); +int nrppa_gNB_handle_positioning_activation_request(nrppa_gnb_ue_info_t *nrppa_msg_info, const NRPPA_NRPPA_PDU_t *pdu); +void decode_nrppa_srstype(NRPPA_SRSType_t *srs_type, nrppa_srs_type_t *out); +void free_positioning_activation_request(nrppa_positioning_activation_req_t *msg); #endif /* NRPPA_GNB_POSITIONING_PROCEDURES_H_ */ diff --git a/openair3/NRPPA/nrppa_includes.h b/openair3/NRPPA/nrppa_includes.h index 6915b93370..6465d6c0af 100644 --- a/openair3/NRPPA/nrppa_includes.h +++ b/openair3/NRPPA/nrppa_includes.h @@ -69,5 +69,7 @@ #include "NRPPA_PosResourceSetTypePeriodic.h" #include "NRPPA_PosResourceSetTypeSemi-persistent.h" #include "NRPPA_PosResourceSetTypeAperiodic.h" +#include "NRPPA_SemipersistentSRS.h" +#include "NRPPA_AperiodicSRS.h" #endif /* NRPPA_INCLUDE_H_ */