diff --git a/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf index b066c27810..c01c9afc79 100644 --- a/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf +++ b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf @@ -251,7 +251,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("98:ae:71:04:83:e3", "98:ae:71:04:83:e3"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (285, 470); T1a_cp_ul = (285, 429); diff --git a/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf index ee2930f8ad..885f561bec 100644 --- a/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf +++ b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf @@ -258,7 +258,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (419, 470); T1a_cp_ul = (285, 336); diff --git a/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch b/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch index 6d68225bbf..ba10bf38af 100644 --- a/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch +++ b/cmake_targets/tools/oran_fhi_integration_patches/F/oaioran_F.patch @@ -1,5 +1,5 @@ diff --git a/fhi_lib/app/src/common.h b/fhi_lib/app/src/common.h -index ac5f471..94c2d7c 100644 +index ac5f471..ed9ab7d 100644 --- a/fhi_lib/app/src/common.h +++ b/fhi_lib/app/src/common.h @@ -28,7 +28,7 @@ @@ -7,7 +7,7 @@ index ac5f471..94c2d7c 100644 #include -#define VERSIONX "oran_f_release_v1.0" -+#define VERSIONX "oran_f_release_v1.6" ++#define VERSIONX "oran_f_release_v1.7" #define APP_O_DU 0 #define APP_O_RU 1 @@ -173,7 +173,7 @@ index eccc4ae..a97fdc6 100644 CPP_FLAGS_FULL := $(CPP_FLAGS) $(CPP_COMP) $(INC) $(DEF) CPP_FLAGS_FULL_SNC := $(CPP_FLAGS) $(CPP_COMP_SNC) $(INC) $(DEF) diff --git a/fhi_lib/lib/api/xran_fh_o_du.h b/fhi_lib/lib/api/xran_fh_o_du.h -index bacf597..2aeaaae 100644 +index bacf597..18597d6 100644 --- a/fhi_lib/lib/api/xran_fh_o_du.h +++ b/fhi_lib/lib/api/xran_fh_o_du.h @@ -141,8 +141,8 @@ extern "C" { @@ -182,7 +182,7 @@ index bacf597..2aeaaae 100644 -#define XRAN_MAX_FRAGMENT (4) /**< Max number of fragmentations in single symbol */ -#define XRAN_MAX_SET_BFWS (64) /**< Assumed 64Ant, BFP 9bit with 9K jumbo frame */ -+#define XRAN_MAX_FRAGMENT (6) /**< Max number of fragmentations in single symbol */ ++#define XRAN_MAX_FRAGMENT (7) /**< Max number of fragmentations in single symbol */ +#define XRAN_MAX_SET_BFWS (1) //(64) /**< Assumed 64Ant, BFP 9bit with 9K jumbo frame */ #define XRAN_MAX_PKT_BURST (448+4) /**< 4x14x8 symbols per ms */ diff --git a/doc/ORAN_FHI7.2_Tutorial.md b/doc/ORAN_FHI7.2_Tutorial.md index 0443089e47..e3bb8e44c1 100644 --- a/doc/ORAN_FHI7.2_Tutorial.md +++ b/doc/ORAN_FHI7.2_Tutorial.md @@ -526,7 +526,7 @@ Contact the RU vendor and get the configuration manual to understand the below c The OAI configuration file [`gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf) corresponds to: - TDD pattern `DDDSU`, 2.5ms - Bandwidth 100MHz -- MTU 9600 +- MTU 9216 - 4TX4R ##### RU configuration @@ -552,7 +552,7 @@ dl_ul_tuning_special_slot=0xfd00000 The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf) corresponds to: - TDD pattern `DDDDDDDSUU`, 5ms - Bandwidth 100MHz -- MTU 9600 +- MTU 9216 - 4TX4R ##### RU configuration @@ -579,7 +579,7 @@ The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-liteon.conf`](../tar - TDD pattern `DDDSU`, 2.5ms - Bandwidth 100MHz - MTU 1500 -- MTU 9600: v02.00.10 +- MTU 9216: v02.00.10 ##### RU configuration @@ -618,7 +618,7 @@ jumboframe 1 # enable jumbo frame The OAI configuration file [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) corresponds to: - TDD pattern `DDDSU`, 2.5ms - Bandwidth 100MHz -- MTU 9600 +- MTU 9216 ##### RU configuration @@ -692,7 +692,7 @@ At this stage, RU must be rebooted so the changes apply. The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4X4-foxconn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4X4-foxconn.conf) corresponds to: - TDD pattern `DDDSU`, 2.5ms - Bandwidth 100MHz -- MTU 9600 +- MTU 9216 ##### RU configuration @@ -895,7 +895,7 @@ We recommand to put the above four steps into one script file to quickly repeat set -x IF_NAME=eno12409 MAX_RING_BUFFER_SIZE=4096 -MTU=9600 +MTU=9216 DU_U_PLANE_MAC_ADD=00:11:22:33:44:66 DU_C_PLANE_MAC_ADD=00:11:22:33:44:67 VLAN=3 @@ -931,12 +931,13 @@ Sample configuration files for OAI gNB, specific to the manufacturer of the radi 2. VVDN RU: [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) [`gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf) -[`gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf) +[`gnb.sa.band77.273prb.fhi72.2x2-vvdn-16b.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn-16b.conf) 3. Benetel 650 RU: [`gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf) 4. Benetel 550 RU: [`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf) [`gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf) +[`gnb.sa.band78.273prb.fhi72.2x2-benetel550-16b.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.2x2-benetel550-16b.conf) - only with E release; with F, UL U-plane fragmentation is not correct 5. Metanoia RU: [`gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf) @@ -970,7 +971,7 @@ Edit the sample OAI gNB configuration file and check following parameters: * `io_core`: absolute CPU core ID for XRAN library, it should be an isolated core, in our environment we are using CPU 4 * `worker_cores`: array of absolute CPU core IDs for XRAN library, they should be isolated cores, in our environment we are using CPU 2 * `ru_addr`: RU U- and C-plane MAC-addresses (format `UU:VV:WW:XX:YY:ZZ`, hexadecimal numbers) - * `mtu`: Maximum Transmission Unit for the RU, specified by RU vendor; either 1500 or 9600 B (Jumbo Frames); if not set, 1500 is used + * `mtu`: Maximum Transmission Unit for the RU, specified by RU vendor; either 1500 or 9600 B (Jumbo Frames); if not set, 1500 is used; if the testbed contains a switch, and its max supported MTU < 9600, then please set the same value in the config file as well * `file_prefix` : used to specify a unique prefix for shared memory and files created by multiple DPDK processes; if not set, default value of `wls_0` is used * `dpdk_mem_size`: the huge page size that should be pre-allocated by DPDK _for NUMA node 0_; by default, this is 8192 MiB (corresponding to 8 huge @@ -1171,7 +1172,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46","8c:1f:64:d1:10:43","8c:1f:64:d1:10:43") - mtu = 9600; + mtu = 9216; fh_config = ( # RAN650 #1 { @@ -1587,11 +1588,11 @@ sequenceDiagram [HW] [MPLANE] Watchdog timer answer: 2025-03-30T08:52:31+02:00 -[HW] [MPLANE] Interface MTU 1500 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9600. +[HW] [MPLANE] Interface MTU 1500 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9216. [HW] [MPLANE] IQ bitwidth 16 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9. [HW] [MPLANE] Storing the following information to forward to xran: RU MAC address 8c:1f:64:d1:11:c0 - MTU 9600 + MTU 9216 IQ bitwidth 9 PRACH offset 4 DU port bitmask 61440 @@ -2238,11 +2239,11 @@ sequenceDiagram [HW] [MPLANE] Watchdog timer answer: 2025-08-29T06:49:32+02:00 -[HW] [MPLANE] Interface MTU 1500 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9600. +[HW] [MPLANE] Interface MTU 1500 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9216. [HW] [MPLANE] IQ bitwidth 16 unreliable/not correctly reported by Benetel O-RU, hardcoding to 9. [HW] [MPLANE] Storing the following information to forward to xran: RU MAC address 70:b3:d5:e1:5b:81 - MTU 9600 + MTU 9216 IQ bitwidth 9 PRACH offset 4 DU port bitmask 61440 diff --git a/radio/fhi_72/CMakeLists.txt b/radio/fhi_72/CMakeLists.txt index 6e918650e5..c0546aaca8 100644 --- a/radio/fhi_72/CMakeLists.txt +++ b/radio/fhi_72/CMakeLists.txt @@ -17,7 +17,7 @@ add_library(oran_fhlib_5g MODULE ) set(E_VERSION 5.1.6) -set(F_VERSION 6.1.6) +set(F_VERSION 6.1.7) find_package(xran REQUIRED) if(xran_VERSION VERSION_EQUAL E_VERSION) diff --git a/radio/fhi_72/oaioran.c b/radio/fhi_72/oaioran.c index 33c3a6970c..520191186e 100644 --- a/radio/fhi_72/oaioran.c +++ b/radio/fhi_72/oaioran.c @@ -363,7 +363,6 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot) read_prach_data(ru, *frame, *slot); const struct xran_fh_init *fh_init = get_xran_fh_init(); - int nPRBs = fh_cfg->nULRBs; int fftsize = 1 << fh_cfg->nULFftSize; int slot_offset_rxdata = 3 & (*slot); @@ -386,93 +385,110 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot) if (!is_tdd_ul_symbol(frame_conf, *slot, sym_idx)) continue; - uint8_t *pData; oran_buf_list_t *bufs = get_xran_buffers(ant_id / nb_rx_per_ru); uint8_t *pPrbMapData = bufs->dstcp[ant_id % nb_rx_per_ru][tti % XRAN_N_FE_BUF_LEN].pBuffers->pData; - struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData; + struct xran_prb_map *pRbMap = (struct xran_prb_map *)pPrbMapData; - struct xran_prb_elm *pRbElm = &pPrbMap->prbMap[0]; -#ifdef E_RELEASE - struct xran_section_desc *p_sec_desc = pRbElm->p_sec_desc[sym_idx][0]; -#elif defined F_RELEASE - struct xran_section_desc *p_sec_desc = &pRbElm->sec_desc[sym_idx][0]; -#endif - uint32_t one_rb_size = - (((pRbElm->iqWidth == 0) || (pRbElm->iqWidth == 16)) ? (N_SC_PER_PRB * 2 * 2) : (3 * pRbElm->iqWidth + 1)); - if (fh_init->mtu < pRbElm->nRBSize * one_rb_size) - pData = bufs->dst[ant_id % nb_rx_per_ru][tti % XRAN_N_FE_BUF_LEN] - .pBuffers[sym_idx % XRAN_NUM_OF_SYMBOL_PER_SLOT] - .pData; - else - pData = p_sec_desc->pData; - ptr = pData; - pos = (int32_t *)(start_ptr + (4 * sym_idx * fftsize)); - if (ptr == NULL || pos == NULL) - continue; - - struct xran_prb_map *pRbMap = pPrbMap; - - uint32_t idxElm = 0; uint8_t *src = (uint8_t *)ptr; - LOG_D(HW, "pRbMap->nPrbElm %d\n", pRbMap->nPrbElm); - for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) { - LOG_D(HW, - "prbMap[%d] : PRBstart %d nPRBs %d\n", - idxElm, - pRbMap->prbMap[idxElm].nRBStart, - pRbMap->prbMap[idxElm].nRBSize); - pRbElm = &pRbMap->prbMap[idxElm]; - int pos_len = 0; - int neg_len = 0; + // even when the fragmentation occurs, nRBSize & nRBStart carry the same values in each prbMap + // therefore, I took the liberty to just extract these values from the first prbMap + int num_totalRB = pRbMap->prbMap[0].nRBSize; + int start_totalRB = pRbMap->prbMap[0].nRBStart; + int32_t local_dst[num_totalRB * N_SC_PER_PRB] __attribute__((aligned(64))); - if (pRbElm->nRBStart < (nPRBs >> 1)) // there are PRBs left of DC - neg_len = min((nPRBs * 6) - (pRbElm->nRBStart * 12), pRbElm->nRBSize * N_SC_PER_PRB); - pos_len = (pRbElm->nRBSize * N_SC_PER_PRB) - neg_len; - - src = pData; - // Calculation of the pointer for the section in the buffer. - // positive half - uint8_t *dst1 = (uint8_t *)(pos + (neg_len == 0 ? ((pRbElm->nRBStart * N_SC_PER_PRB) - (nPRBs * 6)) : 0)); - // negative half - uint8_t *dst2 = (uint8_t *)(pos + (pRbElm->nRBStart * N_SC_PER_PRB) + fftsize - (nPRBs * 6)); - int32_t local_dst[pRbElm->nRBSize * N_SC_PER_PRB] __attribute__((aligned(64))); - if (pRbElm->compMethod == XRAN_COMPMETHOD_NONE) { - // NOTE: gcc 11 knows how to generate AVX2 for this! - for (idx = 0; idx < pRbElm->nRBSize * N_SC_PER_PRB * 2; idx++) - ((int16_t *)local_dst)[idx] = ((int16_t)ntohs(((uint16_t *)src)[idx])) >> 2; - memcpy((void *)dst2, (void *)local_dst, neg_len * 4); - memcpy((void *)dst1, (void *)&local_dst[neg_len], pos_len * 4); - } else if (pRbElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { -#if defined(__i386__) || defined(__x86_64__) - struct xranlib_decompress_request bfp_decom_req = {}; - struct xranlib_decompress_response bfp_decom_rsp = {}; - - int16_t payload_len = (3 * pRbElm->iqWidth + 1) * pRbElm->nRBSize; - - bfp_decom_req.data_in = (int8_t *)src; - bfp_decom_req.numRBs = pRbElm->nRBSize; - bfp_decom_req.len = payload_len; - bfp_decom_req.compMethod = pRbElm->compMethod; - bfp_decom_req.iqWidth = pRbElm->iqWidth; - - bfp_decom_rsp.data_out = (int16_t *)local_dst; - bfp_decom_rsp.len = 0; - - xranlib_decompress_avx512(&bfp_decom_req, &bfp_decom_rsp); -#elif defined(__arm__) || defined(__aarch64__) - armral_bfp_decompression(pRbElm->iqWidth, pRbElm->nRBSize, (int8_t *)src, (int16_t *)local_dst); -#else - AssertFatal(1 == 0, "BFP compression not supported on this architecture"); -#endif - memcpy((void *)dst2, (void *)local_dst, neg_len * 4); - memcpy((void *)dst1, (void *)&local_dst[neg_len], pos_len * 4); - outcnt++; - } else { - printf("pRbElm->compMethod == %d is not supported\n", pRbElm->compMethod); - exit(-1); + LOG_D(HW, "[%d.%d] pRbMap->nPrbElm %d\n", *frame, *slot, pRbMap->nPrbElm); + for (uint32_t idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) { + int numRB, startRB; + uint8_t *pData; + struct xran_section_desc *p_sec_desc = NULL; + struct xran_prb_elm *pRbElm = &pRbMap->prbMap[idxElm]; +#ifdef E_RELEASE + uint32_t one_rb_size = + (((pRbElm->iqWidth == 0) || (pRbElm->iqWidth == 16)) ? (N_SC_PER_PRB * 2 * 2) : (3 * pRbElm->iqWidth + 1)); + if (fh_init->mtu < num_totalRB * one_rb_size) + pData = bufs->dst[ant_id % nb_rx_per_ru][tti % XRAN_N_FE_BUF_LEN] + .pBuffers[sym_idx % XRAN_NUM_OF_SYMBOL_PER_SLOT] + .pData; + else { + p_sec_desc = pRbElm->p_sec_desc[sym_idx][0]; + pData = p_sec_desc->pData; } - } + numRB = num_totalRB; + startRB = start_totalRB; + { + { +#elif defined F_RELEASE + // UP_nRBSize & UP_nRBStart are for DL U-plane only + LOG_D(HW, "[%d.%d] idxElm[%d] startSym[%d]:numSym[%d] UP_startRB[%d]:UP_numRB[%d] sym_idx[%d] ant_id[%d] pRbElm->nRBStart[%d]:pRbElm->nRBSize[%d]\n", *frame, *slot, idxElm, pRbElm->nStartSymb, pRbElm->numSymb, pRbElm->UP_nRBStart, pRbElm->UP_nRBSize, sym_idx, ant_id, pRbElm->nRBStart, pRbElm->nRBSize); + for (int idxDesc = 0; idxDesc < XRAN_MAX_FRAGMENT; idxDesc++) { + p_sec_desc = &pRbElm->sec_desc[sym_idx][idxDesc]; + if (p_sec_desc == NULL) + continue; + if (sym_idx >= pRbElm->nStartSymb && sym_idx < pRbElm->nStartSymb + pRbElm->numSymb) { + if (!p_sec_desc->pCtrl) + continue; + pData = p_sec_desc->pData; + numRB = p_sec_desc->num_prbu; + startRB = p_sec_desc->start_prbu; + // num_prbu & start_prbu are for UL U-plane only + LOG_D(HW, "p_sec_desc[%d] startRB[%d]:numRB[%d]\n", idxDesc, startRB, numRB); +#endif + ptr = pData; + pos = (int32_t *)(start_ptr + (4 * sym_idx * fftsize)); + if (ptr == NULL || pos == NULL) + continue; + src = pData; + if (pRbElm->compMethod == XRAN_COMPMETHOD_NONE) { + // NOTE: gcc 11 knows how to generate AVX2 for this! + for (idx = 0; idx < (numRB * N_SC_PER_PRB) * 2; idx++) + ((int16_t *)local_dst)[idx + startRB * N_SC_PER_PRB * 2] = ((int16_t)ntohs(((uint16_t *)src)[idx])) >> 2; + } else if (pRbElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { +#if defined(__i386__) || defined(__x86_64__) + struct xranlib_decompress_request bfp_decom_req = {}; + struct xranlib_decompress_response bfp_decom_rsp = {}; + + int16_t payload_len = (3 * pRbElm->iqWidth + 1) * numRB; + + bfp_decom_req.data_in = (int8_t *)src; + bfp_decom_req.numRBs = numRB; + bfp_decom_req.len = payload_len; + bfp_decom_req.compMethod = pRbElm->compMethod; + bfp_decom_req.iqWidth = pRbElm->iqWidth; + + bfp_decom_rsp.data_out = (int16_t *) (local_dst + startRB * N_SC_PER_PRB); + bfp_decom_rsp.len = 0; + + xranlib_decompress_avx512(&bfp_decom_req, &bfp_decom_rsp); +#elif defined(__arm__) || defined(__aarch64__) + armral_bfp_decompression(pRbElm->iqWidth, numRB, (int8_t *)src, (int16_t *)local_dst); +#else + AssertFatal(1 == 0, "BFP compression not supported on this architecture"); +#endif + outcnt++; + } else { + printf("pRbElm->compMethod == %d is not supported\n", pRbElm->compMethod); + exit(-1); + } + if ((startRB + numRB) == (start_totalRB + num_totalRB)) { + int pos_len = 0; + int neg_len = 0; + + if (start_totalRB < (num_totalRB >> 1)) // there are PRBs left of DC + neg_len = min((num_totalRB * 6) - (start_totalRB * 12), num_totalRB * N_SC_PER_PRB); + pos_len = (num_totalRB * N_SC_PER_PRB) - neg_len; + // Calculation of the pointer for the section in the buffer. + // positive half + uint8_t *dst1 = (uint8_t *)(pos + (neg_len == 0 ? ((start_totalRB * N_SC_PER_PRB) - (num_totalRB * 6)) : 0)); + // negative half + uint8_t *dst2 = (uint8_t *)(pos + (start_totalRB * N_SC_PER_PRB) + fftsize - (num_totalRB * 6)); + memcpy((void *)dst2, (void *)local_dst, neg_len * 4); + memcpy((void *)dst1, (void *)&local_dst[neg_len], pos_len * 4); + } + } + } // idxDesc + } // idxElm + } // sym_ind } // ant_ind } // vv_inf @@ -521,7 +537,6 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) const struct xran_fh_init *fh_init = get_xran_fh_init(); const struct xran_fh_config *fh_cfg = get_xran_fh_config(0); - int nPRBs = fh_cfg->nDLRBs; int fftsize = 1 << fh_cfg->nDLFftSize; int nb_tx_per_ru = ru->nb_tx / fh_init->xran_ports; int nb_rx_per_ru = ru->nb_rx / fh_init->xran_ports; @@ -539,8 +554,7 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) } // This loop would better be more inner to avoid confusion and maybe also errors. for (int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) { - /* the callback is for mixed and UL slots. In mixed, we have to - * skip DL and guard symbols. */ + /* skip DL and guard symbols. */ if (!is_tdd_ul_symbol(frame_conf, slot, sym_idx)) { continue; } @@ -548,15 +562,18 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) uint8_t *pPrbMapData = bufs->dstcp[ant_id % nb_rx_per_ru][tti % XRAN_N_FE_BUF_LEN].pBuffers->pData; struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData; - struct xran_prb_elm *pRbElm = &pPrbMap->prbMap[0]; - - struct xran_prb_map *pRbMap = pPrbMap; - uint32_t idxElm = 0; - - LOG_D(HW, "pRbMap->nPrbElm %d\n", pRbMap->nPrbElm); - for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) { - LOG_D(HW, "prbMap[%d] : PRBstart %d nPRBs %d\n", idxElm, pRbMap->prbMap[idxElm].nRBStart, pRbMap->prbMap[idxElm].nRBSize); - pRbElm = &pRbMap->prbMap[idxElm]; + LOG_D(HW, "pPrbMap->nPrbElm %d\n", pPrbMap->nPrbElm); + for (uint32_t idxElm = 0; idxElm < pPrbMap->nPrbElm; idxElm++) { + struct xran_prb_elm *pRbElm = &pPrbMap->prbMap[idxElm]; + int numRB, startRB; +#ifdef E_RELEASE + numRB = pRbElm->nRBSize; + startRB = pRbElm->nRBStart; +#elif F_RELEASE + numRB = pRbElm->UP_nRBSize; + startRB = pRbElm->UP_nRBStart; +#endif + LOG_D(HW, "pPrbMap[%d] : PRBstart %d nPRBs %d\n", idxElm, startRB, numRB); if (first) { // ant_id / no of antenna per beam gives the beam_nb pRbElm->nBeamIndex = @@ -583,9 +600,8 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) } // This loop would better be more inner to avoid confusion and maybe also errors. for (int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) { - /* the callback is for mixed and UL slots. In mixed, we have to - * skip UL and guard symbols. */ - if (is_tdd_ul_symbol(frame_conf, slot, sym_idx)) { + /* skip UL and guard symbols. */ + if (!is_tdd_dl_symbol(frame_conf, slot, sym_idx)) { continue; } uint8_t *pData = @@ -596,20 +612,36 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) pos = &ru->txdataF_BF[ant_id][sym_idx * fftsize]; uint8_t *u8dptr; - struct xran_prb_map *pRbMap = pPrbMap; - int32_t sym_id = sym_idx % XRAN_NUM_OF_SYMBOL_PER_SLOT; + // even when the fragmentation occurs, nRBSize & nRBStart carry the same values in each prbMap + // therefore, I took the liberty to just extract these values from the first prbMap + struct xran_prb_elm *p_prbMapElm = &pPrbMap->prbMap[0]; + int num_totalRB = p_prbMapElm->nRBSize; + int start_totalRB = p_prbMapElm->nRBStart; + + int pos_len = 0; + int neg_len = 0; + + if (start_totalRB < (num_totalRB >> 1)) // there are PRBs left of DC + neg_len = min((num_totalRB * 6) - (start_totalRB * 12), num_totalRB * N_SC_PER_PRB); + pos_len = (num_totalRB * N_SC_PER_PRB) - neg_len; + // Calculation of the pointer for the section in the buffer. + // start of positive frequency component + uint16_t *src1 = (uint16_t *)&pos[(neg_len == 0) ? ((start_totalRB * N_SC_PER_PRB) - (num_totalRB * 6)) : 0]; + // start of negative frequency component + uint16_t *src2 = (uint16_t *)&pos[(start_totalRB * N_SC_PER_PRB) + fftsize - (num_totalRB * 6)]; + + uint32_t local_src[num_totalRB * N_SC_PER_PRB] __attribute__((aligned(64))); + memcpy((void *)local_src, (void *)src2, neg_len * 4); + memcpy((void *)&local_src[neg_len], (void *)src1, pos_len * 4); if (ptr && pos) { - uint32_t idxElm = 0; u8dptr = (uint8_t *)ptr; int16_t payload_len = 0; uint8_t *dst = (uint8_t *)u8dptr; - struct xran_prb_elm *p_prbMapElm = &pRbMap->prbMap[idxElm]; - - for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) { + for (uint32_t idxElm = 0; idxElm < pPrbMap->nPrbElm; idxElm++) { struct xran_section_desc *p_sec_desc = NULL; - p_prbMapElm = &pRbMap->prbMap[idxElm]; + struct xran_prb_elm *p_prbMapElm = &pPrbMap->prbMap[idxElm]; if (sym_idx == 0) { // ant_id / no of antenna per beam gives the beam_nb p_prbMapElm->nBeamIndex = ru->beam_id[ant_id / (ru->nb_tx / ru->num_beams_period)][slot * XRAN_NUM_OF_SYMBOL_PER_SLOT]; @@ -618,11 +650,18 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) p_prbMapElm->nBeamIndex = 0; } - // assumes one fragment per symbol + // radio-transport fragmentation is not supported in both E and F releases; + // E-bit = 1 => each ethernet frame is considered as the last fragment; + // a group of PRBs per each symbol is encapsulated in one ethernet frame. + // => seems that the RUs don't check for E-bit #ifdef E_RELEASE - p_sec_desc = p_prbMapElm->p_sec_desc[sym_id][0]; + p_sec_desc = p_prbMapElm->p_sec_desc[sym_idx][0]; + int16_t startRB = p_prbMapElm->nRBStart; + int16_t numRB = p_prbMapElm->nRBSize; #elif F_RELEASE - p_sec_desc = &p_prbMapElm->sec_desc[sym_id][0]; + p_sec_desc = &p_prbMapElm->sec_desc[sym_idx][0]; + int16_t startRB = p_prbMapElm->UP_nRBStart; + int16_t numRB = p_prbMapElm->UP_nRBSize; #endif dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod); @@ -633,36 +672,28 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) } uint16_t *dst16 = (uint16_t *)dst; - int pos_len = 0; - int neg_len = 0; - - if (p_prbMapElm->nRBStart < (nPRBs >> 1)) // there are PRBs left of DC - neg_len = min((nPRBs * 6) - (p_prbMapElm->nRBStart * 12), p_prbMapElm->nRBSize * N_SC_PER_PRB); - pos_len = (p_prbMapElm->nRBSize * N_SC_PER_PRB) - neg_len; - // Calculation of the pointer for the section in the buffer. - // start of positive frequency component - uint16_t *src1 = (uint16_t *)&pos[(neg_len == 0) ? ((p_prbMapElm->nRBStart * N_SC_PER_PRB) - (nPRBs * 6)) : 0]; - // start of negative frequency component - uint16_t *src2 = (uint16_t *)&pos[(p_prbMapElm->nRBStart * N_SC_PER_PRB) + fftsize - (nPRBs * 6)]; - - uint32_t local_src[p_prbMapElm->nRBSize * N_SC_PER_PRB] __attribute__((aligned(64))); - memcpy((void *)local_src, (void *)src2, neg_len * 4); - memcpy((void *)&local_src[neg_len], (void *)src1, pos_len * 4); if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) { - payload_len = p_prbMapElm->nRBSize * N_SC_PER_PRB * 4L; + payload_len = numRB * N_SC_PER_PRB * 4L; /* convert to Network order */ // NOTE: ggc 11 knows how to generate AVX2 for this! - for (idx = 0; idx < (pos_len + neg_len) * 2; idx++) - ((uint16_t *)dst16)[idx] = htons(((uint16_t *)local_src)[idx]); + for (idx = 0; idx < (numRB * N_SC_PER_PRB) * 2; idx++) + ((uint16_t *)dst16)[idx] = htons(((uint16_t *)local_src)[idx + startRB * N_SC_PER_PRB * 2]); } else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { - payload_len = (3 * p_prbMapElm->iqWidth + 1) * p_prbMapElm->nRBSize; + payload_len = (3 * p_prbMapElm->iqWidth + 1) * numRB; #if defined(__i386__) || defined(__x86_64__) struct xranlib_compress_request bfp_com_req = {}; struct xranlib_compress_response bfp_com_rsp = {}; - bfp_com_req.data_in = (int16_t *)local_src; - bfp_com_req.numRBs = p_prbMapElm->nRBSize; + uint32_t src_compr[num_totalRB * N_SC_PER_PRB] __attribute__((aligned(64))); + if (numRB == num_totalRB) { + bfp_com_req.data_in = (int16_t *)local_src; + } else { + memcpy(src_compr, local_src + (startRB * N_SC_PER_PRB), (numRB * N_SC_PER_PRB) * sizeof(*local_src)); + bfp_com_req.data_in = (int16_t *)src_compr; + } + + bfp_com_req.numRBs = numRB; bfp_com_req.len = payload_len; bfp_com_req.compMethod = p_prbMapElm->compMethod; bfp_com_req.iqWidth = p_prbMapElm->iqWidth; @@ -672,11 +703,10 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp); #elif defined(__arm__) || defined(__aarch64__) - armral_bfp_compression(p_prbMapElm->iqWidth, p_prbMapElm->nRBSize, (int16_t *)local_src, (int8_t *)dst); + armral_bfp_compression(p_prbMapElm->iqWidth, numRB, (int16_t *)local_src, (int8_t *)dst); #else AssertFatal(1 == 0, "BFP compression not supported on this architecture"); #endif - } else { printf("p_prbMapElm->compMethod == %d is not supported\n", p_prbMapElm->compMethod); exit(-1); @@ -690,7 +720,7 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) } // The tti should be updated as it increased. - pRbMap->tti_id = tti; + pPrbMap->tti_id = tti; } else { printf("ptr ==NULL\n"); diff --git a/radio/fhi_72/oran-config.c b/radio/fhi_72/oran-config.c index e15d0a68e5..8283b63a7d 100644 --- a/radio/fhi_72/oran-config.c +++ b/radio/fhi_72/oran-config.c @@ -701,8 +701,8 @@ static bool set_fh_init(void *mplane_api, struct xran_fh_init *fh_init, enum xra if (!set_fh_eaxcid_conf_mplane(&fh_init->eAxCId_conf, xran_cat, ru_session_list)) return false; /* maximum transmission unit (MTU) is the size of the largest protocol data unit (PDU) that can be - communicated in a single xRAN network layer transaction. Supported 1500 bytes and 9600 bytes (Jumbo Frame); - xran only checks if (MTU <= 1500), therefore setting any value > 1500, xran assumes 9600 value is used */ + communicated in a single xRAN network layer transaction. Based on the MTU size, xran calculates the number + of DL fragments (nPrbElm) needed for transmission of one symbol. */ fh_init->mtu = ru_session_list->ru_session[0].xran_mplane.mtu; // we suppose that each RU supports the same MTU size int num_ru_addr = (fh_init->io_cfg.one_vf_cu_plane) ? num_rus : 2*num_rus; @@ -724,8 +724,8 @@ static bool set_fh_init(void *mplane_api, struct xran_fh_init *fh_init, enum xra if (!set_fh_eaxcid_conf(&fh_init->eAxCId_conf, xran_cat)) return false; /* maximum transmission unit (MTU) is the size of the largest protocol data unit (PDU) that can be - communicated in a single xRAN network layer transaction. Supported 1500 bytes and 9600 bytes (Jumbo Frame); - xran only checks if (MTU <= 1500), therefore setting any value > 1500, xran assumes 9600 value is used */ + communicated in a single xRAN network layer transaction. Based on the MTU size, xran calculates the number + of DL fragments (nPrbElm) needed for transmission of one symbol. */ fh_init->mtu = *gpd(fhip, nump, ORAN_CONFIG_MTU)->uptr; fh_init->p_o_du_addr = NULL; // DPDK retreives DU MAC address within the xran library with rte_eth_macaddr_get() function diff --git a/radio/fhi_72/oran-init.c b/radio/fhi_72/oran-init.c index 9707084a2f..4de6d00f20 100644 --- a/radio/fhi_72/oran-init.c +++ b/radio/fhi_72/oran-init.c @@ -92,7 +92,7 @@ static struct xran_prb_map get_xran_prb_map(const struct xran_fh_config *f, cons .cc_id = 0, .ru_port_id = 0, .tti_id = 0, - .nPrbElm = 1, + .nPrbElm = 1, // represents the number of fragments on DL only; calculated in xran_init_PrbMap_from_cfg()/xran_init_PrbMap_by_symbol_from_cfg() }; struct xran_prb_elm *e = &prbmap.prbMap[0]; e->nStartSymb = start_sym; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf index 1652758e4e..e590443239 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf @@ -237,7 +237,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (419, 470); T1a_cp_ul = (285, 336); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf index 1650f8a4e1..4a5553006a 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-das-benetel650_650.conf @@ -241,7 +241,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46","8c:1f:64:d1:10:43","8c:1f:64:d1:10:43"); # if two VFs, set two RU MAC addresses (one per RU) - mtu = 9600; + mtu = 9216; fh_config = ( # RAN650 #1 { diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf index fdad2726c2..253d312eb0 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf @@ -237,7 +237,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46","8c:1f:64:d1:10:43","8c:1f:64:d1:10:43"); # if two VFs, set two RU MAC addresses (one per RU) - mtu = 9600; + mtu = 9216; fh_config = ( # RAN650 #1 { diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf index f7f8390b33..5ff25d5f43 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf @@ -256,7 +256,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("98:ae:71:04:83:e3", "98:ae:71:04:83:e3"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (285, 470); T1a_cp_ul = (285, 429); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn-16b.conf similarity index 99% rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn-16b.conf index d68e67c96f..92ba13f7ce 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn-16b.conf @@ -253,7 +253,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("98:ae:71:04:83:e3", "98:ae:71:04:83:e3"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (285, 470); T1a_cp_ul = (285, 429); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf index 7e13bf7dec..2e16cf50a5 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf @@ -255,7 +255,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("98:ae:71:04:83:e3", "98:ae:71:04:83:e3"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (285, 470); T1a_cp_ul = (285, 429); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.2x2-benetel550-16b.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.2x2-benetel550-16b.conf new file mode 100644 index 0000000000..eb304d01fd --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.2x2-benetel550-16b.conf @@ -0,0 +1,274 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); }); + + nr_cellid = 1; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pdsch_AntennaPorts_N1 = 1; + maxMIMO_layers = 2; + pusch_AntennaPorts = 2; + do_CSIRS = 1; + do_SRS = 0; + # force_UL256qam_off = 1; + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + # n_TimingAdvanceOffset = 0; +# downlinkConfigCommon + #frequencyInfoDL + # center frequency = 3350.01 MHz + # selected SSB frequency = 3349.92 MHz + absoluteFrequencySSB = 623328; + dl_frequencyBand = 78; + # frequency point A = 3300.87 MHz + dl_absoluteFrequencyPointA = 620058; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + #initialDownlinkBWP + #genericParameters + initialDLBWPlocationAndBandwidth = 1099; #38.101-1 Table 5.3.2-1 + # +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + pMax = 23; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 1099; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 152; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 0; + preambleReceivedTargetPower = -100; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 8; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 3; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4; +#one (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + +# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB + msg3_DeltaPreamble = 2; + p0_NominalWithGrant = -96; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 0; + p0_nominal = -96; + + ssb_PositionsInBurst_Bitmap = 0x1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = 0; + } + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ({ ipv4 = "172.21.6.5"; }); + + NETWORK_INTERFACES : + { + GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.51"; + GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.51"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 180; + pucch_TargetSNRx10 = 220; + dl_bler_target_upper = .35; + dl_bler_target_lower = .15; + ul_bler_target_upper = .35; + ul_bler_target_lower = .15; + pusch_FailureThres = 1000; + ul_max_mcs = 28; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 100; + pucch0_dtx_threshold = 80; + pusch_dtx_threshold = 10; + max_ldpc_iterations = 15; + tx_amp_backoff_dB = 12; # needs to match O-RU configuration + L1_rx_thread_core = 8; + L1_tx_thread_core = 10; + phase_compensation = 0; # needs to match O-RU configuration +} +); + +RUs = ( +{ + local_rf = "no"; + nb_tx = 2; + nb_rx = 2; + att_tx = 0; + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + sf_extension = 0; + eNB_instances = [0]; + ru_thread_core = 9; + sl_ahead = 10; + tr_preference = "raw_if4p5"; # important: activate FHI7.2 + do_precoding = 0; # needs to match O-RU configuration +} +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level = "info"; + hw_log_level = "info"; + phy_log_level = "info"; + mac_log_level = "info"; + rlc_log_level = "info"; + pdcp_log_level = "info"; + rrc_log_level = "info"; + ngap_log_level = "info"; + f1ap_log_level = "info"; +}; + +fhi_72 = { + dpdk_devices = ("0000:c1:11.0"); + system_core = 0; + io_core = 1; + worker_cores = (2); + ru_addr = ("70:b3:d5:e1:5b:81"); + mtu = 9216; + fh_config = ({ + T1a_cp_dl = (419, 470); + T1a_cp_ul = (285, 336); + T1a_up = (294, 345); + Ta4 = (0, 200); + ru_config = { + iq_width = 16; + iq_width_prach = 16; + }; + prach_config = { + eAxC_offset = 8; + }; + }); +}; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf index 715dcda78c..43d6ffd760 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf @@ -255,7 +255,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (419, 470); T1a_cp_ul = (285, 336); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf index 2788e7f5f5..39636baa54 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf @@ -257,7 +257,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (419, 470); T1a_cp_ul = (285, 336); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-foxconn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-foxconn.conf index e26e446f46..7f6845d8cd 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-foxconn.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-foxconn.conf @@ -254,7 +254,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("6c:ad:ad:00:04:dc", "6c:ad:ad:00:04:dc"); - mtu = 9600; + mtu = 9216; fh_config = ({ T1a_cp_dl = (285, 470); T1a_cp_ul = (285, 429); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf index 2419df21bb..0c1ef0b2e8 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf @@ -254,7 +254,7 @@ fhi_72 = { io_core = 1; worker_cores = (2); ru_addr = ("e8:c7:4f:25:81:b3", "e8:c7:4f:25:81:b3"); - mtu = 9600; # note: 1500 works as well, with both E and F releases + mtu = 9216; # note: 1500 works as well, with both E and F releases fh_config = ({ T1a_cp_dl = (285, 429); T1a_cp_ul = (285, 429);