From be28f36adfebb0e5f7f2340638120a19f5b2eaa6 Mon Sep 17 00:00:00 2001 From: hankangkang Date: Thu, 14 Nov 2024 20:16:14 +0800 Subject: [PATCH] suport kernel accept for openGauss --- src/lstack/api/lstack_wrap.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c index 66cea51..6ab31f6 100644 --- a/src/lstack/api/lstack_wrap.c +++ b/src/lstack/api/lstack_wrap.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -102,14 +103,22 @@ static inline int32_t do_accept(int32_t s, struct sockaddr *addr, socklen_t *add return posix_api->accept_fn(s, addr, addrlen); } - int32_t fd = g_wrap_api->accept_fn(s, addr, addrlen); + int fd = 0; + struct lwip_sock *sock = lwip_get_socket(s); + if (POSIX_HAS_TYPE(sock, POSIX_KERNEL)) { + fd = posix_api->accept4_fn(s, addr, addrlen, SOCK_NONBLOCK); + if (fd >= 0) { + return fd; + } + } + + fd = g_wrap_api->accept_fn(s, addr, addrlen); if (fd >= 0) { - struct lwip_sock *sock = lwip_get_socket(fd); + sock = lwip_get_socket(fd); POSIX_SET_TYPE(sock, POSIX_LWIP); - return fd; } - return posix_api->accept_fn(s, addr, addrlen); + return fd; } static int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *addrlen, int32_t flags) @@ -132,6 +141,22 @@ static int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *addrlen, return posix_api->accept4_fn(s, addr, addrlen, flags); } +static inline int sock_set_nonblocking(int fd) +{ + int flags = posix_api->fcntl_fn(fd, F_GETFL, 0); + if (flags == -1) { + LSTACK_LOG(ERR, LSTACK, " get block status faild errno %d.\n", errno); + return -1; + } + // set nonblock + flags |= O_NONBLOCK; + if (posix_api->fcntl_fn(fd, F_SETFL, flags) == -1) { + LSTACK_LOG(ERR, LSTACK, " set non_block status faild errno %d.\n", errno); + return -1; + } + return 0; +} + static int kernel_bind_process(int32_t s, const struct sockaddr *name, socklen_t namelen) { struct lwip_sock *sock = lwip_get_socket(s); @@ -165,6 +190,7 @@ static int kernel_bind_process(int32_t s, const struct sockaddr *name, socklen_t ((struct sockaddr_in *)name)->sin_port = kerneladdr.sin_port; } /* not sure POSIX_LWIP or POSIX_KERNEL */ + sock_set_nonblocking(s); } else { POSIX_SET_TYPE(sock, POSIX_LWIP); LSTACK_LOG(ERR, LSTACK, "kernel bind failed ret %d errno %d sa_family %u times %u\n", -- 2.33.0