diff --git a/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h b/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h index 91f5a959bfc5623d8305328ff2aca1c57b7b4ce1..e0682dbb44e88eda2d27ff926eac4d3645393f2e 100644 --- a/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h +++ b/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h @@ -44,6 +44,7 @@ bool eq_rx_data_indication(const nfapi_nr_rx_data_indication_t *a, const nfapi_n bool eq_crc_indication(const nfapi_nr_crc_indication_t *a, const nfapi_nr_crc_indication_t *b); bool eq_uci_indication(const nfapi_nr_uci_indication_t *a, const nfapi_nr_uci_indication_t *b); bool eq_srs_indication(const nfapi_nr_srs_indication_t *a, const nfapi_nr_srs_indication_t *b); +bool eq_rach_indication(const nfapi_nr_rach_indication_t *a, const nfapi_nr_rach_indication_t *b); void free_dl_tti_request(nfapi_nr_dl_tti_request_t *msg); void free_ul_tti_request(nfapi_nr_ul_tti_request_t *msg); @@ -54,6 +55,7 @@ void free_rx_data_indication(nfapi_nr_rx_data_indication_t *msg); void free_crc_indication(nfapi_nr_crc_indication_t *msg); void free_uci_indication(nfapi_nr_uci_indication_t *msg); void free_srs_indication(nfapi_nr_srs_indication_t *msg); +void free_rach_indication(nfapi_nr_rach_indication_t *msg); void copy_dl_tti_request(const nfapi_nr_dl_tti_request_t *src, nfapi_nr_dl_tti_request_t *dst); void copy_ul_tti_request(const nfapi_nr_ul_tti_request_t *src, nfapi_nr_ul_tti_request_t *dst); @@ -64,6 +66,7 @@ void copy_rx_data_indication(const nfapi_nr_rx_data_indication_t *src, nfapi_nr_ void copy_crc_indication(const nfapi_nr_crc_indication_t *src, nfapi_nr_crc_indication_t *dst); void copy_uci_indication(const nfapi_nr_uci_indication_t *src, nfapi_nr_uci_indication_t *dst); void copy_srs_indication(const nfapi_nr_srs_indication_t *src, nfapi_nr_srs_indication_t *dst); +void copy_rach_indication(const nfapi_nr_rach_indication_t *src, nfapi_nr_rach_indication_t *dst); size_t get_tx_data_request_size(const nfapi_nr_tx_data_request_t *msg); @@ -71,4 +74,5 @@ size_t get_rx_data_indication_size(const nfapi_nr_rx_data_indication_t *msg); size_t get_crc_indication_size(const nfapi_nr_crc_indication_t *msg); size_t get_uci_indication_size(const nfapi_nr_uci_indication_t *msg); size_t get_srs_indication_size(const nfapi_nr_srs_indication_t *msg); +size_t get_rach_indication_size(nfapi_nr_rach_indication_t *msg); #endif // OPENAIRINTERFACE_NR_FAPI_P7_UTILS_H diff --git a/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c b/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c index c12e88de02ed259f775554d50962f28f8f9e274c..395cb29fe1d741efe67c07284e3b75f124022927 100644 --- a/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c +++ b/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c @@ -825,6 +825,38 @@ bool eq_srs_indication(const nfapi_nr_srs_indication_t *a, const nfapi_nr_srs_in return true; } +static bool eq_rach_indication_PDU(const nfapi_nr_prach_indication_pdu_t *a, const nfapi_nr_prach_indication_pdu_t *b) +{ + EQ(a->phy_cell_id, b->phy_cell_id); + EQ(a->symbol_index, b->symbol_index); + EQ(a->slot_index, b->slot_index); + EQ(a->freq_index, b->freq_index); + EQ(a->avg_rssi, b->avg_rssi); + EQ(a->avg_snr, b->avg_snr); + EQ(a->num_preamble, b->num_preamble); + for (int preamble_idx = 0; preamble_idx < a->num_preamble; ++preamble_idx) { + const nfapi_nr_prach_indication_preamble_t *a_pr = &a->preamble_list[preamble_idx]; + const nfapi_nr_prach_indication_preamble_t *b_pr = &b->preamble_list[preamble_idx]; + EQ(a_pr->preamble_index, b_pr->preamble_index); + EQ(a_pr->timing_advance, b_pr->timing_advance); + EQ(a_pr->preamble_pwr, b_pr->preamble_pwr); + } + return true; +} + +bool eq_rach_indication(const nfapi_nr_rach_indication_t *a, const nfapi_nr_rach_indication_t *b) +{ + EQ(a->header.message_id, b->header.message_id); + EQ(a->header.message_length, b->header.message_length); + EQ(a->sfn, b->sfn); + EQ(a->slot, b->slot); + EQ(a->number_of_pdus, b->number_of_pdus); + for (int pdu_idx = 0; pdu_idx < a->number_of_pdus; ++pdu_idx) { + EQ(eq_rach_indication_PDU(&a->pdu_list[pdu_idx], &b->pdu_list[pdu_idx]), true); + } + return true; +} + void free_dl_tti_request(nfapi_nr_dl_tti_request_t *msg) { if (msg->vendor_extension) { @@ -973,6 +1005,13 @@ void free_srs_indication(nfapi_nr_srs_indication_t *msg) } } +void free_rach_indication(nfapi_nr_rach_indication_t *msg) +{ + if (msg->pdu_list) { + free(msg->pdu_list); + } +} + static void copy_dl_tti_beamforming(const nfapi_nr_tx_precoding_and_beamforming_t *src, nfapi_nr_tx_precoding_and_beamforming_t *dst) { @@ -1916,3 +1955,49 @@ size_t get_srs_indication_size(const nfapi_nr_srs_indication_t *msg) return total_size; } + +static void copy_rach_indication_PDU(const nfapi_nr_prach_indication_pdu_t *src, nfapi_nr_prach_indication_pdu_t *dst) +{ + dst->phy_cell_id = src->phy_cell_id; + dst->symbol_index = src->symbol_index; + dst->slot_index = src->slot_index; + dst->freq_index = src->freq_index; + dst->avg_rssi = src->avg_rssi; + dst->avg_snr = src->avg_snr; + dst->num_preamble = src->num_preamble; + for (int preamble_idx = 0; preamble_idx < dst->num_preamble; ++preamble_idx) { + nfapi_nr_prach_indication_preamble_t *dst_pr = &dst->preamble_list[preamble_idx]; + const nfapi_nr_prach_indication_preamble_t *src_pr = &src->preamble_list[preamble_idx]; + dst_pr->preamble_index = src_pr->preamble_index; + dst_pr->timing_advance = src_pr->timing_advance; + dst_pr->preamble_pwr = src_pr->preamble_pwr; + } +} + +void copy_rach_indication(const nfapi_nr_rach_indication_t *src, nfapi_nr_rach_indication_t *dst) +{ + dst->header.message_id = src->header.message_id; + dst->header.message_length = src->header.message_length; + dst->sfn = src->sfn; + dst->slot = src->slot; + dst->number_of_pdus = src->number_of_pdus; + dst->pdu_list = calloc(dst->number_of_pdus, sizeof(*dst->pdu_list)); + for (int pdu_idx = 0; pdu_idx < dst->number_of_pdus; ++pdu_idx) { + copy_rach_indication_PDU(&src->pdu_list[pdu_idx], &dst->pdu_list[pdu_idx]); + } +} + +size_t get_rach_indication_size(nfapi_nr_rach_indication_t *msg) +{ + // Get size of the message (allocated pointer included) + size_t total_size = 0; + + // Header and fixed-size fields + total_size += sizeof(msg->header); + total_size += sizeof(msg->sfn); + total_size += sizeof(msg->slot); + total_size += sizeof(msg->number_of_pdus); + total_size += msg->number_of_pdus * sizeof(*msg->pdu_list); + + return total_size; +}