diff options
author | 2019-06-04 11:53:49 +0530 | |
---|---|---|
committer | 2019-06-04 20:38:30 +0530 | |
commit | 2a42ad20b9730706ad371ae3787d4597c4e42276 (patch) | |
tree | fa01cd312586ea007468e7233f94c0ce53d75873 /stacks/lwip_stack/src/nStackMain/main.c | |
parent | a826fe833d3f2a8fe2673fa05811fe1a22baf045 (diff) |
Feature: 19.04 part-2DMM-2
Change-Id: I0b52a6bb67c25c7955d58e29eb81a3cc9efea9e9
Signed-off-by: sharath reddy <bs.reddy@huawei.com>
Diffstat (limited to 'stacks/lwip_stack/src/nStackMain/main.c')
-rw-r--r-- | stacks/lwip_stack/src/nStackMain/main.c | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/stacks/lwip_stack/src/nStackMain/main.c b/stacks/lwip_stack/src/nStackMain/main.c new file mode 100644 index 0000000..6f58823 --- /dev/null +++ b/stacks/lwip_stack/src/nStackMain/main.c @@ -0,0 +1,457 @@ +/* +* +* 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 <signal.h> +#include <stdio.h> +#include <pthread.h> +#include <unistd.h> +#include <sched.h> +#include <fcntl.h> +#include <malloc.h> +#include "nstack_securec.h" +#include "nstack_log.h" +#include "types.h" +#include "nsfw_init_api.h" +#include "alarm_api.h" + +#include "nsfw_mgr_com_api.h" +#include "nsfw_ps_mem_api.h" +#include "nsfw_ps_api.h" +#include "nsfw_recycle_api.h" +#include "nsfw_fd_timer_api.h" +#include "nsfw_maintain_api.h" +#include "nstack_dmm_adpt.h" + +#include "nsfw_mem_api.h" +#include "nsfw_mt_config.h" +#include "nsfw_shmem_mdesc.h" +#include "nsfw_nshmem_mdesc.h" + +#define GLOBAL_Stack_ARG "stack" +#define GlOBAL_HELP "--help" +#define GLOBAL_Dpdk_ARG "dpdk" +#define GLOBAL_STACK_PORT "-port" +#define NSTACK_MAIN_MAX_PARA 32 +#define NSTACK_MAIN_MIN_PARA 1 + +#define MAX_MASTER_OPEN_FD 1024 + +extern int uStackArgIndex; +extern void spl_tcpip_thread(void *arg); +extern int globalArgc; +extern char **gArgv; +extern int g_dpdk_argc; +extern char **g_dpdk_argv; +extern void print_call_stack(); +extern int adjust_mem_arg(int argc, char *argv[]); +extern struct cfg_item_info g_cfg_item_info[CFG_SEG_MAX][MAX_CFG_ITEM]; +extern int get_network_json_data(); +extern int get_ip_json_data(); +extern nsfw_ring_ops + g_ring_ops_arry_lwip[NSFW_MEM_TYPEMAX][NSFW_MPOOL_TYPEMAX]; + +#ifdef SYS_MEM_RES_STAT +extern void get_resource_stat(); +#endif + +extern alarm_result ms_alarm_check_func(void *para); +int g_tcpip_thread_stat = 0; //this variable will be used at health check feature + +#if (DPDK_MODULE) +extern void pal_common_usage(void); +#endif + +typedef void (*pSignalFunc) (int); +int app_init(void); + +void helpInfo() +{ + NSPOL_LOGERR + ("-----------------------------------------------------------------" + "\nThe format of arg" + "\nbash:./nStackMain RTE-ARGS stack STACK-ARGS" + "\n RTE-ARGS=-c COREMASK -n NUM [-b <domain:bus:devid.func>] [--socket-mem=MB,...] [-m MB] [-r NUM] [-v] [--file-prefix] [--proc-type <primary|secondary|auto>] [-- xen-dom0]" + "\n STACK-ARGS=-port PORTMASK [-c COREMASK] [-thread NUM]" + "\nUser examples:" + "\nTo make the DPDK run on core mask:0xf,Number of memory channels per processor socket in DPDK is 3 " + "\nTo make the stack run on eth coremask:f" + "\nbash: ./nStackMain -c 0xf -n 3 stack -port f" + "\nTo get more help info for stack:" "\n ./nStackMain --help stack" + "\nTo get more help info for dpdk:" "\n ./nStackMain --help dpdk" + "\n-----------------------------------------------------------------"); + +#ifndef FOR_NSTACK_UT + exit(0); +#endif + +} + +#define SIG_PTRACE __SIGRTMIN + 5 + +void signal_handler(int s) +{ + NSPOL_LOGERR("Received signal exiting.]s=%d", s); + if (s == SIGSEGV) /* add for gdb attach work */ + { + print_call_stack(); + } + + nstack_segment_error(s); + if ((SIG_PTRACE != s) && (SIG_PTRACE + 2 != s)) + { +#ifndef FOR_NSTACK_UT + exit(0); +#endif + } + + int i; + for (i = 0; i < MAX_THREAD; i++) + { + if (g_all_thread[i] != pthread_self() && 0 != g_all_thread[i]) + { + NSFW_LOGERR("send sig thread %d", g_all_thread[i]); + if (0 == pthread_kill(g_all_thread[i], SIG_PTRACE + 2)) + { + return; + } + } + g_all_thread[i] = 0; + } + + for (i = 0; i < MAX_THREAD; i++) + { + if (0 != g_all_thread[i]) + { + return; + } + } + +#ifndef FOR_NSTACK_UT + exit(0); +#endif + + //dpdk_signal_handler(); +} + +void register_signal_handler() +{ +/* donot catch SIGHUP SIGTERM */ + static const int s_need_handle_signals[] = { + SIGABRT, + SIGBUS, + SIGFPE, + SIGILL, + SIGIOT, + SIGQUIT, + SIGSEGV, + //SIGTRAP, + SIGXCPU, + SIGXFSZ, + //SIGALRM, + //SIGHUP, + SIGINT, + //SIGKILL, + SIGPIPE, + SIGPROF, + SIGSYS, + //SIGTERM, + SIGUSR1, + SIGUSR2, + //SIGVTALRM, + //SIGSTOP, + //SIGTSTP, + //SIGTTIN, + //SIGTTOU + }; + + /* here mask signal that will use in sigwait() */ + sigset_t waitset, oset; + + if (0 != sigemptyset(&waitset)) + { + NSPOL_LOGERR("sigemptyset failed."); + } + sigaddset(&waitset, SIGRTMIN); /* for timer */ + sigaddset(&waitset, SIGRTMIN + 2); + pthread_sigmask(SIG_BLOCK, &waitset, &oset); + unsigned int i = 0; + + struct sigaction s; + s.sa_handler = signal_handler; + if (0 != sigemptyset(&s.sa_mask)) + { + NSPOL_LOGERR("sigemptyset failed."); + } + + s.sa_flags = (int) SA_RESETHAND; + + /* register sig handler for more signals */ + for (i = 0; i < sizeof(s_need_handle_signals) / sizeof(int); i++) + { + if (sigaction(s_need_handle_signals[i], &s, NULL) != 0) + { + NSPOL_LOGERR("Could not register %d signal handler.", + s_need_handle_signals[i]); + } + + } + +} + +void checkArgs(int argc, char **argv) +{ + int uStackArg = 0; //mark the status whether need helpinfo and return + int i; + const unsigned int global_para_length = 5; //GLOBAL_Stack_ARG "stack" and GLOBAL_STACK_PORT "-port" string length, both are 5 + const unsigned int global_help_length = 6; //GlOBAL_HELP "--help" string length is 6 + const unsigned int global_dpdk_length = 4; //GLOBAL_Dpdk_ARG "dpdk" string length is 4 + + for (i = 0; i < argc; i++) + { + if (argc > 1) + { + if (strncmp(argv[i], GLOBAL_Stack_ARG, global_para_length) == 0) + { + if (i < 5) + { + NSPOL_LOGERR("Too less args"); + helpInfo(); + return; + } + + uStackArg = 1; + uStackArgIndex = i; + continue; + } + + if (strncmp(argv[i], GLOBAL_STACK_PORT, global_para_length) == 0) + { + continue; + } + + if (strncmp(argv[i], GlOBAL_HELP, global_help_length) == 0) + { + if (i == (argc - 1)) + { + helpInfo(); + return; + } + else if ((++i < argc) + && + (strncmp + (argv[i], GLOBAL_Dpdk_ARG, + global_dpdk_length) == 0)) + { +#if (DPDK_MODULE != 1) + //eal_common_usage(); +#else + pal_common_usage(); +#endif + return; + } + else + { + helpInfo(); + return; + } + } + } + else + { + NSPOL_LOGERR("Too less args"); + helpInfo(); + return; + } + } + + if (!uStackArg) + { + helpInfo(); + return; + } +} + +extern u64 timer_get_threadid(); + +#ifdef FOR_NSTACK_UT +int nstack_main(void) +{ + int argc; + + char *argv[NSTACK_MAIN_MAX_PARA]; + argv[0] = "nStackMain"; + argv[1] = "-c";; + argv[2] = "0xffffffff"; + argv[3] = "-n"; + argv[4] = "3"; + argv[5] = "stack"; + argv[6] = "-port"; + argv[7] = "288"; + argv[8] = "-c"; + argv[9] = "2"; + argc = 10; + +#else +int main(int argc, char *argv[]) +{ +#endif + fw_poc_type proc_type = NSFW_PROC_MAIN; + + /* although nStackMaster has set close on exec, here can't be removed. + * in upgrade senario, if Master is old which has not set close on exec, here, + * if new version Main not close, problem will reappear. Add Begin*/ + int i; + for (i = 4; i < MAX_MASTER_OPEN_FD; i++) + { + close(i); + } + + cfg_module_param config_para; + config_para.proc_type = proc_type; + config_para.argc = argc; + config_para.argv = (unsigned char **) argv; + config_module_init(&config_para); + + set_log_proc_type(LOG_PRO_NSTACK); + (void) nstack_log_init(); + +// nstack_tracing_enable(); + if (0 != nsfw_proc_start_with_lock(NSFW_PROC_MAIN)) + { + NSFW_LOGERR("another process is running!!"); + return 0; + } + + if (1 != mallopt(M_ARENA_MAX, 1)) + { + NSPOL_LOGERR("Error: mallopt fail, continue init"); + } + + /* Set different mem args to PAL and EAL */ + INITPOL_LOGINF("main_thread", "adjust_mem_arg init", NULL_STRING, + LOG_INVALID_VALUE, MODULE_INIT_START); + if (adjust_mem_arg(argc, argv)) + { + INITPOL_LOGERR("main_thread", "adjust_mem_arg init", NULL_STRING, + LOG_INVALID_VALUE, MODULE_INIT_FAIL); + return -1; + } + INITPOL_LOGINF("main_thread", "adjust_mem_arg init", NULL_STRING, + LOG_INVALID_VALUE, MODULE_INIT_SUCCESS); + + checkArgs(globalArgc, gArgv); + register_signal_handler(); + + (void) signal(SIG_PTRACE, signal_handler); + (void) signal(SIG_PTRACE + 2, signal_handler); + + if (nsfw_mgr_comm_fd_init(NSFW_PROC_MAIN) < 0) + { + NSFW_LOGERR("nsfw_mgr_comm_fd_init failed"); + } + + (void) nsfw_reg_trace_thread(pthread_self()); + + nsfw_mem_para stinfo = { 0 }; + stinfo.iargsnum = uStackArgIndex; + stinfo.pargs = gArgv; + stinfo.enflag = proc_type; + (void) nstack_framework_set_module_param(NSFW_MEM_MGR_MODULE, &stinfo); + (void) nstack_framework_set_module_param(NSFW_MGR_COM_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(NSFW_TIMER_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(NSFW_RECYCLE_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(NSFW_LOG_CFG_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(NSFW_VER_MGR_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(SPL_RES_MGR_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(NSFW_SOFT_PARAM_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(NSFW_ALARM_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(TCPDUMP_MODULE, + (void *) ((u64) proc_type)); + proc_type = NSFW_PROC_MASTER; + (void) nstack_framework_set_module_param(NSFW_PS_MODULE, + (void *) ((u64) proc_type)); + (void) nstack_framework_set_module_param(NSFW_PS_MEM_MODULE, + (void *) ((u64) proc_type)); + + g_nsfw_mem_ops[NSFW_SHMEM].stmemop = &g_shmem_ops; + g_nsfw_mem_ops[NSFW_NSHMEM].stmemop = &g_nshmem_ops; + nsfw_ring_ops *ring_ops = (nsfw_ring_ops *) g_ring_ops_arry; + nsfw_ring_ops *temp_ring_ops = (nsfw_ring_ops *) g_ring_ops_arry_lwip; + for (i = 0; i < NSFW_MEM_TYPEMAX * NSFW_MPOOL_TYPEMAX; i++) + { + ring_ops[i] = *temp_ring_ops; + temp_ring_ops++; + } + + int init_ret = nstack_framework_init(); + if (init_ret < 0) + { + NSFW_LOGERR + ("######################init failed!!!!######################"); + return -1; + } + + ns_send_init_alarm(ALARM_EVENT_NSTACK_MAIN_ABNORMAL); + + while (!timer_get_threadid()) + { + (void) nsfw_thread_chk(); + sys_sleep_ns(0, 500000000); + } + (void) nsfw_thread_chk_unreg(); + NSFW_LOGINF("tcpip thread start!"); + (void) sleep(2); + + NSFW_LOGINF("read configuration!"); + if (0 != get_network_json_data()) + { + NSFW_LOGINF("get_network_json_data error"); + return -1; + } + + if (0 != get_ip_json_data()) + { + NSFW_LOGINF("get_ip_json_data error"); + return -1; + } + + int ep_thread = 0; + while (1) + { +#ifdef SYS_MEM_RES_STAT + get_resource_stat(); +#endif + (void) sleep(3); + ep_thread = nsfw_mgr_com_chk_hbt(1); + if (ep_thread > 0) + { + NSFW_LOGINF("force release lock"); + (void) nsfw_recycle_rechk_lock(); + } +#ifdef FOR_NSTACK_UT + return 0; +#endif + + } +} |