aboutsummaryrefslogtreecommitdiffstats
path: root/stacks/lwip_stack/src/maintain
diff options
context:
space:
mode:
Diffstat (limited to 'stacks/lwip_stack/src/maintain')
-rw-r--r--stacks/lwip_stack/src/maintain/CMakeLists.txt44
-rw-r--r--stacks/lwip_stack/src/maintain/fw_mt_config.c843
-rw-r--r--stacks/lwip_stack/src/maintain/nsfw_msg.c23
-rw-r--r--stacks/lwip_stack/src/maintain/nsfw_rti.c92
4 files changed, 1002 insertions, 0 deletions
diff --git a/stacks/lwip_stack/src/maintain/CMakeLists.txt b/stacks/lwip_stack/src/maintain/CMakeLists.txt
new file mode 100644
index 0000000..05c5117
--- /dev/null
+++ b/stacks/lwip_stack/src/maintain/CMakeLists.txt
@@ -0,0 +1,44 @@
+#########################################################################
+#
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd.
+# 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.
+#########################################################################
+
+if(WITH_HAL_LIB)
+else()
+ SET(PAL_H_DIRECTORIES "/usr/include/dpdk/")
+ SET(PAL_BITWIDE_ADJUST ${PROJECT_SOURCE_DIR}/../../src/framework/common/base/include/common_pal_bitwide_adjust.h)
+ ADD_DEFINITIONS(-include ${PAL_BITWIDE_ADJUST})
+ INCLUDE_DIRECTORIES(
+ ${PAL_H_DIRECTORIES}
+ )
+endif()
+
+FILE(GLOB_RECURSE NSTACKMAINTAIN *.c)
+
+LINK_LIBRARIES(m dl rt dmm_api)
+if(WITH_SECUREC_LIB)
+INCLUDE_DIRECTORIES(
+ ./
+ ${JSON_C_SRC}
+ ${SECUREC_SRC}
+ ${CMAKE_CURRENT_LIST_DIR}/../include/
+)
+else()
+INCLUDE_DIRECTORIES(
+ ./
+ ${JSON_C_SRC}
+ ${CMAKE_CURRENT_LIST_DIR}/../include/
+)
+endif()
+ADD_LIBRARY(nStackMaintain STATIC ${NSTACKMAINTAIN})
diff --git a/stacks/lwip_stack/src/maintain/fw_mt_config.c b/stacks/lwip_stack/src/maintain/fw_mt_config.c
new file mode 100644
index 0000000..400eaa0
--- /dev/null
+++ b/stacks/lwip_stack/src/maintain/fw_mt_config.c
@@ -0,0 +1,843 @@
+/*
+*
+* Copyright (c) 2018 Huawei Technologies Co.,Ltd.
+* 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 header files *
+ *----------------------------------------------*/
+
+#include "types.h"
+#include "nsfw_mt_config.h"
+#include <stdlib.h>
+#include <pthread.h>
+#include "nstack_log.h"
+#include "nstack_securec.h"
+#include "json.h"
+#include "nsfw_init.h"
+#include "nsfw_mgr_com_api.h"
+
+/*==============================================*
+ * project-wide global variables *
+ *----------------------------------------------*/
+
+// can be read from config file
+u32 g_base_cfg_items[MAX_BASE_CFG] = { 0 };
+
+// calculated according to base config
+u32 g_custom_cfg_items[MAX_CUSTOM_CFG] = { 0 };
+
+// note: if seg number greater than 16, such buffer should use malloc
+// or it will be exceed 2K
+struct cfg_item_info g_cfg_item_info[CFG_SEG_MAX][MAX_CFG_ITEM];
+
+NSTACK_STATIC int g_cfg_item_count[CFG_SEG_MAX] = { 0 };
+
+NSTACK_STATIC char *g_cfg_seg_name[CFG_SEG_MAX];
+
+/*==============================================*
+ * routines' or functions' implementations *
+ *----------------------------------------------*/
+
+/* nStackCtrl cannot get the env path info, no start by shell script, need get
+ the path info ,and legal check , add a input parameter proc_type*/
+
+NSTACK_STATIC int
+get_ctrl_dir_info (char *current_path, unsigned path_len)
+{
+ char ctrl_dir[MAX_FILE_NAME_LEN] = { 0 };
+ int count = 0;
+ unsigned int dir_len = 0;
+
+ //nStackCtrl cannot get the path from the env, so need get from current pwd.
+ count = readlink ("/proc/self/exe", ctrl_dir, MAX_FILE_NAME_LEN);
+ if ((count < 0) || (count >= MAX_FILE_NAME_LEN))
+ {
+ save_pre_init_log (NSLOG_ERR,
+ "readlink get nStackCtrl path failed, write nothing!");
+ return -1;
+ }
+ ctrl_dir[count] = '\0';
+
+ dir_len = strlen (ctrl_dir);
+ if ((dir_len > strlen ("nStackCtrl")) && (dir_len < MAX_FILE_NAME_LEN))
+ {
+ ctrl_dir[dir_len - strlen ("nStackCtrl")] = '\0';
+ }
+ else
+ {
+ save_pre_init_log (NSLOG_ERR, "path strlen is illegal, write nothing!");
+ return -1;
+ }
+
+ if (NULL == strstr (ctrl_dir, "bin"))
+ {
+ /* Exit before nstack_log_init, use printf */
+ printf
+ ("the nStackServer content change, plz keep same with nStack release, exit!\n");
+#ifdef FOR_NSTACK_UT
+ return -1;
+#else
+ exit (1);
+#endif
+ }
+ if (EOK !=
+ STRNCAT_S (ctrl_dir, sizeof (ctrl_dir), "/../configure",
+ strlen ("/../configure")))
+ {
+ save_pre_init_log (NSLOG_ERR, "STRNCAT_S failed, current_dir = %s",
+ ctrl_dir);
+ return -1;
+ }
+
+ if (-1 == SNPRINTF_S (current_path, path_len, path_len - 1, "%s", ctrl_dir))
+ {
+ save_pre_init_log (NSLOG_ERR,
+ "SNPRINTF_S path name failed, ctrl_dir %s.",
+ ctrl_dir);
+ return -1;
+ }
+
+ return 0;
+
+}
+
+NSTACK_STATIC int
+get_cfg_buf (u32 proc_type, char *cfg_buf, unsigned buf_size)
+{
+ char current_dir[MAX_FILE_NAME_LEN] = { 0 };
+ char cfg_file_name[MAX_FILE_NAME_LEN] = { 0 };
+ char *cfg_resolved_path = NULL;
+ char *cfg_path = NULL;
+ FILE *fp = NULL;
+ int cfg_buf_len = 0;
+
+ cfg_path = getenv (CFG_PATH);
+ if ((NULL == cfg_path) && (NSFW_PROC_CTRL == proc_type))
+ {
+ if (-1 == get_ctrl_dir_info (current_dir, sizeof (current_dir)))
+ {
+ save_pre_init_log (NSLOG_ERR, "get_ctrl_dir_info failed.");
+ return -1;
+ }
+ cfg_path = current_dir;
+ }
+ else if ((NULL == cfg_path) && (NSFW_PROC_CTRL != proc_type))
+ {
+ save_pre_init_log (NSLOG_ERR,
+ "main or master process get nstack config path failed, will use default config!");
+ return -1;
+ }
+
+ if (-1 ==
+ SPRINTF_S (cfg_file_name, sizeof (cfg_file_name), "%s/%s", cfg_path,
+ CFG_FILE_NAME))
+ {
+ save_pre_init_log (NSLOG_ERR,
+ "format config file name failed, path %s, name %s.",
+ cfg_path, CFG_FILE_NAME);
+ return -1;
+ }
+
+ cfg_resolved_path = realpath (cfg_file_name, NULL);
+ if (NULL == cfg_resolved_path)
+ {
+ save_pre_init_log (NSLOG_ERR, "config file path invalid, cfg name %s.",
+ cfg_file_name);
+ return -1;
+ }
+
+ fp = fopen (cfg_resolved_path, "r");
+ if (NULL == fp)
+ {
+ free (cfg_resolved_path);
+ save_pre_init_log (NSLOG_ERR, "config file path invalid, cfg name %s.",
+ cfg_file_name);
+ return -1;
+ }
+
+ free (cfg_resolved_path);
+ // read config file to json buffer
+ cfg_buf_len = fread (cfg_buf, 1, buf_size, fp);
+
+ fclose (fp);
+
+ return cfg_buf_len;
+}
+
+NSTACK_STATIC inline int
+get_value_from_json_obj (struct json_object *obj, struct cfg_item_info *pitem)
+{
+ switch (pitem->type)
+ {
+ case CFG_ITEM_TYPE_INT:
+ pitem->value = json_object_get_int (obj);
+ break;
+ case CFG_ITEM_TYPE_STRING:
+ pitem->pvalue = (char *) json_object_get_string (obj);
+ break;
+ default:
+ // print log here?
+ return -1;
+ }
+ return 0;
+}
+
+NSTACK_STATIC inline void
+get_cfg_item (struct json_object *obj, int seg_index)
+{
+ struct json_object *cfg_seg_obj = NULL;
+ struct json_object *cfg_seg = NULL;
+ struct json_object *cfg_item_obj[MAX_CFG_ITEM] = { 0 };
+ int i = 0;
+ int cfg_num = 0;
+
+ (void) json_object_object_get_ex (obj, g_cfg_seg_name[seg_index],
+ &cfg_seg_obj);
+ if (NULL == cfg_seg_obj)
+ {
+ save_pre_init_log (NSLOG_ERR, "get config segment obj failed, seg:%s.",
+ g_cfg_seg_name[seg_index]);
+ return;
+ }
+
+ cfg_num = json_object_array_length (cfg_seg_obj);
+ if (cfg_num < 1)
+ {
+ save_pre_init_log (NSLOG_ERR,
+ "config segment count invalid, config segment %s, count %d.",
+ g_cfg_seg_name[seg_index], cfg_num);
+ return;
+ }
+
+ // each config segment just has 1 array element
+ cfg_seg = (struct json_object *) json_object_array_get_idx (cfg_seg_obj, 0);
+ if (NULL == cfg_seg)
+ {
+ save_pre_init_log (NSLOG_ERR, "no config item in seg %s.",
+ g_cfg_seg_name[seg_index]);
+ return;
+ }
+
+ for (; i < g_cfg_item_count[seg_index]; i++)
+ {
+ (void) json_object_object_get_ex (cfg_seg,
+ g_cfg_item_info[seg_index][i].name,
+ &cfg_item_obj[i]);
+
+ if (NULL == cfg_item_obj[i])
+ {
+ save_pre_init_log (NSLOG_ERR,
+ "get config item failed, config item %s.",
+ g_cfg_item_info[seg_index][i].name);
+ return;
+ }
+
+ // note: should specify the config item type if not only int item exist
+ if (get_value_from_json_obj
+ (cfg_item_obj[i], &g_cfg_item_info[seg_index][i]) != 0)
+ {
+ return;
+ }
+ }
+
+ return;
+}
+
+NSTACK_STATIC inline void
+parse_cfg (char *cfg_buf)
+{
+ if (NULL == cfg_buf)
+ {
+ return;
+ }
+
+ struct json_object *obj =
+ (struct json_object *) json_tokener_parse (cfg_buf);
+ int i = 0;
+
+ for (; i < CFG_SEG_MAX; i++)
+ {
+ if (0 == g_cfg_item_count[i])
+ {
+ continue;
+ }
+
+ get_cfg_item (obj, i);
+ }
+}
+
+NSTACK_STATIC inline int
+is_valid (int value, int min_value, int max_value)
+{
+ if ((value < min_value) || (value > max_value))
+ {
+ return 0;
+ }
+
+ return 1;
+}
+
+NSTACK_STATIC inline void
+check_cfg_item_int (struct cfg_item_info *pitem)
+{
+ if (!is_valid (pitem->value, pitem->min_value, pitem->max_value))
+ {
+ pitem->value = pitem->default_value;
+ }
+}
+
+NSTACK_STATIC inline void
+check_cfg_item_string (struct cfg_item_info *pitem)
+{
+ if ((NULL == pitem->pvalue) || ((pitem->pvalue) && (0 == pitem->pvalue[0])))
+ {
+ pitem->pvalue = pitem->default_str;
+ }
+}
+
+NSTACK_STATIC inline void
+check_cfg_item (struct cfg_item_info *pitem)
+{
+ switch (pitem->type)
+ {
+ case CFG_ITEM_TYPE_INT:
+ check_cfg_item_int (pitem);
+ if (pitem->custom_check)
+ pitem->custom_check (pitem);
+ break;
+ case CFG_ITEM_TYPE_STRING:
+ check_cfg_item_string (pitem);
+ if (pitem->custom_check)
+ pitem->custom_check (pitem);
+ break;
+ default:
+ break;
+ }
+}
+
+NSTACK_STATIC inline void
+check_cfg ()
+{
+ int i = 0;
+ int j = 0;
+ for (i = 0; i < CFG_SEG_MAX; i++)
+ {
+ for (j = 0; j < g_cfg_item_count[i]; j++)
+ {
+ check_cfg_item (&g_cfg_item_info[i][j]);
+ }
+ }
+}
+
+NSTACK_STATIC inline void
+print_item_info (char *seg_name, struct cfg_item_info *pitem)
+{
+ switch (pitem->type)
+ {
+ case CFG_ITEM_TYPE_INT:
+ save_pre_init_log (NSLOG_INF, "config read seg:%s, name:%s, value:%d.",
+ seg_name, pitem->name, pitem->value);
+ break;
+ case CFG_ITEM_TYPE_STRING:
+ save_pre_init_log (NSLOG_INF, "config read seg:%s, name:%s, pvalue:%s.",
+ seg_name, pitem->name, pitem->pvalue);
+ break;
+ default:
+ break;
+ }
+}
+
+NSTACK_STATIC inline void
+print_config_item_info ()
+{
+ int i = 0;
+ int j = 0;
+ for (; i < CFG_SEG_MAX; i++)
+ {
+ for (j = 0; j < g_cfg_item_count[i]; j++)
+ {
+ print_item_info (g_cfg_seg_name[i], &g_cfg_item_info[i][j]);
+ }
+ }
+}
+
+void
+check_socket_config (void *pitem)
+{
+ struct cfg_item_info *item = (struct cfg_item_info *) pitem;
+ if (item->value > 0 && !(item->value & (item->value - 1)))
+ return;
+ save_pre_init_log (NSLOG_WAR,
+ "warning: config socket_num (%u) is not 2^n, will use the default value:%u",
+ item->value, item->default_value);
+ item->value = item->default_value;
+}
+
+/* thread schedule mode and thread priority should be matched */
+void
+check_thread_config (void *pitem)
+{
+ struct cfg_item_info *pri_cfg = (struct cfg_item_info *) pitem;
+ struct cfg_item_info *policy_cfg =
+ &g_cfg_item_info[CFG_SEG_PRI][CFG_SEG_THREAD_PRI_POLICY];
+
+ int max_pri = sched_get_priority_max (policy_cfg->value);
+ int min_pri = sched_get_priority_min (policy_cfg->value);
+ if ((pri_cfg->value > max_pri) || (pri_cfg->value < min_pri))
+ {
+ save_pre_init_log (NSLOG_INF,
+ "detect invalid thread priority configuration, use default value] policy=%d, pri=%d, def policy=%d, def pri=%d",
+ policy_cfg->value, pri_cfg->value,
+ policy_cfg->default_value, pri_cfg->default_value);
+
+ policy_cfg->value = policy_cfg->default_value;
+ pri_cfg->value = pri_cfg->default_value;
+ }
+}
+
+#define SET_CFG_ITEM(seg, item, field, value) g_cfg_item_info[seg][item].field = (value)
+#define SET_THREAD_CFG_ITEM(item, field, value) SET_CFG_ITEM(CFG_SEG_PRI, item, field, value)
+
+NSTACK_STATIC void
+init_main_def_config_items ()
+{
+ /* base config */
+ g_cfg_seg_name[CFG_SEG_BASE] = "cfg_seg_socket";
+ g_cfg_item_count[CFG_SEG_BASE] = CFG_SEG_BASE_MAX;
+ /* -- socket number */
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_SOCKET_NUM].name = "socket_num";
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_SOCKET_NUM].type =
+ CFG_ITEM_TYPE_INT;
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_SOCKET_NUM].custom_check =
+ check_socket_config;
+ set_cfg_info (CFG_SEG_BASE, CFG_SEG_BASE_SOCKET_NUM, MIN_SOCKET_NUM,
+ MAX_SOCKET_NUM, DEF_SOCKET_NUM);
+ /* -- arp stale time */
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_ARP_STALE_TIME].name =
+ "arp_stale_time";
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_ARP_STALE_TIME].type =
+ CFG_ITEM_TYPE_INT;
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_ARP_STALE_TIME].custom_check =
+ NULL;
+ set_cfg_info (CFG_SEG_BASE, CFG_SEG_BASE_ARP_STALE_TIME,
+ MIN_ARP_STACLE_TIME, MAX_ARP_STACLE_TIME,
+ DEF_ARP_STACLE_TIME);
+ /* -- arp braodcast retransmission times */
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_ARP_BC_RETRANS_NUM].name =
+ "arp_bc_retrans_num";
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_ARP_BC_RETRANS_NUM].type =
+ CFG_ITEM_TYPE_INT;
+ g_cfg_item_info[CFG_SEG_BASE][CFG_SEG_BASE_ARP_BC_RETRANS_NUM].custom_check
+ = NULL;
+ set_cfg_info (CFG_SEG_BASE, CFG_SEG_BASE_ARP_BC_RETRANS_NUM,
+ MIN_ARP_BC_RETRANS_NUM, MAX_ARP_BC_RETRANS_NUM,
+ DEF_ARP_BC_RETRANS_NUM);
+
+ /* support thread priority configuration */
+ g_cfg_seg_name[CFG_SEG_PRI] = "cfg_seg_thread_pri";
+ g_cfg_item_count[CFG_SEG_PRI] = CFG_SEG_THREAD_PRI_MAX;
+ SET_THREAD_CFG_ITEM (CFG_SEG_THREAD_PRI_POLICY, name, "sched_policy");
+ SET_THREAD_CFG_ITEM (CFG_SEG_THREAD_PRI_POLICY, type, CFG_ITEM_TYPE_INT);
+ SET_THREAD_CFG_ITEM (CFG_SEG_THREAD_PRI_POLICY, custom_check, NULL);
+ set_cfg_info (CFG_SEG_PRI, CFG_SEG_THREAD_PRI_POLICY, 0, 2, 0);
+
+ SET_THREAD_CFG_ITEM (CFG_SEG_THREAD_PRI_PRI, name, "thread_pri");
+ SET_THREAD_CFG_ITEM (CFG_SEG_THREAD_PRI_PRI, type, CFG_ITEM_TYPE_INT);
+ SET_THREAD_CFG_ITEM (CFG_SEG_THREAD_PRI_PRI, custom_check,
+ check_thread_config);
+ set_cfg_info (CFG_SEG_PRI, CFG_SEG_THREAD_PRI_PRI, 0, 99, 0);
+
+ /* remove unsed operation config set */
+ /* log config */
+ g_cfg_seg_name[CFG_SEG_LOG] = "cfg_seg_log";
+ g_cfg_item_count[CFG_SEG_LOG] = 2;
+ g_cfg_item_info[CFG_SEG_LOG][0].name = "run_log_size";
+ g_cfg_item_info[CFG_SEG_LOG][0].type = CFG_ITEM_TYPE_INT;
+ g_cfg_item_info[CFG_SEG_LOG][0].custom_check = NULL;
+ g_cfg_item_info[CFG_SEG_LOG][1].name = "run_log_count";
+ g_cfg_item_info[CFG_SEG_LOG][1].type = CFG_ITEM_TYPE_INT;
+ g_cfg_item_info[CFG_SEG_LOG][1].custom_check = NULL;
+ set_cfg_info (CFG_SEG_LOG, 0, 10, 100, 50);
+ set_cfg_info (CFG_SEG_LOG, 1, 2, 20, 10);
+
+ /* path config */
+ /* set the path string and default str */
+ g_cfg_seg_name[CFG_SEG_PATH] = "cfg_seg_path";
+ g_cfg_item_count[CFG_SEG_PATH] = 1;
+ g_cfg_item_info[CFG_SEG_PATH][0].name = "stackx_log_path";
+ g_cfg_item_info[CFG_SEG_PATH][0].type = CFG_ITEM_TYPE_STRING;
+ g_cfg_item_info[CFG_SEG_PATH][0].default_str = NSTACK_LOG_NAME;
+ g_cfg_item_info[CFG_SEG_PATH][0].custom_check = NULL;
+}
+
+/* master and ctrl both use the function to reduce the redundancy,
+* as the parameter and operation all same.
+*/
+NSTACK_STATIC void
+init_master_def_config_items ()
+{
+ int i = 0;
+ for (; i < CFG_SEG_MAX; i++)
+ {
+ if (i != CFG_SEG_LOG)
+ {
+ g_cfg_item_count[i] = 0;
+ }
+ }
+
+ g_cfg_seg_name[CFG_SEG_LOG] = "cfg_seg_log";
+ g_cfg_item_count[CFG_SEG_LOG] = 2;
+ g_cfg_item_info[CFG_SEG_LOG][0].name = "mon_log_size";
+ g_cfg_item_info[CFG_SEG_LOG][0].type = CFG_ITEM_TYPE_INT;
+ g_cfg_item_info[CFG_SEG_LOG][0].custom_check = NULL;
+ g_cfg_item_info[CFG_SEG_LOG][1].name = "mon_log_count";
+ g_cfg_item_info[CFG_SEG_LOG][1].type = CFG_ITEM_TYPE_INT;
+ g_cfg_item_info[CFG_SEG_LOG][1].custom_check = NULL;
+
+ set_cfg_info (CFG_SEG_LOG, 0, 2, 20, 10);
+ set_cfg_info (CFG_SEG_LOG, 1, 2, 20, 10);
+
+ g_cfg_seg_name[CFG_SEG_PATH] = "cfg_seg_path";
+ g_cfg_item_count[CFG_SEG_PATH] = 1;
+ g_cfg_item_info[CFG_SEG_PATH][0].name = "master_log_path";
+ g_cfg_item_info[CFG_SEG_PATH][0].type = CFG_ITEM_TYPE_STRING;
+ g_cfg_item_info[CFG_SEG_PATH][0].default_str = NSTACK_LOG_NAME;
+ g_cfg_item_info[CFG_SEG_PATH][0].custom_check = NULL;
+}
+
+NSTACK_STATIC void
+read_init_config (u32 proc_type)
+{
+ int cfg_buf_len = 0;
+ char cfg_json_buf[CFG_BUFFER_LEN] = { 0 };
+
+ cfg_buf_len = get_cfg_buf (proc_type, cfg_json_buf, sizeof (cfg_json_buf));
+ if (cfg_buf_len < 0)
+ {
+ save_pre_init_log (NSLOG_WAR,
+ "warning:file not exist, use default config.");
+ return;
+ }
+ else
+ {
+ /* parse json buffer */
+ parse_cfg (cfg_json_buf);
+ }
+ save_pre_init_log (NSLOG_INF, "read configuration finished.");
+}
+
+/* =========== set config items ========= */
+NSTACK_STATIC inline void
+set_base_config ()
+{
+ g_base_cfg_items[CFG_BASE_RING_SIZE] = DEF_RING_BASE_SIZE;
+ g_base_cfg_items[CFG_BASE_HAL_PORT_NUM] = DEF_HAL_PORT_NUM;
+
+ g_base_cfg_items[CFG_BASE_SOCKET_NUM] =
+ (u32) get_cfg_info (CFG_SEG_BASE, CFG_SEG_BASE_SOCKET_NUM);
+ g_base_cfg_items[CFG_BASE_ARP_STALE_TIME] =
+ (u32) get_cfg_info (CFG_SEG_BASE, CFG_SEG_BASE_ARP_STALE_TIME);
+ g_base_cfg_items[CFG_BASE_ARP_BC_RETRANS_NUM] =
+ (u32) get_cfg_info (CFG_SEG_BASE, CFG_SEG_BASE_ARP_BC_RETRANS_NUM);
+}
+
+NSTACK_STATIC void
+init_base_config (cfg_module_param * param)
+{
+ /* initial default config */
+ /* omc_ctrl single log file should be 10M */
+ if (param->proc_type == NSFW_PROC_MASTER
+ || param->proc_type == NSFW_PROC_CTRL)
+ {
+ init_master_def_config_items ();
+ }
+ else
+ {
+ init_main_def_config_items ();
+ }
+
+ /* read base config from file */
+ read_init_config (param->proc_type);
+ /* check config and reset value */
+ check_cfg ();
+
+ /* print config info */
+ print_config_item_info ();
+
+ set_base_config ();
+}
+
+NSTACK_STATIC void
+init_stackx_config ()
+{
+ u32 socket_num_per_thread = CUR_CFG_SOCKET_NUM;
+ u32 factor = socket_num_per_thread / SOCKET_NUM_PER_THREAD;
+
+ if (factor == 0 || socket_num_per_thread % SOCKET_NUM_PER_THREAD > 0)
+ {
+ factor += 1;
+ }
+
+ save_pre_init_log (NSLOG_INF, "socket num:%d, factor:%d",
+ CUR_CFG_SOCKET_NUM, factor);
+
+ /* MBUF config */
+ set_custom_cfg_item (CFG_MBUF_DATA_SIZE, DEF_MBUF_DATA_SIZE);
+ set_custom_cfg_item (CFG_TX_MBUF_NUM, DEF_TX_MBUF_POOL_SIZE);
+ set_custom_cfg_item (CFG_RX_MBUF_NUM, DEF_RX_MBUF_POOL_SIZE);
+ set_custom_cfg_item (CFG_MP_TCPSEG_NUM, DEF_MEMP_NUM_TCP_SEG); /* tcp segment number */
+ set_custom_cfg_item (CFG_MP_MSG_NUM, DEF_TX_MSG_POOL_SIZE); /* msg number */
+
+ /* ring config */
+ set_custom_cfg_item (CFG_HAL_RX_RING_SIZE, DEF_HAL_RX_RING_SIZE); /* netif ring size not changed */
+ set_custom_cfg_item (CFG_HAL_TX_RING_SIZE, DEF_HAL_TX_RING_SIZE); /* netif ring size not changed */
+ set_custom_cfg_item (CFG_MBOX_RING_SIZE, DEF_MBOX_RING_SIZE);
+ set_custom_cfg_item (CFG_SPL_MAX_RING_SIZE, DEF_SPL_MAX_RING_SIZE); /* stackx ring size */
+
+ /* pcb config */
+ set_custom_cfg_item (CFG_TCP_PCB_NUM, DEF_TCP_PCB_NUM * factor);
+ set_custom_cfg_item (CFG_UDP_PCB_NUM, DEF_UDP_PCB_NUM * factor);
+ set_custom_cfg_item (CFG_RAW_PCB_NUM, DEF_RAW_PCB_NUM * factor);
+ set_custom_cfg_item (CFG_ARP_QUEUE_NUM,
+ CUR_CFG_SOCKET_NUM >
+ DEF_SOCKET_NUM ? LARGE_ARP_QUEUE_NUM :
+ DEF_ARP_QUEUE_NUM);
+}
+
+void
+print_final_config_para ()
+{
+ save_pre_init_log (NSLOG_INF, "socket_num :%u",
+ get_base_cfg (CFG_BASE_SOCKET_NUM));
+ save_pre_init_log (NSLOG_INF, "base_ring_size :%u",
+ get_base_cfg (CFG_BASE_RING_SIZE));
+ save_pre_init_log (NSLOG_INF, "hal_port_num :%u",
+ get_base_cfg (CFG_BASE_HAL_PORT_NUM));
+ save_pre_init_log (NSLOG_INF, "arp_stale_num :%u",
+ get_base_cfg (CFG_BASE_ARP_STALE_TIME));
+ save_pre_init_log (NSLOG_INF, "arp_bc_retrans_num :%u",
+ get_base_cfg (CFG_BASE_ARP_BC_RETRANS_NUM));
+
+ save_pre_init_log (NSLOG_INF, "mbuf_data_size :%u",
+ get_custom_cfg (CFG_MBUF_DATA_SIZE));
+ save_pre_init_log (NSLOG_INF, "tx_mbuf_num :%u",
+ get_custom_cfg (CFG_TX_MBUF_NUM));
+ save_pre_init_log (NSLOG_INF, "rx_mbuf_num :%u",
+ get_custom_cfg (CFG_RX_MBUF_NUM));
+ save_pre_init_log (NSLOG_INF, "tcp_seg_mp_num :%u",
+ get_custom_cfg (CFG_MP_TCPSEG_NUM));
+ save_pre_init_log (NSLOG_INF, "msg_mp_num :%u",
+ get_custom_cfg (CFG_MP_MSG_NUM));
+ save_pre_init_log (NSLOG_INF, "hal_tx_ring_size :%u",
+ get_custom_cfg (CFG_HAL_TX_RING_SIZE));
+ save_pre_init_log (NSLOG_INF, "hal_rx_ring_size :%u",
+ get_custom_cfg (CFG_HAL_RX_RING_SIZE));
+ save_pre_init_log (NSLOG_INF, "mbox_ring_size :%u",
+ get_custom_cfg (CFG_MBOX_RING_SIZE));
+ save_pre_init_log (NSLOG_INF, "spl_ring_size :%u",
+ get_custom_cfg (CFG_SPL_MAX_RING_SIZE));
+ save_pre_init_log (NSLOG_INF, "tcp_pcb_num :%u",
+ get_custom_cfg (CFG_TCP_PCB_NUM));
+ save_pre_init_log (NSLOG_INF, "udp_pcb_num :%u",
+ get_custom_cfg (CFG_UDP_PCB_NUM));
+ save_pre_init_log (NSLOG_INF, "raw_pcb_num :%u",
+ get_custom_cfg (CFG_RAW_PCB_NUM));
+}
+
+NSTACK_STATIC void
+init_module_cfg_default ()
+{
+ init_stackx_config ();
+
+ print_final_config_para ();
+}
+
+NSTACK_STATIC void
+init_main_log_cfg_para ()
+{
+ struct log_init_para log_para;
+ log_para.run_log_size = g_cfg_item_info[CFG_SEG_LOG][0].value;
+ log_para.run_log_count = g_cfg_item_info[CFG_SEG_LOG][1].value;
+
+ /* log path valid check */
+ if (0 == access (g_cfg_item_info[CFG_SEG_PATH][0].pvalue, W_OK))
+ {
+ log_para.run_log_path = g_cfg_item_info[CFG_SEG_PATH][0].pvalue;
+ }
+ else
+ {
+ log_para.run_log_path = g_cfg_item_info[CFG_SEG_PATH][0].default_str;
+ }
+
+ set_log_init_para (&log_para);
+}
+
+NSTACK_STATIC void
+init_master_log_cfg_para ()
+{
+ struct log_init_para log_para;
+ log_para.mon_log_size = g_cfg_item_info[CFG_SEG_LOG][0].value;
+ log_para.mon_log_count = g_cfg_item_info[CFG_SEG_LOG][1].value;
+
+ /* log path valid check */
+ if (0 == access (g_cfg_item_info[CFG_SEG_PATH][0].pvalue, W_OK))
+ {
+ log_para.mon_log_path = g_cfg_item_info[CFG_SEG_PATH][0].pvalue;
+ }
+ else
+ {
+ log_para.mon_log_path = g_cfg_item_info[CFG_SEG_PATH][0].default_str;
+ }
+
+ set_log_init_para (&log_para);
+}
+
+/* nStackCtrl is the diff process with main, cannot use main process info,
+ need get the configure info respectively */
+/* omc_ctrl single log file should be 10M */
+NSTACK_STATIC void
+init_ctrl_log_cfg_para ()
+{
+ struct log_init_para log_para;
+ log_para.mon_log_size = g_cfg_item_info[CFG_SEG_LOG][0].value;
+ log_para.mon_log_count = g_cfg_item_info[CFG_SEG_LOG][1].value;
+
+ /* log path valid check */
+ if (0 == access (g_cfg_item_info[CFG_SEG_PATH][0].pvalue, W_OK))
+ {
+ log_para.mon_log_path = g_cfg_item_info[CFG_SEG_PATH][0].pvalue;
+ }
+ else
+ {
+ log_para.mon_log_path = g_cfg_item_info[CFG_SEG_PATH][0].default_str;
+ }
+
+ set_log_init_para (&log_para);
+}
+
+/*===========config init for nstack main=============*/
+
+NSTACK_STATIC void
+init_module_cfg_nstackmain ()
+{
+ /* init config data */
+ init_module_cfg_default ();
+
+ /* init log para */
+ init_main_log_cfg_para ();
+}
+
+/*===========config init for nstack master=============*/
+
+NSTACK_STATIC void
+init_module_cfg_nstackmaster ()
+{
+ /* init config data */
+ init_module_cfg_default ();
+
+ init_master_log_cfg_para ();
+}
+
+/*===========config init for nstack ctrl=============*/
+
+/* nStackCtrl is the diff process with main,
+ cannot use main process info, need get the configure info respectively */
+
+NSTACK_STATIC void
+init_module_cfg_nstackctrl ()
+{
+ init_ctrl_log_cfg_para ();
+}
+
+/*===========init config module=============*/
+void
+config_module_init (cfg_module_param * param)
+{
+ save_pre_init_log (NSLOG_INF, "config module init begin] proc type=%d",
+ param->proc_type);
+
+ init_base_config (param);
+
+ switch (param->proc_type)
+ {
+ case NSFW_PROC_MAIN:
+ init_module_cfg_nstackmain ();
+ break;
+
+ case NSFW_PROC_MASTER:
+ init_module_cfg_nstackmaster ();
+ break;
+
+ case NSFW_PROC_CTRL:
+ init_module_cfg_nstackctrl ();
+ break;
+
+ default:
+ init_module_cfg_default ();
+ break;
+ }
+
+ save_pre_init_log (NSLOG_INF, "config module init end.");
+}
+
+u32
+get_cfg_share_mem_size ()
+{
+ return sizeof (g_base_cfg_items) + sizeof (g_custom_cfg_items);
+}
+
+int
+get_share_cfg_from_mem (void *mem)
+{
+ if (EOK !=
+ MEMCPY_S (g_base_cfg_items, sizeof (g_base_cfg_items), mem,
+ sizeof (g_base_cfg_items)))
+ {
+ return -1;
+ }
+
+ char *custom_cfg_mem = (char *) mem + sizeof (g_base_cfg_items);
+
+ if (EOK !=
+ MEMCPY_S (g_custom_cfg_items, sizeof (g_custom_cfg_items),
+ custom_cfg_mem, sizeof (g_custom_cfg_items)))
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+set_share_cfg_to_mem (void *mem)
+{
+ if (EOK !=
+ MEMCPY_S (mem, sizeof (g_base_cfg_items), g_base_cfg_items,
+ sizeof (g_base_cfg_items)))
+ {
+ return -1;
+ }
+
+ char *custom_cfg_mem = (char *) mem + sizeof (g_base_cfg_items);
+
+ if (EOK !=
+ MEMCPY_S (custom_cfg_mem, sizeof (g_custom_cfg_items),
+ g_custom_cfg_items, sizeof (g_custom_cfg_items)))
+ {
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/stacks/lwip_stack/src/maintain/nsfw_msg.c b/stacks/lwip_stack/src/maintain/nsfw_msg.c
new file mode 100644
index 0000000..338f803
--- /dev/null
+++ b/stacks/lwip_stack/src/maintain/nsfw_msg.c
@@ -0,0 +1,23 @@
+/*
+*
+* Copyright (c) 2018 Huawei Technologies Co.,Ltd.
+* 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 "nsfw_msg.h"
+/* *INDENT-OFF* */
+msg_fun g_msg_module_fun_array[MAX_MODULE_TYPE] = {NULL};
+msg_fun g_msg_module_major_fun_array[MAX_MODULE_TYPE][MAX_MAJOR_TYPE] = {{NULL}};
+msg_fun g_msg_module_major_minor_fun_array[MAX_MODULE_TYPE][MAX_MAJOR_TYPE][MAX_MINOR_TYPE] = {{{NULL}}};
+msg_fun g_msg_unsupport_fun = NULL;
+/* *INDENT-ON* */
diff --git a/stacks/lwip_stack/src/maintain/nsfw_rti.c b/stacks/lwip_stack/src/maintain/nsfw_rti.c
new file mode 100644
index 0000000..e5a1d3c
--- /dev/null
+++ b/stacks/lwip_stack/src/maintain/nsfw_rti.c
@@ -0,0 +1,92 @@
+/*
+*
+* Copyright (c) 2018 Huawei Technologies Co.,Ltd.
+* 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 <stdlib.h>
+#include "types.h"
+#include "nstack_securec.h"
+#include "nsfw_init.h"
+#include "nstack_log.h"
+#include "nsfw_maintain_api.h"
+#include "nsfw_mem_api.h"
+#include "nsfw_rti.h"
+#include "nsfw_msg.h"
+#ifdef HAL_LIB
+#else
+#include "common_pal_bitwide_adjust.h"
+#endif
+
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C"{
+/* *INDENT-ON* */
+#endif /* __cplusplus */
+
+char g_dfx_switch = 1;
+
+struct rti_queue *g_nsfw_rti_primary_stat = NULL;
+
+void
+nsfw_rti_stat (nsfw_rti_stat_type_t statType, const data_com_msg * m)
+{
+ if (!g_nsfw_rti_primary_stat || !m)
+ {
+ return;
+ }
+
+ struct rti_queue *primary_stat = ADDR_SHTOL (g_nsfw_rti_primary_stat);
+
+ switch (statType)
+ {
+ case NSFW_STAT_PRIMARY_DEQ:
+ if ((m->param.major_type >= MAX_MAJOR_TYPE)
+ || (m->param.minor_type >= MAX_MINOR_TYPE))
+ {
+ return;
+ }
+ /*call_msg_fun() is only called in nStackMain, no reentrance risk, ++ operation is ok */
+ primary_stat->tcpip_msg_deq[m->param.major_type]++;
+ if (0 == m->param.major_type) //SPL_TCPIP_NEW_MSG_API
+ {
+ primary_stat->api_msg_deq[m->param.minor_type]++;
+ }
+ break;
+ case NSFW_STAT_PRIMARY_ENQ_FAIL:
+ if ((m->param.major_type >= MAX_MAJOR_TYPE)
+ || (m->param.minor_type >= MAX_MINOR_TYPE))
+ {
+ return;
+ }
+ __sync_fetch_and_add (&primary_stat->tcpip_msg_enq_fail
+ [m->param.major_type], 1);
+ if (0 == m->param.major_type) //SPL_TCPIP_NEW_MSG_API
+ {
+ __sync_fetch_and_add (&primary_stat->api_msg_enq_fail
+ [m->param.minor_type], 1);
+ }
+ break;
+ case NSFW_STAT_PRIMARY_ENQ:
+ //not use
+ break;
+ default:
+ break;
+ }
+}
+
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif /* __cplusplus */