diff options
author | Yalei Wang <william.wangyalei@huawei.com> | 2018-03-12 10:07:58 +0800 |
---|---|---|
committer | Yalei Wang <william.wangyalei@huawei.com> | 2018-03-12 10:07:58 +0800 |
commit | c398e6ec613c1f90ffe33608c511208100e7372f (patch) | |
tree | 554b2bc400e14e9ae8e838582e7433ea71eb499f /src/nSocket/nstack/nstack_socket.h | |
parent | 71a4e2f34afa8018426f0e830050e50a1de6d375 (diff) |
Add the nSocket module for dmm
Change-Id: I8b97fbe50c9c1c479072510b8d799fe711360da7
Signed-off-by: Yalei Wang <william.wangyalei@huawei.com>
Diffstat (limited to 'src/nSocket/nstack/nstack_socket.h')
-rw-r--r-- | src/nSocket/nstack/nstack_socket.h | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/src/nSocket/nstack/nstack_socket.h b/src/nSocket/nstack/nstack_socket.h new file mode 100644 index 0000000..ff05099 --- /dev/null +++ b/src/nSocket/nstack/nstack_socket.h @@ -0,0 +1,231 @@ +/* +* +* 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 __NSTACK_SOCKET_H__ +#define __NSTACK_SOCKET_H__ +#include <sys/socket.h> +#include <poll.h> +#include <sys/epoll.h> + +#undef NSTACK_MK_DECL +#define NSTACK_MK_DECL(ret, fn, args) extern ret nstack_##fn args +#include "declare_syscalls.h" + +int release_fd (int fd, nstack_fd_local_lock_info_t * local_lock); +int nstack_posix_api_init (); +int nstack_close (int fd); +int nstack_socket (int domain, int itype, int protocol); + +#define NSTACK_EPOLL_FD_CHECK_RET_UNLOCK(fdVal, fun, inf, err, local_lock, unlock) \ + if ((NULL == inf) || ((inf)->attr & NSTACK_FD_ATTR_EPOLL_SOCKET)) \ + { \ + nstack_set_errno(err); \ + NSSOC_LOGERR("nstack [%s] call, fd=0x%x is epoll fd return fail errno=%d [return]", #fun, fdVal, err); \ + unlock(fdVal, local_lock);\ + return -1;\ + } + +#define NSTACK_EPOLL_FD_CHECK_RET_UNLOCK_COMMON(fdVal, fun, inf, err, local_lock) \ + NSTACK_EPOLL_FD_CHECK_RET_UNLOCK(fdVal, fun, inf, err, local_lock, UNLOCK_COMMON) + +#define LOCK_RECV(fd, fd_inf, local_lock)\ + LOCK_BASE_WITHOUT_KERNEL(fd, fd_inf, local_lock) + +#define UNLOCK_RECV(fd, local_lock) \ + UNLOCK_BASE(fd, local_lock) + +#define NSTACK_EPOLL_FD_CHECK_RET_UNLOCK_RECV(fdVal, fun, inf, err, local_lock) \ + NSTACK_EPOLL_FD_CHECK_RET_UNLOCK(fdVal, fun, inf, err, local_lock, UNLOCK_RECV) + +#define LOCK_SEND(fd, fd_inf, local_lock) \ + INC_FD_REF(fd, fd_inf, local_lock) + +static inline void +UNLOCK_SEND (int fd, nstack_fd_local_lock_info_t * local_lock) +{ + if ((NULL != local_lock) && atomic_dec (&local_lock->fd_ref) == 0) + { + release_fd (fd, local_lock); + } +} + +#define NSTACK_EPOLL_FD_CHECK_RET_UNLOCK_SEND(fdVal, fun, inf, err, local_lock) \ + NSTACK_EPOLL_FD_CHECK_RET_UNLOCK(fdVal, fun, inf, err, local_lock, UNLOCK_SEND) + +#define LOCK_CONNECT(fd, fd_inf, local_lock) \ + LOCK_BASE(fd, fd_inf, local_lock) + +#define UNLOCK_CONNECT(fd, local_lock) \ + UNLOCK_BASE(fd, local_lock) + +#define NSTACK_EPOLL_FD_CHECK_RET_UNLOCK_CONNECT(fdVal, fun, inf, err, local_lock) \ + NSTACK_EPOLL_FD_CHECK_RET_UNLOCK(fdVal, fun, inf, err, local_lock, UNLOCK_CONNECT) + +#define LOCK_ACCEPT(fd, fd_inf, local_lock) \ + LOCK_BASE(fd, fd_inf, local_lock) + +#define UNLOCK_ACCEPT(fd, local_lock) \ + UNLOCK_BASE(fd, local_lock) + +#define NSTACK_EPOLL_FD_CHECK_RET_UNLOCK_ACCEPT(fdVal, fun, inf, err, local_lock) \ + NSTACK_EPOLL_FD_CHECK_RET_UNLOCK(fdVal, fun, inf, err, local_lock, UNLOCK_ACCEPT) + +#define LOCK_EPOLL(fd, fd_inf, local_lock) INC_FD_REF(fd, fd_inf, local_lock) + +static inline void +UNLOCK_EPOLL (int fd, nstack_fd_local_lock_info_t * local_lock) +{ + if ((NULL != local_lock) && atomic_dec (&local_lock->fd_ref) == 0) + { + release_fd (fd, local_lock); + } +} + +#define LOCK_EPOLL_CTRL(fd_val, local_lock, epoll_fd, epoll_local_lock){\ + if (local_lock)\ + {\ + atomic_inc(&local_lock->fd_ref);\ + common_mem_spinlock_lock(&local_lock->close_lock);\ + nstack_fd_Inf* fd_inf = nstack_getValidInf(fd_val);\ + if (fd_inf)\ + {\ + if (local_lock->fd_status != FD_OPEN)\ + {\ + NSSOC_LOGWAR("fd %d is not open [return]", fd_val);\ + nstack_set_errno(EBADF);\ + common_mem_spinlock_unlock(&local_lock->close_lock);\ + if(atomic_dec(&local_lock->fd_ref)==0){ \ + release_fd(fd_val, local_lock);\ + }\ + UNLOCK_EPOLL(epoll_fd, epoll_local_lock);\ + return -1;\ + }\ + }\ + }\ +} + +static inline void +UNLOCK_EPOLL_CTRL (int fd, nstack_fd_local_lock_info_t * local_lock) +{ + if (local_lock) + { + common_mem_spinlock_unlock (&local_lock->close_lock); + if (atomic_dec (&local_lock->fd_ref) == 0) + { + release_fd (fd, local_lock); + } + } +} + +#ifndef FOR_NSTACK_UT +#define INC_FD_REF(fd, fd_inf, local_lock){ \ + if (local_lock)\ + {\ + atomic_inc(&local_lock->fd_ref);\ + if (local_lock->fd_status != FD_OPEN)\ + {\ + nstack_set_errno(EBADF);\ + NSSOC_LOGERR("nstack call, fd_status=%d [return]", local_lock->fd_status); \ + if(atomic_dec(&local_lock->fd_ref) == 0){ \ + release_fd(fd, local_lock);\ + }\ + return -1;\ + }\ + } \ +} +#else +static inline int +ut_inc_fd_ref (int fd, nStack_info_t * fdInf, + nstack_fd_local_lock_info_t * local_lock) +{ + if (local_lock) + { + atomic_inc (&local_lock->fd_ref); + if (local_lock->fd_status != FD_OPEN) + { + nstack_set_errno (EBADF); + NSSOC_LOGERR ("nstack call, fd_status=%d [return]", + local_lock->fd_status); + if (atomic_dec (&local_lock->fd_ref) == 0) + { + release_fd (fd, local_lock); + } + return -1; + } + } + return 0; +} + +#define INC_FD_REF(fd, fd_inf, local_lock){\ + if(ut_inc_fd_ref(fd, fd_inf, local_lock) < 0)\ + return -1;\ +} +#endif + +#define LOCK_BASE(fd, fd_inf, local_lock){\ + INC_FD_REF(fd, fd_inf, local_lock);\ +} + +/* if is kernel fd, don't need to lock */ +#define LOCK_BASE_WITHOUT_KERNEL(fd, fd_inf, local_lock){\ + INC_FD_REF(fd, fd_inf, local_lock);\ +} + +static inline void +UNLOCK_BASE (int fd, nstack_fd_local_lock_info_t * local_lock) +{ + if ((NULL != local_lock) && (atomic_dec (&local_lock->fd_ref) == 0)) + { + release_fd (fd, local_lock); + } +} + +#define LOCK_COMMON(fd, fd_inf, local_lock) \ + LOCK_BASE(fd, fd_inf, local_lock) + +#define UNLOCK_COMMON(fd, local_lock) \ + UNLOCK_BASE(fd, local_lock) + +#define LOCK_CLOSE(local_lock){\ + if (local_lock)\ + {\ + common_mem_spinlock_lock(&local_lock->close_lock);\ + }\ +} + +static inline void +UNLOCK_CLOSE (nstack_fd_local_lock_info_t * local_lock) +{ + if (local_lock) + { + common_mem_spinlock_unlock (&local_lock->close_lock); + } +} + +#define LOCK_FOR_EP(local_lock) LOCK_CLOSE(local_lock) + +#define UNLOCK_FOR_EP(local_lock) UNLOCK_CLOSE(local_lock) + +#define NSTACK_INIT_CHECK_RET(fun) \ + if (nstack_fw_init()) { \ + NSSOC_LOGERR("nstack %s call, but initial not finished yet [return]", #fun); \ + nstack_set_errno(ENOSYS); \ + return -1; \ + } + +#define NSTACK_MODULE_ERROR_SET(Index) + +#endif /* __NSTACK_SOCKET_H__ */ |