From 2f7ca29c8b7a93079a5579062fc6751a6be6fd0c Mon Sep 17 00:00:00 2001 From: Lemmy Huang Date: Wed, 10 Jul 2024 11:08:07 +0800 Subject: [PATCH] cleancode: refactor lwipsock.h Signed-off-by: Lemmy Huang --- src/lstack/api/lstack_rtc_api.c | 7 +--- src/lstack/api/lstack_wrap.c | 11 ++++-- src/lstack/core/lstack_init.c | 3 -- src/lstack/core/lstack_lwip.c | 45 ++++++++----------------- src/lstack/core/lstack_protocol_stack.c | 26 ++++---------- src/lstack/include/lstack_lwip.h | 7 ++-- 6 files changed, 33 insertions(+), 66 deletions(-) diff --git a/src/lstack/api/lstack_rtc_api.c b/src/lstack/api/lstack_rtc_api.c index e77edec..57ff89f 100644 --- a/src/lstack/api/lstack_rtc_api.c +++ b/src/lstack/api/lstack_rtc_api.c @@ -68,12 +68,7 @@ int rtc_close(int s) return lstack_epoll_close(s); } - lwip_close(s); - if (sock != NULL) { - list_del_node_null(&sock->event_list); - } - - return posix_api->close_fn(s); + return lwip_close(s); } int rtc_shutdown(int fd, int how) diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c index cf0d302..16fc876 100644 --- a/src/lstack/api/lstack_wrap.c +++ b/src/lstack/api/lstack_wrap.c @@ -175,6 +175,8 @@ static inline int32_t do_accept(int32_t s, struct sockaddr *addr, socklen_t *add int32_t fd = g_wrap_api->accept_fn(s, addr, addrlen); if (fd >= 0) { + struct lwip_sock *sock = get_socket(fd); + SET_CONN_TYPE_LIBOS(sock->conn); return fd; } @@ -193,6 +195,8 @@ static int32_t do_accept4(int32_t s, struct sockaddr *addr, socklen_t *addrlen, int32_t fd = g_wrap_api->accept4_fn(s, addr, addrlen, flags); if (fd >= 0) { + struct lwip_sock *sock = get_socket(fd); + SET_CONN_TYPE_LIBOS(sock->conn); return fd; } @@ -452,10 +456,11 @@ static inline int32_t do_socket(int32_t domain, int32_t type, int32_t protocol) } ret = g_wrap_api->socket_fn(domain, type, protocol); - /* if udp_enable = 1 in lstack.conf, udp protocol must be in user path currently */ - if ((ret >= 0) && (type & SOCK_DGRAM)) { + if (ret >= 0) { struct lwip_sock *sock = get_socket(ret); - if (sock != NULL && sock->conn != NULL) { + SET_CONN_TYPE_LIBOS_OR_HOST(sock->conn); + /* if udp_enable = 1 in lstack.conf, udp protocol must be in user path currently */ + if (type & SOCK_DGRAM) { SET_CONN_TYPE_LIBOS(sock->conn); } } diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c index a5a4a4e..1b3882e 100644 --- a/src/lstack/core/lstack_init.c +++ b/src/lstack/core/lstack_init.c @@ -313,9 +313,6 @@ __attribute__((constructor)) void gazelle_network_init(void) } } - /* lwip initialization */ - lwip_sock_init(); - #if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0) if (get_global_cfg_params()->kni_switch) { set_kni_ip_mac(); diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c index 75ef5f6..6fe4055 100644 --- a/src/lstack/core/lstack_lwip.c +++ b/src/lstack/core/lstack_lwip.c @@ -144,12 +144,12 @@ static bool replenish_send_idlembuf(struct protocol_stack *stack, struct lwip_so return false; } -void do_lwip_init_sock(int32_t fd) +int do_lwip_init_sock(int32_t fd) { struct protocol_stack *stack = get_protocol_stack(); - struct lwip_sock *sock = get_socket(fd); + struct lwip_sock *sock = get_socket_by_fd(fd); if (sock == NULL) { - return; + return -1; } reset_sock_data(sock); @@ -157,7 +157,7 @@ void do_lwip_init_sock(int32_t fd) sock->recv_ring = gazelle_ring_create_fast("sock_recv", SOCK_RECV_RING_SIZE, RING_F_SP_ENQ | RING_F_SC_DEQ); if (sock->recv_ring == NULL) { LSTACK_LOG(ERR, LSTACK, "sock_recv create failed. errno: %d.\n", rte_errno); - return; + return -1; } sock->send_ring = gazelle_ring_create_fast("sock_send", @@ -166,7 +166,7 @@ void do_lwip_init_sock(int32_t fd) if (sock->send_ring == NULL) { gazelle_ring_free_fast(sock->recv_ring); LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno); - return; + return -1; } (void)replenish_send_idlembuf(stack, sock); @@ -174,6 +174,7 @@ void do_lwip_init_sock(int32_t fd) init_list_node_null(&sock->recv_list); init_list_node_null(&sock->event_list); + return 0; } void do_lwip_clean_sock(int fd) @@ -1237,32 +1238,6 @@ void do_lwip_clone_sockopt(struct lwip_sock *dst_sock, struct lwip_sock *src_soc } } -int do_lwip_close(int fd) -{ - int ret = lwip_close(fd); - do_lwip_clean_sock(fd); - posix_api->close_fn(fd); - return ret; -} - -int do_lwip_socket(int domain, int type, int protocol) -{ - int32_t fd = lwip_socket(domain, type, 0); - if (fd < 0) { - return fd; - } - - do_lwip_init_sock(fd); - - struct lwip_sock *sock = get_socket(fd); - if (sock == NULL || sock->stack == NULL) { - do_lwip_close(fd); - return -1; - } - - return fd; -} - uint32_t do_lwip_get_conntable(struct gazelle_stat_lstack_conn_info *conn, uint32_t max_num) { @@ -1583,3 +1558,11 @@ err_t find_same_node_ring(struct tcp_pcb *npcb) } return 0; } + +unsigned same_node_ring_count(struct lwip_sock *sock) +{ + const unsigned long long cur_begin = __atomic_load_n(&sock->same_node_rx_ring->sndbegin, __ATOMIC_RELAXED); + const unsigned long long cur_end = __atomic_load_n(&sock->same_node_rx_ring->sndend, __ATOMIC_RELAXED); + + return cur_end - cur_begin; +} diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c index d8bdd3c..c6075d5 100644 --- a/src/lstack/core/lstack_protocol_stack.c +++ b/src/lstack/core/lstack_protocol_stack.c @@ -424,11 +424,6 @@ static struct protocol_stack *stack_thread_init(void *arg) } RTE_PER_LCORE(_lcore_id) = stack->cpu_id; - if (hugepage_init() != 0) { - LSTACK_LOG(ERR, LSTACK, "hugepage init failed\n"); - goto END; - } - tcpip_init(NULL, NULL); if (use_ltran()) { @@ -714,12 +709,9 @@ void stack_arp(struct rpc_msg *msg) void stack_socket(struct rpc_msg *msg) { - msg->result = do_lwip_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); + msg->result = lwip_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); if (msg->result < 0) { - msg->result = do_lwip_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i); - if (msg->result < 0) { - LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result); - } + LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result); } } @@ -735,7 +727,7 @@ void stack_close(struct rpc_msg *msg) return; } - msg->result = do_lwip_close(fd); + msg->result = lwip_close(fd); if (msg->result != 0) { LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i, msg->result); } @@ -803,7 +795,7 @@ void stack_accept(struct rpc_msg *msg) struct lwip_sock *sock = get_socket(accept_fd); if (sock == NULL || sock->stack == NULL) { - do_lwip_close(accept_fd); + lwip_close(accept_fd); LSTACK_LOG(ERR, LSTACK, "fd %d ret %d\n", fd, accept_fd); return; } @@ -1046,12 +1038,8 @@ void stack_create_shadow_fd(struct rpc_msg *msg) } int domain = addr->sa_family; - if (NETCONN_IS_UDP(sock)) { - clone_fd = do_lwip_socket(domain, SOCK_DGRAM, 0); - } else { - clone_fd = do_lwip_socket(domain, SOCK_STREAM, 0); - } - + int type = NETCONN_IS_UDP(sock) ? SOCK_DGRAM : SOCK_STREAM; + clone_fd = lwip_socket(domain, type, 0); if (clone_fd < 0) { LSTACK_LOG(ERR, LSTACK, "clone socket failed clone_fd=%d errno=%d\n", clone_fd, errno); msg->result = clone_fd; @@ -1370,7 +1358,7 @@ static void stack_all_fds_close(void) for (int i = 3; i < GAZELLE_MAX_CLIENTS + GAZELLE_RESERVED_CLIENTS; i++) { struct lwip_sock *sock = get_socket(i); if (sock && sock->stack == get_protocol_stack()) { - do_lwip_close(i); + lwip_close(i); } } } diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h index 0b952ec..b972f11 100644 --- a/src/lstack/include/lstack_lwip.h +++ b/src/lstack/include/lstack_lwip.h @@ -16,21 +16,20 @@ #include "common/gazelle_dfx_msg.h" +struct lwip_sock; +unsigned same_node_ring_count(struct lwip_sock *sock); + #define NETCONN_IS_ACCEPTIN(sock) (((sock)->conn->acceptmbox != NULL) && !sys_mbox_empty((sock)->conn->acceptmbox)) #define NETCONN_IS_DATAIN(sock) ((gazelle_ring_readable_count((sock)->recv_ring) || (sock)->recv_lastdata) || (sock->same_node_rx_ring != NULL && same_node_ring_count(sock))) #define NETCONN_IS_DATAOUT(sock) (gazelle_ring_readover_count((sock)->send_ring) || (sock)->send_pre_del) #define NETCONN_IS_OUTIDLE(sock) gazelle_ring_readable_count((sock)->send_ring) #define NETCONN_IS_UDP(sock) (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) == NETCONN_UDP) -struct lwip_sock; struct rte_mempool; struct rpc_msg; struct rte_mbuf; struct protocol_stack; -int do_lwip_socket(int domain, int type, int protocol); -int do_lwip_close(int32_t fd); -void do_lwip_init_sock(int32_t fd); void do_lwip_clone_sockopt(struct lwip_sock *dst_sock, struct lwip_sock *src_sock); struct pbuf *do_lwip_tcp_get_from_sendring(struct lwip_sock *sock, uint16_t remain_size); -- 2.33.0