sync fix rte_ring_create/free time consuming
(cherry picked from commit a648226e16c6617ea4bb9f33eb3abdecf392292b)
This commit is contained in:
parent
a8733d7c22
commit
c72dfe116d
49
0091-fix-alloc-not-free.patch
Normal file
49
0091-fix-alloc-not-free.patch
Normal file
@ -0,0 +1,49 @@
|
||||
From 053024d4cbedc106276e25a7ace5d833f8a62dea Mon Sep 17 00:00:00 2001
|
||||
From: compile_success <980965867@qq.com>
|
||||
Date: Wed, 20 Dec 2023 01:37:12 +0000
|
||||
Subject: [PATCH] fix alloc not free
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_cfg.c | 2 ++
|
||||
src/lstack/core/lstack_dpdk.c | 2 ++
|
||||
2 files changed, 4 insertions(+)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
|
||||
index 6324c97..f639473 100644
|
||||
--- a/src/lstack/core/lstack_cfg.c
|
||||
+++ b/src/lstack/core/lstack_cfg.c
|
||||
@@ -1185,11 +1185,13 @@ static int32_t parse_bond_slave_mac(void)
|
||||
if (k >= GAZELLE_MAX_BOND_NUM) {
|
||||
LSTACK_PRE_LOG(LSTACK_ERR, "cfg: too many slave mac address. The maximum number of mac address is %d.\n",
|
||||
GAZELLE_MAX_BOND_NUM);
|
||||
+ free(bond_slave_mac_tmp);
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = str_to_eth_addr(mac_addr, g_config_params.bond_slave_mac_addr[k].addr_bytes);
|
||||
if (ret != 0) {
|
||||
LSTACK_PRE_LOG(LSTACK_ERR, "cfg: invalid device name %s ret=%d.\n", mac_addr, ret);
|
||||
+ free(bond_slave_mac_tmp);
|
||||
return ret;
|
||||
}
|
||||
mac_addr = strtok_s(NULL, delim, &tmp);
|
||||
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
|
||||
index e20dea8..6933ecd 100644
|
||||
--- a/src/lstack/core/lstack_dpdk.c
|
||||
+++ b/src/lstack/core/lstack_dpdk.c
|
||||
@@ -553,11 +553,13 @@ int32_t dpdk_ethdev_init(int port_id, bool bond_port)
|
||||
int slave_id = rte_eth_bond_primary_get(port_id);
|
||||
if (slave_id < 0) {
|
||||
LSTACK_LOG(ERR, LSTACK, "dpdk get bond primary port failed port = %d\n", slave_id);
|
||||
+ free(eth_params);
|
||||
return slave_id;
|
||||
}
|
||||
ret = rte_eth_dev_info_get(slave_id, &slave_dev_info);
|
||||
if (ret != 0) {
|
||||
LSTACK_LOG(ERR, LSTACK, "dpdk get bond dev info failed ret = %d\n", ret);
|
||||
+ free(eth_params);
|
||||
return ret;
|
||||
}
|
||||
dev_info.rx_offload_capa = slave_dev_info.rx_offload_capa;
|
||||
--
|
||||
2.27.0
|
||||
|
||||
59
0092-sigaction-fix-deprecated-signal-flags.patch
Normal file
59
0092-sigaction-fix-deprecated-signal-flags.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From 3af406243bb2a4a6c8ac5b3f1d98a9cd7e0af295 Mon Sep 17 00:00:00 2001
|
||||
From: yangchen <yangchen145@huawei.com>
|
||||
Date: Wed, 20 Dec 2023 11:37:13 +0800
|
||||
Subject: [PATCH] sigaction: fix deprecated signal flags
|
||||
|
||||
---
|
||||
src/lstack/api/lstack_signal.c | 10 +++++++++-
|
||||
src/lstack/core/lstack_lwip.c | 7 ++++---
|
||||
2 files changed, 13 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c
|
||||
index 6da6eb4..314c14c 100644
|
||||
--- a/src/lstack/api/lstack_signal.c
|
||||
+++ b/src/lstack/api/lstack_signal.c
|
||||
@@ -57,7 +57,7 @@ static inline bool match_hijack_signal(int sig)
|
||||
|
||||
static void lstack_sig_default_handler(int sig)
|
||||
{
|
||||
- LSTACK_LOG(ERR, LSTACK, "lstack dumped,caught signal:%d\n", sig);
|
||||
+ LSTACK_LOG(ERR, LSTACK, "lstack dumped, caught signal: %d\n", sig);
|
||||
if (get_global_cfg_params() && get_global_cfg_params()->is_primary) {
|
||||
delete_primary_path();
|
||||
}
|
||||
@@ -94,5 +94,13 @@ int lstack_sigaction(int sig_num, const struct sigaction *action, struct sigacti
|
||||
new_action.sa_handler = lstack_sig_default_handler;
|
||||
return posix_api->sigaction_fn(sig_num, &new_action, old_action);
|
||||
}
|
||||
+
|
||||
+ /* SA_INTERRUPT is deprecated, use SA_RESETHAND instead. */
|
||||
+ if ((match_hijack_signal(sig_num) != 0) && (action && action->sa_flags == SA_INTERRUPT)) {
|
||||
+ new_action = *action;
|
||||
+ new_action.sa_flags |= SA_RESETHAND;
|
||||
+ return posix_api->sigaction_fn(sig_num, &new_action, old_action);
|
||||
+ }
|
||||
+
|
||||
return posix_api->sigaction_fn(sig_num, action, old_action);
|
||||
}
|
||||
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
|
||||
index 34ec1bd..100f075 100644
|
||||
--- a/src/lstack/core/lstack_lwip.c
|
||||
+++ b/src/lstack/core/lstack_lwip.c
|
||||
@@ -564,10 +564,11 @@ 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);
|
||||
+ while (!netconn_is_nonblocking(sock->conn) && (write_avail < write_num)) {
|
||||
+ if (sock->errevent > 0) {
|
||||
+ GAZELLE_RETURN(ENOTCONN);
|
||||
}
|
||||
+ write_avail = gazelle_ring_readable_count(sock->send_ring);
|
||||
}
|
||||
|
||||
/* send_ring is full, data attach last pbuf */
|
||||
--
|
||||
2.27.0
|
||||
|
||||
38
0093-fix-gazellectl-c-msg-error.patch
Normal file
38
0093-fix-gazellectl-c-msg-error.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 887130c90c7875b4c0860ed0667224418e690752 Mon Sep 17 00:00:00 2001
|
||||
From: jinag12 <jiangheng14@huawei.com>
|
||||
Date: Thu, 21 Dec 2023 09:03:02 +0000
|
||||
Subject: [PATCH] fix gazellectl -c msg error
|
||||
|
||||
Signed-off-by: jinag12 <jiangheng14@huawei.com>
|
||||
---
|
||||
src/lstack/core/lstack_lwip.c | 11 +++++------
|
||||
1 file changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
|
||||
index 15f99f9..1913d03 100644
|
||||
--- a/src/lstack/core/lstack_lwip.c
|
||||
+++ b/src/lstack/core/lstack_lwip.c
|
||||
@@ -1158,15 +1158,14 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s
|
||||
conn->keep_intvl = pcb->keep_intvl;
|
||||
conn->keep_cnt = pcb->keep_cnt;
|
||||
|
||||
- if (netconn != NULL && netconn->recvmbox != NULL) {
|
||||
- conn->recv_cnt = rte_ring_count(netconn->recvmbox->ring);
|
||||
+ if (netconn != NULL) {
|
||||
conn->fd = netconn->socket;
|
||||
-
|
||||
+ conn->recv_cnt = (netconn->recvmbox == NULL) ? 0 : rte_ring_count(netconn->recvmbox->ring);
|
||||
struct lwip_sock *sock = get_socket(netconn->socket);
|
||||
- if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) {
|
||||
- conn->recv_ring_cnt = gazelle_ring_readable_count(sock->recv_ring);
|
||||
+ if (sock != NULL) {
|
||||
+ conn->recv_ring_cnt = (sock->recv_ring == NULL) ? 0 : gazelle_ring_readable_count(sock->recv_ring);
|
||||
conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0;
|
||||
- conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring);
|
||||
+ conn->send_ring_cnt = (sock->send_ring == NULL) ? 0 : gazelle_ring_readover_count(sock->send_ring);
|
||||
conn->events = sock->events;
|
||||
conn->epoll_events = sock->epoll_events;
|
||||
conn->eventlist = !list_is_null(&sock->event_list);
|
||||
--
|
||||
2.27.0
|
||||
|
||||
107
0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch
Normal file
107
0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch
Normal file
@ -0,0 +1,107 @@
|
||||
From 43985056c5446c0ad45acb2309165543bd8e15e1 Mon Sep 17 00:00:00 2001
|
||||
From: yinbin <yinbin8@huawei.com>
|
||||
Date: Fri, 22 Dec 2023 15:42:40 +0800
|
||||
Subject: [PATCH] CFG:fix check func strdup return value is NULL
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_cfg.c | 31 ++++++++++++++++++++-----------
|
||||
1 file changed, 20 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
|
||||
index 6324c97..6e97c96 100644
|
||||
--- a/src/lstack/core/lstack_cfg.c
|
||||
+++ b/src/lstack/core/lstack_cfg.c
|
||||
@@ -145,6 +145,15 @@ static struct config_vector_t g_config_tbl[] = {
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
+static char* strdup_assert_return(const char* str)
|
||||
+{
|
||||
+ char* result = strdup(str);
|
||||
+ if (result == NULL) {
|
||||
+ LSTACK_EXIT(1, "strdup_assert_return failed, func strdup return NULL!\n");
|
||||
+ }
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
struct cfg_params *get_global_cfg_params(void)
|
||||
{
|
||||
return &g_config_params;
|
||||
@@ -336,15 +345,15 @@ static int32_t parse_stack_cpu_number(void)
|
||||
if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) {
|
||||
int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
|
||||
if (idx < 0) {
|
||||
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST);
|
||||
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(OPT_BIND_CORELIST);
|
||||
g_config_params.dpdk_argc++;
|
||||
|
||||
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args);
|
||||
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(args);
|
||||
g_config_params.dpdk_argc++;
|
||||
}
|
||||
}
|
||||
|
||||
- char *tmp_arg = strdup(args);
|
||||
+ char *tmp_arg = strdup_assert_return(args);
|
||||
int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.cpus, CFG_MAX_CPUS, CFG_MAX_CPUS);
|
||||
free(tmp_arg);
|
||||
if (cnt <= 0 || cnt > CFG_MAX_CPUS) {
|
||||
@@ -369,15 +378,15 @@ static int32_t parse_stack_cpu_number(void)
|
||||
if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) {
|
||||
int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
|
||||
if (idx < 0) {
|
||||
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST);
|
||||
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(OPT_BIND_CORELIST);
|
||||
g_config_params.dpdk_argc++;
|
||||
|
||||
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args);
|
||||
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(args);
|
||||
g_config_params.dpdk_argc++;
|
||||
}
|
||||
}
|
||||
|
||||
- char *tmp_arg_send = strdup(args);
|
||||
+ char *tmp_arg_send = strdup_assert_return(args);
|
||||
int32_t send_cpu_cnt = separate_str_to_array(tmp_arg_send, g_config_params.send_cpus,
|
||||
CFG_MAX_CPUS, CFG_MAX_CPUS);
|
||||
free(tmp_arg_send);
|
||||
@@ -396,15 +405,15 @@ static int32_t parse_stack_cpu_number(void)
|
||||
if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) {
|
||||
int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
|
||||
if (idx < 0) {
|
||||
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST);
|
||||
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(OPT_BIND_CORELIST);
|
||||
g_config_params.dpdk_argc++;
|
||||
|
||||
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args);
|
||||
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup_assert_return(args);
|
||||
g_config_params.dpdk_argc++;
|
||||
}
|
||||
}
|
||||
|
||||
- char *tmp_arg_recv = strdup(args);
|
||||
+ char *tmp_arg_recv = strdup_assert_return(args);
|
||||
int32_t recv_cpu_cnt = separate_str_to_array(tmp_arg_recv, g_config_params.recv_cpus,
|
||||
CFG_MAX_CPUS, CFG_MAX_CPUS);
|
||||
free(tmp_arg_recv);
|
||||
@@ -450,7 +459,7 @@ static int32_t parse_app_exclude_cpus(void)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- tmp_arg = strdup(args);
|
||||
+ tmp_arg = strdup_assert_return(args);
|
||||
cnt = separate_str_to_array(tmp_arg, g_config_params.app_exclude_cpus, CFG_MAX_CPUS, CFG_MAX_CPUS);
|
||||
free(tmp_arg);
|
||||
if (cnt <= 0 || cnt > CFG_MAX_CPUS) {
|
||||
@@ -1176,7 +1185,7 @@ static int32_t parse_bond_slave_mac(void)
|
||||
}
|
||||
|
||||
int32_t k = 0;
|
||||
- char *bond_slave_mac_tmp = strdup(bond_slave_mac);
|
||||
+ char *bond_slave_mac_tmp = strdup_assert_return(bond_slave_mac);
|
||||
char *tmp = NULL;
|
||||
const char *delim = ";";
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
||||
26
0095-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
26
0095-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From f6a7a9585bfb82680519034869b4141c514d9214 Mon Sep 17 00:00:00 2001
|
||||
From: yinbin <yinbin8@huawei.com>
|
||||
Date: Mon, 25 Dec 2023 00:34:55 +0800
|
||||
Subject: [PATCH] fix func separate_str_to_array overflow problem
|
||||
|
||||
---
|
||||
src/common/gazelle_parse_config.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
|
||||
index 42e12b5..77d0b82 100644
|
||||
--- a/src/common/gazelle_parse_config.c
|
||||
+++ b/src/common/gazelle_parse_config.c
|
||||
@@ -80,6 +80,9 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i
|
||||
for (idx = min; idx <= max; idx++) {
|
||||
array[count] = idx;
|
||||
count++;
|
||||
+ if (count > array_size) {
|
||||
+ return -1;
|
||||
+ }
|
||||
}
|
||||
min = array_size;
|
||||
} else {
|
||||
--
|
||||
2.27.0
|
||||
|
||||
76
0096-use-default-nonblock-mode.patch
Normal file
76
0096-use-default-nonblock-mode.patch
Normal file
@ -0,0 +1,76 @@
|
||||
From 47ab261c2b533975a59b34f06da0ccf83692bb78 Mon Sep 17 00:00:00 2001
|
||||
From: compile_success <980965867@qq.com>
|
||||
Date: Tue, 26 Dec 2023 16:53:58 +0000
|
||||
Subject: [PATCH] use default nonblock mode
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_cfg.c | 12 ++++++++++++
|
||||
src/lstack/core/lstack_protocol_stack.c | 5 ++++-
|
||||
src/lstack/include/lstack_cfg.h | 1 +
|
||||
3 files changed, 17 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
|
||||
index a292070..d9c23fb 100644
|
||||
--- a/src/lstack/core/lstack_cfg.c
|
||||
+++ b/src/lstack/core/lstack_cfg.c
|
||||
@@ -80,6 +80,7 @@ static int32_t parse_nic_rxqueue_size(void);
|
||||
static int32_t parse_nic_txqueue_size(void);
|
||||
static int32_t parse_stack_thread_mode(void);
|
||||
static int32_t parse_nic_vlan_mode(void);
|
||||
+static int32_t parse_defaule_nonblock_mode(void);
|
||||
|
||||
#define PARSE_ARG(_arg, _arg_string, _default_val, _min_val, _max_val, _ret) \
|
||||
do { \
|
||||
@@ -142,6 +143,7 @@ static struct config_vector_t g_config_tbl[] = {
|
||||
{ "nic_txqueue_size", parse_nic_txqueue_size},
|
||||
{ "stack_thread_mode", parse_stack_thread_mode },
|
||||
{ "nic_vlan_mode", parse_nic_vlan_mode },
|
||||
+ { "nonblock_mode", parse_defaule_nonblock_mode },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -1280,3 +1282,13 @@ static int32_t parse_nic_vlan_mode(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int32_t parse_defaule_nonblock_mode(void)
|
||||
+{
|
||||
+ int32_t ret;
|
||||
+ PARSE_ARG(g_config_params.nonblock_mode, "nonblock_mode", 1, 0, 1, ret);
|
||||
+ if (ret != 0) {
|
||||
+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg: invalid nonblock mode value %d. only support 0 or 1\n", \
|
||||
+ g_config_params.nonblock_mode);
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
|
||||
index 9158d20..a000224 100644
|
||||
--- a/src/lstack/core/lstack_protocol_stack.c
|
||||
+++ b/src/lstack/core/lstack_protocol_stack.c
|
||||
@@ -1287,7 +1287,10 @@ int32_t stack_broadcast_accept4(int32_t fd, struct sockaddr *addr, socklen_t *ad
|
||||
|
||||
int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen)
|
||||
{
|
||||
- return stack_broadcast_accept4(fd, addr, addrlen, 0);
|
||||
+ if (get_global_cfg_params()->nonblock_mode)
|
||||
+ return stack_broadcast_accept4(fd, addr, addrlen, O_NONBLOCK);
|
||||
+ else
|
||||
+ return stack_broadcast_accept4(fd, addr, addrlen, 0);
|
||||
}
|
||||
|
||||
static void stack_all_fds_close(void)
|
||||
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
|
||||
index a6bdfd5..82e96d8 100644
|
||||
--- a/src/lstack/include/lstack_cfg.h
|
||||
+++ b/src/lstack/include/lstack_cfg.h
|
||||
@@ -118,6 +118,7 @@ struct cfg_params {
|
||||
bool udp_enable;
|
||||
struct cfg_nic_params nic;
|
||||
bool stack_mode_rtc;
|
||||
+ bool nonblock_mode;
|
||||
};
|
||||
|
||||
struct cfg_params *get_global_cfg_params(void);
|
||||
--
|
||||
2.27.0
|
||||
|
||||
128
0097-fix-rte_ring_create-free-time-consuming.patch
Normal file
128
0097-fix-rte_ring_create-free-time-consuming.patch
Normal file
@ -0,0 +1,128 @@
|
||||
From 66b0ba4be7a5c3b79482eafdc28fd75e8f44e761 Mon Sep 17 00:00:00 2001
|
||||
From: jiangheng <jiangheng14@huawei.com>
|
||||
Date: Wed, 27 Dec 2023 10:26:07 +0800
|
||||
Subject: [PATCH] fix rte_ring_create/free time consuming
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_dpdk.c | 27 +++------------------------
|
||||
src/lstack/core/lstack_lwip.c | 14 ++++++--------
|
||||
src/lstack/include/lstack_dpdk.h | 1 -
|
||||
3 files changed, 9 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
|
||||
index 6933ecd..729a84c 100644
|
||||
--- a/src/lstack/core/lstack_dpdk.c
|
||||
+++ b/src/lstack/core/lstack_dpdk.c
|
||||
@@ -245,43 +245,22 @@ struct rte_mempool *create_mempool(const char *name, uint32_t count, uint32_t si
|
||||
return mempool;
|
||||
}
|
||||
|
||||
-struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id)
|
||||
-{
|
||||
- char ring_name[RTE_RING_NAMESIZE] = {0};
|
||||
- struct rte_ring *ring;
|
||||
-
|
||||
- int32_t ret = snprintf_s(ring_name, sizeof(ring_name), RTE_RING_NAMESIZE - 1,
|
||||
- "%s_%d_%d", name, get_global_cfg_params()->process_idx, queue_id);
|
||||
- if (ret < 0) {
|
||||
- LSTACK_LOG(ERR, LSTACK, "snprintf_s fail ret=%d\n", ret);
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ring = rte_ring_create(ring_name, count, rte_socket_id(), flags);
|
||||
- if (ring == NULL) {
|
||||
- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno);
|
||||
- }
|
||||
-
|
||||
- return ring;
|
||||
-}
|
||||
-
|
||||
int32_t create_shared_ring(struct protocol_stack *stack)
|
||||
{
|
||||
lockless_queue_init(&stack->rpc_queue);
|
||||
|
||||
if (use_ltran()) {
|
||||
- stack->rx_ring = create_ring("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id);
|
||||
+ stack->rx_ring = gazelle_ring_create_fast("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ);
|
||||
if (stack->rx_ring == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
- stack->tx_ring = create_ring("RING_TX", VDEV_TX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id);
|
||||
+ stack->tx_ring = gazelle_ring_create_fast("RING_TX", VDEV_TX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ);
|
||||
if (stack->tx_ring == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
- stack->reg_ring = create_ring("SHARED_REG_RING", VDEV_REG_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ,
|
||||
- stack->queue_id);
|
||||
+ stack->reg_ring = gazelle_ring_create_fast("SHARED_REG_RING", VDEV_REG_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ);
|
||||
if (stack->reg_ring == NULL) {
|
||||
return -1;
|
||||
}
|
||||
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
|
||||
index c167ba4..4953f3d 100644
|
||||
--- a/src/lstack/core/lstack_lwip.c
|
||||
+++ b/src/lstack/core/lstack_lwip.c
|
||||
@@ -72,13 +72,13 @@ static void reset_sock_data(struct lwip_sock *sock)
|
||||
/* check null pointer in ring_free func */
|
||||
if (sock->recv_ring) {
|
||||
free_ring_pbuf(sock->recv_ring);
|
||||
- rte_ring_free(sock->recv_ring);
|
||||
+ gazelle_ring_free_fast(sock->recv_ring);
|
||||
sock->recv_ring = NULL;
|
||||
}
|
||||
|
||||
if (sock->send_ring) {
|
||||
free_ring_pbuf(sock->send_ring);
|
||||
- rte_ring_free(sock->send_ring);
|
||||
+ gazelle_ring_free_fast(sock->send_ring);
|
||||
sock->send_ring = NULL;
|
||||
}
|
||||
|
||||
@@ -169,7 +169,6 @@ static bool replenish_send_idlembuf(struct protocol_stack *stack, struct lwip_so
|
||||
|
||||
void do_lwip_init_sock(int32_t fd)
|
||||
{
|
||||
- static _Atomic uint32_t name_tick = 0;
|
||||
struct protocol_stack *stack = get_protocol_stack();
|
||||
struct lwip_sock *sock = get_socket(fd);
|
||||
if (sock == NULL) {
|
||||
@@ -178,18 +177,17 @@ void do_lwip_init_sock(int32_t fd)
|
||||
|
||||
reset_sock_data(sock);
|
||||
|
||||
- sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, RING_F_SP_ENQ | RING_F_SC_DEQ,
|
||||
- atomic_fetch_add(&name_tick, 1));
|
||||
+ 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;
|
||||
}
|
||||
|
||||
- sock->send_ring = create_ring("sock_send",
|
||||
+ sock->send_ring = gazelle_ring_create_fast("sock_send",
|
||||
get_global_cfg_params()->send_ring_size,
|
||||
- RING_F_SP_ENQ | RING_F_SC_DEQ,
|
||||
- atomic_fetch_add(&name_tick, 1));
|
||||
+ RING_F_SP_ENQ | RING_F_SC_DEQ);
|
||||
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;
|
||||
}
|
||||
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
|
||||
index 05f5bc6..4a160e0 100644
|
||||
--- a/src/lstack/include/lstack_dpdk.h
|
||||
+++ b/src/lstack/include/lstack_dpdk.h
|
||||
@@ -44,7 +44,6 @@ struct rte_mbuf;
|
||||
int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, uint32_t mbuf_num);
|
||||
int32_t dpdk_eal_init(void);
|
||||
int32_t pktmbuf_pool_init(struct protocol_stack *stack);
|
||||
-struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id);
|
||||
struct rte_mempool *create_mempool(const char *name, uint32_t count, uint32_t size,
|
||||
uint32_t flags, int32_t idx);
|
||||
int32_t create_shared_ring(struct protocol_stack *stack);
|
||||
--
|
||||
2.27.0
|
||||
|
||||
25
0098-optimize-shutdown-exit-process.patch
Normal file
25
0098-optimize-shutdown-exit-process.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 5ca16b89699250a52d11ee5a181fef227fd399b6 Mon Sep 17 00:00:00 2001
|
||||
From: yangchen <yangchen145@huawei.com>
|
||||
Date: Mon, 18 Dec 2023 10:50:53 +0800
|
||||
Subject: [PATCH] optimize shutdown exit process
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_protocol_stack.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
|
||||
index 8dbd9ad..564f055 100644
|
||||
--- a/src/lstack/core/lstack_protocol_stack.c
|
||||
+++ b/src/lstack/core/lstack_protocol_stack.c
|
||||
@@ -722,7 +722,7 @@ void stack_shutdown(struct rpc_msg *msg)
|
||||
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
|
||||
struct lwip_sock *sock = get_socket(fd);
|
||||
|
||||
- if (sock && NETCONN_IS_DATAOUT(sock)) {
|
||||
+ if (sock && __atomic_load_n(&sock->call_num, __ATOMIC_ACQUIRE) > 0) {
|
||||
msg->recall_flag = 1;
|
||||
rpc_call(&stack->rpc_queue, msg);
|
||||
return;
|
||||
--
|
||||
2.27.0
|
||||
|
||||
32
0099-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
32
0099-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From e4eeed95dcbb47b3413e51df6c82e85a735aa31c Mon Sep 17 00:00:00 2001
|
||||
From: yinbin6 <yinbin8@huawei.com>
|
||||
Date: Mon, 25 Dec 2023 09:31:44 +0000
|
||||
Subject: [PATCH] fix func separate_str_to_array overflow problem
|
||||
|
||||
Signed-off-by: yinbin6 <yinbin8@huawei.com>
|
||||
---
|
||||
src/common/gazelle_parse_config.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
|
||||
index 77d0b82..82be52c 100644
|
||||
--- a/src/common/gazelle_parse_config.c
|
||||
+++ b/src/common/gazelle_parse_config.c
|
||||
@@ -78,11 +78,11 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i
|
||||
min = idx;
|
||||
}
|
||||
for (idx = min; idx <= max; idx++) {
|
||||
+ if (count > array_size) {
|
||||
+ return -1;
|
||||
+ }
|
||||
array[count] = idx;
|
||||
count++;
|
||||
- if (count > array_size) {
|
||||
- return -1;
|
||||
- }
|
||||
}
|
||||
min = array_size;
|
||||
} else {
|
||||
--
|
||||
2.27.0
|
||||
|
||||
28
0100-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
28
0100-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From 89abb6f4e231cf378b1e7f7415cfa196fdf7b3da Mon Sep 17 00:00:00 2001
|
||||
From: yinbin6 <yinbin8@huawei.com>
|
||||
Date: Mon, 25 Dec 2023 10:25:42 +0000
|
||||
Subject: [PATCH] fix func separate_str_to_array overflow problem
|
||||
|
||||
Signed-off-by: yinbin6 <yinbin8@huawei.com>
|
||||
---
|
||||
src/common/gazelle_parse_config.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
|
||||
index 82be52c..9772af9 100644
|
||||
--- a/src/common/gazelle_parse_config.c
|
||||
+++ b/src/common/gazelle_parse_config.c
|
||||
@@ -79,8 +79,8 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i
|
||||
}
|
||||
for (idx = min; idx <= max; idx++) {
|
||||
if (count > array_size) {
|
||||
- return -1;
|
||||
- }
|
||||
+ return -1;
|
||||
+ }
|
||||
array[count] = idx;
|
||||
count++;
|
||||
}
|
||||
--
|
||||
2.27.0
|
||||
|
||||
26
0101-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
26
0101-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 58248cb2bae3d2c50f65b3ade360fc14716a0ce7 Mon Sep 17 00:00:00 2001
|
||||
From: yinbin6 <yinbin8@huawei.com>
|
||||
Date: Mon, 25 Dec 2023 11:06:18 +0000
|
||||
Subject: [PATCH] fix func separate_str_to_array overflow problem
|
||||
|
||||
Signed-off-by: yinbin6 <yinbin8@huawei.com>
|
||||
---
|
||||
src/common/gazelle_parse_config.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
|
||||
index 9772af9..16efdc8 100644
|
||||
--- a/src/common/gazelle_parse_config.c
|
||||
+++ b/src/common/gazelle_parse_config.c
|
||||
@@ -78,7 +78,7 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, i
|
||||
min = idx;
|
||||
}
|
||||
for (idx = min; idx <= max; idx++) {
|
||||
- if (count > array_size) {
|
||||
+ if (count >= array_size) {
|
||||
return -1;
|
||||
}
|
||||
array[count] = idx;
|
||||
--
|
||||
2.27.0
|
||||
|
||||
26
0102-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
26
0102-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From fafd5c387910da2f81f38c320b3da01ffd97c6c2 Mon Sep 17 00:00:00 2001
|
||||
From: yinbin6 <yinbin8@huawei.com>
|
||||
Date: Mon, 25 Dec 2023 13:01:39 +0000
|
||||
Subject: [PATCH] fix func separate_str_to_array overflow problem
|
||||
|
||||
Signed-off-by: yinbin6 <yinbin8@huawei.com>
|
||||
---
|
||||
src/common/gazelle_parse_config.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
|
||||
index 16efdc8..1adce78 100644
|
||||
--- a/src/common/gazelle_parse_config.c
|
||||
+++ b/src/common/gazelle_parse_config.c
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size, int32_t max_value)
|
||||
{
|
||||
- uint32_t count = 0;
|
||||
+ int32_t count = 0;
|
||||
char *end = NULL;
|
||||
int32_t min, max;
|
||||
int32_t idx;
|
||||
--
|
||||
2.27.0
|
||||
|
||||
25
0103-fix-func-stack_setup_thread-array-doesn-t-init.patc
Normal file
25
0103-fix-func-stack_setup_thread-array-doesn-t-init.patc
Normal file
@ -0,0 +1,25 @@
|
||||
From 9ed5bee888ab4936372a81919d894d8fd291e7c1 Mon Sep 17 00:00:00 2001
|
||||
From: yinbin <yinbin8@huawei.com>
|
||||
Date: Tue, 26 Dec 2023 22:49:03 +0800
|
||||
Subject: [PATCH] fix func stack_setup_thread array doesn't init
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_protocol_stack.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
|
||||
index 829313f..0aff1b4 100644
|
||||
--- a/src/lstack/core/lstack_protocol_stack.c
|
||||
+++ b/src/lstack/core/lstack_protocol_stack.c
|
||||
@@ -648,7 +648,7 @@ int32_t stack_setup_thread(void)
|
||||
int32_t ret;
|
||||
char name[PATH_MAX];
|
||||
int queue_num = get_global_cfg_params()->num_queue;
|
||||
- struct thread_params *t_params[queue_num];
|
||||
+ struct thread_params *t_params[queue_num] = {0};
|
||||
int process_index = get_global_cfg_params()->process_idx;
|
||||
|
||||
for (uint32_t i = 0; i < queue_num; i++) {
|
||||
--
|
||||
2.27.0
|
||||
|
||||
21
0104-fix-stack_setup_thread-array-range.patch
Normal file
21
0104-fix-stack_setup_thread-array-range.patch
Normal file
@ -0,0 +1,21 @@
|
||||
From f6df059cf18aa0019c5bdea8947a5b4a53c02bde Mon Sep 17 00:00:00 2001
|
||||
From: yinbin <yinbin8@huawei.com>
|
||||
Date: Wed, 27 Dec 2023 09:58:30 +0800
|
||||
Subject: [PATCH] fix stack_setup_thread array range
|
||||
|
||||
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
|
||||
index 0aff1b4..b5d4ea3 100644
|
||||
--- a/src/lstack/core/lstack_protocol_stack.c
|
||||
+++ b/src/lstack/core/lstack_protocol_stack.c
|
||||
@@ -648,7 +648,7 @@ int32_t stack_setup_thread(void)
|
||||
int32_t ret;
|
||||
char name[PATH_MAX];
|
||||
int queue_num = get_global_cfg_params()->num_queue;
|
||||
- struct thread_params *t_params[queue_num] = {0};
|
||||
+ struct thread_params *t_params[PROTOCOL_STACK_MAX] = {NULL};
|
||||
int process_index = get_global_cfg_params()->process_idx;
|
||||
|
||||
for (uint32_t i = 0; i < queue_num; i++) {
|
||||
--
|
||||
2.27.0
|
||||
|
||||
80
0105-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
80
0105-fix-func-separate_str_to_array-overflow-problem.patch
Normal file
@ -0,0 +1,80 @@
|
||||
From c6de43f7e7cb866f8d5ddd453c73783d5daafca0 Mon Sep 17 00:00:00 2001
|
||||
From: yinbin <yinbin8@huawei.com>
|
||||
Date: Wed, 27 Dec 2023 12:22:06 +0800
|
||||
Subject: [PATCH] fix func separate_str_to_array overflow problem
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_protocol_stack.c | 25 +++++++++++++++++++------
|
||||
1 file changed, 19 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
|
||||
index b5d4ea3..f3d2452 100644
|
||||
--- a/src/lstack/core/lstack_protocol_stack.c
|
||||
+++ b/src/lstack/core/lstack_protocol_stack.c
|
||||
@@ -651,44 +651,57 @@ int32_t stack_setup_thread(void)
|
||||
struct thread_params *t_params[PROTOCOL_STACK_MAX] = {NULL};
|
||||
int process_index = get_global_cfg_params()->process_idx;
|
||||
|
||||
+ for (uint32_t i = 0; i < queue_num; ++i) {
|
||||
+ t_params[i] = malloc(sizeof(struct thread_params));
|
||||
+ if (t_params[i] == NULL) {
|
||||
+ goto OUT;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
for (uint32_t i = 0; i < queue_num; i++) {
|
||||
if (get_global_cfg_params()->seperate_send_recv) {
|
||||
if (i % 2 == 0) {
|
||||
ret = sprintf_s(name, sizeof(name), "%s_%d_%d", LSTACK_RECV_THREAD_NAME, process_index, i / 2);
|
||||
if (ret < 0) {
|
||||
- return -1;
|
||||
+ goto OUT;
|
||||
}
|
||||
} else {
|
||||
ret = sprintf_s(name, sizeof(name), "%s_%d_%d", LSTACK_SEND_THREAD_NAME, process_index, i / 2);
|
||||
if (ret < 0) {
|
||||
- return -1;
|
||||
+ goto OUT;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ret = sprintf_s(name, sizeof(name), "%s", LSTACK_THREAD_NAME);
|
||||
if (ret < 0) {
|
||||
- return -1;
|
||||
+ goto OUT;
|
||||
}
|
||||
}
|
||||
|
||||
- t_params[i] = malloc(sizeof(struct thread_params));
|
||||
t_params[i]->idx = i;
|
||||
t_params[i]->queue_id = process_index * queue_num + i;
|
||||
|
||||
ret = create_thread((void *)t_params[i], name, gazelle_stack_thread);
|
||||
if (ret != 0) {
|
||||
- return ret;
|
||||
+ goto OUT;
|
||||
}
|
||||
}
|
||||
|
||||
/* 2: wait stack thread and kernel_event thread init finish */
|
||||
wait_sem_value(&g_stack_group.sem_stack_setup, queue_num * 2);
|
||||
if (g_stack_group.stack_setup_fail) {
|
||||
- return -1;
|
||||
+ goto OUT;
|
||||
}
|
||||
g_stack_group.stack_num = queue_num;
|
||||
|
||||
return 0;
|
||||
+OUT:
|
||||
+ for (int32_t i = 0; i < queue_num; ++i) {
|
||||
+ if (t_params[i] != NULL) {
|
||||
+ free(t_params[i]);
|
||||
+ }
|
||||
+ }
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
void stack_arp(struct rpc_msg *msg)
|
||||
--
|
||||
2.27.0
|
||||
|
||||
27
gazelle.spec
27
gazelle.spec
@ -2,7 +2,7 @@
|
||||
|
||||
Name: gazelle
|
||||
Version: 1.0.2
|
||||
Release: 21
|
||||
Release: 22
|
||||
Summary: gazelle is a high performance user-mode stack
|
||||
License: MulanPSL-2.0
|
||||
URL: https://gitee.com/openeuler/gazelle
|
||||
@ -104,6 +104,21 @@ Patch9087: 0087-mod-time-err.patch
|
||||
Patch9088: 0088-fix-gazellectl-lstack-show-ip-r-with-ltran-error-log.patch
|
||||
Patch9089: 0089-fix-udp-multicast-bind-error.patch
|
||||
Patch9090: 0090-support-netperf.patch
|
||||
Patch9091: 0091-fix-alloc-not-free.patch
|
||||
Patch9092: 0092-sigaction-fix-deprecated-signal-flags.patch
|
||||
Patch9093: 0093-fix-gazellectl-c-msg-error.patch
|
||||
Patch9094: 0094-CFG-fix-check-func-strdup-return-value-is-NULL.patch
|
||||
Patch9095: 0095-fix-func-separate_str_to_array-overflow-problem.patch
|
||||
Patch9096: 0096-use-default-nonblock-mode.patch
|
||||
Patch9097: 0097-fix-rte_ring_create-free-time-consuming.patch
|
||||
Patch9098: 0098-optimize-shutdown-exit-process.patch
|
||||
Patch9099: 0099-fix-func-separate_str_to_array-overflow-problem.patch
|
||||
Patch9100: 0100-fix-func-separate_str_to_array-overflow-problem.patch
|
||||
Patch9101: 0101-fix-func-separate_str_to_array-overflow-problem.patch
|
||||
Patch9102: 0102-fix-func-separate_str_to_array-overflow-problem.patch
|
||||
Patch9103: 0103-fix-func-stack_setup_thread-array-doesn-t-init.patc
|
||||
Patch9104: 0104-fix-stack_setup_thread-array-range.patch
|
||||
Patch9105: 0105-fix-func-separate_str_to_array-overflow-problem.patch
|
||||
|
||||
%description
|
||||
%{name} is a high performance user-mode stack.
|
||||
@ -145,6 +160,16 @@ install -Dpm 0640 %{_builddir}/%{name}-%{version}/src/ltran/ltran.conf %{b
|
||||
%config(noreplace) %{conf_path}/ltran.conf
|
||||
|
||||
%changelog
|
||||
* Wed Dec 27 2023 yinbin6 <yinbin8@huawei.com> - 1.0.2-22
|
||||
- fix rte_ring_create/free time consuming
|
||||
- use default nonblock mode
|
||||
- fix func separate_str_to_array overflow problem
|
||||
- CFG:fix check func strdup return value is NULL
|
||||
- fix gazellectl -c msg error
|
||||
- sigaction: fix deprecated signal flags
|
||||
- fix alloc not free
|
||||
- optimize shutdown exit process
|
||||
|
||||
* Tue Dec 19 2023 yinbin6 <yinbin8@huawei.com> - 1.0.2-21
|
||||
- support netperf
|
||||
- fix udp multicast bind error
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user