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/src/sbr | |
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/src/sbr')
-rw-r--r-- | stacks/lwip_stack/src/sbr/CMakeLists.txt | 30 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_err.h | 191 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_index_ring.c | 212 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_index_ring.h | 61 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_protocol_api.h | 103 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_res_mgr.c | 88 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_res_mgr.h | 159 | ||||
-rw-r--r-- | stacks/lwip_stack/src/sbr/sbr_socket.c | 1274 |
8 files changed, 0 insertions, 2118 deletions
diff --git a/stacks/lwip_stack/src/sbr/CMakeLists.txt b/stacks/lwip_stack/src/sbr/CMakeLists.txt deleted file mode 100644 index f324e5f..0000000 --- a/stacks/lwip_stack/src/sbr/CMakeLists.txt +++ /dev/null @@ -1,30 +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. -######################################################################### - -if(WITH_HAL_LIB) -else() - SET(PAL_H_DIRECTORIES "/usr/include/dpdk/") -endif() - - -FILE(GLOB SBR *.c) -ADD_LIBRARY(lwip_dpdk SHARED ${SBR}) -TARGET_LINK_LIBRARIES(lwip_dpdk -Wl,--whole-archive socket -Wl,--no-whole-archive dmm_api nStackMaintain) -ADD_DEPENDENCIES(lwip_dpdk socket DPDK) -INCLUDE_DIRECTORIES( - ${CMAKE_CURRENT_LIST_DIR}/../include - ${PAL_H_DIRECTORIES} -) diff --git a/stacks/lwip_stack/src/sbr/sbr_err.h b/stacks/lwip_stack/src/sbr/sbr_err.h deleted file mode 100644 index be3bc3b..0000000 --- a/stacks/lwip_stack/src/sbr/sbr_err.h +++ /dev/null @@ -1,191 +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. -*/ - -#ifndef SBR_ERR_H -#define SBR_ERR_H -#include <errno.h> - -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -#ifdef SBR_PROVIDE_ERRNO -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ -#define ENXIO 6 /* No such device or address */ -#define E2BIG 7 /* Arg list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file number */ -#define ECHILD 10 /* No child processes */ -#define EAGAIN 11 /* Try again */ -#define ENOMEM 12 /* Out of memory */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Device or resource busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* No such device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* File table overflow */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Not a typewriter */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#define EDOM 33 /* Math argument out of domain of func */ -#define ERANGE 34 /* Math result not representable */ -#define EDEADLK 35 /* Resource deadlock would occur */ -#define ENAMETOOLONG 36 /* File name too long */ -#define ENOLCK 37 /* No stored locks available */ -#define ENOSYS 38 /* Function not implemented */ -#define ENOTEMPTY 39 /* Directory not empty */ -#define ELOOP 40 /* Too many symbolic links encountered */ -#define EWOULDBLOCK EAGAIN /* Operation would block */ -#define ENOMSG 42 /* No message of desired type */ -#define EIDRM 43 /* Identifier removed */ -#define ECHRNG 44 /* Channel number out of range */ -#define EL2NSYNC 45 /* Level 2 not synchronized */ -#define EL3HLT 46 /* Level 3 halted */ -#define EL3RST 47 /* Level 3 reset */ -#define ELNRNG 48 /* Link number out of range */ -#define EUNATCH 49 /* Protocol driver not attached */ -#define ENOCSI 50 /* No CSI structure available */ -#define EL2HLT 51 /* Level 2 halted */ -#define EBADE 52 /* Invalid exchange */ -#define EBADR 53 /* Invalid request descriptor */ -#define EXFULL 54 /* Exchange full */ -#define ENOANO 55 /* No anode */ -#define EBADRQC 56 /* Invalid request code */ -#define EBADSLT 57 /* Invalid slot */ - -#define EDEADLOCK EDEADLK - -#define EBFONT 59 /* Bad font file format */ -#define ENOSTR 60 /* Device not a stream */ -#define ENODATA 61 /* No data available */ -#define ETIME 62 /* Timer expired */ -#define ENOSR 63 /* Out of streams resources */ -#define ENONET 64 /* Machine is not on the network */ -#define ENOPKG 65 /* Package not installed */ -#define EREMOTE 66 /* Object is remote */ -#define ENOLINK 67 /* Link has been severed */ -#define EADV 68 /* Advertise error */ -#define ESRMNT 69 /* Srmount error */ -#define ECOMM 70 /* Communication error on send */ -#define EPROTO 71 /* Protocol error */ -#define EMULTIHOP 72 /* Multihop attempted */ -#define EDOTDOT 73 /* RFS specific error */ -#define EBADMSG 74 /* Not a data message */ -#define EOVERFLOW 75 /* Value too large for defined data type */ -#define ENOTUNIQ 76 /* Name not unique on network */ -#define EBADFD 77 /* File descriptor in bad state */ -#define EREMCHG 78 /* Remote address changed */ -#define ELIBACC 79 /* Can not access a needed shared library */ -#define ELIBBAD 80 /* Accessing a corrupted shared library */ -#define ELIBSCN 81 /* .lib section in a.out corrupted */ -#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ -#define ELIBEXEC 83 /* Cannot exec a shared library directly */ -#define EILSEQ 84 /* Illegal byte sequence */ -#define ERESTART 85 /* Interrupted system call should be restarted */ -#define ESTRPIPE 86 /* Streams pipe error */ -#define EUSERS 87 /* Too many users */ -#define ENOTSOCK 88 /* Socket operation on non-socket */ -#define EDESTADDRREQ 89 /* Destination address required */ -#define EMSGSIZE 90 /* Message too long */ -#define EPROTOTYPE 91 /* Protocol wrong type for socket */ -#define ENOPROTOOPT 92 /* Protocol not available */ -#define EPROTONOSUPPORT 93 /* Protocol not supported */ -#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ -#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define EPFNOSUPPORT 96 /* Protocol family not supported */ -#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ -#define EADDRINUSE 98 /* Address already in use */ -#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ -#define ENETDOWN 100 /* Network is down */ -#define ENETUNREACH 101 /* Network is unreachable */ -#define ENETRESET 102 /* Network dropped connection because of reset */ -#define ECONNABORTED 103 /* Software caused connection abort */ -#define ECONNRESET 104 /* Connection reset by peer */ -#define ENOBUFS 105 /* No buffer space available */ -#define EISCONN 106 /* Transport endpoint is already connected */ -#define ENOTCONN 107 /* Transport endpoint is not connected */ -#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ -#define ETOOMANYREFS 109 /* Too many references: cannot splice */ -#define ETIMEDOUT 110 /* Connection timed out */ -#define ECONNREFUSED 111 /* Connection refused */ -#define EHOSTDOWN 112 /* Host is down */ -#define EHOSTUNREACH 113 /* No route to host */ -#define EALREADY 114 /* Operation already in progress */ -#define EINPROGRESS 115 /* Operation now in progress */ -#define ESTALE 116 /* Stale NFS file handle */ -#define EUCLEAN 117 /* Structure needs cleaning */ -#define ENOTNAM 118 /* Not a XENIX named type file */ -#define ENAVAIL 119 /* No XENIX semaphores available */ -#define EISNAM 120 /* Is a named type file */ -#define EREMOTEIO 121 /* Remote I/O error */ -#define EDQUOT 122 /* Quota exceeded */ - -#define ENOMEDIUM 123 /* No medium found */ -#define EMEDIUMTYPE 124 /* Wrong medium type */ - -#define ENSROK 0 -#define ENSRNODATA 160 -#define ENSRFORMERR 161 -#define ENSRSERVFAIL 162 -#define ENSRNOTFOUND 163 -#define ENSRNOTIMP 164 -#define ENSRREFUSED 165 -#define ENSRBADQUERY 166 -#define ENSRBADNAME 167 -#define ENSRBADFAMILY 168 -#define ENSRBADRESP 169 -#define ENSRCONNREFUSED 170 -#define ENSRTIMEOUT 171 -#define ENSROF 172 -#define ENSRFILE 173 -#define ENSRNOMEM 174 -#define ENSRDESTRUCTION 175 -#define ENSRQUERYDOMAINTOOLONG 176 -#define ENSRCNAMELOOP 177 -#define OPTION_DEG 200 - -#endif - -static inline void -sbr_set_errno (int err) -{ - errno = err; -} - -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif - -#endif diff --git a/stacks/lwip_stack/src/sbr/sbr_index_ring.c b/stacks/lwip_stack/src/sbr/sbr_index_ring.c deleted file mode 100644 index 0daa465..0000000 --- a/stacks/lwip_stack/src/sbr/sbr_index_ring.c +++ /dev/null @@ -1,212 +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 <string.h> -#include "sbr_index_ring.h" -#include "nstack_securec.h" -#include "common_mem_common.h" -#include "common_func.h" - -/***************************************************************************** -* Prototype : sbr_init_index_ring -* Description : init index ring -* Input : sbr_index_ring* ring -* u32 num -* Output : None -* Return Value : static inline void -* Calls : -* Called By : -* -*****************************************************************************/ -static inline void -sbr_init_index_ring (sbr_index_ring * ring, u32 num) -{ - u32 loop; - - ring->head = 0; - ring->tail = 0; - ring->num = num; - ring->mask = num - 1; - - for (loop = 0; loop < num; loop++) - { - ring->nodes[loop].ver = (loop - num); - ring->nodes[loop].val = 0; - } -} - -/***************************************************************************** -* Prototype : sbr_create_index_ring -* Description : create index ring -* Input : u32 num -* Output : None -* Return Value : sbr_index_ring* -* Calls : -* Called By : -* -*****************************************************************************/ -sbr_index_ring * -sbr_create_index_ring (u32 num) -{ - num = common_mem_align32pow2 (num + 1); - sbr_index_ring *ring = - (sbr_index_ring *) malloc (sizeof (sbr_index_ring) + - num * sizeof (sbr_index_node)); - if (!ring) - { - return NULL; - } - - sbr_init_index_ring (ring, num); - return ring; -} - -/***************************************************************************** -* Prototype : sbr_index_ring_enqueue -* Description : enqueue data,val != 0 -* Input : sbr_index_ring* ring -* i32 val -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -sbr_index_ring_enqueue (sbr_index_ring * ring, i32 val) -{ - if (0 == val) - { - return -1; - } - - sbr_index_node expect_node; - sbr_index_node cur_node; - u32 tmp_head; - u32 tmp_tail; - u32 cur_head = ring->head; - u32 mask = ring->mask; - u32 size = ring->num; - - do - { - tmp_tail = ring->tail; - if (tmp_tail + size - cur_head == 0) - { - if (ring->nodes[tmp_tail & mask].val == 0) - { - (void) __sync_bool_compare_and_swap (&ring->tail, tmp_tail, - tmp_tail + 1); - } - else - { - return 0; - } - } - - expect_node.ver = cur_head - size; - expect_node.val = 0; - - cur_node.ver = cur_head; - cur_node.val = val; - - if ((ring->nodes[cur_head & mask].ver == expect_node.ver) - && __sync_bool_compare_and_swap (&ring->nodes[cur_head & mask].data, - expect_node.data, cur_node.data)) - { - tmp_head = ring->head; - if ((tmp_head - cur_head > 0x80000000) && (0 == (cur_head & 0x11))) - { - (void) __sync_bool_compare_and_swap (&ring->head, tmp_head, - cur_head); - } - - break; - } - - tmp_head = ring->head; - cur_head = cur_head - tmp_head < mask - 1 ? cur_head + 1 : tmp_head; - } - while (1); - - return 1; -} - -/***************************************************************************** -* Prototype : sbr_index_ring_dequeue -* Description : dequeue -* Input : sbr_index_ring* ring -* i32* val -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -sbr_index_ring_dequeue (sbr_index_ring * ring, i32 * val) -{ - u32 cur_tail; - u32 tmp_tail; - u32 tmp_head; - u32 mask = ring->mask; - sbr_index_node null_node; - sbr_index_node expect_node; - - cur_tail = ring->tail; - do - { - tmp_head = ring->head; - if (cur_tail == tmp_head) - { - if (0 != (ring->nodes[tmp_head & mask].val)) - { - (void) __sync_bool_compare_and_swap (&ring->head, tmp_head, - tmp_head + 1); - } - else - { - return 0; - } - } - - null_node.ver = cur_tail; - null_node.val = 0; - expect_node = ring->nodes[cur_tail & mask]; - - if ((null_node.ver == expect_node.ver) && (expect_node.val) - && __sync_bool_compare_and_swap (&ring->nodes[cur_tail & mask].data, - expect_node.data, null_node.data)) - - { - *val = expect_node.val; - tmp_tail = ring->tail; - if ((tmp_tail - cur_tail > 0x80000000) && (0 == (cur_tail & 0x11))) - { - (void) __sync_bool_compare_and_swap (&ring->tail, tmp_tail, - cur_tail); - } - - break; - } - - tmp_tail = ring->tail; - cur_tail = cur_tail - tmp_tail < mask - 1 ? cur_tail + 1 : tmp_tail; - } - while (1); - - return 1; -} diff --git a/stacks/lwip_stack/src/sbr/sbr_index_ring.h b/stacks/lwip_stack/src/sbr/sbr_index_ring.h deleted file mode 100644 index 86e8345..0000000 --- a/stacks/lwip_stack/src/sbr/sbr_index_ring.h +++ /dev/null @@ -1,61 +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. -*/ - -#ifndef _SBR_INDEX_RING_H_ -#define _SBR_INDEX_RING_H_ - -#include "types.h" - -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -typedef struct -{ - union - { - struct - { - volatile u32 ver; - volatile u32 val; - }; - u64 data; - }; -} sbr_index_node; - -typedef struct -{ - volatile u32 head; - i8 cache_space[124]; - volatile u32 tail; - u32 num; - u32 mask; - sbr_index_node nodes[0]; -} sbr_index_ring; - -sbr_index_ring *sbr_create_index_ring (u32 num); -int sbr_index_ring_enqueue (sbr_index_ring * ring, i32 val); -int sbr_index_ring_dequeue (sbr_index_ring * ring, i32 * val); - -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif - -#endif diff --git a/stacks/lwip_stack/src/sbr/sbr_protocol_api.h b/stacks/lwip_stack/src/sbr/sbr_protocol_api.h deleted file mode 100644 index 95ca565..0000000 --- a/stacks/lwip_stack/src/sbr/sbr_protocol_api.h +++ /dev/null @@ -1,103 +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. -*/ - -#ifndef SBR_PROTOCOL_API_H -#define SBR_PROTOCOL_API_H -#include <sys/uio.h> -#include <sys/epoll.h> -#include <netinet/in.h> -#include "sbr_err.h" -#include "nsfw_msg_api.h" -#include "nsfw_mt_config.h" - -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -#ifndef SBR_MAX_INTEGER -#define SBR_MAX_INTEGER 0x7FFFFFFF -#endif - -#ifndef socklen_t -#define socklen_t u32 -#endif - -#define SBR_MAX_FD_NUM MAX_SOCKET_NUM - -typedef struct sbr_socket_s sbr_socket_t; -typedef struct -{ - int (*socket) (sbr_socket_t *, int, int, int); - int (*bind) (sbr_socket_t *, const struct sockaddr *, socklen_t); - int (*listen) (sbr_socket_t *, int); - int (*accept) (sbr_socket_t *, sbr_socket_t *, struct sockaddr *, - socklen_t *); - int (*accept4) (sbr_socket_t *, sbr_socket_t *, struct sockaddr *, - socklen_t *, int); - int (*connect) (sbr_socket_t *, const struct sockaddr *, socklen_t); - int (*shutdown) (sbr_socket_t *, int); - int (*getsockname) (sbr_socket_t *, struct sockaddr *, socklen_t *); - int (*getpeername) (sbr_socket_t *, struct sockaddr *, socklen_t *); - int (*getsockopt) (sbr_socket_t *, int, int, void *, socklen_t *); - int (*setsockopt) (sbr_socket_t *, int, int, const void *, socklen_t); - int (*recvfrom) (sbr_socket_t *, void *, size_t, int, struct sockaddr *, - socklen_t *); - int (*readv) (sbr_socket_t *, const struct iovec *, int); - int (*recvmsg) (sbr_socket_t *, struct msghdr *, int); - int (*send) (sbr_socket_t *, const void *, size_t, int); - int (*sendto) (sbr_socket_t *, const void *, size_t, int, - const struct sockaddr *, socklen_t); - int (*sendmsg) (sbr_socket_t *, const struct msghdr *, int); - int (*writev) (sbr_socket_t *, const struct iovec *, int); - int (*fcntl) (sbr_socket_t *, int, long); - int (*ioctl) (sbr_socket_t *, unsigned long, void *); - int (*close) (sbr_socket_t *); - int (*peak) (sbr_socket_t *); - void (*lock_common) (sbr_socket_t *); - void (*unlock_common) (sbr_socket_t *); - void (*fork_parent) (sbr_socket_t *, pid_t); - void (*fork_child) (sbr_socket_t *, pid_t, pid_t); - unsigned int (*ep_ctl) (sbr_socket_t *, int triggle_ops, - struct epoll_event * event, void *pdata); - unsigned int (*ep_getevt) (sbr_socket_t *, unsigned int events); - void (*set_app_info) (sbr_socket_t *, void *appinfo); - void (*set_close_stat) (sbr_socket_t *, int flag); -} sbr_fdopt; - -struct sbr_socket_s -{ - int fd; - sbr_fdopt *fdopt; - void *stack_obj; - void *sk_obj; -}; - -int sbr_init_protocol (); -int sbr_fork_protocol (); -sbr_fdopt *sbr_get_fdopt (int domain, int type, int protocol); -void sbr_app_touch_in (void); /*app send its version info to nStackMain */ -int lwip_try_select (int fdsize, fd_set * fdread, fd_set * fdwrite, - fd_set * fderr, struct timeval *timeout); - -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif - -#endif diff --git a/stacks/lwip_stack/src/sbr/sbr_res_mgr.c b/stacks/lwip_stack/src/sbr/sbr_res_mgr.c deleted file mode 100644 index f40f101..0000000 --- a/stacks/lwip_stack/src/sbr/sbr_res_mgr.c +++ /dev/null @@ -1,88 +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 "nstack_securec.h" -#include "sbr_res_mgr.h" - -sbr_res_group g_res_group = { }; - -/***************************************************************************** -* Prototype : sbr_init_sk -* Description : init sock pool -* Input : None -* Output : None -* Return Value : static int -* Calls : -* Called By : -* -*****************************************************************************/ -NSTACK_STATIC int -sbr_init_sk () -{ - sbr_index_ring *ring = sbr_create_index_ring (SBR_MAX_FD_NUM - 1); - - if (!ring) - { - NSSBR_LOGERR ("init ring failed"); - return -1; - } - - int i; - /*the queue can't accept value=0, so i begin with 1 */ - for (i = 1; i <= SBR_MAX_FD_NUM; ++i) - { - g_res_group.sk[i].fd = i; - if (sbr_index_ring_enqueue (ring, i) != 1) - { - NSSBR_LOGERR ("sbr_index_ring_enqueue failed, this can not happen"); - free (ring); - return -1; - } - } - - g_res_group.sk_ring = ring; - return 0; -} - -/***************************************************************************** -* Prototype : sbr_init_res -* Description : init sbr res -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -sbr_init_res () -{ - if (sbr_init_sk () != 0) - { - return -1; - } - - NSSBR_LOGDBG ("init socket ok"); - - if (sbr_init_protocol () != 0) - { - return -1; - } - - NSSBR_LOGDBG ("init protocol ok"); - - return 0; -} diff --git a/stacks/lwip_stack/src/sbr/sbr_res_mgr.h b/stacks/lwip_stack/src/sbr/sbr_res_mgr.h deleted file mode 100644 index e731314..0000000 --- a/stacks/lwip_stack/src/sbr/sbr_res_mgr.h +++ /dev/null @@ -1,159 +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. -*/ - -#ifndef SBR_RES_MGR_H -#define SBR_RES_MGR_H -#include "sbr_protocol_api.h" -#include "sbr_index_ring.h" - -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -typedef struct -{ - sbr_index_ring *sk_ring; - sbr_socket_t sk[SBR_MAX_FD_NUM + 1]; /* unuse index 0 */ -} sbr_res_group; - -extern sbr_res_group g_res_group; - -/***************************************************************************** -* Prototype : sbr_malloc_sk -* Description : malloc sock -* Input : None -* Output : None -* Return Value : static inline sbr_socket_t * -* Calls : -* Called By : -* -*****************************************************************************/ -static inline sbr_socket_t * -sbr_malloc_sk () -{ - int fd; - - if (sbr_index_ring_dequeue (g_res_group.sk_ring, &fd) != 1) - { - NSSBR_LOGERR ("malloc sk failed]"); - sbr_set_errno (EMFILE); - return NULL; - } - - NSSBR_LOGDBG ("malloc sk ok]fd=%d", fd); - return &g_res_group.sk[fd]; -} - -/***************************************************************************** -* Prototype : sbr_free_sk -* Description : free sock -* Input : sbr_socket_t * sk -* Output : None -* Return Value : static inline void -* Calls : -* Called By : -* -*****************************************************************************/ -static inline void -sbr_free_sk (sbr_socket_t * sk) -{ - sk->fdopt = NULL; - sk->sk_obj = NULL; - sk->stack_obj = NULL; - - if (sbr_index_ring_enqueue (g_res_group.sk_ring, sk->fd) != 1) - { - NSSBR_LOGERR ("sbr_index_ring_enqueue failed, this can not happen"); - } - - NSSBR_LOGDBG ("free sk ok]fd=%d", sk->fd); -} - -/***************************************************************************** -* Prototype : sbr_lookup_sk -* Description : lookup socket -* Input : int fd -* Output : None -* Return Value : static inline sbr_socket_t * -* Calls : -* Called By : -* -*****************************************************************************/ -static inline sbr_socket_t * -sbr_lookup_sk (int fd) -{ - if ((fd < 1) || (fd > SBR_MAX_FD_NUM)) - { - NSSBR_LOGERR ("fd is not ok]fd=%d", fd); - sbr_set_errno (EBADF); - return NULL; - } - - sbr_socket_t *sk = &g_res_group.sk[fd]; - if (!sk->sk_obj || !sk->stack_obj) - { - NSSBR_LOGERR - ("data in sk is error, this can not happen]fd=%d,sk_obj=%p,stack_obj=%p", - fd, sk->sk_obj, sk->stack_obj); - sbr_set_errno (EBADF); - return NULL; - } - - return sk; -} - -/***************************************************************************** -* Prototype : sbr_free_sk -* Description : free sock -* Input : sbr_socket_t * sk -* Output : None -* Return Value : static inline void -* Calls : -* Called By : -* -*****************************************************************************/ -static inline void -sbr_free_fd (int fd) -{ - if ((fd < 1) || (fd > SBR_MAX_FD_NUM)) - { - NSSBR_LOGERR ("fd is not ok]fd=%d", fd); - sbr_set_errno (EBADF); - return; - } - - sbr_socket_t *sk = &g_res_group.sk[fd]; - if (!sk->fdopt && !sk->sk_obj && !sk->stack_obj) - { - NSSBR_LOGERR - ("can't free empty fd] fd=%d, fdopt=%p, sk_obj=%p, stack_obj=%p", fd, - sk->fdopt, sk->sk_obj, sk->stack_obj); - return; - } - sbr_free_sk (sk); -} - -int sbr_init_res (); - -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif - -#endif diff --git a/stacks/lwip_stack/src/sbr/sbr_socket.c b/stacks/lwip_stack/src/sbr/sbr_socket.c deleted file mode 100644 index 69481b5..0000000 --- a/stacks/lwip_stack/src/sbr/sbr_socket.c +++ /dev/null @@ -1,1274 +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 <dlfcn.h> -#include "sbr_protocol_api.h" -#include "sbr_res_mgr.h" -#include "nstack_log.h" -#include "nstack_dmm_api.h" - -#define SBR_INTERCEPT(ret, name, args) ret sbr_ ## name args -#define CALL_SBR_INTERCEPT(name, args) sbr_ ## name args -#define GET_SBR_INTERCEPT(name) sbr_ ## name - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : create socket -* Input : int -* socket -* (int domain -* int type -* int protocol) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, socket, (int domain, int type, int protocol)) -{ - NSSBR_LOGDBG ("socket]domain=%d,type=%d,protocol=%d", domain, type, - protocol); - sbr_fdopt *fdopt = sbr_get_fdopt (domain, type, protocol); - - if (!fdopt) - { - return -1; - } - - sbr_socket_t *sk = sbr_malloc_sk (); - - if (!sk) - { - return -1; - } - - sk->fdopt = fdopt; - - int ret = sk->fdopt->socket (sk, domain, type, protocol); - - if (ret != 0) - { - sbr_free_sk (sk); - return ret; - } - - return sk->fd; -} - -/***************************************************************************** -* Prototype : sbr_check_addr -* Description : check addr -* Input : int s -* struct sockaddr * addr -* socklen_t * addrlen -* Output : None -* Return Value : static inline int -* Calls : -* Called By : -* -*****************************************************************************/ -static inline int -sbr_check_addr (int s, struct sockaddr *addr, socklen_t * addrlen) -{ - if (addr) - { - if (!addrlen) - { - NSSBR_LOGERR ("addrlen is null]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - if (0 > (int) (*addrlen)) - { - NSSBR_LOGERR ("addrlen is negative]fd=%d,addrlen=%d", s, *addrlen); - sbr_set_errno (EINVAL); - return -1; - } - } - - return 0; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : accept4 -* Input : int -* accept4 -* (int s -* struct sockaddr * addr -* socklen_t * addrlen -* int flags) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, accept4, - (int s, struct sockaddr * addr, socklen_t * addrlen, - int flags)) -{ - NSSBR_LOGDBG ("accept4]fd=%d,addr=%p,addrlen=%p,flags=%d", s, addr, addrlen, - flags); - int ret = sbr_check_addr (s, addr, addrlen); - - if (ret != 0) - { - return ret; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sbr_socket_t *new_sk = sbr_malloc_sk (); - if (!new_sk) - { - return -1; - } - - new_sk->fdopt = sk->fdopt; - - ret = sk->fdopt->accept4 (sk, new_sk, addr, addrlen, flags); - if (-1 == ret) - { - sbr_free_sk (new_sk); - } - - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : accept -* Input : int -* accept -* (int s -* struct sockaddr * addr -* socklen_t * addrlen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, accept, - (int s, struct sockaddr * addr, socklen_t * addrlen)) -{ - NSSBR_LOGDBG ("accept]fd=%d,addr=%p,addrlen=%p", s, addr, addrlen); - int ret = sbr_check_addr (s, addr, addrlen); - - if (ret != 0) - { - return ret; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sbr_socket_t *new_sk = sbr_malloc_sk (); - if (!new_sk) - { - return -1; - } - - new_sk->fdopt = sk->fdopt; - - ret = sk->fdopt->accept (sk, new_sk, addr, addrlen); - if (-1 == ret) - { - sbr_free_sk (new_sk); - } - - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : bind -* Input : int -* bind -* (int s -* const struct sockaddr * name -* socklen_t namelen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, bind, - (int s, const struct sockaddr * name, socklen_t namelen)) -{ - NSSBR_LOGDBG ("bind]fd=%d,name=%p,namelen=%d", s, name, namelen); - if (!name) - { - NSSBR_LOGERR ("name is not ok]fd=%d,name=%p", s, name); - sbr_set_errno (EFAULT); - return -1; - } - - if ((name->sa_family) != AF_INET) - { - NSSBR_LOGERR ("domain is not AF_INET]fd=%d,name->sa_family=%u", s, - name->sa_family); - sbr_set_errno (EAFNOSUPPORT); - return -1; - } - - if (namelen != sizeof (struct sockaddr_in)) - { - NSSBR_LOGERR ("namelen is invalid]fd=%d,namelen=%d", s, namelen); - sbr_set_errno (EINVAL); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->bind (sk, name, namelen); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : listen -* Input : int -* listen -* (int s -* int backlog) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, listen, (int s, int backlog)) -{ - NSSBR_LOGDBG ("listen]fd=%d,backlog=%d", s, backlog); - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - /* limit the "backlog" parameter to fit in an u8_t */ - if (backlog < 0) - { - backlog = 0; - } - - if (backlog > 0xff) - { - backlog = 0xff; - } - - return sk->fdopt->listen (sk, backlog); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : connect -* Input : int -* connect -* (int s -* const struct sockaddr * name -* socklen_t namelen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, connect, - (int s, const struct sockaddr * name, socklen_t namelen)) -{ - NSSBR_LOGDBG ("connect]fd=%d,name=%p,namelen=%d", s, name, namelen); - if (!name) - { - NSSBR_LOGERR ("name is null]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - if (! - (namelen == sizeof (struct sockaddr_in) - && (name->sa_family == AF_INET))) - { - NSSBR_LOGERR ("parameter invalid]fd=%d,domain=%u,namelen=%d", s, - name->sa_family, namelen); - sbr_set_errno (EINVAL); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - NSSBR_LOGERR ("get socket failed]fd=%d", s); - return -1; - } - - return sk->fdopt->connect (sk, name, namelen); -} - -/***************************************************************************** -* Prototype : sbr_check_sock_name -* Description : check name -* Input : int s -* struct sockaddr * name -* socklen_t * namelen -* Output : None -* Return Value : static inline int -* Calls : -* Called By : -* -*****************************************************************************/ -static inline int -sbr_check_sock_name (int s, struct sockaddr *name, socklen_t * namelen) -{ - if (!name || !namelen) - { - NSSBR_LOGERR ("name or namelen is null]fd=%d", s); - sbr_set_errno (EINVAL); - return -1; - } - - if (*namelen & 0x80000000) - { - NSSBR_LOGERR ("namelen is not ok]fd=%d,namelen=%d", s, *namelen); - sbr_set_errno (EINVAL); - return -1; - } - - return 0; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : getpeername -* Input : int -* getpeername -* (int s -* struct sockaddr * name -* socklen_t * namelen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, getpeername, - (int s, struct sockaddr * name, socklen_t * namelen)) -{ - NSSBR_LOGDBG ("getpeername]fd=%d", s); - int ret = sbr_check_sock_name (s, name, namelen); - - if (ret != 0) - { - return ret; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sk->fdopt->lock_common (sk); - ret = sk->fdopt->getpeername (sk, name, namelen); - sk->fdopt->unlock_common (sk); - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : getsockname -* Input : int -* getsockname -* (int s -* struct sockaddr * name -* socklen_t * namelen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, getsockname, - (int s, struct sockaddr * name, socklen_t * namelen)) -{ - NSSBR_LOGDBG ("getsockname]fd=%d", s); - int ret = sbr_check_sock_name (s, name, namelen); - - if (ret != 0) - { - return ret; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sk->fdopt->lock_common (sk); - ret = sk->fdopt->getsockname (sk, name, namelen); - sk->fdopt->unlock_common (sk); - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : setsockopt -* Input : int -* setsockopt -* (int s -* int level -* int optname -* const void * optval -* socklen_t optlen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, setsockopt, - (int s, int level, int optname, const void *optval, - socklen_t optlen)) -{ - NSSBR_LOGDBG ("setsockopt]fd=%d,level=%d,optname=%d,optval=%p,optlen=%d", s, - level, optname, optval, optlen); - if (!optval) - { - NSSBR_LOGERR ("optval is null]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sk->fdopt->lock_common (sk); - int ret = sk->fdopt->setsockopt (sk, level, optname, optval, optlen); - sk->fdopt->unlock_common (sk); - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : getsockopt -* Input : int -* getsockopt -* (int s -* int level -* int optname -* void * optval -* socklen_t * optlen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, getsockopt, - (int s, int level, int optname, void *optval, - socklen_t * optlen)) -{ - NSSBR_LOGDBG ("getsockopt]fd=%d,level=%d,optname=%d,optval=%p,optlen=%p", s, - level, optname, optval, optlen); - if (!optval || !optlen) - { - NSSBR_LOGERR ("optval or optlen is NULL]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sk->fdopt->lock_common (sk); - int ret = sk->fdopt->getsockopt (sk, level, optname, optval, optlen); - sk->fdopt->unlock_common (sk); - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : ioctl -* Input : int -* ioctl -* (int s -* unsigned long cmd -* ...) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, ioctl, (int s, unsigned long cmd, ...)) -{ - NSSBR_LOGDBG ("ioctl]fd=%d,cmd=%lu", s, cmd); - va_list va; - va_start (va, cmd); - void *arg = va_arg (va, void *); - va_end (va); - - if (!arg) - { - NSSBR_LOGERR ("parameter is not ok]fd=%d", s); - sbr_set_errno (EINVAL); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sk->fdopt->lock_common (sk); - int ret = sk->fdopt->ioctl (sk, cmd, arg); - sk->fdopt->unlock_common (sk); - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : fcntl -* Input : int -* fcntl -* (int s -* int cmd -* ...) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, fcntl, (int s, int cmd, ...)) -{ - NSSBR_LOGDBG ("fcntl]fd=%d,cmd=%d", s, cmd); - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - va_list va; - va_start (va, cmd); - long arg = va_arg (va, long); - va_end (va); - - sk->fdopt->lock_common (sk); - int ret = sk->fdopt->fcntl (sk, cmd, arg); - sk->fdopt->unlock_common (sk); - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : recvfrom -* Input : int -* recvfrom -* (int s -* void * mem -* size_t len -* int flags -* struct sockaddr * from -* socklen_t * fromlen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, recvfrom, - (int s, void *mem, size_t len, int flags, - struct sockaddr * from, socklen_t * fromlen)) -{ - NSSBR_LOGDBG ("recvfrom]fd=%d,mem=%p,len=%d,flags=%d,from=%p,fromlen=%p", s, - mem, len, flags, from, fromlen); - - if (0 == len) - { - NSSBR_LOGDBG ("len is zero]fd=%d,len=%u", s, (u32) len); - return 0; //return directly, don't change the last errno. - } - - if (!mem) - { - NSSBR_LOGERR ("mem is NULL]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - if (fromlen && (*((int *) fromlen) < 0)) - { - NSSBR_LOGERR ("fromlen is not ok]fd=%d,fromlen=%d", s, *fromlen); - sbr_set_errno (EINVAL); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->recvfrom (sk, mem, len, flags, from, fromlen); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : read -* Input : int -* read -* (int s -* void * mem -* size_t len) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, read, (int s, void *mem, size_t len)) -{ - NSSBR_LOGDBG ("read]fd=%d,mem=%p,len=%d", s, mem, len); - return CALL_SBR_INTERCEPT (recvfrom, (s, mem, len, 0, NULL, NULL)); -} - -/***************************************************************************** -* Prototype : sbr_check_iov -* Description : check iov -* Input : int s -* const struct iovec * iov -* int iovcnt -* Output : None -* Return Value : static inline int -* Calls : -* Called By : -* -*****************************************************************************/ -static inline int -sbr_check_iov (int s, const struct iovec *iov, int iovcnt) -{ - if ((!iov) || (iovcnt <= 0)) - { - NSSBR_LOGERR ("iov is NULL or iovcn <=0]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - int i; - for (i = 0; i < iovcnt; ++i) - { - if (!iov[i].iov_base && (iov[i].iov_len != 0)) - { - NSSBR_LOGERR ("iov is not ok]fd=%d,iov_base=%p,iov_len=%d", s, - iov[i].iov_base, iov[i].iov_len); - sbr_set_errno (EFAULT); - return -1; - } - } - - return 0; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : readv -* Input : int -* readv -* (int s -* const struct iovec * iov -* int iovcnt) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, readv, (int s, const struct iovec * iov, int iovcnt)) -{ - NSSBR_LOGDBG ("readv]fd=%d,iov=%p,iovcnt=%d", s, iov, iovcnt); - - if (sbr_check_iov (s, iov, iovcnt) != 0) - { - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->readv (sk, iov, iovcnt); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : recv -* Input : int -* recv -* (int s -* void * mem -* size_t len -* int flags) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, recv, (int s, void *mem, size_t len, int flags)) -{ - NSSBR_LOGDBG ("recv]fd=%d,mem=%p,len=%d,flags=%d", s, mem, len, flags); - return CALL_SBR_INTERCEPT (recvfrom, (s, mem, len, flags, NULL, NULL)); -} - -/***************************************************************************** -* Prototype : sbr_check_msg -* Description : check msg -* Input : int s -* const struct msghdr * msg -* Output : None -* Return Value : static inline int -* Calls : -* Called By : -* -*****************************************************************************/ -static inline int -sbr_check_msg (int s, const struct msghdr *msg) -{ - if (!msg) - { - NSSBR_LOGERR ("msg is NULL]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - if (msg->msg_name && ((int) msg->msg_namelen < 0)) - { - NSSBR_LOGERR ("msg_namelen is not ok]fd=%d,msg_namelen=%d", s, - msg->msg_namelen); - sbr_set_errno (EINVAL); - return -1; - } - - return sbr_check_iov (s, msg->msg_iov, msg->msg_iovlen); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : recvmsg -* Input : int -* recvmsg -* (int s -* struct msghdr * msg -* int flags) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, recvmsg, (int s, struct msghdr * msg, int flags)) -{ - NSSBR_LOGDBG ("recvmsg]fd=%d,msg=%p,flags=%d", s, msg, flags); - - if (sbr_check_msg (s, msg) != 0) - { - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->recvmsg (sk, msg, flags); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : send -* Input : int -* send -* (int s -* const void * data -* size_t size -* int flags) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, send, (int s, const void *data, size_t size, int flags)) -{ - NSSBR_LOGDBG ("send]fd=%d,data=%p,size=%zu,flags=%d", s, data, size, flags); - if (!data) - { - NSSBR_LOGERR ("data is NULL]fd=%d", s); - sbr_set_errno (EFAULT); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->send (sk, data, size, flags); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : sendmsg -* Input : int -* sendmsg -* (int s -* const struct msghdr * msg -* int flags) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, sendmsg, (int s, const struct msghdr * msg, int flags)) -{ - NSSBR_LOGDBG ("sendmsg]fd=%d,msg=%p,flags=%d", s, msg, flags); - - if (sbr_check_msg (s, msg) != 0) - { - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->sendmsg (sk, msg, flags); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : sendto -* Input : int -* sendto -* (int s -* const void * data -* size_t size -* int flags -* const struct sockaddr * to -* socklen_t tolen) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, sendto, - (int s, const void *data, size_t size, int flags, - const struct sockaddr * to, socklen_t tolen)) -{ - NSSBR_LOGDBG ("sendto]fd=%d,data=%p,size=%zu,flags=%d,to=%p,tolen=%d", s, - data, size, flags, to, tolen); - if ((data == NULL) || (flags < 0)) - { - NSSBR_LOGERR ("parameter is not ok]fd=%d,data=%p,size=%zu,flags=%d", s, - data, size, flags); - sbr_set_errno (EINVAL); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->sendto (sk, data, size, flags, to, tolen); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : write -* Input : int -* write -* (int s -* const void * data -* size_t size) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, write, (int s, const void *data, size_t size)) -{ - NSSBR_LOGDBG ("write]fd=%d,data=%p,size=%zu", s, data, size); - return CALL_SBR_INTERCEPT (send, (s, data, size, 0)); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : writev -* Input : int -* writev -* (int s -* const struct iovec * iov -* int iovcnt) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, writev, (int s, const struct iovec * iov, int iovcnt)) -{ - NSSBR_LOGDBG ("writev]fd=%d,iov=%p,iovcnt=%d", s, iov, iovcnt); - - if (sbr_check_iov (s, iov, iovcnt) != 0) - { - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->writev (sk, iov, iovcnt); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : shutdown -* Input : int -* shutdown -* (int s -* int how) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, shutdown, (int s, int how)) -{ - NSSBR_LOGDBG ("shutdown]fd=%d,how=%d", s, how); - if ((how != SHUT_RD) && (how != SHUT_WR) && (how != SHUT_RDWR)) - { - sbr_set_errno (EINVAL); - return -1; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - sk->fdopt->lock_common (sk); - int ret = sk->fdopt->shutdown (sk, how); - sk->fdopt->unlock_common (sk); - return ret; -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : close -* Input : int -* close -* (int s) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (int, close, (int s)) -{ - NSSBR_LOGDBG ("close]fd=%d", s); - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - int ret = sk->fdopt->close (sk); - sbr_free_sk (sk); - return ret; -} - -SBR_INTERCEPT (int, select, - (int nfds, fd_set * readfd, fd_set * writefd, - fd_set * exceptfd, struct timeval * timeout)) -{ - return lwip_try_select (nfds, readfd, writefd, exceptfd, timeout); -} - -SBR_INTERCEPT (unsigned int, ep_getevt, - (int epfd, int profd, unsigned int events)) -{ - NSSBR_LOGDBG ("epfd= %d, proFD=%d,epi=0x%x", epfd, profd, events); - sbr_socket_t *sk = sbr_lookup_sk (profd); - - if (!sk) - { - return -1; - } - - return sk->fdopt->ep_getevt (sk, events); -} - -SBR_INTERCEPT (unsigned int, ep_ctl, - (int epfd, int profd, int triggle_ops, - struct epoll_event * event, void *pdata)) -{ - NSSBR_LOGDBG ("epfd = %d, proFD=%d,triggle_ops=%d,pdata=%p", epfd, profd, - triggle_ops, pdata); - sbr_socket_t *sk = sbr_lookup_sk (profd); - - if (!sk) - { - return -1; - } - - return sk->fdopt->ep_ctl (sk, triggle_ops, event, pdata); -} - -SBR_INTERCEPT (int, peak, (int s)) -{ - NSSBR_LOGDBG ("]fd=%d", s); - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return -1; - } - - return sk->fdopt->peak (sk); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : set_app_info -* Input : int -* set_app_info -* (int s -* void* app_info) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (void, set_app_info, (int s, void *app_info)) -{ - NSSBR_LOGDBG ("set_app_info]fd=%d", s); - - if (!app_info) - { - NSSBR_LOGERR ("invalid param, app_info is NULL]"); - return; - } - - sbr_socket_t *sk = sbr_lookup_sk (s); - if (!sk) - { - return; - } - - sk->fdopt->set_app_info (sk, app_info); -} - -/* app send its version info to nStackMain */ -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : sbr_app_touch -* Input : int -* sbr_app_touch -* () -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (void, app_touch, (void)) -{ - NSSBR_LOGDBG ("sbr_app_touch() is called]"); - - sbr_app_touch_in (); -} - -/***************************************************************************** -* Prototype : SBR_INTERCEPT -* Description : set_close_status -* Input : void -* set_close_stat -* (int s -* int flag) -* Output : None -* Return Value : -* Calls : -* Called By : -* -*****************************************************************************/ -SBR_INTERCEPT (void, set_close_stat, (int s, int flag)) -{ - NSSBR_LOGDBG ("]fd=%d", s); - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return; - } - if (sk->fdopt->set_close_stat) - { - sk->fdopt->set_close_stat (sk, flag); - } - -} - -SBR_INTERCEPT (int, fd_alloc, ()) -{ - return sbr_socket (AF_INET, SOCK_STREAM, 0); -} - -SBR_INTERCEPT (int, fork_init_child, (pid_t p, pid_t c)) -{ - NSSBR_LOGDBG ("fork_init_child() is called]"); - return sbr_fork_protocol (); -} - -SBR_INTERCEPT (void, fork_parent_fd, (int s, pid_t p)) -{ - NSSBR_LOGDBG ("fork_parent_fd() is called]"); - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return; - } - - sk->fdopt->fork_parent (sk, p); -} - -SBR_INTERCEPT (void, fork_child_fd, (int s, pid_t p, pid_t c)) -{ - NSSBR_LOGDBG ("fork_child_fd() is called]"); - sbr_socket_t *sk = sbr_lookup_sk (s); - - if (!sk) - { - return; - } - - sk->fdopt->fork_child (sk, p, c); - -} - -SBR_INTERCEPT (void, fork_free_fd, (int s, pid_t p, pid_t c)) -{ - NSSBR_LOGDBG ("fork_free_fd() is called]"); - sbr_free_fd (s); -} - -/***************************************************************************** -* Prototype : nstack_stack_register -* Description : reg api to nsocket -* Input : nstack_socket_ops* ops -* nstack_event_ops *val -* nstack_proc_ops *deal -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -lwip_stack_register (nstack_proc_cb * ops, nstack_event_cb * val) -{ - if (!ops || !val || !val->handle) - { - return -1; - } - -#undef NSTACK_MK_DECL -#define NSTACK_MK_DECL(ret, fn, args) \ - (ops->socket_ops).pf ## fn = (typeof(((nstack_socket_ops*)0)->pf ## fn))dlsym(val->handle, "sbr_" # fn); -#include "declare_syscalls.h" - - (ops->extern_ops).module_init = sbr_init_res; - (ops->extern_ops).ep_getevt = GET_SBR_INTERCEPT (ep_getevt); - (ops->extern_ops).ep_ctl = GET_SBR_INTERCEPT (ep_ctl); - (ops->extern_ops).peak = GET_SBR_INTERCEPT (peak); - (ops->extern_ops).stack_alloc_fd = GET_SBR_INTERCEPT (fd_alloc); /*alloc a fd id for epoll */ - (ops->extern_ops).fork_init_child = GET_SBR_INTERCEPT (fork_init_child); - (ops->extern_ops).fork_parent_fd = GET_SBR_INTERCEPT (fork_parent_fd); - (ops->extern_ops).fork_child_fd = GET_SBR_INTERCEPT (fork_child_fd); - (ops->extern_ops).fork_free_fd = GET_SBR_INTERCEPT (fork_free_fd); - return 0; -} |