1. Update Dockerfile for CI build. But there is dependency on Intel System Studio...
[o-du/phy.git] / fhi_lib / app / src / config.c
index 1564c8d..88bd649 100644 (file)
-/******************************************************************************
-*
-*   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 <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_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; 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;
-
-    if (strcmp(key, KEY_APP_MODE) == 0){
-        config->appMode = 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; 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;
-}
+/******************************************************************************\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
+#include <inttypes.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_SYSTEM_CORE         "systemCore"\r
+#define KEY_PKT_PROC_CORE         "pktProcCore"\r
+#define KEY_PKT_AUX_CORE         "pktAuxCore"\r
+#define KEY_TIMING_CORE         "timingCore"\r
+\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_SYSTEM_CORE) == 0) {\r
+        config->system_core = atoi(value);\r
+        printf("system_core -c %" PRIx64 "\n", config->system_core);\r
+    } else if (strcmp(key, KEY_PKT_PROC_CORE) == 0) {\r
+        config->pkt_proc_core = atoi(value);\r
+        printf("pkt_proc_core -c %" PRIx64 "\n", config->pkt_proc_core);\r
+    } else if (strcmp(key, KEY_PKT_AUX_CORE) == 0) {\r
+        config->pkt_aux_core = atoi(value);\r
+        printf("pkt_aux_core -c %" PRIx64 "\n", config->pkt_aux_core);\r
+    } else if (strcmp(key, KEY_TIMING_CORE) == 0) {\r
+        config->timing_core = atoi(value);\r
+        printf("timing_core -c %" PRIx64 "\n", config->timing_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",&section_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",&section_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