X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=o-du%2Fphy.git;a=blobdiff_plain;f=fapi_5g%2Fsource%2Futils%2Fnr5g_fapi_config_loader.c;fp=fapi_5g%2Fsource%2Futils%2Fnr5g_fapi_config_loader.c;h=2aa684b6d0cbf4d1d8855b57e18ad0267945aebe;hp=0000000000000000000000000000000000000000;hb=9d66fca5c45c8b3e0d6eab6d51a90c8e9d2614dc;hpb=2fbf70096f64af622da983e88c5a64e90ad9bdbd diff --git a/fapi_5g/source/utils/nr5g_fapi_config_loader.c b/fapi_5g/source/utils/nr5g_fapi_config_loader.c new file mode 100644 index 0000000..2aa684b --- /dev/null +++ b/fapi_5g/source/utils/nr5g_fapi_config_loader.c @@ -0,0 +1,192 @@ +/****************************************************************************** +* +* 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. +* +*******************************************************************************/ +#include "nr5g_fapi_config_loader.h" +#include "nr5g_fapi_dpdk.h" +#include "sched.h" + +#define NR5G_FAPI_MAX_SHMSIZE (2126512128) +char *fgets_s( + char *string, + size_t len, + FILE * fp); + +p_nr5g_fapi_cfg_t nr5g_fapi_config_loader( + char *prgname, + const char *cfg_fname) +{ + struct rte_cfgfile *cfg_file; + p_nr5g_fapi_cfg_t cfg; + const char *entry; + size_t dev_name_len; + unsigned int num_cpus = 0; + char check_core_count[255], *max_core; + FILE *fp = NULL; + + if (cfg_fname == NULL) { + printf("Error: Configuration filename was not passed."); + return NULL; + } + + cfg_file = rte_cfgfile_load(cfg_fname, 0); + if (cfg_file == NULL) { + printf("Error: Cofiguration file loading failed."); + return NULL; + } + + cfg = (p_nr5g_fapi_cfg_t) calloc(1, sizeof(nr5g_fapi_cfg_t)); + if (!cfg) { + printf("Error: not enough memory in the system"); + return NULL; + } + cfg->prgname = prgname; + fp = popen("cat /proc/cpuinfo | grep processor | wc -l", "r"); + if (NULL == fp) { + printf("Error: In getting maximum number of lcores in the system."); + free(cfg); + return NULL; + } + max_core = fgets_s(check_core_count, 255, fp); + if (NULL == max_core) { + printf("Error: In getting maximum number of lcores in the system."); + free(cfg); + pclose(fp); + return NULL; + } + num_cpus = atoi(max_core); + entry = rte_cfgfile_get_entry(cfg_file, "MAC2PHY_WORKER", "core_id"); + if (entry) { + cfg->mac2phy_worker.core_id = (uint8_t) atoi(entry); + if (cfg->mac2phy_worker.core_id >= (uint8_t) num_cpus) { + printf("Core Id is not in the range 0 to %d: configured: %d\n", + num_cpus, cfg->mac2phy_worker.core_id); + exit(-1); + } + } + + entry = + rte_cfgfile_get_entry(cfg_file, "MAC2PHY_WORKER", "thread_sched_policy"); + if (entry) { + cfg->mac2phy_worker.thread_sched_policy = (uint8_t) atoi(entry); + if (cfg->mac2phy_worker.thread_sched_policy != SCHED_FIFO && + cfg->mac2phy_worker.thread_sched_policy != SCHED_RR) { + printf("Thread Poicy valid range is Schedule Policy [0: SCHED_FIFO" + " 1: SCHED_RR]: configured: %d\n", + cfg->mac2phy_worker.thread_sched_policy); + exit(-1); + } + } + + int min_prio = + sched_get_priority_min(cfg->mac2phy_worker.thread_sched_policy); + int max_prio = + sched_get_priority_max(cfg->mac2phy_worker.thread_sched_policy); + entry = + rte_cfgfile_get_entry(cfg_file, "MAC2PHY_WORKER", "thread_priority"); + if (entry) { + cfg->mac2phy_worker.thread_priority = (uint8_t) atoi(entry); + if (cfg->mac2phy_worker.thread_priority < min_prio && + cfg->mac2phy_worker.thread_priority > max_prio) { + printf("Thread priority valid range is %d to %d: configured: %d\n", + min_prio, max_prio, cfg->mac2phy_worker.thread_priority); + exit(-1); + } + } + + entry = rte_cfgfile_get_entry(cfg_file, "PHY2MAC_WORKER", "core_id"); + if (entry) { + cfg->phy2mac_worker.core_id = (uint8_t) atoi(entry); + if (cfg->phy2mac_worker.core_id >= (uint8_t) num_cpus) { + printf("Core Id is not in the range 0 to %d configured: %d\n", + num_cpus, cfg->phy2mac_worker.core_id); + exit(-1); + } + } + + entry = + rte_cfgfile_get_entry(cfg_file, "PHY2MAC_WORKER", "thread_sched_policy"); + if (entry) { + cfg->phy2mac_worker.thread_sched_policy = (uint8_t) atoi(entry); + if (cfg->phy2mac_worker.thread_sched_policy != SCHED_FIFO && + cfg->phy2mac_worker.thread_sched_policy != SCHED_RR) { + printf("Thread Poicy valid range is Schedule Policy [0: SCHED_FIFO" + " 1: SCHED_RR] configured: %d\n", + cfg->phy2mac_worker.thread_sched_policy); + exit(-1); + } + } + + entry = + rte_cfgfile_get_entry(cfg_file, "PHY2MAC_WORKER", "thread_priority"); + if (entry) { + cfg->phy2mac_worker.thread_priority = (uint8_t) atoi(entry); + if (cfg->phy2mac_worker.thread_priority < min_prio && + cfg->phy2mac_worker.thread_priority > max_prio) { + printf("Thread priority valid range is %d to %d configured: %d\n", + min_prio, max_prio, cfg->phy2mac_worker.thread_priority); + exit(-1); + } + } + + entry = rte_cfgfile_get_entry(cfg_file, "WLS_CFG", "device_name"); + if (entry) { + dev_name_len = (strlen(entry) > (NR5G_FAPI_DEVICE_NAME_LEN)) ? + (NR5G_FAPI_DEVICE_NAME_LEN) : strlen(entry); + rte_strlcpy(cfg->wls.device_name, entry, dev_name_len + 1); + } + + entry = rte_cfgfile_get_entry(cfg_file, "WLS_CFG", "shmem_size"); + if (entry) { + cfg->wls.shmem_size = (uint64_t) atoll(entry); + if (cfg->wls.shmem_size > NR5G_FAPI_MAX_SHMSIZE) { + printf("The memory range cannot exceed %d", NR5G_FAPI_MAX_SHMSIZE); + exit(-1); + } + } + + entry = rte_cfgfile_get_entry(cfg_file, "LOGGER", "level"); + if (entry) { + if (!strcmp(entry, "info")) + cfg->logger.level = INFO_LOG; + else if (!strcmp(entry, "debug")) + cfg->logger.level = DEBUG_LOG; + else if (!strcmp(entry, "error")) + cfg->logger.level = ERROR_LOG; + else if (!strcmp(entry, "trace")) + cfg->logger.level = TRACE_LOG; + else if (!strcmp(entry, "hexdump")) + cfg->logger.level = HEXDUMP_LOG; + else + cfg->logger.level = NONE_LOG; + } + + pclose(fp); + + return cfg; +} + +char *fgets_s( + char *string, + size_t len, + FILE * fp) +{ + if (fgets(string, len, fp) != 0) { + string[strcspn(string, "\n")] = '\0'; + return string; + } + return 0; +}