代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/gazelle 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 0f126e8723824823cddc608c2a6493ea9fc99e89 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Tue, 8 Mar 2022 10:59:59 +0800
Subject: [PATCH 04/34] recvmsg/sendmsg should use
recvmsg_from_stack/sendmsg_to_stack instead of
rpc_call_recvmsg/rpc_call_sendmsg
---
src/lstack/api/lstack_wrap.c | 33 +--------------
src/lstack/core/lstack_lwip.c | 88 ++++++++++++++++++++++++++++++++++++++++
src/lstack/include/lstack_lwip.h | 3 ++
3 files changed, 93 insertions(+), 31 deletions(-)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index 6488c62..7804ce9 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -103,10 +103,6 @@ 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 (addr == NULL || addrlen == NULL) {
- GAZELLE_RETURN(EINVAL);
- }
-
if (select_path(s) == PATH_KERNEL) {
return posix_api->accept_fn(s, addr, addrlen);
}
@@ -292,31 +288,6 @@ static inline ssize_t do_read(int32_t s, void *mem, size_t len)
return posix_api->read_fn(s, mem, len);
}
-static inline ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags)
-{
- if (buf == NULL) {
- GAZELLE_RETURN(EINVAL);
- }
-
- if (len == 0) {
- return 0;
- }
-
- struct lwip_sock *sock = get_socket(fd);
- if (sock == NULL) {
- GAZELLE_RETURN(EINVAL);
- }
-
- ssize_t send = write_stack_data(sock, buf, len);
- if (send < 0 || sock->have_rpc_send) {
- return send;
- }
-
- sock->have_rpc_send = true;
- ssize_t ret = rpc_call_send(fd, buf, len, flags);
- return (ret < 0) ? ret : send;
-}
-
static inline ssize_t do_send(int32_t sockfd, const void *buf, size_t len, int32_t flags)
{
if (select_path(sockfd) != PATH_LWIP) {
@@ -342,7 +313,7 @@ static inline ssize_t do_recvmsg(int32_t s, struct msghdr *message, int32_t flag
}
if (select_path(s) == PATH_LWIP) {
- return rpc_call_recvmsg(s, message, flags);
+ return recvmsg_from_stack(s, message, flags);
}
return posix_api->recv_msg(s, message, flags);
@@ -355,7 +326,7 @@ static inline ssize_t do_sendmsg(int32_t s, const struct msghdr *message, int32_
}
if (select_path(s) == PATH_LWIP) {
- return rpc_call_sendmsg(s, message, flags);
+ return sendmsg_to_stack(s, message, flags);
}
return posix_api->send_msg(s, message, flags);
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index fbb4d62..0a71aae 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -386,6 +386,94 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags)
return recv_len;
}
+ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags)
+{
+ ssize_t buflen = 0;
+ int32_t i;
+
+ if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ for (i = 0; i < message->msg_iovlen; i++) {
+ if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) ||
+ ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) ||
+ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len);
+ }
+ buflen = 0;
+ for (i = 0; i < message->msg_iovlen; i++) {
+ ssize_t recvd_local = read_stack_data(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags);
+ if (recvd_local > 0) {
+ buflen += recvd_local;
+ }
+ if (recvd_local < 0 || (recvd_local < (int)message->msg_iov[i].iov_len) || (flags & MSG_PEEK)) {
+ if (buflen <= 0) {
+ buflen = recvd_local;
+ }
+ break;
+ }
+ flags |= MSG_DONTWAIT;
+ }
+
+ return buflen;
+}
+
+ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags)
+{
+ if (buf == NULL) {
+ GAZELLE_RETURN(EINVAL);
+ }
+
+ if (len == 0) {
+ return 0;
+ }
+
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL) {
+ GAZELLE_RETURN(EINVAL);
+ }
+
+ ssize_t send = write_stack_data(sock, buf, len);
+ if (send < 0 || sock->have_rpc_send) {
+ return send;
+ }
+
+ sock->have_rpc_send = true;
+ ssize_t ret = rpc_call_send(fd, buf, len, flags);
+ return (ret < 0) ? ret : send;
+}
+
+ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags)
+{
+ int32_t ret;
+ int32_t i;
+ ssize_t buflen = 0;
+
+ if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ for (i = 0; i < message->msg_iovlen; i++) {
+ if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) ||
+ ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) ||
+ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len);
+ }
+
+ for (i = 0; i < message->msg_iovlen; i++) {
+ ret = gazelle_send(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags);
+ if (ret < 0) {
+ return buflen == 0 ? ret : buflen;
+ }
+ buflen += ret;
+ }
+
+ return buflen;
+}
+
ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
{
size_t recv_left = len;
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index 8bf0f29..581b9fe 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -39,5 +39,8 @@ void stack_recvlist_count(struct rpc_msg *msg);
void stack_replenish_send_idlembuf(struct protocol_stack *stack);
int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num);
void gazelle_free_pbuf(struct pbuf *pbuf);
+ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags);
+ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags);
+ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags);
#endif
--
1.8.3.1
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。