代码拉取完成,页面将自动刷新
From 8dfa19585b0e5b23e7855e1d544c41dd7a6a1dd9 Mon Sep 17 00:00:00 2001
From: yangchen <yangchen145@huawei.com>
Date: Fri, 15 Dec 2023 17:56:30 +0800
Subject: [PATCH] support netperf
---
src/lstack/api/lstack_wrap.c | 13 ++++++-------
src/lstack/core/lstack_lwip.c | 21 +++++++++++++++++++--
src/lstack/core/lstack_protocol_stack.c | 19 +++++++++++--------
src/lstack/include/posix/lstack_epoll.h | 19 +++++++++++++++++++
src/ltran/ltran_dfx.c | 2 +-
5 files changed, 56 insertions(+), 18 deletions(-)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index 65a0a5a..a226dc4 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -276,11 +276,6 @@ static int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t name
return posix_api->connect_fn(s, name, namelen);
}
- if (!netconn_is_nonblocking(sock->conn)) {
- LSTACK_LOG(ERR, LSTACK, "connect does not support blocking fd currently\n");
- GAZELLE_RETURN(EINVAL);
- }
-
int32_t ret = 0;
int32_t remote_port;
bool is_local = is_dst_ip_localhost(name);
@@ -347,7 +342,11 @@ static bool unsupport_optname(int32_t optname)
optname == SO_PROTOCOL ||
optname == TCP_QUICKACK ||
optname == SO_SNDTIMEO ||
- optname == SO_RCVTIMEO) {
+ optname == SO_RCVTIMEO ||
+ optname == SO_SNDBUF ||
+ optname == TCP_INFO ||
+ optname == TCP_MAXSEG ||
+ optname == TCP_CONGESTION) {
return true;
}
return false;
@@ -615,7 +614,7 @@ static int32_t do_select(int32_t nfds, fd_set *readfds, fd_set *writefds, fd_set
return posix_api->select_fn(nfds, readfds, writefds, exceptfds, timeout);
}
- return posix_api->select_fn(nfds, readfds, writefds, exceptfds, timeout);
+ return g_wrap_api->select_fn(nfds, readfds, writefds, exceptfds, timeout);
}
#define WRAP_VA_PARAM(_fd, _cmd, _lwip_fcntl, _fcntl_fn) \
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index fb286d6..a944f7a 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -564,6 +564,12 @@ static ssize_t do_lwip_fill_sendring(struct lwip_sock *sock, const void *buf, si
uint32_t write_avail = gazelle_ring_readable_count(sock->send_ring);
struct wakeup_poll *wakeup = sock->wakeup;
+ if (!netconn_is_nonblocking(sock->conn)) {
+ while (write_avail < write_num) {
+ write_avail = gazelle_ring_readable_count(sock->send_ring);
+ }
+ }
+
/* send_ring is full, data attach last pbuf */
if (write_avail == 0) {
if (!get_global_cfg_params()->expand_send_ring) {
@@ -1005,8 +1011,19 @@ ssize_t do_lwip_read_from_stack(int32_t fd, void *buf, size_t len, int32_t flags
pbuf = sock->recv_lastdata;
sock->recv_lastdata = NULL;
} else {
- if (gazelle_ring_read(sock->recv_ring, (void **)&pbuf, 1) != 1) {
- break;
+ if (netconn_is_nonblocking(sock->conn)) {
+ if (gazelle_ring_read(sock->recv_ring, (void **)&pbuf, 1) != 1) {
+ break;
+ }
+ } else {
+ while (gazelle_ring_read(sock->recv_ring, (void **)&pbuf, 1) != 1 && recvd == 0) {
+ /* if the connection is disconnected, recv return 0 */
+ if ((sock->errevent > 0 || (sock->conn->pcb.tcp->flags & TF_FIN)) && !NETCONN_IS_DATAIN(sock)) {
+ return 0;
+ }
+
+ lstack_block_wait(sock->wakeup);
+ }
}
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 8dbd9ad..414b5f8 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -268,12 +268,8 @@ static void wakeup_kernel_event(struct protocol_stack *stack)
continue;
}
- __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE);
- if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) {
- __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
- rte_mb();
- pthread_mutex_unlock(&wakeup->wait);
- }
+ __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE);
+ lstack_block_wakeup(wakeup);
}
return;
@@ -1233,14 +1229,21 @@ int32_t stack_broadcast_bind(int32_t fd, const struct sockaddr *name, socklen_t
int32_t stack_broadcast_accept4(int32_t fd, struct sockaddr *addr, socklen_t *addrlen, int flags)
{
int32_t ret = -1;
-
+ struct lwip_sock *min_sock = NULL;
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
errno = EINVAL;
return -1;
}
- struct lwip_sock *min_sock = get_min_accept_sock(fd);
+ if (netconn_is_nonblocking(sock->conn)) {
+ min_sock = get_min_accept_sock(fd);
+ } else {
+ while ((min_sock = get_min_accept_sock(fd)) == NULL) {
+ lstack_block_wait(sock->wakeup);
+ }
+ }
+
if (min_sock && min_sock->conn) {
ret = rpc_call_accept(min_sock->conn->socket, addr, addrlen, flags);
}
diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h
index 9c34eb3..7591f0f 100644
--- a/src/lstack/include/posix/lstack_epoll.h
+++ b/src/lstack/include/posix/lstack_epoll.h
@@ -80,6 +80,25 @@ int32_t lstack_rtc_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t
int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout);
int lstack_select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeval);
+static inline void lstack_block_wait(struct wakeup_poll *wakeup)
+{
+ if (wakeup == NULL) {
+ return;
+ }
+
+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE);
+ pthread_mutex_lock(&wakeup->wait);
+}
+
+static inline void lstack_block_wakeup(struct wakeup_poll *wakeup)
+{
+ if (wakeup && __atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) {
+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
+ rte_mb();
+ pthread_mutex_unlock(&wakeup->wait);
+ }
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 2a84cb8..ee80359 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -168,7 +168,7 @@ static void gazelle_print_lstack_nic_features(void *buf, const struct gazelle_st
printf("###### NIC offload and other features for port %-2d #########\n", f->port_id);
printf("tx-ipv4-checksum: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_IPV4_CKSUM) ? "on" : "off");
- printf("tx-tcp_checksum: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_TCP_CKSUM) ? "on" : "off");
+ printf("tx-tcp-checksum: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_TCP_CKSUM) ? "on" : "off");
printf("tx-tcp-tso: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_TCP_TSO) ? "on" : "off");
printf("tx-udp-checksum: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_UDP_CKSUM) ? "on" : "off");
printf("tx-vlan-insert: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_VLAN_INSERT) ? "on" : "off");
--
2.27.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。