Fetch the repository succeeded.
This action will force synchronization from src-openEuler/gazelle, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
From a1523d108581cfc8aaf89b1116dde071ca5656d8 Mon Sep 17 00:00:00 2001
From: Lemmy Huang <huangliming5@huawei.com>
Date: Wed, 10 Jul 2024 17:40:43 +0800
Subject: [PATCH] cleancode: refactor posix_api
Signed-off-by: Lemmy Huang <huangliming5@huawei.com>
---
src/lstack/api/lstack_epoll.c | 16 +-
src/lstack/api/lstack_fork.c | 3 +-
src/lstack/api/lstack_rtw_api.c | 2 +-
src/lstack/api/lstack_wrap.c | 234 ++++++++++--------------
src/lstack/core/lstack_control_plane.c | 4 +-
src/lstack/core/lstack_init.c | 4 +-
src/lstack/core/lstack_lwip.c | 5 +-
src/lstack/core/lstack_preload.c | 23 ++-
src/lstack/core/lstack_protocol_stack.c | 8 +-
src/lstack/include/lstack_preload.h | 6 +-
src/lstack/netif/lstack_flow.c | 1 +
11 files changed, 139 insertions(+), 167 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 8146b4f..f8fd6d4 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -164,7 +164,7 @@ static uint32_t update_events(struct lwip_sock *sock)
if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) {
/* lwip_netconn_do_connected set LIBOS FLAGS when connected */
- if (sock->conn && POSIX_IS_TYPE(sock, POSIX_LWIP)) {
+ if (!POSIX_IS_CLOSED(sock) && POSIX_IS_TYPE(sock, POSIX_LWIP)) {
event |= EPOLLOUT;
}
}
@@ -190,7 +190,7 @@ static void rtc_raise_pending_events(struct wakeup_poll *wakeup, struct lwip_soc
if (sock->sendevent) {
/* lwip_netconn_do_connected set LIBOS FLAGS when connected */
- if (sock->conn && POSIX_IS_TYPE(sock, POSIX_LWIP)) {
+ if (!POSIX_IS_CLOSED(sock) && POSIX_IS_TYPE(sock, POSIX_LWIP)) {
event |= EPOLLOUT;
}
}
@@ -219,7 +219,7 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s
pthread_spin_lock(&wakeup->event_list_lock);
if (NETCONN_IS_OUTIDLE(sock)) {
/* lwip_netconn_do_connected set LIBOS FLAGS when connected */
- if (sock->conn && POSIX_IS_TYPE(sock, POSIX_LWIP)) {
+ if (!POSIX_IS_CLOSED(sock) && POSIX_IS_TYPE(sock, POSIX_LWIP)) {
event |= EPOLLOUT;
}
}
@@ -398,7 +398,7 @@ int32_t lstack_rtc_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_
struct wakeup_poll *wakeup = epoll_sock->wakeup;
struct lwip_sock *sock = lwip_get_socket(fd);
- if (sock == NULL || sock->conn == NULL) {
+ if (POSIX_IS_CLOSED(sock)) {
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
@@ -438,7 +438,7 @@ int32_t lstack_rtw_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_
struct wakeup_poll *wakeup = epoll_sock->wakeup;
struct lwip_sock *sock = lwip_get_socket(fd);
- if (sock == NULL || sock->conn == NULL) {
+ if (POSIX_IS_CLOSED(sock)) {
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
@@ -536,7 +536,7 @@ static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds)
/* sock->listen_next pointerto next stack listen */
int32_t fd = fds[i].fd;
struct lwip_sock *sock = lwip_get_socket(fd);
- while (sock && sock->conn) {
+ while (!POSIX_IS_CLOSED(sock)) {
uint32_t events = update_events(sock);
if (events) {
fds[i].revents = events;
@@ -838,7 +838,7 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd
}
}
- if (sock == NULL || sock->conn == NULL || POSIX_HAS_TYPE(sock, POSIX_KERNEL)) {
+ if (POSIX_IS_CLOSED(sock) || POSIX_HAS_TYPE(sock, POSIX_KERNEL)) {
update_kernel_poll(wakeup, i, fds + i);
}
@@ -846,7 +846,7 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd
wakeup->last_fds[i].events = fds[i].events;
poll_change = 1;
- while (sock && sock->conn) {
+ while (!POSIX_IS_CLOSED(sock)) {
sock->epoll_events = fds[i].events | POLLERR;
sock->wakeup = wakeup;
stack_count[sock->stack->stack_idx]++;
diff --git a/src/lstack/api/lstack_fork.c b/src/lstack/api/lstack_fork.c
index 5cddee2..f5d0e95 100644
--- a/src/lstack/api/lstack_fork.c
+++ b/src/lstack/api/lstack_fork.c
@@ -20,8 +20,9 @@ pid_t lstack_fork(void)
pid_t pid;
pid = posix_api->fork_fn();
+ /* child not support lwip */
if (pid == 0) {
- posix_api_fork();
+ posix_api->use_kernel = 1;
}
return pid;
}
diff --git a/src/lstack/api/lstack_rtw_api.c b/src/lstack/api/lstack_rtw_api.c
index f59b0cd..09c4e11 100644
--- a/src/lstack/api/lstack_rtw_api.c
+++ b/src/lstack/api/lstack_rtw_api.c
@@ -186,7 +186,7 @@ static ssize_t rtw_udp_recvfrom(int sockfd, void *buf, size_t len, int flags,
return -1;
}
sock = sock->listen_next;
- if (sock != NULL && sock->conn != NULL) {
+ if (!POSIX_IS_CLOSED(sock)) {
sockfd = sock->conn->callback_arg.socket;
} else {
if (sock == NULL) {
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index d3e1027..b19990e 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -37,12 +37,8 @@
#include "lstack_rtw_api.h"
#include "lstack_dummy_api.h"
-#ifndef SOCK_TYPE_MASK
-#define SOCK_TYPE_MASK 0xf
-#endif
-
-posix_api_t g_wrap_api_value;
-posix_api_t *g_wrap_api;
+static posix_api_t g_wrap_api_value;
+static posix_api_t *g_wrap_api;
void wrap_api_init(void)
{
@@ -68,10 +64,10 @@ void wrap_api_init(void)
g_wrap_api->writev_fn = lwip_writev;
g_wrap_api->recv_fn = lwip_recv;
g_wrap_api->send_fn = lwip_send;
- g_wrap_api->recv_msg = lwip_recvmsg;
- g_wrap_api->send_msg = lwip_sendmsg;
- g_wrap_api->recv_from = lwip_recvfrom;
- g_wrap_api->send_to = lwip_sendto;
+ 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;
@@ -97,10 +93,10 @@ void wrap_api_init(void)
g_wrap_api->writev_fn = rtw_writev;
g_wrap_api->recv_fn = rtw_recv;
g_wrap_api->send_fn = rtw_send;
- g_wrap_api->recv_msg = rtw_recvmsg;
- g_wrap_api->send_msg = rtw_sendmsg;
- g_wrap_api->recv_from = rtw_recvfrom;
- g_wrap_api->send_to = rtw_sendto;
+ 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;
@@ -118,8 +114,8 @@ void wrap_api_set_dummy(void)
g_wrap_api->send_fn = dummy_send;
g_wrap_api->write_fn = dummy_write;
g_wrap_api->writev_fn = dummy_writev;
- g_wrap_api->send_msg = dummy_sendmsg;
- g_wrap_api->send_to = dummy_sendto;
+ g_wrap_api->sendmsg_fn = dummy_sendmsg;
+ g_wrap_api->sendto_fn = dummy_sendto;
rte_wmb();
}
@@ -169,7 +165,7 @@ static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, in
static inline int32_t do_accept(int32_t s, struct sockaddr *addr, socklen_t *addrlen)
{
- if (select_fd_posix_path(s, NULL) == POSIX_KERNEL) {
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_KERNEL) {
return posix_api->accept_fn(s, addr, addrlen);
}
@@ -189,7 +185,7 @@ static int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *addrlen,
GAZELLE_RETURN(EINVAL);
}
- if (select_fd_posix_path(s, NULL) == POSIX_KERNEL) {
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_KERNEL) {
return posix_api->accept4_fn(s, addr, addrlen, flags);
}
@@ -209,8 +205,8 @@ static int32_t do_bind(int32_t s, const struct sockaddr *name, socklen_t namelen
GAZELLE_RETURN(EINVAL);
}
- struct lwip_sock *sock = NULL;
- if (select_fd_posix_path(s, &sock) == POSIX_KERNEL) {
+ struct lwip_sock *sock = lwip_get_socket(s);
+ if (select_sock_posix_path(sock) == POSIX_KERNEL) {
return posix_api->bind_fn(s, name, namelen);
}
@@ -230,30 +226,31 @@ static int32_t do_bind(int32_t s, const struct sockaddr *name, socklen_t namelen
((struct sockaddr_in6 *)name)->sin6_addr.s6_addr, IPV6_ADDR_LEN);
}
- if (match_host_addr(&sock_addr)) {
- /* maybe kni addr */
- if (posix_api->bind_fn(s, name, namelen) != 0) {
- POSIX_SET_TYPE(sock, POSIX_LWIP);
- } else {
- /* reuse the port allocated by kernel when port == 0 */
- if (((struct sockaddr_in *)name)->sin_port == 0) {
- struct sockaddr_in kerneladdr;
- socklen_t len = sizeof(kerneladdr);
- if (posix_api->getsockname_fn(s, (struct sockaddr *)&kerneladdr, &len) < 0) {
- LSTACK_LOG(ERR, LSTACK, "kernel getsockname failed, fd=%d, errno=%d\n", s, errno);
- return -1;
- }
- ((struct sockaddr_in *)name)->sin_port = kerneladdr.sin_port;
+ if (!match_host_addr(&sock_addr)) {
+ POSIX_SET_TYPE(sock, POSIX_KERNEL);
+ return posix_api->bind_fn(s, name, namelen);
+ }
+
+ /* maybe kni addr */
+ if (posix_api->bind_fn(s, name, namelen) == 0) {
+ /* reuse the port allocated by kernel when port == 0 */
+ if (((struct sockaddr_in *)name)->sin_port == 0) {
+ struct sockaddr_in kerneladdr;
+ socklen_t len = sizeof(kerneladdr);
+ if (posix_api->getsockname_fn(s, (struct sockaddr *)&kerneladdr, &len) < 0) {
+ LSTACK_LOG(ERR, LSTACK, "kernel getsockname failed, fd=%d, errno=%d\n", s, errno);
+ return -1;
}
+ ((struct sockaddr_in *)name)->sin_port = kerneladdr.sin_port;
}
- return g_wrap_api->bind_fn(s, name, namelen);
+ /* not sure POSIX_LWIP or POSIX_KERNEL */
} else {
- POSIX_SET_TYPE(sock, POSIX_KERNEL);
- return posix_api->bind_fn(s, name, namelen);
+ POSIX_SET_TYPE(sock, POSIX_LWIP);
}
+ return g_wrap_api->bind_fn(s, name, namelen);
}
-bool is_dst_ip_localhost(const struct sockaddr *addr)
+static bool is_dst_ip_localhost(const struct sockaddr *addr)
{
struct ifaddrs *ifap;
struct ifaddrs *ifa;
@@ -302,13 +299,8 @@ static int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t name
GAZELLE_RETURN(EINVAL);
}
- struct lwip_sock *sock = NULL;
- if (select_fd_posix_path(s, &sock) == POSIX_KERNEL) {
- return posix_api->connect_fn(s, name, namelen);
- }
-
- sock = lwip_get_socket(s);
- if (sock == NULL) {
+ struct lwip_sock *sock = lwip_get_socket(s);
+ if (select_sock_posix_path(sock) == POSIX_KERNEL) {
return posix_api->connect_fn(s, name, namelen);
}
@@ -334,7 +326,7 @@ static int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t name
static inline int32_t do_listen(int32_t s, int32_t backlog)
{
- if (select_fd_posix_path(s, NULL) == POSIX_KERNEL) {
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_KERNEL) {
return posix_api->listen_fn(s, backlog);
}
@@ -352,7 +344,7 @@ static inline int32_t do_getpeername(int32_t s, struct sockaddr *name, socklen_t
GAZELLE_RETURN(EINVAL);
}
- if (select_fd_posix_path(s, NULL) == POSIX_LWIP) {
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
return g_wrap_api->getpeername_fn(s, name, namelen);
}
@@ -365,7 +357,7 @@ static inline int32_t do_getsockname(int32_t s, struct sockaddr *name, socklen_t
GAZELLE_RETURN(EINVAL);
}
- if (select_fd_posix_path(s, NULL) == POSIX_LWIP) {
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
return g_wrap_api->getsockname_fn(s, name, namelen);
}
@@ -422,7 +414,7 @@ static bool unsupport_optname(int32_t level, int32_t optname)
static inline int32_t do_getsockopt(int32_t s, int32_t level, int32_t optname, void *optval, socklen_t *optlen)
{
- if (select_fd_posix_path(s, NULL) == POSIX_LWIP && !unsupport_optname(level, optname)) {
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP && !unsupport_optname(level, optname)) {
return g_wrap_api->getsockopt_fn(s, level, optname, optval, optlen);
}
@@ -431,7 +423,7 @@ static inline int32_t do_getsockopt(int32_t s, int32_t level, int32_t optname, v
static inline int32_t do_setsockopt(int32_t s, int32_t level, int32_t optname, const void *optval, socklen_t optlen)
{
- if (select_fd_posix_path(s, NULL) == POSIX_KERNEL || unsupport_optname(level, optname)) {
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_KERNEL || unsupport_optname(level, optname)) {
return posix_api->setsockopt_fn(s, level, optname, optval, optlen);
}
@@ -473,17 +465,14 @@ static inline ssize_t do_recv(int32_t sockfd, void *buf, size_t len, int32_t fla
if (buf == NULL) {
GAZELLE_RETURN(EINVAL);
}
-
if (len == 0) {
return 0;
}
- if (select_posix_path() == POSIX_KERNEL || // maybe fd is created by open before posix_api_init called
- select_fd_posix_path(sockfd, NULL) == POSIX_KERNEL) {
- return posix_api->recv_fn(sockfd, buf, len, flags);
+ if (select_sock_posix_path(lwip_get_socket(sockfd)) == POSIX_LWIP) {
+ return g_wrap_api->recv_fn(sockfd, buf, len, flags);
}
-
- return g_wrap_api->recv_fn(sockfd, buf, len, flags);
+ return posix_api->recv_fn(sockfd, buf, len, flags);
}
static inline ssize_t do_read(int32_t s, void *mem, size_t len)
@@ -491,58 +480,46 @@ static inline ssize_t do_read(int32_t s, void *mem, size_t len)
if (mem == NULL) {
GAZELLE_RETURN(EINVAL);
}
-
if (len == 0) {
return 0;
}
- if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(s, NULL) == POSIX_KERNEL) {
- return posix_api->read_fn(s, mem, len);
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
+ return g_wrap_api->read_fn(s, mem, len);
}
-
- return g_wrap_api->read_fn(s, mem, len);
+ return posix_api->read_fn(s, mem, len);
}
static inline ssize_t do_readv(int32_t s, const struct iovec *iov, int iovcnt)
{
- if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(s, NULL) == POSIX_KERNEL) {
- return posix_api->readv_fn(s, iov, iovcnt);
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
+ return g_wrap_api->readv_fn(s, iov, iovcnt);
}
-
- return g_wrap_api->readv_fn(s, iov, iovcnt);
+ return posix_api->readv_fn(s, iov, iovcnt);
}
static inline ssize_t do_send(int32_t sockfd, const void *buf, size_t len, int32_t flags)
{
- if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(sockfd, NULL) == POSIX_KERNEL) {
- return posix_api->send_fn(sockfd, buf, len, flags);
+ if (select_sock_posix_path(lwip_get_socket(sockfd)) == POSIX_LWIP) {
+ return g_wrap_api->send_fn(sockfd, buf, len, flags);
}
-
- return g_wrap_api->send_fn(sockfd, buf, len, flags);
+ return posix_api->send_fn(sockfd, buf, len, flags);
}
static inline ssize_t do_write(int32_t s, const void *mem, size_t size)
{
- if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(s, NULL) == POSIX_KERNEL) {
- return posix_api->write_fn(s, mem, size);
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
+ return g_wrap_api->write_fn(s, mem, size);
}
-
- return g_wrap_api->write_fn(s, mem, size);
+ return posix_api->write_fn(s, mem, size);
}
static inline ssize_t do_writev(int32_t s, const struct iovec *iov, int iovcnt)
{
- struct lwip_sock *sock;
- if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(s, &sock) == POSIX_KERNEL) {
- return posix_api->writev_fn(s, iov, iovcnt);
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
+ return g_wrap_api->writev_fn(s, iov, iovcnt);
}
-
- return g_wrap_api->writev_fn(s, iov, iovcnt);
+ return posix_api->writev_fn(s, iov, iovcnt);
}
static inline ssize_t do_recvmsg(int32_t s, struct msghdr *message, int32_t flags)
@@ -551,12 +528,10 @@ static inline ssize_t do_recvmsg(int32_t s, struct msghdr *message, int32_t flag
GAZELLE_RETURN(EINVAL);
}
- if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(s, NULL) == POSIX_KERNEL) {
- return posix_api->recv_msg(s, message, flags);
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
+ return g_wrap_api->recvmsg_fn(s, message, flags);
}
-
- return g_wrap_api->recv_msg(s, message, flags);
+ return posix_api->recvmsg_fn(s, message, flags);
}
static inline ssize_t do_sendmsg(int32_t s, const struct msghdr *message, int32_t flags)
@@ -565,13 +540,10 @@ static inline ssize_t do_sendmsg(int32_t s, const struct msghdr *message, int32_
GAZELLE_RETURN(EINVAL);
}
- struct lwip_sock *sock;
- if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(s, &sock) == POSIX_KERNEL) {
- return posix_api->send_msg(s, message, flags);
+ if (select_sock_posix_path(lwip_get_socket(s)) == POSIX_LWIP) {
+ return g_wrap_api->sendmsg_fn(s, message, flags);
}
-
- return g_wrap_api->send_msg(s, message, flags);
+ return posix_api->sendmsg_fn(s, message, flags);
}
static inline ssize_t do_recvfrom(int32_t sockfd, void *buf, size_t len, int32_t flags,
@@ -580,58 +552,48 @@ static inline ssize_t do_recvfrom(int32_t sockfd, void *buf, size_t len, int32_t
if (buf == NULL) {
GAZELLE_RETURN(EINVAL);
}
-
if (len == 0) {
return 0;
}
- struct lwip_sock *sock = NULL;
- if (select_fd_posix_path(sockfd, &sock) == POSIX_LWIP) {
- return g_wrap_api->recv_from(sockfd, buf, len, flags, addr, addrlen);
+ if (select_sock_posix_path(lwip_get_socket(sockfd)) == POSIX_LWIP) {
+ return g_wrap_api->recvfrom_fn(sockfd, buf, len, flags, addr, addrlen);
}
-
- return posix_api->recv_from(sockfd, buf, len, flags, addr, addrlen);
+ return posix_api->recvfrom_fn(sockfd, buf, len, flags, addr, addrlen);
}
static inline ssize_t do_sendto(int32_t sockfd, const void *buf, size_t len, int32_t flags,
const struct sockaddr *addr, socklen_t addrlen)
{
- struct lwip_sock *sock = NULL;
- if (select_fd_posix_path(sockfd, &sock) != POSIX_LWIP) {
- return posix_api->send_to(sockfd, buf, len, flags, addr, addrlen);
+ if (select_sock_posix_path(lwip_get_socket(sockfd)) == POSIX_LWIP) {
+ return g_wrap_api->sendto_fn(sockfd, buf, len, flags, addr, addrlen);
}
-
- return g_wrap_api->send_to(sockfd, buf, len, flags, addr, addrlen);
+ return posix_api->sendto_fn(sockfd, buf, len, flags, addr, addrlen);
}
-static inline int32_t do_close(int32_t s)
+static inline int32_t do_close(int fd)
{
- struct lwip_sock *sock = NULL;
+ /* Can not use select_sock_posix_path() !
+ * When fd created by lwip_stocket() set as POSIX_KERNEL,
+ * lwip_close() is still required.
+ */
if (select_posix_path() == POSIX_KERNEL ||
- select_fd_posix_path(s, &sock) == POSIX_KERNEL) {
- /* we called lwip_socket, even if kernel fd */
- if (posix_api != NULL && !posix_api->ues_posix &&
- /* contain posix_api->close_fn if success */
- g_wrap_api->close_fn(s) == 0) {
- return 0;
- } else {
- return posix_api->close_fn(s);
- }
+ POSIX_IS_CLOSED(lwip_get_socket(fd))) {
+ return posix_api->close_fn(fd);
}
- return g_wrap_api->close_fn(s);
+ return g_wrap_api->close_fn(fd);
}
static int32_t do_shutdown(int fd, int how)
{
- struct lwip_sock *sock = NULL;
- if (select_posix_path() == POSIX_KERNEL || select_fd_posix_path(fd, &sock) == POSIX_KERNEL) {
- if (posix_api != NULL && !posix_api->ues_posix && g_wrap_api->shutdown_fn(fd, how) == 0) {
- return 0;
- } else {
- return posix_api->shutdown_fn(fd, how);
- }
+ /* Can not use select_sock_posix_path() !
+ * When fd created by lwip_stocket() set as POSIX_KERNEL,
+ * lwip_close() is still required.
+ */
+ if (select_posix_path() == POSIX_KERNEL ||
+ POSIX_IS_CLOSED(lwip_get_socket(fd))) {
+ return posix_api->shutdown_fn(fd, how);
}
-
return g_wrap_api->shutdown_fn(fd, how);
}
@@ -660,15 +622,13 @@ static int32_t do_ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *
return ready;
}
-typedef int32_t (*sigaction_fn)(int32_t signum, const struct sigaction *act, struct sigaction *oldact);
static int32_t do_sigaction(int32_t signum, const struct sigaction *act, struct sigaction *oldact)
{
- if (posix_api == NULL) {
- sigaction_fn sf = (sigaction_fn)dlsym(RTLD_NEXT, "sigaction");
- if (sf == NULL) {
- return -1;
+ if (unlikely(posix_api == NULL)) {
+ if (posix_api_init() != 0) {
+ GAZELLE_RETURN(EAGAIN);
}
- return sf(signum, act, oldact);
+ return posix_api->sigaction_fn(signum, act, oldact);
}
return lstack_sigaction(signum, act, oldact);
@@ -676,10 +636,14 @@ static int32_t do_sigaction(int32_t signum, const struct sigaction *act, struct
static int32_t do_select(int32_t nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
{
- if ((select_posix_path() == POSIX_KERNEL) || !(readfds || writefds || exceptfds) || nfds == 0) {
+ if (nfds <= 0 || !(readfds || writefds || exceptfds)) {
+ GAZELLE_RETURN(EINVAL);
+ }
+
+ if (select_posix_path() == POSIX_KERNEL) {
return posix_api->select_fn(nfds, readfds, writefds, exceptfds, timeout);
}
-
+
return g_wrap_api->select_fn(nfds, readfds, writefds, exceptfds, timeout);
}
@@ -690,9 +654,9 @@ static int32_t do_select(int32_t nfds, fd_set *readfds, fd_set *writefds, fd_set
va_start(ap, _cmd); \
val = va_arg(ap, typeof(val)); \
va_end(ap); \
- struct lwip_sock *sock = NULL; \
+ struct lwip_sock *sock = lwip_get_socket(_fd); \
if (select_posix_path() == POSIX_KERNEL || \
- select_fd_posix_path(_fd, &sock) == POSIX_KERNEL) \
+ select_sock_posix_path(sock) == POSIX_KERNEL) \
return _fcntl_fn(_fd, _cmd, val); \
int32_t ret1 = _fcntl_fn(_fd, _cmd, val); \
if (ret1 == -1) { \
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index 5545b9f..f1e3064 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -764,7 +764,7 @@ void control_server_thread(void *arg)
struct epoll_event evt_array;
while (1) {
/* wait init finish */
- if (posix_api->ues_posix) {
+ if (posix_api->use_kernel) {
usleep(GAZELLE_10MS);
continue;
}
@@ -813,7 +813,7 @@ void control_client_thread(void *arg)
while (1) {
/* wait init finish */
- if (posix_api->ues_posix) {
+ if (posix_api->use_kernel) {
usleep(GAZELLE_10MS);
continue;
}
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index 1b3882e..54ee97e 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -123,7 +123,7 @@ void gazelle_exit(void)
__attribute__((destructor)) void gazelle_network_exit(void)
{
- if (posix_api != NULL && !posix_api->ues_posix) {
+ if (posix_api != NULL && !posix_api->use_kernel) {
lwip_exit();
gazelle_exit();
}
@@ -324,7 +324,7 @@ __attribute__((constructor)) void gazelle_network_init(void)
LSTACK_EXIT(1, "set_process_start_flag failed\n");
}
- posix_api->ues_posix = 0;
+ posix_api->use_kernel = 0;
LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n");
rte_smp_mb();
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 84ef782..2b39d05 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -79,6 +79,7 @@ static void reset_sock_data(struct lwip_sock *sock)
sock->send_pre_del = NULL;
}
+ sock->type = 0;
sock->stack = NULL;
sock->wakeup = NULL;
sock->listen_next = NULL;
@@ -1167,7 +1168,7 @@ void do_lwip_connected_callback(struct netconn *conn)
int32_t fd = conn->callback_arg.socket;
struct lwip_sock *sock = lwip_get_socket(fd);
- if (sock == NULL || sock->conn == NULL) {
+ if (POSIX_IS_CLOSED(sock)) {
return;
}
@@ -1208,7 +1209,7 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s
conn->fd = netconn->callback_arg.socket;
conn->recv_cnt = (netconn->recvmbox == NULL) ? 0 : rte_ring_count(netconn->recvmbox->ring);
struct lwip_sock *sock = lwip_get_socket(netconn->callback_arg.socket);
- if (sock != NULL && sock->conn != NULL) {
+ if (!POSIX_IS_CLOSED(sock)) {
conn->recv_ring_cnt = (sock->recv_ring == NULL) ? 0 : gazelle_ring_readable_count(sock->recv_ring);
conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0;
conn->send_ring_cnt = (sock->send_ring == NULL) ? 0 : gazelle_ring_readover_count(sock->send_ring);
diff --git a/src/lstack/core/lstack_preload.c b/src/lstack/core/lstack_preload.c
index 8cf4657..689d2bf 100644
--- a/src/lstack/core/lstack_preload.c
+++ b/src/lstack/core/lstack_preload.c
@@ -79,17 +79,22 @@ static void preload_get_thrdname(void)
LSTACK_PRE_LOG(LSTACK_INFO, "thread name=%s ok\n", g_preload_info.env_thrdname);
}
-enum posix_type select_fd_posix_path(int32_t fd, struct lwip_sock **socket)
+enum posix_type select_sock_posix_path(struct lwip_sock *sock)
{
- struct lwip_sock *sock = lwip_get_socket(fd);
-
- /* AF_UNIX case */
- if (!sock || !sock->conn || POSIX_IS_TYPE(sock, POSIX_KERNEL)) {
+ if (unlikely(posix_api == NULL)) {
+ /*
+ * read/write/readv/writev may not be sockfd,
+ * posix api maybe not init.
+ */
+ if (posix_api_init() != 0) {
+ LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
+ }
return POSIX_KERNEL;
}
- if (socket) {
- *socket = sock;
+ /* CLOSED means not sockfd, such as file fd or unix fd */
+ if (POSIX_IS_CLOSED(sock) || POSIX_IS_TYPE(sock, POSIX_KERNEL)) {
+ return POSIX_KERNEL;
}
if (likely(POSIX_IS_TYPE(sock, POSIX_LWIP))) {
@@ -112,11 +117,11 @@ enum posix_type select_posix_path(void)
return POSIX_KERNEL;
}
- if (unlikely(posix_api->ues_posix)) {
+ if (unlikely(posix_api->use_kernel)) {
return POSIX_KERNEL;
}
- if (g_preload_thrdpath != POSIX_ALL) {
+ if (likely(g_preload_thrdpath != POSIX_ALL)) {
return g_preload_thrdpath;
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index d17cb67..a809d8c 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -127,7 +127,7 @@ struct protocol_stack *get_protocol_stack(void)
struct protocol_stack *get_protocol_stack_by_fd(int32_t fd)
{
struct lwip_sock *sock = lwip_get_socket(fd);
- if (sock == NULL || sock->conn == NULL) {
+ if (POSIX_IS_CLOSED(sock)) {
return NULL;
}
@@ -1126,7 +1126,7 @@ int32_t stack_broadcast_close(int32_t fd)
ret = -1;
}
- if (sock == NULL || sock->conn == NULL) {
+ if (POSIX_IS_CLOSED(sock)) {
break;
}
fd = sock->conn->callback_arg.socket;
@@ -1151,7 +1151,7 @@ int stack_broadcast_shutdown(int fd, int how)
ret = -1;
}
- if (sock == NULL || sock->conn == NULL) {
+ if (POSIX_IS_CLOSED(sock)) {
break;
}
fd = sock->conn->callback_arg.socket;
@@ -1357,7 +1357,7 @@ static void stack_all_fds_close(void)
{
for (int i = 3; i < GAZELLE_MAX_CLIENTS + GAZELLE_RESERVED_CLIENTS; i++) {
struct lwip_sock *sock = lwip_get_socket(i);
- if (sock && sock->conn && sock->stack == get_protocol_stack()) {
+ if (!POSIX_IS_CLOSED(sock) && sock->stack == get_protocol_stack()) {
lwip_close(i);
}
}
diff --git a/src/lstack/include/lstack_preload.h b/src/lstack/include/lstack_preload.h
index c30736a..d4ad385 100644
--- a/src/lstack/include/lstack_preload.h
+++ b/src/lstack/include/lstack_preload.h
@@ -11,9 +11,9 @@
*/
#ifndef __LSTACK_PRELOAD_H__
#define __LSTACK_PRELOAD_H__
-#include <stdbool.h>
enum posix_type select_posix_path(void);
-enum posix_type select_fd_posix_path(int32_t fd, struct lwip_sock **socket);
+enum posix_type select_sock_posix_path(struct lwip_sock *sock);
int preload_info_init(void);
-#endif
+
+#endif /* __LSTACK_PRELOAD_H__ */
diff --git a/src/lstack/netif/lstack_flow.c b/src/lstack/netif/lstack_flow.c
index 84c5c61..1ca3314 100644
--- a/src/lstack/netif/lstack_flow.c
+++ b/src/lstack/netif/lstack_flow.c
@@ -19,6 +19,7 @@
#include <uthash.h>
#include <lwip/lwipgz_posix_api.h>
+#include <lwip/sys.h>
#include <lwip/tcp.h>
#include <lwip/prot/tcp.h>
--
2.33.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。