Front Haul Interface Library first seed code contribution
[o-du/phy.git] / fhi_lib / app / src / config.c
diff --git a/fhi_lib/app/src/config.c b/fhi_lib/app/src/config.c
new file mode 100644 (file)
index 0000000..1564c8d
--- /dev/null
@@ -0,0 +1,373 @@
+/******************************************************************************
+*
+*   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;
+}