26 #include "rte_common.h" 31 #include <rte_ethdev.h> 33 #define MAX_LINE_SIZE 512 36 #define KEY_APP_MODE "appMode" 37 #define KEY_XRAN_MODE "xranMode" 38 #define KEY_MU_NUMBER "mu" 39 #define KEY_NDLABSFREPOINTA "nDLAbsFrePointA" 40 #define KEY_NULABSFREPOINTA "nULAbsFrePointA" 41 #define KEY_NDLBANDWIDTH "nDLBandwidth" 42 #define KEY_NULBANDWIDTH "nULBandwidth" 43 #define KEY_NDLFFTSIZE "nDLFftSize" 44 #define KEY_NULFFTSIZE "nULFftSize" 46 #define KEY_NFRAMEDUPLEXTYPE "nFrameDuplexType" 47 #define KEY_NTDDPERIOD "nTddPeriod" 49 #define KEY_SSLOTCONFIG "sSlotConfig" 51 #define KEY_CC_PER_PORT_NUM "ccNum" 52 #define KEY_ANT_NUM "antNum" 53 #define KEY_UL_ANT_NUM "antNumUL" 55 #define KEY_ANT_ELM_TRX_NUM "antElmTRx" 57 #define KEY_MU_MIMO_UES_NUM "muMimoUEs" 58 #define KEY_DLLAYERS_PER_UE "DlLayersPerUe" 59 #define KEY_ULLAYERS_PER_UE "UlLayersPerUe" 60 #define KEY_FILE_DLBFWUE "DlBfwUe" 61 #define KEY_FILE_ULBFWUE "UlBfwUe" 63 #define KEY_FILE_ULSRS "antSrsC" 66 #define KEY_TTI_PERIOD "ttiPeriod" 68 #define KEY_MTU_SIZE "MTUSize" 69 #define KEY_IO_CORE "ioCore" 70 #define KEY_INSTANCE_ID "instanceId" 72 #define KEY_LLS_CU_MAC "llsCUMac" 73 #define KEY_RU_MAC "ruMac" 75 #define KEY_FILE_NUMSLOTS "numSlots" 76 #define KEY_FILE_AxC "antC" 77 #define KEY_FILE_PRACH_AxC "antPrachC" 79 #define KEY_PRACH_ENABLE "rachEanble" 80 #define KEY_SRS_ENABLE "srsEanble" 82 #define KEY_PRACH_CFGIDX "prachConfigIndex" 83 #define KEY_SRS_SYM_IDX "srsSym" 85 #define KEY_MAX_FRAME_ID "maxFrameId" 88 #define KEY_IQ_SWAP "iqswap" 89 #define KEY_HTONS_SWAP "nebyteorderswap" 90 #define KEY_COMPRESSION "compression" 92 #define KEY_BFW_NUM "totalBFWeights" 94 #define KEY_TADV_CP_DL "Tadv_cp_dl" 95 #define KEY_T2A_MIN_CP_DL "T2a_min_cp_dl" 96 #define KEY_T2A_MAX_CP_DL "T2a_max_cp_dl" 97 #define KEY_T2A_MIN_CP_UL "T2a_min_cp_ul" 98 #define KEY_T2A_MAX_CP_UL "T2a_max_cp_ul" 99 #define KEY_T2A_MIN_UP "T2a_min_up" 100 #define KEY_T2A_MAX_UP "T2a_max_up" 101 #define KEY_TA3_MIN "Ta3_min" 102 #define KEY_TA3_MAX "Ta3_max" 103 #define KEY_T1A_MIN_CP_DL "T1a_min_cp_dl" 104 #define KEY_T1A_MAX_CP_DL "T1a_max_cp_dl" 105 #define KEY_T1A_MIN_CP_UL "T1a_min_cp_ul" 106 #define KEY_T1A_MAX_CP_UL "T1a_max_cp_ul" 107 #define KEY_T1A_MIN_UP "T1a_min_up" 108 #define KEY_T1A_MAX_UP "T1a_max_up" 109 #define KEY_TA4_MIN "Ta4_min" 110 #define KEY_TA4_MAX "Ta4_max" 113 #define KEY_CP_ENABLE "CPenable" 114 #define KEY_CP_VTAG "c_plane_vlan_tag" 115 #define KEY_UP_VTAG "u_plane_vlan_tag" 116 #define KEY_DEBUG_STOP "debugStop" 117 #define KEY_DEBUG_STOP_CNT "debugStopCount" 118 #define KEY_BBDEV_MODE "bbdevMode" 119 #define KEY_DYNA_SEC_ENA "DynamicSectionEna" 120 #define KEY_ALPHA "Gps_Alpha" 121 #define KEY_BETA "Gps_Beta" 123 #define KEY_NPRBELEM_DL "nPrbElemDl" 124 #define KEY_PRBELEM_DL "PrbElemDl" 126 #define KEY_NPRBELEM_UL "nPrbElemUl" 127 #define KEY_PRBELEM_UL "PrbElemUl" 141 static void trim(
char* input)
144 for (i = 0; i<strlen(input); i++)
145 if (input[i] ==
' ' || input[i] ==
'\n' || input[i] ==
'\t')
149 static int fillConfigStruct(
RuntimeConfig *config,
const char *key,
const char *value)
151 int32_t parse_res = 0;
158 config->
numCC= atoi(value);
161 printf(
"mu_number: %d\n",config->
mu_number);
176 printf(
"nDLFftSize: %d\n",config->
nDLFftSize);
179 printf(
"nULFftSize: %d\n",config->
nULFftSize);
185 printf(
"nTddPeriod: %d\n",config->
nTddPeriod);
188 printf(
"nTddPeriod is larger than max allowed, invalid!\n");
192 unsigned int slot_num = 0;
194 sscanf(key,
"sSlotConfig%u",&slot_num);
196 printf(
"slot_num %d exceeds TddPeriod\n",slot_num);
199 sscanf(value,
"%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x",
214 printf(
"sSlotConfig%d: ",slot_num);
215 for (i = 0; i< 14; i++){
221 config->
numAxc = atoi(value);
226 printf(
"antElmTRx %d\n", config->
antElmTRx);
236 config->
iqswap = atoi(value);
242 config->
mtu = atoi(value);
243 printf(
"mtu %d\n", config->
mtu);
246 printf(
"io_core %d\n", config->
io_core);
251 sscanf(value,
"%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->
o_du_addr.addr_bytes[0],
252 (uint32_t*)&config->
o_du_addr.addr_bytes[1],
253 (uint32_t*)&config->
o_du_addr.addr_bytes[2],
254 (uint32_t*)&config->
o_du_addr.addr_bytes[3],
255 (uint32_t*)&config->
o_du_addr.addr_bytes[4],
256 (uint32_t*)&config->
o_du_addr.addr_bytes[5]);
258 printf(
"lls-CU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",
267 sscanf(value,
"%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->
o_ru_addr.addr_bytes[0],
268 (uint32_t*)&config->
o_ru_addr.addr_bytes[1],
269 (uint32_t*)&config->
o_ru_addr.addr_bytes[2],
270 (uint32_t*)&config->
o_ru_addr.addr_bytes[3],
271 (uint32_t*)&config->
o_ru_addr.addr_bytes[4],
272 (uint32_t*)&config->
o_ru_addr.addr_bytes[5]);
274 printf(
"RU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n",
283 printf(
"numSlots: %d\n",config->
numSlots);
286 sscanf(key,
"antC%02u",&ant_num);
288 printf(
"antC%d exceeds max antenna supported\n",ant_num);
290 strncpy(&config->
ant_file[ant_num][0], value, strlen(value));
291 printf(
"antC%d: %s\n",ant_num, config->
ant_file[ant_num]);
294 unsigned int ue_num = 0;
295 sscanf(key,
"DlBfwUe%02u",&ue_num);
297 printf(
"DlBfwUe%d exceeds max streams supported\n",ue_num);
299 strncpy(&config->
dl_bfw_file[ue_num][0], value, strlen(value));
300 printf(
"DlBfwUe%d: %s\n",ue_num, config->
dl_bfw_file[ue_num]);
303 unsigned int ue_num = 0;
304 sscanf(key,
"UlBfwUe%02u",&ue_num);
306 printf(
"UlBfwUe%d exceeds max streams supported\n",ue_num);
308 strncpy(&config->
ul_bfw_file[ue_num][0], value, strlen(value));
309 printf(
"UlBfwUe%d: %s\n",ue_num, config->
ul_bfw_file[ue_num]);
312 unsigned int srs_ant = 0;
313 sscanf(key,
"antSrsC%02u",&srs_ant);
317 strncpy(&config->
ul_srs_file[srs_ant][0], value, strlen(value));
318 printf(
"antSrsC%d: %s\n",srs_ant, config->
ul_srs_file[srs_ant]);
325 printf(
"maxFrameId: %d\n",config->
maxFrameId);
334 printf(
"Srs symbol [0-13]: %d\n",config->
srsSymMask);
337 sscanf(key,
"antPrachC%02u",&ant_num);
340 printf(
"antC%d exceeds max antenna supported\n",ant_num);
343 strncpy(&config->
prach_file[ant_num][0], value, strlen(value));
344 printf(
"antPrachC%d: %s\n",ant_num, config->
prach_file[ant_num]);
352 printf(
"Tadv_cp_dl: %d\n",config->
Tadv_cp_dl);
367 printf(
"T2a_min_up: %d\n",config->
T2a_min_up);
370 printf(
"T2a_max_up: %d\n",config->
T2a_max_up);
373 printf(
"Ta3_min: %d\n",config->
Ta3_min);
376 printf(
"Ta3_max: %d\n",config->
Ta3_max);
391 printf(
"T1a_min_up: %d\n",config->
T1a_min_up);
394 printf(
"T1a_max_up: %d\n",config->
T1a_max_up);
397 printf(
"Ta4_min: %d\n",config->
Ta4_min);
400 printf(
"Ta4_max: %d\n",config->
Ta4_max);
404 printf(
"CPenable: %d\n",config->
enableCP);
407 printf(
"debugStop: %d\n",config->
debugStop);
417 }
else if (strcmp(key,
KEY_ALPHA) == 0) {
419 printf(
"GPS_Alpha: %d\n",config->
GPS_Alpha);
420 }
else if (strcmp(key,
KEY_BETA) == 0) {
422 printf(
"GPS_Beta: %d\n",config->
GPS_Beta);
433 printf(
"nTddPeriod is larger than max allowed, invalid!\n");
438 unsigned int section_idx = 0;
439 sscanf(key,
"PrbElemUl%u",§ion_idx);
441 printf(
"section_idx %d exceeds nPrbElem\n",section_idx);
445 sscanf(value,
"%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",
455 printf(
"nPrbElemUl%d: ",section_idx);
456 printf(
"nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",
463 printf(
"nTddPeriod is larger than max allowed, invalid!\n");
468 unsigned int section_idx = 0;
469 sscanf(key,
"PrbElemDl%u",§ion_idx);
471 printf(
"section_idx %d exceeds nPrbElem\n",section_idx);
475 sscanf(value,
"%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd,%hd",
485 printf(
"nPrbElemDl%d: ",section_idx);
486 printf(
"nRBStart %d,nRBSize %d,nStartSymb %d,numSymb %d,nBeamIndex %d, bf_weight_update %d compMethod %d, iqWidth %d BeamFormingType %d\n",
490 printf(
"Unsupported configuration key [%s]\n", key);
505 FILE *file = fopen(filename,
"r");
508 log_err(
"Error while opening config file from: %s", filename);
517 printf(
"%d lines of config file has been read.\n", lineNum);
520 printf(
"Configuration file reading error has occurred.\n");
526 if (inputLine[strlen(inputLine)-1] ==
'\n')
527 inputLine[strlen(inputLine)-1] ==
'\0';
530 inputLen = strlen(inputLine);
532 for (i=0; i<inputLen; i++)
533 if (inputLine[i] ==
'#') {
539 for (i=0; i<inputLen; i++)
540 if (inputLine[i] ==
'=') {
541 strncpy(key, inputLine, i);
544 if ((i + 1 > inputLen - 1) || (i - 2 > inputLen)) {
545 log_err(
"Parsing config file error at line %d", lineNum);
549 strncpy(value, &inputLine[i+1], (
sizeof(value) - 1));
550 value[inputLen-i-2] =
'\0';
553 if (strlen(key) == 0 || strlen(value) == 0) {
554 printf(
"Parsing config file error at line %d", lineNum);
559 if (fillConfigStruct(config, key, value) != 0) {
int32_t DynamicSectionEna
int parseConfigFile(char *filename, RuntimeConfig *config)
struct ether_addr o_du_addr
#define MAX_ANT_CARRIER_SUPPORTED
#define KEY_DEBUG_STOP_CNT
char prach_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
#define KEY_NDLABSFREPOINTA
#define KEY_ULLAYERS_PER_UE
#define KEY_FILE_NUMSLOTS
struct xran_prb_map PrbMapDl
char dl_bfw_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
#define KEY_T1A_MAX_CP_DL
#define KEY_T2A_MIN_CP_DL
uint8_t nSymbolType[XRAN_NUM_OF_SYMBOL_PER_SLOT]
#define KEY_NULABSFREPOINTA
#define KEY_T2A_MIN_CP_UL
#define KEY_CC_PER_PORT_NUM
struct ether_addr o_ru_addr
#define KEY_ANT_ELM_TRX_NUM
#define KEY_T1A_MAX_CP_UL
#define KEY_MU_MIMO_UES_NUM
#define KEY_T2A_MAX_CP_DL
#define MAX_ANT_CARRIER_SUPPORTED_CAT_B
#define KEY_FILE_PRACH_AxC
#define KEY_T1A_MIN_CP_UL
#define KEY_T2A_MAX_CP_UL
char ul_bfw_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
#define KEY_T1A_MIN_CP_DL
#define KEY_NFRAMEDUPLEXTYPE
char ant_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANTENNA_NR][512]
#define XRAN_MAX_TDD_PERIODICITY
struct xran_prb_elm prbMap[XRAN_MAX_PRBS]
struct xran_prb_map PrbMapUl
#define KEY_DLLAYERS_PER_UE
char ul_srs_file[XRAN_MAX_SECTOR_NR *XRAN_MAX_ANT_ARRAY_ELM_NR][512]
struct xran_slot_config sSlotConfig[XRAN_MAX_TDD_PERIODICITY]