代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/gazelle 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From e1bdd31e6f4ec0aa426cdc2e24b2c78fb7903cfe Mon Sep 17 00:00:00 2001
From: yangchen <yangchen145@huawei.com>
Date: Wed, 6 Dec 2023 09:26:45 +0800
Subject: [PATCH] wrap: support shutdown
---
src/lstack/api/lstack_rtc_api.c | 5 +++
src/lstack/api/lstack_rtw_api.c | 13 +++++++
src/lstack/api/lstack_wrap.c | 24 ++++++++++++
src/lstack/core/lstack_dpdk.c | 2 +-
src/lstack/core/lstack_protocol_stack.c | 45 ++++++++++++++++++++++
src/lstack/core/lstack_thread_rpc.c | 16 ++++++++
src/lstack/include/lstack_protocol_stack.h | 3 ++
src/lstack/include/lstack_rtc_api.h | 1 +
src/lstack/include/lstack_rtw_api.h | 1 +
src/lstack/include/lstack_thread_rpc.h | 1 +
10 files changed, 110 insertions(+), 1 deletion(-)
diff --git a/src/lstack/api/lstack_rtc_api.c b/src/lstack/api/lstack_rtc_api.c
index 5fad3e8..50d72bc 100644
--- a/src/lstack/api/lstack_rtc_api.c
+++ b/src/lstack/api/lstack_rtc_api.c
@@ -65,6 +65,11 @@ int rtc_close(int s)
return lwip_close(s);
}
+int rtc_shutdown(int fd, int how)
+{
+ return lwip_shutdown(fd, how);
+}
+
int rtc_epoll_create(int flags)
{
if (stack_setup_app_thread() < 0) {
diff --git a/src/lstack/api/lstack_rtw_api.c b/src/lstack/api/lstack_rtw_api.c
index c524bf9..04944d5 100644
--- a/src/lstack/api/lstack_rtw_api.c
+++ b/src/lstack/api/lstack_rtw_api.c
@@ -22,8 +22,10 @@
#include "lstack_protocol_stack.h"
#include "lstack_cfg.h"
#include "lstack_lwip.h"
+#include "gazelle_base_func.h"
#include "lstack_rtw_api.h"
+
int rtw_socket(int domain, int type, int protocol)
{
return rpc_call_socket(domain, type, protocol);
@@ -228,6 +230,16 @@ int rtw_close(int s)
return stack_broadcast_close(s);
}
+int rtw_shutdown(int fd, int how)
+{
+ struct lwip_sock *sock = get_socket_by_fd(fd);
+ if (sock && sock->wakeup && sock->wakeup->epollfd == fd) {
+ GAZELLE_RETURN(ENOTSOCK);
+ }
+
+ return stack_broadcast_shutdown(fd, how);
+}
+
int rtw_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
{
return lstack_rtw_epoll_ctl(epfd, op, fd, event);
@@ -242,3 +254,4 @@ int rtw_epoll_create(int flags)
{
return lstack_epoll_create(flags);
}
+
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index abbf8a1..07d5f27 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -75,6 +75,7 @@ void wrap_api_init(void)
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;
@@ -103,6 +104,7 @@ void wrap_api_init(void)
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;
@@ -554,6 +556,20 @@ static inline int32_t do_close(int32_t s)
return g_wrap_api->close_fn(s);
}
+static int32_t do_shutdown(int fd, int how)
+{
+ struct lwip_sock *sock = NULL;
+ if (select_posix_path() == PATH_KERNEL || select_fd_posix_path(fd, &sock) == PATH_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);
+ }
+ }
+
+ return g_wrap_api->shutdown_fn(fd, how);
+}
+
static int32_t do_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
{
if ((select_posix_path() == PATH_KERNEL) || fds == NULL || nfds == 0) {
@@ -742,6 +758,10 @@ int32_t close(int32_t s)
{
return do_close(s);
}
+int32_t shutdown(int fd, int how)
+{
+ return do_shutdown(fd, how);
+}
int32_t poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
{
return do_poll(fds, nfds, timeout);
@@ -875,6 +895,10 @@ int32_t __wrap_close(int32_t s)
{
return do_close(s);
}
+int32_t __wrap_shutdown(int fd, int how)
+{
+ return do_shutdown(fd, how);
+}
int32_t __wrap_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
{
return do_poll(fds, nfds, timeout);
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index a742335..1811a9d 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -294,7 +294,7 @@ int32_t dpdk_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, ui
{
int32_t ret = rte_pktmbuf_alloc_bulk(pool, mbufs, num);
if (ret != 0) {
- LSTACK_LOG(ERR, LSTACK, "rte_pktmbuf_alloc_bulk fail allocNum=%d, ret=%d, info:=%s \n",
+ LSTACK_LOG(ERR, LSTACK, "rte_pktmbuf_alloc_bulk fail allocNum=%d, ret=%d, info:%s \n",
num, ret, rte_strerror(-ret));
return ret;
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 27eeafb..dc8f143 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -715,6 +715,27 @@ void stack_close(struct rpc_msg *msg)
posix_api->close_fn(fd);
}
+void stack_shutdown(struct rpc_msg *msg)
+{
+ int fd = msg->args[MSG_ARG_0].i;
+ int how = msg->args[MSG_ARG_1].i;
+ struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
+ struct lwip_sock *sock = get_socket(fd);
+
+ if (sock && NETCONN_IS_DATAOUT(sock)) {
+ msg->recall_flag = 1;
+ rpc_call(&stack->rpc_queue, msg);
+ return;
+ }
+
+ msg->result = lwip_shutdown(fd, how);
+ if (msg->result != 0) {
+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d fail %ld\n", get_stack_tid(), fd, msg->result);
+ }
+
+ posix_api->shutdown_fn(fd, how);
+}
+
void stack_bind(struct rpc_msg *msg)
{
msg->result = lwip_bind(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].cp, msg->args[MSG_ARG_2].socklen);
@@ -1041,6 +1062,29 @@ int32_t stack_broadcast_close(int32_t fd)
return ret;
}
+int stack_broadcast_shutdown(int fd, int how)
+{
+ int32_t ret = 0;
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL) {
+ return -1;
+ }
+
+ do {
+ sock = sock->listen_next;
+ if (rpc_call_shutdown(fd, how)) {
+ ret = -1;
+ }
+
+ if (sock == NULL || sock->conn == NULL) {
+ break;
+ }
+ fd = sock->conn->socket;
+ } while (sock);
+
+ return ret;
+}
+
/* choice one stack listen */
int32_t stack_single_listen(int32_t fd, int32_t backlog)
{
@@ -1204,3 +1248,4 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add
{
return stack_broadcast_accept4(fd, addr, addrlen, 0);
}
+
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index f23d935..4dc3da3 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -262,6 +262,21 @@ int32_t rpc_call_close(int fd)
return rpc_sync_call(&stack->rpc_queue, msg);
}
+int32_t rpc_call_shutdown(int fd, int how)
+{
+ struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
+
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_shutdown);
+ if (msg == NULL) {
+ return -1;
+ }
+
+ msg->args[MSG_ARG_0].i = fd;
+ msg->args[MSG_ARG_1].i = how;
+
+ return rpc_sync_call(&stack->rpc_queue, msg);
+}
+
void rpc_call_clean_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup)
{
struct rpc_msg *msg = rpc_msg_alloc(stack, stack_clean_epoll);
@@ -465,3 +480,4 @@ int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags)
return 0;
}
+
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 2c581b3..e339b8d 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -126,6 +126,8 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack
/* when fd is listenfd, listenfd of all protocol stack thread will be closed */
int32_t stack_broadcast_close(int32_t fd);
+int stack_broadcast_shutdown(int fd, int how);
+
/* listen sync to all protocol stack thread, so that any protocol stack thread can build connect */
int32_t stack_broadcast_listen(int32_t fd, int backlog);
int32_t stack_single_listen(int32_t fd, int32_t backlog);
@@ -152,6 +154,7 @@ void stack_clean_epoll(struct rpc_msg *msg);
void stack_arp(struct rpc_msg *msg);
void stack_socket(struct rpc_msg *msg);
void stack_close(struct rpc_msg *msg);
+void stack_shutdown(struct rpc_msg *msg);
void stack_bind(struct rpc_msg *msg);
void stack_listen(struct rpc_msg *msg);
void stack_accept(struct rpc_msg *msg);
diff --git a/src/lstack/include/lstack_rtc_api.h b/src/lstack/include/lstack_rtc_api.h
index dd90e59..3a41e6f 100644
--- a/src/lstack/include/lstack_rtc_api.h
+++ b/src/lstack/include/lstack_rtc_api.h
@@ -49,6 +49,7 @@ 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);
diff --git a/src/lstack/include/lstack_rtw_api.h b/src/lstack/include/lstack_rtw_api.h
index d0f77b7..a38b656 100644
--- a/src/lstack/include/lstack_rtw_api.h
+++ b/src/lstack/include/lstack_rtw_api.h
@@ -42,6 +42,7 @@ ssize_t rtw_sendto(int sockfd, const void *buf, size_t len, int flags,
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);
diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h
index aa8c451..13f5ec2 100644
--- a/src/lstack/include/lstack_thread_rpc.h
+++ b/src/lstack/include/lstack_thread_rpc.h
@@ -74,6 +74,7 @@ int32_t rpc_call_connnum(struct protocol_stack *stack);
int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf);
int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol);
int32_t rpc_call_close(int32_t fd);
+int32_t rpc_call_shutdown(int fd, int how);
int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen);
int32_t rpc_call_listen(int s, int backlog);
int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen, int flags);
--
2.27.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。