From a1523d108581cfc8aaf89b1116dde071ca5656d8 Mon Sep 17 00:00:00 2001 From: Lemmy Huang Date: Wed, 10 Jul 2024 17:40:43 +0800 Subject: [PATCH] cleancode: refactor posix_api Signed-off-by: Lemmy Huang --- 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 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 #include +#include #include #include -- 2.33.0