diff options
author | charan makkina <charan795m@gmail.com> | 2019-04-30 17:40:53 +0530 |
---|---|---|
committer | charan makkina <charan795m@gmail.com> | 2019-05-20 18:14:40 +0530 |
commit | a826fe833d3f2a8fe2673fa05811fe1a22baf045 (patch) | |
tree | da11a17c46ca9b8a002a52a290628574fa3f5eda /stacks/lwip_stack/lwip_src/api/spl_tcpip.c | |
parent | 3e6bf7b64eea418c59959c18750261b815b2892c (diff) |
Feature: 19.04 part 1
Change-Id: Ibba924b8deca1f246b9dcb12d89d085b6fd33046
Signed-off-by: charan makkina <charan795m@gmail.com>
Diffstat (limited to 'stacks/lwip_stack/lwip_src/api/spl_tcpip.c')
-rw-r--r-- | stacks/lwip_stack/lwip_src/api/spl_tcpip.c | 1547 |
1 files changed, 0 insertions, 1547 deletions
diff --git a/stacks/lwip_stack/lwip_src/api/spl_tcpip.c b/stacks/lwip_stack/lwip_src/api/spl_tcpip.c deleted file mode 100644 index b0b588a..0000000 --- a/stacks/lwip_stack/lwip_src/api/spl_tcpip.c +++ /dev/null @@ -1,1547 +0,0 @@ -/* -* -* 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 "spl_opt.h" -#include <pthread.h> -#include <sched.h> -#include <signal.h> -#include "memp.h" -#include "mem.h" -#include "spl_pbuf.h" -//#include "sockets.h" -//#include <netinet/in.h> - -#include "stackx_spl_share.h" -#include "spl_api.h" -#include "spl_tcpip.h" -#include "init.h" -#include "stackx/internal_msg.h" -#include "netif/sc_dpdk.h" -#include "sharedmemory.h" -#include "stackx_instance.h" -#include "netif/common.h" -//#include "nettool/nettool.h" -#include "nstack_log.h" -#include "nstack_securec.h" -#include "spl_hal.h" -#include "spl_sbr.h" -#include "spl_tcpip.h" - -#include "spl_instance.h" -#include "nsfw_mem_api.h" -#include "nsfw_msg_api.h" -#include "configuration_reader.h" - -#include "nsfw_ps_api.h" -#include "alarm_api.h" -#include "nstack_share_res.h" -#include "spl_timers.h" - -#include "etharp.h" -#include "raw.h" -#include "udp.h" -#include "tcp.h" -#include "igmp.h" -#include "memp.h" -#include "inet.h" -#include "sys_arch.h" - -#include "sys.h" - -#define NSTACK_MAIN_MAX_PARA 32 -#define NSTACK_MAIN_MIN_PARA 1 - -#define DPDK_DEFAULT_EAL_MEM_SIZE (1024) - -#define OPT_EAL_MEM_SIZE "--eal-mem-size=" - -/********************/ -/* extern variables */ -/********************/ -extern mring_handle spl_get_msg_pool (); -extern mring_handle spl_get_conn_pool (); -extern u32 spl_get_conn_num (); -extern err_t ethernet_input (struct pbuf *p, struct netif *netif); - -/* tcpip main thread sleep time, configured by user(nStackMain "-sleep" option) */ -extern int g_tcpip_thread_sleep_time; - -/* netif related */ -extern struct stackx_port_info *head_used_port_list; - -extern u32_t uStackArgIndex; - -extern int g_tcpip_thread_stat; - -/********************/ -/* global variables */ -/********************/ - -/* timer thread id */ -sys_thread_t g_timerThread_id = 0; - -/*Add an associative mapping relationship to p_stackx_instance based on lcore_id */ - -int globalArgc = 0; - -/* Set different mem args to PAL and EAL */ -char **gArgv = NULL; - -int g_dpdk_argc = 0; -char **g_dpdk_argv = NULL; - -/*The sum of the four queue processing messages does not exceed TASK_BURST*/ -static u32 g_highestMboxNum = 12; -static u32 g_mediumMboxNum = 8; -static u32 g_lowestMboxNum = 4; -static u32 g_primaryMboxNum = 8; - -/* [set ip_tos2prio size to IPTOS_TOS_MASK >> 1) + 1] */ -u8_t ip_tos2prio[(IPTOS_TOS_MASK >> 1) + 1] = { - TC_PRIO_BESTEFFORT, - ECN_OR_COST (FILLER), - TC_PRIO_BESTEFFORT, - ECN_OR_COST (BESTEFFORT), - TC_PRIO_BULK, - ECN_OR_COST (BULK), - TC_PRIO_BULK, - ECN_OR_COST (BULK), - TC_PRIO_INTERACTIVE, - ECN_OR_COST (INTERACTIVE), - TC_PRIO_INTERACTIVE, - ECN_OR_COST (INTERACTIVE), - TC_PRIO_INTERACTIVE_BULK, - ECN_OR_COST (INTERACTIVE_BULK), - TC_PRIO_INTERACTIVE_BULK, - ECN_OR_COST (INTERACTIVE_BULK) -}; - -/********************/ -/* extern functions */ -/********************/ -extern err_t ethernetif_init (struct netif *pnetif); -extern int nstack_stackx_init (int flag); -extern void tcp_sys_rmem_init (); -extern void ethernetif_packets_input (struct netif *pstnetif); - -/********************************/ -/* function forward declaration */ -/********************************/ - -static inline u32 priority_sched_mbox (struct stackx_stack *share_memory, - void **box, u32 n); -static inline char -rt_tos2priority (u8_t tos) -{ - return ip_tos2prio[IPTOS_TOS (tos) >> 1]; -} - -u64 -timer_get_threadid () -{ - return g_timerThread_id; -} - -#if (DPDK_MODULE != 1) -NSTACK_STATIC inline void -do_recv_task (struct disp_netif_list *dnlist, u16 index_task) -{ - struct netifExt *pnetifExt = NULL; - - while (dnlist) - { - struct netif *currentNetif = dnlist->netif; - dnlist = dnlist->next; - - pnetifExt = getNetifExt (currentNetif->num); - if (NULL == pnetifExt) - return; - - if (currentNetif != NULL && pnetifExt->num_packets_recv > index_task) - { - ethernetif_packets_input (currentNetif); - } - } -} - -static inline int -is_valid_sleep_time (int sleep_time) -{ -#define TCP_IP_THREAD_MAX_SLEEP_TIME 500 - if ((sleep_time < 0) || (sleep_time > TCP_IP_THREAD_MAX_SLEEP_TIME)) - { - return 0; - } - - return 1; -} - -static int -thread_init () -{ - sigset_t mask; - - if (0 != sigemptyset (&mask)) - { - NSTCP_LOGERR ("sigemptyset function call error"); - return -1; - } - - if (0 != sigaddset (&mask, SIGRTMIN)) - { - NSTCP_LOGERR ("sigaddset function call error"); - return -1; - } - - if ((pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL) != 0) - || (pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL) != 0)) - { - NSTCP_LOGERR ("pthread setcancel function call error"); - return -1; - } - - if (pthread_sigmask (SIG_BLOCK, &mask, NULL) != 0) - { - NSPOL_LOGERR ("pthread_sigmask function call error"); - return -1; - } - - return 0; -} - -alarm_result -spl_socket_resource_check_func (void) -{ - - mring_handle conn_ring = spl_get_conn_pool (); - unsigned int rate_use = 0; - alarm_result ret_alarm; - u32 ring_size = 0, ring_not_used_count = 0; - u32 socket_num = spl_get_conn_num (); - - ring_size = nsfw_mem_ring_size (conn_ring); - - if (0 == socket_num) - { - /* assign a valid id, then return */ - ret_alarm.alarm_id_get = ALARM_EVENT_MAX; - return ret_alarm; - } - - ring_not_used_count = nsfw_mem_ring_using_count (conn_ring); - - rate_use = (ring_size - ring_not_used_count) * 100 / socket_num; - - ret_alarm.alarm_id_get = ALARM_EVENT_NSTACK_RESOURCE_ALARM; - - if (rate_use >= USEAGE_HIGHT) - { - ret_alarm.alarm_flag_get = ALARM_PRODUCT; - ret_alarm.alarm_id_get = ALARM_EVENT_NSTACK_RESOURCE_ALARM; - NSPOL_LOGWAR (TCPIP_DEBUG, - "app using too much socket resources,the rate is bigger than 80%"); - } - else if (rate_use <= USEAGE_LOW) - { - ret_alarm.alarm_flag_get = ALARM_CLEAN; - ret_alarm.alarm_id_get = ALARM_EVENT_NSTACK_RESOURCE_ALARM; - } - else - { - ret_alarm.alarm_id_get = ALARM_EVENT_MAX; - } - - ret_alarm.alarm_reason_get = ALARM_REASON_SOCKET; - - return ret_alarm; - -} - -alarm_result -spl_msg_buf_resource_check_func (void) -{ - - mring_handle msg_ring = spl_get_msg_pool (); - unsigned int rate_use = 0; - alarm_result ret_alarm; - u32 ring_size = 0, ring_not_used_count = 0; - - ring_size = nsfw_mem_ring_size (msg_ring); - - if (0 == ring_size) - { - /* assign a valid id, then return */ - ret_alarm.alarm_id_get = ALARM_EVENT_MAX; - return ret_alarm; - } - - ring_not_used_count = nsfw_mem_ring_using_count (msg_ring); - - rate_use = (ring_size - ring_not_used_count) * 100 / ring_size; - - ret_alarm.alarm_id_get = ALARM_EVENT_NSTACK_RESOURCE_ALARM; - - if (rate_use >= USEAGE_HIGHT) - { - ret_alarm.alarm_flag_get = ALARM_PRODUCT; - ret_alarm.alarm_id_get = ALARM_EVENT_NSTACK_RESOURCE_ALARM; - } - else if (rate_use <= USEAGE_LOW) - { - ret_alarm.alarm_flag_get = ALARM_CLEAN; - ret_alarm.alarm_id_get = ALARM_EVENT_NSTACK_RESOURCE_ALARM; - } - else - { - ret_alarm.alarm_id_get = ALARM_EVENT_MAX; - } - - ret_alarm.alarm_reason_get = ALARM_REASON_MSG_BUF; - - return ret_alarm; - -} - -NSTACK_STATIC int -tcpip_thread_init () -{ - if (thread_init () != 0) - { - return -1; - } - - if (!is_valid_sleep_time (g_tcpip_thread_sleep_time)) - { - g_tcpip_thread_sleep_time = 0; - } - - alarm_para tcp_alarm_para; - tcp_alarm_para.period_alarm.time_length = 5; /* 5 second period */ - tcp_alarm_para.alarm_reason_count = 2; /*both resource */ - tcp_alarm_para.func_alarm_check_period[0] = spl_socket_resource_check_func; - tcp_alarm_para.alarm_reason_set[0] = ALARM_REASON_SOCKET; - tcp_alarm_para.func_alarm_check_period[1] = spl_msg_buf_resource_check_func; - tcp_alarm_para.alarm_reason_set[1] = ALARM_REASON_MSG_BUF; - (void) ns_reg_alarm (ALARM_EVENT_NSTACK_RESOURCE_ALARM, ALARM_PERIOD_CHECK, - &tcp_alarm_para); - - ns_send_init_alarm (ALARM_EVENT_NSTACK_RESOURCE_ALARM); - - printmeminfo (); - return 0; -} - -sys_mbox_t -get_primary_box () -{ - return &p_def_stack_instance->lstack.primary_mbox; -} - -NSTACK_STATIC inline u16 -tcpip_netif_recv (struct disp_netif_list * nif_list) -{ - - u16 num_recv_task = 0, netif_packet_num; - - struct netif *tmpnetif = NULL; - struct netifExt *pnetifExt = NULL; - - while (nif_list) - { - tmpnetif = nif_list->netif; - - netif_packet_num = spl_hal_recv (tmpnetif, 0); - pnetifExt = getNetifExt (tmpnetif->num); - if (NULL == pnetifExt) - return 0; - - /* store the packet number in each netif */ - pnetifExt->num_packets_recv = netif_packet_num; - - /** - * num_recv_task is the maximum packets of the netif among - * all the netifs. - */ - if (num_recv_task < netif_packet_num) - { - num_recv_task = netif_packet_num; - } - - nif_list = nif_list->next; - } - - return num_recv_task; -} - -NSTACK_STATIC inline void -no_task_in_one_loop () -{ -} - -#endif - -/** - * Pass a received packet to tcpip_thread for input processing - * - * @param p the received packet, p->payload pointing to the Ethernet header or - * to an IP header (if inp doesn't have NETIF_FLAG_ETHARP or - * SPL_NETIF_FLAG_ETHERNET flags) - * @param inp the network interface on which the packet was received - */ -err_t -spl_tcpip_input (struct pbuf *p, struct netif *inp) -{ - err_t ret; - NSPOL_LOGINF (TCPIP_DEBUG, "PACKET]p=%p,inp=%p", (void *) p, (void *) inp); - print_pbuf_payload_info (p, false); - - /* every netif has been set NETIF_FLAG_ETHARP flag, no need else branch */ - ret = ethernet_input (p, inp); - return ret; -} - -int -_do_spl_callback_msg (data_com_msg * m) -{ - NSPOL_LOGDBG (TCPIP_DEBUG, "tcpip_thread: CALLBACK]msg=%p", (void *) m); - - m->param.err = ERR_OK; - - msg_internal_callback *callback = (msg_internal_callback *) (m->buffer); - if (!callback->function) - { - NSTCP_LOGERR ("function ptr is null in SPL_TCPIP_MSG_CALLBACK msg"); - ASYNC_MSG_FREE (m); - return 0; - } - - callback->function (callback->ctx); - ASYNC_MSG_FREE (m); - - return 0; -} - -/***************************************************************************** -* Prototype : get_msgbox -* Description : According to the socket tos value to determine which priority queue to send -* Input : struct stackx_stack *sharedmemory, struct netconn *conn, enum api_msg_type type -* Output : Queue pointer -* Return Value : Queue pointer -* Calls : -* Called By : -* -*****************************************************************************/ -struct queue * -get_msgbox (int tos) -{ - struct stackx_stack *sharedmemory = &p_def_stack_instance->lstack; - - if ((MSG_PRIO_QUEUE_NUM < 3) || (0 == tos)) - { - return &sharedmemory->primary_mbox; - } - - char prio = rt_tos2priority ((u8_t) tos); - if ((TC_PRIO_INTERACTIVE == prio)) - { - NSPOL_LOGDBG (SOCKETS_DEBUG, "sent to the highest mbox....."); - return &sharedmemory->priority_mbox[0]; - } - else if ((TC_PRIO_BESTEFFORT == prio) || (TC_PRIO_INTERACTIVE_BULK == prio)) - { - NSPOL_LOGDBG (SOCKETS_DEBUG, "sent to the medium mbox....."); - return &sharedmemory->priority_mbox[1]; - } - else if ((TC_PRIO_BULK == prio) || (TC_PRIO_FILLER == prio)) - { - NSPOL_LOGDBG (SOCKETS_DEBUG, "sent to the lowest mbox....."); - return &sharedmemory->priority_mbox[2]; - } - - NSPOL_LOGDBG (SOCKETS_DEBUG, "sent to the primary mbox....."); - return &sharedmemory->primary_mbox; -} - -/***************************************************************************** -* Prototype : priority_sched_mbox -* Description : According to the priority from the message queue to take -* the message to deal with each cycle to take the total number of messages -* not exceed to TASK_BURST -* Input : struct stackx_stack *sharedmemory, struct netconn *conn, enum api_msg_type type -* Output : Queue pointer -* Return Value : Queue pointer -* Calls : -* Called By : -* -*****************************************************************************/ -static inline u32 -priority_sched_mbox (struct stackx_stack *share_memory, void **box, u32 n) -{ - /* high:primary:medium:low -> 3:2:2:1(total:TASK_BURST) */ - if (unlikely - ((g_highestMboxNum + g_mediumMboxNum + g_primaryMboxNum + - g_lowestMboxNum) != n)) - { - g_mediumMboxNum = n >> 2; - g_lowestMboxNum = n >> 3; - g_primaryMboxNum = n >> 2; - g_highestMboxNum = - n - g_mediumMboxNum - g_primaryMboxNum - g_lowestMboxNum; - } - - u32 highestMboxNum = g_highestMboxNum; - u32 primaryMboxNum = g_primaryMboxNum; - u32 lowestMboxNum = g_lowestMboxNum; - u32 mediumMboxNum = g_mediumMboxNum; - - u32 totalNum = 0; - u32 num = 0; - u32 oldLowestNum = 0; - - num = nsfw_mem_ring_dequeuev (share_memory->priority_mbox[0].llring, - (box + totalNum), highestMboxNum); - if (unlikely (num > highestMboxNum)) - { - num = highestMboxNum; - NSTCP_LOGERR - ("something wrong:num>highestMboxNum]num=%u,highestMboxNum=%u", num, - highestMboxNum); - } - - totalNum += num; - - u32 temp = highestMboxNum - num; - /* bisect the left number of highest */ - primaryMboxNum += (temp >> 1); - mediumMboxNum += temp - (temp >> 1); - - num = nsfw_mem_ring_dequeuev (share_memory->priority_mbox[1].llring, - (box + totalNum), mediumMboxNum); - if (unlikely (num > mediumMboxNum)) - { - num = mediumMboxNum; - NSTCP_LOGERR - ("something wrong.num>mediumMboxNum]num=%u,mediumMboxNum=%u", num, - mediumMboxNum); - } - - totalNum += num; - primaryMboxNum += mediumMboxNum - num; //occupy the left number of medium - - /* dynamically adjust g_mediumMboxNum and g_highestMboxNum, according to 'num' */ - oldLowestNum = g_mediumMboxNum; - if (0 == num) - { - g_mediumMboxNum = 1; - } - else if (num < g_mediumMboxNum) - { - g_mediumMboxNum = num; - } - else - { - g_mediumMboxNum = n >> 2; - } - - g_highestMboxNum += oldLowestNum - g_mediumMboxNum; - - num = nsfw_mem_ring_dequeuev (share_memory->primary_mbox.llring, - (box + totalNum), primaryMboxNum); - if (unlikely (num > primaryMboxNum)) - { - num = primaryMboxNum; - NSTCP_LOGERR - ("something wrong.num>primaryMboxNum]num=%u,primaryMboxNum=%u", num, - primaryMboxNum); - } - - totalNum += num; - lowestMboxNum += primaryMboxNum - num; //occupy the left number of primary - - /* dynamically adjust g_primaryMboxNum and g_highestMboxNum, according to 'num' */ - oldLowestNum = g_primaryMboxNum; - if (0 == num) - { - g_primaryMboxNum = 1; - } - else if (num < g_primaryMboxNum) - { - g_primaryMboxNum = num; - } - else - { - g_primaryMboxNum = n >> 2; - } - - g_highestMboxNum += oldLowestNum - g_primaryMboxNum; - - if (lowestMboxNum > (n - totalNum)) - { - lowestMboxNum = n - totalNum; - } - - num = nsfw_mem_ring_dequeuev (share_memory->priority_mbox[2].llring, - (box + totalNum), lowestMboxNum); - if (unlikely (num > lowestMboxNum)) - { - num = lowestMboxNum; - NSTCP_LOGERR - ("something wrong.num>lowestMboxNum]num=%u,lowestMboxNum=%u", num, - lowestMboxNum); - } - - totalNum += num; - - /* dynamically adjust g_lowestMboxNum and g_highestMboxNum, according to 'num' */ - oldLowestNum = g_lowestMboxNum; - if (0 == num) - { - g_lowestMboxNum = 1; - } - else if (num < g_lowestMboxNum) - { - g_lowestMboxNum = num; - } - else - { - g_lowestMboxNum = n >> 3; - } - - g_highestMboxNum += oldLowestNum - g_lowestMboxNum; - - return totalNum; -} - -/** - * call ltt_apimsg in STACKX TIMER THREAD - * - * @param h function to be called on timeout - * @param arg argument to pass to timeout function h - * @return error code given back by the function that was called - */ -err_t -ltt_apimsg (sys_timeout_handler h, void *arg) -{ - data_com_msg *p_msg_entry; - sys_mbox_t mbox = get_primary_box (); - if (sys_mbox_valid (&mbox)) - { - if (-1 == spl_msg_malloc (&p_msg_entry)) - { - NSPOL_LOGERR ("ltt_apimsg:spl_msg_malloc failed."); - return -1; - } - - p_msg_entry->param.module_type = MSG_MODULE_TIMER; - p_msg_entry->param.major_type = SPL_TCPIP_MSG_TIMER; - p_msg_entry->param.minor_type = TIMER_MSG_TIMEOUT; - p_msg_entry->param.op_type = MSG_ASYN_POST; - - sys_sem_init (&p_msg_entry->param.op_completed); - - msg_timer *tmsg = (msg_timer *) (p_msg_entry->buffer); - tmsg->act = h; - tmsg->arg = arg; - - if (msg_post (p_msg_entry, mbox->llring) < 0) - { - NSPOL_LOGERR - ("msg post is failed]module_type=%u, major_type=%u, minor_type=%u", - p_msg_entry->param.module_type, p_msg_entry->param.major_type, - p_msg_entry->param.minor_type); - spl_msg_free (p_msg_entry); - return ERR_VAL; - } - - return ERR_OK; - } - - NSPOL_LOGERR ("mbox is invalid"); - return ERR_VAL; -} - -int -_do_spl_timer_msg (data_com_msg * m) -{ - NSPOL_LOGDBG (TESTSOCKET_DEBUG | STACKX_DBG_TRACE, - "the msg is from TIMER module, minor(%u)", - m->param.minor_type); - return 0; -} - -static int -_do_timeout_handle (data_com_msg * m) -{ - m->param.err = ERR_OK; - msg_timer *tmo_msg = (msg_timer *) m->buffer; - if (!tmo_msg->act) - { - NSTCP_LOGERR ("TIMER_MSG_TIMEOUT msg act is NULL"); - ASYNC_MSG_FREE (m); - return -1; - } - - timeout_phandler (tmo_msg->act, tmo_msg->arg); - ASYNC_MSG_FREE (m); - return 0; -} - -static int -_do_clear_timer (data_com_msg * m) -{ - NSTCP_LOGDBG ("TIMER_CLEAR API]msg=%p", (void *) m); - - msg_timer *handle = (msg_timer *) (m->buffer); - if (!handle->act) - { - NSTCP_LOGERR ("function ptr is null in TIMER_MSG_CLEAR msg"); - SET_MSG_ERR (m, ERR_VAL); - return 0; - } - - //stackxTcpPcbClearTimer((struct tcp_pcb *)handle->act, (unsigned long)handle->arg); - spl_msg_free (m); - - return 0; -} - -err_t -ltt_clearTmrmsg (void *pcb, void *arg) -{ - data_com_msg *p_msg_entry; - sys_mbox_t mbox = get_primary_box (); - if (sys_mbox_valid (&mbox)) - { - if (-1 == spl_msg_malloc (&p_msg_entry) || (NULL == p_msg_entry)) - { - NSPOL_LOGERR ("ltt_clearTmrmsg:spl_msg_malloc failed."); - return -1; - } - - p_msg_entry->param.module_type = MSG_MODULE_TIMER; - p_msg_entry->param.major_type = SPL_TCPIP_MSG_TIMER; - p_msg_entry->param.minor_type = TIMER_MSG_CLEAR; - p_msg_entry->param.op_type = MSG_ASYN_POST; - p_msg_entry->param.receiver = 0; - sys_sem_init (&p_msg_entry->param.op_completed); - - msg_timer *tmo = (msg_timer *) (p_msg_entry->buffer); - tmo->act = pcb; - tmo->arg = arg; - - if (msg_post (p_msg_entry, mbox->llring) < 0) - { - NSPOL_LOGERR - ("msg post is failed]module_type=%u, major_type=%u, minor_type=%u", - p_msg_entry->param.module_type, p_msg_entry->param.major_type, - p_msg_entry->param.minor_type); - spl_msg_free (p_msg_entry); - return ERR_VAL; - } - - return ERR_OK; - } - - NSPOL_LOGERR ("mbox is invalid"); - return ERR_VAL; -} - -#if STACKX_NETIF_API -err_t -tcpip_netif_post (data_com_msg * m) -{ - err_t err = ERR_OK; - sys_mbox_t mbox = get_primary_box (); - - if (NULL == mbox || !sys_mbox_valid (&mbox)) - { - NSPOL_LOGERR ("mbox not initialed well"); - err = ERR_MEM; - goto err_exit; - } - - if (NULL == mbox->llring) - { - int tryCount = 0; -#define TCP_NETIF_WAITINIT_MAX_COUNT 10 - NSPOL_LOGWAR (TCPIP_DEBUG, "mbox->llring not initialed yet..."); - sys_sleep_ns (0, 100000000); - while (!mbox->llring && (++tryCount < TCP_NETIF_WAITINIT_MAX_COUNT)) - { - NSPOL_LOGWAR (TCPIP_DEBUG, "mbox->llring not initialed yet..."); - sys_sleep_ns (0, 100000000); - } - - if (NULL == mbox->llring) - { - NSPOL_LOGERR ("failed to get a valid mbox->llring"); - err = ERR_MEM; - goto err_exit; - } - } - - NSPOL_LOGINF (TCPIP_DEBUG, "post tcpip_netif_msg..."); - - if (msg_post_with_lock_rel (m, mbox->llring) < 0) - { - err = ERR_VAL; - } - else - { - err = m->param.err; - } - -err_exit: - /* it's a sync message */ - spl_msg_free (m); - return err; -} - -/** - * Much like tcpip_apimsg, but calls the lower part of a netifapi_* - * function. - * - * @param netifapimsg a struct containing the function to call and its parameters - * @return error code given back by the function that was called - */ -err_t -tcpip_netif_add (msg_add_netif * tmp) -{ - data_com_msg *p_msg_entry = NULL; - msg_add_netif *nmsg = NULL; - - if (spl_msg_malloc (&p_msg_entry) == -1) - { - NSPOL_LOGERR ("tcpip_netifapi:spl_msg_malloc failed."); - return ERR_MEM; - } - - p_msg_entry->param.module_type = MSG_MODULE_HAL; - p_msg_entry->param.major_type = SPL_TCPIP_MSG_NETIFAPI; - p_msg_entry->param.minor_type = NETIF_DO_ADD; - p_msg_entry->param.op_type = MSG_SYN_POST; - p_msg_entry->param.receiver = 0; - sys_sem_init (&p_msg_entry->param.op_completed); - - nmsg = (msg_add_netif *) p_msg_entry->buffer; - nmsg->function = tmp->function; - nmsg->netif = tmp->netif; - nmsg->ipaddr = tmp->ipaddr; - nmsg->netmask = tmp->netmask; - nmsg->gw = tmp->gw; - nmsg->state = tmp->state; - nmsg->init = tmp->init; - nmsg->input = tmp->input; - nmsg->voidfunc = tmp->voidfunc; - - return tcpip_netif_post (p_msg_entry); -} - -#endif /* STACKX_NETIF_API */ - -/* Added for congestion control, maybe not used end */ - -extern err_t init_ptimer (void); -extern struct cfg_item_info g_cfg_item_info[CFG_SEG_MAX][MAX_CFG_ITEM]; - -/*=========== set share config for nStackMain =============*/ -static inline mzone_handle -create_mem_zone (nsfw_mem_zone * zone_info) -{ - return nsfw_mem_zone_create (zone_info); -} - -static inline int -set_zone_info (nsfw_mem_zone * zone_info, nsfw_mem_name * name_info, u32 len) -{ - if (EOK != - MEMCPY_S (&(zone_info->stname), sizeof (nsfw_mem_name), name_info, - sizeof (nsfw_mem_name))) - { - NSPOL_DUMP_LOGERR ("create pool failed, MEMCPY_S failed."); - return -1; - } - - zone_info->length = len; - zone_info->isocket_id = NSFW_SOCKET_ANY; - - return 0; -} - -int -set_share_config () -{ - static nsfw_mem_name g_cfg_mem_info = - { NSFW_SHMEM, NSFW_PROC_MAIN, NSTACK_SHARE_CONFIG }; - - nsfw_mem_zone zone_info; - if (set_zone_info (&zone_info, &g_cfg_mem_info, get_cfg_share_mem_size ()) < - 0) - { - return -1; - } - - mzone_handle base_cfg_mem = create_mem_zone (&zone_info); - if (NULL == base_cfg_mem) - { - NSPOL_LOGERR ("get config share mem failed."); - return -1; - } - - if (set_share_cfg_to_mem (base_cfg_mem) < 0) - { - NSPOL_LOGERR ("set share config failed."); - return -1; - } - - return 0; -} - -int -init_by_tcpip_thread () -{ - if (spl_init_app_res () != 0) - { - NSPOL_LOGERR ("spl_init_app_res failed"); - return -1; - } - - if (init_instance () != 0) - { - return -1; - } - if (tcpip_thread_init () != 0) - { - NSTCP_LOGERR ("tcpip_thread_init failed!"); - return -1; - } - - init_stackx_lwip (); - - return 0; -} - -void -spl_tcpip_thread (void *arg) -{ - g_tcpip_thread_stat = 1; - - if (init_by_tcpip_thread () != 0) - { - return; - } - - struct stackx_stack *share_memory = &p_def_stack_instance->lstack; - struct disp_netif_list **iflist = &p_def_stack_instance->netif_list; - - u32 run_count = 0; - u16 task_loop; - u16 num_recv_task = 0, num_send_timer_task = 0; - u16 index_task = 0; - //int tcpip_thread_sleep_interval = g_tcpip_thread_sleep_time * 1000; - void *task_queue[TASK_BURST]; - data_com_msg *msg; - - while (1) - { - /* try to receive packet from hal layer */ - num_recv_task = tcpip_netif_recv (*iflist); - - /* try to receive message from sbr layer */ - num_send_timer_task = priority_sched_mbox (share_memory, - task_queue, TASK_BURST); - - if (num_recv_task) - { - NSPOL_LOGINF (TCPIP_DEBUG, "num_recv_task %d", num_recv_task); - } - - /* Statistics the total number of messages */ - - /* Separate statistics on socket api messages */ - /* handle the request from upper layer and lower layer one by one */ - task_loop = (num_send_timer_task > num_recv_task ? - num_send_timer_task : num_recv_task); - if (task_loop == 0) - { - no_task_in_one_loop (); - - if (run_count++ > 20) - { - //sys_sleep_ns (0, tcpip_thread_sleep_interval); - } - continue; - } - - run_count = 0; - index_task = 0; - - /* at least one task to be handled */ - while (task_loop > index_task) - { - /* handle one packet from hal layer (for multi-nic case, do it for each) */ - if (num_recv_task > index_task) - { - do_recv_task (*iflist, index_task); - } - - /* handle one message from sbr layer */ - if (num_send_timer_task > index_task) - { - msg = (data_com_msg *) (task_queue[index_task]); - - spl_process (msg); - } - - do_update_pcbstate (); - - index_task++; - } - } -} - -int -create_tcpip_thread () -{ - int ret; - u64 arg = 0; - - /* main tcpip thread */ - char thread_name[32] = TCPIP_THREAD_NAME; - - sys_thread_t thread = sys_thread_new (thread_name, spl_tcpip_thread, - (void *) arg, - TCPIP_THREAD_STACKSIZE, - g_cfg_item_info[CFG_SEG_PRI] - [CFG_SEG_THREAD_PRI_PRI].value); - - cpu_set_t cpuset; - CPU_ZERO (&cpuset); /*lint !e534 */ - CPU_SET (g_nstack_bind_cpu, &cpuset); /*lint !e522 */ - ret = pthread_setaffinity_np (thread, sizeof (cpuset), &cpuset); - if (ret != 0) - { - NSPOL_LOGERR ("pthread_setaffinity_np failed]thread_name=%s,ret=%d", - TCPIP_THREAD_NAME, ret); - } - - return 0; -} - -int -create_timer_thread () -{ -#if 1 - if (init_ptimer () != ERR_OK) - { - NSPOL_LOGERR ("init_ptimer failed"); - return -1; - } - - sys_thread_t thread_timer = - sys_thread_new (PTIMER_THREAD_NAME, ptimer_thread, NULL, - TCPIP_THREAD_STACKSIZE, 0); - cpu_set_t cpuset_timer; - CPU_ZERO (&cpuset_timer); - CPU_SET (1, &cpuset_timer); - int ret = pthread_setaffinity_np (thread_timer, sizeof (cpuset_timer), - &cpuset_timer); - if (ret != 0) - { - NSPOL_LOGERR ("TCP init Timer Trhead Failed!"); - } - - g_timerThread_id = thread_timer; -#endif - return 0; -} - -int -init_ip_module_reader () -{ - output_api api = { 0 }; - api.post_to = post_ip_module_msg; - api.add_netif_ip = add_netif_ip; - api.del_netif_ip = del_netif_ip; - regist_output_api (&api); - - if (init_configuration_reader () < 0) - { - NSPOL_LOGERR ("init_configuration_reader failed"); - return -1; - } - - return 0; -} - -extern int init_unmatch_version (void); -extern int init_stackx_global_tick (void); - -int -init_by_main_thread () -{ - NSPOL_LOGINF (TCPIP_DEBUG, "init_by_main_thread start version 1.4"); - - uStackArgIndex++; - if (spl_hal_init (g_dpdk_argc, (char **) g_dpdk_argv) < 0) - { - NSPOL_LOGERR ("spl_hal_init failed"); - return -1; - } - NSPOL_LOGINF (TCPIP_DEBUG, "stage 1"); - - if (init_unmatch_version () != 0) - { - return -1; - } - - NSPOL_LOGINF (TCPIP_DEBUG, "stage 2"); - if (init_stackx_global_tick () != 0) - { - return -1; - } - NSPOL_LOGINF (TCPIP_DEBUG, "stage 3"); - - if (spl_init_group_array () != 0) - { - NSPOL_LOGERR ("spl_init_group_array failed"); - return -1; - } - NSPOL_LOGINF (TCPIP_DEBUG, "stage 4"); - - if (set_share_config () != 0) - { - NSPOL_LOGERR ("set_share_config failed."); - return -1; - } - NSPOL_LOGINF (TCPIP_DEBUG, "stage 5"); - - if (create_timer_thread () != 0) - { - //NSPOL_LOGERR(TCPIP_DEBUG,"init_timer_thread failed."); - return -1; - } - NSPOL_LOGINF (TCPIP_DEBUG, "stage 6"); - - if (create_tcpip_thread () != 0) - { - NSPOL_LOGERR ("init_tcpip_thread failed."); - return -1; - } - NSPOL_LOGINF (TCPIP_DEBUG, "stage 7"); - - if (init_ip_module_reader () != 0) - { - return -1; - } - NSPOL_LOGINF (TCPIP_DEBUG, "stage end"); - - return 0; -} - -void -create_netif (struct stackx_port_info *p_port_info) -{ - int ret; - struct spl_ip_addr ip, mask, gw; - struct netifExt *netifEx = NULL; - struct netif *netif = malloc (sizeof (struct netif)); - if (!netif) - { - NSPOL_LOGERR ("malloc failed"); - return; - } - - if (MEMSET_S (netif, sizeof (struct netif), 0, sizeof (struct netif)) < 0) - { - NSPOL_LOGERR ("MEMSET_S failed"); - goto error; - } - - NSPOL_LOGINF (TCPIP_DEBUG, "I get netif]ip=%s,gw=%s,mask=%s,name=%c %c", - p_port_info->linux_ip.ip_addr_linux, - p_port_info->linux_ip.ip_addr_linux, - p_port_info->linux_ip.mask_linux, - netif->name[0], netif->name[1]); - - if (inet_aton (p_port_info->linux_ip.ip_addr_linux, &ip) - && inet_aton (p_port_info->linux_ip.ip_addr_linux, &gw) - && inet_aton (p_port_info->linux_ip.mask_linux, &mask)) - { - ret = - spl_netifapi_netif_add (netif, &ip, &mask, &gw, NULL, ethernetif_init, - spl_tcpip_input, netif_set_up); - if (ERR_OK != ret) - { - NSPOL_LOGERR ("netifapi_netif_add failed]ret=%d", ret); - goto error; - } -#if 1 - if (0 != netifExt_add (netif)) - return; - -#endif - netifEx = getNetifExt (netif->num); - if (NULL == netifEx) - return; - - netifEx->hdl = p_port_info->linux_ip.hdl; - ret = - STRCPY_S (netifEx->if_name, sizeof (netifEx->if_name), - p_port_info->linux_ip.if_name); - if (EOK != ret) - { - NSPOL_LOGERR ("STRCPY_S failed]ret=%d", ret); - goto error; - } - return; - } - -error: - free (netif); -} - -int -post_ip_module_msg (void *arg, ip_module_type Type, - ip_module_operate_type operate_type) -{ - data_com_msg *p_msg_entry; - msg_ip_module *imsg; - sys_mbox_t mbox = get_primary_box (); - - if (!mbox) - { - NSOPR_LOGERR ("get_cur_mbox failed"); - return ERR_MEM; - } - - if (sys_mbox_valid (&mbox)) - { - if (spl_msg_malloc (&p_msg_entry) == -1) - { - NSOPR_LOGERR ("ip_route_apimsg:spl_msg_malloc failed."); - return ERR_MEM; - } - - sys_sem_init (&p_msg_entry->param.op_completed); - p_msg_entry->param.module_type = MSG_MODULE_IP; - p_msg_entry->param.op_type = MSG_SYN_POST; - - imsg = (msg_ip_module *) (p_msg_entry->buffer); - imsg->arg = arg; - imsg->type = Type; - imsg->operate_type = operate_type; - - NSOPR_LOGINF ("post ip_module msg to tcpip_thread]action=%d,type=%d", - operate_type, Type); - - if (msg_post (p_msg_entry, mbox->llring) != 0) - { - NSOPR_LOGERR - ("msg_post failed,this can not happen]action=%d,type=%d", - operate_type, Type); - } - - spl_msg_free (p_msg_entry); - - return ERR_OK; - } - - NSOPR_LOGERR ("mbox is invalid"); - return ERR_VAL; -} - -int -process_ip_module_msg (void *arg, ip_module_type module_type, - ip_module_operate_type operate_type) -{ - int retval = process_configuration (arg, module_type, operate_type); - - NSOPR_LOGINF ("tcpip_thread: ip_module cmd exec over, send SYNC_MSG_ACK"); - return retval; -} - -int -init_new_network_configuration () -{ - if (spl_hal_port_init () < 0) - { - return -1; - } - - return 0; -} - -static int -_process_ip_module_msg (data_com_msg * m) -{ - m->param.err = ERR_OK; - msg_ip_module *_m = (msg_ip_module *) m->buffer; - int ret = process_ip_module_msg (_m->arg, _m->type, _m->operate_type); - SYNC_MSG_ACK (m); - return ret; -} - -int -spl_post_msg (u16 mod, u16 maj, u16 min, u16 op, char *data, u16 data_len, - u32 src_pid) -{ - data_com_msg *p_msg_entry; - - sys_mbox_t mbox = get_primary_box (); - if (!sys_mbox_valid (&mbox)) - { - NSPOL_LOGERR - ("get mbox null!]mod=%u,maj=%u,min=%u,op=%u,data=%p,len=%u", mod, maj, - min, op, data, data_len); - return ERR_MEM; - } - - if (spl_msg_malloc (&p_msg_entry) == -1) - { - NSPOL_LOGERR ("get msg null!]mod=%u,maj=%u,min=%u,op=%u,data=%p,len=%u", - mod, maj, min, op, data, data_len); - return ERR_MEM; - } - - sys_sem_init (&p_msg_entry->param.op_completed); - p_msg_entry->param.module_type = mod; - p_msg_entry->param.major_type = maj; - p_msg_entry->param.minor_type = min; - p_msg_entry->param.op_type = op; - p_msg_entry->param.src_pid = src_pid; - - int retVal; - if (NULL != data) - { - retVal = - MEMCPY_S ((char *) p_msg_entry->buffer, sizeof (p_msg_entry->buffer), - data, data_len); - if (EOK != retVal) - { - NSPOL_LOGERR ("MEMCPY_S failed %d.", retVal); - spl_msg_free (p_msg_entry); - return ERR_MEM; - } - } - - if (msg_post_with_lock_rel (p_msg_entry, mbox->llring) != 0) - { - NSPOL_LOGERR - ("post msg error!]mod=%u,maj=%u,min=%u,op=%u,data=%p,len=%u", mod, - maj, min, op, data, data_len); - spl_msg_free (p_msg_entry); - return ERR_MEM; - } - - if (MSG_SYN_POST == op) - { - spl_msg_free (p_msg_entry); - } - - NSOPR_LOGDBG ("post msg suc!]mod=%u,maj=%u,min=%u,op=%u,data=%p,len=%u", - mod, maj, min, op, data, data_len); - return ERR_OK; -} - -/* -* Added by eliminate duplicated code degree, the function is moved to the public places -*adjust memory size for pal and eal mem size: this func do the following things: -*1. copy argv to gArgv and g_dpdk_argv -*2. remove OPT_EAL_MEM_SIZE option so that the rtp and rte options process won't reprt unrecognized option error. -*3. set eal mem size and pal_mem_size = mem - eal_mem_size -*/ -int -adjust_mem_arg (int argc, char *argv[]) -{ - int i = 0; - int j = 0; - int retVal; - char *tmp = NULL; - char *tmp2 = NULL; - int arg_mem_index = -1; - char *saveptr1 = NULL; - int mem_size = 0; - int mem_size_parsed = 0; // if multi -m argument is set, then only deal with the first one - int eal_mem_size = DPDK_DEFAULT_EAL_MEM_SIZE; // Default - - if ((argc < NSTACK_MAIN_MIN_PARA) || (argc > NSTACK_MAIN_MAX_PARA)) - { - NSPOL_LOGERR ("The number of parameters is incorrect"); - return -1; - } - - globalArgc = argc; - g_dpdk_argc = argc; - gArgv = (char **) malloc (sizeof (char *) * argc); - if (gArgv == NULL) - { - NSPOL_LOGERR ("Failed to alloc memory for adjust mem args\n"); - goto ERROR_INIT; - } - - g_dpdk_argv = (char **) malloc (sizeof (char *) * argc); - if (g_dpdk_argv == NULL) - { - NSPOL_LOGERR ("Failed to alloc memory for adjust mem args\n"); - goto ERROR_INIT; - } - - retVal = - MEMSET_S (gArgv, sizeof (char *) * argc, 0, sizeof (char *) * argc); - if (EOK != retVal) - { - NSPOL_LOGERR ("MEMSET_S failed %d.", retVal); - goto ERROR_INIT; - } - retVal = - MEMSET_S (g_dpdk_argv, sizeof (char *) * argc, 0, sizeof (char *) * argc); - if (EOK != retVal) - { - NSPOL_LOGERR ("MEMSET_S failed %d.", retVal); - goto ERROR_INIT; - } - - for (i = 0; i < argc; i++) - { - if (!strcmp ("-m", argv[i]) && !mem_size_parsed && (i + 1 < argc)) - { - gArgv[j] = argv[i]; - g_dpdk_argv[j] = argv[i]; - i++; - j++; - gArgv[j] = (char *) malloc (32); - g_dpdk_argv[j] = (char *) malloc (32); - /* gArgv[j] is NULL and g_dpdk_argv[j] isnot NULL, need free g_dpdk_argv[j] */ - arg_mem_index = j; - if ((!gArgv[j]) || (!g_dpdk_argv[j])) - { - NSPOL_LOGERR ("malloc failed."); - goto ERROR_PARSE_MALLOC; - } - mem_size = atoi (argv[i]); - /* add memory range check,avoid handle wrongly later begin */ - if (mem_size < 0) - { - goto ERROR_PARSE_MALLOC; - } - - j++; - mem_size_parsed = 1; - } - else - if (!strncmp (OPT_EAL_MEM_SIZE, argv[i], strlen (OPT_EAL_MEM_SIZE))) - { - tmp = strdup (argv[i]); - if (tmp == NULL) - { - goto ERROR_PARSE_MALLOC; - } - /* Always use re-entrant functions in multi-threaded environments */ - tmp2 = strtok_r (tmp, "=", &saveptr1); - tmp2 = strtok_r (NULL, "=", &saveptr1); - if (tmp2) - { - eal_mem_size = atoi (tmp2); - /* add memory range check,avoid handle wrongly later */ - if (eal_mem_size < 0) - { - free (tmp); - goto ERROR_PARSE_MALLOC; - } - } - free (tmp); - tmp = NULL; - /*remove this option since dpdk can't recognize it and may cause error. */ - /*so we should deduct the count by 1. */ - globalArgc -= 1; - g_dpdk_argc -= 1; - } - else - { - gArgv[j] = argv[i]; - g_dpdk_argv[j] = argv[i]; - j++; - } - } - - /* -m arg is set */ - if (arg_mem_index >= 0) - { - retVal = - SPRINTF_S (gArgv[arg_mem_index], 32, "%d", mem_size - eal_mem_size); - if (-1 == retVal) - { - NSPOL_LOGERR ("SPRINTF_S failed]ret=%d", retVal); - goto ERROR_PARSE_MALLOC; - } - retVal = SPRINTF_S (g_dpdk_argv[arg_mem_index], 32, "%d", eal_mem_size); - if (-1 == retVal) - { - NSPOL_LOGERR ("SPRINTF_S failed]ret=%d", retVal); - goto ERROR_PARSE_MALLOC; - } - } - else - { - // do nothing for no mem arg and leave it for default process of pal and eal. - } - - return 0; -ERROR_PARSE_MALLOC: - if (arg_mem_index >= 0 && gArgv[arg_mem_index]) - { - free (gArgv[arg_mem_index]); - gArgv[arg_mem_index] = NULL; - } - - if (arg_mem_index >= 0 && g_dpdk_argv[arg_mem_index]) - { - free (g_dpdk_argv[arg_mem_index]); - g_dpdk_argv[arg_mem_index] = NULL; - } - -ERROR_INIT: - if (gArgv) - { - free (gArgv); - gArgv = NULL; - globalArgc = 0; - } - - if (g_dpdk_argv) - { - free (g_dpdk_argv); - g_dpdk_argv = NULL; - g_dpdk_argc = 0; - } - - return -1; -} - -REGIST_MSG_MODULE_FUN (MSG_MODULE_IP, _process_ip_module_msg); - -REGIST_MSG_MODULE_MAJOR_FUN (MSG_MODULE_SPL, SPL_TCPIP_MSG_CALLBACK, - _do_spl_callback_msg); - -REGIST_MSG_MODULE_MAJOR_FUN (MSG_MODULE_TIMER, SPL_TCPIP_MSG_TIMER, - _do_spl_timer_msg); - -REGIST_MSG_MODULE_MAJOR_MINOR_FUN (MSG_MODULE_TIMER, SPL_TCPIP_MSG_TIMER, - TIMER_MSG_TIMEOUT, _do_timeout_handle); - -REGIST_MSG_MODULE_MAJOR_MINOR_FUN (MSG_MODULE_TIMER, SPL_TCPIP_MSG_TIMER, - TIMER_MSG_CLEAR, _do_clear_timer); |