From 85e907b495391a89096bfb7e5c9cb901d0f9f56b Mon Sep 17 00:00:00 2001 From: Lemmy Huang Date: Sat, 31 Aug 2024 11:31:13 +0800 Subject: [PATCH] cleancode: refactor rtc_api rtw_api and dummy_api Signed-off-by: Lemmy Huang --- src/lstack/api/lstack_dummy_api.c | 32 ++++-- src/lstack/api/lstack_epoll.c | 2 +- src/lstack/api/lstack_fork.c | 28 ----- src/lstack/api/lstack_rtc_api.c | 92 +++++++++++----- src/lstack/api/lstack_rtw_api.c | 104 +++++++++++------- .../api/{lstack_signal.c => lstack_unistd.c} | 31 +++++- src/lstack/api/lstack_wrap.c | 91 ++------------- src/lstack/core/lstack_init.c | 31 ++---- src/lstack/core/lstack_lwip.c | 2 +- src/lstack/core/lstack_protocol_stack.c | 2 +- src/lstack/core/lstack_stack_stat.c | 2 +- src/lstack/include/{posix => }/lstack_epoll.h | 0 src/lstack/include/lstack_rtc_api.h | 43 +------- src/lstack/include/lstack_rtw_api.h | 35 +----- .../include/{posix => }/lstack_unistd.h | 13 +-- src/lstack/include/lstack_wrap.h | 2 +- 16 files changed, 217 insertions(+), 293 deletions(-) delete mode 100644 src/lstack/api/lstack_fork.c rename src/lstack/api/{lstack_signal.c => lstack_unistd.c} (89%) rename src/lstack/include/{posix => }/lstack_epoll.h (100%) rename src/lstack/include/{posix => }/lstack_unistd.h (78%) diff --git a/src/lstack/api/lstack_dummy_api.c b/src/lstack/api/lstack_dummy_api.c index f327916..3a867b3 100644 --- a/src/lstack/api/lstack_dummy_api.c +++ b/src/lstack/api/lstack_dummy_api.c @@ -13,6 +13,10 @@ #include #include +#include +#include +#include + #define DUMMY_SLEEP_S 5 static inline ssize_t dummy_exit(void) @@ -22,34 +26,48 @@ static inline ssize_t dummy_exit(void) return -1; } -int dummy_socket(int domain, int type, int protocol) +static int dummy_socket(int domain, int type, int protocol) { sleep(DUMMY_SLEEP_S); return -1; } -ssize_t dummy_write(int s, const void *mem, size_t size) +static ssize_t dummy_write(int s, const void *mem, size_t size) { return dummy_exit(); } -ssize_t dummy_writev(int s, const struct iovec *iov, int iovcnt) +static ssize_t dummy_writev(int s, const struct iovec *iov, int iovcnt) { return dummy_exit(); } -ssize_t dummy_send(int sockfd, const void *buf, size_t len, int flags) +static ssize_t dummy_send(int sockfd, const void *buf, size_t len, int flags) { return dummy_exit(); } -ssize_t dummy_sendmsg(int s, const struct msghdr *message, int flags) +static ssize_t dummy_sendmsg(int s, const struct msghdr *message, int flags) { return dummy_exit(); } -ssize_t dummy_sendto(int sockfd, const void *buf, size_t len, int flags, - const struct sockaddr *addr, socklen_t addrlen) +static ssize_t dummy_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *addr, socklen_t addrlen) { return dummy_exit(); } + +void dummy_api_init(posix_api_t *api) +{ + api->socket_fn = dummy_socket; + api->send_fn = dummy_send; + api->write_fn = dummy_write; + api->writev_fn = dummy_writev; + api->sendmsg_fn = dummy_sendmsg; + api->sendto_fn = dummy_sendto; + + rte_wmb(); + /* 1: wait until app thread call send functio complete */ + sleep(1); +} diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c index 5b0bee4..1c13076 100644 --- a/src/lstack/api/lstack_epoll.c +++ b/src/lstack/api/lstack_epoll.c @@ -35,7 +35,7 @@ #include "common/gazelle_base_func.h" #include "lstack_lwip.h" #include "lstack_protocol_stack.h" -#include "posix/lstack_epoll.h" +#include "lstack_epoll.h" #define EPOLL_KERNEL_INTERVAL 10 /* ms */ #define SEC_TO_NSEC 1000000000 diff --git a/src/lstack/api/lstack_fork.c b/src/lstack/api/lstack_fork.c deleted file mode 100644 index f5d0e95..0000000 --- a/src/lstack/api/lstack_fork.c +++ /dev/null @@ -1,28 +0,0 @@ -/* -* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -* gazelle is licensed under the Mulan PSL v2. -* You can use this software according to the terms and conditions of the Mulan PSL v2. -* You may obtain a copy of Mulan PSL v2 at: -* http://license.coscl.org.cn/MulanPSL2 -* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -* PURPOSE. -* See the Mulan PSL v2 for more details. -*/ - -#include -#include - -#include - -pid_t lstack_fork(void) -{ - pid_t pid; - - pid = posix_api->fork_fn(); - /* child not support lwip */ - if (pid == 0) { - posix_api->use_kernel = 1; - } - return pid; -} diff --git a/src/lstack/api/lstack_rtc_api.c b/src/lstack/api/lstack_rtc_api.c index e30718c..7689c83 100644 --- a/src/lstack/api/lstack_rtc_api.c +++ b/src/lstack/api/lstack_rtc_api.c @@ -10,37 +10,16 @@ * See the Mulan PSL v2 for more details. */ -#include -#include -#include -#include -#include #include -#include "posix/lstack_epoll.h" +#include + +#include "lstack_epoll.h" #include "lstack_log.h" #include "lstack_cfg.h" #include "lstack_protocol_stack.h" -#include "lstack_thread_rpc.h" #include "lstack_rtc_api.h" -int rtc_poll(struct pollfd *fds, nfds_t nfds, int timeout) -{ - LSTACK_LOG(ERR, LSTACK, "rtc_poll: rtc currently does not support poll\n"); - return -1; -} - -int rtc_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) -{ - LSTACK_LOG(ERR, LSTACK, "rtc_select: rtc currently does not support select\n"); - return -1; -} - -int rtc_epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout) -{ - return lstack_rtc_epoll_wait(epfd, events, maxevents, timeout); -} - -int rtc_socket(int domain, int type, int protocol) +static int rtc_socket(int domain, int type, int protocol) { int ret; @@ -53,7 +32,7 @@ int rtc_socket(int domain, int type, int protocol) return ret; } -int rtc_close(int s) +static int rtc_close(int s) { struct lwip_sock *sock = lwip_get_socket(s); if (sock != NULL && sock->wakeup != NULL && sock->wakeup->epollfd == s) { @@ -63,12 +42,12 @@ int rtc_close(int s) return lwip_close(s); } -int rtc_shutdown(int fd, int how) +static int rtc_shutdown(int fd, int how) { return lwip_shutdown(fd, how); } -int rtc_epoll_create(int flags) +static int rtc_epoll_create(int flags) { if (stack_setup_app_thread() < 0) { exit(1); @@ -77,7 +56,7 @@ int rtc_epoll_create(int flags) return lstack_epoll_create(flags); } -int rtc_epoll_create1(int flags) +static int rtc_epoll_create1(int flags) { if (stack_setup_app_thread() < 0) { exit(1); @@ -86,7 +65,60 @@ int rtc_epoll_create1(int flags) return lstack_epoll_create1(flags); } -int rtc_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) +static int rtc_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) { return lstack_rtc_epoll_ctl(epfd, op, fd, event); } + +static int rtc_epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout) +{ + return lstack_rtc_epoll_wait(epfd, events, maxevents, timeout); +} + +static int rtc_poll(struct pollfd *fds, nfds_t nfds, int timeout) +{ + LSTACK_LOG(ERR, LSTACK, "rtc_poll: rtc currently does not support poll\n"); + return -1; +} + +static int rtc_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) +{ + LSTACK_LOG(ERR, LSTACK, "rtc_select: rtc currently does not support select\n"); + return -1; +} + +void rtc_api_init(posix_api_t *api) +{ + api->close_fn = rtc_close; + api->shutdown_fn = rtc_shutdown; + api->socket_fn = rtc_socket; + api->accept_fn = lwip_accept; + api->accept4_fn = lwip_accept4; + api->bind_fn = lwip_bind; + api->listen_fn = lwip_listen; + api->connect_fn = lwip_connect; + + api->setsockopt_fn = lwip_setsockopt; + api->getsockopt_fn = lwip_getsockopt; + api->getpeername_fn = lwip_getpeername; + api->getsockname_fn = lwip_getsockname; + + api->read_fn = lwip_read; + api->readv_fn = lwip_readv; + api->write_fn = lwip_write; + api->writev_fn = lwip_writev; + api->recv_fn = lwip_recv; + api->send_fn = lwip_send; + api->recvmsg_fn = (ssize_t (*)(int, const struct msghdr *, int))lwip_recvmsg; // TODO: fix unnecessary 'const' in lwipgz_posix_api.h + api->sendmsg_fn = lwip_sendmsg; + api->recvfrom_fn = lwip_recvfrom; + api->sendto_fn = lwip_sendto; + + api->epoll_ctl_fn = rtc_epoll_ctl; + api->epoll_create1_fn = rtc_epoll_create1; + api->epoll_create_fn = rtc_epoll_create; + api->epoll_wait_fn = rtc_epoll_wait; + + api->poll_fn = rtc_poll; + api->select_fn = rtc_select; +} diff --git a/src/lstack/api/lstack_rtw_api.c b/src/lstack/api/lstack_rtw_api.c index 09c4e11..d8634cc 100644 --- a/src/lstack/api/lstack_rtw_api.c +++ b/src/lstack/api/lstack_rtw_api.c @@ -10,23 +10,18 @@ * See the Mulan PSL v2 for more details. */ -#include -#include -#include -#include - #include +#include #include "lstack_thread_rpc.h" -#include "posix/lstack_epoll.h" +#include "lstack_epoll.h" #include "lstack_protocol_stack.h" #include "lstack_cfg.h" #include "lstack_lwip.h" #include "common/gazelle_base_func.h" #include "lstack_rtw_api.h" - -int rtw_socket(int domain, int type, int protocol) +static int rtw_socket(int domain, int type, int protocol) { struct protocol_stack *stack = get_bind_protocol_stack(); if (stack == NULL) { @@ -35,17 +30,17 @@ int rtw_socket(int domain, int type, int protocol) return rpc_call_socket(&stack->rpc_queue, domain, type, protocol); } -int rtw_accept(int s, struct sockaddr *addr, socklen_t *addrlen) +static int rtw_accept(int s, struct sockaddr *addr, socklen_t *addrlen) { return stack_broadcast_accept(s, addr, addrlen); } -int rtw_accept4(int s, struct sockaddr *addr, socklen_t *addrlen, int flags) +static int rtw_accept4(int s, struct sockaddr *addr, socklen_t *addrlen, int flags) { return stack_broadcast_accept4(s, addr, addrlen, flags); } -int rtw_bind(int s, const struct sockaddr *name, socklen_t namelen) +static int rtw_bind(int s, const struct sockaddr *name, socklen_t namelen) { struct lwip_sock *sock = lwip_get_socket(s); @@ -56,7 +51,7 @@ int rtw_bind(int s, const struct sockaddr *name, socklen_t namelen) } } -int rtw_listen(int s, int backlog) +static int rtw_listen(int s, int backlog) { if (!get_global_cfg_params()->tuple_filter && !get_global_cfg_params()->listen_shadow) { @@ -66,7 +61,7 @@ int rtw_listen(int s, int backlog) } } -int rtw_connect(int s, const struct sockaddr *name, socklen_t namelen) +static int rtw_connect(int s, const struct sockaddr *name, socklen_t namelen) { struct protocol_stack *stack = get_protocol_stack_by_fd(s); if (stack == NULL) { @@ -75,7 +70,7 @@ int rtw_connect(int s, const struct sockaddr *name, socklen_t namelen) return rpc_call_connect(&stack->rpc_queue, s, name, namelen); } -int rtw_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) +static int rtw_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) { struct protocol_stack *stack = get_protocol_stack_by_fd(s); if (stack == NULL) { @@ -84,7 +79,7 @@ int rtw_setsockopt(int s, int level, int optname, const void *optval, socklen_t return rpc_call_setsockopt(&stack->rpc_queue, s, level, optname, optval, optlen); } -int rtw_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) +static int rtw_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) { struct protocol_stack *stack = get_protocol_stack_by_fd(s); if (stack == NULL) { @@ -93,7 +88,7 @@ int rtw_getsockopt(int s, int level, int optname, void *optval, socklen_t *optle return rpc_call_getsockopt(&stack->rpc_queue, s, level, optname, optval, optlen); } -int rtw_getpeername(int s, struct sockaddr *name, socklen_t *namelen) +static int rtw_getpeername(int s, struct sockaddr *name, socklen_t *namelen) { struct protocol_stack *stack = get_protocol_stack_by_fd(s); if (stack == NULL) { @@ -102,7 +97,7 @@ int rtw_getpeername(int s, struct sockaddr *name, socklen_t *namelen) return rpc_call_getpeername(&stack->rpc_queue, s, name, namelen); } -int rtw_getsockname(int s, struct sockaddr *name, socklen_t *namelen) +static int rtw_getsockname(int s, struct sockaddr *name, socklen_t *namelen) { struct protocol_stack *stack = get_protocol_stack_by_fd(s); if (stack == NULL) { @@ -111,12 +106,12 @@ int rtw_getsockname(int s, struct sockaddr *name, socklen_t *namelen) return rpc_call_getsockname(&stack->rpc_queue, s, name, namelen); } -ssize_t rtw_read(int s, void *mem, size_t len) +static ssize_t rtw_read(int s, void *mem, size_t len) { return do_lwip_read_from_stack(s, mem, len, 0, NULL, NULL); } -ssize_t rtw_readv(int s, const struct iovec *iov, int iovcnt) +static ssize_t rtw_readv(int s, const struct iovec *iov, int iovcnt) { struct msghdr msg; @@ -130,12 +125,12 @@ ssize_t rtw_readv(int s, const struct iovec *iov, int iovcnt) return do_lwip_recvmsg_from_stack(s, &msg, 0); } -ssize_t rtw_write(int s, const void *mem, size_t size) +static ssize_t rtw_write(int s, const void *mem, size_t size) { return do_lwip_send_to_stack(s, mem, size, 0, NULL, 0); } -ssize_t rtw_writev(int s, const struct iovec *iov, int iovcnt) +static ssize_t rtw_writev(int s, const struct iovec *iov, int iovcnt) { struct lwip_sock *sock = lwip_get_socket(s); struct msghdr msg; @@ -150,22 +145,22 @@ ssize_t rtw_writev(int s, const struct iovec *iov, int iovcnt) return do_lwip_sendmsg_to_stack(sock, s, &msg, 0); } -ssize_t rtw_recv(int sockfd, void *buf, size_t len, int flags) +static ssize_t rtw_recv(int sockfd, void *buf, size_t len, int flags) { return do_lwip_read_from_stack(sockfd, buf, len, flags, NULL, NULL); } -ssize_t rtw_send(int sockfd, const void *buf, size_t len, int flags) +static ssize_t rtw_send(int sockfd, const void *buf, size_t len, int flags) { return do_lwip_send_to_stack(sockfd, buf, len, flags, NULL, 0); } -ssize_t rtw_recvmsg(int s, const struct msghdr *message, int flags) +static ssize_t rtw_recvmsg(int s, struct msghdr *message, int flags) { return do_lwip_recvmsg_from_stack(s, message, flags); } -ssize_t rtw_sendmsg(int s, const struct msghdr *message, int flags) +static ssize_t rtw_sendmsg(int s, const struct msghdr *message, int flags) { struct lwip_sock *sock = lwip_get_socket(s); return do_lwip_sendmsg_to_stack(sock, s, message, flags); @@ -207,8 +202,8 @@ static inline ssize_t rtw_tcp_recvfrom(int sockfd, void *buf, size_t len, int fl } -ssize_t rtw_recvfrom(int sockfd, void *buf, size_t len, int flags, - struct sockaddr *addr, socklen_t *addrlen) +static ssize_t rtw_recvfrom(int sockfd, void *buf, size_t len, int flags, + struct sockaddr *addr, socklen_t *addrlen) { struct lwip_sock *sock = lwip_get_socket(sockfd); if (NETCONN_IS_UDP(sock)) { @@ -218,28 +213,28 @@ ssize_t rtw_recvfrom(int sockfd, void *buf, size_t len, int flags, } } -ssize_t rtw_sendto(int sockfd, const void *buf, size_t len, int flags, - const struct sockaddr *addr, socklen_t addrlen) +static ssize_t rtw_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *addr, socklen_t addrlen) { return do_lwip_send_to_stack(sockfd, buf, len, flags, addr, addrlen); } -int rtw_epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout) +static int rtw_epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout) { return lstack_rtw_epoll_wait(epfd, events, maxevents, timeout); } -int rtw_poll(struct pollfd *fds, nfds_t nfds, int timeout) +static int rtw_poll(struct pollfd *fds, nfds_t nfds, int timeout) { return lstack_poll(fds, nfds, timeout); } -int rtw_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) +static int rtw_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { return lstack_select(nfds, readfds, writefds, exceptfds, timeout); } -int rtw_close(int s) +static int rtw_close(int s) { struct lwip_sock *sock = lwip_get_socket(s); if (sock && sock->wakeup && sock->wakeup->epollfd == s) { @@ -248,7 +243,7 @@ int rtw_close(int s) return stack_broadcast_close(s); } -int rtw_shutdown(int fd, int how) +static int rtw_shutdown(int fd, int how) { struct lwip_sock *sock = lwip_get_socket(fd); if (sock && sock->wakeup && sock->wakeup->epollfd == fd) { @@ -258,18 +253,53 @@ int rtw_shutdown(int fd, int how) return stack_broadcast_shutdown(fd, how); } -int rtw_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) +static int rtw_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) { return lstack_rtw_epoll_ctl(epfd, op, fd, event); } -int rtw_epoll_create1(int flags) +static int rtw_epoll_create1(int flags) { return lstack_epoll_create1(flags); } -int rtw_epoll_create(int flags) +static int rtw_epoll_create(int flags) { return lstack_epoll_create(flags); } +void rtw_api_init(posix_api_t *api) +{ + api->close_fn = rtw_close; + api->shutdown_fn = rtw_shutdown; + api->socket_fn = rtw_socket; + api->accept_fn = rtw_accept; + api->accept4_fn = rtw_accept4; + api->bind_fn = rtw_bind; + api->listen_fn = rtw_listen; + api->connect_fn = rtw_connect; + + api->setsockopt_fn = rtw_setsockopt; + api->getsockopt_fn = rtw_getsockopt; + api->getpeername_fn = rtw_getpeername; + api->getsockname_fn = rtw_getsockname; + + api->read_fn = rtw_read; + api->readv_fn = rtw_readv; + api->write_fn = rtw_write; + api->writev_fn = rtw_writev; + api->recv_fn = rtw_recv; + api->send_fn = rtw_send; + api->recvmsg_fn = (ssize_t (*)(int, const struct msghdr *, int))rtw_recvmsg; // TODO: fix unnecessary 'const' in lwipgz_posix_api.h + api->sendmsg_fn = rtw_sendmsg; + api->recvfrom_fn = rtw_recvfrom; + api->sendto_fn = rtw_sendto; + + api->epoll_ctl_fn = rtw_epoll_ctl; + api->epoll_create1_fn = rtw_epoll_create1; + api->epoll_create_fn = rtw_epoll_create; + api->epoll_wait_fn = rtw_epoll_wait; + + api->poll_fn = rtw_poll; + api->select_fn = rtw_select; +} \ No newline at end of file diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_unistd.c similarity index 89% rename from src/lstack/api/lstack_signal.c rename to src/lstack/api/lstack_unistd.c index 9d0431b..1f78626 100644 --- a/src/lstack/api/lstack_signal.c +++ b/src/lstack/api/lstack_unistd.c @@ -11,22 +11,22 @@ */ #include -#include -#include #include -#include +#include + #include #include +#include "lstack_unistd.h" #include "common/gazelle_base_func.h" -#include "lstack_cfg.h" -#include "common/dpdk_common.h" #include "lstack_log.h" +#include "lstack_cfg.h" #include "lstack_control_plane.h" static int g_hijack_signal[] = { SIGTERM, SIGINT, SIGSEGV, SIGBUS, SIGFPE, SIGILL, SIGKILL}; #define HIJACK_SIGNAL_COUNT (sizeof(g_hijack_signal) / sizeof(g_hijack_signal[0])) #define BACKTRACE_SIZE 64 + static void dump_stack(void) { char **stack_trace = NULL; @@ -71,17 +71,24 @@ static void lstack_sig_default_handler(int sig) (void)kill(getpid(), sig); } -void lstack_signal_init(void) +int lstack_signal_init(void) { unsigned int i; struct sigaction action; + /* to prevent crash, just ignore SIGPIPE when socket is closed */ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { + return -1; + } + sigemptyset(&action.sa_mask); action.sa_flags = (int)(SA_NODEFER | SA_RESETHAND); action.sa_handler = lstack_sig_default_handler; for (i = 0; i < HIJACK_SIGNAL_COUNT; i++) { posix_api->sigaction_fn(g_hijack_signal[i], &action, NULL); } + + return 0; } int lstack_sigaction(int sig_num, const struct sigaction *action, struct sigaction *old_action) @@ -104,3 +111,15 @@ int lstack_sigaction(int sig_num, const struct sigaction *action, struct sigacti return posix_api->sigaction_fn(sig_num, action, old_action); } + +pid_t lstack_fork(void) +{ + pid_t pid; + + pid = posix_api->fork_fn(); + /* child not support lwip */ + if (pid == 0) { + posix_api->use_kernel = 1; + } + return pid; +} diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c index 92ce73b..1d5529d 100644 --- a/src/lstack/api/lstack_wrap.c +++ b/src/lstack/api/lstack_wrap.c @@ -10,29 +10,22 @@ * See the Mulan PSL v2 for more details. */ -#include -#include +#include #include - -#include -#include #include #include -#include #include -#include #include #include #include -#include "posix/lstack_unistd.h" +#include "common/gazelle_base_func.h" #include "lstack_log.h" #include "lstack_cfg.h" #include "lstack_lwip.h" -#include "common/gazelle_base_func.h" #include "lstack_preload.h" - +#include "lstack_unistd.h" #include "lstack_rtc_api.h" #include "lstack_rtw_api.h" #include "lstack_dummy_api.h" @@ -45,78 +38,18 @@ void wrap_api_init(void) if (g_wrap_api != NULL) { return; } - g_wrap_api = &g_wrap_api_value; + if (get_global_cfg_params()->stack_mode_rtc) { - g_wrap_api->socket_fn = rtc_socket; - g_wrap_api->accept_fn = lwip_accept; - g_wrap_api->accept4_fn = lwip_accept4; - g_wrap_api->bind_fn = lwip_bind; - g_wrap_api->listen_fn = lwip_listen; - g_wrap_api->connect_fn = lwip_connect; - g_wrap_api->setsockopt_fn = lwip_setsockopt; - g_wrap_api->getsockopt_fn = lwip_getsockopt; - g_wrap_api->getpeername_fn = lwip_getpeername; - g_wrap_api->getsockname_fn = lwip_getsockname; - g_wrap_api->read_fn = lwip_read; - g_wrap_api->readv_fn = lwip_readv; - g_wrap_api->write_fn = lwip_write; - g_wrap_api->writev_fn = lwip_writev; - g_wrap_api->recv_fn = lwip_recv; - g_wrap_api->send_fn = lwip_send; - g_wrap_api->recvmsg_fn = lwip_recvmsg; - g_wrap_api->sendmsg_fn = lwip_sendmsg; - g_wrap_api->recvfrom_fn = lwip_recvfrom; - g_wrap_api->sendto_fn = lwip_sendto; - g_wrap_api->epoll_wait_fn = rtc_epoll_wait; - g_wrap_api->poll_fn = rtc_poll; - g_wrap_api->close_fn = rtc_close; - g_wrap_api->shutdown_fn = rtc_shutdown; - g_wrap_api->epoll_ctl_fn = rtc_epoll_ctl; - g_wrap_api->epoll_create1_fn = rtc_epoll_create1; - g_wrap_api->epoll_create_fn = rtc_epoll_create; - g_wrap_api->select_fn = rtc_select; + rtc_api_init(g_wrap_api); } else { - g_wrap_api->socket_fn = rtw_socket; - g_wrap_api->accept_fn = rtw_accept; - g_wrap_api->accept4_fn = rtw_accept4; - g_wrap_api->bind_fn = rtw_bind; - g_wrap_api->listen_fn = rtw_listen; - g_wrap_api->connect_fn = rtw_connect; - g_wrap_api->setsockopt_fn = rtw_setsockopt; - g_wrap_api->getsockopt_fn = rtw_getsockopt; - g_wrap_api->getpeername_fn = rtw_getpeername; - g_wrap_api->getsockname_fn = rtw_getsockname; - g_wrap_api->read_fn = rtw_read; - g_wrap_api->readv_fn = rtw_readv; - g_wrap_api->write_fn = rtw_write; - g_wrap_api->writev_fn = rtw_writev; - g_wrap_api->recv_fn = rtw_recv; - g_wrap_api->send_fn = rtw_send; - g_wrap_api->recvmsg_fn = rtw_recvmsg; - g_wrap_api->sendmsg_fn = rtw_sendmsg; - g_wrap_api->recvfrom_fn = rtw_recvfrom; - g_wrap_api->sendto_fn = rtw_sendto; - g_wrap_api->epoll_wait_fn = rtw_epoll_wait; - g_wrap_api->poll_fn = rtw_poll; - g_wrap_api->close_fn = rtw_close; - g_wrap_api->shutdown_fn = rtw_shutdown; - g_wrap_api->epoll_ctl_fn = rtw_epoll_ctl; - g_wrap_api->epoll_create1_fn = rtw_epoll_create1; - g_wrap_api->epoll_create_fn = rtw_epoll_create; - g_wrap_api->select_fn = rtw_select; - } -} - -void wrap_api_set_dummy(void) -{ - g_wrap_api->socket_fn = dummy_socket; - g_wrap_api->send_fn = dummy_send; - g_wrap_api->write_fn = dummy_write; - g_wrap_api->writev_fn = dummy_writev; - g_wrap_api->sendmsg_fn = dummy_sendmsg; - g_wrap_api->sendto_fn = dummy_sendto; - rte_wmb(); + rtw_api_init(g_wrap_api); + } +} + +void wrap_api_exit(void) +{ + dummy_api_init(g_wrap_api); } static inline int32_t do_epoll_create1(int32_t flags) diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c index e0f7bd7..37264a1 100644 --- a/src/lstack/core/lstack_init.c +++ b/src/lstack/core/lstack_init.c @@ -20,27 +20,26 @@ #include #include #include -#include #include #include #include #include -#include +#include + #include #include #include #include +#include "lstack_log.h" #include "lstack_cfg.h" #include "lstack_control_plane.h" #include "lstack_ethdev.h" #include "lstack_dpdk.h" #include "lstack_stack_stat.h" -#include "lstack_log.h" #include "common/dpdk_common.h" -#include "posix/lstack_epoll.h" -#include "posix/lstack_unistd.h" +#include "lstack_unistd.h" #include "common/gazelle_base_func.h" #include "lstack_protocol_stack.h" #include "lstack_preload.h" @@ -107,9 +106,7 @@ static int32_t check_process_conflict(void) void gazelle_exit(void) { - wrap_api_set_dummy(); - /* 1: wait until app thread call send functio complete */ - sleep(1); + wrap_api_exit(); stack_group_exit(); } @@ -170,18 +167,6 @@ static void create_control_thread(void) LSTACK_LOG(INFO, LSTACK, "create control_easy_thread success\n"); } -static void gazelle_signal_init(void) -{ - /* to prevent crash , just ignore SIGPIPE when socket is closed */ - if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { - LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno); - LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n"); - } - - /* register core sig handler func to dumped stack */ - lstack_signal_init(); -} - #if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0) static void set_kni_ip_mac() { @@ -278,7 +263,11 @@ __attribute__((constructor)) void gazelle_network_init(void) } } - gazelle_signal_init(); + /* register core sig handler func to dumped stack */ + if (lstack_signal_init() != 0) { + LSTACK_PRE_LOG(LSTACK_ERR, "signal init failed, errno %d\n", errno); + LSTACK_EXIT(1, "signal init failed, errno %d\n", errno); + } /* Init control plane and dpdk init */ create_control_thread(); diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c index a7b7202..89142a4 100644 --- a/src/lstack/core/lstack_lwip.c +++ b/src/lstack/core/lstack_lwip.c @@ -34,7 +34,7 @@ #include "lstack_log.h" #include "lstack_dpdk.h" #include "lstack_stack_stat.h" -#include "posix/lstack_epoll.h" +#include "lstack_epoll.h" #include "lstack_thread_rpc.h" #include "common/dpdk_common.h" #include "lstack_cfg.h" diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c index 00900e7..f56e911 100644 --- a/src/lstack/core/lstack_protocol_stack.c +++ b/src/lstack/core/lstack_protocol_stack.c @@ -31,7 +31,7 @@ #include "lstack_lwip.h" #include "lstack_cfg.h" #include "lstack_control_plane.h" -#include "posix/lstack_epoll.h" +#include "lstack_epoll.h" #include "lstack_stack_stat.h" #include "lstack_virtio.h" #include "lstack_protocol_stack.h" diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c index 406e27c..b6619f6 100644 --- a/src/lstack/core/lstack_stack_stat.c +++ b/src/lstack/core/lstack_stack_stat.c @@ -26,7 +26,7 @@ #include "common/gazelle_dfx_msg.h" #include "lstack_thread_rpc.h" #include "lstack_protocol_stack.h" -#include "posix/lstack_epoll.h" +#include "lstack_epoll.h" #include "lstack_dpdk.h" #include "lstack_stack_stat.h" #include "lstack_virtio.h" diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/lstack_epoll.h similarity index 100% rename from src/lstack/include/posix/lstack_epoll.h rename to src/lstack/include/lstack_epoll.h diff --git a/src/lstack/include/lstack_rtc_api.h b/src/lstack/include/lstack_rtc_api.h index 3a41e6f..b4b7e1c 100644 --- a/src/lstack/include/lstack_rtc_api.h +++ b/src/lstack/include/lstack_rtc_api.h @@ -12,47 +12,14 @@ #ifndef _LSTACK_RTC_API_H_ #define _LSTACK_RTC_API_H_ -#include -#include -#include + +#include /* don't include lwip/sockets.h, conflict with sys/socket.h */ -/* extern lwip_api here */ extern int lwip_fcntl(int s, int cmd, int val); -extern int lwip_ioctl(int s, long cmd, ...); -extern int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); -extern int lwip_accept4(int s, struct sockaddr *addr, socklen_t *addrlen, int flags); -extern int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); -extern int lwip_shutdown(int s, int how); -extern int lwip_getpeername(int s, struct sockaddr *name, socklen_t *namelen); -extern int lwip_getsockname(int s, struct sockaddr *name, socklen_t *namelen); -extern int lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); -extern int lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); -extern int lwip_close(int s); -extern int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); -extern int lwip_listen(int s, int backlog); -extern ssize_t lwip_recv(int s, void *mem, size_t len, int flags); -extern ssize_t lwip_read(int s, void *mem, size_t len); -extern ssize_t lwip_readv(int s, const struct iovec *iov, int iovcnt); -extern ssize_t lwip_recvfrom(int s, void *mem, size_t len, int flags, - struct sockaddr *from, socklen_t *fromlen); -extern ssize_t lwip_recvmsg(int s, const struct msghdr *message, int flags); -extern ssize_t lwip_send(int s, const void *dataptr, size_t size, int flags); -extern ssize_t lwip_sendmsg(int s, const struct msghdr *message, int flags); -extern ssize_t lwip_sendto(int s, const void *dataptr, size_t size, int flags, - const struct sockaddr *to, socklen_t tolen); -extern int lwip_socket(int domain, int type, int protocol); -extern ssize_t lwip_write(int s, const void *dataptr, size_t size); -extern ssize_t lwip_writev(int s, const struct iovec *iov, int iovcnt); +extern int lwip_ioctl(int s, long cmd, void *argp); -int rtc_poll(struct pollfd *fds, nfds_t nfds, int timeout); -int rtc_epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout); -int rtc_socket(int domain, int type, int protocol); -int rtc_close(int s); -int rtc_shutdown(int fd, int how); -int rtc_epoll_create(int flags); -int rtc_epoll_create1(int flags); -int rtc_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); -int rtc_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +void dummy_api_init(posix_api_t *api); +void rtc_api_init(posix_api_t *api); #endif /* __LSTACK_RTC_API_H_ */ diff --git a/src/lstack/include/lstack_rtw_api.h b/src/lstack/include/lstack_rtw_api.h index a38b656..437901a 100644 --- a/src/lstack/include/lstack_rtw_api.h +++ b/src/lstack/include/lstack_rtw_api.h @@ -13,39 +13,8 @@ #ifndef _LSTACK_RTW_API_H_ #define _LSTACK_RTW_API_H_ -#include -#include -#include +#include -int rtw_socket(int domain, int type, int protocol); -int rtw_accept(int s, struct sockaddr *addr, socklen_t *addrlen); -int rtw_accept4(int s, struct sockaddr *addr, socklen_t *addrlen, int flags); -int rtw_bind(int s, const struct sockaddr *name, socklen_t namelen); -int rtw_listen(int s, int backlog); -int rtw_connect(int s, const struct sockaddr *name, socklen_t namelen); -int rtw_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); -int rtw_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); -int rtw_getpeername(int s, struct sockaddr *name, socklen_t *namelen); -int rtw_getsockname(int s, struct sockaddr *name, socklen_t *namelen); -ssize_t rtw_read(int s, void *mem, size_t len); -ssize_t rtw_readv(int s, const struct iovec *iov, int iovcnt); -ssize_t rtw_write(int s, const void *mem, size_t size); -ssize_t rtw_writev(int s, const struct iovec *iov, int iovcnt); -ssize_t rtw_recv(int sockfd, void *buf, size_t len, int flags); -ssize_t rtw_send(int sockfd, const void *buf, size_t len, int flags); -ssize_t rtw_recvmsg(int s, const struct msghdr *message, int flags); -ssize_t rtw_sendmsg(int s, const struct msghdr *message, int flags); -ssize_t rtw_recvfrom(int sockfd, void *buf, size_t len, int flags, - struct sockaddr *addr, socklen_t *addrlen); -ssize_t rtw_sendto(int sockfd, const void *buf, size_t len, int flags, - const struct sockaddr *addr, socklen_t addrlen); -int rtw_epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout); -int rtw_poll(struct pollfd *fds, nfds_t nfds, int timeout); -int rtw_close(int s); -int rtw_shutdown(int fd, int how); -int rtw_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); -int rtw_epoll_create1(int flags); -int rtw_epoll_create(int flags); -int rtw_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +void rtw_api_init(posix_api_t *api); #endif /* _LSTACK_RTW_API_H_ */ diff --git a/src/lstack/include/posix/lstack_unistd.h b/src/lstack/include/lstack_unistd.h similarity index 78% rename from src/lstack/include/posix/lstack_unistd.h rename to src/lstack/include/lstack_unistd.h index 484a792..3bcee5a 100644 --- a/src/lstack/include/posix/lstack_unistd.h +++ b/src/lstack/include/lstack_unistd.h @@ -13,16 +13,11 @@ #ifndef _GAZELLE_UNISTD_H_ #define _GAZELLE_UNISTD_H_ -#ifdef __cplusplus -extern "C" { -#endif +#include +#include +int lstack_signal_init(void); +int lstack_sigaction(int sig_num, const struct sigaction *action, struct sigaction *old_action); pid_t lstack_fork(void); -void lstack_signal_init(void); -int lstack_sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); - -#ifdef __cplusplus -} -#endif #endif /* _GAZELLE_UNISTD_H_ */ diff --git a/src/lstack/include/lstack_wrap.h b/src/lstack/include/lstack_wrap.h index dab5222..a45b0d5 100644 --- a/src/lstack/include/lstack_wrap.h +++ b/src/lstack/include/lstack_wrap.h @@ -14,7 +14,7 @@ #define _LSTACK_WRAP_H_ void wrap_api_init(void); -void wrap_api_set_dummy(void); +void wrap_api_exit(void); #endif -- 2.33.0