Fix packing/unpacking procedures for UL_TTI.request
Create separate function to pack/unpack rx_beamforming PDU Reorder PDU handling order to follow from 0 to 3 Changed PUSCH pdu_bitmap switch to separate if to handle multiple optional sub-pdus Fix bit_len_harq size to 16 bit Add utility functions related to UL_TTI.request
This commit is contained in:
committed by
Robert Schmidt
parent
9b8bc21d84
commit
0653c38a9d
@@ -1359,7 +1359,7 @@ typedef struct
|
||||
uint8_t dmrs_cyclic_shift;
|
||||
|
||||
uint8_t sr_flag;
|
||||
uint8_t bit_len_harq;
|
||||
uint16_t bit_len_harq;
|
||||
uint16_t bit_len_csi_part1;
|
||||
uint16_t bit_len_csi_part2;
|
||||
|
||||
@@ -1375,7 +1375,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
uint16_t srs_bandwidth_size; // mSRS,b: Number of PRB’s that are sounded for each SRS symbol, per 3GPP TS 38.211, section 6.4.1.4.3. Value: 4->272
|
||||
nfapi_v4_srs_parameters_symbols_t *symbol_list;
|
||||
nfapi_v4_srs_parameters_symbols_t symbol_list[4];
|
||||
uint32_t usage; // Bitmap indicating the type of report(s) expected at L2 from the SRS signaled by this PDU. Bit positions: 0 – beamManagement; 1 – codebook; 2 – nonCodebook; 3 – antennaSwitching; 4 – 255: reserved. For each of this bit positions: 1 = requested; 0 = not requested. nUsage = sum(all bits in usage)
|
||||
uint8_t report_type[4]; // Interpretation of each Report Type depends on usage: beamManagement (1 = PRG SNR, 2-255 reserved); codebook (1 = PRG I and Q channel estimate, per srs Tx port and gNB antenna element, 2-255 reserved); nonCodebook (1 = PRG I and Q channel estimate, per SRI and gNB antenna element, 2-255 reserved); antennaSwitching (1 = SVD representation UE Rx and gNB sets of antenna element, 2-255 reserved); all (0 – no report required).
|
||||
uint8_t singular_Value_representation; // 0 – 8-bit dB; 1 – 16-bit linear; 255 – not applicable
|
||||
|
||||
@@ -725,6 +725,24 @@ static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppW
|
||||
|
||||
//Pack fns for ul_tti PDUS
|
||||
|
||||
static uint8_t pack_nr_rx_beamforming_pdu(const nfapi_nr_ul_beamforming_t *beamforming_pdu,
|
||||
uint8_t **ppWritePackedMsg,
|
||||
uint8_t *end)
|
||||
{ // Pack RX Beamforming PDU
|
||||
if (!(push16((*beamforming_pdu).num_prgs, ppWritePackedMsg, end) && push16((*beamforming_pdu).prg_size, ppWritePackedMsg, end)
|
||||
&& push8((*beamforming_pdu).dig_bf_interface, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
for (int prg = 0; prg < (*beamforming_pdu).num_prgs; prg++) {
|
||||
for (int digBFInterface = 0; digBFInterface < (*beamforming_pdu).dig_bf_interface; digBFInterface++) {
|
||||
if (!push16((*beamforming_pdu).prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, ppWritePackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
|
||||
{
|
||||
if (!(push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) && push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end)
|
||||
@@ -733,54 +751,8 @@ static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, ui
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Pack RX Beamforming PDU
|
||||
if (!(push16(prach_pdu->beamforming.num_prgs, ppWritePackedMsg, end)
|
||||
&& push16(prach_pdu->beamforming.prg_size, ppWritePackedMsg, end)
|
||||
&& push8(prach_pdu->beamforming.dig_bf_interface, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
return pack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppWritePackedMsg, end);
|
||||
|
||||
for (int prg = 0; prg < prach_pdu->beamforming.num_prgs; prg++) {
|
||||
for (int digBFInterface = 0; digBFInterface < prach_pdu->beamforming.dig_bf_interface; digBFInterface++) {
|
||||
if (!push16(prach_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
|
||||
{
|
||||
if (!(push16(pucch_pdu->rnti, ppWritePackedMsg, end) && push32(pucch_pdu->handle, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) && push16(pucch_pdu->bwp_start, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) && push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->format_type, ppWritePackedMsg, end) && push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->pi_2bpsk, ppWritePackedMsg, end) && push16(pucch_pdu->prb_start, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->prb_size, ppWritePackedMsg, end) && push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) && push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) && push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) && push16(pucch_pdu->hopping_id, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) && push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) && push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) && push8(pucch_pdu->sr_flag, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) && push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
|
||||
// Pack RX Beamforming PDU
|
||||
&& push16(pucch_pdu->beamforming.num_prgs, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->beamforming.prg_size, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->beamforming.dig_bf_interface, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int prg = 0; prg < pucch_pdu->beamforming.num_prgs; prg++) {
|
||||
for (int digBFInterface = 0; digBFInterface < pucch_pdu->beamforming.dig_bf_interface; digBFInterface++) {
|
||||
if (!push16(pucch_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
|
||||
@@ -802,83 +774,144 @@ static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, ui
|
||||
&& push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) && push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
|
||||
// TODO: ignoring beamforming tlv for now
|
||||
)) {
|
||||
&& push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Pack Optional Data only included if indicated in pduBitmap
|
||||
switch (pusch_pdu->pdu_bit_map) {
|
||||
case PUSCH_PDU_BITMAP_PUSCH_DATA: {
|
||||
// pack optional TLVs
|
||||
if (!(push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_data.new_data_indicator, ppWritePackedMsg, end)
|
||||
&& push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end)
|
||||
)) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
case PUSCH_PDU_BITMAP_PUSCH_UCI: {
|
||||
if (!(push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
|
||||
if (!push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
for (int i = 0; i < pusch_pdu->pusch_ptrs.num_ptrs_ports; ++i) {
|
||||
if (!(push16(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_port_index, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_dmrs_port, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_re_offset, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
case PUSCH_PDU_BITMAP_DFTS_OFDM: {
|
||||
if (!(push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
default: {
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map);
|
||||
// Check if PUSCH_PDU_BITMAP_PUSCH_DATA bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA) {
|
||||
// pack optional TLVs
|
||||
if (!(push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_data.new_data_indicator, ppWritePackedMsg, end)
|
||||
&& push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end)
|
||||
&& pusharray8(pusch_pdu->pusch_data.cb_present_and_position,
|
||||
(pusch_pdu->pusch_data.num_cb + 7) / 8,
|
||||
(pusch_pdu->pusch_data.num_cb + 7) / 8,
|
||||
ppWritePackedMsg,
|
||||
end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if PUSCH_PDU_BITMAP_PUSCH_UCI bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI) {
|
||||
if (!(push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if PUSCH_PDU_BITMAP_PUSCH_PTRS bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
||||
if (!push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
for (int i = 0; i < pusch_pdu->pusch_ptrs.num_ptrs_ports; ++i) {
|
||||
if (!(push16(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_port_index, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_dmrs_port, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_re_offset, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if PUSCH_PDU_BITMAP_DFTS_OFDM bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM) {
|
||||
if (!(push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end)
|
||||
&& push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end)
|
||||
&& push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Pack RX Beamforming PDU
|
||||
if (!(pack_nr_rx_beamforming_pdu(&pusch_pdu->beamforming, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
if (!(push8(pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, ppWritePackedMsg, end)
|
||||
&& push32(pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
|
||||
{
|
||||
if (!(push16(pucch_pdu->rnti, ppWritePackedMsg, end) && push32(pucch_pdu->handle, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) && push16(pucch_pdu->bwp_start, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) && push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->format_type, ppWritePackedMsg, end) && push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->pi_2bpsk, ppWritePackedMsg, end) && push16(pucch_pdu->prb_start, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->prb_size, ppWritePackedMsg, end) && push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) && push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) && push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) && push16(pucch_pdu->hopping_id, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) && push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) && push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end)
|
||||
&& push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) && push8(pucch_pdu->sr_flag, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) && push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end)
|
||||
&& push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppWritePackedMsg, end);
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters, uint8_t num_symbols, uint8_t **ppWritePackedMsg, uint8_t *end){
|
||||
if(!(push16(srsParameters->srs_bandwidth_size, ppWritePackedMsg, end))){
|
||||
return 0;
|
||||
}
|
||||
for (int symbol_idx = 0; symbol_idx < num_symbols; ++symbol_idx) {
|
||||
nfapi_v4_srs_parameters_symbols_t *symbol = &srsParameters->symbol_list[symbol_idx];
|
||||
if(!(push16(symbol->srs_bandwidth_start, ppWritePackedMsg, end) &&
|
||||
push8(symbol->sequence_group, ppWritePackedMsg, end) &&
|
||||
push8(symbol->sequence_number, ppWritePackedMsg, end))){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
uint8_t nUsage = __builtin_popcount(srsParameters->usage);
|
||||
if(!(push32(srsParameters->usage, ppWritePackedMsg, end) &&
|
||||
pusharray8(srsParameters->report_type,4,nUsage , ppWritePackedMsg, end) &&
|
||||
push8(srsParameters->singular_Value_representation, ppWritePackedMsg, end) &&
|
||||
push8(srsParameters->iq_representation, ppWritePackedMsg, end) &&
|
||||
push16(srsParameters->prg_size, ppWritePackedMsg, end) &&
|
||||
push8(srsParameters->num_total_ue_antennas, ppWritePackedMsg, end) &&
|
||||
push32(srsParameters->ue_antennas_in_this_srs_resource_set, ppWritePackedMsg, end) &&
|
||||
push32(srsParameters->sampled_ue_antennas, ppWritePackedMsg, end) &&
|
||||
push8(srsParameters->report_scope, ppWritePackedMsg, end) &&
|
||||
push8(srsParameters->num_ul_spatial_streams_ports, ppWritePackedMsg, end) &&
|
||||
pusharray8(srsParameters->Ul_spatial_stream_ports, 256, srsParameters->num_ul_spatial_streams_ports, ppWritePackedMsg, end)
|
||||
)){
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
|
||||
if(!(
|
||||
push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
|
||||
push32(srs_pdu->handle, ppWritePackedMsg, end) &&
|
||||
push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
|
||||
push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
|
||||
push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
|
||||
push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end)&&
|
||||
push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
|
||||
push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
|
||||
push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
|
||||
@@ -897,23 +930,18 @@ static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t
|
||||
push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
|
||||
push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
|
||||
push16(srs_pdu->t_offset, ppWritePackedMsg, end)
|
||||
// TODO: ignoring beamforming tlv for now
|
||||
)){
|
||||
return 0;
|
||||
}
|
||||
// Rx Beamforming PDU
|
||||
if(!(push16(srs_pdu->beamforming.num_prgs,ppWritePackedMsg,end) &&
|
||||
push16(srs_pdu->beamforming.prg_size,ppWritePackedMsg,end) &&
|
||||
push8(srs_pdu->beamforming.dig_bf_interface,ppWritePackedMsg,end))){
|
||||
return 0;
|
||||
|
||||
if (!(pack_nr_rx_beamforming_pdu(&srs_pdu->beamforming, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
for(int prg = 0; prg < srs_pdu->beamforming.num_prgs; prg ++){
|
||||
for(int digInt = 0; digInt < srs_pdu->beamforming.dig_bf_interface; digInt++){
|
||||
if(!push16(srs_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx,ppWritePackedMsg,end)){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(pack_ul_tti_request_srs_parameters_v4(&srs_pdu->srs_parameters_v4, srs_pdu->num_symbols, ppWritePackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1226,13 +1254,13 @@ static uint8_t pack_ul_tti_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg,
|
||||
return 0;
|
||||
} break;
|
||||
|
||||
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
|
||||
if (!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
|
||||
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
|
||||
if (!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
} break;
|
||||
|
||||
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
|
||||
if (!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
|
||||
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
|
||||
if (!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
} break;
|
||||
|
||||
@@ -4287,63 +4315,34 @@ static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPa
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_nr_rx_beamforming_pdu(nfapi_nr_ul_beamforming_t *beamforming_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{ // Unpack RX Beamforming PDU
|
||||
if (!(pull16(ppReadPackedMsg, &beamforming_pdu->num_prgs, end) && pull16(ppReadPackedMsg, &beamforming_pdu->prg_size, end)
|
||||
&& pull8(ppReadPackedMsg, &beamforming_pdu->dig_bf_interface, end))) {
|
||||
return 0;
|
||||
}
|
||||
for (int prg = 0; prg < beamforming_pdu->num_prgs; prg++) {
|
||||
for (int digBFInterface = 0; digBFInterface < beamforming_pdu->dig_bf_interface; digBFInterface++) {
|
||||
if (!pull16(ppReadPackedMsg, &beamforming_pdu->prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, end)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
static uint8_t unpack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{
|
||||
nfapi_nr_prach_pdu_t *prach_pdu = (nfapi_nr_prach_pdu_t *)tlv;
|
||||
|
||||
if (!(pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) && pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end)
|
||||
&& pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) && pull8(ppReadPackedMsg, &prach_pdu->num_ra, end)
|
||||
&& pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) && pull16(ppReadPackedMsg, &prach_pdu->num_cs, end))) {
|
||||
return 0;
|
||||
}
|
||||
// Unpack RX Beamforming PDU
|
||||
if (!(pull16(ppReadPackedMsg, &prach_pdu->beamforming.num_prgs, end)
|
||||
&& pull16(ppReadPackedMsg, &prach_pdu->beamforming.prg_size, end)
|
||||
&& pull8(ppReadPackedMsg, &prach_pdu->beamforming.dig_bf_interface, end))) {
|
||||
return 0;
|
||||
}
|
||||
for (int prg = 0; prg < prach_pdu->beamforming.num_prgs; prg++) {
|
||||
for (int digBFInterface = 0; digBFInterface < prach_pdu->beamforming.dig_bf_interface; digBFInterface++) {
|
||||
if (!pull16(ppReadPackedMsg, &prach_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, end)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
return unpack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppReadPackedMsg, end);
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
static uint8_t unpack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{
|
||||
nfapi_nr_pucch_pdu_t *pucch_pdu = (nfapi_nr_pucch_pdu_t *)tlv;
|
||||
uint16_t dummy16 = 0;
|
||||
uint8_t dummy8 = 0;
|
||||
return (pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) && pull32(ppReadPackedMsg, &pucch_pdu->handle, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) && pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) && pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->format_type, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) && pull8(ppReadPackedMsg, &pucch_pdu->pi_2bpsk, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) && pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) && pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) && pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) && pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) && pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) && pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) && pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) && pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) && pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end) &&
|
||||
// TODO: ignoring beamforming tlv for now
|
||||
pull16(ppReadPackedMsg, &dummy16, end) && pull16(ppReadPackedMsg, &dummy16, end) && pull8(ppReadPackedMsg, &dummy8, end));
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{
|
||||
nfapi_nr_pusch_pdu_t *pusch_pdu = (nfapi_nr_pusch_pdu_t *)tlv;
|
||||
|
||||
if (!(pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) && pull16(ppReadPackedMsg, &pusch_pdu->rnti, end)
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->handle, end) && pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) && pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end)
|
||||
@@ -4361,62 +4360,72 @@ static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPacked
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) && pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
|
||||
// TODO: ignoring beamforming tlv for now
|
||||
))
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) && pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)))
|
||||
return 0;
|
||||
|
||||
// Pack Optional Data only included if indicated in pduBitmap
|
||||
switch (pusch_pdu->pdu_bit_map) {
|
||||
case PUSCH_PDU_BITMAP_PUSCH_DATA: {
|
||||
// pack optional TLVs
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.new_data_indicator, end)
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end)
|
||||
)) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
case PUSCH_PDU_BITMAP_PUSCH_UCI: {
|
||||
if (!(pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end))) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end))) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
case PUSCH_PDU_BITMAP_DFTS_OFDM: {
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end))) {
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
default: {
|
||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map);
|
||||
// Unpack Optional Data only included if indicated in pduBitmap
|
||||
// Check if PUSCH_PDU_BITMAP_PUSCH_DATA bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA) {
|
||||
// pack optional TLVs
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.new_data_indicator, end)
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end)
|
||||
&& pullarray8(ppReadPackedMsg,
|
||||
pusch_pdu->pusch_data.cb_present_and_position,
|
||||
(pusch_pdu->pusch_data.num_cb + 7) / 8,
|
||||
(pusch_pdu->pusch_data.num_cb + 7) / 8,
|
||||
end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
// Check if PUSCH_PDU_BITMAP_PUSCH_UCI bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI) {
|
||||
if (!(pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if PUSCH_PDU_BITMAP_PUSCH_PTRS bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end))) {
|
||||
return 0;
|
||||
}
|
||||
pusch_pdu->pusch_ptrs.ptrs_ports_list = calloc(pusch_pdu->pusch_ptrs.num_ptrs_ports, sizeof(nfapi_nr_ptrs_ports_t));
|
||||
for (int ptrs_port = 0; ptrs_port < pusch_pdu->pusch_ptrs.num_ptrs_ports; ++ptrs_port) {
|
||||
if (!(pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list[ptrs_port].ptrs_port_index, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list[ptrs_port].ptrs_dmrs_port, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list[ptrs_port].ptrs_re_offset, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if PUSCH_PDU_BITMAP_DFTS_OFDM bit is set
|
||||
if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM) {
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end)
|
||||
&& pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end)
|
||||
&& pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(unpack_nr_rx_beamforming_pdu(&pusch_pdu->beamforming, ppReadPackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, end)
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, end)))
|
||||
@@ -4425,10 +4434,71 @@ static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPacked
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
|
||||
nfapi_nr_srs_pdu_t *srs_pdu = (nfapi_nr_srs_pdu_t *)tlv;
|
||||
return(
|
||||
pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
|
||||
static uint8_t unpack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{
|
||||
if (!(pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) && pull32(ppReadPackedMsg, &pucch_pdu->handle, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) && pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) && pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) && pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->pi_2bpsk, end) && pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) && pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) && pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) && pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) && pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) && pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) && pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end)
|
||||
&& pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) && pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) && pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end)
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end))) {
|
||||
return 0;
|
||||
}
|
||||
return unpack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppReadPackedMsg, end);
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters,
|
||||
uint8_t num_symbols,
|
||||
uint8_t **ppReadPackedMsg,
|
||||
uint8_t *end)
|
||||
{
|
||||
if (!(pull16(ppReadPackedMsg, &srsParameters->srs_bandwidth_size, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int symbol_idx = 0; symbol_idx < num_symbols; ++symbol_idx) {
|
||||
nfapi_v4_srs_parameters_symbols_t *symbol = &srsParameters->symbol_list[symbol_idx];
|
||||
if (!(pull16(ppReadPackedMsg, &symbol->srs_bandwidth_start, end) && pull8(ppReadPackedMsg, &symbol->sequence_group, end)
|
||||
&& pull8(ppReadPackedMsg, &symbol->sequence_number, end))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (!(pull32(ppReadPackedMsg, &srsParameters->usage, end))) {
|
||||
return 0;
|
||||
}
|
||||
uint8_t nUsage = __builtin_popcount(srsParameters->usage);
|
||||
if (!(pullarray8(ppReadPackedMsg, &srsParameters->report_type[0], 4, nUsage, end)
|
||||
&& pull8(ppReadPackedMsg, &srsParameters->singular_Value_representation, end)
|
||||
&& pull8(ppReadPackedMsg, &srsParameters->iq_representation, end) && pull16(ppReadPackedMsg, &srsParameters->prg_size, end)
|
||||
&& pull8(ppReadPackedMsg, &srsParameters->num_total_ue_antennas, end)
|
||||
&& pull32(ppReadPackedMsg, &srsParameters->ue_antennas_in_this_srs_resource_set, end)
|
||||
&& pull32(ppReadPackedMsg, &srsParameters->sampled_ue_antennas, end)
|
||||
&& pull8(ppReadPackedMsg, &srsParameters->report_scope, end)
|
||||
&& pull8(ppReadPackedMsg, &srsParameters->num_ul_spatial_streams_ports, end)
|
||||
&& pullarray8(ppReadPackedMsg,
|
||||
&srsParameters->Ul_spatial_stream_ports[0],
|
||||
256,
|
||||
srsParameters->num_ul_spatial_streams_ports,
|
||||
end))) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{
|
||||
if (!(pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
|
||||
pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
|
||||
pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
|
||||
pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
|
||||
@@ -4450,9 +4520,18 @@ static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMs
|
||||
pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
|
||||
pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
|
||||
pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
|
||||
pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
|
||||
// TODO: ignoring beamforming tlv for now
|
||||
);
|
||||
pull16(ppReadPackedMsg, &srs_pdu->t_offset, end))) {
|
||||
return 0;
|
||||
}
|
||||
if (!(unpack_nr_rx_beamforming_pdu(&srs_pdu->beamforming, ppReadPackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(unpack_ul_tti_request_srs_parameters_v4(&srs_pdu->srs_parameters_v4, srs_pdu->num_symbols, ppReadPackedMsg, end))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -4471,18 +4550,17 @@ static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *
|
||||
}
|
||||
break;
|
||||
|
||||
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
|
||||
if (!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
} break;
|
||||
|
||||
case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
|
||||
if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
|
||||
if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
|
||||
if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
@@ -4525,10 +4603,10 @@ uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg
|
||||
return 0;
|
||||
if (!pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end))
|
||||
return 0;
|
||||
if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end))
|
||||
return 0;
|
||||
if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end))
|
||||
return 0;
|
||||
if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end))
|
||||
return 0;
|
||||
if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end))
|
||||
return 0;
|
||||
for (int i = 0; i < pNfapiMsg->n_pdus; i++) {
|
||||
|
||||
Reference in New Issue
Block a user