summaryrefslogtreecommitdiffstats
path: root/stacks/lwip_stack/lwip_src/socket/stackx_res_mgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'stacks/lwip_stack/lwip_src/socket/stackx_res_mgr.c')
-rw-r--r--stacks/lwip_stack/lwip_src/socket/stackx_res_mgr.c271
1 files changed, 271 insertions, 0 deletions
diff --git a/stacks/lwip_stack/lwip_src/socket/stackx_res_mgr.c b/stacks/lwip_stack/lwip_src/socket/stackx_res_mgr.c
new file mode 100644
index 0000000..964a1f9
--- /dev/null
+++ b/stacks/lwip_stack/lwip_src/socket/stackx_res_mgr.c
@@ -0,0 +1,271 @@
+/*
+*
+* 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 "stackx_res_mgr.h"
+#include "stackx_common.h"
+#include "nstack_securec.h"
+#include "nsfw_msg.h"
+#include "stackx_common.h"
+#include "nsfw_mgr_com_api.h"
+#include "stackx_cfg.h"
+#include "nsfw_maintain_api.h"
+//#include "stackx_dfx_api.h"
+#include "stackx_app_res.h"
+
+sbr_share_group g_share_group = { 0 };
+
+#define SLOW_SLEEP_TIME 500000
+
+NSTACK_STATIC inline void sbr_reset_fd_share(sbr_fd_share * fd_share)
+{
+ common_mem_spinlock_init(&fd_share->recv_lock);
+ common_mem_spinlock_init(&fd_share->common_lock);
+ fd_share->err = 0;
+ fd_share->lastoffset = 0;
+ fd_share->lastdata = NULL;
+ fd_share->recoder.head = NULL;
+ fd_share->recoder.tail = NULL;
+ fd_share->recoder.totalLen = 0;
+ fd_share->recv_timeout = 0;
+ fd_share->send_timeout = 0;
+ fd_share->rcvlowat = 1;
+ fd_share->block_polling_time = SLOW_SLEEP_TIME;
+}
+
+/*****************************************************************************
+* Prototype : sbr_init_tx_pool
+* Description : get tx buf pool
+* Input : None
+* Output : None
+* Return Value : static int
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+NSTACK_STATIC int sbr_init_tx_pool()
+{
+ mpool_handle pool[1];
+ pool[0] = NULL;
+
+ (void) sbr_malloc_tx_pool(get_sys_pid(), pool, 1);
+ if (pool[0])
+ {
+ g_share_group.tx_pool = pool[0];
+ return 0;
+ }
+
+ return -1;
+}
+
+/*****************************************************************************
+* Prototype : sbr_init_app_res
+* Description : get msg, conn pool
+* Input : None
+* Output : None
+* Return Value : static int
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+NSTACK_STATIC int sbr_init_app_res()
+{
+ g_share_group.conn_pool = sbr_get_instance_conn_pool(0);
+ if (!g_share_group.conn_pool)
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+/*=========== get share config for app =============*/
+NSTACK_STATIC inline int get_share_config()
+{
+ static nsfw_mem_name g_cfg_mem_info =
+ { NSFW_SHMEM, NSFW_PROC_MAIN, NSTACK_SHARE_CONFIG };
+
+ mzone_handle base_cfg_mem = nsfw_mem_zone_lookup(&g_cfg_mem_info);
+ if (NULL == base_cfg_mem)
+ {
+ NSSOC_LOGERR("get config share mem failed.");
+ return -1;
+ }
+
+ if (get_share_cfg_from_mem(base_cfg_mem) < 0)
+ {
+ NSSOC_LOGERR("get share config failed.");
+ return -1;
+ }
+
+ NSSOC_LOGDBG("get share config success.");
+ return 0;
+}
+
+int nstack_set_share_config()
+{
+ return 0;
+}
+
+/*****************************************************************************
+* Prototype : sbr_init_stackx
+* Description : init stackx res
+* Input : None
+* Output : None
+* Return Value : int
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+int sbr_init_stackx()
+{
+ sbr_init_cfg();
+ if (get_share_config() < 0)
+ {
+ NSSBR_LOGERR("get_share_config failed");
+ return -1;
+ }
+
+ if (sbr_attach_group_array() != 0)
+ {
+ NSSBR_LOGERR("sbr_attach_group_array failed");
+ return -1;
+ }
+
+ NSSBR_LOGDBG("sbr_attach_group_array ok");
+
+ if (sbr_init_tx_pool() != 0)
+ {
+ NSSBR_LOGERR("init tx pool failed");
+ return -1;
+ }
+
+ NSSBR_LOGDBG("init tx pool ok");
+
+ if (sbr_init_app_res() != 0)
+ {
+ NSSBR_LOGERR("sbr_init_app_res failed");
+ return -1;
+ }
+
+ NSSBR_LOGDBG("sbr_init_app_res ok");
+ NSSBR_LOGDBG("sbr_init_stackx ok");
+ return 0;
+}
+
+/*****************************************************************************
+* Prototype : sbr_fork_stackx
+* Description : init stackx res
+* Input : None
+* Output : None
+* Return Value : int
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+int sbr_fork_stackx()
+{
+
+ if (sbr_attach_group_array() != 0)
+ {
+ NSSBR_LOGERR("sbr_attach_group_array failed");
+ return -1;
+ }
+
+ NSSBR_LOGDBG("sbr_attach_group_array ok");
+
+ if (sbr_init_tx_pool() != 0)
+ {
+ NSSBR_LOGERR("init tx pool failed");
+ return -1;
+ }
+
+ NSSBR_LOGDBG("init tx pool ok");
+ NSSBR_LOGDBG("sbr_fork_stackx ok");
+ return 0;
+}
+
+/*****************************************************************************
+* Prototype : sbr_malloc_conn_for_sk
+* Description : malloc netconn for sk,need add pid
+* Input : sbr_socket_t* sk
+* netconn_type_t type
+* Output : None
+* Return Value : int
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+int sbr_malloc_conn_for_sk(sbr_socket_t * sk, spl_netconn_type_t type)
+{
+ spl_netconn_t *conn = ss_malloc_conn_app(g_share_group.conn_pool, type);
+
+ if (!conn)
+ {
+ NSSBR_LOGERR("malloc conn failed]fd=%d", sk->fd);
+ sbr_set_errno(ENOBUFS);
+ return -1;
+ }
+
+ NSSBR_LOGINF("malloc conn ok]fd=%d,conn=%p", sk->fd, conn);
+
+ u16 thread_index = 0;
+ ss_set_bind_thread_index(conn, thread_index);
+ ss_set_msg_box(conn, ss_get_instance_msg_box(thread_index, 0));
+
+ sbr_fd_share *fd_share =
+ (sbr_fd_share *) ((char *) conn + SS_NETCONN_SIZE);
+ sbr_reset_fd_share(fd_share);
+
+ sk->stack_obj = (void *) conn;
+ sk->sk_obj = (void *) fd_share;
+ return 0;
+}
+
+int sbr_init_conn_for_accept(sbr_socket_t * sk, spl_netconn_t * conn)
+{
+ if (!conn)
+ {
+ sbr_set_sk_errno(sk, ENOBUFS);
+ return -1;
+ }
+
+ NSSBR_LOGINF("accept conn ok]fd=%d,conn=%p,private_data=%p", sk->fd, conn,
+ conn->private_data);
+
+ if (ss_add_pid(conn, get_sys_pid()) < 0)
+ {
+ NSSBR_LOGERR("ss_add_pid failed]fd=%d", sk->fd);
+ }
+
+ ss_set_accept_from(conn, NULL); /* need clear flag */
+
+ sbr_fd_share *fd_share =
+ (sbr_fd_share *) ((char *) conn + SS_NETCONN_SIZE);
+ sbr_reset_fd_share(fd_share);
+
+ sk->stack_obj = (void *) conn;
+ sk->sk_obj = (void *) fd_share;
+
+ return 0;
+}
+
+void sbr_free_conn_from_sk(sbr_socket_t * sk)
+{
+ ss_free_conn(sbr_get_conn(sk));
+ sk->stack_obj = NULL;
+ sk->sk_obj = NULL;
+ NSSBR_LOGDBG("free conn ok]fd=%d", sk->fd);
+}