diff options
author | yalei wang <wylandrea@gmail.com> | 2018-08-14 06:58:19 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@fd.io> | 2018-08-14 06:58:19 +0000 |
commit | 55c3082a6a7a3982de66d0a97b1519105871f855 (patch) | |
tree | e7c76d51cf2df0ea42909f3bc7d84ebb2ced441d /stacks/lwip_stack/lwip_src/common/stackx_spl_share.h | |
parent | 9a4f5e18e7ae40e11d9f8a946182871b735a260e (diff) | |
parent | 7dc65518819f2b453fd2837e92c115592d8832ec (diff) |
Merge "Feat : LWIP integration part1"
Diffstat (limited to 'stacks/lwip_stack/lwip_src/common/stackx_spl_share.h')
-rw-r--r-- | stacks/lwip_stack/lwip_src/common/stackx_spl_share.h | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/stacks/lwip_stack/lwip_src/common/stackx_spl_share.h b/stacks/lwip_stack/lwip_src/common/stackx_spl_share.h new file mode 100644 index 0000000..3b0c9f9 --- /dev/null +++ b/stacks/lwip_stack/lwip_src/common/stackx_spl_share.h @@ -0,0 +1,478 @@ +/* +* +* 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. +*/ + +#ifndef STACKX_SPL_SHARE_H +#define STACKX_SPL_SHARE_H +#include "types.h" +#include "common_mem_api.h" +#include "nsfw_mem_api.h" +#include "common_pal_bitwide_adjust.h" +#include "stackx_ip_addr.h" +#include <sys/types.h> +#include "spl_opt.h" +#include "stackx_ip_tos.h" +#include "stackx_common_opt.h" +#include "stackx_tx_box.h" +#include "pidinfo.h" +//#include "stackx_dfx_api.h" +#include "compiling_check.h" +#include "nsfw_msg.h" +#include "stackx_spl_msg.h" +#include "hal_api.h" +#include "stackx_types.h" +#include <errno.h> + +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + +#define MSG_PRIO_QUEUE_NUM 3 +COMPAT_PROTECT (MSG_PRIO_QUEUE_NUM, 3); + +#define SPL_MSG_BOX_NUM (MSG_PRIO_QUEUE_NUM + 1) + +#define SBR_FD_NETCONN_SIZE (256 * 3) +COMPAT_PROTECT (SBR_FD_NETCONN_SIZE, 256 * 3); + +#define SS_NETCONN_SIZE (256 * 2) +#define SBR_FD_SIZE (SBR_FD_NETCONN_SIZE - SS_NETCONN_SIZE) + +typedef struct +{ + PRIMARY_ADDR mring_handle msg_pool; + PRIMARY_ADDR mring_handle conn_pool; + PRIMARY_ADDR struct spl_netconn **conn_array; + u32 conn_num; + i64 extend_member_bit; +} sbr_recycle_group; + +typedef enum +{ + SS_DELAY_STARTED, + SS_DELAY_STOPPING, + SS_DELAY_STOPPED, + SS_DELAY_AGAIN +} ss_delay_flag; + +typedef enum +{ + NORMAL_RECV_RING = 0, + CUSTOM_RECV_RING = 1, +} recv_ring_type; + +typedef struct +{ + PRIMARY_ADDR sbr_recycle_group *group; + PRIMARY_ADDR struct spl_netconn *accept_from; /* for recycle fd in listen */ + void *delay_msg; + nsfw_pidinfo pid_info; + volatile i16 fork_ref; + i8 is_listen_conn; + i8 delay_flag; +} netconn_recycle; + +typedef struct spl_netconn +{ + i64 recv_obj; + i64 comm_pcb_data; /* only used by spl */ + i64 private_data; /* only used by spl */ + PRIMARY_ADDR mring_handle msg_box; + PRIMARY_ADDR mring_handle recv_ring; + volatile u32 snd_buf; + volatile i32 epoll_flag; + /*here using prod/cons to instead recv_avail, avoid atomic oper. */ + volatile u32_t recv_avail_prod; /*the product of recv_avail */ + volatile u32_t recv_avail_cons; /*the consume of recv_avail */ + volatile i32 rcvevent; + spl_netconn_state_t state; + u16 sendevent; + u16 errevent; + volatile u16 shut_status; + u8 flags; + i8 last_err; + u8 CanNotReceive; + u8 recv_ring_valid; + u16 bind_thread_index; + u16 mss; + sys_sem_st close_completed; + mring_handle conn_pool; /* where the conn in pcb is from */ + + void *epInfo; + + /* The following shared field access rules: protocol stack process + * is responsible for writing, socket api process read only + */ + i32 send_bufsize; + i32 tcp_sndbuf; + u32 tcp_wmem_alloc_cnt; + u32 tcp_wmem_sbr_free_cnt; + volatile u32 tcp_wmem_spl_free_cnt; + u16 remote_port; + u16 local_port; + spl_ip_addr_t remote_ip; + spl_ip_addr_t local_ip; + spl_netconn_type_t type; + spl_tcp_state_t tcp_state; + + /* for recycle */ + netconn_recycle recycle; + nsfw_res res_chk; + i64 extend_member_bit; +} spl_netconn_t; /* sizeof(spl_netconn_t) need < SS_NETCONN_SIZE */ +SIZE_OF_TYPE_PLUS8_NOT_LARGER_THAN (spl_netconn_t, SS_NETCONN_SIZE); + +typedef struct +{ + /** + * it will increase after every restart which used for + * tell different runnings. + */ + u32 running_ref_no; + + /* only increased when fault to restart */ + u32 fault_ref_no; + + /* the procedures before upgrade are finished successfully */ + u32 prepare_upgrade_done; + +} spl_init_info_t; + +typedef struct netifExt +{ + struct netifExt *next; + u16_t id; + char if_name[HAL_MAX_NIC_NAME_LEN]; + hal_hdl_t hdl; + u16_t num_packets_recv; +} netifExt; + +static inline mring_handle +ss_get_msg_pool (spl_netconn_t * sh) +{ + sbr_recycle_group *group = + (sbr_recycle_group *) ADDR_SHTOL (sh->recycle.group); + return ADDR_SHTOL (group->msg_pool); +} + +static inline mring_handle +ss_get_conn_pool (spl_netconn_t * sh) +{ + sbr_recycle_group *group = + (sbr_recycle_group *) ADDR_SHTOL (sh->recycle.group); + return ADDR_SHTOL (group->conn_pool); +} + +static inline int +ss_is_nonblock_flag (spl_netconn_t * sh) +{ + return (sh->flags & SPL_NETCONN_FLAG_NON_BLOCKING) != 0; +} + +static inline int +ss_get_nonblock_flag (spl_netconn_t * sh) +{ + return ss_is_nonblock_flag (sh) ? O_NONBLOCK : 0; +} + +static inline void +ss_set_nonblock_flag (spl_netconn_t * sh, u32 flag) +{ + if (flag) + { + sh->flags |= SPL_NETCONN_FLAG_NON_BLOCKING; + } + else + { + sh->flags &= ~SPL_NETCONN_FLAG_NON_BLOCKING; + } +} + +static inline int +ss_get_last_errno (spl_netconn_t * sh) +{ + return sh->last_err; +} + +static inline i32 +ss_get_recv_event (spl_netconn_t * sh) +{ + return sh->rcvevent; +} + +static inline int +ss_can_not_recv (spl_netconn_t * sh) +{ + return sh->CanNotReceive; +} + +static inline int +ss_is_shut_rd (spl_netconn_t * sh) +{ + int status = sh->shut_status; + return ((SPL_SHUT_RD == status) || (SPL_SHUT_RDWR == status)); +} + +static inline void +ss_set_shut_status (spl_netconn_t * sh, u16 how) +{ + sh->shut_status = how; +} + +static inline u16 +ss_get_shut_status (spl_netconn_t * sh) +{ + return sh->shut_status; +} + +static inline void +ss_sub_recv_event (spl_netconn_t * sh) +{ + __sync_fetch_and_sub (&sh->rcvevent, 1); +} + +static inline void +ss_add_recv_event (spl_netconn_t * sh) +{ + __sync_fetch_and_add (&sh->rcvevent, 1); +} + +static inline i64 +ss_get_recv_obj (spl_netconn_t * sh) +{ + return sh->recv_obj; +} + +static inline i64 +ss_get_private_data (spl_netconn_t * sh) +{ + return sh->private_data; +} + +static inline i64 +ss_get_comm_private_data (spl_netconn_t * sh) +{ + return sh->comm_pcb_data; +} + +static inline int +ss_recv_ring_valid (spl_netconn_t * sh) +{ + return sh->recv_ring_valid; +} + +static inline mring_handle +ss_get_recv_ring (spl_netconn_t * sh) +{ + return (mring_handle) ADDR_SHTOL (sh->recv_ring); +} + +static inline void +ss_set_send_event (spl_netconn_t * sh, u16 value) +{ + sh->sendevent = value; +} + +static inline int +ss_is_noautorecved_flag (spl_netconn_t * sh) +{ + return (sh->flags & SPL_NETCONN_FLAG_NO_AUTO_RECVED) != 0; +} + +static inline int +ss_get_noautorecved_flag (spl_netconn_t * sh) +{ + return ss_is_noautorecved_flag (sh) ? SPL_NETCONN_FLAG_NO_AUTO_RECVED : 0; +} + +static inline void +ss_set_noautorecved_flag (spl_netconn_t * sh, u8 flag) +{ + if (flag) + { + sh->flags |= SPL_NETCONN_FLAG_NO_AUTO_RECVED; + } + else + { + sh->flags &= ~SPL_NETCONN_FLAG_NO_AUTO_RECVED; + } +} + +static inline void +ss_set_state (spl_netconn_t * sh, spl_netconn_state_t state) +{ + sh->state = state; +} + +static inline int +ss_is_write_state (spl_netconn_t * sh) +{ + return (SPL_NETCONN_WRITE == sh->state); +} + +static inline int +ss_is_listen_state (spl_netconn_t * sh) +{ + return (SPL_NETCONN_LISTEN == sh->state); +} + +static inline void +ss_sub_recv_avail (spl_netconn_t * sh, int value) +{ + sh->recv_avail_cons += value; +} + +static inline i32 +ss_get_recv_avail (spl_netconn_t * sh) +{ + return sh->recv_avail_prod - sh->recv_avail_cons; +} + +static inline u16 +ss_get_mss (spl_netconn_t * sh) +{ + return sh->mss; +} + +static inline spl_ip_addr_t * +ss_get_remote_ip (spl_netconn_t * sh) +{ + return &(sh->remote_ip); +} + +static inline u16 +ss_get_remote_port (spl_netconn_t * sh) +{ + return sh->remote_port; +} + +static inline spl_tcp_state_t +ss_get_tcp_state (spl_netconn_t * sh) +{ + return sh->tcp_state; +} + +static inline u16 +ss_get_bind_thread_index (spl_netconn_t * sh) +{ + return sh->bind_thread_index; +} + +static inline void +ss_set_bind_thread_index (spl_netconn_t * sh, u16 bind_thread_index) +{ + sh->bind_thread_index = bind_thread_index; +} + +static inline void +ss_set_msg_box (spl_netconn_t * sh, mring_handle box) +{ + sh->msg_box = (mring_handle) ADDR_LTOSH (box); +} + +static inline mring_handle +ss_get_msg_box (spl_netconn_t * sh) +{ + return (mring_handle) ADDR_SHTOL (sh->msg_box); +} + +static inline spl_ip_addr_t * +ss_get_local_ip (spl_netconn_t * sh) +{ + return &sh->local_ip; +} + +static inline void +ss_set_local_ip (spl_netconn_t * sh, u32 addr) +{ + if (!sh) + { + return; + } + sh->local_ip.addr = addr; +} + +static inline u16 +ss_get_local_port (spl_netconn_t * sh) +{ + return sh->local_port; +} + +static inline void +ss_set_local_port (spl_netconn_t * sh, u16 local_port) +{ + sh->local_port = local_port; +} + +static inline void +ss_set_accept_from (spl_netconn_t * sh, spl_netconn_t * accept_from) +{ + sh->recycle.accept_from = accept_from; +} + +static inline void +ss_set_is_listen_conn (spl_netconn_t * sh, i8 is_listen_conn) +{ + sh->recycle.is_listen_conn = is_listen_conn; +} + +static inline i32 +ss_dec_fork_ref (spl_netconn_t * sh) +{ + return __sync_sub_and_fetch (&sh->recycle.fork_ref, 1); +} + +static inline int +ss_add_pid (spl_netconn_t * sh, pid_t pid) +{ + return nsfw_add_pid (&sh->recycle.pid_info, pid); +} + +static inline int +ss_del_pid (spl_netconn_t * sh, pid_t pid) +{ + return nsfw_del_pid (&sh->recycle.pid_info, pid); +} + +static inline int +ss_is_pid_exist (spl_netconn_t * sh, pid_t pid) +{ + return nsfw_pid_exist (&sh->recycle.pid_info, pid); +} + +static inline int +ss_is_pid_array_empty (spl_netconn_t * sh) +{ + return nsfw_pidinfo_empty (&sh->recycle.pid_info); +} + +spl_netconn_t *ss_malloc_conn (mring_handle pool, spl_netconn_type_t type); +spl_netconn_t *ss_malloc_conn_app (mring_handle pool, + spl_netconn_type_t type); +void ss_free_conn (spl_netconn_t * conn); +void ss_reset_conn (spl_netconn_t * conn); + +typedef void (*ss_close_conn_fun) (void *close_data, u32 delay_sec); +int ss_recycle_conn (void *close_data, ss_close_conn_fun close_conn); + +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif + +#endif |