/****************************************************************************** * * Copyright (c) 2019 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 #define MAX_LINE_SIZE 512 /* Configuration file maximum supported line length */ #define KEY_APP_MODE "appMode" #define KEY_XRAN_MODE "xranMode" #define KEY_MU_NUMBER "mu" #define KEY_CC_PER_PORT_NUM "ccNum" #define KEY_ANT_NUM "antNum" #define KEY_TTI_PERIOD "ttiPeriod" #define KEY_LLS_CU_MAC "llsCUMac" #define KEY_RU_MAC "ruMac" #define KEY_FILE_AxC0 "antC0" #define KEY_FILE_AxC1 "antC1" #define KEY_FILE_AxC2 "antC2" #define KEY_FILE_AxC3 "antC3" #define KEY_FILE_AxC4 "antC4" #define KEY_FILE_AxC5 "antC5" #define KEY_FILE_AxC6 "antC6" #define KEY_FILE_AxC7 "antC7" #define KEY_FILE_AxC8 "antC8" #define KEY_FILE_AxC9 "antC9" #define KEY_FILE_AxC10 "antC10" #define KEY_FILE_AxC11 "antC11" #define KEY_FILE_AxC12 "antC12" #define KEY_FILE_AxC13 "antC13" #define KEY_FILE_AxC14 "antC14" #define KEY_FILE_AxC15 "antC15" #define KEY_PRACH_ENABLE "rachEanble" #define KEY_PRACH_OFFSET "rachOffset" #define KEY_PRACH_CFG_IDX "rachCfgIdx" #define KEY_IQ_SWAP "iqswap" #define KEY_HTONS_SWAP "nebyteorderswap" #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" /** * 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; iappMode = atoi(value); } else if (strcmp(key, KEY_XRAN_MODE) == 0) { config->xranMode = 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); } else if (strcmp(key, KEY_ANT_NUM) == 0) { config->numAxc = 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_LLS_CU_MAC) == 0) { sscanf(value, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->lls_cu_addr.addr_bytes[0], (uint32_t*)&config->lls_cu_addr.addr_bytes[1], (uint32_t*)&config->lls_cu_addr.addr_bytes[2], (uint32_t*)&config->lls_cu_addr.addr_bytes[3], (uint32_t*)&config->lls_cu_addr.addr_bytes[4], (uint32_t*)&config->lls_cu_addr.addr_bytes[5]); printf("lls-CU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n", config->lls_cu_addr.addr_bytes[0], config->lls_cu_addr.addr_bytes[1], config->lls_cu_addr.addr_bytes[2], config->lls_cu_addr.addr_bytes[3], config->lls_cu_addr.addr_bytes[4], config->lls_cu_addr.addr_bytes[5]); } else if (strcmp(key, KEY_RU_MAC) == 0) { sscanf(value, "%02x:%02x:%02x:%02x:%02x:%02x", (uint32_t*)&config->ru_addr.addr_bytes[0], (uint32_t*)&config->ru_addr.addr_bytes[1], (uint32_t*)&config->ru_addr.addr_bytes[2], (uint32_t*)&config->ru_addr.addr_bytes[3], (uint32_t*)&config->ru_addr.addr_bytes[4], (uint32_t*)&config->ru_addr.addr_bytes[5]); printf("RU MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n", config->ru_addr.addr_bytes[0], config->ru_addr.addr_bytes[1], config->ru_addr.addr_bytes[2], config->ru_addr.addr_bytes[3], config->ru_addr.addr_bytes[4], config->ru_addr.addr_bytes[5]); } else if (strcmp(key, KEY_FILE_AxC0) == 0) { strncpy(&config->ant_file[0][0], value, strlen(value)); printf("ant0: %s\n",config->ant_file[0]); } else if (strcmp(key, KEY_FILE_AxC1) == 0) { strncpy(&config->ant_file[1][0], value, strlen(value)); printf("ant1: %s\n",config->ant_file[1]); } else if (strcmp(key, KEY_FILE_AxC2) == 0) { strncpy(&config->ant_file[2][0], value, strlen(value)); printf("ant2: %s\n",config->ant_file[2]); } else if (strcmp(key, KEY_FILE_AxC3) == 0) { strncpy(&config->ant_file[3][0], value, strlen(value)); printf("ant3: %s\n",config->ant_file[3]); } else if (strcmp(key, KEY_FILE_AxC4) == 0) { strncpy(&config->ant_file[4][0], value, strlen(value)); printf("ant4: %s\n",config->ant_file[4]); } else if (strcmp(key, KEY_FILE_AxC5) == 0) { strncpy(&config->ant_file[5][0], value, strlen(value)); printf("ant5: %s\n",config->ant_file[5]); } else if (strcmp(key, KEY_FILE_AxC6) == 0) { strncpy(&config->ant_file[6][0], value, strlen(value)); printf("ant6: %s\n",config->ant_file[6]); } else if (strcmp(key, KEY_FILE_AxC7) == 0) { strncpy(&config->ant_file[7][0], value, strlen(value)); printf("ant7: %s\n",config->ant_file[7]); } else if (strcmp(key, KEY_FILE_AxC8) == 0) { strncpy(&config->ant_file[8][0], value, strlen(value)); printf("ant8: %s\n",config->ant_file[8]); } else if (strcmp(key, KEY_FILE_AxC9) == 0) { strncpy(&config->ant_file[9][0], value, strlen(value)); printf("ant9: %s\n",config->ant_file[9]); } else if (strcmp(key, KEY_FILE_AxC10) == 0) { strncpy(&config->ant_file[10][0], value, strlen(value)); printf("ant10: %s\n",config->ant_file[10]); } else if (strcmp(key, KEY_FILE_AxC11) == 0) { strncpy(&config->ant_file[11][0], value, strlen(value)); printf("ant11: %s\n",config->ant_file[11]); } else if (strcmp(key, KEY_FILE_AxC12) == 0) { strncpy(&config->ant_file[12][0], value, strlen(value)); printf("ant12: %s\n",config->ant_file[12]); } else if (strcmp(key, KEY_FILE_AxC13) == 0) { strncpy(&config->ant_file[13][0], value, strlen(value)); printf("ant13: %s\n",config->ant_file[13]); } else if (strcmp(key, KEY_FILE_AxC14) == 0) { strncpy(&config->ant_file[14][0], value, strlen(value)); printf("ant14: %s\n",config->ant_file[14]); } else if (strcmp(key, KEY_FILE_AxC15) == 0) { strncpy(&config->ant_file[15][0], value, strlen(value)); printf("ant15: %s\n",config->ant_file[15]); } else if (strcmp(key, KEY_PRACH_ENABLE) == 0) { config->enablePrach = atoi(value); printf("Prach enable: %d\n",config->enablePrach); } else if (strcmp(key, KEY_PRACH_OFFSET ) == 0) { config->prachOffset = atoi(value); printf("Prach Offset: %d\n",config->prachOffset); } else if (strcmp(key, KEY_PRACH_CFG_IDX ) == 0) { config->prachConfigIndex = atoi(value); printf("Prach Conf Index: %d\n",config->prachConfigIndex); /* 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_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 { 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 - 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; }