X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=o-du%2Fphy.git;a=blobdiff_plain;f=fhi_lib%2Flib%2Fsrc%2Fxran_cp_api.c;fp=fhi_lib%2Flib%2Fsrc%2Fxran_cp_api.c;h=4498b33c1ba4099796cff13bb0dfbe63fbccd04b;hp=02ba81c8ba9d4d7289e2db9f673f3f6c4f3cdd02;hb=892daba4c616407f16506415d5a69549519ef11d;hpb=76b4495d593ccf45d712db1a3ec96fa9d2d8f5f5 diff --git a/fhi_lib/lib/src/xran_cp_api.c b/fhi_lib/lib/src/xran_cp_api.c index 02ba81c..4498b33 100644 --- a/fhi_lib/lib/src/xran_cp_api.c +++ b/fhi_lib/lib/src/xran_cp_api.c @@ -37,7 +37,7 @@ #include "xran_compression.h" #include "xran_dev.h" -PSECTION_DB_TYPE p_sectiondb[XRAN_PORTS_NUM] = {NULL, NULL, NULL, NULL}; +PSECTION_DB_TYPE p_sectiondb[XRAN_PORTS_NUM] = {NULL, NULL, NULL, NULL,NULL, NULL, NULL, NULL}; static const uint8_t zeropad[XRAN_SECTIONEXT_ALIGN] = { 0, 0, 0, 0 }; static const uint8_t bitmask[] = { 0x00, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; @@ -280,6 +280,39 @@ xran_cp_add_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t rupo return (XRAN_STATUS_SUCCESS); } + +struct xran_section_info * +xran_cp_get_section_info_ptr(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id) +{ + struct xran_sectioninfo_db *ptr; + struct xran_section_info *list; + + ptr = xran_get_section_db(pHandle, dir, cc_id, ruport_id, ctx_id); + if(unlikely(ptr == NULL)) { + return NULL; + } + + if(unlikely(ptr->cur_index >= XRAN_MAX_NUM_SECTIONS)) { + print_err("No more space to add section information!"); + return NULL; + } + + list = xran_get_section_info(ptr, ptr->cur_index); + if (list) + { + ptr->cur_index++; + return list; + } + else + { + print_err("Null list in section db\n!"); + return NULL; + } + +} + + + int32_t xran_cp_add_multisection_info(void *pHandle, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id, struct xran_cp_gen_params *gen_info) { @@ -305,7 +338,7 @@ xran_cp_add_multisection_info(void *pHandle, uint8_t cc_id, uint8_t ruport_id, u if (list) { for(i=0; isections[i].info, sizeof(struct xran_section_info)); + memcpy(&list[i], gen_info->sections[i].info, sizeof(struct xran_section_info)); ptr->cur_index++; } } @@ -343,26 +376,17 @@ xran_cp_add_multisection_info(void *pHandle, uint8_t cc_id, uint8_t ruport_id, u struct xran_section_info * xran_cp_find_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id, uint16_t section_id) { - int32_t index, num_index; struct xran_sectioninfo_db *ptr; ptr = xran_get_section_db(pHandle, dir, cc_id, ruport_id, ctx_id); if(unlikely(ptr == NULL)) return (NULL); - if(ptr->cur_index > XRAN_MAX_NUM_SECTIONS) - num_index = XRAN_MAX_NUM_SECTIONS; - else - num_index = ptr->cur_index; - - for(index=0; index < num_index; index++) { - if(ptr->list[index].id == section_id) { - return (xran_get_section_info(ptr, index)); + if(section_id > ptr->cur_index || section_id < 0) + { + print_err("No section ID in the list - %d, ptr->cur_index is %d", section_id, ptr->cur_index); } - } - - print_dbg("No section ID in the list - %d", section_id); - return (NULL); + return (xran_get_section_info(ptr, section_id)); } /** @@ -431,7 +455,6 @@ xran_cp_iterate_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t int32_t xran_cp_getsize_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id) { - int32_t index; struct xran_sectioninfo_db *ptr; ptr = xran_get_section_db(pHandle, dir, cc_id, ruport_id, ctx_id); @@ -478,22 +501,23 @@ xran_cp_reset_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ru int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination buffer */ uint16_t ext1_dst_len, /**< dest buffer size */ int16_t *p_bfw_iq_src, /**< source buffer of IQs */ - uint16_t rbNum, /* number RBs to ext1 chain */ - uint16_t bfwNumPerRb, /* number of bf weights per RB (i.e. antenna elements) */ - uint8_t bfwiqWidth, /* bit size of IQs */ - uint8_t bfwCompMeth) /* compression method */ + struct xran_prb_elm *p_pRbMapElm) { struct xran_cp_radioapp_section_ext1 *p_ext1; - uint8_t *p_bfw_content = NULL; int32_t parm_size = 0; int32_t bfw_iq_bits = 0; int32_t total_len = 0; - int32_t comp_len = 0; - uint8_t ext_flag = XRAN_EF_F_ANOTHER_ONE; - int16_t idxRb = 0; + uint16_t idxSection = 0; + int32_t section_len = 0; + int16_t numCPSections = (p_pRbMapElm->bf_weight.numSetBFWs == 0 ? 1 : p_pRbMapElm->bf_weight.numSetBFWs); + int16_t cur_ext_len = 0; int8_t *p_ext1_dst_cur = NULL; + int16_t bfwNumPerRb = p_pRbMapElm->bf_weight.nAntElmTRx; + uint8_t bfwiqWidth = p_pRbMapElm->bf_weight.bfwIqWidth; + uint8_t bfwCompMeth = p_pRbMapElm->bf_weight.bfwCompMeth; + struct xran_cp_radioapp_section1 *p_section1; struct xranlib_compress_request bfp_com_req; struct xranlib_compress_response bfp_com_rsp; @@ -509,16 +533,27 @@ int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination else return (XRAN_STATUS_INVALID_PARAM); - /* create extType=1 section for each RB */ - for (idxRb = 0; idxRb < rbNum; idxRb++) { - print_dbg("%s RB %d\n", __FUNCTION__, idxRb); + /* create section for each PRB bundle */ + for (idxSection = 0; idxSection < numCPSections ; idxSection++) { + print_dbg("%s Section %d\n", __FUNCTION__, idxSection); if(total_len >= ext1_dst_len){ print_err("p_ext1_dst overflow\n"); - return -1; + return XRAN_STATUS_RESOURCE; + } + + cur_ext_len = 0; + p_section1 = (struct xran_cp_radioapp_section1 *)p_ext1_dst_cur; + if(p_section1 == NULL) { + print_err("p_section is null!\n"); + return (XRAN_STATUS_INVALID_PARAM); } - cur_ext_len = 0; /** populate one extType=1 section with BFW for 1 RB */ + section_len = sizeof(struct xran_cp_radioapp_section1); + + p_ext1_dst_cur = p_ext1_dst_cur + section_len; + total_len += section_len; + parm_size = sizeof(struct xran_cp_radioapp_section_ext1); p_ext1 = (struct xran_cp_radioapp_section_ext1 *)p_ext1_dst_cur; if(p_ext1 == NULL) { @@ -528,11 +563,8 @@ int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination cur_ext_len += parm_size; - if(idxRb+1 == rbNum) - ext_flag = XRAN_EF_F_LAST; - p_ext1->extType = XRAN_CP_SECTIONEXTCMD_1; - p_ext1->ef = ext_flag; + p_ext1->ef = XRAN_EF_F_LAST; //only one ext-1 per CP section p_ext1->bfwCompMeth = bfwCompMeth; p_ext1->bfwIqWidth = XRAN_CONVERT_BFWIQWIDTH(bfwiqWidth); @@ -552,7 +584,7 @@ int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination print_dbg("req 0x%08p iqWidth %d\n",bfp_com_req.data_in, bfp_com_req.iqWidth); - parm_size = 1; /* exponent as part of bfwCompParam 1 octet */ + parm_size = 1; /* (reserved + exponent) as part of bfwCompParam 1 octet */ break; case XRAN_BFWCOMPMETHOD_BLKSCALE: rte_panic("XRAN_BFWCOMPMETHOD_BLKSCALE"); @@ -585,13 +617,13 @@ int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination parm_size++; print_dbg("copy BF W %p -> %p size %d \n", p_bfw_iq_src, p_bfw_content, parm_size); - if (p_ext1->bfwIqWidth == 0 || p_ext1->bfwIqWidth == 16){ + + if (p_ext1->bfwCompMeth == XRAN_BFWCOMPMETHOD_NONE){ //5.4.7.1.1 memcpy(p_bfw_content, p_bfw_iq_src, parm_size); } else { bfp_com_rsp.data_out = (int8_t*)p_bfw_content; if(xranlib_compress_bfw(&bfp_com_req, &bfp_com_rsp) == 0){ - comp_len = bfp_com_rsp.len; - print_dbg("comp_len %d parm_size %d\n", comp_len, parm_size); + print_dbg("comp_len %d parm_size %d\n", bfp_com_rsp.len, parm_size); } else { print_err("compression failed\n"); return (XRAN_STATUS_FAIL); @@ -604,8 +636,8 @@ int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination parm_size = cur_ext_len % XRAN_SECTIONEXT_ALIGN; if(parm_size) { parm_size = XRAN_SECTIONEXT_ALIGN - parm_size; - p_bfw_content = (uint8_t *)(p_bfw_content + parm_size); memcpy(p_bfw_content, zeropad, RTE_MIN(parm_size, sizeof(zeropad))); + p_bfw_content += parm_size; cur_ext_len += parm_size; print_dbg("zeropad %d cur_ext_len %d\n", parm_size, cur_ext_len); } @@ -614,14 +646,14 @@ int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination rte_panic("ext1 should be aligned on 4-bytes boundary"); p_ext1->extLen = cur_ext_len / XRAN_SECTIONEXT_ALIGN; - print_dbg("[%d] %p iq %p p_ext1->extLen %d\n",idxRb, p_ext1, p_ext1+1, p_ext1->extLen); + print_dbg("%p iq %p p_ext1->extLen %d\n",p_ext1, p_ext1+1, p_ext1->extLen); /* update for next RB */ p_ext1_dst_cur += cur_ext_len; p_bfw_iq_src = p_bfw_iq_src + bfwNumPerRb*2; total_len += cur_ext_len; - } + } /*for(idxSection < numCPSections */ print_dbg("total_len %d\n", total_len); return (total_len); @@ -886,6 +918,30 @@ xran_prepare_sectionext_4(struct rte_mbuf *mbuf, struct xran_sectionext4_info *p return (parm_size); } +static int32_t +xran_prepare_sectionext_9(struct rte_mbuf *mbuf, struct xran_sectionext9_info * params, int32_t last_flag) +{ + struct xran_cp_radioapp_section_ext9 *ext9; + int32_t parm_size; + + parm_size = sizeof(struct xran_cp_radioapp_section_ext9); + ext9 = (struct xran_cp_radioapp_section_ext9 *)rte_pktmbuf_append(mbuf, parm_size); + if(ext9 == NULL) { + print_err("Fail to allocate the space for section extension 9"); + return(XRAN_STATUS_RESOURCE); + } + + ext9->extType = XRAN_CP_SECTIONEXTCMD_9; + ext9->ef = last_flag; + ext9->extLen = parm_size / XRAN_SECTIONEXT_ALIGN; + ext9->technology = params->technology; + ext9->reserved = params->reserved; + + *(uint32_t *)ext9 = rte_cpu_to_be_32(*(uint32_t*)ext9); + + return (parm_size); +} + static int32_t xran_prepare_sectionext_5(struct rte_mbuf *mbuf, struct xran_sectionext5_info *params, int32_t last_flag) { @@ -1100,7 +1156,7 @@ xran_cp_estimate_max_set_bfws(uint8_t numBFWs, uint8_t iqWidth, uint8_t compMeth /* Exclude headers can be present */ avail_len = mtu - ( RTE_PKTMBUF_HEADROOM \ + sizeof(struct xran_ecpri_hdr) \ - + sizeof(struct xran_cp_radioapp_common_header) \ + + sizeof(struct xran_cp_radioapp_section1_header) \ + sizeof(struct xran_cp_radioapp_section1) \ + sizeof(union xran_cp_radioapp_section_ext6) \ + sizeof(union xran_cp_radioapp_section_ext10) ); @@ -1134,7 +1190,7 @@ xran_cp_get_hdroffset_section1(uint32_t exthdr_size) hdr_len = ( RTE_PKTMBUF_HEADROOM \ + sizeof(struct xran_ecpri_hdr) \ - + sizeof(struct xran_cp_radioapp_common_header) \ + + sizeof(struct xran_cp_radioapp_section1_header) \ + sizeof(struct xran_cp_radioapp_section1) \ + exthdr_size ); return (hdr_len); @@ -1200,7 +1256,7 @@ int32_t xran_cp_prepare_ext11_bfws(uint8_t numSetBFW, uint8_t numBFW, hdr_offset = xran_cp_get_hdroffset_section1(sizeof(union xran_cp_radioapp_section_ext11)); /* Copy BFWs to destination buffer */ - ptr = dst + hdr_offset + 2; + ptr = dst + hdr_offset; switch(compMeth) { /* No compression */ case XRAN_BFWCOMPMETHOD_NONE: @@ -1364,7 +1420,7 @@ xran_prepare_sectionext_11(struct rte_mbuf *mbuf, */ int32_t xran_append_section_extensions(struct rte_mbuf *mbuf, struct xran_section_gen_info *params) { - int32_t i, ret; + int32_t i; uint32_t totalen; int32_t last_flag; int32_t ext_size; @@ -1376,13 +1432,10 @@ int32_t xran_append_section_extensions(struct rte_mbuf *mbuf, struct xran_sectio totalen = 0; - ret = XRAN_STATUS_SUCCESS; - print_dbg("params->exDataSize %d\n", params->exDataSize); for(i=0; i < params->exDataSize; i++) { if(params->exData[i].data == NULL) { print_err("Invalid parameter - extension data %d is NULL", i); - ret = XRAN_STATUS_INVALID_PARAM; continue; } @@ -1407,6 +1460,9 @@ int32_t xran_append_section_extensions(struct rte_mbuf *mbuf, struct xran_sectio case XRAN_CP_SECTIONEXTCMD_6: ext_size = xran_prepare_sectionext_6(mbuf, params->exData[i].data, last_flag); break; + case XRAN_CP_SECTIONEXTCMD_9: + ext_size = xran_prepare_sectionext_9(mbuf, params->exData[i].data, last_flag); + break; case XRAN_CP_SECTIONEXTCMD_10: ext_size = xran_prepare_sectionext_10(mbuf, params->exData[i].data, last_flag); break; @@ -1415,7 +1471,6 @@ int32_t xran_append_section_extensions(struct rte_mbuf *mbuf, struct xran_sectio break; default: print_err("Extension Type %d is not supported!", params->exData[i].type); - ret = XRAN_STATUS_INVALID_PARAM; ext_size = 0; } @@ -1445,20 +1500,20 @@ static int32_t xran_prepare_section0(struct xran_cp_radioapp_section0 *section, struct xran_section_gen_info *params) { #if (XRAN_STRICT_PARM_CHECK) - if(unlikely(params->info.numSymbol > XRAN_SYMBOLNUMBER_MAX)) { - print_err("Invalid number of Symbols - %d", params->info.numSymbol); + if(unlikely(params->info->numSymbol > XRAN_SYMBOLNUMBER_MAX)) { + print_err("Invalid number of Symbols - %d", params->info->numSymbol); return (XRAN_STATUS_INVALID_PARAM); } #endif - section->hdr.u1.common.sectionId = params->info.id; - section->hdr.u1.common.rb = params->info.rb; - section->hdr.u1.common.symInc = params->info.symInc; - section->hdr.u1.common.startPrbc = params->info.startPrbc; - section->hdr.u1.common.numPrbc = XRAN_CONVERT_NUMPRBC(params->info.numPrbc); + section->hdr.u1.common.sectionId = params->info->id; + section->hdr.u1.common.rb = params->info->rb; + section->hdr.u1.common.symInc = params->info->symInc; + section->hdr.u1.common.startPrbc = params->info->startPrbc; + section->hdr.u1.common.numPrbc = XRAN_CONVERT_NUMPRBC(params->info->numPrbc); - section->hdr.u.s0.reMask = params->info.reMask; - section->hdr.u.s0.numSymbol = params->info.numSymbol; + section->hdr.u.s0.reMask = params->info->reMask; + section->hdr.u.s0.numSymbol = params->info->numSymbol; section->hdr.u.s0.reserved = 0; // for network byte order @@ -1507,32 +1562,32 @@ xran_prepare_section1(struct xran_cp_radioapp_section1 *section, struct xran_section_gen_info *params) { #if (XRAN_STRICT_PARM_CHECK) - if(unlikely(params->info.numSymbol > XRAN_SYMBOLNUMBER_MAX)) { - print_err("Invalid number of Symbols - %d", params->info.numSymbol); + if(unlikely(params->info->numSymbol > XRAN_SYMBOLNUMBER_MAX)) { + print_err("Invalid number of Symbols - %d", params->info->numSymbol); return (XRAN_STATUS_INVALID_PARAM); } #endif - /*section->hdr.u1.common.sectionId = params->info.id; - section->hdr.u1.common.rb = params->info.rb; - section->hdr.u1.common.symInc = params->info.symInc; - section->hdr.u1.common.startPrbc = params->info.startPrbc; - section->hdr.u1.common.numPrbc = XRAN_CONVERT_NUMPRBC(params->info.numPrbc); - - section->hdr.u.s1.reMask = params->info.reMask; - section->hdr.u.s1.numSymbol = params->info.numSymbol; - section->hdr.u.s1.beamId = params->info.beamId; - section->hdr.u.s1.ef = params->info.ef;*/ - - section->hdr.u.first_4byte = (params->info.reMask << xran_cp_radioapp_sec_hdr_sc_ReMask) - | (params->info.numSymbol << xran_cp_radioapp_sec_hdr_sc_NumSym) - | (params->info.ef << xran_cp_radioapp_sec_hdr_sc_Ef) - | (params->info.beamId << xran_cp_radioapp_sec_hdr_sc_BeamID); - section->hdr.u1.second_4byte = (params->info.id << xran_cp_radioapp_sec_hdr_c_SecId) - | (params->info.rb << xran_cp_radioapp_sec_hdr_c_RB) - | (params->info.symInc << xran_cp_radioapp_sec_hdr_c_SymInc) - | (params->info.startPrbc << xran_cp_radioapp_sec_hdr_c_StartPrbc) - | ((XRAN_CONVERT_NUMPRBC(params->info.numPrbc)) << xran_cp_radioapp_sec_hdr_c_NumPrbc); + /*section->hdr.u1.common.sectionId = params->info->id; + section->hdr.u1.common.rb = params->info->rb; + section->hdr.u1.common.symInc = params->info->symInc; + section->hdr.u1.common.startPrbc = params->info->startPrbc; + section->hdr.u1.common.numPrbc = XRAN_CONVERT_NUMPRBC(params->info->numPrbc); + + section->hdr.u.s1.reMask = params->info->reMask; + section->hdr.u.s1.numSymbol = params->info->numSymbol; + section->hdr.u.s1.beamId = params->info->beamId; + section->hdr.u.s1.ef = params->info->ef;*/ + + section->hdr.u.first_4byte = (params->info->reMask << xran_cp_radioapp_sec_hdr_sc_ReMask) + | (params->info->numSymbol << xran_cp_radioapp_sec_hdr_sc_NumSym) + | (params->info->ef << xran_cp_radioapp_sec_hdr_sc_Ef) + | (params->info->beamId << xran_cp_radioapp_sec_hdr_sc_BeamID); + section->hdr.u1.second_4byte = (params->info->id << xran_cp_radioapp_sec_hdr_c_SecId) + | (params->info->rb << xran_cp_radioapp_sec_hdr_c_RB) + | (params->info->symInc << xran_cp_radioapp_sec_hdr_c_SymInc) + | (params->info->startPrbc << xran_cp_radioapp_sec_hdr_c_StartPrbc) + | ((XRAN_CONVERT_NUMPRBC(params->info->numPrbc)) << xran_cp_radioapp_sec_hdr_c_NumPrbc); // for network byte order *((uint64_t *)section) = rte_cpu_to_be_64(*((uint64_t *)section)); @@ -1578,34 +1633,34 @@ xran_prepare_section3(struct xran_cp_radioapp_section3 *section, struct xran_section_gen_info *params) { #if (XRAN_STRICT_PARM_CHECK) - if(unlikely(params->info.numSymbol > XRAN_SYMBOLNUMBER_MAX)) { - print_err("Invalid number of Symbols - %d", params->info.numSymbol); + if(unlikely(params->info->numSymbol > XRAN_SYMBOLNUMBER_MAX)) { + print_err("Invalid number of Symbols - %d", params->info->numSymbol); return (XRAN_STATUS_INVALID_PARAM); } #endif - /*section->hdr.u1.common.sectionId = params->info.id; - section->hdr.u1.common.rb = params->info.rb; - section->hdr.u1.common.symInc = params->info.symInc; - section->hdr.u1.common.startPrbc = params->info.startPrbc; - section->hdr.u1.common.numPrbc = XRAN_CONVERT_NUMPRBC(params->info.numPrbc); - - section->hdr.u.s3.reMask = params->info.reMask; - section->hdr.u.s3.numSymbol = params->info.numSymbol; - section->hdr.u.s3.beamId = params->info.beamId; - section->hdr.u.s3.ef = params->info.ef;*/ - - section->hdr.u.first_4byte = (params->info.reMask << xran_cp_radioapp_sec_hdr_sc_ReMask) - | (params->info.numSymbol << xran_cp_radioapp_sec_hdr_sc_NumSym) - | (params->info.ef << xran_cp_radioapp_sec_hdr_sc_Ef) - | (params->info.beamId << xran_cp_radioapp_sec_hdr_sc_BeamID); - section->hdr.u1.second_4byte = (params->info.id << xran_cp_radioapp_sec_hdr_c_SecId) - | (params->info.rb << xran_cp_radioapp_sec_hdr_c_RB) - | (params->info.symInc << xran_cp_radioapp_sec_hdr_c_SymInc) - | (params->info.startPrbc << xran_cp_radioapp_sec_hdr_c_StartPrbc) - | ((XRAN_CONVERT_NUMPRBC(params->info.numPrbc)) << xran_cp_radioapp_sec_hdr_c_NumPrbc); - - section->freqOffset = rte_cpu_to_be_32(params->info.freqOffset)>>8; + /*section->hdr.u1.common.sectionId = params->info->id; + section->hdr.u1.common.rb = params->info->rb; + section->hdr.u1.common.symInc = params->info->symInc; + section->hdr.u1.common.startPrbc = params->info->startPrbc; + section->hdr.u1.common.numPrbc = XRAN_CONVERT_NUMPRBC(params->info->numPrbc); + + section->hdr.u.s3.reMask = params->info->reMask; + section->hdr.u.s3.numSymbol = params->info->numSymbol; + section->hdr.u.s3.beamId = params->info->beamId; + section->hdr.u.s3.ef = params->info->ef;*/ + + section->hdr.u.first_4byte = (params->info->reMask << xran_cp_radioapp_sec_hdr_sc_ReMask) + | (params->info->numSymbol << xran_cp_radioapp_sec_hdr_sc_NumSym) + | (params->info->ef << xran_cp_radioapp_sec_hdr_sc_Ef) + | (params->info->beamId << xran_cp_radioapp_sec_hdr_sc_BeamID); + section->hdr.u1.second_4byte = (params->info->id << xran_cp_radioapp_sec_hdr_c_SecId) + | (params->info->rb << xran_cp_radioapp_sec_hdr_c_RB) + | (params->info->symInc << xran_cp_radioapp_sec_hdr_c_SymInc) + | (params->info->startPrbc << xran_cp_radioapp_sec_hdr_c_StartPrbc) + | ((XRAN_CONVERT_NUMPRBC(params->info->numPrbc)) << xran_cp_radioapp_sec_hdr_c_NumPrbc); + + section->freqOffset = rte_cpu_to_be_32(params->info->freqOffset)>>8; section->reserved = 0; /* for network byte order (header, 8 bytes) */ @@ -1652,9 +1707,9 @@ xran_prepare_section3_hdr(struct xran_cp_radioapp_section3_header *s3hdr, * XRAN_STATUS_RESOURCE if failed to allocate the space to packet buffer */ int32_t -xran_append_control_section(struct rte_mbuf *mbuf, struct xran_cp_gen_params *params) +xran_append_control_section(struct rte_mbuf *mbuf, struct xran_cp_gen_params *params,uint16_t start_sect_id) { - int32_t i, ret, ext_flag; + int32_t i, ret; uint32_t totalen; void *section; int32_t section_size; @@ -1692,13 +1747,13 @@ xran_append_control_section(struct rte_mbuf *mbuf, struct xran_cp_gen_params *pa return (XRAN_STATUS_INVALID_PARAM); } - for(i=0; i < params->numSections; i++) { + for(i=start_sect_id; i < (start_sect_id + params->numSections); i++) { section = rte_pktmbuf_append(mbuf, section_size); if(section == NULL) { print_err("Fail to allocate the space for section[%d]!", i); return (XRAN_STATUS_RESOURCE); } - print_dbg("%s %d ef %d\n", __FUNCTION__, i, params->sections[i].info.ef); + print_dbg("%s %d ef %d\n", __FUNCTION__, i, params->sections[i].info->ef); ret = xran_prepare_section_func((void *)section, (void *)¶ms->sections[i]); if(ret < 0){ @@ -1707,8 +1762,8 @@ xran_append_control_section(struct rte_mbuf *mbuf, struct xran_cp_gen_params *pa } totalen += section_size; - if(params->sections[i].info.ef) { - print_dbg("sections[%d].info.ef %d exDataSize %d type %d\n", i, params->sections[i].info.ef, + if(params->sections[i].info->ef) { + print_dbg("sections[%d].info.ef %d exDataSize %d type %d\n", i, params->sections[i].info->ef, params->sections[i].exDataSize, params->sections[i].exData[0].type); ret = xran_append_section_extensions(mbuf, ¶ms->sections[i]); if(ret < 0) @@ -1878,7 +1933,8 @@ int32_t xran_prepare_ctrl_pkt(struct rte_mbuf *mbuf, struct xran_cp_gen_params *params, uint8_t CC_ID, uint8_t Ant_ID, - uint8_t seq_id) + uint8_t seq_id, + uint16_t start_sect_id) { int32_t ret; uint32_t payloadlen; @@ -1893,7 +1949,7 @@ xran_prepare_ctrl_pkt(struct rte_mbuf *mbuf, } payloadlen += ret; - ret = xran_append_control_section(mbuf, params); + ret = xran_append_control_section(mbuf, params,start_sect_id); if(ret < 0) { print_err("%s %d\n", __FUNCTION__, ret); return (ret); @@ -1915,7 +1971,7 @@ xran_parse_section_ext1(void *ext, struct xran_sectionext1_info *extinfo) int32_t total_len; struct xran_cp_radioapp_section_ext1 *ext1; uint8_t *data; - int32_t parm_size, iq_size; + int32_t parm_size = 0, iq_size, iq_size_bytes; int32_t N; void *pHandle; @@ -1934,6 +1990,7 @@ xran_parse_section_ext1(void *ext, struct xran_sectionext1_info *extinfo) len += sizeof(struct xran_cp_radioapp_section_ext1); data += sizeof(struct xran_cp_radioapp_section_ext1); + extinfo->p_bfwIQ = (int8_t*)(data); switch(ext1->bfwCompMeth) { case XRAN_BFWCOMPMETHOD_NONE: @@ -1967,14 +2024,16 @@ xran_parse_section_ext1(void *ext, struct xran_sectionext1_info *extinfo) len += parm_size; data += parm_size; + iq_size_bytes = parm_size; /* Get BF weights */ iq_size = N * extinfo->bfwIqWidth * 2; // total in bits parm_size = iq_size>>3; // total in bytes (/8) if(iq_size%8) parm_size++; // round up + iq_size_bytes += parm_size; //memcpy(data, extinfo->p_bfwIQ, parm_size); - extinfo->p_bfwIQ = (int16_t*)data; + extinfo->bfwIQ_sz = iq_size_bytes; len += parm_size; @@ -1983,7 +2042,7 @@ xran_parse_section_ext1(void *ext, struct xran_sectionext1_info *extinfo) len += (XRAN_SECTIONEXT_ALIGN - parm_size); if(len != total_len) { - // TODO: fix this print_err("The size of extension 1 is not correct! [%d:%d]", len, total_len); + print_err("The size of extension 1 is not correct! [%d:%d]", len, total_len); } return (total_len); @@ -2165,7 +2224,6 @@ int32_t xran_parse_section_ext5(void *ext, struct xran_sectionext5_info *extinfo) { - int32_t len; struct xran_cp_radioapp_section_ext_hdr *ext_hdr; struct xran_cp_radioapp_section_ext5 ext5; int32_t parm_size; @@ -2186,7 +2244,6 @@ xran_parse_section_ext5(void *ext, parm_size = XRAN_MAX_MODCOMP_ADDPARMS; } - len = 0; data = (uint8_t *)(ext_hdr + 1); i = 0; @@ -2248,6 +2305,46 @@ xran_parse_section_ext6(void *ext, return (total_len); } +int32_t +xran_parse_section_ext9(void *ext, + struct xran_sectionext9_info *extinfo, struct xran_cp_recv_params *result) +{ + int32_t len = 0; + int32_t total_len; + int8_t dssSlot = 0; + int8_t presumed_technology = -1; + struct xran_cp_radioapp_section_ext9 *ext9; + + ext9 = (struct xran_cp_radioapp_section_ext9 *)ext; + *(uint32_t *)ext9 = rte_be_to_cpu_32(*(uint32_t *)ext9); + + total_len = ext9->extLen * XRAN_SECTIONEXT_ALIGN; + + if(result) { + dssSlot = result->tti % result->dssPeriod; + presumed_technology = result->technology_arr[dssSlot]; + } else { + print_err("\nTechnology verification parameters not received"); + // return (-1); + } + + if(presumed_technology != ext9->technology) { + print_err("\nWrong technology recieved! [%d,%d]", presumed_technology, ext9->technology); + // return (-1); + } + + extinfo->technology = ext9->technology; + extinfo->reserved = ext9->reserved; + + len += sizeof(struct xran_cp_radioapp_section_ext9); + if(len != total_len) { + print_err("\nThe size of extension 9 is not correct! [%d:%d]", len, total_len); + } + + return (total_len); +} + + int32_t xran_parse_section_ext10(void *ext, struct xran_sectionext10_info *extinfo) @@ -2376,7 +2473,7 @@ xran_parse_section_ext11(void *ext, len += (XRAN_SECTIONEXT_ALIGN - parm_size); if(len != total_len) { - print_err("The size of extension 11 is not correct! [%d:%d]", len, total_len); + //print_err("The size of extension 11 is not correct! [%d:%d]", len, total_len); } return (total_len); @@ -2384,9 +2481,10 @@ xran_parse_section_ext11(void *ext, int32_t xran_parse_section_extension(struct rte_mbuf *mbuf, - void *ext, - struct xran_section_recv_info *section) + void *ext, struct xran_cp_recv_params *result, + int32_t section_idx) { + struct xran_section_recv_info *section = &result->sections[section_idx]; int32_t total_len, len, numext; uint8_t *ptr; int32_t flag_last; @@ -2408,6 +2506,7 @@ xran_parse_section_extension(struct rte_mbuf *mbuf, section->exts[numext].type = ext_type; switch(ext_type) { case XRAN_CP_SECTIONEXTCMD_1: + result->ext1count++; len = xran_parse_section_ext1(ptr, §ion->exts[numext].u.ext1); break; case XRAN_CP_SECTIONEXTCMD_2: @@ -2425,6 +2524,9 @@ xran_parse_section_extension(struct rte_mbuf *mbuf, case XRAN_CP_SECTIONEXTCMD_6: len = xran_parse_section_ext6(ptr, §ion->exts[numext].u.ext6); break; + case XRAN_CP_SECTIONEXTCMD_9: + len = xran_parse_section_ext9(ptr, §ion->exts[numext].u.ext9, result); + break; case XRAN_CP_SECTIONEXTCMD_10: len = xran_parse_section_ext10(ptr, §ion->exts[numext].u.ext10); break; @@ -2471,21 +2573,35 @@ xran_parse_section_extension(struct rte_mbuf *mbuf, int32_t xran_parse_cp_pkt(struct rte_mbuf *mbuf, struct xran_cp_recv_params *result, - struct xran_recv_packet_info *pkt_info) + struct xran_recv_packet_info *pkt_info, void* handle, uint32_t *mb_free) { struct xran_ecpri_hdr *ecpri_hdr; struct xran_cp_radioapp_common_header *apphdr; - int32_t i, ret; - int32_t extlen; - + struct xran_common_counters* pCnt = NULL; + struct xran_prb_map *pRbMap = NULL; + struct xran_prb_map *pRbMap_desc = NULL; + struct xran_prb_elm * prbMapElm = NULL; + struct rte_mbuf *mb = NULL; + int32_t i, j, ret, extlen; + int tti = 0,interval = 0; + uint8_t idx = 0, ctx_id = 0; + struct xran_device_ctx * p_dev_ctx = NULL; + struct xran_device_ctx * p_xran_dev_ctx = (struct xran_device_ctx *)handle; + if(unlikely(p_xran_dev_ctx == NULL)){ + print_err("p_xran_dev_ctx is NULL\n"); + return XRAN_STATUS_INVALID_PARAM; + } + p_dev_ctx = xran_dev_get_ctx(); ret = xran_parse_ecpri_hdr(mbuf, &ecpri_hdr, pkt_info); + struct xran_eaxc_info eaxc = pkt_info->eaxc; + struct xran_section_info *info = NULL; if(ret < 0 && ecpri_hdr == NULL) return (XRAN_STATUS_INVALID_PACKET); /* Process radio header. */ apphdr = (void *)rte_pktmbuf_adj(mbuf, sizeof(struct xran_ecpri_hdr)); - if(apphdr == NULL) { - print_err("Invalid packet - radio app hedaer!"); + if(unlikely(apphdr == NULL)) { + print_err("Invalid packet - radio app header!"); return (XRAN_STATUS_INVALID_PACKET); } @@ -2504,7 +2620,12 @@ xran_parse_cp_pkt(struct rte_mbuf *mbuf, result->hdr.startSymId = apphdr->field.startSymbolId; result->sectionType = apphdr->sectionType; result->numSections = apphdr->numOfSections; + result->ext1count = 0; + interval = p_xran_dev_ctx->interval_us_local; + tti = apphdr->field.frameId * SLOTS_PER_SYSTEMFRAME(interval) + apphdr->field.subframeId * SLOTNUM_PER_SUBFRAME(interval) + apphdr->field.slotId; + result->tti = tti; + ctx_id = tti % XRAN_MAX_SECTIONDB_CTX; #if 0 printf("[CP%5d] eAxC[%d:%d:%02d:%02d] %s seq[%03d-%03d-%d] sec[%d-%d] frame[%3d-%2d-%2d] sym%02d\n", pkt_info->payload_len, @@ -2573,7 +2694,7 @@ xran_parse_cp_pkt(struct rte_mbuf *mbuf, result->hdr.compMeth = hdr->udComp.udCompMeth; section = (void *)rte_pktmbuf_adj(mbuf, sizeof(struct xran_cp_radioapp_section1_header)); - if(section == NULL) { + if(unlikely(section == NULL)) { print_err("Invalid packet: section type1 - radio app hedaer!"); return (XRAN_STATUS_INVALID_PACKET); } @@ -2594,20 +2715,96 @@ xran_parse_cp_pkt(struct rte_mbuf *mbuf, section = (void *)rte_pktmbuf_adj(mbuf, sizeof(struct xran_cp_radioapp_section1)); - if(section == NULL) { + if(unlikely(section == NULL)) { print_err("Invalid packet: section type1 - number of section [%d:%d]!", result->numSections, i); result->numSections = i; ret = XRAN_STATUS_INVALID_PACKET; break; } + if (eaxc.ruPortId < p_xran_dev_ctx->srs_cfg.eAxC_offset) + { + struct xran_flat_buffer *pBuffer = NULL; + if(result->dir == 1) + pBuffer = p_xran_dev_ctx->sFHCpRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][eaxc.ccId][eaxc.ruPortId].sBufferList.pBuffers; + else if(result->dir == 0) + pBuffer = p_xran_dev_ctx->sFHCpTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][eaxc.ccId][eaxc.ruPortId].sBufferList.pBuffers; + if(pBuffer) + pRbMap = (struct xran_prb_map *)pBuffer->pData; + if(p_xran_dev_ctx->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][eaxc.ccId][eaxc.ruPortId].sBufferList.pBuffers) + pRbMap_desc = (struct xran_prb_map *) p_xran_dev_ctx->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][eaxc.ccId][eaxc.ruPortId].sBufferList.pBuffers->pData; + + if(i == 0){ + if((pRbMap_desc != NULL) && (pRbMap_desc->nPrbElm <= p_xran_dev_ctx->sectiondb_elm[ctx_id][result->dir][eaxc.ccId][eaxc.ruPortId])){ + p_xran_dev_ctx->sectiondb_elm[ctx_id][result->dir][eaxc.ccId][eaxc.ruPortId]=0; + xran_cp_reset_section_info(handle, result->dir, eaxc.ccId, eaxc.ruPortId, ctx_id); + } + idx = p_xran_dev_ctx->sectiondb_elm[ctx_id][result->dir][eaxc.ccId][eaxc.ruPortId]++; + + if(p_dev_ctx){ + result->numSetBFW = p_dev_ctx->numSetBFWs_arr[idx]; + if(likely(pRbMap!=NULL)){ + prbMapElm = &pRbMap->prbMap[idx]; + mb = prbMapElm->bf_weight.p_ext_start; + if(mb){ + rte_pktmbuf_free(mb); + } + prbMapElm->bf_weight.p_ext_start = mbuf; + prbMapElm->bf_weight.p_ext_section = (void *)section; + *mb_free = MBUF_KEEP; + } + } + } + info = xran_cp_get_section_info_ptr(handle, result->dir, eaxc.ccId, eaxc.ruPortId, ctx_id); + if(likely(info != NULL)) + { + info->prbElemBegin = (i == 0 ) ? 1 : 0; + info->prbElemEnd = (i == (result->numSections -1)) ? 1 : 0; + info->ef = result->sections[i].info.ef; + info->startPrbc = result->sections[i].info.startPrbc; + info->numPrbc = result->sections[i].info.numPrbc; + info->type = result->sections[i].info.type; + info->startSymId = result->hdr.startSymId; + info->iqWidth = result->hdr.iqWidth; + info->compMeth = result->hdr.compMeth; + info->id = result->sections[i].info.id; + info->rb = XRAN_RBIND_EVERY; + info->numSymbol = result->sections[i].info.numSymbol; + info->reMask = 0xfff; + info->beamId = result->sections[i].info.beamId; + info->symInc = XRAN_SYMBOLNUMBER_NOTINC; + + int loc_sym=0; + if(likely(pRbMap_desc != NULL)){ + prbMapElm = &pRbMap_desc->prbMap[idx]; + for(loc_sym = 0; loc_sym < XRAN_NUM_OF_SYMBOL_PER_SLOT; loc_sym++) + { + struct xran_section_desc *p_sec_desc = &prbMapElm->sec_desc[loc_sym][0]; + + if(likely(p_sec_desc!=NULL)) + { + info->sec_desc[loc_sym].iq_buffer_offset = p_sec_desc->iq_buffer_offset; + info->sec_desc[loc_sym].iq_buffer_len = p_sec_desc->iq_buffer_len; + + p_sec_desc->section_id = info->id; + } + else + { + print_err("section desc is NULL\n"); + } + } /* for(loc_sym = 0; loc_sym < XRAN_NUM_OF_SYMBOL_PER_SLOT; loc_sym++) */ + } + } if(result->sections[i].info.ef) { - // parse section extension - extlen = xran_parse_section_extension(mbuf, (void *)section, &result->sections[i]); + result->dssPeriod = p_xran_dev_ctx->dssPeriod; + for( j=0; j< p_xran_dev_ctx->dssPeriod; j++) { + result->technology_arr[j] = p_xran_dev_ctx->technology[j]; + } + extlen = xran_parse_section_extension(mbuf, (void *)section, result, i); if(extlen > 0) { section = (void *)rte_pktmbuf_adj(mbuf, extlen); - if(section == NULL) { + if(unlikely(section == NULL)) { print_err("Invalid packet: section type1 - section extension [%d]!", i); ret = XRAN_STATUS_INVALID_PACKET; break; @@ -2616,6 +2813,67 @@ xran_parse_cp_pkt(struct rte_mbuf *mbuf, } else extlen = 0; } + else if((eaxc.ruPortId >= p_xran_dev_ctx->srs_cfg.eAxC_offset) && p_xran_dev_ctx->fh_cfg.srsEnable){ + int32_t ant_id = ((eaxc.ruPortId - p_xran_dev_ctx->srs_cfg.eAxC_offset) & 0x3F); /*Klocwork fix*/ + if(p_xran_dev_ctx->sFHSrsRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][eaxc.ccId][ant_id].sBufferList.pBuffers){ + pRbMap_desc = (struct xran_prb_map *) p_xran_dev_ctx->sFHSrsRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][eaxc.ccId][ant_id].sBufferList.pBuffers->pData; + } + if(i == 0){ + if((pRbMap_desc != NULL) && (pRbMap_desc->nPrbElm <= p_xran_dev_ctx->sectiondb_elm[ctx_id][result->dir][eaxc.ccId][eaxc.ruPortId])){ + p_xran_dev_ctx->sectiondb_elm[ctx_id][result->dir][eaxc.ccId][eaxc.ruPortId]=0; + xran_cp_reset_section_info(handle, result->dir, eaxc.ccId, eaxc.ruPortId, ctx_id); + } + idx = p_xran_dev_ctx->sectiondb_elm[ctx_id][result->dir][eaxc.ccId][eaxc.ruPortId]++; + } + info = xran_cp_get_section_info_ptr(handle, result->dir, eaxc.ccId, eaxc.ruPortId, ctx_id); + if(likely(info != NULL)) + { + info->prbElemBegin = (i == 0 ) ? 1 : 0; + info->prbElemEnd = (i == (result->numSections -1)) ? 1 : 0; + info->ef = result->sections[i].info.ef; + info->type = result->sections[i].info.type; + info->startSymId = result->hdr.startSymId; + info->iqWidth = result->hdr.iqWidth; + info->compMeth = result->hdr.compMeth; + info->id = result->sections[i].info.id; + info->rb = XRAN_RBIND_EVERY; + info->numSymbol = result->sections[i].info.numSymbol; + info->reMask = 0xfff; + info->beamId = result->sections[i].info.beamId; + info->symInc = XRAN_SYMBOLNUMBER_NOTINC; + int loc_sym=0; + if(likely(pRbMap_desc != NULL)){ + prbMapElm = &pRbMap_desc->prbMap[idx]; + info->startPrbc = prbMapElm->nRBStart; + info->numPrbc = prbMapElm->nRBSize; + + struct xran_section_desc *p_sec_desc = NULL; + for(loc_sym = 0; loc_sym < XRAN_NUM_OF_SYMBOL_PER_SLOT; loc_sym++) + { + p_sec_desc = &prbMapElm->sec_desc[loc_sym][0]; + + if(likely(p_sec_desc!=NULL)) + { + info->sec_desc[loc_sym].iq_buffer_offset = p_sec_desc->iq_buffer_offset; + info->sec_desc[loc_sym].iq_buffer_len = p_sec_desc->iq_buffer_len; + p_sec_desc->section_id = info->id; + } + else + { + print_err("section desc is NULL\n"); + } + } /* for(loc_sym = 0; loc_sym < XRAN_NUM_OF_SYMBOL_PER_SLOT; loc_sym++) */ + } + } + /*Assuming SRS CP will not have extension, removed the ef flag check and extension processing*/ + } + } + pCnt = &p_xran_dev_ctx->fh_counters; + /* SRS should not have extension */ + if(pCnt && (result->sections[0].info.ef) && (result->sections[0].exts[0].type == 1) && (result->numSections != result->numSetBFW) && (result->ext1count != result->numSetBFW)){ + print_err("extension 1 is not Valid! [%d:%d:%d]", result->numSections, result->numSetBFW, result->ext1count); + pCnt->rx_invalid_ext1_packets++; + } } break; @@ -2670,7 +2928,7 @@ xran_parse_cp_pkt(struct rte_mbuf *mbuf, if(result->sections[i].info.ef) { // parse section extension - extlen = xran_parse_section_extension(mbuf, (void *)section, &result->sections[i]); + extlen = xran_parse_section_extension(mbuf, (void *)section, result, i); if(extlen > 0) { section = (void *)rte_pktmbuf_adj(mbuf, extlen); if(section == NULL) {