diff --git a/openair2/COMMON/nrppa_messages_def.h b/openair2/COMMON/nrppa_messages_def.h index e3ddeb244f..d20bf1960a 100644 --- a/openair2/COMMON/nrppa_messages_def.h +++ b/openair2/COMMON/nrppa_messages_def.h @@ -28,3 +28,7 @@ MESSAGE_DEF(NRPPA_POSITIONING_INFORMATION_REQ, MESSAGE_PRIORITY_MED, nrppa_positioning_information_req_t, nrppa_positioning_information_req) +MESSAGE_DEF(NRPPA_POSITIONING_INFORMATION_RESP, + MESSAGE_PRIORITY_MED, + nrppa_positioning_information_resp_t, + nrppa_positioning_information_resp) diff --git a/openair2/COMMON/nrppa_messages_types.h b/openair2/COMMON/nrppa_messages_types.h index fef930ac9a..4522604422 100644 --- a/openair2/COMMON/nrppa_messages_types.h +++ b/openair2/COMMON/nrppa_messages_types.h @@ -27,6 +27,7 @@ #define NRPPA_TRP_INFORMATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nrppa_trp_information_req #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 /* Structure of Positioning related NRPPA messages */ /* IE structures for Positioning related messages as per TS 38.455 V16.7.1*/ @@ -223,6 +224,346 @@ typedef struct nrppa_trp_information_s { nrppa_trp_information_type_response_list_t trp_information_type_response_list; } nrppa_trp_information_t; +typedef enum nrppa_subcarrier_spacing_e { + NRPPA_SUBCARRIER_SPACING_15KHZ, + NRPPA_SUBCARRIER_SPACING_30KHZ, + NRPPA_SUBCARRIER_SPACING_60KHZ, + NRPPA_SUBCARRIER_SPACING_120KHZ +} nrppa_subcarrier_spacing_pr; + +typedef struct nrppa_scs_specific_carrier_s { + uint32_t offset_to_carrier; + nrppa_subcarrier_spacing_pr subcarrier_spacing; + uint16_t carrier_bandwidth; +} nrppa_scs_specific_carrier_t; + +typedef struct nrppa_uplink_channel_bw_per_scs_list_s { + nrppa_scs_specific_carrier_t *scs_specific_carrier; + uint32_t scs_specific_carrier_list_length; +} nrppa_uplink_channel_bw_per_scs_list_t; + +typedef enum nrppa_transmission_comb_e { + NRPPA_TRANSMISSION_COMB_PR_NOTHING, + NRPPA_TRANSMISSION_COMB_PR_N2, + NRPPA_TRANSMISSION_COMB_PR_N4 +} nrppa_transmission_comb_pr; + +typedef struct nrppa_transmission_comb_n2_s { + uint8_t comb_offset_n2; + uint8_t cyclic_shift_n2; +} nrppa_transmission_comb_n2_t, nrppa_transmission_comb_pos_n2_t; + +typedef struct nrppa_transmission_comb_n4_s { + uint8_t comb_offset_n4; + uint8_t cyclic_shift_n4; +} nrppa_transmission_comb_n4_t, nrppa_transmission_comb_pos_n4_t; + +typedef union nrppa_transmission_comb_c { + nrppa_transmission_comb_n2_t n2; + nrppa_transmission_comb_n4_t n4; +} nrppa_transmission_comb_u; + +typedef struct nrppa_transmission_comb_s { + nrppa_transmission_comb_pr present; + nrppa_transmission_comb_u choice; +} nrppa_transmission_comb_t; + +typedef enum nrppa_srs_resource_type_periodicity_e { + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT1 = 0, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT2, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT4, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT5, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT8, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT10, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT16, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT20, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT32, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT40, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT64, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT80, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT160, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT320, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT640, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT1280, + NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT2560 +} nrppa_srs_resource_type_periodicity_pr; + +typedef struct nrppa_resource_type_periodic_s { + nrppa_srs_resource_type_periodicity_pr periodicity; + uint16_t offset; +} nrppa_resource_type_periodic_t, nrppa_resource_type_semi_persistent_t; + +typedef union nrppa_resource_type_c { + nrppa_resource_type_periodic_t periodic; + nrppa_resource_type_semi_persistent_t semi_persistent; + bool aperiodic; +} nrppa_resource_type_u; + +typedef enum nrppa_resource_type_e { + NRPPA_RESOURCE_TYPE_PR_NOTHING, + NRPPA_RESOURCE_TYPE_PR_PERIODIC, + NRPPA_RESOURCE_TYPE_PR_SEMI_PERSISTENT, + NRPPA_RESOURCE_TYPE_PR_APERIODIC +} nrppa_resource_type_pr; + +typedef struct nrppa_resource_type_s { + nrppa_resource_type_pr present; + nrppa_resource_type_u choice; +} nrppa_resource_type_t; + +typedef struct nrppa_transmission_comb_n8_s { + uint8_t comb_offset_n8; + uint8_t cyclic_shift_n8; +} nrppa_transmission_comb_pos_n8_t; + +typedef union nrppa_transmission_comb_pos_c { + nrppa_transmission_comb_pos_n2_t n2; + nrppa_transmission_comb_pos_n4_t n4; + nrppa_transmission_comb_pos_n8_t n8; +} nrppa_transmission_comb_pos_u; + +typedef enum nrppa_transmission_comb_pos_e { + NRPPA_TRANSMISSION_COMB_POS_PR_NOTHING, + NRPPA_TRANSMISSION_COMB_POS_PR_N2, + NRPPA_TRANSMISSION_COMB_POS_PR_N4, + NRPPA_TRANSMISSION_COMB_POS_PR_N8 +} nrppa_transmission_comb_pos_pr; + +typedef struct nrppa_transmission_comb_pos_s { + nrppa_transmission_comb_pos_pr present; + nrppa_transmission_comb_pos_u choice; +} nrppa_transmission_comb_pos_t; + +typedef enum nrppa_srs_resource_type_pos_periodicity_e { + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT1 = 0, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT2, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT4, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT8, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT10, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT16, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT20, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT32, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT40, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT64, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT80, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT160, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT320, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT640, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT1280, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT2560, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5120, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT10240, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT20480, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT40960, + NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT81920 +} nrppa_srs_resource_type_pos_periodicity_pr; + +typedef struct nrppa_resource_type_periodic_pos_s { + nrppa_srs_resource_type_pos_periodicity_pr periodicity; + uint16_t offset; +} nrppa_resource_type_periodic_pos_t, nrppa_resource_type_semi_persistent_pos_t; + +typedef struct nrppa_resource_type_aperiodic_pos_s { + uint8_t slot_offset; +} nrppa_resource_type_aperiodic_pos_t; + +typedef union nrppa_resource_type_pos_c { + nrppa_resource_type_periodic_pos_t periodic; + nrppa_resource_type_semi_persistent_pos_t semi_persistent; + nrppa_resource_type_aperiodic_pos_t aperiodic; +} nrppa_resource_type_pos_u; + +typedef enum nrppa_resource_type_pos_e { + NRPPA_RESOURCE_TYPE_POS_PR_NOTHING, + NRPPA_RESOURCE_TYPE_POS_PR_PERIODIC, + NRPPA_RESOURCE_TYPE_POS_PR_SEMI_PERSISTENT, + NRPPA_RESOURCE_TYPE_POS_PR_APERIODIC +} nrppa_resource_type_pos_pr; + +typedef struct nrppa_resource_type_pos_s { + nrppa_resource_type_pos_pr present; + nrppa_resource_type_pos_u choice; +} nrppa_resource_type_pos_t; + +typedef struct nrppa_srs_resource_id_list_s { + long *srs_resource_id; + uint8_t srs_resource_id_list_length; +} nrppa_srs_resource_id_list_t; + +typedef struct nrppa_resource_set_type_aperiodic_s { + uint8_t srs_resource_trigger; + long slot_offset; +} nrppa_resource_set_type_aperiodic_t; + +typedef union nrppa_resource_set_type_c { + bool periodic; + bool semi_persistent; + nrppa_resource_set_type_aperiodic_t aperiodic; +} nrppa_resource_set_type_u; + +typedef enum nrppa_resource_set_type_e { + NRPPA_RESOURCE_SET_TYPE_PR_NOTHING, + NRPPA_RESOURCE_SET_TYPE_PR_PERIODIC, + NRPPA_RESOURCE_SET_TYPE_PR_SEMI_PERSISTENT, + NRPPA_RESOURCE_SET_TYPE_PR_APERIODIC +} nrppa_resource_set_type_pr; + +typedef struct nrppa_resource_set_type_s { + nrppa_resource_set_type_pr present; + nrppa_resource_set_type_u choice; +} nrppa_resource_set_type_t; + +typedef struct nrppa_pos_srs_resource_id_list_s { + long *srs_pos_resource_id; + uint32_t pos_srs_resource_id_list_length; +} nrppa_pos_srs_resource_id_list_t; + +typedef union nrppa_pos_resource_set_type_c { + bool periodic; + bool semi_persistent; + uint8_t srs_resource; +} nrppa_pos_resource_set_type_u; + +typedef enum nrppa_pos_resource_set_type_e { + NRPPA_POS_RESOURCE_SET_TYPE_PR_NOTHING, + NRPPA_POS_RESOURCE_SET_TYPE_PR_PERIODIC, + NRPPA_POS_RESOURCE_SET_TYPE_PR_SEMI_PERSISTENT, + NRPPA_POS_RESOURCE_SET_TYPE_PR_APERIODIC +} nrppa_pos_resource_set_type_pr; + +typedef struct nrppa_pos_resource_set_type_s { + nrppa_pos_resource_set_type_pr present; + nrppa_pos_resource_set_type_u choice; +} nrppa_pos_resource_set_type_t; + +typedef enum nrppa_srs_resource_number_of_ports_e { + NRPPA_SRS_NUMBER_OF_PORTS_N1, + NRPPA_SRS_NUMBER_OF_PORTS_N2, + NRPPA_SRS_NUMBER_OF_PORTS_N4 +} nrppa_srs_resource_number_of_ports_pr; + +typedef enum nrppa_srs_resource_number_of_symbols_e { + NRPPA_SRS_NUMBER_OF_SYMBOLS_N1, + NRPPA_SRS_NUMBER_OF_SYMBOLS_N2, + NRPPA_SRS_NUMBER_OF_SYMBOLS_N4 +} nrppa_srs_resource_number_of_symbols_pr; + +typedef enum nrppa_srs_repetition_factor_e { + NRPPA_SRS_REPETITION_FACTOR_RF1, + NRPPA_SRS_REPETITION_FACTOR_RF2, + NRPPA_SRS_REPETITION_FACTOR_RF4 +} nrppa_srs_repetition_factor_pr; + +typedef enum nrppa_srs_group_or_sequencehopping_e { + NRPPA_GROUPORSEQUENCEHOPPING_NOTHING, + NRPPA_GROUPORSEQUENCEHOPPING_GROUPHOPPING, + NRPPA_GROUPORSEQUENCEHOPPING_SEQUENCEHOPPING +} nrppa_srs_group_or_sequencehopping_pr; + +typedef struct nrppa_srs_resource_s { + uint32_t srs_resource_id; + nrppa_srs_resource_number_of_ports_pr nr_of_srs_ports; + nrppa_transmission_comb_t transmission_comb; + uint8_t start_position; + nrppa_srs_resource_number_of_symbols_pr nr_of_symbols; + nrppa_srs_repetition_factor_pr repetition_factor; + uint8_t freq_domain_position; + uint16_t freq_domain_shift; + uint8_t c_srs; + uint8_t b_srs; + uint8_t b_hop; + nrppa_srs_group_or_sequencehopping_pr group_or_sequence_hopping; + nrppa_resource_type_t resource_type; + uint16_t sequence_id; +} nrppa_srs_resource_t; + +typedef enum nrppa_srs_resource_item_number_of_symbols_e { + NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N1, + NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N2, + NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N4, + NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N8, + NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N12 +} nrppa_srs_resource_item_number_of_symbols_pr; + +typedef struct nrppa_pos_srs_resource_item_s { + uint32_t srs_pos_resource_id; + nrppa_transmission_comb_pos_t transmission_comb_pos; + uint8_t start_position; + nrppa_srs_resource_item_number_of_symbols_pr nr_of_symbols; + uint16_t freq_domain_shift; + uint8_t c_srs; + nrppa_srs_group_or_sequencehopping_pr group_or_sequence_hopping; + nrppa_resource_type_pos_t resource_type_pos; + uint32_t sequence_id; +} nrppa_pos_srs_resource_item_t; + +typedef struct nrppa_srs_resource_set_s { + uint8_t srs_resource_set_id; + nrppa_srs_resource_id_list_t srs_resource_id_list; + nrppa_resource_set_type_t resource_set_type; +} nrppa_srs_resource_set_t; + +typedef struct nrppa_pos_srs_resource_set_item_s { + uint8_t pos_srs_resource_set_id; + nrppa_pos_srs_resource_id_list_t pos_srs_resource_id_list; + nrppa_pos_resource_set_type_t pos_resource_set_type; +} nrppa_pos_srs_resource_set_item_t; + +typedef struct nrppa_srs_resource_list_s { + nrppa_srs_resource_t *srs_resource; + uint32_t srs_resource_list_length; +} nrppa_srs_resource_list_t; + +typedef struct nrppa_pos_srs_resource_list_s { + nrppa_pos_srs_resource_item_t *pos_srs_resource_item; + uint32_t pos_srs_resource_list_length; +} nrppa_pos_srs_resource_list_t; + +typedef struct nrppa_srs_resource_set_list_s { + nrppa_srs_resource_set_t *srs_resource_set; + uint32_t srs_resource_set_list_length; +} nrppa_srs_resource_set_list_t; + +typedef struct nrppa_pos_srs_resource_set_list_s { + nrppa_pos_srs_resource_set_item_t *pos_srs_resource_set_item; + uint32_t pos_srs_resource_set_list_length; +} nrppa_pos_srs_resource_set_list_t; + +typedef struct nrppa_srs_config_s { + nrppa_srs_resource_list_t *srs_resource_list; + nrppa_pos_srs_resource_list_t *pos_srs_resource_list; + nrppa_srs_resource_set_list_t *srs_resource_set_list; + nrppa_pos_srs_resource_set_list_t *pos_srs_resource_set_list; +} nrppa_srs_config_t; + +typedef enum nrppa_cp_type_e { NRPPA_CP_TYPE_NORMAL, NRPPA_CP_TYPE_EXTENDED } nrppa_cp_type_pr; + +typedef struct nrppa_active_ul_bwp_s { + uint32_t location_and_bandwidth; + nrppa_subcarrier_spacing_pr subcarrier_spacing; + nrppa_cp_type_pr cyclic_prefix; + uint32_t tx_direct_current_location; + uint8_t shift_7_dot_5kHz; + nrppa_srs_config_t srs_config; +} nrppa_active_ul_bwp_t; + +typedef struct nrppa_srs_carrier_list_item_s { + uint32_t pointA; + nrppa_uplink_channel_bw_per_scs_list_t uplink_channel_bw_per_scs_list; + nrppa_active_ul_bwp_t active_ul_bwp; + uint16_t pci; +} nrppa_srs_carrier_list_item_t; + +typedef struct nrppa_srs_carrier_list_s { + nrppa_srs_carrier_list_item_t *srs_carrier_list_item; + uint32_t srs_carrier_list_length; +} nrppa_srs_carrier_list_t; + +typedef struct nrppa_srs_configuration_s { + nrppa_srs_carrier_list_t srs_carrier_list; +} nrppa_srs_configuration_t; + // IE 9.3.1.176 (TS 38.473 V16.21.0) typedef struct nrppa_trp_information_list_s { nrppa_trp_information_t *trp_information_item; @@ -251,4 +592,11 @@ typedef struct nrppa_positioning_information_req_s { uint16_t transaction_id; } nrppa_positioning_information_req_t; +typedef struct nrppa_positioning_information_resp_s { + // IE 9.2.4 (mandatory) + uint16_t transaction_id; + // IE 9.2.28 (optional) + nrppa_srs_configuration_t *srs_configuration; +} nrppa_positioning_information_resp_t; + #endif // NRPPA_MESSAGES_TYPES_H_ diff --git a/openair3/NRPPA/nrppa_gNB.c b/openair3/NRPPA/nrppa_gNB.c index bb00cecd54..19e76bc392 100644 --- a/openair3/NRPPA/nrppa_gNB.c +++ b/openair3/NRPPA/nrppa_gNB.c @@ -60,6 +60,9 @@ void *nrppa_gNB_process_itti_msg(void *notUsed) case NRPPA_TRP_INFORMATION_RESP: nrppa_gNB_trp_information_response(instance, received_msg); break; + case NRPPA_POSITIONING_INFORMATION_RESP: + nrppa_gNB_positioning_information_response(instance, received_msg); + break; default: LOG_E(NRPPA, "Received unhandled message: %d:%s\n", ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg)); break; diff --git a/openair3/NRPPA/nrppa_gNB_location_information_transfer.c b/openair3/NRPPA/nrppa_gNB_location_information_transfer.c index 6821e251ed..5d1a43c0a6 100644 --- a/openair3/NRPPA/nrppa_gNB_location_information_transfer.c +++ b/openair3/NRPPA/nrppa_gNB_location_information_transfer.c @@ -263,6 +263,728 @@ void free_trp_information_response(nrppa_trp_information_resp_t *msg) free(msg->trp_information_list.trp_information_item); } +static NRPPA_SRSConfig_t encode_srs_config(const nrppa_srs_config_t *in_config) +{ + NRPPA_SRSConfig_t out_config = {0}; + // optional: srs_resource_list + if (in_config->srs_resource_list) { + nrppa_srs_resource_list_t *srs_resource_list = in_config->srs_resource_list; + uint32_t srs_resource_list_length = srs_resource_list->srs_resource_list_length; + asn1cCalloc(out_config.sRSResource_List, nrppa_sRSResource_List); + for (int i = 0; i < srs_resource_list_length; i++) { + asn1cSequenceAdd(nrppa_sRSResource_List->list, NRPPA_SRSResource_t, nrppa_srs_resource); + nrppa_srs_resource_t *srs_resource = &srs_resource_list->srs_resource[i]; + nrppa_srs_resource->sRSResourceID = srs_resource->srs_resource_id; + + switch (srs_resource->nr_of_srs_ports) { + case NRPPA_SRS_NUMBER_OF_PORTS_N1: + nrppa_srs_resource->nrofSRS_Ports = NRPPA_SRSResource__nrofSRS_Ports_port1; + break; + case NRPPA_SRS_NUMBER_OF_PORTS_N2: + nrppa_srs_resource->nrofSRS_Ports = NRPPA_SRSResource__nrofSRS_Ports_ports2; + break; + case NRPPA_SRS_NUMBER_OF_PORTS_N4: + nrppa_srs_resource->nrofSRS_Ports = NRPPA_SRSResource__nrofSRS_Ports_ports4; + break; + default: + AssertFatal(false, "illegal number of srs ports %d\n", srs_resource->nr_of_srs_ports); + break; + } + + nrppa_transmission_comb_t *srs_res_tx_comb = &srs_resource->transmission_comb; + switch (srs_res_tx_comb->present) { + case NRPPA_TRANSMISSION_COMB_PR_NOTHING: + nrppa_srs_resource->transmissionComb.present = NRPPA_TransmissionComb_PR_NOTHING; + break; + case NRPPA_TRANSMISSION_COMB_PR_N2: + nrppa_srs_resource->transmissionComb.present = NRPPA_TransmissionComb_PR_n2; + asn1cCalloc(nrppa_srs_resource->transmissionComb.choice.n2, nrppa_n2); + nrppa_n2->combOffset_n2 = srs_res_tx_comb->choice.n2.comb_offset_n2; + nrppa_n2->cyclicShift_n2 = srs_res_tx_comb->choice.n2.cyclic_shift_n2; + break; + case NRPPA_TRANSMISSION_COMB_PR_N4: + nrppa_srs_resource->transmissionComb.present = NRPPA_TransmissionComb_PR_n4; + asn1cCalloc(nrppa_srs_resource->transmissionComb.choice.n4, nrppa_n4); + nrppa_n4->combOffset_n4 = srs_res_tx_comb->choice.n4.comb_offset_n4; + nrppa_n4->cyclicShift_n4 = srs_res_tx_comb->choice.n4.cyclic_shift_n4; + break; + default: + AssertFatal(false, "illegal transmissionComb %d\n", srs_res_tx_comb->present); + break; + } + + nrppa_srs_resource->startPosition = srs_resource->start_position; + + switch (srs_resource->nr_of_symbols) { + case NRPPA_SRS_NUMBER_OF_SYMBOLS_N1: + nrppa_srs_resource->nrofSymbols = NRPPA_SRSResource__nrofSymbols_n1; + break; + case NRPPA_SRS_NUMBER_OF_SYMBOLS_N2: + nrppa_srs_resource->nrofSymbols = NRPPA_SRSResource__nrofSymbols_n2; + break; + case NRPPA_SRS_NUMBER_OF_SYMBOLS_N4: + nrppa_srs_resource->nrofSymbols = NRPPA_SRSResource__nrofSymbols_n4; + break; + default: + AssertFatal(false, "illegal number of symbols %d\n", srs_resource->nr_of_symbols); + break; + } + + switch (srs_resource->repetition_factor) { + case NRPPA_SRS_REPETITION_FACTOR_RF1: + nrppa_srs_resource->repetitionFactor = NRPPA_SRSResource__repetitionFactor_n1; + break; + case NRPPA_SRS_REPETITION_FACTOR_RF2: + nrppa_srs_resource->repetitionFactor = NRPPA_SRSResource__repetitionFactor_n2; + break; + case NRPPA_SRS_REPETITION_FACTOR_RF4: + nrppa_srs_resource->repetitionFactor = NRPPA_SRSResource__repetitionFactor_n4; + break; + default: + AssertFatal(false, "illegal repetition factor %d\n", srs_resource->repetition_factor); + break; + } + + nrppa_srs_resource->freqDomainPosition = srs_resource->freq_domain_position; + nrppa_srs_resource->freqDomainShift = srs_resource->freq_domain_shift; + nrppa_srs_resource->c_SRS = srs_resource->c_srs; + nrppa_srs_resource->b_SRS = srs_resource->b_srs; + nrppa_srs_resource->b_hop = srs_resource->b_hop; + + switch (srs_resource->group_or_sequence_hopping) { + case NRPPA_GROUPORSEQUENCEHOPPING_NOTHING: + nrppa_srs_resource->groupOrSequenceHopping = NRPPA_SRSResource__groupOrSequenceHopping_neither; + break; + case NRPPA_GROUPORSEQUENCEHOPPING_GROUPHOPPING: + nrppa_srs_resource->groupOrSequenceHopping = NRPPA_SRSResource__groupOrSequenceHopping_groupHopping; + break; + case NRPPA_GROUPORSEQUENCEHOPPING_SEQUENCEHOPPING: + nrppa_srs_resource->groupOrSequenceHopping = NRPPA_SRSResource__groupOrSequenceHopping_sequenceHopping; + break; + default: + AssertFatal(false, "illegal groupOrSequenceHopping %d\n", srs_resource->group_or_sequence_hopping); + break; + } + + NRPPA_ResourceType_t *nrppa_resourceType = &nrppa_srs_resource->resourceType; + nrppa_resource_type_t *resource_type = &srs_resource->resource_type; + if (resource_type->present == NRPPA_RESOURCE_TYPE_PR_NOTHING) { + nrppa_resourceType->present = NRPPA_ResourceType_PR_NOTHING; + } else if (resource_type->present == NRPPA_RESOURCE_TYPE_PR_PERIODIC) { + nrppa_resourceType->present = NRPPA_ResourceType_PR_periodic; + asn1cCalloc(nrppa_resourceType->choice.periodic, nrppa_periodic); + switch (resource_type->choice.periodic.periodicity) { + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT1: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot1; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT2: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot2; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT4: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot4; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT5: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot5; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT8: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot8; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT10: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot10; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT16: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot16; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT20: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot20; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT32: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot32; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT40: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot40; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT64: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot64; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT80: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot80; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT160: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot160; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT320: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot320; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT640: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot640; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT1280: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot1280; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT2560: + nrppa_periodic->periodicity = NRPPA_ResourceTypePeriodic__periodicity_slot2560; + break; + default: + AssertFatal(false, "illegal periodicity %d\n", resource_type->choice.periodic.periodicity); + break; + } + nrppa_periodic->offset = resource_type->choice.periodic.offset; + } else if (resource_type->present == NRPPA_RESOURCE_TYPE_PR_SEMI_PERSISTENT) { + nrppa_resourceType->present = NRPPA_ResourceType_PR_semi_persistent; + asn1cCalloc(nrppa_resourceType->choice.semi_persistent, nrppa_semi_persistent); + switch (resource_type->choice.semi_persistent.periodicity) { + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT1: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot1; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT2: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot2; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT4: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot4; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT5: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot5; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT8: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot8; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT10: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot10; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT16: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot16; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT20: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot20; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT32: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot32; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT40: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot40; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT64: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot64; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT80: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot80; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT160: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot160; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT320: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot320; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT640: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot640; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT1280: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot1280; + break; + case NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT2560: + nrppa_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistent__periodicity_slot2560; + break; + default: + AssertFatal(false, "illegal periodicity %d\n", resource_type->choice.semi_persistent.periodicity); + break; + } + nrppa_semi_persistent->offset = resource_type->choice.semi_persistent.offset; + } else if (resource_type->present == NRPPA_RESOURCE_TYPE_PR_APERIODIC) { + nrppa_resourceType->present = NRPPA_ResourceType_PR_aperiodic; + asn1cCalloc(nrppa_resourceType->choice.aperiodic, nrppa_aperiodic); + nrppa_aperiodic->aperiodicResourceType = resource_type->choice.aperiodic; + } else { + AssertFatal(false, "illegal resourceType %d\n", resource_type->present); + } + + nrppa_srs_resource->sequenceId = srs_resource->sequence_id; + } + } + + // optional: pos_srs_resource_list + if (in_config->pos_srs_resource_list) { + nrppa_pos_srs_resource_list_t *pos_srs_resource_list = in_config->pos_srs_resource_list; + uint32_t pos_srs_resource_list_length = pos_srs_resource_list->pos_srs_resource_list_length; + asn1cCalloc(out_config.posSRSResource_List, nrppa_posSRSResource_List); + for (int i = 0; i < pos_srs_resource_list_length; i++) { + asn1cSequenceAdd(nrppa_posSRSResource_List->list, NRPPA_PosSRSResource_Item_t, nrppa_pos_srs_resource); + nrppa_pos_srs_resource_item_t *pos_srs_resource = &pos_srs_resource_list->pos_srs_resource_item[i]; + nrppa_pos_srs_resource->srs_PosResourceId = pos_srs_resource->srs_pos_resource_id; + + nrppa_transmission_comb_pos_t *pos_srs_res_tx_comb = &pos_srs_resource->transmission_comb_pos; + switch (pos_srs_res_tx_comb->present) { + case NRPPA_TRANSMISSION_COMB_POS_PR_NOTHING: + nrppa_pos_srs_resource->transmissionCombPos.present = NRPPA_TransmissionCombPos_PR_NOTHING; + break; + case NRPPA_TRANSMISSION_COMB_POS_PR_N2: + nrppa_pos_srs_resource->transmissionCombPos.present = NRPPA_TransmissionCombPos_PR_n2; + asn1cCalloc(nrppa_pos_srs_resource->transmissionCombPos.choice.n2, nrppa_pos_srs_resource_n2); + nrppa_transmission_comb_pos_n2_t *pos_srs_resource_n2 = &pos_srs_res_tx_comb->choice.n2; + nrppa_pos_srs_resource_n2->combOffset_n2 = pos_srs_resource_n2->comb_offset_n2; + nrppa_pos_srs_resource_n2->cyclicShift_n2 = pos_srs_resource_n2->cyclic_shift_n2; + break; + case NRPPA_TRANSMISSION_COMB_POS_PR_N4: + nrppa_pos_srs_resource->transmissionCombPos.present = NRPPA_TransmissionCombPos_PR_n4; + asn1cCalloc(nrppa_pos_srs_resource->transmissionCombPos.choice.n4, nrppa_pos_srs_resource_n4); + nrppa_transmission_comb_pos_n4_t *pos_srs_resource_n4 = &pos_srs_res_tx_comb->choice.n4; + nrppa_pos_srs_resource_n4->combOffset_n4 = pos_srs_resource_n4->comb_offset_n4; + nrppa_pos_srs_resource_n4->cyclicShift_n4 = pos_srs_resource_n4->cyclic_shift_n4; + break; + case NRPPA_TRANSMISSION_COMB_POS_PR_N8: + nrppa_pos_srs_resource->transmissionCombPos.present = NRPPA_TransmissionCombPos_PR_n8; + asn1cCalloc(nrppa_pos_srs_resource->transmissionCombPos.choice.n8, nrppa_pos_srs_resource_n8); + nrppa_transmission_comb_pos_n8_t *pos_srs_resource_n8 = &pos_srs_res_tx_comb->choice.n8; + nrppa_pos_srs_resource_n8->combOffset_n8 = pos_srs_resource_n8->comb_offset_n8; + nrppa_pos_srs_resource_n8->cyclicShift_n8 = pos_srs_resource_n8->cyclic_shift_n8; + break; + default: + AssertFatal(false, "illegal transmissionComb %d\n", pos_srs_res_tx_comb->present); + break; + } + + nrppa_pos_srs_resource->startPosition = pos_srs_resource->start_position; + + switch (pos_srs_resource->nr_of_symbols) { + case NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N1: + nrppa_pos_srs_resource->nrofSymbols = NRPPA_PosSRSResource_Item__nrofSymbols_n1; + break; + case NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N2: + nrppa_pos_srs_resource->nrofSymbols = NRPPA_PosSRSResource_Item__nrofSymbols_n2; + break; + case NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N4: + nrppa_pos_srs_resource->nrofSymbols = NRPPA_PosSRSResource_Item__nrofSymbols_n4; + break; + case NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N8: + nrppa_pos_srs_resource->nrofSymbols = NRPPA_PosSRSResource_Item__nrofSymbols_n8; + break; + case NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N12: + nrppa_pos_srs_resource->nrofSymbols = NRPPA_PosSRSResource_Item__nrofSymbols_n12; + break; + default: + AssertFatal(false, "illegal number of symbols %d\n", pos_srs_resource->nr_of_symbols); + break; + } + + nrppa_pos_srs_resource->freqDomainShift = pos_srs_resource->freq_domain_shift; + nrppa_pos_srs_resource->c_SRS = pos_srs_resource->c_srs; + + switch (pos_srs_resource->group_or_sequence_hopping) { + case NRPPA_GROUPORSEQUENCEHOPPING_NOTHING: + nrppa_pos_srs_resource->groupOrSequenceHopping = NRPPA_PosSRSResource_Item__groupOrSequenceHopping_neither; + break; + case NRPPA_GROUPORSEQUENCEHOPPING_GROUPHOPPING: + nrppa_pos_srs_resource->groupOrSequenceHopping = NRPPA_PosSRSResource_Item__groupOrSequenceHopping_groupHopping; + break; + case NRPPA_GROUPORSEQUENCEHOPPING_SEQUENCEHOPPING: + nrppa_pos_srs_resource->groupOrSequenceHopping = NRPPA_PosSRSResource_Item__groupOrSequenceHopping_sequenceHopping; + break; + default: + AssertFatal(false, "illegal groupOrSequenceHopping %d\n", pos_srs_resource->group_or_sequence_hopping); + break; + } + + nrppa_resource_type_pos_t *resource_type_pos = &pos_srs_resource->resource_type_pos; + NRPPA_ResourceTypePos_t *nrppa_resourceTypePos = &nrppa_pos_srs_resource->resourceTypePos; + if (resource_type_pos->present == NRPPA_RESOURCE_TYPE_POS_PR_NOTHING) { + nrppa_resourceTypePos->present = NRPPA_ResourceTypePos_PR_NOTHING; + } else if (resource_type_pos->present == NRPPA_RESOURCE_TYPE_POS_PR_PERIODIC) { + nrppa_resourceTypePos->present = NRPPA_ResourceTypePos_PR_periodic; + asn1cCalloc(nrppa_resourceTypePos->choice.periodic, nrppa_pos_periodic); + switch (resource_type_pos->choice.periodic.periodicity) { + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT1: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot1; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT2: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot2; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT4: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot4; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot5; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT8: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot8; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT10: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot10; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT16: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot16; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT20: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot20; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT32: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot32; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT40: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot40; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT64: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot64; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT80: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot80; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT160: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot160; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT320: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot320; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT640: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot640; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT1280: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot1280; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT2560: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot2560; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5120: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot5120; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT10240: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot10240; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT20480: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot20480; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT40960: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot40960; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT81920: + nrppa_pos_periodic->periodicity = NRPPA_ResourceTypePeriodicPos__periodicity_slot81920; + break; + default: + AssertFatal(false, "illegal periodicity %d\n", resource_type_pos->choice.periodic.periodicity); + break; + } + + nrppa_pos_periodic->offset = resource_type_pos->choice.periodic.offset; + } else if (resource_type_pos->present == NRPPA_RESOURCE_TYPE_POS_PR_SEMI_PERSISTENT) { + nrppa_resourceTypePos->present = NRPPA_ResourceTypePos_PR_semi_persistent; + asn1cCalloc(nrppa_resourceTypePos->choice.semi_persistent, nrppa_pos_semi_persistent); + switch (resource_type_pos->choice.semi_persistent.periodicity) { + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT1: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot1; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT2: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot2; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT4: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot4; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot5; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT8: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot8; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT10: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot10; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT16: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot16; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT20: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot20; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT32: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot32; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT40: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot40; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT64: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot64; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT80: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot80; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT160: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot160; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT320: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot320; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT640: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot640; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT1280: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot1280; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT2560: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot2560; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5120: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot5120; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT10240: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot10240; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT20480: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot20480; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT40960: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot40960; + break; + case NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT81920: + nrppa_pos_semi_persistent->periodicity = NRPPA_ResourceTypeSemi_persistentPos__periodicity_slot81920; + break; + default: + AssertFatal(false, "illegal periodicity %d\n", resource_type_pos->choice.semi_persistent.periodicity); + break; + } + nrppa_pos_semi_persistent->offset = resource_type_pos->choice.semi_persistent.offset; + } else if (resource_type_pos->present == NRPPA_RESOURCE_TYPE_POS_PR_APERIODIC) { + nrppa_resourceTypePos->present = NRPPA_ResourceTypePos_PR_aperiodic; + asn1cCalloc(nrppa_resourceTypePos->choice.aperiodic, nrppa_pos_aperiodic); + nrppa_pos_aperiodic->slotOffset = resource_type_pos->choice.aperiodic.slot_offset; + } else { + AssertFatal(false, "illegal resourceType %d\n", resource_type_pos->present); + } + + nrppa_pos_srs_resource->sequenceId = pos_srs_resource->sequence_id; + } + } + + // optional: srs_resource_set_list + if (in_config->srs_resource_set_list) { + nrppa_srs_resource_set_list_t *srs_resource_set_list = in_config->srs_resource_set_list; + uint32_t srs_resource_set_list_length = srs_resource_set_list->srs_resource_set_list_length; + asn1cCalloc(out_config.sRSResourceSet_List, nrppa_sRSResourceSet_List); + for (int i = 0; i < srs_resource_set_list_length; i++) { + asn1cSequenceAdd(nrppa_sRSResourceSet_List->list, NRPPA_SRSResourceSet_t, nrppa_srs_resource_set); + nrppa_srs_resource_set_t *srs_resource_set = &srs_resource_set_list->srs_resource_set[i]; + nrppa_srs_resource_set->sRSResourceSetID = srs_resource_set->srs_resource_set_id; + uint8_t srs_resource_id_list_length = srs_resource_set->srs_resource_id_list.srs_resource_id_list_length; + for (int j = 0; j < srs_resource_id_list_length; j++) { + asn1cSequenceAdd(nrppa_srs_resource_set->sRSResourceID_List.list, NRPPA_SRSResourceID_t, nrppa_srs_resource_id); + *nrppa_srs_resource_id = srs_resource_set->srs_resource_id_list.srs_resource_id[j]; + } + + NRPPA_ResourceSetType_t *nrppa_resourceSetType = &nrppa_srs_resource_set->resourceSetType; + nrppa_resource_set_type_t *resource_set_type = &srs_resource_set->resource_set_type; + switch (resource_set_type->present) { + case NRPPA_RESOURCE_SET_TYPE_PR_NOTHING: + nrppa_resourceSetType->present = NRPPA_ResourceSetType_PR_NOTHING; + break; + case NRPPA_RESOURCE_SET_TYPE_PR_PERIODIC: + nrppa_resourceSetType->present = NRPPA_ResourceSetType_PR_periodic; + asn1cCalloc(nrppa_resourceSetType->choice.periodic, nrppa_periodic_set_type); + nrppa_periodic_set_type->periodicSet = resource_set_type->choice.periodic; + break; + case NRPPA_RESOURCE_SET_TYPE_PR_SEMI_PERSISTENT: + nrppa_resourceSetType->present = NRPPA_ResourceSetType_PR_semi_persistent; + asn1cCalloc(nrppa_resourceSetType->choice.semi_persistent, nrppa_semi_persistent_set_type); + nrppa_semi_persistent_set_type->semi_persistentSet = resource_set_type->choice.semi_persistent; + break; + case NRPPA_RESOURCE_SET_TYPE_PR_APERIODIC: + nrppa_resourceSetType->present = NRPPA_ResourceSetType_PR_aperiodic; + asn1cCalloc(nrppa_resourceSetType->choice.aperiodic, nrppa_aperiodic_set_type); + nrppa_aperiodic_set_type->sRSResourceTrigger = resource_set_type->choice.aperiodic.srs_resource_trigger; + nrppa_aperiodic_set_type->slotoffset = resource_set_type->choice.aperiodic.slot_offset; + break; + default: + AssertFatal(false, "illegal resource set type %d\n", resource_set_type->present); + break; + } + } + } + + // optional: pos_srs_resource_set_list + if (in_config->pos_srs_resource_set_list) { + nrppa_pos_srs_resource_set_list_t *pos_srs_resource_set_list = in_config->pos_srs_resource_set_list; + uint32_t pos_srs_resource_set_list_length = pos_srs_resource_set_list->pos_srs_resource_set_list_length; + asn1cCalloc(out_config.posSRSResourceSet_List, nrppa_posSRSResourceSet_List); + for (int i = 0; i < pos_srs_resource_set_list_length; i++) { + asn1cSequenceAdd(nrppa_posSRSResourceSet_List->list, NRPPA_PosSRSResourceSet_Item_t, nrppa_pos_srs_resource_set); + nrppa_pos_srs_resource_set_item_t *pos_srs_resource_set = &pos_srs_resource_set_list->pos_srs_resource_set_item[i]; + nrppa_pos_srs_resource_set->possrsResourceSetID = pos_srs_resource_set->pos_srs_resource_set_id; + uint8_t pos_srs_resource_id_list_length = pos_srs_resource_set->pos_srs_resource_id_list.pos_srs_resource_id_list_length; + for (int j = 0; j < pos_srs_resource_id_list_length; j++) { + asn1cSequenceAdd(nrppa_pos_srs_resource_set->possRSResourceID_List.list, + NRPPA_SRSPosResourceID_t, + nrppa_pos_srs_resource_id); + *nrppa_pos_srs_resource_id = pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id[j]; + } + + NRPPA_PosResourceSetType_t *nrppa_posresourceSetType = &nrppa_pos_srs_resource_set->posresourceSetType; + nrppa_pos_resource_set_type_t *pos_resource_set_type = &pos_srs_resource_set->pos_resource_set_type; + switch (pos_resource_set_type->present) { + case NRPPA_POS_RESOURCE_SET_TYPE_PR_NOTHING: + nrppa_posresourceSetType->present = NRPPA_PosResourceSetType_PR_NOTHING; + break; + case NRPPA_POS_RESOURCE_SET_TYPE_PR_PERIODIC: + nrppa_posresourceSetType->present = NRPPA_PosResourceSetType_PR_periodic; + asn1cCalloc(nrppa_posresourceSetType->choice.periodic, nrppa_pos_periodic_set_type); + nrppa_pos_periodic_set_type->posperiodicSet = pos_resource_set_type->choice.periodic; + break; + case NRPPA_POS_RESOURCE_SET_TYPE_PR_SEMI_PERSISTENT: + nrppa_posresourceSetType->present = NRPPA_PosResourceSetType_PR_semi_persistent; + asn1cCalloc(nrppa_posresourceSetType->choice.semi_persistent, nrppa_pos_semi_persistent_set_type); + nrppa_pos_semi_persistent_set_type->possemi_persistentSet = pos_resource_set_type->choice.semi_persistent; + break; + case NRPPA_POS_RESOURCE_SET_TYPE_PR_APERIODIC: + nrppa_posresourceSetType->present = NRPPA_PosResourceSetType_PR_aperiodic; + asn1cCalloc(nrppa_posresourceSetType->choice.aperiodic, nrppa_pos_aperiodic_set_type); + nrppa_pos_aperiodic_set_type->sRSResourceTrigger = pos_resource_set_type->choice.srs_resource; + break; + default: + AssertFatal(false, "illegal resource set type pos %d\n", pos_resource_set_type->present); + break; + } + } + } + return out_config; +} + +static NRPPA_SRSCarrier_List_Item_t encode_srs_carrier_list_item(const nrppa_srs_carrier_list_item_t *in_item) +{ + NRPPA_SRSCarrier_List_Item_t out_item = {0}; + // pointA + out_item.pointA = in_item->pointA; + + // Uplink Channel BW-PerSCS-List + const nrppa_uplink_channel_bw_per_scs_list_t *uplink_channel_bw_per_scs_list = &in_item->uplink_channel_bw_per_scs_list; + NRPPA_UplinkChannelBW_PerSCS_List_t *nrppa_uplink_channel_bw_per_scs_list = &out_item.uplinkChannelBW_PerSCS_List; + + uint32_t scs_specific_carrier_list_length = uplink_channel_bw_per_scs_list->scs_specific_carrier_list_length; + for (int i = 0; i < scs_specific_carrier_list_length; i++) { + asn1cSequenceAdd(nrppa_uplink_channel_bw_per_scs_list->list, NRPPA_SCS_SpecificCarrier_t, nrppa_scs_specific_carrier); + nrppa_scs_specific_carrier_t *scs_specific_carrier = &uplink_channel_bw_per_scs_list->scs_specific_carrier[i]; + // offset to carrier + nrppa_scs_specific_carrier->offsetToCarrier = scs_specific_carrier->offset_to_carrier; + // subcarrier spacing + switch (scs_specific_carrier->subcarrier_spacing) { + case NRPPA_SUBCARRIER_SPACING_15KHZ: + nrppa_scs_specific_carrier->subcarrierSpacing = NRPPA_SCS_SpecificCarrier__subcarrierSpacing_kHz15; + break; + case NRPPA_SUBCARRIER_SPACING_30KHZ: + nrppa_scs_specific_carrier->subcarrierSpacing = NRPPA_SCS_SpecificCarrier__subcarrierSpacing_kHz30; + break; + case NRPPA_SUBCARRIER_SPACING_60KHZ: + nrppa_scs_specific_carrier->subcarrierSpacing = NRPPA_SCS_SpecificCarrier__subcarrierSpacing_kHz60; + break; + case NRPPA_SUBCARRIER_SPACING_120KHZ: + nrppa_scs_specific_carrier->subcarrierSpacing = NRPPA_SCS_SpecificCarrier__subcarrierSpacing_kHz120; + break; + default: + AssertFatal(false, "illegal subcarrier spacing %d\n", scs_specific_carrier->subcarrier_spacing); + break; + } + // carrier bandwidth + nrppa_scs_specific_carrier->carrierBandwidth = scs_specific_carrier->carrier_bandwidth; + } + + // Active UL BWP + NRPPA_ActiveULBWP_t *nrppa_active_ul_bwp = &out_item.activeULBWP; + const nrppa_active_ul_bwp_t *active_ul_bwp = &in_item->active_ul_bwp; + + // location and bandwidth + nrppa_active_ul_bwp->locationAndBandwidth = active_ul_bwp->location_and_bandwidth; + // subcarrier spacing + switch (active_ul_bwp->subcarrier_spacing) { + case NRPPA_SUBCARRIER_SPACING_15KHZ: + nrppa_active_ul_bwp->subcarrierSpacing = NRPPA_ActiveULBWP__subcarrierSpacing_kHz15; + break; + case NRPPA_SUBCARRIER_SPACING_30KHZ: + nrppa_active_ul_bwp->subcarrierSpacing = NRPPA_ActiveULBWP__subcarrierSpacing_kHz30; + break; + case NRPPA_SUBCARRIER_SPACING_60KHZ: + nrppa_active_ul_bwp->subcarrierSpacing = NRPPA_ActiveULBWP__subcarrierSpacing_kHz60; + break; + case NRPPA_SUBCARRIER_SPACING_120KHZ: + nrppa_active_ul_bwp->subcarrierSpacing = NRPPA_ActiveULBWP__subcarrierSpacing_kHz120; + break; + default: + AssertFatal(false, "illegal subcarrier spacing %d\n", active_ul_bwp->subcarrier_spacing); + break; + } + + // cyclic prefix + if (active_ul_bwp->cyclic_prefix == NRPPA_CP_TYPE_NORMAL) + nrppa_active_ul_bwp->cyclicPrefix = NRPPA_ActiveULBWP__cyclicPrefix_normal; + else + nrppa_active_ul_bwp->cyclicPrefix = NRPPA_ActiveULBWP__cyclicPrefix_extended; + + // Tx Direct Current Location + nrppa_active_ul_bwp->txDirectCurrentLocation = active_ul_bwp->tx_direct_current_location; + + // SRS Config + const nrppa_srs_config_t *sRSConfig = &active_ul_bwp->srs_config; + nrppa_active_ul_bwp->sRSConfig = encode_srs_config(sRSConfig); + return out_item; +} + +NRPPA_SRSCarrier_List_t encode_srs_carrier_list_nrppa(const nrppa_srs_carrier_list_t *in_list) +{ + NRPPA_SRSCarrier_List_t out_list = {0}; + uint32_t list_len = in_list->srs_carrier_list_length; + for (int i = 0; i < list_len; i++) { + asn1cSequenceAdd(out_list.list, NRPPA_SRSCarrier_List_Item_t, out_item); + nrppa_srs_carrier_list_item_t *in_item = &in_list->srs_carrier_list_item[i]; + *out_item = encode_srs_carrier_list_item(in_item); + } + return out_list; +} + +static void free_srs_carrier_list(nrppa_srs_carrier_list_t *srs_carrier_list) +{ + uint32_t srs_carrier_list_len = srs_carrier_list->srs_carrier_list_length; + for (int i = 0; i < srs_carrier_list_len; i++) { + nrppa_srs_carrier_list_item_t *srs_carrier_list_item = &srs_carrier_list->srs_carrier_list_item[i]; + free(srs_carrier_list_item->uplink_channel_bw_per_scs_list.scs_specific_carrier); + + nrppa_active_ul_bwp_t *active_ul_bwp = &srs_carrier_list_item->active_ul_bwp; + nrppa_srs_config_t *sRSConfig = &active_ul_bwp->srs_config; + if (sRSConfig->srs_resource_list) { + nrppa_srs_resource_list_t *srs_resource_list = sRSConfig->srs_resource_list; + free(srs_resource_list->srs_resource); + free(sRSConfig->srs_resource_list); + } + if (sRSConfig->pos_srs_resource_list) { + nrppa_pos_srs_resource_list_t *pos_srs_resource_list = sRSConfig->pos_srs_resource_list; + free(pos_srs_resource_list->pos_srs_resource_item); + free(sRSConfig->pos_srs_resource_list); + } + if (sRSConfig->srs_resource_set_list) { + nrppa_srs_resource_set_list_t *srs_resource_set_list = sRSConfig->srs_resource_set_list; + uint32_t srs_resource_set_list_length = srs_resource_set_list->srs_resource_set_list_length; + for (int j = 0; j < srs_resource_set_list_length; j++) { + nrppa_srs_resource_set_t *srs_resource_set = &srs_resource_set_list->srs_resource_set[j]; + free(srs_resource_set->srs_resource_id_list.srs_resource_id); + } + free(srs_resource_set_list->srs_resource_set); + free(sRSConfig->srs_resource_set_list); + } + if (sRSConfig->pos_srs_resource_set_list) { + nrppa_pos_srs_resource_set_list_t *pos_srs_resource_set_list = sRSConfig->pos_srs_resource_set_list; + uint32_t pos_srs_resource_set_list_length = pos_srs_resource_set_list->pos_srs_resource_set_list_length; + for (int j = 0; j < pos_srs_resource_set_list_length; j++) { + nrppa_pos_srs_resource_set_item_t *pos_srs_resource_set = &pos_srs_resource_set_list->pos_srs_resource_set_item[j]; + free(pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id); + } + free(pos_srs_resource_set_list->pos_srs_resource_set_item); + free(sRSConfig->pos_srs_resource_set_list); + } + } + free(srs_carrier_list->srs_carrier_list_item); +} + +void free_positioning_information_response(nrppa_positioning_information_resp_t *msg) +{ + /* SRS Configuration (O) */ + if (msg->srs_configuration) { + nrppa_srs_carrier_list_t *srs_carrier_list = &msg->srs_configuration->srs_carrier_list; + free_srs_carrier_list(srs_carrier_list); + free(msg->srs_configuration); + } +} + 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"); @@ -442,3 +1164,83 @@ int nrppa_gNB_handle_positioning_information_request(nrppa_gnb_ue_info_t *nrppa_ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu); return 0; } + +int nrppa_gNB_positioning_information_response(instance_t instance, MessageDef *msg_p) +{ + DevAssert(msg_p); + nrppa_positioning_information_resp_t *resp = &NRPPA_POSITIONING_INFORMATION_RESP(msg_p); + nrppa_gNB_ue_context_t *ue_info = nrppa_detach_ue_context(resp->transaction_id); + + if (ue_info->gNB_ue_ngap_id <= 0 && ue_info->amf_ue_ngap_id <= 0) { + LOG_E(NRPPA, "Illegal gNB_ue_ngap_id %d and amf_ue_ngap_id %ld\n", ue_info->gNB_ue_ngap_id, ue_info->amf_ue_ngap_id); + free_positioning_information_response(resp); + nrppa_free_ue_context(ue_info); + return -1; + } + + LOG_I(NRPPA, + "Received Positioning Information Response info from RRC with transaction_id = %u and gNB_ue_ngap_id %u\n", + ue_info->transaction_id, + ue_info->gNB_ue_ngap_id); + + // Prepare NRPPA TRP Information transfer Response + NRPPA_NRPPA_PDU_t pdu = {0}; + + // IE: 9.2.3 Message Type : mandatory + pdu.present = NRPPA_NRPPA_PDU_PR_successfulOutcome; + asn1cCalloc(pdu.choice.successfulOutcome, head); + head->procedureCode = NRPPA_ProcedureCode_id_positioningInformationExchange; + head->criticality = NRPPA_Criticality_reject; + head->value.present = NRPPA_SuccessfulOutcome__value_PR_PositioningInformationResponse; + + // IE 9.2.4 nrppatransactionID : mandatory + head->nrppatransactionID = resp->transaction_id; + NRPPA_PositioningInformationResponse_t *out = &head->value.choice.PositioningInformationResponse; + + // IE SRS Configuration : optional + { + if (resp->srs_configuration) { + asn1cSequenceAdd(out->protocolIEs.list, NRPPA_PositioningInformationResponse_IEs_t, ie); + ie->id = NRPPA_ProtocolIE_ID_id_SRSConfiguration; + ie->criticality = NRPPA_Criticality_ignore; + ie->value.present = NRPPA_PositioningInformationResponse_IEs__value_PR_SRSConfiguration; + nrppa_srs_carrier_list_t *srs_carrier_list = &resp->srs_configuration->srs_carrier_list; + ie->value.choice.SRSConfiguration.sRSCarrier_List = encode_srs_carrier_list_nrppa(srs_carrier_list); + } + } + + free_positioning_information_response(resp); + + LOG_I(NRPPA, "Calling encoder for Positioning Information Response \n"); + + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NRPPA_NRPPA_PDU, &pdu); + } + + // Encode NRPPA message + uint8_t *buffer = NULL; + uint32_t length = 0; + if (nrppa_gNB_encode_pdu(&pdu, &buffer, &length) < 0) { + LOG_E(NRPPA, "Failed to encode Uplink NRPPa PositioningInformationResponse\n"); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NRPPA_NRPPA_PDU, &pdu); + return -1; + } + + MessageDef *msg = itti_alloc_new_message(TASK_NRPPA, 0, NGAP_UPLINKUEASSOCIATEDNRPPA); + ngap_uplink_ue_associated_nrppa_t *ULNRPPA = &NGAP_UPLINKUEASSOCIATEDNRPPA(msg); + + ULNRPPA->gNB_ue_ngap_id = ue_info->gNB_ue_ngap_id; + ULNRPPA->amf_ue_ngap_id = ue_info->amf_ue_ngap_id; + + // Routing ID + ULNRPPA->routing_id = create_byte_array(ue_info->routing_id.len, ue_info->routing_id.buf); + + // NRPPA PDU + ULNRPPA->nrppa_pdu = create_byte_array(length, buffer); + + // Forward the NRPPA PDU to NGAP + itti_send_msg_to_task(TASK_NGAP, instance, msg); + nrppa_free_ue_context(ue_info); + free(buffer); + return length; +} diff --git a/openair3/NRPPA/nrppa_gNB_location_information_transfer.h b/openair3/NRPPA/nrppa_gNB_location_information_transfer.h index 5fbd697c07..31ab194345 100644 --- a/openair3/NRPPA/nrppa_gNB_location_information_transfer.h +++ b/openair3/NRPPA/nrppa_gNB_location_information_transfer.h @@ -29,5 +29,8 @@ void free_trp_information_request(nrppa_trp_information_req_t *msg); NRPPA_TRPInformationItem_t encode_trp_info_type_response_item_nrppa(nrppa_trp_information_type_response_item_t *in); void free_trp_information_response(nrppa_trp_information_resp_t *msg); int nrppa_gNB_handle_positioning_information_request(nrppa_gnb_ue_info_t *nrppa_msg_info, const NRPPA_NRPPA_PDU_t *pdu); +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); #endif /* NRPPA_GNB_POSITIONING_PROCEDURES_H_ */ diff --git a/openair3/NRPPA/nrppa_includes.h b/openair3/NRPPA/nrppa_includes.h index 63bb3fe248..6915b93370 100644 --- a/openair3/NRPPA/nrppa_includes.h +++ b/openair3/NRPPA/nrppa_includes.h @@ -42,5 +42,32 @@ #include "NRPPA_TRPPositionReferenced.h" #include "NRPPA_RelativeGeodeticLocation.h" #include "NRPPA_RelativeCartesianLocation.h" +#include "NRPPA_SRSCarrier-List-Item.h" +#include "NRPPA_SCS-SpecificCarrier.h" +#include "NRPPA_SRSConfig.h" +#include "NRPPA_SRSResource-List.h" +#include "NRPPA_SRSResource.h" +#include "NRPPA_ResourceType.h" +#include "NRPPA_ResourceTypePeriodic.h" +#include "NRPPA_ResourceTypeSemi-persistent.h" +#include "NRPPA_ResourceTypeAperiodic.h" +#include "NRPPA_PosSRSResource-List.h" +#include "NRPPA_ResourceTypePos.h" +#include "NRPPA_ResourceTypePeriodicPos.h" +#include "NRPPA_ResourceTypeSemi-persistentPos.h" +#include "NRPPA_ResourceTypeAperiodicPos.h" +#include "NRPPA_SRSResourceSet-List.h" +#include "NRPPA_SRSResourceSet.h" +#include "NRPPA_PosSRSResource-List.h" +#include "NRPPA_PosSRSResourceSet-Item.h" +#include "NRPPA_PosSRSResource-List.h" +#include "NRPPA_PosSRSResource-Item.h" +#include "NRPPA_ResourceSetTypePeriodic.h" +#include "NRPPA_ResourceSetTypeSemi-persistent.h" +#include "NRPPA_ResourceSetTypeAperiodic.h" +#include "NRPPA_PosSRSResourceSet-List.h" +#include "NRPPA_PosResourceSetTypePeriodic.h" +#include "NRPPA_PosResourceSetTypeSemi-persistent.h" +#include "NRPPA_PosResourceSetTypeAperiodic.h" #endif /* NRPPA_INCLUDE_H_ */ diff --git a/tests/nr-cu-nrppa/nr-cu-nrppa.c b/tests/nr-cu-nrppa/nr-cu-nrppa.c index aad8855797..ca47199133 100644 --- a/tests/nr-cu-nrppa/nr-cu-nrppa.c +++ b/tests/nr-cu-nrppa/nr-cu-nrppa.c @@ -148,6 +148,289 @@ static nrppa_trp_information_resp_t fill_trp_resp(uint8_t transaction_id) return resp; } +static nrppa_positioning_information_resp_t fill_position_information_resp(uint16_t transaction_id) +{ + nrppa_positioning_information_resp_t resp = {0}; + resp.transaction_id = transaction_id; + resp.srs_configuration = calloc_or_fail(1, sizeof(*resp.srs_configuration)); + nrppa_srs_carrier_list_t *srs_carrier_list = &resp.srs_configuration->srs_carrier_list; + uint32_t srs_carrier_list_len = 2; + srs_carrier_list->srs_carrier_list_length = srs_carrier_list_len; + srs_carrier_list->srs_carrier_list_item = calloc_or_fail(srs_carrier_list_len, sizeof(*srs_carrier_list->srs_carrier_list_item)); + for (int i = 0; i < srs_carrier_list_len; i++) { + nrppa_srs_carrier_list_item_t *srs_carrier_list_item = &srs_carrier_list->srs_carrier_list_item[i]; + // pointA + srs_carrier_list_item->pointA = 87641 + i; + + // Uplink Channel BW-PerSCS-List + nrppa_uplink_channel_bw_per_scs_list_t *uplink_channel_bw_per_scs_list = &srs_carrier_list_item->uplink_channel_bw_per_scs_list; + + uint32_t scs_specific_carrier_list_length = 3; + uplink_channel_bw_per_scs_list->scs_specific_carrier_list_length = scs_specific_carrier_list_length; + uplink_channel_bw_per_scs_list->scs_specific_carrier = + calloc_or_fail(scs_specific_carrier_list_length, sizeof(*uplink_channel_bw_per_scs_list->scs_specific_carrier)); + for (int j = 0; j < scs_specific_carrier_list_length; j++) { + nrppa_scs_specific_carrier_t *scs_specific_carrier = &uplink_channel_bw_per_scs_list->scs_specific_carrier[j]; + // offset to carrier + scs_specific_carrier->offset_to_carrier = 100 + i + j; + // subcarrier spacing + scs_specific_carrier->subcarrier_spacing = NRPPA_SUBCARRIER_SPACING_30KHZ; + // carrier bandwidth + scs_specific_carrier->carrier_bandwidth = 106 + i + j; + } + + // Active UL BWP + nrppa_active_ul_bwp_t *active_ul_bwp = &srs_carrier_list_item->active_ul_bwp; + + // location and bandwidth + active_ul_bwp->location_and_bandwidth = 2775 + i; + // subcarrier spacing + active_ul_bwp->subcarrier_spacing = NRPPA_SUBCARRIER_SPACING_30KHZ; + // cyclic prefix + active_ul_bwp->cyclic_prefix = NRPPA_CP_TYPE_NORMAL; + // Tx Direct Current Location + active_ul_bwp->tx_direct_current_location = 10 + i; + + // SRS Config + nrppa_srs_config_t *sRSConfig = &active_ul_bwp->srs_config; + + // srs_resource_list + sRSConfig->srs_resource_list = calloc_or_fail(1, sizeof(*sRSConfig->srs_resource_list)); + nrppa_srs_resource_list_t *srs_resource_list = sRSConfig->srs_resource_list; + uint32_t srs_resource_list_length = 3; + srs_resource_list->srs_resource_list_length = srs_resource_list_length; + srs_resource_list->srs_resource = calloc_or_fail(srs_resource_list_length, sizeof(*srs_resource_list->srs_resource)); + + // SRS resource config 1 : periodic + nrppa_srs_resource_t *srs_resource = &srs_resource_list->srs_resource[0]; + srs_resource->srs_resource_id = 22; + srs_resource->nr_of_srs_ports = NRPPA_SRS_NUMBER_OF_PORTS_N2; + srs_resource->transmission_comb.present = NRPPA_TRANSMISSION_COMB_PR_N2; + srs_resource->transmission_comb.choice.n2.comb_offset_n2 = 1; + srs_resource->transmission_comb.choice.n2.cyclic_shift_n2 = 3; + srs_resource->start_position = 8; + srs_resource->nr_of_symbols = NRPPA_SRS_NUMBER_OF_SYMBOLS_N4; + srs_resource->repetition_factor = NRPPA_SRS_REPETITION_FACTOR_RF2; + srs_resource->freq_domain_position = 32; + srs_resource->freq_domain_shift = 108; + srs_resource->c_srs = 31; + srs_resource->b_srs = 1; + srs_resource->b_hop = 3; + srs_resource->group_or_sequence_hopping = NRPPA_GROUPORSEQUENCEHOPPING_GROUPHOPPING; + srs_resource->resource_type.present = NRPPA_RESOURCE_TYPE_PR_PERIODIC; + + nrppa_resource_type_periodic_t *periodic = &srs_resource->resource_type.choice.periodic; + periodic->periodicity = NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT16; + periodic->offset = 1000; + srs_resource->sequence_id = 18; + + // SRS resource config 2 : semi-persistent + srs_resource = &srs_resource_list->srs_resource[1]; + srs_resource->srs_resource_id = 24; + srs_resource->nr_of_srs_ports = NRPPA_SRS_NUMBER_OF_PORTS_N4; + srs_resource->transmission_comb.present = NRPPA_TRANSMISSION_COMB_PR_N4; + srs_resource->transmission_comb.choice.n2.comb_offset_n2 = 3; + srs_resource->transmission_comb.choice.n2.cyclic_shift_n2 = 5; + srs_resource->start_position = 8; + srs_resource->nr_of_symbols = NRPPA_SRS_NUMBER_OF_SYMBOLS_N2; + srs_resource->repetition_factor = NRPPA_SRS_REPETITION_FACTOR_RF2; + srs_resource->freq_domain_position = 32; + srs_resource->freq_domain_shift = 108; + srs_resource->c_srs = 31; + srs_resource->b_srs = 1; + srs_resource->b_hop = 3; + srs_resource->group_or_sequence_hopping = NRPPA_GROUPORSEQUENCEHOPPING_GROUPHOPPING; + srs_resource->resource_type.present = NRPPA_RESOURCE_TYPE_PR_SEMI_PERSISTENT; + + srs_resource->resource_type.present = NRPPA_RESOURCE_TYPE_PR_SEMI_PERSISTENT; + nrppa_resource_type_semi_persistent_t *semi_persistent = &srs_resource->resource_type.choice.semi_persistent; + semi_persistent->periodicity = NRPPA_SRS_RESOURCE_TYPE_PERIODICITY_SLOT40; + semi_persistent->offset = 1000; + srs_resource->sequence_id = 12; + + // SRS resource config 2 : aperiodic + srs_resource = &srs_resource_list->srs_resource[2]; + srs_resource->srs_resource_id = 26; + srs_resource->nr_of_srs_ports = NRPPA_SRS_NUMBER_OF_PORTS_N2; + srs_resource->transmission_comb.present = NRPPA_TRANSMISSION_COMB_PR_N2; + srs_resource->transmission_comb.choice.n2.comb_offset_n2 = 1; + srs_resource->transmission_comb.choice.n2.cyclic_shift_n2 = 3; + srs_resource->start_position = 8; + srs_resource->nr_of_symbols = NRPPA_SRS_NUMBER_OF_SYMBOLS_N4; + srs_resource->repetition_factor = NRPPA_SRS_REPETITION_FACTOR_RF2; + srs_resource->freq_domain_position = 32; + srs_resource->freq_domain_shift = 108; + srs_resource->c_srs = 31; + srs_resource->b_srs = 1; + srs_resource->b_hop = 3; + srs_resource->group_or_sequence_hopping = NRPPA_GROUPORSEQUENCEHOPPING_SEQUENCEHOPPING; + srs_resource->resource_type.present = NRPPA_RESOURCE_TYPE_PR_APERIODIC; + // set aperiodic = 0 to enable + srs_resource->resource_type.choice.aperiodic = 0; + srs_resource->sequence_id = 10; + + // optional: pos_srs_resource_list + sRSConfig->pos_srs_resource_list = calloc_or_fail(1, sizeof(*sRSConfig->pos_srs_resource_list)); + nrppa_pos_srs_resource_list_t *pos_srs_resource_list = sRSConfig->pos_srs_resource_list; + uint32_t pos_srs_resource_list_length = 3; + pos_srs_resource_list->pos_srs_resource_list_length = pos_srs_resource_list_length; + pos_srs_resource_list->pos_srs_resource_item = + calloc_or_fail(pos_srs_resource_list_length, sizeof(*pos_srs_resource_list->pos_srs_resource_item)); + + // periodic + nrppa_pos_srs_resource_item_t *pos_srs_resource = &pos_srs_resource_list->pos_srs_resource_item[0]; + pos_srs_resource->srs_pos_resource_id = 12; + pos_srs_resource->transmission_comb_pos.present = NRPPA_TRANSMISSION_COMB_POS_PR_N2; + pos_srs_resource->transmission_comb_pos.choice.n2.comb_offset_n2 = 1; + pos_srs_resource->transmission_comb_pos.choice.n2.cyclic_shift_n2 = 4; + pos_srs_resource->start_position = 9; + pos_srs_resource->nr_of_symbols = NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N8; + pos_srs_resource->freq_domain_shift = 100; + pos_srs_resource->c_srs = 20; + pos_srs_resource->group_or_sequence_hopping = NRPPA_GROUPORSEQUENCEHOPPING_GROUPHOPPING; + pos_srs_resource->resource_type_pos.present = NRPPA_RESOURCE_TYPE_POS_PR_PERIODIC; + pos_srs_resource->resource_type_pos.choice.periodic.periodicity = NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5; + pos_srs_resource->resource_type_pos.choice.periodic.offset = 10; + pos_srs_resource->sequence_id = 1; + + // semi-persistent + pos_srs_resource = &pos_srs_resource_list->pos_srs_resource_item[1]; + pos_srs_resource->srs_pos_resource_id = 13; + pos_srs_resource->transmission_comb_pos.present = NRPPA_TRANSMISSION_COMB_POS_PR_N4; + pos_srs_resource->transmission_comb_pos.choice.n4.comb_offset_n4 = 3; + pos_srs_resource->transmission_comb_pos.choice.n4.cyclic_shift_n4 = 5; + pos_srs_resource->start_position = 12; + pos_srs_resource->nr_of_symbols = NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N12; + pos_srs_resource->freq_domain_shift = 100; + pos_srs_resource->c_srs = 20; + pos_srs_resource->group_or_sequence_hopping = NRPPA_GROUPORSEQUENCEHOPPING_GROUPHOPPING; + pos_srs_resource->resource_type_pos.present = NRPPA_RESOURCE_TYPE_POS_PR_SEMI_PERSISTENT; + pos_srs_resource->resource_type_pos.choice.semi_persistent.periodicity = NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT32; + pos_srs_resource->resource_type_pos.choice.semi_persistent.offset = 5; + pos_srs_resource->sequence_id = 2; + + // aperiodic + pos_srs_resource = &pos_srs_resource_list->pos_srs_resource_item[2]; + pos_srs_resource->srs_pos_resource_id = 14; + pos_srs_resource->transmission_comb_pos.present = NRPPA_TRANSMISSION_COMB_POS_PR_N8; + pos_srs_resource->transmission_comb_pos.choice.n8.comb_offset_n8 = 5; + pos_srs_resource->transmission_comb_pos.choice.n8.cyclic_shift_n8 = 2; + pos_srs_resource->start_position = 9; + pos_srs_resource->nr_of_symbols = NRPPA_SRS_RESOURCE_ITEM_NUMBER_OF_SYMBOLS_N4; + pos_srs_resource->freq_domain_shift = 100; + pos_srs_resource->c_srs = 20; + pos_srs_resource->group_or_sequence_hopping = NRPPA_GROUPORSEQUENCEHOPPING_SEQUENCEHOPPING; + pos_srs_resource->resource_type_pos.present = NRPPA_RESOURCE_TYPE_POS_PR_APERIODIC; + pos_srs_resource->resource_type_pos.choice.periodic.periodicity = NRPPA_SRS_RESOURCE_TYPE_POS_PERIODICITY_SLOT5; + pos_srs_resource->resource_type_pos.choice.aperiodic.slot_offset = 31; + pos_srs_resource->sequence_id = 3; + + // optional: srs_resource_set_list + sRSConfig->srs_resource_set_list = calloc_or_fail(1, sizeof(*sRSConfig->srs_resource_set_list)); + nrppa_srs_resource_set_list_t *srs_resource_set_list = sRSConfig->srs_resource_set_list; + uint32_t srs_resource_set_list_length = 3; + srs_resource_set_list->srs_resource_set_list_length = srs_resource_set_list_length; + srs_resource_set_list->srs_resource_set = + calloc_or_fail(srs_resource_set_list_length, sizeof(*srs_resource_set_list->srs_resource_set)); + + // periodic + nrppa_srs_resource_set_t *srs_resource_set = &srs_resource_set_list->srs_resource_set[0]; + srs_resource_set->srs_resource_set_id = 0; + uint8_t srs_resource_id_list_length = 5; + srs_resource_set->srs_resource_id_list.srs_resource_id_list_length = srs_resource_id_list_length; + srs_resource_set->srs_resource_id_list.srs_resource_id = + calloc_or_fail(srs_resource_id_list_length, sizeof(*srs_resource_set->srs_resource_id_list.srs_resource_id)); + for (int k = 0; k < srs_resource_id_list_length; k++) { + srs_resource_set->srs_resource_id_list.srs_resource_id[k] = k; + } + srs_resource_set->resource_set_type.present = NRPPA_RESOURCE_SET_TYPE_PR_PERIODIC; + // set periodic = 0 to enable + srs_resource_set->resource_set_type.choice.periodic = 0; + + // semi-persistent + srs_resource_set = &srs_resource_set_list->srs_resource_set[1]; + srs_resource_set->srs_resource_set_id = 1; + srs_resource_id_list_length = 5; + srs_resource_set->srs_resource_id_list.srs_resource_id_list_length = srs_resource_id_list_length; + srs_resource_set->srs_resource_id_list.srs_resource_id = + calloc_or_fail(srs_resource_id_list_length, sizeof(srs_resource_set->srs_resource_id_list.srs_resource_id)); + for (int k = 0; k < srs_resource_id_list_length; k++) { + srs_resource_set->srs_resource_id_list.srs_resource_id[k] = k; + } + srs_resource_set->resource_set_type.present = NRPPA_RESOURCE_SET_TYPE_PR_SEMI_PERSISTENT; + // set semi_persistent = 0 to enable + srs_resource_set->resource_set_type.choice.semi_persistent = 0; + + // aperiodic + srs_resource_set = &srs_resource_set_list->srs_resource_set[2]; + srs_resource_set->srs_resource_set_id = 2; + srs_resource_id_list_length = 5; + srs_resource_set->srs_resource_id_list.srs_resource_id_list_length = srs_resource_id_list_length; + srs_resource_set->srs_resource_id_list.srs_resource_id = + calloc_or_fail(srs_resource_id_list_length, sizeof(*srs_resource_set->srs_resource_id_list.srs_resource_id)); + for (int k = 0; k < srs_resource_id_list_length; k++) { + srs_resource_set->srs_resource_id_list.srs_resource_id[k] = k; + } + + srs_resource_set->resource_set_type.present = NRPPA_RESOURCE_SET_TYPE_PR_APERIODIC; + srs_resource_set->resource_set_type.choice.aperiodic.srs_resource_trigger = 2; + srs_resource_set->resource_set_type.choice.aperiodic.slot_offset = 20; + + // optional: pos_srs_resource_set_list + sRSConfig->pos_srs_resource_set_list = calloc_or_fail(1, sizeof(*sRSConfig->pos_srs_resource_set_list)); + nrppa_pos_srs_resource_set_list_t *pos_srs_resource_set_list = sRSConfig->pos_srs_resource_set_list; + uint32_t pos_srs_resource_set_list_length = 3; + pos_srs_resource_set_list->pos_srs_resource_set_list_length = pos_srs_resource_set_list_length; + pos_srs_resource_set_list->pos_srs_resource_set_item = + calloc_or_fail(pos_srs_resource_set_list_length, sizeof(*pos_srs_resource_set_list->pos_srs_resource_set_item)); + + // periodic + nrppa_pos_srs_resource_set_item_t *pos_srs_resource_set = &pos_srs_resource_set_list->pos_srs_resource_set_item[0]; + pos_srs_resource_set->pos_srs_resource_set_id = 0; + uint8_t pos_srs_resource_id_list_length = 5; + pos_srs_resource_set->pos_srs_resource_id_list.pos_srs_resource_id_list_length = pos_srs_resource_id_list_length; + pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id = + calloc_or_fail(pos_srs_resource_id_list_length, + sizeof(*pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id)); + for (int k = 0; k < pos_srs_resource_id_list_length; k++) { + pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id[k] = k; + } + pos_srs_resource_set->pos_resource_set_type.present = NRPPA_POS_RESOURCE_SET_TYPE_PR_PERIODIC; + // set periodic = 0 to enable + pos_srs_resource_set->pos_resource_set_type.choice.periodic = 0; + + // semi-persistent + pos_srs_resource_set = &pos_srs_resource_set_list->pos_srs_resource_set_item[1]; + pos_srs_resource_set->pos_srs_resource_set_id = 1; + pos_srs_resource_id_list_length = 5; + pos_srs_resource_set->pos_srs_resource_id_list.pos_srs_resource_id_list_length = pos_srs_resource_id_list_length; + pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id = + calloc_or_fail(pos_srs_resource_id_list_length, + sizeof(*pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id)); + for (int k = 0; k < pos_srs_resource_id_list_length; k++) { + pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id[k] = k; + } + pos_srs_resource_set->pos_resource_set_type.present = NRPPA_POS_RESOURCE_SET_TYPE_PR_SEMI_PERSISTENT; + // set semi_persistent = 0 to enable + pos_srs_resource_set->pos_resource_set_type.choice.semi_persistent = 0; + + // aperiodic + pos_srs_resource_set = &pos_srs_resource_set_list->pos_srs_resource_set_item[2]; + pos_srs_resource_set->pos_srs_resource_set_id = 2; + pos_srs_resource_id_list_length = 5; + pos_srs_resource_set->pos_srs_resource_id_list.pos_srs_resource_id_list_length = pos_srs_resource_id_list_length; + pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id = + calloc_or_fail(pos_srs_resource_id_list_length, + sizeof(*pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id)); + for (int k = 0; k < pos_srs_resource_id_list_length; k++) { + pos_srs_resource_set->pos_srs_resource_id_list.srs_pos_resource_id[k] = k; + } + pos_srs_resource_set->pos_resource_set_type.present = NRPPA_POS_RESOURCE_SET_TYPE_PR_APERIODIC; + pos_srs_resource_set->pos_resource_set_type.choice.srs_resource = 3; + } + return resp; +} + // Initializing UE NAS Context with simulated SIM data nr_ue_nas_t *simulated_ue_nas = NULL; void init_ue_nas_context(void) @@ -288,6 +571,14 @@ void *rrc_gnb_task(void *args_p) LOG_I(NR_RRC, "Sending NRPPA_TRP_INFORMATION_RESP to TASK_NRPPA\n"); itti_send_msg_to_task(TASK_NRPPA, 0, msg_p_resp); break; + case NRPPA_POSITIONING_INFORMATION_REQ: + nrppa_positioning_information_req_t *pos_req = &NRPPA_POSITIONING_INFORMATION_REQ(msg_p); + LOG_I(NR_RRC, "Received NRPPA_POSITIONING_INFORMATION_REQ transaction_id %d\n", pos_req->transaction_id); + msg_p_resp = itti_alloc_new_message(TASK_RRC_GNB, 0, NRPPA_POSITIONING_INFORMATION_RESP); + NRPPA_POSITIONING_INFORMATION_RESP(msg_p_resp) = fill_position_information_resp(pos_req->transaction_id); + LOG_I(NR_RRC, "Sending NRPPA_POSITIONING_INFORMATION_RESP to TASK_NRPPA\n"); + itti_send_msg_to_task(TASK_NRPPA, 0, msg_p_resp); + break; default: LOG_E(NR_RRC, "[gNB %ld] Received unexpected message %s\n", instance, msg_name_p); break;