gazelle/0257-cleancode-refactor-rtc_api-rtw_api-and-dummy_api.patch
jiangheng 41d8d0f252 sync cleancode: declare different cfg_params types
(cherry picked from commit a90b70e9699c3082533da0812da33a4fdf485e32)
2024-09-30 10:34:27 +08:00

1036 lines
36 KiB
Diff

From 85e907b495391a89096bfb7e5c9cb901d0f9f56b Mon Sep 17 00:00:00 2001
From: Lemmy Huang <huangliming5@huawei.com>
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 <huangliming5@huawei.com>
---
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 <unistd.h>
#include <errno.h>
+#include <rte_config.h>
+#include <rte_atomic.h>
+#include <lwip/lwipgz_posix_api.h>
+
#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 <sys/socket.h>
-#include <unistd.h>
-
-#include <lwip/lwipgz_posix_api.h>
-
-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 <fcntl.h>
-#include <sys/epoll.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <lwip/lwipgz_posix_api.h>
#include <lwip/lwipgz_sock.h>
-#include "posix/lstack_epoll.h"
+#include <lwip/sockets.h>
+
+#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 <fcntl.h>
-#include <sys/epoll.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
#include <lwip/lwipgz_sock.h>
+#include <lwip/sockets.h>
#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 <sys/types.h>
-#include <signal.h>
-#include <sys/socket.h>
#include <execinfo.h>
-#include <unistd.h>
+#include <sys/socket.h>
+
#include <lwip/lwipgz_sock.h>
#include <lwip/lwipgz_posix_api.h>
+#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 <dlfcn.h>
-#include <netdb.h>
+#include <securec.h>
#include <ifaddrs.h>
-
-#include <signal.h>
-#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
-#include <sys/epoll.h>
#include <net/if.h>
-#include <securec.h>
#include <lwip/lwipgz_posix_api.h>
#include <lwip/lwipgz_sock.h>
#include <lwip/tcp.h>
-#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 <securec.h>
#include <numa.h>
#include <pthread.h>
-#include <rte_pdump.h>
#include <unistd.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netinet/in.h>
-#include <lwip/def.h>
+#include <rte_pdump.h>
+
#include <lwip/init.h>
#include <lwip/lwipgz_sock.h>
#include <lwip/lwipopts.h>
#include <lwip/lwipgz_posix_api.h>
+#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 <sys/epoll.h>
-#include <sys/select.h>
-#include <sys/socket.h>
+
+#include <lwip/lwipgz_posix_api.h>
/* 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 <sys/epoll.h>
-#include <sys/select.h>
-#include <sys/socket.h>
+#include <lwip/lwipgz_posix_api.h>
-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 <unistd.h>
+#include <signal.h>
+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