-/******************************************************************************\r
-*\r
-* Copyright (c) 2019 Intel.\r
-*\r
-* Licensed under the Apache License, Version 2.0 (the "License");\r
-* you may not use this file except in compliance with the License.\r
-* You may obtain a copy of the License at\r
-*\r
-* http://www.apache.org/licenses/LICENSE-2.0\r
-*\r
-* Unless required by applicable law or agreed to in writing, software\r
-* distributed under the License is distributed on an "AS IS" BASIS,\r
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-* See the License for the specific language governing permissions and\r
-* limitations under the License.\r
-*\r
-*******************************************************************************/\r
-\r
-/**\r
- * @brief\r
- * @file\r
- * @ingroup\r
- * @author Intel Corporation\r
- **/\r
-\r
-#include "rte_common.h"\r
-#include "config.h"\r
-#include "common.h"\r
-#include "debug.h"\r
-\r
-#include <rte_ethdev.h>\r
-\r
-#define MAX_LINE_SIZE 512\r
-/* Configuration file maximum supported line length */\r
-\r
-#define KEY_APP_MODE "appMode"\r
-#define KEY_XRAN_MODE "xranMode"\r
-#define KEY_MU_NUMBER "mu"\r
-#define KEY_NDLABSFREPOINTA "nDLAbsFrePointA"\r
-#define KEY_NULABSFREPOINTA "nULAbsFrePointA"\r
-#define KEY_NDLBANDWIDTH "nDLBandwidth"\r
-#define KEY_NULBANDWIDTH "nULBandwidth"\r
-#define KEY_NDLFFTSIZE "nDLFftSize"\r
-#define KEY_NULFFTSIZE "nULFftSize"\r
-\r
-#define KEY_NFRAMEDUPLEXTYPE "nFrameDuplexType"\r
-#define KEY_NTDDPERIOD "nTddPeriod"\r
-\r
-#define KEY_SSLOTCONFIG "sSlotConfig"\r
-\r
-#define KEY_CC_PER_PORT_NUM "ccNum"\r
-#define KEY_ANT_NUM "antNum"\r
-#define KEY_UL_ANT_NUM "antNumUL"\r
-\r
-#define KEY_ANT_ELM_TRX_NUM "antElmTRx"\r
-\r
-#define KEY_MU_MIMO_UES_NUM "muMimoUEs"\r
-#define KEY_DLLAYERS_PER_UE "DlLayersPerUe"\r
-#define KEY_ULLAYERS_PER_UE "UlLayersPerUe"\r
-#define KEY_FILE_DLBFWUE "DlBfwUe"\r
-#define KEY_FILE_ULBFWUE "UlBfwUe"\r
-\r
-#define KEY_FILE_ULSRS "antSrsC"\r
-\r
-\r
-#define KEY_TTI_PERIOD "ttiPeriod"\r
-\r
-#define KEY_MTU_SIZE "MTUSize"\r
-#define KEY_IO_CORE "ioCore"\r
-#define KEY_INSTANCE_ID "instanceId"\r
-\r
-#define KEY_LLS_CU_MAC "llsCUMac"\r
-#define KEY_RU_MAC "ruMac"\r
-\r
-#define KEY_FILE_NUMSLOTS "numSlots"\r
-#define KEY_FILE_AxC "antC"\r
-#define KEY_FILE_PRACH_AxC "antPrachC"\r
-\r
-#define KEY_PRACH_ENABLE "rachEanble"\r
-#define KEY_SRS_ENABLE "srsEanble"\r
-\r
-#define KEY_PRACH_CFGIDX "prachConfigIndex"\r
-#define KEY_SRS_SYM_IDX "srsSym"\r
-\r
-#define KEY_MAX_FRAME_ID "maxFrameId"\r
-\r
-\r
-#define KEY_IQ_SWAP "iqswap"\r
-#define KEY_HTONS_SWAP "nebyteorderswap"\r
-#define KEY_COMPRESSION "compression"\r
-\r
-#define KEY_BFW_NUM "totalBFWeights"\r
-\r
-#define KEY_TADV_CP_DL "Tadv_cp_dl"\r
-#define KEY_T2A_MIN_CP_DL "T2a_min_cp_dl"\r
-#define KEY_T2A_MAX_CP_DL "T2a_max_cp_dl"\r
-#define KEY_T2A_MIN_CP_UL "T2a_min_cp_ul"\r
-#define KEY_T2A_MAX_CP_UL "T2a_max_cp_ul"\r
-#define KEY_T2A_MIN_UP "T2a_min_up"\r
-#define KEY_T2A_MAX_UP "T2a_max_up"\r
-#define KEY_TA3_MIN "Ta3_min"\r
-#define KEY_TA3_MAX "Ta3_max"\r
-#define KEY_T1A_MIN_CP_DL "T1a_min_cp_dl"\r
-#define KEY_T1A_MAX_CP_DL "T1a_max_cp_dl"\r
-#define KEY_T1A_MIN_CP_UL "T1a_min_cp_ul"\r
-#define KEY_T1A_MAX_CP_UL "T1a_max_cp_ul"\r
-#define KEY_T1A_MIN_UP "T1a_min_up"\r
-#define KEY_T1A_MAX_UP "T1a_max_up"\r
-#define KEY_TA4_MIN "Ta4_min"\r
-#define KEY_TA4_MAX "Ta4_max"\r
-\r
-\r
-#define KEY_CP_ENABLE "CPenable"\r
-#define KEY_CP_VTAG "c_plane_vlan_tag"\r
-#define KEY_UP_VTAG "u_plane_vlan_tag"\r
-#define KEY_DEBUG_STOP "debugStop"\r
-#define KEY_DEBUG_STOP_CNT "debugStopCount"\r
-#define KEY_BBDEV_MODE "bbdevMode"\r
-#define KEY_DYNA_SEC_ENA "DynamicSectionEna"\r
-#define KEY_ALPHA "Gps_Alpha"\r
-#define KEY_BETA "Gps_Beta"\r
-\r
-#define KEY_NPRBELEM_DL "nPrbElemDl"\r
-#define KEY_PRBELEM_DL "PrbElemDl"\r
-\r
-#define KEY_NPRBELEM_UL "nPrbElemUl"\r
-#define KEY_PRBELEM_UL "PrbElemUl"\r
-\r
-/**\r
- * Set runtime configuration parameters to their defaults.\r
- *\r
- * @todo Initialize missing parameters.\r
- */\r
-static void init_config(RuntimeConfig* config)\r
-{\r
- memset(config , 0, sizeof(RuntimeConfig));\r
-}\r
-\r
-/** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **/\r
-\r
-static void trim(char* input)\r
-{\r
- uint32_t i;\r
- for (i = 0; i<strlen(input); i++)\r
- if (input[i] == ' ' || input[i] == '\n' || input[i] == '\t')\r
- input[i] = '\0';\r
-}\r
-\r
-static int fillConfigStruct(RuntimeConfig *config, const char *key, const char *value)\r
-{\r
- int32_t parse_res = 0;\r
-\r
- if (strcmp(key, KEY_APP_MODE) == 0){\r
- config->appMode = atoi(value);\r
- } else if (strcmp(key, KEY_XRAN_MODE) == 0) {\r
- config->xranCat = atoi(value);\r
- } else if (strcmp(key, KEY_CC_PER_PORT_NUM) == 0) {\r
- config->numCC= atoi(value);\r
- } else if (strcmp(key, KEY_MU_NUMBER) == 0) {\r
- config->mu_number= atoi(value);\r
- printf("mu_number: %d\n",config->mu_number);\r
- } else if (strcmp(key, KEY_NDLABSFREPOINTA) == 0) {\r
- config->nDLAbsFrePointA = atoi(value);\r
- printf("nDLAbsFrePointA: %d\n",config->nDLAbsFrePointA);\r
- } else if (strcmp(key, KEY_NULABSFREPOINTA) == 0) {\r
- config->nULAbsFrePointA = atoi(value);\r
- printf("nULAbsFrePointA: %d\n",config->nULAbsFrePointA);\r
- } else if (strcmp(key, KEY_NDLBANDWIDTH) == 0) {\r
- config->nDLBandwidth = atoi(value);\r
- printf("nDLBandwidth: %d\n",config->nDLBandwidth);\r
- } else if (strcmp(key, KEY_NULBANDWIDTH) == 0) {\r
- config->nULBandwidth = atoi(value);\r
- printf("nULBandwidth: %d\n",config->nULBandwidth);\r
- } else if (strcmp(key, KEY_NDLFFTSIZE) == 0) {\r
- config->nDLFftSize = atoi(value);\r
- printf("nDLFftSize: %d\n",config->nDLFftSize);\r
- } else if (strcmp(key, KEY_NULFFTSIZE) == 0) {\r
- config->nULFftSize = atoi(value);\r
- printf("nULFftSize: %d\n",config->nULFftSize);\r
- } else if (strcmp(key, KEY_NFRAMEDUPLEXTYPE) == 0) {\r
- config->nFrameDuplexType = atoi(value);\r
- printf("nFrameDuplexType: %d\n",config->nFrameDuplexType);\r
- } else if (strcmp(key, KEY_NTDDPERIOD) == 0) {\r
- config->nTddPeriod = atoi(value);\r
- printf("nTddPeriod: %d\n",config->nTddPeriod);\r
- if (config->nTddPeriod > XRAN_MAX_TDD_PERIODICITY)\r
- {\r
- printf("nTddPeriod is larger than max allowed, invalid!\n");\r
- config->nTddPeriod = XRAN_MAX_TDD_PERIODICITY;\r
- }\r
- } else if (strncmp(key, KEY_SSLOTCONFIG, strlen(KEY_SSLOTCONFIG)) == 0) {\r
- unsigned int slot_num = 0;\r
- int i = 0;\r
- sscanf(key,"sSlotConfig%u",&slot_num);\r
- if (slot_num >= config->nTddPeriod){\r
- printf("slot_num %d exceeds TddPeriod\n",slot_num);\r
- }\r
- else{\r
- sscanf(value, "%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x",\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[0],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[1],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[2],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[3],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[4],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[5],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[6],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[7],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[8],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[9],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[10],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[11],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[12],\r
- (uint32_t*)&config->sSlotConfig[slot_num].nSymbolType[13]);\r
- printf("sSlotConfig%d: ",slot_num);\r
- for (i = 0; i< 14; i++){\r
- printf("%d ",config->sSlotConfig[slot_num].nSymbolType[i]);\r
- }\r
- printf("\n");\r
- }\r
- } else if (strcmp(key, KEY_ANT_NUM) == 0) {\r
- config->numAxc = atoi(value);\r
- } else if (strcmp(key, KEY_UL_ANT_NUM) == 0) {\r
- config->numUlAxc = atoi(value);\r
- }else if (strcmp(key, KEY_ANT_ELM_TRX_NUM) == 0) {\r
- config->antElmTRx = atoi(value);\r
- printf("antElmTRx %d\n", config->antElmTRx);\r
- } else if (strcmp(key, KEY_MU_MIMO_UES_NUM) == 0) {\r
- config->muMimoUEs = atoi(value);\r
- } else if (strcmp(key, KEY_DLLAYERS_PER_UE) == 0) {\r
- config->DlLayersPerUe = atoi(value);\r
- } else if (strcmp(key, KEY_ULLAYERS_PER_UE) == 0) {\r
- config->UlLayersPerUe = atoi(value);\r
- } else if (strcmp(key, KEY_TTI_PERIOD) == 0) {\r
- config->ttiPeriod = atoi(value);\r
- } else if (strcmp(key, KEY_IQ_SWAP) == 0) {\r
- config->iqswap = atoi(value);\r
- } else if (strcmp(key, KEY_HTONS_SWAP) == 0) {\r
- config->nebyteorderswap = atoi(value);\r
- } else if (strcmp(key, KEY_COMPRESSION) == 0) {\r
- config->compression = atoi(value);\r
- } else if (strcmp(key, KEY_MTU_SIZE) == 0) {\r
- config->mtu = atoi(value);\r
- printf("mtu %d\n", config->mtu);\r
- } else if (strcmp(key, KEY_IO_CORE) == 0) {\r
- config->io_core = atoi(value);\r
- printf("io_core %d\n", config->io_core);\r
- }else if (strcmp(key, KEY_INSTANCE_ID) == 0) {\r
- config->instance_id = atoi(value);\r
- printf("instance_id %d\n", config->instance_id);\r
- }else if (strcmp(key, KEY_LLS_CU_MAC) == 0) {\r
- sscanf(value, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->o_du_addr.addr_bytes[0],\r
- (uint32_t*)&config->o_du_addr.addr_bytes[1],\r
- (uint32_t*)&config->o_du_addr.addr_bytes[2],\r
- (uint32_t*)&config->o_du_addr.addr_bytes[3],\r
- (uint32_t*)&config->o_du_addr.addr_bytes[4],\r
- (uint32_t*)&config->o_du_addr.addr_bytes[5]);\r
-\r
- printf("lls-CU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",\r
- config->o_du_addr.addr_bytes[0],\r
- config->o_du_addr.addr_bytes[1],\r
- config->o_du_addr.addr_bytes[2],\r
- config->o_du_addr.addr_bytes[3],\r
- config->o_du_addr.addr_bytes[4],\r
- config->o_du_addr.addr_bytes[5]);\r
-\r
- } else if (strcmp(key, KEY_RU_MAC) == 0) {\r
- sscanf(value, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->o_ru_addr.addr_bytes[0],\r
- (uint32_t*)&config->o_ru_addr.addr_bytes[1],\r
- (uint32_t*)&config->o_ru_addr.addr_bytes[2],\r
- (uint32_t*)&config->o_ru_addr.addr_bytes[3],\r
- (uint32_t*)&config->o_ru_addr.addr_bytes[4],\r
- (uint32_t*)&config->o_ru_addr.addr_bytes[5]);\r
-\r
- printf("RU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",\r
- config->o_ru_addr.addr_bytes[0],\r
- config->o_ru_addr.addr_bytes[1],\r
- config->o_ru_addr.addr_bytes[2],\r
- config->o_ru_addr.addr_bytes[3],\r
- config->o_ru_addr.addr_bytes[4],\r
- config->o_ru_addr.addr_bytes[5]);\r
- } else if (strcmp(key, KEY_FILE_NUMSLOTS) == 0) {\r
- config->numSlots = atoi(value);\r
- printf("numSlots: %d\n",config->numSlots);\r
- }else if (strncmp(key, KEY_FILE_AxC, strlen(KEY_FILE_AxC)) == 0) {\r
- unsigned int ant_num = 0;\r
- sscanf(key,"antC%02u",&ant_num);\r
- if (ant_num >= MAX_ANT_CARRIER_SUPPORTED) {\r
- printf("antC%d exceeds max antenna supported\n",ant_num);\r
- } else {\r
- strncpy(&config->ant_file[ant_num][0], value, strlen(value));\r
- printf("antC%d: %s\n",ant_num, config->ant_file[ant_num]);\r
- }\r
- } else if (strncmp(key, KEY_FILE_DLBFWUE, strlen(KEY_FILE_DLBFWUE)) == 0) {\r
- unsigned int ue_num = 0;\r
- sscanf(key,"DlBfwUe%02u",&ue_num);\r
- if (ue_num >= MAX_ANT_CARRIER_SUPPORTED) {\r
- printf("DlBfwUe%d exceeds max streams supported\n",ue_num);\r
- } else {\r
- strncpy(&config->dl_bfw_file[ue_num][0], value, strlen(value));\r
- printf("DlBfwUe%d: %s\n",ue_num, config->dl_bfw_file[ue_num]);\r
- }\r
- }else if (strncmp(key, KEY_FILE_ULBFWUE, strlen(KEY_FILE_ULBFWUE)) == 0) {\r
- unsigned int ue_num = 0;\r
- sscanf(key,"UlBfwUe%02u",&ue_num);\r
- if (ue_num >= MAX_ANT_CARRIER_SUPPORTED) {\r
- printf("UlBfwUe%d exceeds max streams supported\n",ue_num);\r
- } else {\r
- strncpy(&config->ul_bfw_file[ue_num][0], value, strlen(value));\r
- printf("UlBfwUe%d: %s\n",ue_num, config->ul_bfw_file[ue_num]);\r
- }\r
- }else if (strncmp(key, KEY_FILE_ULSRS, strlen(KEY_FILE_ULSRS)) == 0) {\r
- unsigned int srs_ant = 0;\r
- sscanf(key,"antSrsC%02u",&srs_ant);\r
- if (srs_ant >= MAX_ANT_CARRIER_SUPPORTED_CAT_B) {\r
- printf("antSrsC%d exceeds max ant elemnets supported [%d]\n", srs_ant, MAX_ANT_CARRIER_SUPPORTED_CAT_B);\r
- } else {\r
- strncpy(&config->ul_srs_file[srs_ant][0], value, strlen(value));\r
- printf("antSrsC%d: %s\n",srs_ant, config->ul_srs_file[srs_ant]);\r
- }\r
- } else if (strcmp(key, KEY_PRACH_ENABLE) == 0) {\r
- config->enablePrach = atoi(value);\r
- printf("Prach enable: %d\n",config->enablePrach);\r
- }else if (strcmp(key, KEY_MAX_FRAME_ID) == 0) {\r
- config->maxFrameId = atoi(value);\r
- printf("maxFrameId: %d\n",config->maxFrameId);\r
- } else if (strcmp(key, KEY_SRS_ENABLE) == 0) {\r
- config->enableSrs = atoi(value);\r
- printf("Srs enable: %d\n",config->enablePrach);\r
- } else if (strcmp(key, KEY_PRACH_CFGIDX) == 0) {\r
- config->prachConfigIndex = atoi(value);\r
- printf("Prach config index: %d\n",config->prachConfigIndex);\r
- } else if (strcmp(key, KEY_SRS_SYM_IDX) == 0) {\r
- config->srsSymMask = atoi(value);\r
- printf("Srs symbol [0-13]: %d\n",config->srsSymMask);\r
- } else if (strncmp(key, KEY_FILE_PRACH_AxC, strlen(KEY_FILE_PRACH_AxC)) == 0) {\r
- unsigned int ant_num = 0;\r
- sscanf(key,"antPrachC%02u",&ant_num);\r
- if (ant_num >= MAX_ANT_CARRIER_SUPPORTED)\r
- {\r
- printf("antC%d exceeds max antenna supported\n",ant_num);\r
- }\r
- else{\r
- strncpy(&config->prach_file[ant_num][0], value, strlen(value));\r
- printf("antPrachC%d: %s\n",ant_num, config->prach_file[ant_num]);\r
- }\r
- } else if (strcmp(key, KEY_BFW_NUM) == 0) {\r
- config->totalBfWeights = atoi(value);\r
- printf("%s : %d\n",KEY_BFW_NUM, config->totalBfWeights);\r
- /* timing */\r
- } else if (strcmp(key, KEY_TADV_CP_DL ) == 0) {\r
- config->Tadv_cp_dl = atoi(value);\r
- printf("Tadv_cp_dl: %d\n",config->Tadv_cp_dl);\r
- } else if (strcmp(key, KEY_T2A_MIN_CP_DL ) == 0) {\r
- config->T2a_min_cp_dl = atoi(value);\r
- printf("T2a_min_cp_dl: %d\n",config->T2a_min_cp_dl);\r
- } else if (strcmp(key, KEY_T2A_MAX_CP_DL ) == 0) {\r
- config->T2a_max_cp_dl = atoi(value);\r
- printf("T2a_max_cp_dl: %d\n",config->T2a_max_cp_dl);\r
- } else if (strcmp(key, KEY_T2A_MIN_CP_UL ) == 0) {\r
- config->T2a_min_cp_ul = atoi(value);\r
- printf("T2a_min_cp_ul: %d\n",config->T2a_min_cp_ul);\r
- } else if (strcmp(key, KEY_T2A_MAX_CP_UL ) == 0) {\r
- config->T2a_max_cp_ul = atoi(value);\r
- printf("T2a_max_cp_ul: %d\n",config->T2a_max_cp_ul);\r
- } else if (strcmp(key, KEY_T2A_MIN_UP ) == 0) {\r
- config->T2a_min_up = atoi(value);\r
- printf("T2a_min_up: %d\n",config->T2a_min_up);\r
- } else if (strcmp(key, KEY_T2A_MAX_UP ) == 0) {\r
- config->T2a_max_up = atoi(value);\r
- printf("T2a_max_up: %d\n",config->T2a_max_up);\r
- } else if (strcmp(key, KEY_TA3_MIN ) == 0) {\r
- config->Ta3_min = atoi(value);\r
- printf("Ta3_min: %d\n",config->Ta3_min);\r
- } else if (strcmp(key, KEY_TA3_MAX ) == 0) {\r
- config->Ta3_max = atoi(value);\r
- printf("Ta3_max: %d\n",config->Ta3_max);\r
- } else if (strcmp(key, KEY_T1A_MIN_CP_DL ) == 0) {\r
- config->T1a_min_cp_dl = atoi(value);\r
- printf("T1a_min_cp_dl: %d\n",config->T1a_min_cp_dl);\r
- } else if (strcmp(key, KEY_T1A_MAX_CP_DL ) == 0) {\r
- config->T1a_max_cp_dl = atoi(value);\r
- printf("T1a_max_cp_dl: %d\n",config->T1a_max_cp_dl);\r
- } else if (strcmp(key, KEY_T1A_MIN_CP_UL ) == 0) {\r
- config->T1a_min_cp_ul = atoi(value);\r
- printf("T1a_min_cp_ul: %d\n",config->T1a_min_cp_ul);\r
- } else if (strcmp(key, KEY_T1A_MAX_CP_UL ) == 0) {\r
- config->T1a_max_cp_ul = atoi(value);\r
- printf("T1a_max_cp_ul: %d\n",config->T1a_max_cp_ul);\r
- } else if (strcmp(key, KEY_T1A_MIN_UP ) == 0) {\r
- config->T1a_min_up = atoi(value);\r
- printf("T1a_min_up: %d\n",config->T1a_min_up);\r
- } else if (strcmp(key, KEY_T1A_MAX_UP ) == 0) {\r
- config->T1a_max_up = atoi(value);\r
- printf("T1a_max_up: %d\n",config->T1a_max_up);\r
- } else if (strcmp(key, KEY_TA4_MIN ) == 0) {\r
- config->Ta4_min = atoi(value);\r
- printf("Ta4_min: %d\n",config->Ta4_min);\r
- } else if (strcmp(key, KEY_TA4_MAX ) == 0) {\r
- config->Ta4_max = atoi(value);\r
- printf("Ta4_max: %d\n",config->Ta4_max);\r
- /* end of timing */\r
- } else if (strcmp(key, KEY_CP_ENABLE ) == 0) {\r
- config->enableCP = atoi(value);\r
- printf("CPenable: %d\n",config->enableCP);\r
- } else if (strcmp(key, KEY_DEBUG_STOP ) == 0) {\r
- config->debugStop = atoi(value);\r
- printf("debugStop: %d\n",config->debugStop);\r
- } else if (strcmp(key, KEY_DEBUG_STOP_CNT) == 0) {\r
- config->debugStopCount = atoi(value);\r
- printf("debugStopCount: %d\n",config->debugStopCount);\r
- } else if (strcmp(key, KEY_BBDEV_MODE) == 0) {\r
- config->bbdevMode = atoi(value);\r
- printf("bbdevMode: %d\n",config->debugStopCount);\r
- } else if (strcmp(key, KEY_DYNA_SEC_ENA) == 0) {\r
- config->DynamicSectionEna = atoi(value);\r
- printf("DynamicSectionEna: %d\n",config->DynamicSectionEna);\r
- } else if (strcmp(key, KEY_ALPHA) == 0) {\r
- config->GPS_Alpha = atoi(value);\r
- printf("GPS_Alpha: %d\n",config->GPS_Alpha);\r
- } else if (strcmp(key, KEY_BETA) == 0) {\r
- config->GPS_Beta = atoi(value);\r
- printf("GPS_Beta: %d\n",config->GPS_Beta);\r
- } else if (strcmp(key, KEY_CP_VTAG ) == 0) {\r
- config->cp_vlan_tag = atoi(value);\r
- printf("cp_vlan_tag: %d\n",config->cp_vlan_tag);\r
- } else if (strcmp(key, KEY_UP_VTAG ) == 0) {\r
- config->up_vlan_tag = atoi(value);\r
- printf("up_vlan_tag: %d\n",config->up_vlan_tag);\r
- } else if (strcmp(key, KEY_NPRBELEM_UL ) == 0) {\r
- config->PrbMapUl.nPrbElm = atoi(value);\r
- if (config->PrbMapUl.nPrbElm > XRAN_MAX_PRBS)\r
- {\r
- printf("nTddPeriod is larger than max allowed, invalid!\n");\r
- config->PrbMapUl.nPrbElm = XRAN_MAX_PRBS;\r
- }\r
- printf("nPrbElemUl: %d\n",config->PrbMapUl.nPrbElm);\r
- } else if (strncmp(key, KEY_PRBELEM_UL, strlen(KEY_PRBELEM_UL)) == 0) {\r
- unsigned int section_idx = 0;\r
- sscanf(key,"PrbElemUl%u",§ion_idx);\r
- if (section_idx >= config->PrbMapUl.nPrbElm){\r
- printf("section_idx %d exceeds nPrbElem\n",section_idx);\r
- }\r
- else{\r
- struct xran_prb_elm *pPrbElem = &config->PrbMapUl.prbMap[section_idx];\r
- sscanf(value, "%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",\r
- (int16_t*)&pPrbElem->nRBStart,\r
- (int16_t*)&pPrbElem->nRBSize,\r
- (int16_t*)&pPrbElem->nStartSymb,\r
- (int16_t*)&pPrbElem->numSymb,\r
- (int16_t*)&pPrbElem->nBeamIndex,\r
- (int16_t*)&pPrbElem->bf_weight_update,\r
- (int16_t*)&pPrbElem->compMethod,\r
- (int16_t*)&pPrbElem->iqWidth,\r
- (int16_t*)&pPrbElem->BeamFormingType);\r
- printf("nPrbElemUl%d: ",section_idx);\r
- printf("nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",\r
- pPrbElem->nRBStart,pPrbElem->nRBSize,pPrbElem->nStartSymb,pPrbElem->numSymb,pPrbElem->nBeamIndex, pPrbElem->bf_weight_update, pPrbElem->compMethod, pPrbElem->iqWidth, pPrbElem->BeamFormingType);\r
- }\r
- }else if (strcmp(key, KEY_NPRBELEM_DL ) == 0) {\r
- config->PrbMapDl.nPrbElm = atoi(value);\r
- if (config->PrbMapDl.nPrbElm > XRAN_MAX_PRBS)\r
- {\r
- printf("nTddPeriod is larger than max allowed, invalid!\n");\r
- config->PrbMapDl.nPrbElm = XRAN_MAX_PRBS;\r
- }\r
- printf("nPrbElemDl: %d\n",config->PrbMapDl.nPrbElm);\r
- } else if (strncmp(key, KEY_PRBELEM_DL, strlen(KEY_PRBELEM_DL)) == 0) {\r
- unsigned int section_idx = 0;\r
- sscanf(key,"PrbElemDl%u",§ion_idx);\r
- if (section_idx >= config->PrbMapDl.nPrbElm){\r
- printf("section_idx %d exceeds nPrbElem\n",section_idx);\r
- }\r
- else{\r
- struct xran_prb_elm *pPrbElem = &config->PrbMapDl.prbMap[section_idx];\r
- sscanf(value, "%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",\r
- (int16_t*)&pPrbElem->nRBStart,\r
- (int16_t*)&pPrbElem->nRBSize,\r
- (int16_t*)&pPrbElem->nStartSymb,\r
- (int16_t*)&pPrbElem->numSymb,\r
- (int16_t*)&pPrbElem->nBeamIndex,\r
- (int16_t*)&pPrbElem->bf_weight_update,\r
- (int16_t*)&pPrbElem->compMethod,\r
- (int16_t*)&pPrbElem->iqWidth,\r
- (int16_t*)&pPrbElem->BeamFormingType);\r
- printf("nPrbElemDl%d: ",section_idx);\r
- printf("nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",\r
- pPrbElem->nRBStart,pPrbElem->nRBSize,pPrbElem->nStartSymb,pPrbElem->numSymb,pPrbElem->nBeamIndex, pPrbElem->bf_weight_update, pPrbElem->compMethod, pPrbElem->iqWidth, pPrbElem->BeamFormingType);\r
- }\r
- } else {\r
- printf("Unsupported configuration key [%s]\n", key);\r
- return -1;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-int parseConfigFile(char *filename, RuntimeConfig *config)\r
-{\r
- char inputLine[MAX_LINE_SIZE] = {0};\r
- int inputLen = 0;\r
- int i;\r
- int lineNum = 0;\r
- char key[MAX_LINE_SIZE] = {0};\r
- char value[MAX_LINE_SIZE] = {0};\r
- FILE *file = fopen(filename, "r");\r
-\r
- if (NULL == file) {\r
- log_err("Error while opening config file from: %s", filename);\r
- return -1;\r
- }\r
-\r
-// init_config(config);\r
-\r
- for (;;) {\r
- if (fgets(inputLine, MAX_LINE_SIZE, file) == NULL) {\r
- if (lineNum > 0) {\r
- printf("%d lines of config file has been read.\n", lineNum);\r
- break;\r
- } else {\r
- printf("Configuration file reading error has occurred.\n");\r
- fclose(file);\r
- return -1;\r
- }\r
- }\r
-\r
- if (inputLine[strlen(inputLine)-1] == '\n')\r
- inputLine[strlen(inputLine)-1] == '\0';\r
-\r
- lineNum++;\r
- inputLen = strlen(inputLine);\r
-\r
- for (i=0; i<inputLen; i++)\r
- if (inputLine[i] == '#') {\r
- inputLine[i] = '\0';\r
- inputLen = i + 1;\r
- break;\r
- }\r
-\r
- for (i=0; i<inputLen; i++)\r
- if (inputLine[i] == '=') {\r
- strncpy(key, inputLine, i);\r
- key[i] = '\0';\r
- trim(key);\r
- if ((i + 1 > inputLen - 1) || (i - 2 > inputLen)) {\r
- log_err("Parsing config file error at line %d", lineNum);\r
- fclose(file);\r
- return -1;\r
- }\r
- strncpy(value, &inputLine[i+1], (sizeof(value) - 1));\r
- value[inputLen-i-2] = '\0';\r
- trim(value);\r
-\r
- if (strlen(key) == 0 || strlen(value) == 0) {\r
- printf("Parsing config file error at line %d", lineNum);\r
- fclose(file);\r
- return -1;\r
- }\r
-\r
- if (fillConfigStruct(config, key, value) != 0) {\r
- fclose(file);\r
- return -1;\r
- }\r
-\r
- break;\r
- }\r
-\r
- memset(&inputLine[0], 0, sizeof(MAX_LINE_SIZE));\r
- memset(&key[0], 0, sizeof(MAX_LINE_SIZE));\r
- memset(&value[0], 0, sizeof(MAX_LINE_SIZE));\r
- }\r
- fclose(file);\r
-\r
- return 0;\r
-}\r
+/******************************************************************************
+*
+* Copyright (c) 2020 Intel.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*******************************************************************************/
+
+/**
+ * @brief
+ * @file
+ * @ingroup
+ * @author Intel Corporation
+ **/
+
+#include "rte_common.h"
+#include "config.h"
+#include "common.h"
+#include "debug.h"
+
+#include <rte_ethdev.h>
+
+#define MAX_LINE_SIZE 512
+/* Configuration file maximum supported line length */
+
+#define KEY_APP_MODE "appMode"
+#define KEY_XRAN_MODE "xranMode"
+#define KEY_XRAN_TECH "xranRanTech"
+#define KEY_MU_NUMBER "mu"
+#define KEY_NDLABSFREPOINTA "nDLAbsFrePointA"
+#define KEY_NULABSFREPOINTA "nULAbsFrePointA"
+#define KEY_NDLBANDWIDTH "nDLBandwidth"
+#define KEY_NULBANDWIDTH "nULBandwidth"
+#define KEY_NDLFFTSIZE "nDLFftSize"
+#define KEY_NULFFTSIZE "nULFftSize"
+
+#define KEY_DU_PORT_ID_BITWIDTH "DU_Port_ID_bitwidth"
+#define KEY_BANDSECTOR_ID_BITWIDTH "BandSector_ID_bitwidth"
+#define KEY_CC_ID_BITWIDTH "CC_ID_bitwidth"
+#define KEY_RU_PORT_ID_BITWIDTH "RU_Port_ID_bitwidth"
+
+#define KEY_NFRAMEDUPLEXTYPE "nFrameDuplexType"
+#define KEY_NTDDPERIOD "nTddPeriod"
+
+#define KEY_SSLOTCONFIG "sSlotConfig"
+
+#define KEY_CC_PER_PORT_NUM "ccNum"
+#define KEY_ANT_NUM "antNum"
+#define KEY_UL_ANT_NUM "antNumUL"
+
+#define KEY_ANT_ELM_TRX_NUM "antElmTRx"
+
+#define KEY_MU_MIMO_UES_NUM "muMimoUEs"
+#define KEY_DLLAYERS_PER_UE "DlLayersPerUe"
+#define KEY_ULLAYERS_PER_UE "UlLayersPerUe"
+#define KEY_FILE_DLBFWUE "DlBfwUe"
+#define KEY_FILE_ULBFWUE "UlBfwUe"
+
+#define KEY_FILE_ULSRS "antSrsC"
+
+
+#define KEY_TTI_PERIOD "ttiPeriod"
+
+#define KEY_MTU_SIZE "MTUSize"
+#define KEY_IO_CORE "ioCore"
+#define KEY_IO_WORKER "ioWorker"
+#define KEY_IO_SLEEP "ioSleep"
+#define KEY_SYSTEM_CORE "systemCore"
+#define KEY_IOVA_MODE "iovaMode"
+
+#define KEY_INSTANCE_ID "instanceId"
+
+#define KEY_DU_MAC "duMac"
+#define KEY_RU_MAC "ruMac"
+
+#define KEY_FILE_NUMSLOTS "numSlots"
+#define KEY_FILE_AxC "antC"
+#define KEY_FILE_PRACH_AxC "antPrachC"
+
+#define KEY_PRACH_ENABLE "rachEanble"
+#define KEY_SRS_ENABLE "srsEanble"
+
+#define KEY_PRACH_CFGIDX "prachConfigIndex"
+#define KEY_SRS_SYM_IDX "srsSym"
+
+#define KEY_MAX_FRAME_ID "maxFrameId"
+
+
+#define KEY_IQ_SWAP "iqswap"
+#define KEY_HTONS_SWAP "nebyteorderswap"
+#define KEY_COMPRESSION "compression"
+#define KEY_COMP_TYPE "compType"
+
+
+#define KEY_BFW_NUM "totalBFWeights"
+
+#define KEY_TADV_CP_DL "Tadv_cp_dl"
+#define KEY_T2A_MIN_CP_DL "T2a_min_cp_dl"
+#define KEY_T2A_MAX_CP_DL "T2a_max_cp_dl"
+#define KEY_T2A_MIN_CP_UL "T2a_min_cp_ul"
+#define KEY_T2A_MAX_CP_UL "T2a_max_cp_ul"
+#define KEY_T2A_MIN_UP "T2a_min_up"
+#define KEY_T2A_MAX_UP "T2a_max_up"
+#define KEY_TA3_MIN "Ta3_min"
+#define KEY_TA3_MAX "Ta3_max"
+#define KEY_T1A_MIN_CP_DL "T1a_min_cp_dl"
+#define KEY_T1A_MAX_CP_DL "T1a_max_cp_dl"
+#define KEY_T1A_MIN_CP_UL "T1a_min_cp_ul"
+#define KEY_T1A_MAX_CP_UL "T1a_max_cp_ul"
+#define KEY_T1A_MIN_UP "T1a_min_up"
+#define KEY_T1A_MAX_UP "T1a_max_up"
+#define KEY_TA4_MIN "Ta4_min"
+#define KEY_TA4_MAX "Ta4_max"
+
+
+#define KEY_CP_ENABLE "CPenable"
+#define KEY_CP_VTAG "c_plane_vlan_tag"
+#define KEY_UP_VTAG "u_plane_vlan_tag"
+#define KEY_DEBUG_STOP "debugStop"
+#define KEY_DEBUG_STOP_CNT "debugStopCount"
+#define KEY_BBDEV_MODE "bbdevMode"
+#define KEY_DYNA_SEC_ENA "DynamicSectionEna"
+#define KEY_ALPHA "Gps_Alpha"
+#define KEY_BETA "Gps_Beta"
+
+#define KEY_NPRBELEM_DL "nPrbElemDl"
+#define KEY_PRBELEM_DL "PrbElemDl"
+
+#define KEY_NPRBELEM_UL "nPrbElemUl"
+#define KEY_PRBELEM_UL "PrbElemUl"
+
+
+/**
+ * Set runtime configuration parameters to their defaults.
+ *
+ * @todo Initialize missing parameters.
+ */
+static void init_config(RuntimeConfig* config)
+{
+ memset(config , 0, sizeof(RuntimeConfig));
+}
+
+/** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **/
+
+static void trim(char* input)
+{
+ uint32_t i;
+ for (i = 0; i<strlen(input); i++)
+ if (input[i] == ' ' || input[i] == '\n' || input[i] == '\t')
+ input[i] = '\0';
+}
+
+static int fillConfigStruct(RuntimeConfig *config, const char *key, const char *value)
+{
+ int32_t parse_res = 0;
+ static unsigned int section_idx_dl = 0, section_idx_ul;
+
+ if (strcmp(key, KEY_APP_MODE) == 0){
+ config->appMode = atoi(value);
+ } else if (strcmp(key, KEY_XRAN_TECH) == 0) {
+ config->xranTech = atoi(value);
+ } else if (strcmp(key, KEY_XRAN_MODE) == 0) {
+ config->xranCat = atoi(value);
+ } else if (strcmp(key, KEY_CC_PER_PORT_NUM) == 0) {
+ config->numCC= atoi(value);
+ } else if (strcmp(key, KEY_MU_NUMBER) == 0) {
+ config->mu_number= atoi(value);
+ printf("mu_number: %d\n",config->mu_number);
+ } else if (strcmp(key, KEY_NDLABSFREPOINTA) == 0) {
+ config->nDLAbsFrePointA = atoi(value);
+ printf("nDLAbsFrePointA: %d\n",config->nDLAbsFrePointA);
+ } else if (strcmp(key, KEY_NULABSFREPOINTA) == 0) {
+ config->nULAbsFrePointA = atoi(value);
+ printf("nULAbsFrePointA: %d\n",config->nULAbsFrePointA);
+ } else if (strcmp(key, KEY_NDLBANDWIDTH) == 0) {
+ config->nDLBandwidth = atoi(value);
+ printf("nDLBandwidth: %d\n",config->nDLBandwidth);
+ } else if (strcmp(key, KEY_NULBANDWIDTH) == 0) {
+ config->nULBandwidth = atoi(value);
+ printf("nULBandwidth: %d\n",config->nULBandwidth);
+ } else if (strcmp(key, KEY_NDLFFTSIZE) == 0) {
+ config->nDLFftSize = atoi(value);
+ printf("nDLFftSize: %d\n",config->nDLFftSize);
+ } else if (strcmp(key, KEY_NULFFTSIZE) == 0) {
+ config->nULFftSize = atoi(value);
+ printf("nULFftSize: %d\n",config->nULFftSize);
+ } else if (strcmp(key, KEY_NFRAMEDUPLEXTYPE) == 0) {
+ config->nFrameDuplexType = atoi(value);
+ printf("nFrameDuplexType: %d\n",config->nFrameDuplexType);
+ } else if (strcmp(key, KEY_DU_PORT_ID_BITWIDTH) == 0) {
+ config->DU_Port_ID_bitwidth = atoi(value);
+ printf("DU_Port_ID_bitwidth: %d\n",config->DU_Port_ID_bitwidth);
+ } else if (strcmp(key, KEY_BANDSECTOR_ID_BITWIDTH) == 0) {
+ config->BandSector_ID_bitwidth = atoi(value);
+ printf("BandSector_ID_bitwidth: %d\n",config->BandSector_ID_bitwidth);
+ } else if (strcmp(key, KEY_CC_ID_BITWIDTH) == 0) {
+ config->CC_ID_bitwidth = atoi(value);
+ printf("CC_ID_bitwidth: %d\n",config->CC_ID_bitwidth);
+ } else if (strcmp(key, KEY_RU_PORT_ID_BITWIDTH) == 0) {
+ config->RU_Port_ID_bitwidth = atoi(value);
+ printf("RU_Port_ID_bitwidth: %d\n",config->RU_Port_ID_bitwidth);
+ } else if (strcmp(key, KEY_NTDDPERIOD) == 0) {
+ config->nTddPeriod = atoi(value);
+ printf("nTddPeriod: %d\n",config->nTddPeriod);
+ if (config->nTddPeriod > XRAN_MAX_TDD_PERIODICITY)
+ {
+ printf("nTddPeriod is larger than max allowed, invalid!\n");
+ config->nTddPeriod = XRAN_MAX_TDD_PERIODICITY;
+ }
+ } else if (strncmp(key, KEY_SSLOTCONFIG, strlen(KEY_SSLOTCONFIG)) == 0) {
+ unsigned int slot_num = 0;
+ int i = 0;
+ sscanf(key,"sSlotConfig%u",&slot_num);
+ if (slot_num >= config->nTddPeriod){
+ printf("slot_num %d exceeds TddPeriod\n",slot_num);
+ }
+ else{
+ sscanf(value, "%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx,%02hhx",
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[0],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[1],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[2],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[3],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[4],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[5],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[6],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[7],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[8],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[9],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[10],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[11],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[12],
+ (uint8_t *)&config->sSlotConfig[slot_num].nSymbolType[13]);
+ printf("sSlotConfig%d: ",slot_num);
+ for (i = 0; i< 14; i++){
+ printf("%d ",config->sSlotConfig[slot_num].nSymbolType[i]);
+ }
+ printf("\n");
+ }
+ } else if (strcmp(key, KEY_ANT_NUM) == 0) {
+ config->numAxc = atoi(value);
+ } else if (strcmp(key, KEY_UL_ANT_NUM) == 0) {
+ config->numUlAxc = atoi(value);
+ }else if (strcmp(key, KEY_ANT_ELM_TRX_NUM) == 0) {
+ config->antElmTRx = atoi(value);
+ printf("antElmTRx %d\n", config->antElmTRx);
+ } else if (strcmp(key, KEY_MU_MIMO_UES_NUM) == 0) {
+ config->muMimoUEs = atoi(value);
+ } else if (strcmp(key, KEY_DLLAYERS_PER_UE) == 0) {
+ config->DlLayersPerUe = atoi(value);
+ } else if (strcmp(key, KEY_ULLAYERS_PER_UE) == 0) {
+ config->UlLayersPerUe = atoi(value);
+ } else if (strcmp(key, KEY_TTI_PERIOD) == 0) {
+ config->ttiPeriod = atoi(value);
+ } else if (strcmp(key, KEY_IQ_SWAP) == 0) {
+ config->iqswap = atoi(value);
+ } else if (strcmp(key, KEY_HTONS_SWAP) == 0) {
+ config->nebyteorderswap = atoi(value);
+ } else if (strcmp(key, KEY_COMPRESSION) == 0) {
+ config->compression = atoi(value);
+ } else if (strcmp(key, KEY_COMP_TYPE) == 0) {
+ config->CompHdrType = atoi(value);
+ } else if (strcmp(key, KEY_MTU_SIZE) == 0) {
+ config->mtu = atoi(value);
+ printf("mtu %d\n", config->mtu);
+ } else if (strcmp(key, KEY_IO_SLEEP) == 0) {
+ config->io_sleep = atoi(value);
+ printf("io_sleep %d \n", config->io_sleep);
+ } else if (strcmp(key, KEY_IO_CORE) == 0) {
+ config->io_core = atoi(value);
+ printf("io_core %d [core id]\n", config->io_core);
+ } else if (strcmp(key, KEY_IO_WORKER) == 0) {
+ config->io_worker = strtoll(value, NULL, 0);
+ printf("io_worker 0x%lx [mask]\n", config->io_worker);
+ } else if (strcmp(key, KEY_SYSTEM_CORE) == 0) {
+ config->system_core = atoi(value);
+ printf("system core %d [core id]\n", config->system_core);
+ } else if (strcmp(key, KEY_IOVA_MODE) == 0) {
+ config->iova_mode = atoi(value);
+ printf("iova_mode %d\n", config->iova_mode);
+ } else if (strcmp(key, KEY_INSTANCE_ID) == 0) {
+ config->instance_id = atoi(value);
+ printf("instance_id %d\n", config->instance_id);
+ } else if (strncmp(key, KEY_DU_MAC, strlen(KEY_DU_MAC)) == 0) {
+ unsigned int vf_num = 0;
+ sscanf(key,"duMac%02u",&vf_num);
+ if (vf_num >= XRAN_VF_MAX) {
+ printf("duMac%d exceeds max antenna supported\n",vf_num);
+ } else {
+ printf("duMac%d: %s\n",vf_num, value);
+ sscanf(value, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", (uint8_t*)&config->o_du_addr[vf_num].addr_bytes[0],
+ (uint8_t*)&config->o_du_addr[vf_num].addr_bytes[1],
+ (uint8_t*)&config->o_du_addr[vf_num].addr_bytes[2],
+ (uint8_t*)&config->o_du_addr[vf_num].addr_bytes[3],
+ (uint8_t*)&config->o_du_addr[vf_num].addr_bytes[4],
+ (uint8_t*)&config->o_du_addr[vf_num].addr_bytes[5]);
+
+ printf("[vf %d]O-DU MAC address: %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n",
+ vf_num,
+ config->o_du_addr[vf_num].addr_bytes[0],
+ config->o_du_addr[vf_num].addr_bytes[1],
+ config->o_du_addr[vf_num].addr_bytes[2],
+ config->o_du_addr[vf_num].addr_bytes[3],
+ config->o_du_addr[vf_num].addr_bytes[4],
+ config->o_du_addr[vf_num].addr_bytes[5]);
+ }
+ } else if (strncmp(key, KEY_RU_MAC, strlen(KEY_RU_MAC)) == 0) {
+ unsigned int vf_num = 0;
+ sscanf(key,"ruMac%02u",&vf_num);
+ if (vf_num >= XRAN_VF_MAX) {
+ printf("ruMac%d exceeds max antenna supported\n",vf_num);
+ } else {
+ printf("ruMac%d: %s\n",vf_num, value);
+
+ sscanf(value, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", (uint8_t*)&config->o_ru_addr[vf_num].addr_bytes[0],
+ (uint8_t*)&config->o_ru_addr[vf_num].addr_bytes[1],
+ (uint8_t*)&config->o_ru_addr[vf_num].addr_bytes[2],
+ (uint8_t*)&config->o_ru_addr[vf_num].addr_bytes[3],
+ (uint8_t*)&config->o_ru_addr[vf_num].addr_bytes[4],
+ (uint8_t*)&config->o_ru_addr[vf_num].addr_bytes[5]);
+
+ printf("[vf %d]RU MAC address: %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n",
+ vf_num,
+ config->o_ru_addr[vf_num].addr_bytes[0],
+ config->o_ru_addr[vf_num].addr_bytes[1],
+ config->o_ru_addr[vf_num].addr_bytes[2],
+ config->o_ru_addr[vf_num].addr_bytes[3],
+ config->o_ru_addr[vf_num].addr_bytes[4],
+ config->o_ru_addr[vf_num].addr_bytes[5]);
+ }
+ } else if (strcmp(key, KEY_FILE_NUMSLOTS) == 0) {
+ config->numSlots = atoi(value);
+ printf("numSlots: %d\n",config->numSlots);
+ }else if (strncmp(key, KEY_FILE_AxC, strlen(KEY_FILE_AxC)) == 0) {
+ unsigned int ant_num = 0;
+ sscanf(key,"antC%02u",&ant_num);
+ if (ant_num >= MAX_ANT_CARRIER_SUPPORTED) {
+ printf("antC%d exceeds max antenna supported\n",ant_num);
+ } else {
+ strncpy(&config->ant_file[ant_num][0], value, strlen(value));
+ printf("antC%d: %s\n",ant_num, config->ant_file[ant_num]);
+ }
+ } else if (strncmp(key, KEY_FILE_DLBFWUE, strlen(KEY_FILE_DLBFWUE)) == 0) {
+ unsigned int ue_num = 0;
+ sscanf(key,"DlBfwUe%02u",&ue_num);
+ if (ue_num >= MAX_ANT_CARRIER_SUPPORTED) {
+ printf("DlBfwUe%d exceeds max streams supported\n",ue_num);
+ } else {
+ strncpy(&config->dl_bfw_file[ue_num][0], value, strlen(value));
+ printf("DlBfwUe%d: %s\n",ue_num, config->dl_bfw_file[ue_num]);
+ }
+ }else if (strncmp(key, KEY_FILE_ULBFWUE, strlen(KEY_FILE_ULBFWUE)) == 0) {
+ unsigned int ue_num = 0;
+ sscanf(key,"UlBfwUe%02u",&ue_num);
+ if (ue_num >= MAX_ANT_CARRIER_SUPPORTED) {
+ printf("UlBfwUe%d exceeds max streams supported\n",ue_num);
+ } else {
+ strncpy(&config->ul_bfw_file[ue_num][0], value, strlen(value));
+ printf("UlBfwUe%d: %s\n",ue_num, config->ul_bfw_file[ue_num]);
+ }
+ }else if (strncmp(key, KEY_FILE_ULSRS, strlen(KEY_FILE_ULSRS)) == 0) {
+ unsigned int srs_ant = 0;
+ sscanf(key,"antSrsC%02u",&srs_ant);
+ if (srs_ant >= MAX_ANT_CARRIER_SUPPORTED_CAT_B) {
+ printf("antSrsC%d exceeds max ant elemnets supported [%d]\n", srs_ant, MAX_ANT_CARRIER_SUPPORTED_CAT_B);
+ } else {
+ strncpy(&config->ul_srs_file[srs_ant][0], value, strlen(value));
+ printf("antSrsC%d: %s\n",srs_ant, config->ul_srs_file[srs_ant]);
+ }
+ } else if (strcmp(key, KEY_PRACH_ENABLE) == 0) {
+ config->enablePrach = atoi(value);
+ printf("Prach enable: %d\n",config->enablePrach);
+ }else if (strcmp(key, KEY_MAX_FRAME_ID) == 0) {
+ config->maxFrameId = atoi(value);
+ printf("maxFrameId: %d\n",config->maxFrameId);
+ } else if (strcmp(key, KEY_SRS_ENABLE) == 0) {
+ config->enableSrs = atoi(value);
+ printf("Srs enable: %d\n",config->enablePrach);
+ } else if (strcmp(key, KEY_PRACH_CFGIDX) == 0) {
+ config->prachConfigIndex = atoi(value);
+ printf("Prach config index: %d\n",config->prachConfigIndex);
+ } else if (strcmp(key, KEY_SRS_SYM_IDX) == 0) {
+ config->srsSymMask = atoi(value);
+ printf("Srs symbol [0-13]: %d\n",config->srsSymMask);
+ } else if (strncmp(key, KEY_FILE_PRACH_AxC, strlen(KEY_FILE_PRACH_AxC)) == 0) {
+ unsigned int ant_num = 0;
+ sscanf(key,"antPrachC%02u",&ant_num);
+ if (ant_num >= MAX_ANT_CARRIER_SUPPORTED)
+ {
+ printf("antC%d exceeds max antenna supported\n",ant_num);
+ }
+ else{
+ strncpy(&config->prach_file[ant_num][0], value, strlen(value));
+ printf("antPrachC%d: %s\n",ant_num, config->prach_file[ant_num]);
+ }
+ } else if (strcmp(key, KEY_BFW_NUM) == 0) {
+ config->totalBfWeights = atoi(value);
+ printf("%s : %d\n",KEY_BFW_NUM, config->totalBfWeights);
+ /* timing */
+ } else if (strcmp(key, KEY_TADV_CP_DL ) == 0) {
+ config->Tadv_cp_dl = atoi(value);
+ printf("Tadv_cp_dl: %d\n",config->Tadv_cp_dl);
+ } else if (strcmp(key, KEY_T2A_MIN_CP_DL ) == 0) {
+ config->T2a_min_cp_dl = atoi(value);
+ printf("T2a_min_cp_dl: %d\n",config->T2a_min_cp_dl);
+ } else if (strcmp(key, KEY_T2A_MAX_CP_DL ) == 0) {
+ config->T2a_max_cp_dl = atoi(value);
+ printf("T2a_max_cp_dl: %d\n",config->T2a_max_cp_dl);
+ } else if (strcmp(key, KEY_T2A_MIN_CP_UL ) == 0) {
+ config->T2a_min_cp_ul = atoi(value);
+ printf("T2a_min_cp_ul: %d\n",config->T2a_min_cp_ul);
+ } else if (strcmp(key, KEY_T2A_MAX_CP_UL ) == 0) {
+ config->T2a_max_cp_ul = atoi(value);
+ printf("T2a_max_cp_ul: %d\n",config->T2a_max_cp_ul);
+ } else if (strcmp(key, KEY_T2A_MIN_UP ) == 0) {
+ config->T2a_min_up = atoi(value);
+ printf("T2a_min_up: %d\n",config->T2a_min_up);
+ } else if (strcmp(key, KEY_T2A_MAX_UP ) == 0) {
+ config->T2a_max_up = atoi(value);
+ printf("T2a_max_up: %d\n",config->T2a_max_up);
+ } else if (strcmp(key, KEY_TA3_MIN ) == 0) {
+ config->Ta3_min = atoi(value);
+ printf("Ta3_min: %d\n",config->Ta3_min);
+ } else if (strcmp(key, KEY_TA3_MAX ) == 0) {
+ config->Ta3_max = atoi(value);
+ printf("Ta3_max: %d\n",config->Ta3_max);
+ } else if (strcmp(key, KEY_T1A_MIN_CP_DL ) == 0) {
+ config->T1a_min_cp_dl = atoi(value);
+ printf("T1a_min_cp_dl: %d\n",config->T1a_min_cp_dl);
+ } else if (strcmp(key, KEY_T1A_MAX_CP_DL ) == 0) {
+ config->T1a_max_cp_dl = atoi(value);
+ printf("T1a_max_cp_dl: %d\n",config->T1a_max_cp_dl);
+ } else if (strcmp(key, KEY_T1A_MIN_CP_UL ) == 0) {
+ config->T1a_min_cp_ul = atoi(value);
+ printf("T1a_min_cp_ul: %d\n",config->T1a_min_cp_ul);
+ } else if (strcmp(key, KEY_T1A_MAX_CP_UL ) == 0) {
+ config->T1a_max_cp_ul = atoi(value);
+ printf("T1a_max_cp_ul: %d\n",config->T1a_max_cp_ul);
+ } else if (strcmp(key, KEY_T1A_MIN_UP ) == 0) {
+ config->T1a_min_up = atoi(value);
+ printf("T1a_min_up: %d\n",config->T1a_min_up);
+ } else if (strcmp(key, KEY_T1A_MAX_UP ) == 0) {
+ config->T1a_max_up = atoi(value);
+ printf("T1a_max_up: %d\n",config->T1a_max_up);
+ } else if (strcmp(key, KEY_TA4_MIN ) == 0) {
+ config->Ta4_min = atoi(value);
+ printf("Ta4_min: %d\n",config->Ta4_min);
+ } else if (strcmp(key, KEY_TA4_MAX ) == 0) {
+ config->Ta4_max = atoi(value);
+ printf("Ta4_max: %d\n",config->Ta4_max);
+ /* end of timing */
+ } else if (strcmp(key, KEY_CP_ENABLE ) == 0) {
+ config->enableCP = atoi(value);
+ printf("CPenable: %d\n",config->enableCP);
+ } else if (strcmp(key, KEY_DEBUG_STOP ) == 0) {
+ config->debugStop = atoi(value);
+ printf("debugStop: %d\n",config->debugStop);
+ } else if (strcmp(key, KEY_DEBUG_STOP_CNT) == 0) {
+ config->debugStopCount = atoi(value);
+ printf("debugStopCount: %d\n",config->debugStopCount);
+ } else if (strcmp(key, KEY_BBDEV_MODE) == 0) {
+ config->bbdevMode = atoi(value);
+ printf("bbdevMode: %d\n",config->debugStopCount);
+ } else if (strcmp(key, KEY_DYNA_SEC_ENA) == 0) {
+ config->DynamicSectionEna = atoi(value);
+ printf("DynamicSectionEna: %d\n",config->DynamicSectionEna);
+ } else if (strcmp(key, KEY_ALPHA) == 0) {
+ config->GPS_Alpha = atoi(value);
+ printf("GPS_Alpha: %d\n",config->GPS_Alpha);
+ } else if (strcmp(key, KEY_BETA) == 0) {
+ config->GPS_Beta = atoi(value);
+ printf("GPS_Beta: %d\n",config->GPS_Beta);
+ } else if (strcmp(key, KEY_CP_VTAG ) == 0) {
+ config->cp_vlan_tag = atoi(value);
+ printf("cp_vlan_tag: %d\n",config->cp_vlan_tag);
+ } else if (strcmp(key, KEY_UP_VTAG ) == 0) {
+ config->up_vlan_tag = atoi(value);
+ printf("up_vlan_tag: %d\n",config->up_vlan_tag);
+ } else if (strcmp(key, KEY_NPRBELEM_UL ) == 0) {
+ config->PrbMapUl.nPrbElm = atoi(value);
+ if (config->PrbMapUl.nPrbElm > XRAN_MAX_PRBS)
+ {
+ printf("nTddPeriod is larger than max allowed, invalid!\n");
+ config->PrbMapUl.nPrbElm = XRAN_MAX_PRBS;
+ }
+ printf("nPrbElemUl: %d\n",config->PrbMapUl.nPrbElm);
+ } else if (strncmp(key, KEY_PRBELEM_UL, strlen(KEY_PRBELEM_UL)) == 0) {
+ sscanf(key,"PrbElemUl%u",§ion_idx_ul);
+ if (section_idx_ul >= config->PrbMapUl.nPrbElm){
+ printf("section_idx %d exceeds nPrbElemUl\n",section_idx_ul);
+ }
+ else{
+ struct xran_prb_elm *pPrbElem = &config->PrbMapUl.prbMap[section_idx_ul];
+ sscanf(value, "%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",
+ (int16_t*)&pPrbElem->nRBStart,
+ (int16_t*)&pPrbElem->nRBSize,
+ (int16_t*)&pPrbElem->nStartSymb,
+ (int16_t*)&pPrbElem->numSymb,
+ (int16_t*)&pPrbElem->nBeamIndex,
+ (int16_t*)&pPrbElem->bf_weight_update,
+ (int16_t*)&pPrbElem->compMethod,
+ (int16_t*)&pPrbElem->iqWidth,
+ (int16_t*)&pPrbElem->BeamFormingType);
+ printf("nPrbElemUl%d: ",section_idx_ul);
+ printf("nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",
+ pPrbElem->nRBStart,pPrbElem->nRBSize,pPrbElem->nStartSymb,pPrbElem->numSymb,pPrbElem->nBeamIndex, pPrbElem->bf_weight_update, pPrbElem->compMethod, pPrbElem->iqWidth, pPrbElem->BeamFormingType);
+ }
+ }else if (strcmp(key, KEY_NPRBELEM_DL ) == 0) {
+ config->PrbMapDl.nPrbElm = atoi(value);
+ if (config->PrbMapDl.nPrbElm > XRAN_MAX_PRBS)
+ {
+ printf("nTddPeriod is larger than max allowed, invalid!\n");
+ config->PrbMapDl.nPrbElm = XRAN_MAX_PRBS;
+ }
+ printf("nPrbElemDl: %d\n",config->PrbMapDl.nPrbElm);
+ } else if (strncmp(key, KEY_PRBELEM_DL, strlen(KEY_PRBELEM_DL)) == 0) {
+ sscanf(key,"PrbElemDl%u",§ion_idx_dl);
+ if (section_idx_dl >= config->PrbMapDl.nPrbElm){
+ printf("section_idx %d exceeds nPrbElemDl\n",section_idx_dl);
+ }
+ else{
+ struct xran_prb_elm *pPrbElem = &config->PrbMapDl.prbMap[section_idx_dl];
+ sscanf(value, "%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",
+ (int16_t*)&pPrbElem->nRBStart,
+ (int16_t*)&pPrbElem->nRBSize,
+ (int16_t*)&pPrbElem->nStartSymb,
+ (int16_t*)&pPrbElem->numSymb,
+ (int16_t*)&pPrbElem->nBeamIndex,
+ (int16_t*)&pPrbElem->bf_weight_update,
+ (int16_t*)&pPrbElem->compMethod,
+ (int16_t*)&pPrbElem->iqWidth,
+ (int16_t*)&pPrbElem->BeamFormingType);
+ printf("nPrbElemDl%d: ",section_idx_dl);
+ printf("nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",
+ pPrbElem->nRBStart,pPrbElem->nRBSize,pPrbElem->nStartSymb,pPrbElem->numSymb,pPrbElem->nBeamIndex, pPrbElem->bf_weight_update, pPrbElem->compMethod, pPrbElem->iqWidth, pPrbElem->BeamFormingType);
+ }
+ } else {
+ printf("Unsupported configuration key [%s]\n", key);
+ return -1;
+ }
+
+ return 0;
+}
+
+int parseConfigFile(char *filename, RuntimeConfig *config)
+{
+ char inputLine[MAX_LINE_SIZE] = {0};
+ int inputLen = 0;
+ int i;
+ int lineNum = 0;
+ char key[MAX_LINE_SIZE] = {0};
+ char value[MAX_LINE_SIZE] = {0};
+ FILE *file = fopen(filename, "r");
+
+ if (NULL == file) {
+ log_err("Error while opening config file from: %s", filename);
+ return -1;
+ }
+
+// init_config(config);
+
+ for (;;) {
+ if (fgets(inputLine, MAX_LINE_SIZE, file) == NULL) {
+ if (lineNum > 0) {
+ printf("%d lines of config file has been read.\n", lineNum);
+ break;
+ } else {
+ printf("Configuration file reading error has occurred.\n");
+ fclose(file);
+ return -1;
+ }
+ }
+
+ if (inputLine[strlen(inputLine)-1] == '\n')
+ inputLine[strlen(inputLine)-1] == '\0';
+
+ lineNum++;
+ inputLen = strlen(inputLine);
+
+ for (i=0; i<inputLen; i++)
+ if (inputLine[i] == '#') {
+ inputLine[i] = '\0';
+ inputLen = i + 1;
+ break;
+ }
+
+ for (i=0; i<inputLen; i++)
+ if (inputLine[i] == '=') {
+ strncpy(key, inputLine, i);
+ key[i] = '\0';
+ trim(key);
+ if ((i + 1 > inputLen - 1) || (i - 2 > inputLen)) {
+ log_err("Parsing config file error at line %d", lineNum);
+ fclose(file);
+ return -1;
+ }
+ strncpy(value, &inputLine[i+1], (sizeof(value) - 1));
+ value[inputLen-i-2] = '\0';
+ trim(value);
+
+ if (strlen(key) == 0 || strlen(value) == 0) {
+ printf("Parsing config file error at line %d", lineNum);
+ fclose(file);
+ return -1;
+ }
+
+ if (fillConfigStruct(config, key, value) != 0) {
+ fclose(file);
+ return -1;
+ }
+
+ break;
+ }
+
+ memset(&inputLine[0], 0, sizeof(MAX_LINE_SIZE));
+ memset(&key[0], 0, sizeof(MAX_LINE_SIZE));
+ memset(&value[0], 0, sizeof(MAX_LINE_SIZE));
+ }
+ fclose(file);
+
+ return 0;
+}