Files
openairinterface5g/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c
T

2780 lines
107 KiB
C

/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "nr_fapi_p7_utils.h"
#include <malloc.h>
static bool eq_dl_tti_beamforming(const nfapi_nr_tx_precoding_and_beamforming_t *a,
const nfapi_nr_tx_precoding_and_beamforming_t *b)
{
EQ(a->num_prgs, b->num_prgs);
EQ(a->prg_size, b->prg_size);
EQ(a->dig_bf_interfaces, b->dig_bf_interfaces);
for (int prg = 0; prg < a->num_prgs; ++prg) {
EQ(a->prgs_list[prg].pm_idx, b->prgs_list[prg].pm_idx);
for (int dbf_if = 0; dbf_if < a->dig_bf_interfaces; ++dbf_if) {
EQ(a->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx, b->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx);
}
}
return true;
}
static bool eq_dl_tti_request_pdcch_pdu(const nfapi_nr_dl_tti_pdcch_pdu_rel15_t *a, const nfapi_nr_dl_tti_pdcch_pdu_rel15_t *b)
{
EQ(a->BWPSize, b->BWPSize);
EQ(a->BWPStart, b->BWPStart);
EQ(a->SubcarrierSpacing, b->SubcarrierSpacing);
EQ(a->CyclicPrefix, b->CyclicPrefix);
EQ(a->StartSymbolIndex, b->StartSymbolIndex);
EQ(a->DurationSymbols, b->DurationSymbols);
for (int fdr_idx = 0; fdr_idx < 6; ++fdr_idx) {
EQ(a->FreqDomainResource[fdr_idx], b->FreqDomainResource[fdr_idx]);
}
EQ(a->CceRegMappingType, b->CceRegMappingType);
EQ(a->RegBundleSize, b->RegBundleSize);
EQ(a->InterleaverSize, b->InterleaverSize);
EQ(a->CoreSetType, b->CoreSetType);
EQ(a->ShiftIndex, b->ShiftIndex);
EQ(a->precoderGranularity, b->precoderGranularity);
EQ(a->numDlDci, b->numDlDci);
for (int dl_dci = 0; dl_dci < a->numDlDci; ++dl_dci) {
const nfapi_nr_dl_dci_pdu_t *a_dci_pdu = &a->dci_pdu[dl_dci];
const nfapi_nr_dl_dci_pdu_t *b_dci_pdu = &b->dci_pdu[dl_dci];
EQ(a_dci_pdu->RNTI, b_dci_pdu->RNTI);
EQ(a_dci_pdu->ScramblingId, b_dci_pdu->ScramblingId);
EQ(a_dci_pdu->ScramblingRNTI, b_dci_pdu->ScramblingRNTI);
EQ(a_dci_pdu->CceIndex, b_dci_pdu->CceIndex);
EQ(a_dci_pdu->AggregationLevel, b_dci_pdu->AggregationLevel);
EQ(eq_dl_tti_beamforming(&a_dci_pdu->precodingAndBeamforming, &b_dci_pdu->precodingAndBeamforming), true);
EQ(a_dci_pdu->beta_PDCCH_1_0, b_dci_pdu->beta_PDCCH_1_0);
EQ(a_dci_pdu->powerControlOffsetSS, b_dci_pdu->powerControlOffsetSS);
EQ(a_dci_pdu->PayloadSizeBits, b_dci_pdu->PayloadSizeBits);
for (int i = 0; i < 8; ++i) {
// The parameter itself always has 8 positions, no need to calculate how many bytes the payload actually occupies
EQ(a_dci_pdu->Payload[i], b_dci_pdu->Payload[i]);
}
}
return true;
}
static bool eq_dl_tti_request_pdsch_pdu(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *a, const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *b)
{
EQ(a->pduBitmap, b->pduBitmap);
EQ(a->rnti, b->rnti);
EQ(a->pduIndex, b->pduIndex);
EQ(a->BWPSize, b->BWPSize);
EQ(a->BWPStart, b->BWPStart);
EQ(a->SubcarrierSpacing, b->SubcarrierSpacing);
EQ(a->CyclicPrefix, b->CyclicPrefix);
EQ(a->NrOfCodewords, b->NrOfCodewords);
for (int cw = 0; cw < a->NrOfCodewords; ++cw) {
EQ(a->targetCodeRate[cw], b->targetCodeRate[cw]);
EQ(a->qamModOrder[cw], b->qamModOrder[cw]);
EQ(a->mcsIndex[cw], b->mcsIndex[cw]);
EQ(a->mcsTable[cw], b->mcsTable[cw]);
EQ(a->rvIndex[cw], b->rvIndex[cw]);
EQ(a->TBSize[cw], b->TBSize[cw]);
}
EQ(a->dataScramblingId, b->dataScramblingId);
EQ(a->nrOfLayers, b->nrOfLayers);
EQ(a->transmissionScheme, b->transmissionScheme);
EQ(a->refPoint, b->refPoint);
EQ(a->dlDmrsSymbPos, b->dlDmrsSymbPos);
EQ(a->dmrsConfigType, b->dmrsConfigType);
EQ(a->dlDmrsScramblingId, b->dlDmrsScramblingId);
EQ(a->SCID, b->SCID);
EQ(a->numDmrsCdmGrpsNoData, b->numDmrsCdmGrpsNoData);
EQ(a->dmrsPorts, b->dmrsPorts);
EQ(a->resourceAlloc, b->resourceAlloc);
for (int i = 0; i < 36; ++i) {
EQ(a->rbBitmap[i], b->rbBitmap[i]);
}
EQ(a->rbStart, b->rbStart);
EQ(a->rbSize, b->rbSize);
EQ(a->VRBtoPRBMapping, b->VRBtoPRBMapping);
EQ(a->StartSymbolIndex, b->StartSymbolIndex);
EQ(a->NrOfSymbols, b->NrOfSymbols);
EQ(a->PTRSPortIndex, b->PTRSPortIndex);
EQ(a->PTRSTimeDensity, b->PTRSTimeDensity);
EQ(a->PTRSFreqDensity, b->PTRSFreqDensity);
EQ(a->PTRSReOffset, b->PTRSReOffset);
EQ(a->nEpreRatioOfPDSCHToPTRS, b->nEpreRatioOfPDSCHToPTRS);
EQ(eq_dl_tti_beamforming(&a->precodingAndBeamforming, &b->precodingAndBeamforming), true);
EQ(a->powerControlOffset, b->powerControlOffset);
EQ(a->powerControlOffsetSS, b->powerControlOffsetSS);
EQ(a->isLastCbPresent, b->isLastCbPresent);
EQ(a->isInlineTbCrc, b->isInlineTbCrc);
EQ(a->dlTbCrc, b->dlTbCrc);
EQ(a->maintenance_parms_v3.ldpcBaseGraph, b->maintenance_parms_v3.ldpcBaseGraph);
EQ(a->maintenance_parms_v3.tbSizeLbrmBytes, b->maintenance_parms_v3.tbSizeLbrmBytes);
return true;
}
static bool eq_dl_tti_request_csi_rs_pdu(const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *a, const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *b)
{
EQ(a->bwp_size, b->bwp_size);
EQ(a->bwp_start, b->bwp_start);
EQ(a->subcarrier_spacing, b->subcarrier_spacing);
EQ(a->cyclic_prefix, b->cyclic_prefix);
EQ(a->start_rb, b->start_rb);
EQ(a->nr_of_rbs, b->nr_of_rbs);
EQ(a->csi_type, b->csi_type);
EQ(a->row, b->row);
EQ(a->freq_domain, b->freq_domain);
EQ(a->symb_l0, b->symb_l0);
EQ(a->symb_l1, b->symb_l1);
EQ(a->cdm_type, b->cdm_type);
EQ(a->freq_density, b->freq_density);
EQ(a->scramb_id, b->scramb_id);
EQ(a->power_control_offset, b->power_control_offset);
EQ(a->power_control_offset_ss, b->power_control_offset_ss);
EQ(eq_dl_tti_beamforming(&a->precodingAndBeamforming, &b->precodingAndBeamforming), true);
return true;
}
static bool eq_dl_tti_request_ssb_pdu(const nfapi_nr_dl_tti_ssb_pdu_rel15_t *a, const nfapi_nr_dl_tti_ssb_pdu_rel15_t *b)
{
EQ(a->PhysCellId, b->PhysCellId);
EQ(a->BetaPss, b->BetaPss);
EQ(a->SsbBlockIndex, b->SsbBlockIndex);
EQ(a->SsbSubcarrierOffset, b->SsbSubcarrierOffset);
EQ(a->ssbOffsetPointA, b->ssbOffsetPointA);
EQ(a->bchPayloadFlag, b->bchPayloadFlag);
EQ(a->bchPayload, b->bchPayload);
EQ(a->ssbRsrp, b->ssbRsrp);
EQ(eq_dl_tti_beamforming(&a->precoding_and_beamforming, &b->precoding_and_beamforming), true);
return true;
}
bool eq_dl_tti_request(const nfapi_nr_dl_tti_request_t *a, const nfapi_nr_dl_tti_request_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->dl_tti_request_body.nPDUs, b->dl_tti_request_body.nPDUs);
EQ(a->dl_tti_request_body.nGroup, b->dl_tti_request_body.nGroup);
for (int PDU = 0; PDU < a->dl_tti_request_body.nPDUs; ++PDU) {
// take the PDU at the start of loops
const nfapi_nr_dl_tti_request_pdu_t *a_dl_pdu = &a->dl_tti_request_body.dl_tti_pdu_list[PDU];
const nfapi_nr_dl_tti_request_pdu_t *b_dl_pdu = &b->dl_tti_request_body.dl_tti_pdu_list[PDU];
EQ(a_dl_pdu->PDUType, b_dl_pdu->PDUType);
EQ(a_dl_pdu->PDUSize, b_dl_pdu->PDUSize);
switch (a_dl_pdu->PDUType) {
case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
EQ(eq_dl_tti_request_pdcch_pdu(&a_dl_pdu->pdcch_pdu.pdcch_pdu_rel15, &b_dl_pdu->pdcch_pdu.pdcch_pdu_rel15), true);
break;
case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
EQ(eq_dl_tti_request_pdsch_pdu(&a_dl_pdu->pdsch_pdu.pdsch_pdu_rel15, &b_dl_pdu->pdsch_pdu.pdsch_pdu_rel15), true);
break;
case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
EQ(eq_dl_tti_request_csi_rs_pdu(&a_dl_pdu->csi_rs_pdu.csi_rs_pdu_rel15, &b_dl_pdu->csi_rs_pdu.csi_rs_pdu_rel15), true);
break;
case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
EQ(eq_dl_tti_request_ssb_pdu(&a_dl_pdu->ssb_pdu.ssb_pdu_rel15, &b_dl_pdu->ssb_pdu.ssb_pdu_rel15), true);
break;
default:
// PDU Type is not any known value
return false;
}
}
for (int nGroup = 0; nGroup < a->dl_tti_request_body.nGroup; ++nGroup) {
EQ(a->dl_tti_request_body.nUe[nGroup], b->dl_tti_request_body.nUe[nGroup]);
for (int UE = 0; UE < a->dl_tti_request_body.nUe[nGroup]; ++UE) {
EQ(a->dl_tti_request_body.PduIdx[nGroup][UE], b->dl_tti_request_body.PduIdx[nGroup][UE]);
}
}
return true;
}
static bool eq_ul_tti_beamforming(const nfapi_nr_ul_beamforming_t *a, const nfapi_nr_ul_beamforming_t *b)
{
EQ(a->trp_scheme, b->trp_scheme);
EQ(a->num_prgs, b->num_prgs);
EQ(a->prg_size, b->prg_size);
EQ(a->dig_bf_interface, b->dig_bf_interface);
for (int prg = 0; prg < a->num_prgs; ++prg) {
for (int dbf_if = 0; dbf_if < a->dig_bf_interface; ++dbf_if) {
EQ(a->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx, b->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx);
}
}
return true;
}
static bool eq_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *a, const nfapi_nr_prach_pdu_t *b)
{
EQ(a->phys_cell_id, b->phys_cell_id);
EQ(a->num_prach_ocas, b->num_prach_ocas);
EQ(a->prach_format, b->prach_format);
EQ(a->num_ra, b->num_ra);
EQ(a->prach_start_symbol, b->prach_start_symbol);
EQ(a->num_cs, b->num_cs);
EQ(eq_ul_tti_beamforming(&a->beamforming, &b->beamforming), true);
return true;
}
static bool eq_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *a, const nfapi_nr_pusch_pdu_t *b)
{
EQ(a->pdu_bit_map, b->pdu_bit_map);
EQ(a->rnti, b->rnti);
EQ(a->handle, b->handle);
EQ(a->bwp_size, b->bwp_size);
EQ(a->bwp_start, b->bwp_start);
EQ(a->subcarrier_spacing, b->subcarrier_spacing);
EQ(a->cyclic_prefix, b->cyclic_prefix);
EQ(a->target_code_rate, b->target_code_rate);
EQ(a->qam_mod_order, b->qam_mod_order);
EQ(a->mcs_index, b->mcs_index);
EQ(a->mcs_table, b->mcs_table);
EQ(a->transform_precoding, b->transform_precoding);
EQ(a->data_scrambling_id, b->data_scrambling_id);
EQ(a->nrOfLayers, b->nrOfLayers);
EQ(a->ul_dmrs_symb_pos, b->ul_dmrs_symb_pos);
EQ(a->dmrs_config_type, b->dmrs_config_type);
EQ(a->ul_dmrs_scrambling_id, b->ul_dmrs_scrambling_id);
EQ(a->pusch_identity, b->pusch_identity);
EQ(a->scid, b->scid);
EQ(a->num_dmrs_cdm_grps_no_data, b->num_dmrs_cdm_grps_no_data);
EQ(a->dmrs_ports, b->dmrs_ports);
EQ(a->resource_alloc, b->resource_alloc);
for (int i = 0; i < 36; ++i) {
EQ(a->rb_bitmap[i], b->rb_bitmap[i]);
}
EQ(a->rb_start, b->rb_start);
EQ(a->rb_size, b->rb_size);
EQ(a->vrb_to_prb_mapping, b->vrb_to_prb_mapping);
EQ(a->frequency_hopping, b->frequency_hopping);
EQ(a->tx_direct_current_location, b->tx_direct_current_location);
EQ(a->uplink_frequency_shift_7p5khz, b->uplink_frequency_shift_7p5khz);
EQ(a->start_symbol_index, b->start_symbol_index);
EQ(a->nr_of_symbols, b->nr_of_symbols);
if (a->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA) {
const nfapi_nr_pusch_data_t *a_pusch_data = &a->pusch_data;
const nfapi_nr_pusch_data_t *b_pusch_data = &b->pusch_data;
EQ(a_pusch_data->rv_index, b_pusch_data->rv_index);
EQ(a_pusch_data->harq_process_id, b_pusch_data->harq_process_id);
EQ(a_pusch_data->new_data_indicator, b_pusch_data->new_data_indicator);
EQ(a_pusch_data->tb_size, b_pusch_data->tb_size);
EQ(a_pusch_data->num_cb, b_pusch_data->num_cb);
for (int i = 0; i < (a_pusch_data->num_cb + 7) / 8; ++i) {
EQ(a_pusch_data->cb_present_and_position[i], b_pusch_data->cb_present_and_position[i]);
}
}
if (a->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI) {
const nfapi_nr_pusch_uci_t *a_pusch_uci = &a->pusch_uci;
const nfapi_nr_pusch_uci_t *b_pusch_uci = &b->pusch_uci;
EQ(a_pusch_uci->harq_ack_bit_length, b_pusch_uci->harq_ack_bit_length);
EQ(a_pusch_uci->csi_part1_bit_length, b_pusch_uci->csi_part1_bit_length);
EQ(a_pusch_uci->csi_part2_bit_length, b_pusch_uci->csi_part2_bit_length);
EQ(a_pusch_uci->alpha_scaling, b_pusch_uci->alpha_scaling);
EQ(a_pusch_uci->beta_offset_harq_ack, b_pusch_uci->beta_offset_harq_ack);
EQ(a_pusch_uci->beta_offset_csi1, b_pusch_uci->beta_offset_csi1);
EQ(a_pusch_uci->beta_offset_csi2, b_pusch_uci->beta_offset_csi2);
}
if (a->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
const nfapi_nr_pusch_ptrs_t *a_pusch_ptrs = &a->pusch_ptrs;
const nfapi_nr_pusch_ptrs_t *b_pusch_ptrs = &b->pusch_ptrs;
EQ(a_pusch_ptrs->num_ptrs_ports, b_pusch_ptrs->num_ptrs_ports);
for (int i = 0; i < a_pusch_ptrs->num_ptrs_ports; ++i) {
const nfapi_nr_ptrs_ports_t *a_ptrs_port = &a_pusch_ptrs->ptrs_ports_list[i];
const nfapi_nr_ptrs_ports_t *b_ptrs_port = &b_pusch_ptrs->ptrs_ports_list[i];
EQ(a_ptrs_port->ptrs_port_index, b_ptrs_port->ptrs_port_index);
EQ(a_ptrs_port->ptrs_dmrs_port, b_ptrs_port->ptrs_dmrs_port);
EQ(a_ptrs_port->ptrs_re_offset, b_ptrs_port->ptrs_re_offset);
}
EQ(a_pusch_ptrs->ptrs_time_density, b_pusch_ptrs->ptrs_time_density);
EQ(a_pusch_ptrs->ptrs_freq_density, b_pusch_ptrs->ptrs_freq_density);
EQ(a_pusch_ptrs->ul_ptrs_power, b_pusch_ptrs->ul_ptrs_power);
}
if (a->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM) {
const nfapi_nr_dfts_ofdm_t *a_dfts_ofdm = &a->dfts_ofdm;
const nfapi_nr_dfts_ofdm_t *b_dfts_ofdm = &b->dfts_ofdm;
EQ(a_dfts_ofdm->low_papr_group_number, b_dfts_ofdm->low_papr_group_number);
EQ(a_dfts_ofdm->low_papr_sequence_number, b_dfts_ofdm->low_papr_sequence_number);
EQ(a_dfts_ofdm->ul_ptrs_sample_density, b_dfts_ofdm->ul_ptrs_sample_density);
EQ(a_dfts_ofdm->ul_ptrs_time_density_transform_precoding, b_dfts_ofdm->ul_ptrs_time_density_transform_precoding);
}
EQ(eq_ul_tti_beamforming(&a->beamforming, &b->beamforming), true);
EQ(a->maintenance_parms_v3.ldpcBaseGraph, b->maintenance_parms_v3.ldpcBaseGraph);
EQ(a->maintenance_parms_v3.tbSizeLbrmBytes, b->maintenance_parms_v3.tbSizeLbrmBytes);
return true;
}
static bool eq_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *a, const nfapi_nr_pucch_pdu_t *b)
{
EQ(a->rnti, b->rnti);
EQ(a->handle, b->handle);
EQ(a->bwp_size, b->bwp_size);
EQ(a->bwp_start, b->bwp_start);
EQ(a->subcarrier_spacing, b->subcarrier_spacing);
EQ(a->cyclic_prefix, b->cyclic_prefix);
EQ(a->format_type, b->format_type);
EQ(a->multi_slot_tx_indicator, b->multi_slot_tx_indicator);
EQ(a->pi_2bpsk, b->pi_2bpsk);
EQ(a->prb_start, b->prb_start);
EQ(a->prb_size, b->prb_size);
EQ(a->start_symbol_index, b->start_symbol_index);
EQ(a->nr_of_symbols, b->nr_of_symbols);
EQ(a->freq_hop_flag, b->freq_hop_flag);
EQ(a->second_hop_prb, b->second_hop_prb);
EQ(a->group_hop_flag, b->group_hop_flag);
EQ(a->sequence_hop_flag, b->sequence_hop_flag);
EQ(a->hopping_id, b->hopping_id);
EQ(a->initial_cyclic_shift, b->initial_cyclic_shift);
EQ(a->data_scrambling_id, b->data_scrambling_id);
EQ(a->time_domain_occ_idx, b->time_domain_occ_idx);
EQ(a->pre_dft_occ_idx, b->pre_dft_occ_idx);
EQ(a->pre_dft_occ_len, b->pre_dft_occ_len);
EQ(a->add_dmrs_flag, b->add_dmrs_flag);
EQ(a->dmrs_scrambling_id, b->dmrs_scrambling_id);
EQ(a->dmrs_cyclic_shift, b->dmrs_cyclic_shift);
EQ(a->sr_flag, b->sr_flag);
EQ(a->bit_len_harq, b->bit_len_harq);
EQ(a->bit_len_csi_part1, b->bit_len_csi_part1);
EQ(a->bit_len_csi_part2, b->bit_len_csi_part2);
EQ(eq_ul_tti_beamforming(&a->beamforming, &b->beamforming), true);
return true;
}
static bool eq_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *a,
const uint8_t num_symbols,
const nfapi_v4_srs_parameters_t *b)
{
EQ(a->srs_bandwidth_size, b->srs_bandwidth_size);
for (int symbol_idx = 0; symbol_idx < num_symbols; ++symbol_idx) {
const nfapi_v4_srs_parameters_symbols_t *a_symbol = &a->symbol_list[symbol_idx];
const nfapi_v4_srs_parameters_symbols_t *b_symbol = &b->symbol_list[symbol_idx];
EQ(a_symbol->srs_bandwidth_start, b_symbol->srs_bandwidth_start);
EQ(a_symbol->sequence_group, b_symbol->sequence_group);
EQ(a_symbol->sequence_number, b_symbol->sequence_number);
}
#ifdef ENABLE_AERIAL
// For Aerial, we always process the 4 reported symbols, not only the ones indicated by num_symbols
for (int symbol_idx = num_symbols; symbol_idx < 4; ++symbol_idx) {
const nfapi_v4_srs_parameters_symbols_t *a_symbol = &a->symbol_list[symbol_idx];
const nfapi_v4_srs_parameters_symbols_t *b_symbol = &b->symbol_list[symbol_idx];
EQ(a_symbol->srs_bandwidth_start, b_symbol->srs_bandwidth_start);
EQ(a_symbol->sequence_group, b_symbol->sequence_group);
EQ(a_symbol->sequence_number, b_symbol->sequence_number);
}
#endif // ENABLE_AERIAL
EQ(a->usage, b->usage);
const uint8_t nUsage = __builtin_popcount(a->usage);
for (int idx = 0; idx < nUsage; ++idx) {
EQ(a->report_type[idx], b->report_type[idx]);
}
EQ(a->singular_Value_representation, b->singular_Value_representation);
EQ(a->iq_representation, b->iq_representation);
EQ(a->prg_size, b->prg_size);
EQ(a->num_total_ue_antennas, b->num_total_ue_antennas);
EQ(a->ue_antennas_in_this_srs_resource_set, b->ue_antennas_in_this_srs_resource_set);
EQ(a->sampled_ue_antennas, b->sampled_ue_antennas);
EQ(a->report_scope, b->report_scope);
EQ(a->num_ul_spatial_streams_ports, b->num_ul_spatial_streams_ports);
for (int idx = 0; idx < a->num_ul_spatial_streams_ports; ++idx) {
EQ(a->Ul_spatial_stream_ports[idx], b->Ul_spatial_stream_ports[idx]);
}
return true;
}
static bool eq_ul_tti_request_srs_pdu(const nfapi_nr_srs_pdu_t *a, const nfapi_nr_srs_pdu_t *b)
{
EQ(a->rnti, b->rnti);
EQ(a->handle, b->handle);
EQ(a->bwp_size, b->bwp_size);
EQ(a->bwp_start, b->bwp_start);
EQ(a->subcarrier_spacing, b->subcarrier_spacing);
EQ(a->cyclic_prefix, b->cyclic_prefix);
EQ(a->num_ant_ports, b->num_ant_ports);
EQ(a->num_symbols, b->num_symbols);
EQ(a->num_repetitions, b->num_repetitions);
EQ(a->time_start_position, b->time_start_position);
EQ(a->config_index, b->config_index);
EQ(a->sequence_id, b->sequence_id);
EQ(a->bandwidth_index, b->bandwidth_index);
EQ(a->comb_size, b->comb_size);
EQ(a->comb_offset, b->comb_offset);
EQ(a->cyclic_shift, b->cyclic_shift);
EQ(a->frequency_position, b->frequency_position);
EQ(a->frequency_shift, b->frequency_shift);
EQ(a->frequency_hopping, b->frequency_hopping);
EQ(a->group_or_sequence_hopping, b->group_or_sequence_hopping);
EQ(a->resource_type, b->resource_type);
EQ(a->t_srs, b->t_srs);
EQ(a->t_offset, b->t_offset);
EQ(eq_ul_tti_beamforming(&a->beamforming, &b->beamforming), true);
EQ(eq_ul_tti_request_srs_parameters(&a->srs_parameters_v4, 1 << a->num_symbols, &b->srs_parameters_v4), true);
return true;
}
bool eq_ul_tti_request(const nfapi_nr_ul_tti_request_t *a, const nfapi_nr_ul_tti_request_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->n_pdus, b->n_pdus);
EQ(a->rach_present, b->rach_present);
EQ(a->n_ulsch, b->n_ulsch);
EQ(a->n_ulcch, b->n_ulcch);
EQ(a->n_group, b->n_group);
for (int PDU = 0; PDU < a->n_pdus; ++PDU) {
// take the PDU at the start of loops
const nfapi_nr_ul_tti_request_number_of_pdus_t *a_pdu = &a->pdus_list[PDU];
const nfapi_nr_ul_tti_request_number_of_pdus_t *b_pdu = &b->pdus_list[PDU];
EQ(a_pdu->pdu_type, b_pdu->pdu_type);
EQ(a_pdu->pdu_size, b_pdu->pdu_size);
switch (a_pdu->pdu_type) {
case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
EQ(eq_ul_tti_request_prach_pdu(&a_pdu->prach_pdu, &b_pdu->prach_pdu), true);
break;
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
EQ(eq_ul_tti_request_pusch_pdu(&a_pdu->pusch_pdu, &b_pdu->pusch_pdu), true);
break;
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
EQ(eq_ul_tti_request_pucch_pdu(&a_pdu->pucch_pdu, &b_pdu->pucch_pdu), true);
break;
case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
EQ(eq_ul_tti_request_srs_pdu(&a_pdu->srs_pdu, &b_pdu->srs_pdu), true);
break;
default:
// PDU Type is not any known value
return false;
}
}
for (int nGroup = 0; nGroup < a->n_group; ++nGroup) {
EQ(a->groups_list[nGroup].n_ue, b->groups_list[nGroup].n_ue);
for (int UE = 0; UE < a->groups_list[nGroup].n_ue; ++UE) {
EQ(a->groups_list[nGroup].ue_list[UE].pdu_idx, b->groups_list[nGroup].ue_list[UE].pdu_idx);
}
}
return true;
}
bool eq_slot_indication(const nfapi_nr_slot_indication_scf_t *a, const nfapi_nr_slot_indication_scf_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);
return true;
}
bool eq_ul_dci_request_PDU(const nfapi_nr_ul_dci_request_pdus_t *a, const nfapi_nr_ul_dci_request_pdus_t *b)
{
EQ(a->PDUType, b->PDUType);
EQ(a->PDUSize, b->PDUSize);
// Is the same PDU as the DL_TTI.request PDCCH PDU, reuse comparison function
EQ(eq_dl_tti_request_pdcch_pdu(&a->pdcch_pdu.pdcch_pdu_rel15, &b->pdcch_pdu.pdcch_pdu_rel15), true);
return true;
}
bool eq_ul_dci_request(const nfapi_nr_ul_dci_request_t *a, const nfapi_nr_ul_dci_request_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->numPdus, b->numPdus);
for (int pdu_idx = 0; pdu_idx < a->numPdus; ++pdu_idx) {
EQ(eq_ul_dci_request_PDU(&a->ul_dci_pdu_list[pdu_idx], &b->ul_dci_pdu_list[pdu_idx]), true);
}
return true;
}
bool eq_tx_data_request_PDU(const nfapi_nr_pdu_t *a, const nfapi_nr_pdu_t *b)
{
EQ(a->PDU_length, b->PDU_length);
EQ(a->PDU_index, b->PDU_index);
EQ(a->num_TLV, b->num_TLV);
for (int tlv_idx = 0; tlv_idx < a->num_TLV; ++tlv_idx) {
const nfapi_nr_tx_data_request_tlv_t *a_tlv = &a->TLVs[tlv_idx];
const nfapi_nr_tx_data_request_tlv_t *b_tlv = &b->TLVs[tlv_idx];
EQ(a_tlv->tag, b_tlv->tag);
EQ(a_tlv->length, b_tlv->length);
switch (a_tlv->tag) {
case 0:
for (int payload_idx = 0; payload_idx < (a_tlv->length + 3) / 4; ++payload_idx) {
// value.direct
EQ(a_tlv->value.direct[payload_idx], b_tlv->value.direct[payload_idx]);
}
break;
case 1:
for (int payload_idx = 0; payload_idx < (a_tlv->length + 3) / 4; ++payload_idx) {
// value.ptr
EQ(a_tlv->value.ptr[payload_idx], b_tlv->value.ptr[payload_idx]);
}
break;
default:
break;
}
}
return true;
}
bool eq_tx_data_request(const nfapi_nr_tx_data_request_t *a, const nfapi_nr_tx_data_request_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_tx_data_request_PDU(&a->pdu_list[pdu_idx], &b->pdu_list[pdu_idx]), true);
}
return true;
}
bool eq_rx_data_indication_PDU(const nfapi_nr_rx_data_pdu_t *a, const nfapi_nr_rx_data_pdu_t *b)
{
EQ(a->handle, b->handle);
EQ(a->rnti, b->rnti);
EQ(a->harq_id, b->harq_id);
EQ(a->pdu_length, b->pdu_length);
EQ(a->ul_cqi, b->ul_cqi);
EQ(a->timing_advance, b->timing_advance);
EQ(a->rssi, b->rssi);
for (int i = 0; i < a->pdu_length; ++i) {
EQ(a->pdu[i], b->pdu[i]);
}
return true;
}
bool eq_rx_data_indication(const nfapi_nr_rx_data_indication_t *a, const nfapi_nr_rx_data_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_rx_data_indication_PDU(&a->pdu_list[pdu_idx], &b->pdu_list[pdu_idx]), true);
}
return true;
}
bool eq_crc_indication_CRC(const nfapi_nr_crc_t *a, const nfapi_nr_crc_t *b)
{
EQ(a->handle, b->handle);
EQ(a->rnti, b->rnti);
EQ(a->harq_id, b->harq_id);
EQ(a->tb_crc_status, b->tb_crc_status);
EQ(a->num_cb, b->num_cb);
if (a->num_cb > 0) {
for (int cb = 0; cb < (a->num_cb / 8) + 1; ++cb) {
EQ(a->cb_crc_status[cb], b->cb_crc_status[cb]);
}
}
EQ(a->ul_cqi, b->ul_cqi);
EQ(a->timing_advance, b->timing_advance);
EQ(a->rssi, b->rssi);
return true;
}
bool eq_crc_indication(const nfapi_nr_crc_indication_t *a, const nfapi_nr_crc_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_crcs, b->number_crcs);
for (int crc_idx = 0; crc_idx < a->number_crcs; ++crc_idx) {
EQ(eq_crc_indication_CRC(&a->crc_list[crc_idx], &b->crc_list[crc_idx]), true);
}
return true;
}
bool eq_uci_indication_sr_pdu_0_1(const nfapi_nr_sr_pdu_0_1_t *a, const nfapi_nr_sr_pdu_0_1_t *b)
{
EQ(a->sr_indication, b->sr_indication);
EQ(a->sr_confidence_level, b->sr_confidence_level);
return true;
}
bool eq_uci_indication_sr_pdu_2_3_4(const nfapi_nr_sr_pdu_2_3_4_t *a, const nfapi_nr_sr_pdu_2_3_4_t *b)
{
EQ(a->sr_bit_len, b->sr_bit_len);
for (int i = 0; i < (a->sr_bit_len / 8) + 1; ++i) {
EQ(a->sr_payload[i], b->sr_payload[i]);
}
return true;
}
bool eq_uci_indication_harq_pdu_0_1(const nfapi_nr_harq_pdu_0_1_t *a, const nfapi_nr_harq_pdu_0_1_t *b)
{
EQ(a->num_harq, b->num_harq);
EQ(a->harq_confidence_level, b->harq_confidence_level);
for (int i = 0; i < a->num_harq; ++i) {
EQ(a->harq_list[i].harq_value, b->harq_list[i].harq_value);
}
return true;
}
bool eq_uci_indication_harq_pdu_2_3_4(const nfapi_nr_harq_pdu_2_3_4_t *a, const nfapi_nr_harq_pdu_2_3_4_t *b)
{
EQ(a->harq_crc, b->harq_crc);
EQ(a->harq_bit_len, b->harq_bit_len);
for (int i = 0; i < (a->harq_bit_len / 8) + 1; ++i) {
EQ(a->harq_payload[i], b->harq_payload[i]);
}
return true;
}
bool eq_uci_indication_csi_part1(const nfapi_nr_csi_part1_pdu_t *a, const nfapi_nr_csi_part1_pdu_t *b)
{
EQ(a->csi_part1_crc, b->csi_part1_crc);
EQ(a->csi_part1_bit_len, b->csi_part1_bit_len);
for (int i = 0; i < (a->csi_part1_bit_len / 8) + 1; ++i) {
EQ(a->csi_part1_payload[i], b->csi_part1_payload[i]);
}
return true;
}
bool eq_uci_indication_csi_part2(const nfapi_nr_csi_part2_pdu_t *a, const nfapi_nr_csi_part2_pdu_t *b)
{
EQ(a->csi_part2_crc, b->csi_part2_crc);
EQ(a->csi_part2_bit_len, b->csi_part2_bit_len);
for (int i = 0; i < (a->csi_part2_bit_len / 8) + 1; ++i) {
EQ(a->csi_part2_payload[i], b->csi_part2_payload[i]);
}
return true;
}
bool eq_uci_indication_PUSCH(const nfapi_nr_uci_pusch_pdu_t *a, const nfapi_nr_uci_pusch_pdu_t *b)
{
EQ(a->pduBitmap, b->pduBitmap);
EQ(a->handle, b->handle);
EQ(a->rnti, b->rnti);
EQ(a->ul_cqi, b->ul_cqi);
EQ(a->timing_advance, b->timing_advance);
EQ(a->rssi, b->rssi);
// Bit 0 not used in PUSCH PDU
// HARQ
if ((a->pduBitmap >> 1) & 0x01) {
EQ(eq_uci_indication_harq_pdu_2_3_4(&a->harq, &b->harq), true);
}
// CSI Part 1
if ((a->pduBitmap >> 2) & 0x01) {
EQ(eq_uci_indication_csi_part1(&a->csi_part1, &b->csi_part1), true);
}
// CSI Part 2
if ((a->pduBitmap >> 3) & 0x01) {
EQ(eq_uci_indication_csi_part2(&a->csi_part2, &b->csi_part2), true);
}
return true;
}
bool eq_uci_indication_PUCCH_0_1(const nfapi_nr_uci_pucch_pdu_format_0_1_t *a, const nfapi_nr_uci_pucch_pdu_format_0_1_t *b)
{
EQ(a->pduBitmap, b->pduBitmap);
EQ(a->handle, b->handle);
EQ(a->rnti, b->rnti);
EQ(a->pucch_format, b->pucch_format);
EQ(a->ul_cqi, b->ul_cqi);
EQ(a->timing_advance, b->timing_advance);
EQ(a->rssi, b->rssi);
// SR
if (a->pduBitmap & 0x01) {
EQ(eq_uci_indication_sr_pdu_0_1(&a->sr, &b->sr), true);
}
// HARQ
if ((a->pduBitmap >> 1) & 0x01) {
EQ(eq_uci_indication_harq_pdu_0_1(&a->harq, &b->harq), true);
}
return true;
}
bool eq_uci_indication_PUCCH_2_3_4(const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *a, const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *b)
{
EQ(a->pduBitmap, b->pduBitmap);
EQ(a->handle, b->handle);
EQ(a->rnti, b->rnti);
EQ(a->pucch_format, b->pucch_format);
EQ(a->ul_cqi, b->ul_cqi);
EQ(a->timing_advance, b->timing_advance);
EQ(a->rssi, b->rssi);
// SR
if (a->pduBitmap & 0x01) {
EQ(eq_uci_indication_sr_pdu_2_3_4(&a->sr, &b->sr), true);
}
// HARQ
if ((a->pduBitmap >> 1) & 0x01) {
EQ(eq_uci_indication_harq_pdu_2_3_4(&a->harq, &b->harq), true);
}
// CSI Part 1
if ((a->pduBitmap >> 2) & 0x01) {
EQ(eq_uci_indication_csi_part1(&a->csi_part1, &b->csi_part1), true);
}
// CSI Part 2
if ((a->pduBitmap >> 3) & 0x01) {
EQ(eq_uci_indication_csi_part2(&a->csi_part2, &b->csi_part2), true);
}
return true;
}
bool eq_uci_indication_UCI(const nfapi_nr_uci_t *a, const nfapi_nr_uci_t *b)
{
EQ(a->pdu_type, b->pdu_type);
EQ(a->pdu_size, b->pdu_size);
switch (a->pdu_type) {
case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
EQ(eq_uci_indication_PUSCH(&a->pusch_pdu, &b->pusch_pdu), true);
break;
case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE:
EQ(eq_uci_indication_PUCCH_0_1(&a->pucch_pdu_format_0_1, &b->pucch_pdu_format_0_1), true);
break;
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE:
EQ(eq_uci_indication_PUCCH_2_3_4(&a->pucch_pdu_format_2_3_4, &b->pucch_pdu_format_2_3_4), true);
break;
default:
AssertFatal(1 == 0, "Unknown UCI.indication PDU Type %d\n", a->pdu_type);
break;
}
return true;
}
bool eq_uci_indication(const nfapi_nr_uci_indication_t *a, const nfapi_nr_uci_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->num_ucis, b->num_ucis);
for (int crc_idx = 0; crc_idx < a->num_ucis; ++crc_idx) {
EQ(eq_uci_indication_UCI(&a->uci_list[crc_idx], &b->uci_list[crc_idx]), true);
}
return true;
}
static bool eq_srs_indication_report_tlv(const nfapi_srs_report_tlv_t *a, const nfapi_srs_report_tlv_t *b)
{
EQ(a->tag, b->tag);
EQ(a->length, b->length);
for (int i = 0; i < (a->length + 3) / 4; ++i) {
EQ(a->value[i], b->value[i]);
}
return true;
}
static bool eq_srs_indication_PDU(const nfapi_nr_srs_indication_pdu_t *a, const nfapi_nr_srs_indication_pdu_t *b)
{
EQ(a->handle, b->handle);
EQ(a->rnti, b->rnti);
EQ(a->timing_advance_offset, b->timing_advance_offset);
EQ(a->timing_advance_offset_nsec, b->timing_advance_offset_nsec);
EQ(a->srs_usage, b->srs_usage);
EQ(a->report_type, b->report_type);
EQ(eq_srs_indication_report_tlv(&a->report_tlv, &b->report_tlv), true);
return true;
}
bool eq_srs_indication(const nfapi_nr_srs_indication_t *a, const nfapi_nr_srs_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->control_length, b->control_length);
EQ(a->number_of_pdus, b->number_of_pdus);
for (int pdu_idx = 0; pdu_idx < a->number_of_pdus; ++pdu_idx) {
EQ(eq_srs_indication_PDU(&a->pdu_list[pdu_idx], &b->pdu_list[pdu_idx]), true);
}
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) {
free(msg->vendor_extension);
}
}
void free_ul_tti_request(nfapi_nr_ul_tti_request_t *msg)
{
for (int idx_pdu = 0; idx_pdu < msg->n_pdus; ++idx_pdu) {
nfapi_nr_ul_tti_request_number_of_pdus_t *pdu = &msg->pdus_list[idx_pdu];
switch (pdu->pdu_type) {
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
free(pdu->pusch_pdu.pusch_ptrs.ptrs_ports_list);
break;
default:
break;
}
}
}
void free_slot_indication(nfapi_nr_slot_indication_scf_t *msg)
{
// Nothing to free
}
void free_ul_dci_request(nfapi_nr_ul_dci_request_t *msg)
{
// Nothing to free
}
void free_tx_data_request(nfapi_nr_tx_data_request_t *msg)
{
for (int pdu_idx = 0; pdu_idx < msg->Number_of_PDUs; ++pdu_idx) {
nfapi_nr_pdu_t *pdu = &msg->pdu_list[pdu_idx];
for (int tlv_idx = 0; tlv_idx < pdu->num_TLV; ++tlv_idx) {
nfapi_nr_tx_data_request_tlv_t *tlv = &pdu->TLVs[tlv_idx];
if (tlv->tag == 1) {
// value.ptr
free(tlv->value.ptr);
}
}
}
}
void free_rx_data_indication(nfapi_nr_rx_data_indication_t *msg)
{
if (msg->number_of_pdus > 0) {
for (int pdu_idx = 0; pdu_idx < msg->number_of_pdus; ++pdu_idx) {
nfapi_nr_rx_data_pdu_t *rx_pdu = &msg->pdu_list[pdu_idx];
if (rx_pdu->pdu) {
free(rx_pdu->pdu);
}
}
free(msg->pdu_list);
}
}
void free_crc_indication(nfapi_nr_crc_indication_t *msg)
{
if (msg->crc_list) {
for (int crc_idx = 0; crc_idx < msg->number_crcs; ++crc_idx) {
nfapi_nr_crc_t *crc = &msg->crc_list[crc_idx];
if (crc->cb_crc_status) {
free(crc->cb_crc_status);
}
}
free(msg->crc_list);
}
}
void free_uci_indication(nfapi_nr_uci_indication_t *msg)
{
if (msg->uci_list) {
for (int pdu_idx = 0; pdu_idx < msg->num_ucis; ++pdu_idx) {
nfapi_nr_uci_t *uci_pdu = &msg->uci_list[pdu_idx];
switch (uci_pdu->pdu_type) {
case NFAPI_NR_UCI_PUSCH_PDU_TYPE: {
nfapi_nr_uci_pusch_pdu_t *pdu = &uci_pdu->pusch_pdu;
// Bit 0 not used in PUSCH PDU
// HARQ
if ((pdu->pduBitmap >> 1) & 0x01) {
if (pdu->harq.harq_payload) {
free(pdu->harq.harq_payload);
}
}
// CSI Part 1
if ((pdu->pduBitmap >> 2) & 0x01) {
if (pdu->csi_part1.csi_part1_payload) {
free(pdu->csi_part1.csi_part1_payload);
}
}
// CSI Part 2
if ((pdu->pduBitmap >> 3) & 0x01) {
if (pdu->csi_part2.csi_part2_payload) {
free(pdu->csi_part2.csi_part2_payload);
}
}
break;
}
case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
// Nothing to free
break;
}
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu = &uci_pdu->pucch_pdu_format_2_3_4;
// SR
if (pdu->pduBitmap & 0x01) {
if (pdu->sr.sr_payload) {
free(pdu->sr.sr_payload);
}
}
// HARQ
if ((pdu->pduBitmap >> 1) & 0x01) {
if (pdu->harq.harq_payload) {
free(pdu->harq.harq_payload);
}
}
// CSI Part 1
if ((pdu->pduBitmap >> 2) & 0x01) {
if (pdu->csi_part1.csi_part1_payload) {
free(pdu->csi_part1.csi_part1_payload);
}
}
// CSI Part 2
if ((pdu->pduBitmap >> 3) & 0x01) {
if (pdu->csi_part2.csi_part2_payload) {
free(pdu->csi_part2.csi_part2_payload);
}
}
break;
}
default:
AssertFatal(1 == 0, "Unknown UCI.indication PDU Type %d\n", uci_pdu->pdu_type);
break;
}
}
free(msg->uci_list);
}
}
void free_srs_indication(nfapi_nr_srs_indication_t *msg)
{
if (msg->pdu_list) {
free(msg->pdu_list);
}
}
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)
{
dst->num_prgs = src->num_prgs;
dst->prg_size = src->prg_size;
dst->dig_bf_interfaces = src->dig_bf_interfaces;
for (int prg = 0; prg < dst->num_prgs; ++prg) {
dst->prgs_list[prg].pm_idx = src->prgs_list[prg].pm_idx;
for (int dbf_if = 0; dbf_if < dst->dig_bf_interfaces; ++dbf_if) {
dst->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx = src->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx;
}
}
}
static void copy_dl_tti_request_pdcch_pdu(const nfapi_nr_dl_tti_pdcch_pdu_rel15_t *src, nfapi_nr_dl_tti_pdcch_pdu_rel15_t *dst)
{
dst->BWPSize = src->BWPSize;
dst->BWPStart = src->BWPStart;
dst->SubcarrierSpacing = src->SubcarrierSpacing;
dst->CyclicPrefix = src->CyclicPrefix;
dst->StartSymbolIndex = src->StartSymbolIndex;
dst->DurationSymbols = src->DurationSymbols;
for (int fdr_idx = 0; fdr_idx < 6; ++fdr_idx) {
dst->FreqDomainResource[fdr_idx] = src->FreqDomainResource[fdr_idx];
}
dst->CceRegMappingType = src->CceRegMappingType;
dst->RegBundleSize = src->RegBundleSize;
dst->InterleaverSize = src->InterleaverSize;
dst->CoreSetType = src->CoreSetType;
dst->ShiftIndex = src->ShiftIndex;
dst->precoderGranularity = src->precoderGranularity;
dst->numDlDci = src->numDlDci;
for (int dl_dci = 0; dl_dci < dst->numDlDci; ++dl_dci) {
nfapi_nr_dl_dci_pdu_t *dst_dci_pdu = &dst->dci_pdu[dl_dci];
const nfapi_nr_dl_dci_pdu_t *src_dci_pdu = &src->dci_pdu[dl_dci];
dst_dci_pdu->RNTI = src_dci_pdu->RNTI;
dst_dci_pdu->ScramblingId = src_dci_pdu->ScramblingId;
dst_dci_pdu->ScramblingRNTI = src_dci_pdu->ScramblingRNTI;
dst_dci_pdu->CceIndex = src_dci_pdu->CceIndex;
dst_dci_pdu->AggregationLevel = src_dci_pdu->AggregationLevel;
copy_dl_tti_beamforming(&src_dci_pdu->precodingAndBeamforming, &dst_dci_pdu->precodingAndBeamforming);
dst_dci_pdu->beta_PDCCH_1_0 = src_dci_pdu->beta_PDCCH_1_0;
dst_dci_pdu->powerControlOffsetSS = src_dci_pdu->powerControlOffsetSS;
dst_dci_pdu->PayloadSizeBits = src_dci_pdu->PayloadSizeBits;
for (int i = 0; i < 8; ++i) {
dst_dci_pdu->Payload[i] = src_dci_pdu->Payload[i];
}
}
}
static void copy_dl_tti_request_pdsch_pdu(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t *dst)
{
dst->pduBitmap = src->pduBitmap;
dst->rnti = src->rnti;
dst->pduIndex = src->pduIndex;
dst->BWPSize = src->BWPSize;
dst->BWPStart = src->BWPStart;
dst->SubcarrierSpacing = src->SubcarrierSpacing;
dst->CyclicPrefix = src->CyclicPrefix;
dst->NrOfCodewords = src->NrOfCodewords;
for (int cw = 0; cw < dst->NrOfCodewords; ++cw) {
dst->targetCodeRate[cw] = src->targetCodeRate[cw];
dst->qamModOrder[cw] = src->qamModOrder[cw];
dst->mcsIndex[cw] = src->mcsIndex[cw];
dst->mcsTable[cw] = src->mcsTable[cw];
dst->rvIndex[cw] = src->rvIndex[cw];
dst->TBSize[cw] = src->TBSize[cw];
}
dst->dataScramblingId = src->dataScramblingId;
dst->nrOfLayers = src->nrOfLayers;
dst->transmissionScheme = src->transmissionScheme;
dst->refPoint = src->refPoint;
dst->dlDmrsSymbPos = src->dlDmrsSymbPos;
dst->dmrsConfigType = src->dmrsConfigType;
dst->dlDmrsScramblingId = src->dlDmrsScramblingId;
dst->SCID = src->SCID;
dst->numDmrsCdmGrpsNoData = src->numDmrsCdmGrpsNoData;
dst->dmrsPorts = src->dmrsPorts;
dst->resourceAlloc = src->resourceAlloc;
for (int i = 0; i < 36; ++i) {
dst->rbBitmap[i] = src->rbBitmap[i];
}
dst->rbStart = src->rbStart;
dst->rbSize = src->rbSize;
dst->VRBtoPRBMapping = src->VRBtoPRBMapping;
dst->StartSymbolIndex = src->StartSymbolIndex;
dst->NrOfSymbols = src->NrOfSymbols;
dst->PTRSPortIndex = src->PTRSPortIndex;
dst->PTRSTimeDensity = src->PTRSTimeDensity;
dst->PTRSFreqDensity = src->PTRSFreqDensity;
dst->PTRSReOffset = src->PTRSReOffset;
dst->nEpreRatioOfPDSCHToPTRS = src->nEpreRatioOfPDSCHToPTRS;
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
dst->powerControlOffset = src->powerControlOffset;
dst->powerControlOffsetSS = src->powerControlOffsetSS;
dst->isLastCbPresent = src->isLastCbPresent;
dst->isInlineTbCrc = src->isInlineTbCrc;
dst->dlTbCrc = src->dlTbCrc;
dst->maintenance_parms_v3.ldpcBaseGraph = src->maintenance_parms_v3.ldpcBaseGraph;
dst->maintenance_parms_v3.tbSizeLbrmBytes = src->maintenance_parms_v3.tbSizeLbrmBytes;
}
static void copy_dl_tti_request_csi_rs_pdu(const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *src, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *dst)
{
dst->bwp_size = src->bwp_size;
dst->bwp_start = src->bwp_start;
dst->subcarrier_spacing = src->subcarrier_spacing;
dst->cyclic_prefix = src->cyclic_prefix;
dst->start_rb = src->start_rb;
dst->nr_of_rbs = src->nr_of_rbs;
dst->csi_type = src->csi_type;
dst->row = src->row;
dst->freq_domain = src->freq_domain;
dst->symb_l0 = src->symb_l0;
dst->symb_l1 = src->symb_l1;
dst->cdm_type = src->cdm_type;
dst->freq_density = src->freq_density;
dst->scramb_id = src->scramb_id;
dst->power_control_offset = src->power_control_offset;
dst->power_control_offset_ss = src->power_control_offset_ss;
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
}
static void copy_dl_tti_request_ssb_pdu(const nfapi_nr_dl_tti_ssb_pdu_rel15_t *src, nfapi_nr_dl_tti_ssb_pdu_rel15_t *dst)
{
dst->PhysCellId = src->PhysCellId;
dst->BetaPss = src->BetaPss;
dst->SsbBlockIndex = src->SsbBlockIndex;
dst->SsbSubcarrierOffset = src->SsbSubcarrierOffset;
dst->ssbOffsetPointA = src->ssbOffsetPointA;
dst->bchPayloadFlag = src->bchPayloadFlag;
dst->bchPayload = src->bchPayload;
dst->ssbRsrp = src->ssbRsrp;
copy_dl_tti_beamforming(&src->precoding_and_beamforming, &dst->precoding_and_beamforming);
}
static void copy_dl_tti_request_pdu(const nfapi_nr_dl_tti_request_pdu_t *src, nfapi_nr_dl_tti_request_pdu_t *dst)
{
dst->PDUType = src->PDUType;
dst->PDUSize = src->PDUSize;
switch (dst->PDUType) {
case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
copy_dl_tti_request_pdcch_pdu(&src->pdcch_pdu.pdcch_pdu_rel15, &dst->pdcch_pdu.pdcch_pdu_rel15);
break;
case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
copy_dl_tti_request_pdsch_pdu(&src->pdsch_pdu.pdsch_pdu_rel15, &dst->pdsch_pdu.pdsch_pdu_rel15);
break;
case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
copy_dl_tti_request_csi_rs_pdu(&src->csi_rs_pdu.csi_rs_pdu_rel15, &dst->csi_rs_pdu.csi_rs_pdu_rel15);
break;
case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
copy_dl_tti_request_ssb_pdu(&src->ssb_pdu.ssb_pdu_rel15, &dst->ssb_pdu.ssb_pdu_rel15);
break;
default:
// PDU Type is not any known value
AssertFatal(1 == 0, "PDU Type value unknown, allowed values range from 0 to 3\n");
}
}
void copy_dl_tti_request(const nfapi_nr_dl_tti_request_t *src, nfapi_nr_dl_tti_request_t *dst)
{
dst->header.message_id = src->header.message_id;
dst->header.message_length = src->header.message_length;
if (src->vendor_extension) {
dst->vendor_extension = calloc(1, sizeof(nfapi_vendor_extension_tlv_t));
dst->vendor_extension->tag = src->vendor_extension->tag;
dst->vendor_extension->length = src->vendor_extension->length;
copy_vendor_extension_value(&dst->vendor_extension, &src->vendor_extension);
}
dst->SFN = src->SFN;
dst->Slot = src->Slot;
dst->dl_tti_request_body.nPDUs = src->dl_tti_request_body.nPDUs;
dst->dl_tti_request_body.nGroup = src->dl_tti_request_body.nGroup;
for (int pdu = 0; pdu < dst->dl_tti_request_body.nPDUs; ++pdu) {
copy_dl_tti_request_pdu(&src->dl_tti_request_body.dl_tti_pdu_list[pdu], &dst->dl_tti_request_body.dl_tti_pdu_list[pdu]);
}
if (dst->dl_tti_request_body.nGroup > 0) {
for (int nGroup = 0; nGroup < dst->dl_tti_request_body.nGroup; ++nGroup) {
dst->dl_tti_request_body.nUe[nGroup] = src->dl_tti_request_body.nUe[nGroup];
for (int UE = 0; UE < dst->dl_tti_request_body.nUe[nGroup]; ++UE) {
dst->dl_tti_request_body.PduIdx[nGroup][UE] = src->dl_tti_request_body.PduIdx[nGroup][UE];
}
}
}
}
static void copy_ul_tti_beamforming(const nfapi_nr_ul_beamforming_t *src, nfapi_nr_ul_beamforming_t *dst)
{
dst->trp_scheme = src->trp_scheme;
dst->num_prgs = src->num_prgs;
dst->prg_size = src->prg_size;
dst->dig_bf_interface = src->dig_bf_interface;
for (int prg = 0; prg < dst->num_prgs; ++prg) {
if (dst->dig_bf_interface > 0) {
for (int dbf_if = 0; dbf_if < dst->dig_bf_interface; ++dbf_if) {
dst->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx = src->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx;
}
}
}
}
static void copy_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *src, nfapi_nr_prach_pdu_t *dst)
{
dst->phys_cell_id = src->phys_cell_id;
dst->num_prach_ocas = src->num_prach_ocas;
dst->prach_format = src->prach_format;
dst->num_ra = src->num_ra;
dst->prach_start_symbol = src->prach_start_symbol;
dst->num_cs = src->num_cs;
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
}
static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi_nr_pusch_pdu_t *dst)
{
dst->pdu_bit_map = src->pdu_bit_map;
dst->rnti = src->rnti;
dst->handle = src->handle;
dst->bwp_size = src->bwp_size;
dst->bwp_start = src->bwp_start;
dst->subcarrier_spacing = src->subcarrier_spacing;
dst->cyclic_prefix = src->cyclic_prefix;
dst->target_code_rate = src->target_code_rate;
dst->qam_mod_order = src->qam_mod_order;
dst->mcs_index = src->mcs_index;
dst->mcs_table = src->mcs_table;
dst->transform_precoding = src->transform_precoding;
dst->data_scrambling_id = src->data_scrambling_id;
dst->nrOfLayers = src->nrOfLayers;
dst->ul_dmrs_symb_pos = src->ul_dmrs_symb_pos;
dst->dmrs_config_type = src->dmrs_config_type;
dst->ul_dmrs_scrambling_id = src->ul_dmrs_scrambling_id;
dst->pusch_identity = src->pusch_identity;
dst->scid = src->scid;
dst->num_dmrs_cdm_grps_no_data = src->num_dmrs_cdm_grps_no_data;
dst->dmrs_ports = src->dmrs_ports;
dst->resource_alloc = src->resource_alloc;
for (int i = 0; i < 36; ++i) {
dst->rb_bitmap[i] = src->rb_bitmap[i];
}
dst->rb_start = src->rb_start;
dst->rb_size = src->rb_size;
dst->vrb_to_prb_mapping = src->vrb_to_prb_mapping;
dst->frequency_hopping = src->frequency_hopping;
dst->tx_direct_current_location = src->tx_direct_current_location;
dst->uplink_frequency_shift_7p5khz = src->uplink_frequency_shift_7p5khz;
dst->start_symbol_index = src->start_symbol_index;
dst->nr_of_symbols = src->nr_of_symbols;
if (dst->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA) {
const nfapi_nr_pusch_data_t *src_pusch_data = &src->pusch_data;
nfapi_nr_pusch_data_t *dst_pusch_data = &dst->pusch_data;
dst_pusch_data->rv_index = src_pusch_data->rv_index;
dst_pusch_data->harq_process_id = src_pusch_data->harq_process_id;
dst_pusch_data->new_data_indicator = src_pusch_data->new_data_indicator;
dst_pusch_data->tb_size = src_pusch_data->tb_size;
dst_pusch_data->num_cb = src_pusch_data->num_cb;
for (int i = 0; i < (src_pusch_data->num_cb + 7) / 8; ++i) {
dst_pusch_data->cb_present_and_position[i] = src_pusch_data->cb_present_and_position[i];
}
}
if (src->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI) {
const nfapi_nr_pusch_uci_t *src_pusch_uci = &src->pusch_uci;
nfapi_nr_pusch_uci_t *dst_pusch_uci = &dst->pusch_uci;
dst_pusch_uci->harq_ack_bit_length = src_pusch_uci->harq_ack_bit_length;
dst_pusch_uci->csi_part1_bit_length = src_pusch_uci->csi_part1_bit_length;
dst_pusch_uci->csi_part2_bit_length = src_pusch_uci->csi_part2_bit_length;
dst_pusch_uci->alpha_scaling = src_pusch_uci->alpha_scaling;
dst_pusch_uci->beta_offset_harq_ack = src_pusch_uci->beta_offset_harq_ack;
dst_pusch_uci->beta_offset_csi1 = src_pusch_uci->beta_offset_csi1;
dst_pusch_uci->beta_offset_csi2 = src_pusch_uci->beta_offset_csi2;
}
if (src->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
const nfapi_nr_pusch_ptrs_t *src_pusch_ptrs = &src->pusch_ptrs;
nfapi_nr_pusch_ptrs_t *dst_pusch_ptrs = &dst->pusch_ptrs;
dst_pusch_ptrs->num_ptrs_ports = src_pusch_ptrs->num_ptrs_ports;
dst_pusch_ptrs->ptrs_ports_list = calloc(dst_pusch_ptrs->num_ptrs_ports, sizeof(nfapi_nr_ptrs_ports_t));
for (int i = 0; i < src_pusch_ptrs->num_ptrs_ports; ++i) {
const nfapi_nr_ptrs_ports_t *src_ptrs_port = &src_pusch_ptrs->ptrs_ports_list[i];
nfapi_nr_ptrs_ports_t *dst_ptrs_port = &dst_pusch_ptrs->ptrs_ports_list[i];
dst_ptrs_port->ptrs_port_index = src_ptrs_port->ptrs_port_index;
dst_ptrs_port->ptrs_dmrs_port = src_ptrs_port->ptrs_dmrs_port;
dst_ptrs_port->ptrs_re_offset = src_ptrs_port->ptrs_re_offset;
}
dst_pusch_ptrs->ptrs_time_density = src_pusch_ptrs->ptrs_time_density;
dst_pusch_ptrs->ptrs_freq_density = src_pusch_ptrs->ptrs_freq_density;
dst_pusch_ptrs->ul_ptrs_power = src_pusch_ptrs->ul_ptrs_power;
}
if (src->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM) {
const nfapi_nr_dfts_ofdm_t *src_dfts_ofdm = &src->dfts_ofdm;
nfapi_nr_dfts_ofdm_t *dst_dfts_ofdm = &dst->dfts_ofdm;
dst_dfts_ofdm->low_papr_group_number = src_dfts_ofdm->low_papr_group_number;
dst_dfts_ofdm->low_papr_sequence_number = src_dfts_ofdm->low_papr_sequence_number;
dst_dfts_ofdm->ul_ptrs_sample_density = src_dfts_ofdm->ul_ptrs_sample_density;
dst_dfts_ofdm->ul_ptrs_time_density_transform_precoding = src_dfts_ofdm->ul_ptrs_time_density_transform_precoding;
}
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
dst->maintenance_parms_v3.ldpcBaseGraph = src->maintenance_parms_v3.ldpcBaseGraph;
dst->maintenance_parms_v3.tbSizeLbrmBytes = src->maintenance_parms_v3.tbSizeLbrmBytes;
}
static void copy_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *src, nfapi_nr_pucch_pdu_t *dst)
{
dst->rnti = src->rnti;
dst->handle = src->handle;
dst->bwp_size = src->bwp_size;
dst->bwp_start = src->bwp_start;
dst->subcarrier_spacing = src->subcarrier_spacing;
dst->cyclic_prefix = src->cyclic_prefix;
dst->format_type = src->format_type;
dst->multi_slot_tx_indicator = src->multi_slot_tx_indicator;
dst->pi_2bpsk = src->pi_2bpsk;
dst->prb_start = src->prb_start;
dst->prb_size = src->prb_size;
dst->start_symbol_index = src->start_symbol_index;
dst->nr_of_symbols = src->nr_of_symbols;
dst->freq_hop_flag = src->freq_hop_flag;
dst->second_hop_prb = src->second_hop_prb;
dst->group_hop_flag = src->group_hop_flag;
dst->sequence_hop_flag = src->sequence_hop_flag;
dst->hopping_id = src->hopping_id;
dst->initial_cyclic_shift = src->initial_cyclic_shift;
dst->data_scrambling_id = src->data_scrambling_id;
dst->time_domain_occ_idx = src->time_domain_occ_idx;
dst->pre_dft_occ_idx = src->pre_dft_occ_idx;
dst->pre_dft_occ_len = src->pre_dft_occ_len;
dst->add_dmrs_flag = src->add_dmrs_flag;
dst->dmrs_scrambling_id = src->dmrs_scrambling_id;
dst->dmrs_cyclic_shift = src->dmrs_cyclic_shift;
dst->sr_flag = src->sr_flag;
dst->bit_len_harq = src->bit_len_harq;
dst->bit_len_csi_part1 = src->bit_len_csi_part1;
dst->bit_len_csi_part2 = src->bit_len_csi_part2;
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
}
static void copy_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *src,
const uint8_t num_symbols,
nfapi_v4_srs_parameters_t *dst)
{
dst->srs_bandwidth_size = src->srs_bandwidth_size;
for (int symbol_idx = 0; symbol_idx < num_symbols; ++symbol_idx) {
nfapi_v4_srs_parameters_symbols_t *dst_symbol = &dst->symbol_list[symbol_idx];
const nfapi_v4_srs_parameters_symbols_t *src_symbol = &src->symbol_list[symbol_idx];
dst_symbol->srs_bandwidth_start = src_symbol->srs_bandwidth_start;
dst_symbol->sequence_group = src_symbol->sequence_group;
dst_symbol->sequence_number = src_symbol->sequence_number;
}
#ifdef ENABLE_AERIAL
// For Aerial, we always process the 4 reported symbols, not only the ones indicated by num_symbols
for (int symbol_idx = num_symbols; symbol_idx < 4; ++symbol_idx) {
nfapi_v4_srs_parameters_symbols_t *dst_symbol = &dst->symbol_list[symbol_idx];
const nfapi_v4_srs_parameters_symbols_t *src_symbol = &src->symbol_list[symbol_idx];
dst_symbol->srs_bandwidth_start = src_symbol->srs_bandwidth_start;
dst_symbol->sequence_group = src_symbol->sequence_group;
dst_symbol->sequence_number = src_symbol->sequence_number;
}
#endif // ENABLE_AERIAL
dst->usage = src->usage;
const uint8_t nUsage = __builtin_popcount(dst->usage);
for (int idx = 0; idx < nUsage; ++idx) {
dst->report_type[idx] = src->report_type[idx];
}
dst->singular_Value_representation = src->singular_Value_representation;
dst->iq_representation = src->iq_representation;
dst->prg_size = src->prg_size;
dst->num_total_ue_antennas = src->num_total_ue_antennas;
dst->ue_antennas_in_this_srs_resource_set = src->ue_antennas_in_this_srs_resource_set;
dst->sampled_ue_antennas = src->sampled_ue_antennas;
dst->report_scope = src->report_scope;
dst->num_ul_spatial_streams_ports = src->num_ul_spatial_streams_ports;
for (int idx = 0; idx < dst->num_ul_spatial_streams_ports; ++idx) {
dst->Ul_spatial_stream_ports[idx] = src->Ul_spatial_stream_ports[idx];
}
}
static void copy_ul_tti_request_srs_pdu(const nfapi_nr_srs_pdu_t *src, nfapi_nr_srs_pdu_t *dst)
{
dst->rnti = src->rnti;
dst->handle = src->handle;
dst->bwp_size = src->bwp_size;
dst->bwp_start = src->bwp_start;
dst->subcarrier_spacing = src->subcarrier_spacing;
dst->cyclic_prefix = src->cyclic_prefix;
dst->num_ant_ports = src->num_ant_ports;
dst->num_symbols = src->num_symbols;
dst->num_repetitions = src->num_repetitions;
dst->time_start_position = src->time_start_position;
dst->config_index = src->config_index;
dst->sequence_id = src->sequence_id;
dst->bandwidth_index = src->bandwidth_index;
dst->comb_size = src->comb_size;
dst->comb_offset = src->comb_offset;
dst->cyclic_shift = src->cyclic_shift;
dst->frequency_position = src->frequency_position;
dst->frequency_shift = src->frequency_shift;
dst->frequency_hopping = src->frequency_hopping;
dst->group_or_sequence_hopping = src->group_or_sequence_hopping;
dst->resource_type = src->resource_type;
dst->t_srs = src->t_srs;
dst->t_offset = src->t_offset;
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
copy_ul_tti_request_srs_parameters(&src->srs_parameters_v4, 1 << src->num_symbols, &dst->srs_parameters_v4);
}
void copy_ul_tti_request(const nfapi_nr_ul_tti_request_t *src, nfapi_nr_ul_tti_request_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->n_pdus = src->n_pdus;
dst->rach_present = src->rach_present;
dst->n_ulsch = src->n_ulsch;
dst->n_ulcch = src->n_ulcch;
dst->n_group = src->n_group;
for (int PDU = 0; PDU < src->n_pdus; ++PDU) {
// take the PDU at the start of loops
const nfapi_nr_ul_tti_request_number_of_pdus_t *src_pdu = &src->pdus_list[PDU];
nfapi_nr_ul_tti_request_number_of_pdus_t *dst_pdu = &dst->pdus_list[PDU];
dst_pdu->pdu_type = src_pdu->pdu_type;
dst_pdu->pdu_size = src_pdu->pdu_size;
switch (src_pdu->pdu_type) {
case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
copy_ul_tti_request_prach_pdu(&src_pdu->prach_pdu, &dst_pdu->prach_pdu);
break;
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
copy_ul_tti_request_pusch_pdu(&src_pdu->pusch_pdu, &dst_pdu->pusch_pdu);
break;
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
copy_ul_tti_request_pucch_pdu(&src_pdu->pucch_pdu, &dst_pdu->pucch_pdu);
break;
case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
copy_ul_tti_request_srs_pdu(&src_pdu->srs_pdu, &dst_pdu->srs_pdu);
break;
default:
// PDU Type is not any known value
AssertFatal(1 == 0, "PDU Type value unknown, allowed values range from 0 to 3\n");
}
}
for (int nGroup = 0; nGroup < src->n_group; ++nGroup) {
dst->groups_list[nGroup].n_ue = src->groups_list[nGroup].n_ue;
for (int UE = 0; UE < src->groups_list[nGroup].n_ue; ++UE) {
dst->groups_list[nGroup].ue_list[UE].pdu_idx = src->groups_list[nGroup].ue_list[UE].pdu_idx;
}
}
}
void copy_slot_indication(const nfapi_nr_slot_indication_scf_t *src, nfapi_nr_slot_indication_scf_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;
}
void copy_ul_dci_request_pdu(const nfapi_nr_ul_dci_request_pdus_t *src, nfapi_nr_ul_dci_request_pdus_t *dst)
{
dst->PDUType = src->PDUType;
dst->PDUSize = src->PDUSize;
// Is the same PDU as the DL_TTI.request PDCCH PDU, reuse copy function
copy_dl_tti_request_pdcch_pdu(&src->pdcch_pdu.pdcch_pdu_rel15, &dst->pdcch_pdu.pdcch_pdu_rel15);
}
void copy_ul_dci_request(const nfapi_nr_ul_dci_request_t *src, nfapi_nr_ul_dci_request_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->numPdus = src->numPdus;
for (int pdu_idx = 0; pdu_idx < src->numPdus; ++pdu_idx) {
copy_ul_dci_request_pdu(&src->ul_dci_pdu_list[pdu_idx], &dst->ul_dci_pdu_list[pdu_idx]);
}
}
void copy_tx_data_request_PDU(const nfapi_nr_pdu_t *src, nfapi_nr_pdu_t *dst)
{
dst->PDU_length = src->PDU_length;
dst->PDU_index = src->PDU_index;
dst->num_TLV = src->num_TLV;
for (int tlv_idx = 0; tlv_idx < src->num_TLV; ++tlv_idx) {
const nfapi_nr_tx_data_request_tlv_t *src_tlv = &src->TLVs[tlv_idx];
nfapi_nr_tx_data_request_tlv_t *dst_tlv = &dst->TLVs[tlv_idx];
dst_tlv->tag = src_tlv->tag;
dst_tlv->length = src_tlv->length;
switch (src_tlv->tag) {
case 0:
// value.direct
memcpy(dst_tlv->value.direct, src_tlv->value.direct, sizeof(src_tlv->value.direct));
break;
case 1:
// value.ptr
dst_tlv->value.ptr = calloc((src_tlv->length + 3) / 4, sizeof(uint32_t));
memcpy(dst_tlv->value.ptr, src_tlv->value.ptr, src_tlv->length);
break;
default:
AssertFatal(1 == 0, "TX_DATA request TLV tag value unsupported");
break;
}
}
}
void copy_tx_data_request(const nfapi_nr_tx_data_request_t *src, nfapi_nr_tx_data_request_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;
for (int pdu_idx = 0; pdu_idx < src->Number_of_PDUs; ++pdu_idx) {
copy_tx_data_request_PDU(&src->pdu_list[pdu_idx], &dst->pdu_list[pdu_idx]);
}
}
size_t get_tx_data_request_size(const nfapi_nr_tx_data_request_t *msg)
{
// Get size of the whole message ( allocated pointer included )
size_t total_size = sizeof(msg->header);
total_size += sizeof(msg->SFN);
total_size += sizeof(msg->Slot);
total_size += sizeof(msg->Number_of_PDUs);
for (int pdu_idx = 0; pdu_idx < msg->Number_of_PDUs; ++pdu_idx) {
const nfapi_nr_pdu_t *pdu = &msg->pdu_list[pdu_idx];
total_size += sizeof(pdu->PDU_length);
total_size += sizeof(pdu->PDU_index);
total_size += sizeof(pdu->num_TLV);
for (int tlv_idx = 0; tlv_idx < pdu->num_TLV; ++tlv_idx) {
const nfapi_nr_tx_data_request_tlv_t *tlv = &pdu->TLVs[tlv_idx];
total_size += sizeof(tlv->tag);
total_size += sizeof(tlv->length);
if (tlv->tag == 0) {
total_size += sizeof(tlv->value.direct);
} else {
total_size += (tlv->length + 3) / 4 * sizeof(uint32_t);
}
}
}
return total_size;
}
void copy_rx_data_indication_PDU(const nfapi_nr_rx_data_pdu_t *src, nfapi_nr_rx_data_pdu_t *dst)
{
dst->handle = src->handle;
dst->rnti = src->rnti;
dst->harq_id = src->harq_id;
dst->pdu_length = src->pdu_length;
dst->ul_cqi = src->ul_cqi;
dst->timing_advance = src->timing_advance;
dst->rssi = src->rssi;
dst->pdu = calloc(dst->pdu_length, sizeof(uint8_t));
memcpy(dst->pdu, src->pdu, src->pdu_length);
}
void copy_rx_data_indication(const nfapi_nr_rx_data_indication_t *src, nfapi_nr_rx_data_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 < src->number_of_pdus; ++pdu_idx) {
copy_rx_data_indication_PDU(&src->pdu_list[pdu_idx], &dst->pdu_list[pdu_idx]);
}
}
size_t get_rx_data_indication_size(const nfapi_nr_rx_data_indication_t *msg)
{
// Get size of the whole message ( allocated pointer included )
size_t total_size = sizeof(msg->header);
total_size += sizeof(msg->sfn);
total_size += sizeof(msg->slot);
total_size += sizeof(msg->number_of_pdus);
for (int pdu_idx = 0; pdu_idx < msg->number_of_pdus; ++pdu_idx) {
const nfapi_nr_rx_data_pdu_t *pdu = &msg->pdu_list[pdu_idx];
total_size += sizeof(pdu->handle);
total_size += sizeof(pdu->rnti);
total_size += sizeof(pdu->harq_id);
total_size += sizeof(pdu->pdu_length);
total_size += sizeof(pdu->ul_cqi);
total_size += sizeof(pdu->timing_advance);
total_size += sizeof(pdu->rssi);
total_size += pdu->pdu_length;
}
return total_size;
}
void copy_crc_indication_CRC(const nfapi_nr_crc_t *src, nfapi_nr_crc_t *dst)
{
dst->handle = src->handle;
dst->rnti = src->rnti;
dst->harq_id = src->harq_id;
dst->tb_crc_status = src->tb_crc_status;
dst->num_cb = src->num_cb;
if (dst->num_cb > 0) {
const uint16_t cb_len = (dst->num_cb / 8) + 1;
dst->cb_crc_status = calloc(cb_len, sizeof(uint8_t));
for (int cb = 0; cb < cb_len; ++cb) {
dst->cb_crc_status[cb] = src->cb_crc_status[cb];
}
}
dst->ul_cqi = src->ul_cqi;
dst->timing_advance = src->timing_advance;
dst->rssi = src->rssi;
}
void copy_crc_indication(const nfapi_nr_crc_indication_t *src, nfapi_nr_crc_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_crcs = src->number_crcs;
dst->crc_list = calloc(dst->number_crcs, sizeof(*dst->crc_list));
for (int crc_idx = 0; crc_idx < src->number_crcs; ++crc_idx) {
copy_crc_indication_CRC(&src->crc_list[crc_idx], &dst->crc_list[crc_idx]);
}
}
size_t get_crc_indication_size(const nfapi_nr_crc_indication_t *msg)
{
// Get size of the whole message ( allocated pointer included )
size_t total_size = sizeof(msg->header);
total_size += sizeof(msg->sfn);
total_size += sizeof(msg->slot);
total_size += sizeof(msg->number_crcs);
for (int crc_idx = 0; crc_idx < msg->number_crcs; ++crc_idx) {
const nfapi_nr_crc_t *crc = &msg->crc_list[crc_idx];
total_size += sizeof(crc->handle);
total_size += sizeof(crc->rnti);
total_size += sizeof(crc->harq_id);
total_size += sizeof(crc->tb_crc_status);
total_size += sizeof(crc->num_cb);
if (crc->num_cb > 0) {
total_size += crc->num_cb / 8 + 1;
}
total_size += sizeof(crc->ul_cqi);
total_size += sizeof(crc->timing_advance);
total_size += sizeof(crc->rssi);
}
return total_size;
}
void copy_uci_indication_sr_pdu_0_1(const nfapi_nr_sr_pdu_0_1_t *src, nfapi_nr_sr_pdu_0_1_t *dst)
{
dst->sr_indication = src->sr_indication;
dst->sr_confidence_level = src->sr_confidence_level;
}
void copy_uci_indication_sr_pdu_2_3_4(const nfapi_nr_sr_pdu_2_3_4_t *src, nfapi_nr_sr_pdu_2_3_4_t *dst)
{
dst->sr_bit_len = src->sr_bit_len;
const uint16_t sr_len = (dst->sr_bit_len / 8) + 1;
dst->sr_payload = calloc(sr_len, sizeof(*dst->sr_payload));
for (int i = 0; i < sr_len; ++i) {
dst->sr_payload[i] = src->sr_payload[i];
}
}
void copy_uci_indication_harq_pdu_0_1(const nfapi_nr_harq_pdu_0_1_t *src, nfapi_nr_harq_pdu_0_1_t *dst)
{
dst->num_harq = src->num_harq;
dst->harq_confidence_level = src->harq_confidence_level;
for (int i = 0; i < dst->num_harq; ++i) {
dst->harq_list[i].harq_value = src->harq_list[i].harq_value;
}
}
void copy_uci_indication_harq_pdu_2_3_4(const nfapi_nr_harq_pdu_2_3_4_t *src, nfapi_nr_harq_pdu_2_3_4_t *dst)
{
dst->harq_crc = src->harq_crc;
dst->harq_bit_len = src->harq_bit_len;
const uint16_t harq_length = (dst->harq_bit_len / 8) + 1;
dst->harq_payload = calloc(harq_length, sizeof(*dst->harq_payload));
for (int i = 0; i < harq_length; ++i) {
dst->harq_payload[i] = src->harq_payload[i];
}
}
void copy_uci_indication_csi_part1(const nfapi_nr_csi_part1_pdu_t *src, nfapi_nr_csi_part1_pdu_t *dst)
{
dst->csi_part1_crc = src->csi_part1_crc;
dst->csi_part1_bit_len = src->csi_part1_bit_len;
const uint16_t payload_length = (dst->csi_part1_bit_len / 8) + 1;
dst->csi_part1_payload = calloc(payload_length, sizeof(*dst->csi_part1_payload));
for (int i = 0; i < payload_length; ++i) {
dst->csi_part1_payload[i] = src->csi_part1_payload[i];
}
}
void copy_uci_indication_csi_part2(const nfapi_nr_csi_part2_pdu_t *src, nfapi_nr_csi_part2_pdu_t *dst)
{
dst->csi_part2_crc = src->csi_part2_crc;
dst->csi_part2_bit_len = src->csi_part2_bit_len;
const uint16_t payload_length = (dst->csi_part2_bit_len / 8) + 1;
dst->csi_part2_payload = calloc(payload_length, sizeof(*dst->csi_part2_payload));
for (int i = 0; i < payload_length; ++i) {
dst->csi_part2_payload[i] = src->csi_part2_payload[i];
}
}
void copy_uci_indication_PUSCH(const nfapi_nr_uci_pusch_pdu_t *src, nfapi_nr_uci_pusch_pdu_t *dst)
{
dst->pduBitmap = src->pduBitmap;
dst->handle = src->handle;
dst->rnti = src->rnti;
dst->ul_cqi = src->ul_cqi;
dst->timing_advance = src->timing_advance;
dst->rssi = src->rssi;
// Bit 0 not used in PUSCH PDU
// HARQ
if ((dst->pduBitmap >> 1) & 0x01) {
copy_uci_indication_harq_pdu_2_3_4(&src->harq, &dst->harq);
}
// CSI Part 1
if ((dst->pduBitmap >> 2) & 0x01) {
copy_uci_indication_csi_part1(&src->csi_part1, &dst->csi_part1);
}
// CSI Part 2
if ((dst->pduBitmap >> 3) & 0x01) {
copy_uci_indication_csi_part2(&src->csi_part2, &dst->csi_part2);
}
}
void copy_uci_indication_PUCCH_0_1(const nfapi_nr_uci_pucch_pdu_format_0_1_t *src, nfapi_nr_uci_pucch_pdu_format_0_1_t *dst)
{
dst->pduBitmap = src->pduBitmap;
dst->handle = src->handle;
dst->rnti = src->rnti;
dst->pucch_format = src->pucch_format;
dst->ul_cqi = src->ul_cqi;
dst->timing_advance = src->timing_advance;
dst->rssi = src->rssi;
// SR
if (dst->pduBitmap & 0x01) {
copy_uci_indication_sr_pdu_0_1(&src->sr, &dst->sr);
}
// HARQ
if ((dst->pduBitmap >> 1) & 0x01) {
copy_uci_indication_harq_pdu_0_1(&src->harq, &dst->harq);
}
}
void copy_uci_indication_PUCCH_2_3_4(const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *src, nfapi_nr_uci_pucch_pdu_format_2_3_4_t *dst)
{
dst->pduBitmap = src->pduBitmap;
dst->handle = src->handle;
dst->rnti = src->rnti;
dst->pucch_format = src->pucch_format;
dst->ul_cqi = src->ul_cqi;
dst->timing_advance = src->timing_advance;
dst->rssi = src->rssi;
// SR
if (dst->pduBitmap & 0x01) {
copy_uci_indication_sr_pdu_2_3_4(&src->sr, &dst->sr);
}
// HARQ
if ((dst->pduBitmap >> 1) & 0x01) {
copy_uci_indication_harq_pdu_2_3_4(&src->harq, &dst->harq);
}
// CSI Part 1
if ((dst->pduBitmap >> 2) & 0x01) {
copy_uci_indication_csi_part1(&src->csi_part1, &dst->csi_part1);
}
// CSI Part 2
if ((dst->pduBitmap >> 3) & 0x01) {
copy_uci_indication_csi_part2(&src->csi_part2, &dst->csi_part2);
}
}
void copy_uci_indication_UCI(const nfapi_nr_uci_t *src, nfapi_nr_uci_t *dst)
{
dst->pdu_type = src->pdu_type;
dst->pdu_size = src->pdu_size;
switch (dst->pdu_type) {
case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
copy_uci_indication_PUSCH(&src->pusch_pdu, &dst->pusch_pdu);
break;
case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE:
copy_uci_indication_PUCCH_0_1(&src->pucch_pdu_format_0_1, &dst->pucch_pdu_format_0_1);
break;
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE:
copy_uci_indication_PUCCH_2_3_4(&src->pucch_pdu_format_2_3_4, &dst->pucch_pdu_format_2_3_4);
break;
default:
AssertFatal(1 == 0, "Unknown UCI.indication PDU Type %d\n", src->pdu_type);
break;
}
}
void copy_uci_indication(const nfapi_nr_uci_indication_t *src, nfapi_nr_uci_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->num_ucis = src->num_ucis;
dst->uci_list = calloc(dst->num_ucis, sizeof(*dst->uci_list));
for (int crc_idx = 0; crc_idx < src->num_ucis; ++crc_idx) {
copy_uci_indication_UCI(&src->uci_list[crc_idx], &dst->uci_list[crc_idx]);
}
}
size_t get_uci_indication_size(const nfapi_nr_uci_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->num_ucis);
// Loop through each UCI in the uci_list
for (int uci_idx = 0; uci_idx < msg->num_ucis; ++uci_idx) {
const nfapi_nr_uci_t *uci_pdu = &msg->uci_list[uci_idx];
total_size += sizeof(uci_pdu->pdu_type);
total_size += sizeof(uci_pdu->pdu_size);
switch (uci_pdu->pdu_type) {
case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
total_size += sizeof(uci_pdu->pusch_pdu);
// HARQ payload, CSI Part 1 and 2 are conditionally allocated
if ((uci_pdu->pusch_pdu.pduBitmap >> 1) & 0x01) {
total_size += uci_pdu->pusch_pdu.harq.harq_bit_len / 8 + 1;
}
if ((uci_pdu->pusch_pdu.pduBitmap >> 2) & 0x01) {
total_size += uci_pdu->pusch_pdu.csi_part1.csi_part1_bit_len / 8 + 1;
}
if ((uci_pdu->pusch_pdu.pduBitmap >> 3) & 0x01) {
total_size += uci_pdu->pusch_pdu.csi_part2.csi_part2_bit_len / 8 + 1;
}
break;
case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE:
total_size += sizeof(uci_pdu->pucch_pdu_format_0_1);
// SR and HARQ are conditionally filled, but neither require calloc inside
break;
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE:
total_size += sizeof(uci_pdu->pucch_pdu_format_2_3_4);
// SR, HARQ, CSI Part 1, and CSI Part 2 are conditionally allocated
if (uci_pdu->pucch_pdu_format_2_3_4.pduBitmap & 0x01) {
total_size += uci_pdu->pucch_pdu_format_2_3_4.sr.sr_bit_len / 8 + 1;
}
if ((uci_pdu->pucch_pdu_format_2_3_4.pduBitmap >> 1) & 0x01) {
total_size += uci_pdu->pucch_pdu_format_2_3_4.harq.harq_bit_len / 8 + 1;
}
if ((uci_pdu->pucch_pdu_format_2_3_4.pduBitmap >> 2) & 0x01) {
total_size += uci_pdu->pucch_pdu_format_2_3_4.csi_part1.csi_part1_bit_len / 8 + 1;
}
if ((uci_pdu->pucch_pdu_format_2_3_4.pduBitmap >> 3) & 0x01) {
total_size += uci_pdu->pucch_pdu_format_2_3_4.csi_part2.csi_part2_bit_len / 8 + 1;
}
break;
default:
AssertFatal(1 == 0, "Unknown UCI.indication PDU Type %d\n", uci_pdu->pdu_type);
break;
}
}
// Finally, add the size of the uci_list pointer itself
total_size += msg->num_ucis * sizeof(*msg->uci_list);
return total_size;
}
void copy_srs_indication_report_tlv(const nfapi_srs_report_tlv_t *src, nfapi_srs_report_tlv_t *dst)
{
dst->tag = src->tag;
dst->length = src->length;
for (int i = 0; i < (dst->length + 3) / 4; ++i) {
dst->value[i] = src->value[i];
}
}
void copy_srs_indication_PDU(const nfapi_nr_srs_indication_pdu_t *src, nfapi_nr_srs_indication_pdu_t *dst)
{
dst->handle = src->handle;
dst->rnti = src->rnti;
dst->timing_advance_offset = src->timing_advance_offset;
dst->timing_advance_offset_nsec = src->timing_advance_offset_nsec;
dst->srs_usage = src->srs_usage;
dst->report_type = src->report_type;
copy_srs_indication_report_tlv(&src->report_tlv, &dst->report_tlv);
}
void copy_srs_indication(const nfapi_nr_srs_indication_t *src, nfapi_nr_srs_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->control_length = src->control_length;
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 < src->number_of_pdus; ++pdu_idx) {
copy_srs_indication_PDU(&src->pdu_list[pdu_idx], &dst->pdu_list[pdu_idx]);
}
}
size_t get_srs_indication_size(const nfapi_nr_srs_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->control_length);
total_size += sizeof(msg->number_of_pdus);
total_size += msg->number_of_pdus * sizeof(*msg->pdu_list);
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;
}
static void dump_p7_message_header(const nfapi_nr_p7_message_header_t *hdr, int depth)
{
INDENTED_PRINTF("Message ID = 0x%02x\n", hdr->message_id);
INDENTED_PRINTF("Message Length = 0x%02x\n", hdr->message_length);
}
static void dump_dl_beamforming_pdu(const nfapi_nr_tx_precoding_and_beamforming_t *pdu, int depth)
{
INDENTED_PRINTF("numPRGs = %d\n", pdu->num_prgs);
INDENTED_PRINTF("prgSize = %d\n", pdu->prg_size);
INDENTED_PRINTF("digBFInterfaces = %d\n", pdu->dig_bf_interfaces);
depth++;
for (int i = 0; i < pdu->num_prgs; ++i) {
INDENTED_PRINTF("PMIdx = %d\n", pdu->prgs_list[i].pm_idx);
depth++;
for (int j = 0; j < pdu->dig_bf_interfaces; ++j) {
INDENTED_PRINTF("beamIDX = %d\n", pdu->prgs_list[i].dig_bf_interface_list[j].beam_idx);
}
depth--;
}
}
static void dump_dl_dci_pdu(const nfapi_nr_dl_dci_pdu_t *pdu, int depth)
{
INDENTED_PRINTF("RNTI = 0x%x\n", pdu->RNTI);
INDENTED_PRINTF("ScramblingId = %d\n", pdu->ScramblingId);
INDENTED_PRINTF("ScramblingRNTI = 0x%x\n", pdu->ScramblingRNTI);
INDENTED_PRINTF("CCEIndex = %d\n", pdu->CceIndex);
INDENTED_PRINTF("AggregationLevel = %d\n", pdu->AggregationLevel);
dump_dl_beamforming_pdu(&pdu->precodingAndBeamforming, depth + 1);
INDENTED_PRINTF("beta_PDCCH_1_0 = %d\n", pdu->beta_PDCCH_1_0);
INDENTED_PRINTF("powerControlOffsetSS = %d\n", pdu->powerControlOffsetSS);
INDENTED_PRINTF("PayloadSizeBits = %d\n", pdu->PayloadSizeBits);
INDENTED_PRINTF("Payload = ");
for (int i = 0; i < (pdu->PayloadSizeBits + 7) / 8; ++i) {
printf("0x%02x ", pdu->Payload[i]);
}
printf("\n");
}
static void dump_dl_tti_request_PDCCH_PDU(const nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdu, int depth)
{
INDENTED_PRINTF("BWPSize = %d\n", pdu->BWPSize);
INDENTED_PRINTF("BWPStart = %d\n", pdu->BWPStart);
INDENTED_PRINTF("Subcarrier Spacing = %d\n", pdu->SubcarrierSpacing);
INDENTED_PRINTF("Ciclic Prefix = %d\n", pdu->CyclicPrefix);
INDENTED_PRINTF("StartSymbolIndex = %d\n", pdu->StartSymbolIndex);
INDENTED_PRINTF("DurationSymbols = %d\n", pdu->DurationSymbols);
INDENTED_PRINTF("FrequencyDomainResource : ");
for (int i = 0; i < 6; ++i) {
printf("%d ", pdu->FreqDomainResource[i]);
}
printf("\n");
INDENTED_PRINTF("CCE Reg Mapping Type = %d\n", pdu->CceRegMappingType);
INDENTED_PRINTF("Reg Bundle Size = %d\n", pdu->RegBundleSize);
INDENTED_PRINTF("Interleaver Size = %d\n", pdu->InterleaverSize);
INDENTED_PRINTF("CoreSetType = %d\n", pdu->CoreSetType);
INDENTED_PRINTF("ShiftIndex = %d\n", pdu->ShiftIndex);
INDENTED_PRINTF("precoderGranularity = %d\n", pdu->precoderGranularity);
INDENTED_PRINTF("numDLDCI = %d\n", pdu->numDlDci);
for (int i = 0; i < pdu->numDlDci; ++i) {
dump_dl_dci_pdu(&pdu->dci_pdu[i], depth + 1);
}
}
static void dump_dl_tti_request_PDSCH_PDU(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu, int depth)
{
INDENTED_PRINTF("pduBitmap = %d\n", pdu->pduBitmap);
INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
INDENTED_PRINTF("pduIndex = %d\n", pdu->pduIndex);
INDENTED_PRINTF("BWPSize = %d\n", pdu->BWPSize);
INDENTED_PRINTF("BWPStart = %d\n", pdu->BWPStart);
INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->SubcarrierSpacing);
INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->CyclicPrefix);
INDENTED_PRINTF("NrOfCodewords = %d\n", pdu->NrOfCodewords);
for (int i = 0; i < pdu->NrOfCodewords; ++i) {
depth++;
INDENTED_PRINTF("Codeword #%d\n", i);
depth++;
INDENTED_PRINTF("targetCoderate = %d\n", pdu->targetCodeRate[i]);
INDENTED_PRINTF("qamModOrder = %d\n", pdu->qamModOrder[i]);
INDENTED_PRINTF("mcsIndex = %d\n", pdu->mcsIndex[i]);
INDENTED_PRINTF("mcsTable = %d\n", pdu->mcsTable[i]);
INDENTED_PRINTF("rvIndex = %d\n", pdu->rvIndex[i]);
INDENTED_PRINTF("TBSize = %d\n", pdu->TBSize[i]);
depth--;
depth--;
}
INDENTED_PRINTF("dataScramblingId = %d\n", pdu->dataScramblingId);
INDENTED_PRINTF("nrOfLayers = %d\n", pdu->nrOfLayers);
INDENTED_PRINTF("transmissionScheme = %d\n", pdu->transmissionScheme);
INDENTED_PRINTF("refPoint = %d\n", pdu->refPoint);
INDENTED_PRINTF("dlDmrsSymbPos = %d\n", pdu->dlDmrsSymbPos);
INDENTED_PRINTF("dmrsConfigType = %d\n", pdu->dmrsConfigType);
INDENTED_PRINTF("dlDmrsScramblingId = %d\n", pdu->dlDmrsScramblingId);
INDENTED_PRINTF("SCID = %d\n", pdu->SCID);
INDENTED_PRINTF("numDmrsCdmGrpsNoData = %d\n", pdu->numDmrsCdmGrpsNoData);
INDENTED_PRINTF("dmrsPorts = %d\n", pdu->dmrsPorts);
INDENTED_PRINTF("resourceAlloc = %d\n", pdu->resourceAlloc);
INDENTED_PRINTF("rbBitmap = ");
for (int i = 0; i < 36; ++i) {
printf("%d ", pdu->rbBitmap[i]);
}
printf("\n");
INDENTED_PRINTF("rbStart = %d\n", pdu->rbStart);
INDENTED_PRINTF("rbSize = %d\n", pdu->rbSize);
INDENTED_PRINTF("VRBtoPRBMapping = %d\n", pdu->VRBtoPRBMapping);
INDENTED_PRINTF("StartSymbolIndex = %d\n", pdu->StartSymbolIndex);
INDENTED_PRINTF("NrOfSymbols = %d\n", pdu->NrOfSymbols);
INDENTED_PRINTF("PTRSPortIndex = %d\n", pdu->PTRSPortIndex);
INDENTED_PRINTF("PTRSTimeDensity = %d\n", pdu->PTRSTimeDensity);
INDENTED_PRINTF("PTRSFreqDensity = %d\n", pdu->PTRSFreqDensity);
INDENTED_PRINTF("PTRSReOffset = %d\n", pdu->PTRSReOffset);
INDENTED_PRINTF("nEpreRatioOfPDSCHToPTRS = %d\n", pdu->nEpreRatioOfPDSCHToPTRS);
dump_dl_beamforming_pdu(&pdu->precodingAndBeamforming, depth + 1);
INDENTED_PRINTF("powerControlOffset = %d\n", pdu->powerControlOffset);
INDENTED_PRINTF("powerControlOffsetSS = %d\n", pdu->powerControlOffsetSS);
INDENTED_PRINTF("isLastCbPresent = %d\n", pdu->isLastCbPresent);
INDENTED_PRINTF("isInlineTbCrc = %d\n", pdu->isInlineTbCrc);
INDENTED_PRINTF("dlTbCrc = %d\n", pdu->dlTbCrc);
}
static void dump_dl_tti_request_CSI_RS_PDU(const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *pdu, int depth)
{
INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
INDENTED_PRINTF("StartRB = %d\n", pdu->start_rb);
INDENTED_PRINTF("NrOfRBs = %d\n", pdu->nr_of_rbs);
INDENTED_PRINTF("CSIType = %d\n", pdu->csi_type);
INDENTED_PRINTF("Row = %d\n", pdu->row);
INDENTED_PRINTF("FreqDomain = %d\n", pdu->freq_domain);
INDENTED_PRINTF("SymbL0 = %d\n", pdu->symb_l0);
INDENTED_PRINTF("SymbL1 = %d\n", pdu->symb_l1);
INDENTED_PRINTF("CDMType = %d\n", pdu->cdm_type);
INDENTED_PRINTF("FreqDensity = %d\n", pdu->freq_density);
INDENTED_PRINTF("ScrambId = %d\n", pdu->scramb_id);
INDENTED_PRINTF("powerControllOffset = %d\n", pdu->power_control_offset);
INDENTED_PRINTF("powerControllOffsetSS = %d\n", pdu->power_control_offset_ss);
dump_dl_beamforming_pdu(&pdu->precodingAndBeamforming, depth + 1);
}
static void dump_dl_tti_request_SSB_PDU(const nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu, int depth)
{
INDENTED_PRINTF("physCellId = %d\n", pdu->PhysCellId);
INDENTED_PRINTF("BetaPss = %d\n", pdu->BetaPss);
INDENTED_PRINTF("SSBBlockIndex = %d\n", pdu->SsbBlockIndex);
INDENTED_PRINTF("SSBSubcarrierOffset = %d\n", pdu->SsbSubcarrierOffset);
INDENTED_PRINTF("SSBOffsetPointA = %d\n", pdu->ssbOffsetPointA);
INDENTED_PRINTF("bchPayloadFlag = %d\n", pdu->bchPayloadFlag);
INDENTED_PRINTF("bchPayload = %x\n", pdu->bchPayload);
dump_dl_beamforming_pdu(&pdu->precoding_and_beamforming, depth + 1);
}
static char *dl_tti_pdu_type_to_str(uint16_t pdu_type)
{
switch (pdu_type) {
case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
return "NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE";
case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
return "NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE";
case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
return "NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE";
case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
return "NFAPI_NR_DL_TTI_SSB_PDU_TYPE";
default:
return "Unknown";
break;
}
}
void dump_dl_tti_request(const nfapi_nr_dl_tti_request_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->SFN);
INDENTED_PRINTF("Slot = %d\n", msg->Slot);
INDENTED_PRINTF("nPDUs = %d\n", msg->dl_tti_request_body.nPDUs);
INDENTED_PRINTF("nGroup = %d\n", msg->dl_tti_request_body.nGroup);
for (int i = 0; i < msg->dl_tti_request_body.nPDUs; ++i) {
const nfapi_nr_dl_tti_request_pdu_t *pdu = &msg->dl_tti_request_body.dl_tti_pdu_list[i];
depth++;
INDENTED_PRINTF("PDU #%d\n", i);
INDENTED_PRINTF("PDUType = 0x%02x (%s)\n", pdu->PDUType, dl_tti_pdu_type_to_str(pdu->PDUType));
INDENTED_PRINTF("PDUSize = 0x%02x\n", pdu->PDUSize);
/* call to dump_dl_tti_request_<PDU_Type>_pdu */
switch (pdu->PDUType) {
case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
dump_dl_tti_request_PDCCH_PDU(&pdu->pdcch_pdu.pdcch_pdu_rel15, depth + 1);
break;
case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
dump_dl_tti_request_PDSCH_PDU(&pdu->pdsch_pdu.pdsch_pdu_rel15, depth + 1);
break;
case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
dump_dl_tti_request_CSI_RS_PDU(&pdu->csi_rs_pdu.csi_rs_pdu_rel15, depth + 1);
break;
case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
dump_dl_tti_request_SSB_PDU(&pdu->ssb_pdu.ssb_pdu_rel15, depth + 1);
break;
default:
INDENTED_PRINTF("Unknown PDU type 0x%02x\n", pdu->PDUType);
break;
}
depth--;
}
for (int group_idx = 0; group_idx < msg->dl_tti_request_body.nGroup; group_idx++) {
depth++;
INDENTED_PRINTF("Group #%d\n", group_idx);
INDENTED_PRINTF("nUe[%d] = 0x%02x\n", group_idx, msg->dl_tti_request_body.nUe[group_idx]);
for (int ue_idx = 0; ue_idx < msg->dl_tti_request_body.nUe[group_idx]; ue_idx++) {
depth++;
INDENTED_PRINTF("UE #%d\n", ue_idx);
INDENTED_PRINTF("PduIdx[%d][%d] = 0x%02x\n", group_idx, ue_idx, msg->dl_tti_request_body.PduIdx[group_idx][ue_idx]);
depth--;
}
depth--;
}
}
static void dump_ul_tti_beamforming(const nfapi_nr_ul_beamforming_t *pdu, int depth)
{
INDENTED_PRINTF("TRP Scheme = %d\n", pdu->trp_scheme);
INDENTED_PRINTF("numPRGs = %d\n", pdu->num_prgs);
INDENTED_PRINTF("prgSize = %d\n", pdu->prg_size);
INDENTED_PRINTF("digBFInterface = %d\n", pdu->dig_bf_interface);
for (int prg = 0; prg < pdu->num_prgs; ++prg) {
INDENTED_PRINTF("PRG #%d \n", prg);
depth++;
for (int dbf_if = 0; dbf_if < pdu->dig_bf_interface; ++dbf_if) {
INDENTED_PRINTF("digBFInterface #%d \n", dbf_if);
depth++;
INDENTED_PRINTF("beamIdx = %d\n", pdu->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx);
depth--;
}
depth--;
}
}
static char *ul_tti_prach_format_to_str(int prach_format)
{
switch (prach_format) {
case 0:
return "0";
case 1:
return "1";
case 2:
return "2";
case 3:
return "3";
case 4:
return "A1";
case 5:
return "A2";
case 6:
return "A3";
case 7:
return "B1";
case 8:
return "B4";
case 9:
return "C0";
case 10:
return "C2";
case 11:
return "A1/B1";
case 12:
return "A2/B2";
case 13:
return "A3/B3";
default:
return "Unknown";
}
}
static void dump_ul_tti_request_PRACH_PDU(const nfapi_nr_prach_pdu_t *pdu, int depth)
{
INDENTED_PRINTF("physCellID = %d\n", pdu->phys_cell_id);
INDENTED_PRINTF("NumPrachOcas = %d\n", pdu->num_prach_ocas);
INDENTED_PRINTF("prachFormat = %d (%s)\n", pdu->prach_format, ul_tti_prach_format_to_str(pdu->prach_format));
INDENTED_PRINTF("numRa = %d\n", pdu->num_ra);
INDENTED_PRINTF("prachStartSymbol = %d\n", pdu->prach_start_symbol);
INDENTED_PRINTF("numCs = %d\n", pdu->num_cs);
dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
}
static void dump_ul_tti_request_PUSCH_PDU(const nfapi_nr_pusch_pdu_t *pdu, int depth)
{
INDENTED_PRINTF("pduBitmap = %d\n", pdu->pdu_bit_map);
INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
INDENTED_PRINTF("Handle = %d\n", pdu->handle);
INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
INDENTED_PRINTF("targetCodeRate = %d\n", pdu->target_code_rate);
INDENTED_PRINTF("qamModOrder = %d\n", pdu->qam_mod_order);
INDENTED_PRINTF("mcsIndex = %d\n", pdu->mcs_index);
INDENTED_PRINTF("mcsTable = %d\n", pdu->mcs_table);
INDENTED_PRINTF("TransformPrecoding = %d\n", pdu->transform_precoding);
INDENTED_PRINTF("dataScramblingId = %d\n", pdu->data_scrambling_id);
INDENTED_PRINTF("nrOfLayers = %d\n", pdu->nrOfLayers);
INDENTED_PRINTF("ulDmrsSymbPos = %d\n", pdu->ul_dmrs_symb_pos);
INDENTED_PRINTF("dmrsConfigType = %d\n", pdu->dmrs_config_type);
INDENTED_PRINTF("ulDmrsScramblingId = %d\n", pdu->ul_dmrs_scrambling_id);
INDENTED_PRINTF("puschIdentity = %d\n", pdu->pusch_identity);
INDENTED_PRINTF("SCID = %d\n", pdu->scid);
INDENTED_PRINTF("numDmrsCdmGrpsNoData = %d\n", pdu->num_dmrs_cdm_grps_no_data);
INDENTED_PRINTF("dmrsPorts = %d\n", pdu->dmrs_ports);
INDENTED_PRINTF("resourceAlloc = %d\n", pdu->resource_alloc);
INDENTED_PRINTF("rbBitmap = ");
for (int i = 0; i < 36; ++i) {
printf("%d ", pdu->rb_bitmap[i]);
}
printf("\n");
INDENTED_PRINTF("rbStart = %d\n", pdu->rb_start);
INDENTED_PRINTF("rbSize = %d\n", pdu->rb_size);
INDENTED_PRINTF("VRBtoPRBMapping = %d\n", pdu->vrb_to_prb_mapping);
INDENTED_PRINTF("FrequencyHopping = %d\n", pdu->frequency_hopping);
INDENTED_PRINTF("txDirectCurrentLocation = %d\n", pdu->tx_direct_current_location);
INDENTED_PRINTF("uplinkFrequencyShift7p5khz = %d\n", pdu->uplink_frequency_shift_7p5khz);
INDENTED_PRINTF("NrOfSymbols = %d\n", pdu->nr_of_symbols);
INDENTED_PRINTF("puschData (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA ? "included" : "not included");
if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA) {
depth++;
INDENTED_PRINTF("rvIndex = %d\n", pdu->pusch_data.rv_index);
INDENTED_PRINTF("harqProcessID = %d\n", pdu->pusch_data.harq_process_id);
INDENTED_PRINTF("newDataIndicator = %d\n", pdu->pusch_data.new_data_indicator);
INDENTED_PRINTF("TBSize = %d\n", pdu->pusch_data.tb_size);
INDENTED_PRINTF("numCB = %d\n", pdu->pusch_data.num_cb);
INDENTED_PRINTF("cbPresentAndPosition = ");
for (int i = 0; i < (pdu->pusch_data.num_cb + 7) / 8; i++) {
printf("%d ", pdu->pusch_data.cb_present_and_position[i]);
}
printf("\n");
depth--;
}
INDENTED_PRINTF("puschUci (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI ? "included" : "not included");
if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI) {
depth++;
INDENTED_PRINTF("harqAckBitLength = %d\n", pdu->pusch_uci.harq_ack_bit_length);
INDENTED_PRINTF("csiPart1BitLength = %d\n", pdu->pusch_uci.csi_part1_bit_length);
INDENTED_PRINTF("csiPart2BitLength = %d\n", pdu->pusch_uci.csi_part2_bit_length);
INDENTED_PRINTF("AlphaScaling = %d\n", pdu->pusch_uci.alpha_scaling);
INDENTED_PRINTF("betaOffsetHarqAck = %d\n", pdu->pusch_uci.beta_offset_harq_ack);
INDENTED_PRINTF("betaOffsetCsi1 = %d\n", pdu->pusch_uci.beta_offset_csi1);
INDENTED_PRINTF("betaOffsetCsi2 = %d\n", pdu->pusch_uci.beta_offset_csi2);
depth--;
}
INDENTED_PRINTF("puschPtrs (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS ? "included" : "not included");
if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
depth++;
INDENTED_PRINTF("lowPaprGroupNumber = %d\n", pdu->pusch_ptrs.num_ptrs_ports);
for (int i = 0; i < pdu->pusch_ptrs.num_ptrs_ports; ++i) {
INDENTED_PRINTF("ptrsPort #%d\n", i);
depth++;
INDENTED_PRINTF("PTRSPortIndex = %d\n", pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_port_index);
INDENTED_PRINTF("PTRSDmrsPort = %d\n", pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_dmrs_port);
INDENTED_PRINTF("PTRSReOffset = %d\n", pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_re_offset);
depth--;
}
INDENTED_PRINTF("PTRSTimeDensity = %d\n", pdu->pusch_ptrs.ptrs_time_density);
INDENTED_PRINTF("PTRSFreqDensity = %d\n", pdu->pusch_ptrs.ptrs_freq_density);
INDENTED_PRINTF("ulPTRSPower = %d\n", pdu->pusch_ptrs.ul_ptrs_power);
depth--;
}
INDENTED_PRINTF("dtfsOfdm (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM ? "included" : "not included");
if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM) {
depth++;
INDENTED_PRINTF("lowPaprGroupNumber = %d\n", pdu->dfts_ofdm.low_papr_group_number);
INDENTED_PRINTF("lowPaprSequenceNumber = %d\n", pdu->dfts_ofdm.low_papr_sequence_number);
INDENTED_PRINTF("ulPtrsSampleDensity = %d\n", pdu->dfts_ofdm.ul_ptrs_sample_density);
INDENTED_PRINTF("ulPtrsTimeDensityTransformPrecoding = %d\n", pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding);
depth--;
}
dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
}
static void dump_ul_tti_request_PUCCH_PDU(const nfapi_nr_pucch_pdu_t *pdu, int depth)
{
INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
INDENTED_PRINTF("Handle = %d\n", pdu->handle);
INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
INDENTED_PRINTF("FormatType = %d\n", pdu->format_type);
INDENTED_PRINTF("multiSlotTxIndicator = %d\n", pdu->multi_slot_tx_indicator);
INDENTED_PRINTF("pi2Bpsk = %d\n", pdu->pi_2bpsk);
INDENTED_PRINTF("prbStart = %d\n", pdu->prb_start);
INDENTED_PRINTF("prbSize = %d\n", pdu->prb_size);
INDENTED_PRINTF("StartSymbolIndex = %d\n", pdu->start_symbol_index);
INDENTED_PRINTF("NrOfSymbols = %d\n", pdu->nr_of_symbols);
INDENTED_PRINTF("freqHopFlag = %d\n", pdu->freq_hop_flag);
INDENTED_PRINTF("secondHopPRB = %d\n", pdu->second_hop_prb);
INDENTED_PRINTF("groupHopFlag = %d\n", pdu->group_hop_flag);
INDENTED_PRINTF("sequenceHopFlag = %d\n", pdu->sequence_hop_flag);
INDENTED_PRINTF("hoppingId = %d\n", pdu->hopping_id);
INDENTED_PRINTF("InitialCyclicShift = %d\n", pdu->initial_cyclic_shift);
INDENTED_PRINTF("dataScramblingId = %d\n", pdu->data_scrambling_id);
INDENTED_PRINTF("TimeDomainOccIdx = %d\n", pdu->time_domain_occ_idx);
INDENTED_PRINTF("PreDftOccIdx = %d\n", pdu->pre_dft_occ_idx);
INDENTED_PRINTF("PreDftOccLen = %d\n", pdu->pre_dft_occ_len);
INDENTED_PRINTF("AddDmrsFlag = %d\n", pdu->add_dmrs_flag);
INDENTED_PRINTF("DmrsScramblingId = %d\n", pdu->dmrs_scrambling_id);
INDENTED_PRINTF("DMRScyclicshift = %d\n", pdu->dmrs_cyclic_shift);
INDENTED_PRINTF("SRFlag = %d\n", pdu->sr_flag);
INDENTED_PRINTF("BitLenHarq = %d\n", pdu->bit_len_harq);
INDENTED_PRINTF("BitLenCsiPart1 = %d\n", pdu->bit_len_csi_part1);
INDENTED_PRINTF("BitLenCsiPart2 = %d\n", pdu->bit_len_csi_part2);
dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
}
static void dump_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *pdu, const uint8_t num_symbols, uint8_t depth)
{
INDENTED_PRINTF("srsBandwidthSize = %d\n", pdu->srs_bandwidth_size);
for (int symbol_idx = 0; symbol_idx < num_symbols; ++symbol_idx) {
const nfapi_v4_srs_parameters_symbols_t *symbol = &pdu->symbol_list[symbol_idx];
INDENTED_PRINTF("Symbol #%d\n", symbol_idx);
depth++;
INDENTED_PRINTF("srsBandwidthStart = %d\n", symbol->srs_bandwidth_start);
INDENTED_PRINTF("sequenceGroup = %d\n", symbol->sequence_group);
INDENTED_PRINTF("sequenceNumber = %d\n", symbol->sequence_number);
depth--;
}
const uint8_t nUsage = __builtin_popcount(pdu->usage);
INDENTED_PRINTF("Usage = %d (nUsage = %d)\n", pdu->usage, nUsage);
depth++;
for (int idx = 0; idx < nUsage; ++idx) {
INDENTED_PRINTF("ReportType[%d] = %d\n", idx, pdu->report_type[idx]);
}
depth--;
INDENTED_PRINTF("singular Value Representation = %d\n", pdu->singular_Value_representation);
INDENTED_PRINTF("iq Representation = %d\n", pdu->iq_representation);
INDENTED_PRINTF("prgSize = %d\n", pdu->prg_size);
INDENTED_PRINTF("numTotalUeAntennas = %d\n", pdu->num_total_ue_antennas);
INDENTED_PRINTF("ueAntennasInThisSrsResourceSet = %d\n", pdu->ue_antennas_in_this_srs_resource_set);
INDENTED_PRINTF("sampledUeAntennas = %d\n", pdu->sampled_ue_antennas);
INDENTED_PRINTF("reportScope = %d\n", pdu->report_scope);
INDENTED_PRINTF("NumULSpatialStreamsPorts = %d\n", pdu->num_ul_spatial_streams_ports);
depth++;
for (int idx = 0; idx < pdu->num_ul_spatial_streams_ports; ++idx) {
INDENTED_PRINTF("UlSpatialStreamPorts[%d] = %d\n", idx, pdu->Ul_spatial_stream_ports[idx]);
}
}
static void dump_ul_tti_request_SRS_PDU(const nfapi_nr_srs_pdu_t *pdu, int depth)
{
INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
INDENTED_PRINTF("Handle = %d\n", pdu->handle);
INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
INDENTED_PRINTF("numAntPorts = %d\n", pdu->num_ant_ports);
INDENTED_PRINTF("numSymbols = %d\n", pdu->num_symbols);
INDENTED_PRINTF("numRepetitions = %d\n", pdu->num_repetitions);
INDENTED_PRINTF("timeStartPosition = %d\n", pdu->time_start_position);
INDENTED_PRINTF("configIndex = %d\n", pdu->config_index);
INDENTED_PRINTF("sequenceId = %d\n", pdu->sequence_id);
INDENTED_PRINTF("bandwidthIndex = %d\n", pdu->bandwidth_index);
INDENTED_PRINTF("combSize = %d\n", pdu->comb_size);
INDENTED_PRINTF("combOffset = %d\n", pdu->comb_offset);
INDENTED_PRINTF("cyclicShift = %d\n", pdu->cyclic_shift);
INDENTED_PRINTF("frequencyPosition = %d\n", pdu->frequency_position);
INDENTED_PRINTF("frequencyShift = %d\n", pdu->frequency_shift);
INDENTED_PRINTF("frequencyHopping = %d\n", pdu->frequency_hopping);
INDENTED_PRINTF("groupOrSequenceHopping = %d\n", pdu->group_or_sequence_hopping);
INDENTED_PRINTF("resourceType = %d\n", pdu->resource_type);
INDENTED_PRINTF("Tsrs = %d\n", pdu->t_srs);
INDENTED_PRINTF("Toffset = %d\n", pdu->t_offset);
dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
dump_ul_tti_request_srs_parameters(&pdu->srs_parameters_v4, 1 << pdu->num_symbols, depth + 1);
}
static char *ul_tti_pdu_type_to_str(uint16_t pdu_type)
{
switch (pdu_type) {
case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
return "NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE";
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
return "NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE";
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
return "NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE";
case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
return "NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE";
default:
return "Unknown";
break;
}
}
void dump_ul_tti_request(const nfapi_nr_ul_tti_request_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->SFN);
INDENTED_PRINTF("Slot = %d\n", msg->Slot);
INDENTED_PRINTF("nPDUs = %d\n", msg->n_pdus);
INDENTED_PRINTF("RachPresent = %d\n", msg->rach_present);
INDENTED_PRINTF("nULSCH = %d\n", msg->n_ulsch);
INDENTED_PRINTF("nULCCH = %d\n", msg->n_ulcch);
INDENTED_PRINTF("nGroup = %d\n", msg->n_group);
for (int i = 0; i < msg->n_pdus; ++i) {
const nfapi_nr_ul_tti_request_number_of_pdus_t *pdu = &msg->pdus_list[i];
depth++;
INDENTED_PRINTF("PDU #%d\n", i);
INDENTED_PRINTF("PDUType = 0x%02x (%s)\n", pdu->pdu_type, ul_tti_pdu_type_to_str(pdu->pdu_type));
INDENTED_PRINTF("PDUSize = 0x%02x\n", pdu->pdu_size);
/* call to dump_ul_tti_request_<PDU_Type>_pdu */
switch (pdu->pdu_type) {
case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
dump_ul_tti_request_PRACH_PDU(&pdu->prach_pdu, depth + 1);
break;
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
dump_ul_tti_request_PUSCH_PDU(&pdu->pusch_pdu, depth + 1);
break;
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
dump_ul_tti_request_PUCCH_PDU(&pdu->pucch_pdu, depth + 1);
break;
case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
dump_ul_tti_request_SRS_PDU(&pdu->srs_pdu, depth + 1);
break;
default:
INDENTED_PRINTF("Unknown PDU type 0x%02x\n", pdu->pdu_type);
break;
}
depth--;
}
for (int group_idx = 0; group_idx < msg->n_group; group_idx++) {
const nfapi_nr_ul_tti_request_number_of_groups_t *grp = &msg->groups_list[group_idx];
depth++;
INDENTED_PRINTF("Group #%d\n", group_idx);
INDENTED_PRINTF("nUe[%d] = 0x%02x\n", group_idx, grp->n_ue);
for (int ue_idx = 0; ue_idx < grp->n_ue; ue_idx++) {
depth++;
INDENTED_PRINTF("UE #%d\n", ue_idx);
INDENTED_PRINTF("PduIdx[%d][%d] = 0x%02x\n", group_idx, ue_idx, grp->ue_list[ue_idx].pdu_idx);
depth--;
}
depth--;
}
}
void dump_slot_indication(const nfapi_nr_slot_indication_scf_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->sfn);
INDENTED_PRINTF("Slot = %d\n", msg->slot);
}
void dump_ul_dci_request(const nfapi_nr_ul_dci_request_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->SFN);
INDENTED_PRINTF("Slot = %d\n", msg->Slot);
INDENTED_PRINTF("numPDUs = %d\n", msg->numPdus);
for (int i = 0; i < msg->numPdus; i++) {
depth++;
INDENTED_PRINTF("PDU #%d\n", i);
const nfapi_nr_ul_dci_request_pdus_t *pdu = &msg->ul_dci_pdu_list[i];
INDENTED_PRINTF("PDUType = 0x%02x\n", pdu->PDUType);
INDENTED_PRINTF("PDUSize = 0x%02x\n", pdu->PDUSize);
/* call to dump_dl_tti_request_pdcch_pdu */
dump_dl_tti_request_PDCCH_PDU(&pdu->pdcch_pdu.pdcch_pdu_rel15, depth + 1);
depth--;
}
}
static void dump_tx_data_request_tlv(const nfapi_nr_tx_data_request_tlv_t *tlv, int depth)
{
INDENTED_PRINTF("Tag = %d\n", tlv->tag);
INDENTED_PRINTF("Length = %d\n", tlv->length);
INDENTED_PRINTF("Value = ");
switch (tlv->tag) {
case 0:
for (int i = 0; i < tlv->length; i++) {
printf("0x%02x ", ((uint8_t*)tlv->value.direct)[i]);
}
break;
case 1:
printf("%p", tlv->value.ptr);
break;
default:
printf( " Unknown tag value %d",tlv->tag);
break;
}
printf("\n");
}
void dump_tx_data_request(const nfapi_nr_tx_data_request_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->SFN);
INDENTED_PRINTF("Slot = %d\n", msg->Slot);
INDENTED_PRINTF("Number of PDUs = %d\n", msg->Number_of_PDUs);
depth++;
for (int i = 0; i < msg->Number_of_PDUs; i++) {
INDENTED_PRINTF("PDU #%d\n", i);
const nfapi_nr_pdu_t *pdu = &msg->pdu_list[i];
INDENTED_PRINTF("PDU Length = 0x%02x\n", pdu->PDU_length);
INDENTED_PRINTF("PDU Index = 0x%02x\n", pdu->PDU_index);
INDENTED_PRINTF("numTLV = 0x%02x\n", pdu->num_TLV);
for (int tlv_idx = 0; tlv_idx < pdu->num_TLV; tlv_idx++) {
const nfapi_nr_tx_data_request_tlv_t *tlv = &pdu->TLVs[tlv_idx];
/* call to dump_tx_data_request_tlv */
dump_tx_data_request_tlv(tlv, depth + 1);
}
}
}
void dump_rx_data_indication(const nfapi_nr_rx_data_indication_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->sfn);
INDENTED_PRINTF("Slot = %d\n", msg->slot);
INDENTED_PRINTF("Number of PDUs = %d\n", msg->number_of_pdus);
for (int pdu_idx = 0; pdu_idx < msg->number_of_pdus; pdu_idx++) {
depth++;
INDENTED_PRINTF("PDU #%d\n", pdu_idx);
const nfapi_nr_rx_data_pdu_t *pdu = &msg->pdu_list[pdu_idx];
INDENTED_PRINTF("Handle = 0x%02x\n", pdu->handle);
INDENTED_PRINTF("RNTI = 0x%02x\n", pdu->rnti);
INDENTED_PRINTF("HarqID = 0x%02x\n", pdu->harq_id);
INDENTED_PRINTF("PDU Length = 0x%02x\n", pdu->pdu_length);
INDENTED_PRINTF("UL_CQI = 0x%02x\n", pdu->ul_cqi);
INDENTED_PRINTF("Timing advance = 0x%02x\n", pdu->timing_advance);
INDENTED_PRINTF("RSSI = 0x%02x\n", pdu->rssi);
INDENTED_PRINTF("PDU =");
for (int i = 0; i < pdu->pdu_length; i++) {
printf("%02x ", pdu->pdu[i]);
}
printf("\n");
depth--;
}
}
void dump_crc_indication(const nfapi_nr_crc_indication_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->sfn);
INDENTED_PRINTF("Slot = %d\n", msg->slot);
INDENTED_PRINTF("NumCRCs = %d\n", msg->number_crcs);
for (int i = 0; i < msg->number_crcs; i++) {
depth++;
INDENTED_PRINTF("CRC #%d\n", i);
const nfapi_nr_crc_t *crc = &msg->crc_list[i];
INDENTED_PRINTF("Handle = 0x%02x\n", crc->handle);
INDENTED_PRINTF("RNTI = 0x%02x\n", crc->rnti);
INDENTED_PRINTF("HarqID = 0x%02x\n", crc->harq_id);
INDENTED_PRINTF("TbCrcStatus = 0x%02x\n", crc->tb_crc_status);
INDENTED_PRINTF("NumCb = 0x%02x\n", crc->num_cb);
const uint16_t cb_len = (crc->num_cb / 8) + 1; // length is ceil(NumCb/8)
INDENTED_PRINTF("CbCrcStatus =\n");
for (int j = 0; j < cb_len; j++) {
printf("%02x ", crc->cb_crc_status[j]);
}
printf("\n");
INDENTED_PRINTF("UL_CQI = 0x%02x\n", crc->ul_cqi);
INDENTED_PRINTF("Timing advance = 0x%02x\n", crc->timing_advance);
INDENTED_PRINTF("RSSI = 0x%02x\n", crc->rssi);
depth--;
}
}
void dump_uci_indication(const nfapi_nr_uci_indication_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->sfn);
INDENTED_PRINTF("Slot = %d\n", msg->slot);
INDENTED_PRINTF("NumUCIS = %d\n", msg->num_ucis);
for (int i = 0; i < msg->num_ucis; i++) {
depth++;
INDENTED_PRINTF("UCI #%d\n", i);
const nfapi_nr_uci_t *uci = &msg->uci_list[i];
INDENTED_PRINTF("PDUType = 0x%02x\n", uci->pdu_type);
INDENTED_PRINTF("PDUSize = 0x%02x\n", uci->pdu_size);
/* call to dump_uci_indication_<PDU_Type>_pdu */
depth--;
}
}
static void dump_srs_report_tlv(const nfapi_srs_report_tlv_t* tlv, int depth)
{
depth++;
INDENTED_PRINTF("TAG = 0x%02x\n", tlv->tag);
INDENTED_PRINTF("LENGTH = 0x%02x\n", tlv->length);
INDENTED_PRINTF("VALUE = ");
for (int i = 0; i < ((tlv->length + 3) / 4); ++i) {
printf("0x%04x ", tlv->value[i]);
}
printf("\n");
}
void dump_srs_indication(const nfapi_nr_srs_indication_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->sfn);
INDENTED_PRINTF("Slot = %d\n", msg->slot);
INDENTED_PRINTF("controlLength = %d\n", msg->control_length);
INDENTED_PRINTF("Number of PDUs = %d\n", msg->number_of_pdus);
for (int i = 0; i < msg->number_of_pdus; i++) {
depth++;
INDENTED_PRINTF("PDU #%d\n", i);
const nfapi_nr_srs_indication_pdu_t *pdu = &msg->pdu_list[i];
INDENTED_PRINTF("Handle = 0x%02x\n", pdu->handle);
INDENTED_PRINTF("RNTI = 0x%02x\n", pdu->rnti);
INDENTED_PRINTF("Timing advance offset = 0x%02x\n", pdu->timing_advance_offset);
INDENTED_PRINTF("Timing advance offset in nanoseconds = 0x%02x\n", pdu->timing_advance_offset_nsec);
INDENTED_PRINTF("SRS usage = 0x%02x\n", pdu->srs_usage);
INDENTED_PRINTF("Report Type = 0x%02x\n", pdu->report_type);
dump_srs_report_tlv(&pdu->report_tlv, depth);
depth--;
}
}
void dump_rach_indication(const nfapi_nr_rach_indication_t *msg)
{
int depth = 0;
dump_p7_message_header(&msg->header, depth);
depth++;
INDENTED_PRINTF("SFN = %d\n", msg->sfn);
INDENTED_PRINTF("Slot = %d\n", msg->slot);
INDENTED_PRINTF("Number of PDUs = %d\n", msg->number_of_pdus);
for (int i = 0; i < msg->number_of_pdus; i++) {
depth++;
INDENTED_PRINTF("PRACH PDU #%d\n", i);
const nfapi_nr_prach_indication_pdu_t *pdu = &msg->pdu_list[i];
INDENTED_PRINTF("physCellID = 0x%02x\n", pdu->phy_cell_id);
INDENTED_PRINTF("SymbolIndex = 0x%02x\n", pdu->symbol_index);
INDENTED_PRINTF("SlotIndex = 0x%02x\n", pdu->slot_index);
INDENTED_PRINTF("FreqIndex = 0x%02x\n", pdu->freq_index);
INDENTED_PRINTF("avgRssi = 0x%02x\n", pdu->avg_rssi);
INDENTED_PRINTF("avgSnr = 0x%02x\n", pdu->avg_snr);
INDENTED_PRINTF("numPreamble = 0x%02x\n", pdu->num_preamble);
for (int j = 0; j < pdu->num_preamble; j++) {
depth++;
INDENTED_PRINTF("Preamble #%d\n", j);
const nfapi_nr_prach_indication_preamble_t *preamble = &pdu->preamble_list[j];
INDENTED_PRINTF("preambleIndex = 0x%02x\n", preamble->preamble_index);
INDENTED_PRINTF("Timing advance = 0x%02x\n", preamble->timing_advance);
INDENTED_PRINTF("PreamblePwr = 0x%02x\n", preamble->preamble_pwr);
depth--;
}
depth--;
}
}