+ pkt_size[i] = pkt_q[i]->pkt_len;
+ buf_start[i] = (char*)pkt_q[i]->buf_addr;
+ start_off[i] = pkt_q[i]->data_off;
+}
+
+ if (expect_comp && (staticComp != XRAN_COMP_HDR_TYPE_STATIC))
+ {
+#pragma vector always
+ for (i = 0; i < MBUFS_CNT; i++)
+ {
+#if XRAN_MLOG_VAR
+ mlogVarCnt = 0;
+#endif
+ ecpri_hdr[i] = (void*)(buf_start[i] + start_off[i]);
+ radio_hdr[i] = (void*)(buf_start[i] + start_off[i] + ecpri_size);
+ data_hdr[i] = (void*)(buf_start[i] + start_off[i] + ecpri_size + rad_size);
+ data_compr_hdr[i] = (void*)(buf_start[i] + start_off[i] + ecpri_size + rad_size + data_size);
+ seq[i] = ecpri_hdr[i]->ecpri_seq_id;
+ seq_id[i] = seq[i].bits.seq_id;
+ last[i] = seq[i].bits.e_bit;
+
+ iq_offset[i] = ecpri_size + rad_size + data_size + compr_size;
+
+ iq_samp_buf[i] = (void*)(buf_start[i] + start_off[i] + iq_offset[i]);
+ num_bytes[i] = pkt_size[i] - iq_offset[i];
+
+ if (ecpri_hdr[i] == NULL ||
+ radio_hdr[i] == NULL ||
+ data_hdr[i] == NULL ||
+ data_compr_hdr[i] == NULL ||
+ iq_samp_buf[i] == NULL)
+ {
+ num_bytes[i] = 0; /* packet too short */
+ }
+
+#if XRAN_MLOG_VAR
+ if(radio_hdr[i] != NULL && data_hdr[i] != NULL)
+ {
+ mlogVar[mlogVarCnt++] = 0xBBBBBBBB;
+ mlogVar[mlogVarCnt++] = xran_lib_ota_tti;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->frame_id;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->sf_slot_sym.subframe_id;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->sf_slot_sym.slot_id;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->sf_slot_sym.symb_id;
+ mlogVar[mlogVarCnt++] = data_hdr[i]->fields.sect_id;
+ mlogVar[mlogVarCnt++] = data_hdr[i]->fields.start_prbu;
+ mlogVar[mlogVarCnt++] = data_hdr[i]->fields.num_prbu;
+ mlogVar[mlogVarCnt++] = rte_pktmbuf_pkt_len(pkt_q[i]);
+ MLogAddVariables(mlogVarCnt, mlogVar, MLogTick());
+ }
+#endif
+ }
+ }
+ else
+ {
+#pragma vector always
+ for (i = 0; i < MBUFS_CNT; i++)
+ {
+#if XRAN_MLOG_VAR
+ mlogVarCnt = 0;
+#endif
+ ecpri_hdr[i] = (void*)(buf_start[i] + start_off[i]);
+ radio_hdr[i] = (void*)(buf_start[i] + start_off[i] + ecpri_size);
+ data_hdr[i] = (void*)(buf_start[i] + start_off[i] + ecpri_size + rad_size);
+ seq[i] = ecpri_hdr[i]->ecpri_seq_id;
+ seq_id[i] = seq[i].bits.seq_id;
+ last[i] = seq[i].bits.e_bit;
+
+ iq_offset[i] = ecpri_size + rad_size + data_size;
+ iq_samp_buf[i] = (void*)(buf_start[i] + start_off[i] + iq_offset[i]);
+ num_bytes[i] = pkt_size[i] - iq_offset[i];
+
+ if (ecpri_hdr[i] == NULL ||
+ radio_hdr[i] == NULL ||
+ data_hdr[i] == NULL ||
+ iq_samp_buf[i] == NULL)
+ {
+ num_bytes[i] = 0; /* packet too short */
+ }
+
+#if XRAN_MLOG_VAR
+ if (radio_hdr[i] != NULL && data_hdr[i] != NULL)
+ {
+ mlogVar[mlogVarCnt++] = 0xBBBBBBBB;
+ mlogVar[mlogVarCnt++] = xran_lib_ota_tti;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->frame_id;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->sf_slot_sym.subframe_id;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->sf_slot_sym.slot_id;
+ mlogVar[mlogVarCnt++] = radio_hdr[i]->sf_slot_sym.symb_id;
+ mlogVar[mlogVarCnt++] = data_hdr[i]->fields.sect_id;
+ mlogVar[mlogVarCnt++] = data_hdr[i]->fields.start_prbu;
+ mlogVar[mlogVarCnt++] = data_hdr[i]->fields.num_prbu;
+ mlogVar[mlogVarCnt++] = rte_pktmbuf_pkt_len(pkt_q[i]);
+ MLogAddVariables(mlogVarCnt, mlogVar, MLogTick());
+ }
+#endif
+ }
+ }
+
+ for (i = 0; i < MBUFS_CNT; i++) {
+ if(p_cid->ccId == 0xFF && p_cid->ruPortId == 0xFF) {
+ cid[i] = rte_be_to_cpu_16((uint16_t)ecpri_hdr[i]->ecpri_xtc_id);
+ if (num_bytes[i] > 0) {
+ CC_ID[i] = (cid[i] & conf->mask_ccId) >> conf->bit_ccId;
+ Ant_ID[i] = (cid[i] & conf->mask_ruPortId) >> conf->bit_ruPortId;
+ }
+ } else {
+ if (num_bytes[i] > 0) {
+ CC_ID[i] = p_cid->ccId;
+ Ant_ID[i] = p_cid->ruPortId;
+ }
+ }
+ }
+
+ for (i = 0; i < MBUFS_CNT; i++)
+ {
+ radio_hdr[i]->sf_slot_sym.value = rte_be_to_cpu_16(radio_hdr[i]->sf_slot_sym.value);
+ data_hdr[i]->fields.all_bits = rte_be_to_cpu_32(data_hdr[i]->fields.all_bits);
+ }
+
+ for (i = 0; i < MBUFS_CNT; i++)
+ {
+ if (num_bytes[i] > 0)
+ {
+ compMeth[i] = compMeth_ini;
+ iqWidth[i] = iqWidth_ini;
+ valid_res = XRAN_STATUS_SUCCESS;
+
+ frame_id[i] = radio_hdr[i]->frame_id;
+ subframe_id[i] = radio_hdr[i]->sf_slot_sym.subframe_id;
+ slot_id[i] = radio_hdr[i]->sf_slot_sym.slot_id;
+ symb_id[i] = radio_hdr[i]->sf_slot_sym.symb_id;
+
+ num_prbu[i] = data_hdr[i]->fields.num_prbu;
+ start_prbu[i] = data_hdr[i]->fields.start_prbu;
+ sym_inc[i] = data_hdr[i]->fields.sym_inc;
+ rb[i] = data_hdr[i]->fields.rb;
+ sect_id[i] = data_hdr[i]->fields.sect_id;
+
+ if (expect_comp && (staticComp != XRAN_COMP_HDR_TYPE_STATIC))
+ {
+ compMeth[i] = data_compr_hdr[i]->ud_comp_hdr.ud_comp_meth;
+ iqWidth[i] = data_compr_hdr[i]->ud_comp_hdr.ud_iq_width;
+ }
+
+ if (CC_ID[i] >= XRAN_MAX_CELLS_PER_PORT || Ant_ID[i] >= max_ant_num || symb_id[i] >= XRAN_NUM_OF_SYMBOL_PER_SLOT)
+ {
+ ptr_seq_id_num_port[CC_ID[i] * max_ant_num + Ant_ID[i]] = seq_id[i]; // for next
+ valid_res = XRAN_STATUS_FAIL;
+ pCnt->Rx_pkt_dupl++;
+// print_err("Invalid CC ID - %d or antenna ID or Symbol ID- %d", CC_ID[i], Ant_ID[i], symb_id[i]);
+ }
+ else
+ {
+ ptr_seq_id_num_port[CC_ID[i] * max_ant_num + Ant_ID[i]]++;
+ }
+
+ pCnt->rx_counter++;
+ pCnt->Rx_on_time++;
+ pCnt->Total_msgs_rcvd++;
+
+ if (Ant_ID[i] >= p_dev_ctx->srs_cfg.eAxC_offset && p_dev_ctx->fh_cfg.srsEnable)
+ {
+ Ant_ID[i] -= p_dev_ctx->srs_cfg.eAxC_offset;
+ if (last[i] == 1)
+ {
+ srs_idx[num_srs] = i;
+ num_srs += 1;
+ pCnt->rx_srs_packets++;
+ }
+ }
+ else if (Ant_ID[i] >= p_dev_ctx->PrachCPConfig.eAxC_offset && p_dev_ctx->fh_cfg.prachEnable)
+ {
+ Ant_ID[i] -= p_dev_ctx->PrachCPConfig.eAxC_offset;
+ if (last[i] == 1)
+ {
+ prach_idx[num_prach] = i;
+ num_prach += 1;
+ pCnt->rx_prach_packets[Ant_ID[i]]++;
+ }
+ }
+ else
+ {
+ if (last[i] == 1)
+ {
+ pusch_idx[num_pusch] = i;
+ num_pusch += 1;
+ pCnt->rx_pusch_packets[Ant_ID[i]]++;
+ }
+ }
+ symbol_total_bytes[xran_port][CC_ID[i]][Ant_ID[i]] += num_bytes[i];
+ num_bytes_pusch[i] = symbol_total_bytes[xran_port][CC_ID[i]][Ant_ID[i]];
+ if (last[i] == 1)
+ symbol_total_bytes[xran_port][CC_ID[i]][Ant_ID[i]] = 0;
+ }
+ }
+
+ for (j = 0; j < num_prach; j++)
+ {
+ i = prach_idx[j];
+ pkt = pkt_q[i];
+
+ print_dbg("Completed receiving PRACH symbol %d, size=%d bytes\n", symb_id[i], num_bytes[i]);
+
+ int16_t res = xran_process_prach_sym(p_dev_ctx,
+ pkt,
+ iq_samp_buf[i],
+ num_bytes[i],
+ CC_ID[i],
+ Ant_ID[i],
+ frame_id[i],
+ subframe_id[i],
+ slot_id[i],
+ symb_id[i],
+ num_prbu[i],
+ start_prbu[i],
+ sym_inc[i],
+ rb[i],
+ sect_id[i],
+ &ret_data[i]);
+ }
+
+ for (j = 0; j < num_srs; j++)
+ {
+ i = srs_idx[j];
+ pkt = pkt_q[i];
+
+ print_dbg("SRS receiving symbol %d, size=%d bytes\n",
+ symb_id[i], symbol_total_bytes[p_dev_ctx->xran_port_id][CC_ID[i]][Ant_ID[i]]);
+
+ uint64_t t1 = MLogTick();
+ int16_t res = xran_process_srs_sym(p_dev_ctx,
+ pkt,
+ iq_samp_buf[i],
+ num_bytes[i],
+ CC_ID[i],
+ Ant_ID[i],
+ frame_id[i],
+ subframe_id[i],
+ slot_id[i],
+ symb_id[i],
+ num_prbu[i],
+ start_prbu[i],
+ sym_inc[i],
+ rb[i],
+ sect_id[i],
+ &ret_data[i],
+ expect_comp,
+ compMeth[i],
+ iqWidth[i]);
+ MLogTask(PID_PROCESS_UP_PKT_SRS, t1, MLogTick());
+ }
+
+ if (num_pusch == MBUFS_CNT)
+ {
+ for (i = 0; i < MBUFS_CNT; i++)
+ {
+ iq_sample_size_bits = 16;
+ if (expect_comp)
+ iq_sample_size_bits = iqWidth[i];
+
+ tti = frame_id[i] * SLOTS_PER_SYSTEMFRAME(p_dev_ctx->interval_us_local) +
+ subframe_id[i] * SLOTNUM_PER_SUBFRAME(p_dev_ctx->interval_us_local) + slot_id[i];
+
+ pRbMap = (struct xran_prb_map*)p_dev_ctx->sFrontHaulRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][CC_ID[i]][Ant_ID[i]].sBufferList.pBuffers->pData;
+
+ if (pRbMap)
+ {
+ prbMapElm = &pRbMap->prbMap[sect_id[i]];
+ if (sect_id[i] >= pRbMap->nPrbElm)
+ {
+// print_err("sect_id %d !=pRbMap->nPrbElm %d\n", sect_id[i], pRbMap->nPrbElm);
+ ret_data[i] = MBUF_FREE;
+ continue;
+ }
+ }
+ else
+ {
+// print_err("pRbMap==NULL\n");
+ ret_data[i] = MBUF_FREE;
+ continue;
+ }
+
+ if (pRbMap->nPrbElm == 1)
+ {
+ p_dev_ctx->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][CC_ID[i]][Ant_ID[i]].sBufferList.pBuffers[symb_id[i]].pData = iq_samp_buf[i];
+ p_dev_ctx->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][CC_ID[i]][Ant_ID[i]].sBufferList.pBuffers[symb_id[i]].pCtrl = pkt_q[i];
+ ret_data[i] = MBUF_KEEP;
+ }
+ else
+ {
+ struct xran_section_desc* p_sec_desc = NULL;
+ prbMapElm = &pRbMap->prbMap[sect_id[i]];
+ p_sec_desc = prbMapElm->p_sec_desc[symb_id[i]][0];
+
+ if (p_sec_desc)
+ {
+ mb = p_sec_desc->pCtrl;
+ if (mb) {
+ rte_pktmbuf_free(mb);
+ }
+ p_sec_desc->pCtrl = pkt_q[i];
+ p_sec_desc->pData = iq_samp_buf[i];
+ p_sec_desc->start_prbu = start_prbu[i];
+ p_sec_desc->num_prbu = num_prbu[i];
+ p_sec_desc->iq_buffer_len = num_bytes_pusch[i];
+ p_sec_desc->iq_buffer_offset = iq_offset[i];
+ ret_data[i] = MBUF_KEEP;
+ }
+ else
+{
+// print_err("p_sec_desc==NULL tti %u ant %d symb_id %d\n", tti, Ant_ID[i], symb_id[i]);
+ ret_data[i] = MBUF_FREE;
+ }
+ }
+ }
+ }
+ else
+ {
+ for (j = 0; j < num_pusch; j++)
+ {
+ i = pusch_idx[j];
+
+ iq_sample_size_bits = 16;
+ if (expect_comp)
+ iq_sample_size_bits = iqWidth[i];
+
+ tti = frame_id[i] * SLOTS_PER_SYSTEMFRAME(p_dev_ctx->interval_us_local) +
+ subframe_id[i] * SLOTNUM_PER_SUBFRAME(p_dev_ctx->interval_us_local) + slot_id[i];
+
+ pRbMap = (struct xran_prb_map*)p_dev_ctx->sFrontHaulRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][CC_ID[i]][Ant_ID[i]].sBufferList.pBuffers->pData;
+
+ if (pRbMap)
+ {
+ prbMapElm = &pRbMap->prbMap[sect_id[i]];
+ if (sect_id[i] >= pRbMap->nPrbElm)
+ {
+// print_err("sect_id %d !=pRbMap->nPrbElm %d\n", sect_id[i], pRbMap->nPrbElm);
+ ret_data[i] = MBUF_FREE;
+ continue;
+ }
+ }
+ else
+ {
+// print_err("pRbMap==NULL\n");
+ ret_data[i] = MBUF_FREE;
+ continue;
+ }
+
+ if (pRbMap->nPrbElm == 1)
+ {
+ p_dev_ctx->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][CC_ID[i]][Ant_ID[i]].sBufferList.pBuffers[symb_id[i]].pData = iq_samp_buf[i];
+ p_dev_ctx->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][CC_ID[i]][Ant_ID[i]].sBufferList.pBuffers[symb_id[i]].pCtrl = pkt_q[i];
+ ret_data[i] = MBUF_KEEP;
+ }
+ else
+ {
+ struct xran_section_desc* p_sec_desc = NULL;
+ prbMapElm = &pRbMap->prbMap[sect_id[i]];
+ p_sec_desc = prbMapElm->p_sec_desc[symb_id[i]][0];
+
+ if (p_sec_desc)
+ {
+ mb = p_sec_desc->pCtrl;
+ if (mb) {
+ rte_pktmbuf_free(mb);
+ }
+ p_sec_desc->pCtrl = pkt_q[i];
+ p_sec_desc->pData = iq_samp_buf[i];
+ p_sec_desc->start_prbu = start_prbu[i];
+ p_sec_desc->num_prbu = num_prbu[i];
+ p_sec_desc->iq_buffer_len = num_bytes_pusch[i];
+ p_sec_desc->iq_buffer_offset = iq_offset[i];
+ ret_data[i] = MBUF_KEEP;
+ }
+ else
+ {
+// print_err("p_sec_desc==NULL tti %u ant %d symb_id %d\n", tti, Ant_ID[i], symb_id[i]);
+ ret_data[i] = MBUF_FREE;
+ }
+ }
+ }
+ }
+ return MBUF_FREE;