summaryrefslogtreecommitdiffstats
path: root/stacks/lwip_stack/lwip_src/common/stackx_spl_share.c
diff options
context:
space:
mode:
Diffstat (limited to 'stacks/lwip_stack/lwip_src/common/stackx_spl_share.c')
-rw-r--r--stacks/lwip_stack/lwip_src/common/stackx_spl_share.c192
1 files changed, 192 insertions, 0 deletions
diff --git a/stacks/lwip_stack/lwip_src/common/stackx_spl_share.c b/stacks/lwip_stack/lwip_src/common/stackx_spl_share.c
new file mode 100644
index 0000000..a0cb5f3
--- /dev/null
+++ b/stacks/lwip_stack/lwip_src/common/stackx_spl_share.c
@@ -0,0 +1,192 @@
+/*
+*
+* 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_spl_msg.h"
+#include "stackx_spl_share.h"
+#include "nstack_log.h"
+#include "nsfw_msg_api.h"
+#include "nsfw_recycle_api.h"
+
+/*****************************************************************************
+* Prototype : ss_reset_conn_recycle
+* Description : reset conn recycle
+* Input : netconn_recycle* recycle
+* Output : None
+* Return Value : static inline void
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+static inline void ss_reset_conn_recycle(netconn_recycle * recycle)
+{
+ recycle->accept_from = NULL;
+ recycle->is_listen_conn = 0;
+ (void) nsfw_pidinfo_init(&recycle->pid_info);
+ recycle->fork_ref = 0;
+ recycle->delay_msg = NULL;
+ recycle->delay_flag = SS_DELAY_STOPPED;
+}
+
+/*****************************************************************************
+* Prototype : ss_reset_conn
+* Description : reset conn
+* Input : spl_netconn_t* conn
+* Output : None
+* Return Value : void
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+void ss_reset_conn(spl_netconn_t * conn)
+{
+ conn->recv_obj = 0;
+ conn->private_data = 0;
+ conn->msg_box = NULL;
+ conn->snd_buf = 0;
+ conn->epoll_flag = 0;
+ conn->recv_avail_prod = 0;
+ conn->recv_avail_cons = 0;
+ conn->rcvevent = 0;
+ conn->state = SPL_NETCONN_NONE;
+ conn->sendevent = 0;
+ conn->errevent = 0;
+ conn->shut_status = 0xFFFF;
+ conn->flags = 0;
+ conn->last_err = 0;
+ conn->CanNotReceive = 0;
+ conn->bind_thread_index = 0;
+ conn->tcp_sndbuf = 0;
+ conn->tcp_wmem_alloc_cnt = 0;
+ conn->tcp_wmem_sbr_free_cnt = 0;
+ conn->tcp_wmem_spl_free_cnt = 0;
+ conn->mss = 0;
+ conn->remote_port = 0;
+ conn->remote_ip.addr = 0;
+ conn->local_ip.addr = 0;
+ conn->local_port = 0;
+ conn->type = SPL_NETCONN_INVALID;
+ conn->tcp_state = SPL_CLOSED;
+ ss_reset_conn_recycle(&conn->recycle);
+ conn->extend_member_bit = 0;
+ conn->epInfo = NULL;
+}
+
+/*****************************************************************************
+* Prototype : ss_init_conn
+* Description : init conn
+* Input : spl_netconn_t* conn
+* Output : None
+* Return Value : void
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+static inline void
+ss_init_conn(spl_netconn_t * conn, mring_handle pool, spl_netconn_type_t type)
+{
+ res_alloc(&conn->res_chk);
+
+ conn->type = type;
+ conn->recycle.fork_ref = 1;
+ conn->recv_ring_valid = 1;
+ sys_sem_init(&conn->close_completed);
+ NSSBR_LOGINF("malloc conn ok]conn=%p,pool=%p", conn, pool);
+}
+
+/*****************************************************************************
+* Prototype : ss_malloc_conn
+* Description : malloc conn, only used in spl
+* Input : mring_handle pool
+* netconn_type_t type
+* Output : None
+* Return Value : spl_netconn_t*
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+spl_netconn_t *ss_malloc_conn(mring_handle pool, spl_netconn_type_t type)
+{
+ spl_netconn_t *conn = NULL;
+
+ if (nsfw_mem_ring_dequeue(pool, (void **) &conn) != 1)
+ {
+ NSSBR_LOGERR("malloc conn failed");
+ return NULL;
+ }
+
+ ss_init_conn(conn, pool, type);
+ return conn;
+}
+
+/*****************************************************************************
+* Prototype : ss_malloc_conn_app
+* Description : malloc conn, only used in app
+* Input : mring_handle pool
+* netconn_type_t type
+* Output : None
+* Return Value : spl_netconn_t*
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+spl_netconn_t *ss_malloc_conn_app(mring_handle pool, spl_netconn_type_t type)
+{
+ spl_netconn_t *conn = NULL;
+
+ if (nsfw_mem_ring_dequeue(pool, (void **) &conn) != 1)
+ {
+ NSSBR_LOGERR("malloc conn failed");
+ return NULL;
+ }
+
+ if (ss_add_pid(conn, get_sys_pid()) < 0)
+ {
+ NSSBR_LOGERR("ss_add_pid failed]conn=%p", conn);
+ }
+
+ ss_init_conn(conn, pool, type);
+ return conn;
+}
+
+/*****************************************************************************
+* Prototype : ss_free_conn
+* Description : free conn
+* Input : spl_netconn_t* conn
+* mring_handle pool
+* Output : None
+* Return Value : void
+* Calls :
+* Called By :
+*
+*****************************************************************************/
+void ss_free_conn(spl_netconn_t * conn)
+{
+ ss_reset_conn(conn);
+
+ if (res_free(&conn->res_chk))
+ {
+ NSFW_LOGERR("conn refree!]conn=%p", conn);
+ return;
+ }
+
+ mring_handle pool = ss_get_conn_pool(conn);
+ if (nsfw_mem_ring_enqueue(pool, (void *) conn) != 1)
+ {
+ NSSBR_LOGERR("nsfw_mem_ring_enqueue failed,this can not happen");
+ }
+
+ NSSBR_LOGINF("free conn ok]conn=%p,pool=%p", conn, pool);
+}