!282 [sync] PR-280: sync "epoll_create1 accept4" & "add fucntest" & "fix coredump in example" & "bring up kni when init" & " change mbuf_pool_size"
From: @openeuler-sync-bot Reviewed-by: @jiangheng12 Signed-off-by: @jiangheng12
This commit is contained in:
commit
18f440f5aa
448
0187-test-readv-writev-epoll_create1-accept4.patch
Normal file
448
0187-test-readv-writev-epoll_create1-accept4.patch
Normal file
@ -0,0 +1,448 @@
|
||||
From 9ff6edf1f5a9140831d03b4ce3bcf35ee5cf710e Mon Sep 17 00:00:00 2001
|
||||
From: jackyfan <1376762675@qq.com>
|
||||
Date: Mon, 12 Dec 2022 16:06:10 +0800
|
||||
Subject: [PATCH] test readv writev epoll_create1 accept4
|
||||
|
||||
---
|
||||
examples/README.md | 20 ++++++++++++++++---
|
||||
examples/inc/client.h | 1 +
|
||||
examples/inc/parameter.h | 9 +++++++++
|
||||
examples/inc/server.h | 7 ++++++-
|
||||
examples/inc/utilities.h | 1 +
|
||||
examples/src/bussiness.c | 25 ++++++++++++++++++++++++
|
||||
examples/src/client.c | 10 ++++++++--
|
||||
examples/src/parameter.c | 40 +++++++++++++++++++++++++++++++++++++-
|
||||
examples/src/server.c | 42 +++++++++++++++++++++++++++++++++++-----
|
||||
9 files changed, 143 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/examples/README.md b/examples/README.md
|
||||
index cf2f26f..06a725b 100644
|
||||
--- a/examples/README.md
|
||||
+++ b/examples/README.md
|
||||
@@ -113,7 +113,7 @@
|
||||
* `-D, --domain [unix | posix]`:通信协议。
|
||||
* `unix`:基于 unix 协议实现。
|
||||
* `posix`:基于 posix 协议实现。
|
||||
-* `-A, --api [readwrite | recvsend | recvsendmsg]`:内部实现的接口类型。
|
||||
+* `-A, --api [readwrite | recvsend | recvsendmsg | readvwritev]`:内部实现的接口类型。
|
||||
* `readwrite` :使用 `read` 和 `write` 接口。
|
||||
* `recvsend` :使用 `recv` 和 `send` 接口。
|
||||
* `recvsendmsg` :使用 `recvmsg` 和 `sendmsg` 接口。
|
||||
@@ -122,7 +122,12 @@
|
||||
* `-r, --ringpmd`:是否基于dpdk ring PMD 收发环回。
|
||||
* `-d, --debug`:是否打印调试信息。
|
||||
* `-h, --help`:获得帮助信息。
|
||||
-
|
||||
+* `-E, --epollcreate`:epoll_create方式。
|
||||
+ * `ec`:使用epoll_create(int size)生成epoll专用的文件描述符。
|
||||
+ * `ec1`:使用epoll_create1(int flags)生成epoll专用的文件描述符,flags = EPOLL_CLOEXEC。
|
||||
+* `-C, --accept`:accept的方式。
|
||||
+ * `ac`:使用accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)通过套接口接受连接。
|
||||
+ * `ac4`:使用accept4(int sockfd, struct sockaddr *addr,socklen_t *addrlen, int flags)通过套接口接受连接,flags=SOCK_CLOEXEC。
|
||||
## 使用
|
||||
|
||||
* **环境配置**
|
||||
@@ -165,6 +170,12 @@ make
|
||||
-r, --ringpmd: set to use ringpmd.
|
||||
-d, --debug: set to print the debug information.
|
||||
-h, --help: see helps.
|
||||
+-E, --epollcreate: epoll_create method.
|
||||
+ ec: use epoll_create(int size) to create epoll fd.
|
||||
+ ec1:use epoll_create(int flags) to create epoll fd, flags=EPOLL_CLOEXEC.
|
||||
+-C, --accept: accept method.
|
||||
+ ac: use accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) to accept a connection on a socket
|
||||
+ ac4: use accept4(int sockfd, struct sockaddr *addr,socklen_t *addrlen, int flags) to accept a connection on a socket, flags=SOCK_CLOEXEC.
|
||||
```
|
||||
|
||||
* 创建服务端
|
||||
@@ -184,6 +195,8 @@ make
|
||||
--> [verify]: on
|
||||
--> [ringpmd]: off
|
||||
--> [debug]: off
|
||||
+--> [epoll create]: ec
|
||||
+--> [accept]: ac
|
||||
|
||||
[program informations]:
|
||||
--> <server>: [connect num]: 0, [receive]: 0.000 B/s
|
||||
@@ -205,7 +218,8 @@ make
|
||||
--> [packet length]: 1024
|
||||
--> [verify]: on
|
||||
--> [ringpmd]: off
|
||||
---> [debug]: off
|
||||
+--> [epoll create]: ec
|
||||
+--> [accept]: ac
|
||||
|
||||
[program informations]:
|
||||
--> <client>: [connect num]: 80, [send]: 357.959 MB/s
|
||||
diff --git a/examples/inc/client.h b/examples/inc/client.h
|
||||
index d3ae017..ad824c7 100644
|
||||
--- a/examples/inc/client.h
|
||||
+++ b/examples/inc/client.h
|
||||
@@ -39,6 +39,7 @@ struct ClientUnit
|
||||
char* domain; ///< the communication domain
|
||||
char* api; ///< the type of api
|
||||
bool debug; ///< if we print the debug information
|
||||
+ char* epollcreate; ///< epoll_create method
|
||||
struct ClientUnit *next; ///< next pointer
|
||||
};
|
||||
|
||||
diff --git a/examples/inc/parameter.h b/examples/inc/parameter.h
|
||||
index ee8fe4e..0683822 100644
|
||||
--- a/examples/inc/parameter.h
|
||||
+++ b/examples/inc/parameter.h
|
||||
@@ -30,6 +30,9 @@
|
||||
#define PARAM_DEFAULT_VERIFY (false) ///< default flag of message verifying
|
||||
#define PARAM_DEFAULT_DEBUG (false) ///< default flag of debug
|
||||
#define PARAM_DEFAULT_RINGPMD (false) ///< default flag of ring PMD of dpdk
|
||||
+#define PARAM_DEFAULT_EPOLLCREATE ("ec") ///< default method of epoll_create
|
||||
+#define PARAM_DEFAULT_ACCEPT ("ac") ///< default method of accept method
|
||||
+
|
||||
|
||||
enum {
|
||||
#define PARAM_NAME_AS ("as") ///< name of parameter type
|
||||
@@ -58,6 +61,10 @@ enum {
|
||||
PARAM_NUM_DEBUG = 'd',
|
||||
#define PARAM_NAME_HELP ("help") ///< name of parameter help
|
||||
PARAM_NUM_HELP = 'h',
|
||||
+#define PARAM_NAME_EPOLLCREATE ("epollcreate") ///< name of parameter epollcreate
|
||||
+ PARAM_NUM_EPOLLCREATE = 'E',
|
||||
+#define PARAM_NAME_ACCEPT ("accept") ///< name of parameter accept
|
||||
+ PARAM_NUM_ACCEPT = 'C',
|
||||
};
|
||||
|
||||
#define NO_ARGUMENT 0 ///< options takes no arguments
|
||||
@@ -92,6 +99,8 @@ struct ProgramParams {
|
||||
uint32_t pktlen; ///< the packet length
|
||||
bool verify; ///< if we verify the message or not
|
||||
bool debug; ///< if we print the debug information or not
|
||||
+ char* epollcreate; ///< epoll_create method
|
||||
+ char* accept; ///< accept connections method
|
||||
bool ringpmd; ///< if we use ring PMD or not
|
||||
};
|
||||
|
||||
diff --git a/examples/inc/server.h b/examples/inc/server.h
|
||||
index fa9096b..45ca895 100644
|
||||
--- a/examples/inc/server.h
|
||||
+++ b/examples/inc/server.h
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
#ifndef __EXAMPLES_SERVER_H__
|
||||
#define __EXAMPLES_SERVER_H__
|
||||
-
|
||||
+#define _GNU_SOURCE
|
||||
|
||||
#include "utilities.h"
|
||||
#include "parameter.h"
|
||||
@@ -37,6 +37,8 @@ struct ServerMumUnit
|
||||
char* domain; ///< communication domain
|
||||
char* api; ///< the type of api
|
||||
bool debug; ///< if we print the debug information
|
||||
+ char* epollcreate; ///< epoll_create method
|
||||
+ char* accept; ///< accept connections method
|
||||
struct ServerMumUnit *next; ///< next pointer
|
||||
};
|
||||
|
||||
@@ -65,6 +67,7 @@ struct ServerMudWorker
|
||||
uint16_t port; ///< client port
|
||||
char* api; ///< the type of api
|
||||
bool debug; ///< if we print the debug information
|
||||
+ char* epollcreate; ///< epoll_create method
|
||||
struct ServerMudWorker *next; ///< next pointer
|
||||
};
|
||||
|
||||
@@ -85,6 +88,8 @@ struct ServerMud
|
||||
char* domain; ///< communication domain
|
||||
char* api; ///< the type of api
|
||||
bool debug; ///< if we print the debug information
|
||||
+ char* accept; ///< accept connections method
|
||||
+ char* epollcreate; ///< epoll_create method
|
||||
};
|
||||
|
||||
|
||||
diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h
|
||||
index a684d35..a083f57 100644
|
||||
--- a/examples/inc/utilities.h
|
||||
+++ b/examples/inc/utilities.h
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
#include "securec.h"
|
||||
#include "securectype.h"
|
||||
+#include "sys/uio.h"
|
||||
|
||||
|
||||
#define PRINT_ERROR(format, ...) do \
|
||||
diff --git a/examples/src/bussiness.c b/examples/src/bussiness.c
|
||||
index f55a37b..b084b37 100644
|
||||
--- a/examples/src/bussiness.c
|
||||
+++ b/examples/src/bussiness.c
|
||||
@@ -25,6 +25,18 @@ static const char bussiness_messages_cap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // t
|
||||
return read(fd, buffer_in, length);
|
||||
} else if (strcmp(api, "recvsend") == 0) {
|
||||
return recv(fd, buffer_in, length, 0);
|
||||
+ } else if (strcmp(api, "readvwritev") == 0) {
|
||||
+ struct iovec iov[3];
|
||||
+ int iovcnt = 3;
|
||||
+ uint32_t iov_len_size = length/iovcnt;
|
||||
+
|
||||
+ iov[0].iov_base=buffer_in;
|
||||
+ iov[0].iov_len = iov_len_size;
|
||||
+ iov[1].iov_base= buffer_in + iov_len_size;
|
||||
+ iov[1].iov_len = iov_len_size;
|
||||
+ iov[2].iov_base = buffer_in + iov_len_size + iov_len_size;
|
||||
+ iov[2].iov_len = length- iov_len_size - iov_len_size;
|
||||
+ return readv(fd, iov, iovcnt);
|
||||
} else {
|
||||
struct msghdr msg_recv;
|
||||
struct iovec iov;
|
||||
@@ -50,6 +62,19 @@ static const char bussiness_messages_cap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // t
|
||||
return write(fd, buffer_out, length);
|
||||
} else if (strcmp(api, "recvsend") == 0) {
|
||||
return send(fd, buffer_out, length, 0);
|
||||
+ } else if (strcmp(api, "readvwritev") == 0) {
|
||||
+ struct iovec iov[3];
|
||||
+ int iovcnt = 3;
|
||||
+ uint32_t iov_len_size = length/iovcnt;
|
||||
+
|
||||
+ iov[0].iov_base=buffer_out;
|
||||
+ iov[0].iov_len = iov_len_size;
|
||||
+ iov[1].iov_base= buffer_out + iov_len_size;
|
||||
+ iov[1].iov_len = iov_len_size;
|
||||
+ iov[2].iov_base = buffer_out + iov_len_size + iov_len_size;
|
||||
+ iov[2].iov_len = length- iov_len_size - iov_len_size;
|
||||
+
|
||||
+ return writev(fd, iov, iovcnt);
|
||||
} else {
|
||||
struct msghdr msg_send;
|
||||
struct iovec iov;
|
||||
diff --git a/examples/src/client.c b/examples/src/client.c
|
||||
index aafcd00..46dd039 100644
|
||||
--- a/examples/src/client.c
|
||||
+++ b/examples/src/client.c
|
||||
@@ -155,8 +155,13 @@ int32_t client_thread_retry_connect(struct ClientUnit *client_unit, struct Clien
|
||||
int32_t client_thread_create_epfd_and_reg(struct ClientUnit *client_unit)
|
||||
{
|
||||
const uint32_t connect_num = client_unit->connect_num;
|
||||
-
|
||||
- client_unit->epfd = epoll_create(CLIENT_EPOLL_SIZE_MAX);
|
||||
+ //jacky modify
|
||||
+ if (strcmp(client_unit->epollcreate, "ec1") == 0) {
|
||||
+ client_unit->epfd = epoll_create1(EPOLL_CLOEXEC);
|
||||
+ } else {
|
||||
+ client_unit->epfd = epoll_create(CLIENT_EPOLL_SIZE_MAX);
|
||||
+ }
|
||||
+
|
||||
if (client_unit->epfd < 0) {
|
||||
PRINT_ERROR("client can't create epoll %d! ", errno);
|
||||
return PROGRAM_FAULT;
|
||||
@@ -364,6 +369,7 @@ int32_t client_create_and_run(struct ProgramParams *params)
|
||||
client_unit->verify = params->verify;
|
||||
client_unit->domain = params->domain;
|
||||
client_unit->api = params->api;
|
||||
+ client_unit->epollcreate = params->epollcreate;
|
||||
client_unit->debug = params->debug;
|
||||
client_unit->next = (struct ClientUnit *)malloc(sizeof(struct ClientUnit));
|
||||
|
||||
diff --git a/examples/src/parameter.c b/examples/src/parameter.c
|
||||
index 100ee11..3116a18 100644
|
||||
--- a/examples/src/parameter.c
|
||||
+++ b/examples/src/parameter.c
|
||||
@@ -29,6 +29,8 @@ const char prog_short_opts[] = \
|
||||
"r" // ringpmd
|
||||
"d" // debug
|
||||
"h" // help
|
||||
+ "E" // epollcreate
|
||||
+ "C" // accept
|
||||
;
|
||||
|
||||
// program long options
|
||||
@@ -47,6 +49,8 @@ const struct ProgramOption prog_long_opts[] = \
|
||||
{PARAM_NAME_RINGPMD, NO_ARGUMENT, NULL, PARAM_NUM_RINGPMD},
|
||||
{PARAM_NAME_DEBUG, NO_ARGUMENT, NULL, PARAM_NUM_DEBUG},
|
||||
{PARAM_NAME_HELP, NO_ARGUMENT, NULL, PARAM_NUM_HELP},
|
||||
+ {PARAM_NAME_EPOLLCREATE, REQUIRED_ARGUMETN, NULL, PARAM_NUM_EPOLLCREATE},
|
||||
+ {PARAM_NAME_ACCEPT, REQUIRED_ARGUMETN, NULL, PARAM_NUM_ACCEPT},
|
||||
};
|
||||
|
||||
|
||||
@@ -139,7 +143,7 @@ void program_param_parse_domain(struct ProgramParams *params)
|
||||
void program_param_parse_api(struct ProgramParams *params)
|
||||
{
|
||||
printf("aaaaaa %s\n", optarg);
|
||||
- if (strcmp(optarg, "readwrite") == 0 || strcmp(optarg, "recvsend") == 0 || strcmp(optarg, "recvsendmsg") == 0) {
|
||||
+ if (strcmp(optarg, "readwrite") == 0 || strcmp(optarg, "readvwritev") == 0 || strcmp(optarg, "recvsend") == 0 || strcmp(optarg, "recvsendmsg") == 0) {
|
||||
params->api = optarg;
|
||||
} else {
|
||||
PRINT_ERROR("illigal argument -- %s \n", optarg);
|
||||
@@ -159,6 +163,28 @@ void program_param_parse_pktlen(struct ProgramParams *params)
|
||||
}
|
||||
}
|
||||
|
||||
+// set `epollcreate` parameter
|
||||
+void program_param_parse_epollcreate(struct ProgramParams *params)
|
||||
+{
|
||||
+ if (strcmp(optarg, "ec") == 0 || strcmp(optarg, "ec1") == 0) {
|
||||
+ params->epollcreate = optarg;
|
||||
+ } else {
|
||||
+ PRINT_ERROR("illigal argument -- %s \n", optarg);
|
||||
+ exit(PROGRAM_ABORT);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+// set `accept` parameter
|
||||
+void program_param_parse_accept(struct ProgramParams *params)
|
||||
+{
|
||||
+ if (strcmp(optarg, "ac") == 0 || strcmp(optarg, "ac4") == 0) {
|
||||
+ params->accept = optarg;
|
||||
+ } else {
|
||||
+ PRINT_ERROR("illigal argument -- %s \n", optarg);
|
||||
+ exit(PROGRAM_ABORT);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
// initialize the parameters
|
||||
void program_params_init(struct ProgramParams *params)
|
||||
{
|
||||
@@ -174,6 +200,8 @@ void program_params_init(struct ProgramParams *params)
|
||||
params->verify = PARAM_DEFAULT_VERIFY;
|
||||
params->ringpmd = PARAM_DEFAULT_RINGPMD;
|
||||
params->debug = PARAM_DEFAULT_DEBUG;
|
||||
+ params->epollcreate = PARAM_DEFAULT_EPOLLCREATE;
|
||||
+ params->accept = PARAM_DEFAULT_ACCEPT;
|
||||
}
|
||||
|
||||
// print program helps
|
||||
@@ -202,6 +230,8 @@ void program_params_help(void)
|
||||
printf("-r, --ringpmd: set to use ringpmd. \n");
|
||||
printf("-d, --debug: set to print the debug information. \n");
|
||||
printf("-h, --help: see helps. \n");
|
||||
+ printf("-E, --epollcreate [ec | ec1]: epoll_create method. \n");
|
||||
+ printf("-C, --accept [ac | ac4]: accept method. \n");
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
@@ -256,6 +286,12 @@ int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *
|
||||
case (PARAM_NUM_DEBUG):
|
||||
params->debug = true;
|
||||
break;
|
||||
+ case (PARAM_NUM_EPOLLCREATE):
|
||||
+ program_param_parse_epollcreate(params);
|
||||
+ break;
|
||||
+ case (PARAM_NUM_ACCEPT):
|
||||
+ program_param_parse_accept(params);
|
||||
+ break;
|
||||
case (PARAM_NUM_HELP):
|
||||
program_params_help();
|
||||
return PROGRAM_ABORT;
|
||||
@@ -304,5 +340,7 @@ void program_params_print(struct ProgramParams *params)
|
||||
printf("--> [verify]: %s \n", (params->verify == true) ? "on" : "off");
|
||||
printf("--> [ringpmd]: %s \n", (params->ringpmd == true) ? "on" : "off");
|
||||
printf("--> [debug]: %s \n", (params->debug == true) ? "on" : "off");
|
||||
+ printf("--> [epoll create]: %s \n", params->epollcreate);
|
||||
+ printf("--> [accept]: %s \n", params->accept);
|
||||
printf("\n");
|
||||
}
|
||||
diff --git a/examples/src/server.c b/examples/src/server.c
|
||||
index d1dab72..27572f0 100644
|
||||
--- a/examples/src/server.c
|
||||
+++ b/examples/src/server.c
|
||||
@@ -86,7 +86,12 @@ void sermud_info_print(struct ServerMud *server_mud)
|
||||
// the worker thread, unblock, dissymmetric server listens and gets epoll feature descriptors
|
||||
int32_t sermud_worker_create_epfd_and_reg(struct ServerMudWorker *worker_unit)
|
||||
{
|
||||
- worker_unit->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX);
|
||||
+ if (strcmp(worker_unit->epollcreate, "ec1") == 0) {
|
||||
+ worker_unit->epfd = epoll_create1(EPOLL_CLOEXEC);
|
||||
+ } else {
|
||||
+ worker_unit->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX);
|
||||
+ }
|
||||
+
|
||||
if (worker_unit->epfd < 0) {
|
||||
PRINT_ERROR("server can't create epoll %d! ", worker_unit->epfd);
|
||||
return PROGRAM_FAULT;
|
||||
@@ -106,7 +111,12 @@ int32_t sermud_worker_create_epfd_and_reg(struct ServerMudWorker *worker_unit)
|
||||
// the listener thread, unblock, dissymmetric server listens and gets epoll feature descriptors
|
||||
int32_t sermud_listener_create_epfd_and_reg(struct ServerMud *server_mud)
|
||||
{
|
||||
- server_mud->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX);
|
||||
+ if (strcmp(server_mud->epollcreate, "ec1") == 0) {
|
||||
+ server_mud->epfd = epoll_create1(EPOLL_CLOEXEC);
|
||||
+ } else {
|
||||
+ server_mud->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX);
|
||||
+ }
|
||||
+
|
||||
if (server_mud->epfd < 0) {
|
||||
PRINT_ERROR("server can't create epoll %d! ", server_mud->epfd);
|
||||
return PROGRAM_FAULT;
|
||||
@@ -131,7 +141,13 @@ int32_t sermud_listener_accept_connects(struct ServerMud *server_mud)
|
||||
while (true) {
|
||||
struct sockaddr_in accept_addr;
|
||||
uint32_t sockaddr_in_len = sizeof(struct sockaddr_in);
|
||||
- int32_t accept_fd = accept(server_mud->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len);
|
||||
+ int32_t accept_fd;
|
||||
+ if (strcmp(server_mud->accept, "ac4") == 0) {
|
||||
+ accept_fd = accept4(server_mud->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len, SOCK_CLOEXEC);
|
||||
+ } else {
|
||||
+ accept_fd = accept(server_mud->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len);
|
||||
+ }
|
||||
+
|
||||
if (accept_fd < 0) {
|
||||
break;
|
||||
}
|
||||
@@ -155,6 +171,7 @@ int32_t sermud_listener_accept_connects(struct ServerMud *server_mud)
|
||||
worker->api = server_mud->api;
|
||||
worker->debug = server_mud->debug;
|
||||
worker->next = server_mud->workers;
|
||||
+ worker->epollcreate = server_mud->epollcreate;
|
||||
|
||||
server_mud->workers = worker;
|
||||
|
||||
@@ -308,6 +325,8 @@ int32_t sermud_create_and_run(struct ProgramParams *params)
|
||||
server_mud->domain = params->domain;
|
||||
server_mud->api = params->api;
|
||||
server_mud->debug = params->debug;
|
||||
+ server_mud->epollcreate = params->epollcreate;
|
||||
+ server_mud->accept = params->accept;
|
||||
|
||||
if (pthread_create(tid, NULL, sermud_listener_create_and_run, server_mud) < 0) {
|
||||
PRINT_ERROR("server can't create poisx thread %d! ", errno);
|
||||
@@ -378,7 +397,12 @@ void sermum_info_print(struct ServerMum *server_mum)
|
||||
// the single thread, unblock, mutliplexing IO server listens and gets epoll feature descriptors
|
||||
int32_t sersum_create_epfd_and_reg(struct ServerMumUnit *server_unit)
|
||||
{
|
||||
- server_unit->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX);
|
||||
+ if (strcmp(server_unit->epollcreate, "ec1") == 0) {
|
||||
+ server_unit->epfd = epoll_create1(EPOLL_CLOEXEC);
|
||||
+ } else {
|
||||
+ server_unit->epfd = epoll_create(SERVER_EPOLL_SIZE_MAX);
|
||||
+ }
|
||||
+
|
||||
if (server_unit->epfd < 0) {
|
||||
PRINT_ERROR("server can't create epoll %d! ", server_unit->epfd);
|
||||
return PROGRAM_FAULT;
|
||||
@@ -403,7 +427,13 @@ int32_t sersum_accept_connects(struct ServerMumUnit *server_unit, struct ServerH
|
||||
while (true) {
|
||||
struct sockaddr_in accept_addr;
|
||||
uint32_t sockaddr_in_len = sizeof(struct sockaddr_in);
|
||||
- int32_t accept_fd = accept(server_unit->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len);
|
||||
+ int32_t accept_fd;
|
||||
+ if (strcmp(server_unit->accept, "ac4") == 0) {
|
||||
+ accept_fd = accept4(server_unit->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len, SOCK_CLOEXEC);
|
||||
+ } else {
|
||||
+ accept_fd = accept(server_unit->listener.fd, (struct sockaddr *)&accept_addr, &sockaddr_in_len);
|
||||
+ }
|
||||
+
|
||||
if (accept_fd < 0) {
|
||||
break;
|
||||
}
|
||||
@@ -542,6 +572,8 @@ int32_t sermum_create_and_run(struct ProgramParams *params)
|
||||
server_unit->domain = params->domain;
|
||||
server_unit->api = params->api;
|
||||
server_unit->debug = params->debug;
|
||||
+ server_unit->epollcreate = params->epollcreate;
|
||||
+ server_unit->accept = params->accept;
|
||||
server_unit->next = (struct ServerMumUnit *)malloc(sizeof(struct ServerMumUnit));
|
||||
|
||||
if (pthread_create((tids + i), NULL, sersum_create_and_run, server_unit) < 0) {
|
||||
--
|
||||
2.23.0
|
||||
|
||||
1359
0188-add-fucntest.patch
Normal file
1359
0188-add-fucntest.patch
Normal file
File diff suppressed because it is too large
Load Diff
26
0189-fix-coredump-in-example-server-mum-mode.patch
Normal file
26
0189-fix-coredump-in-example-server-mum-mode.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From c8024efb3849aa44a1539017da4db77d46d5a5c2 Mon Sep 17 00:00:00 2001
|
||||
From: kircher <majun65@huawei.com>
|
||||
Date: Tue, 7 Feb 2023 20:01:29 +0800
|
||||
Subject: [PATCH] fix coredump in example server mum mode
|
||||
|
||||
---
|
||||
examples/src/server.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/examples/src/server.c b/examples/src/server.c
|
||||
index 27572f0..7ee73db 100644
|
||||
--- a/examples/src/server.c
|
||||
+++ b/examples/src/server.c
|
||||
@@ -575,6 +575,9 @@ int32_t sermum_create_and_run(struct ProgramParams *params)
|
||||
server_unit->epollcreate = params->epollcreate;
|
||||
server_unit->accept = params->accept;
|
||||
server_unit->next = (struct ServerMumUnit *)malloc(sizeof(struct ServerMumUnit));
|
||||
+ if (server_unit->next) {
|
||||
+ memset_s(server_unit->next, sizeof(struct ServerMumUnit), 0, sizeof(struct ServerMumUnit));
|
||||
+ }
|
||||
|
||||
if (pthread_create((tids + i), NULL, sersum_create_and_run, server_unit) < 0) {
|
||||
PRINT_ERROR("server can't create poisx thread %d! ", errno);
|
||||
--
|
||||
2.23.0
|
||||
|
||||
145
0190-bring-up-kni-when-init.patch
Normal file
145
0190-bring-up-kni-when-init.patch
Normal file
@ -0,0 +1,145 @@
|
||||
From 56d36bfa97abf388bf0bfa567470810fdae2a921 Mon Sep 17 00:00:00 2001
|
||||
From: kircher <majun65@huawei.com>
|
||||
Date: Fri, 10 Feb 2023 14:51:43 +0800
|
||||
Subject: [PATCH] bring up kni when init
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_dpdk.c | 28 ------------------
|
||||
src/lstack/core/lstack_init.c | 55 ++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 54 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
|
||||
index 560162f..5475f31 100644
|
||||
--- a/src/lstack/core/lstack_dpdk.c
|
||||
+++ b/src/lstack/core/lstack_dpdk.c
|
||||
@@ -523,32 +523,6 @@ int32_t dpdk_ethdev_start(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void set_kni_ip_mac(uint16_t port_id)
|
||||
-{
|
||||
- struct cfg_params *cfg = get_global_cfg_params();
|
||||
-
|
||||
- int32_t fd = posix_api->socket_fn(AF_INET, SOCK_DGRAM, 0);
|
||||
- struct ifreq set_ifr = {0};
|
||||
- struct sockaddr_in *sin = (struct sockaddr_in *)&set_ifr.ifr_addr;
|
||||
-
|
||||
- sin->sin_family = AF_INET;
|
||||
- sin->sin_addr.s_addr = cfg->host_addr.addr;
|
||||
- if (strcpy_s(set_ifr.ifr_name, sizeof(set_ifr.ifr_name), GAZELLE_KNI_NAME) != 0) {
|
||||
- LSTACK_LOG(ERR, LSTACK, "strcpy_s fail \n");
|
||||
- }
|
||||
-
|
||||
- if (posix_api->ioctl_fn(fd, SIOCSIFADDR, &set_ifr) < 0) {
|
||||
- LSTACK_LOG(ERR, LSTACK, "set kni ip=%u fail\n", cfg->host_addr.addr);
|
||||
- }
|
||||
-
|
||||
- sin->sin_addr.s_addr = cfg->netmask.addr;
|
||||
- if (posix_api->ioctl_fn(fd, SIOCSIFNETMASK, &set_ifr) < 0) {
|
||||
- LSTACK_LOG(ERR, LSTACK, "set kni netmask=%u fail\n", cfg->netmask.addr);
|
||||
- }
|
||||
-
|
||||
- posix_api->close_fn(fd);
|
||||
-}
|
||||
-
|
||||
int32_t dpdk_init_lstack_kni(void)
|
||||
{
|
||||
struct protocol_stack_group *stack_group = get_protocol_stack_group();
|
||||
@@ -563,8 +537,6 @@ int32_t dpdk_init_lstack_kni(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
- set_kni_ip_mac(stack_group->port_id);
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
|
||||
index 6309d1d..34b2c0d 100644
|
||||
--- a/src/lstack/core/lstack_init.c
|
||||
+++ b/src/lstack/core/lstack_init.c
|
||||
@@ -16,13 +16,16 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <semaphore.h>
|
||||
-#include <sys/socket.h>
|
||||
+#include <sys/ioctl.h>
|
||||
#include <sys/file.h>
|
||||
#include <securec.h>
|
||||
#include <numa.h>
|
||||
#include <pthread.h>
|
||||
#include <rte_pdump.h>
|
||||
#include <unistd.h>
|
||||
+#include <net/if.h>
|
||||
+#include <net/if_arp.h>
|
||||
+#include <netinet/in.h>
|
||||
|
||||
#include <lwip/def.h>
|
||||
#include <lwip/init.h>
|
||||
@@ -264,6 +267,52 @@ static void gazelle_signal_init(void)
|
||||
lstack_signal_init();
|
||||
}
|
||||
|
||||
+static void set_kni_ip_mac() {
|
||||
+ struct cfg_params *cfg = get_global_cfg_params();
|
||||
+
|
||||
+ int32_t fd = posix_api->socket_fn(AF_INET, SOCK_DGRAM, IPPROTO_IP);
|
||||
+ struct ifreq set_ifr = {0};
|
||||
+ struct sockaddr_in *sin = (struct sockaddr_in *)&set_ifr.ifr_addr;
|
||||
+
|
||||
+ sin->sin_family = AF_INET;
|
||||
+ sin->sin_addr.s_addr = cfg->host_addr.addr;
|
||||
+ if (strcpy_s(set_ifr.ifr_name, sizeof(set_ifr.ifr_name), GAZELLE_KNI_NAME) != 0) {
|
||||
+ LSTACK_LOG(ERR, LSTACK, "strcpy_s fail \n");
|
||||
+ }
|
||||
+
|
||||
+ if (posix_api->ioctl_fn(fd, SIOCSIFADDR, &set_ifr) < 0) {
|
||||
+ LSTACK_LOG(ERR, LSTACK, "set kni ip=%u fail\n", cfg->host_addr.addr);
|
||||
+ }
|
||||
+
|
||||
+ sin->sin_addr.s_addr = cfg->netmask.addr;
|
||||
+ if (posix_api->ioctl_fn(fd, SIOCSIFNETMASK, &set_ifr) < 0) {
|
||||
+ LSTACK_LOG(ERR, LSTACK, "set kni netmask=%u fail\n", cfg->netmask.addr);
|
||||
+ }
|
||||
+
|
||||
+ set_ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
|
||||
+ for (int i = 0; i < 6; i++) {
|
||||
+ set_ifr.ifr_hwaddr.sa_data[i] = cfg->mac_addr[i];
|
||||
+ }
|
||||
+
|
||||
+ if (posix_api->ioctl_fn(fd, SIOCSIFHWADDR, &set_ifr) < 0) {
|
||||
+ LSTACK_LOG(ERR, LSTACK, "set kni macaddr=%hhx:%hhx:%hhx:%hhx:%hhx:%hhx fail\n",
|
||||
+ cfg->mac_addr[0], cfg->mac_addr[1],
|
||||
+ cfg->mac_addr[2], cfg->mac_addr[3],
|
||||
+ cfg->mac_addr[4], cfg->mac_addr[5]);
|
||||
+ }
|
||||
+
|
||||
+ if (posix_api->ioctl_fn(fd, SIOCGIFFLAGS, &set_ifr) < 0) {
|
||||
+ LSTACK_LOG(ERR, LSTACK, "get kni state fail\n");
|
||||
+ }
|
||||
+
|
||||
+ set_ifr.ifr_flags |= (IFF_RUNNING | IFF_UP);
|
||||
+ if (posix_api->ioctl_fn(fd, SIOCSIFFLAGS, &set_ifr) < 0){
|
||||
+ LSTACK_LOG(ERR, LSTACK, "set kni state fail\n");
|
||||
+ }
|
||||
+
|
||||
+ posix_api->close_fn(fd);
|
||||
+}
|
||||
+
|
||||
__attribute__((constructor)) void gazelle_network_init(void)
|
||||
{
|
||||
/*
|
||||
@@ -347,6 +396,10 @@ __attribute__((constructor)) void gazelle_network_init(void)
|
||||
LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n");
|
||||
}
|
||||
|
||||
+ if (get_global_cfg_params()->kni_switch) {
|
||||
+ set_kni_ip_mac();
|
||||
+ }
|
||||
+
|
||||
posix_api->ues_posix = 0;
|
||||
LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n");
|
||||
rte_smp_mb();
|
||||
--
|
||||
2.23.0
|
||||
|
||||
145
0191-change-mbuf_pool_size-in-lstack.conf-to-tcp_conn_cou.patch
Normal file
145
0191-change-mbuf_pool_size-in-lstack.conf-to-tcp_conn_cou.patch
Normal file
@ -0,0 +1,145 @@
|
||||
From 276036e11c3988de869fb6c0397bbecbd81bbb4c Mon Sep 17 00:00:00 2001
|
||||
From: jiangheng <jiangheng14@huawei.com>
|
||||
Date: Fri, 13 Jan 2023 11:53:47 +0800
|
||||
Subject: [PATCH] change mbuf_pool_size in lstack.conf to tcp_conn_count *
|
||||
mbuf_count_per_conn
|
||||
|
||||
---
|
||||
src/common/gazelle_opt.h | 5 +++--
|
||||
src/lstack/core/lstack_cfg.c | 37 ++++++++++++++++++++++++++-------
|
||||
src/lstack/core/lstack_dpdk.c | 4 +++-
|
||||
src/lstack/include/lstack_cfg.h | 3 ++-
|
||||
src/lstack/lstack.conf | 6 ++++--
|
||||
5 files changed, 41 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h
|
||||
index 012997c..76b89ce 100644
|
||||
--- a/src/common/gazelle_opt.h
|
||||
+++ b/src/common/gazelle_opt.h
|
||||
@@ -45,8 +45,9 @@
|
||||
#define RTE_TEST_TX_DESC_DEFAULT 2048
|
||||
#define RTE_TEST_RX_DESC_DEFAULT 4096
|
||||
|
||||
-#define RXTX_NB_MBUF_DEFAULT (128 * 2000) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */
|
||||
-#define RXTX_NB_MBUF_MAX (2560 * 2000)
|
||||
+#define TCP_CONN_COUNT 1500
|
||||
+#define MBUF_COUNT_PER_CONN 170
|
||||
+#define RXTX_NB_MBUF_DEFAULT (MBUF_COUNT_PER_CONN * TCP_CONN_COUNT) /* mbuf per connect * connect num. size of mbuf is 2536 Byte */
|
||||
#define STACK_THREAD_DEFAULT 4
|
||||
#define STACK_NIC_READ_DEFAULT 128
|
||||
|
||||
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
|
||||
index 4912fdd..0da5085 100644
|
||||
--- a/src/lstack/core/lstack_cfg.c
|
||||
+++ b/src/lstack/core/lstack_cfg.c
|
||||
@@ -84,7 +84,8 @@ static struct config_vector_t g_config_tbl[] = {
|
||||
{ "app_bind_numa", parse_app_bind_numa },
|
||||
{ "main_thread_affinity", parse_main_thread_affinity },
|
||||
{ "unix_prefix", parse_unix_prefix },
|
||||
- { "mbuf_pool_size", parse_rxtx_pool_size },
|
||||
+ { "tcp_conn_count", parse_tcp_conn_count },
|
||||
+ { "mbuf_count_per_conn", parse_mbuf_count_per_conn },
|
||||
{ "send_connect_number", parse_send_connect_number },
|
||||
{ "read_connect_number", parse_read_connect_number },
|
||||
{ "rpc_number", parse_rpc_number },
|
||||
@@ -707,24 +708,44 @@ static int32_t parse_use_ltran(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int32_t parse_rxtx_pool_size(void)
|
||||
+static int32_t parse_tcp_conn_count(void)
|
||||
{
|
||||
const config_setting_t *arg = NULL;
|
||||
|
||||
- arg = config_lookup(&g_config, "mbuf_pool_size");
|
||||
+ arg = config_lookup(&g_config, "tcp_conn_count");
|
||||
if (arg == NULL) {
|
||||
- g_config_params.mbuf_pool_size = RXTX_NB_MBUF_DEFAULT;
|
||||
- LSTACK_PRE_LOG(LSTACK_ERR, "use default mbuf_pool_size %d.\n", RXTX_NB_MBUF_DEFAULT);
|
||||
+ g_config_params.tcp_conn_count = TCP_CONN_COUNT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t val = config_setting_get_int(arg);
|
||||
- if (val <= 0 || val > RXTX_NB_MBUF_MAX) {
|
||||
- LSTACK_PRE_LOG(LSTACK_ERR, "cfg mbuf_pool_size %d invaild, it should be in (0,%d].\n", val, RXTX_NB_MBUF_MAX);
|
||||
+ if (val <= 0 || val > TCP_CONN_COUNT) {
|
||||
+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg tcp_conn_count %d invaild, it should be in (0,%d].\n", val, TCP_CONN_COUNT);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- g_config_params.mbuf_pool_size = val;
|
||||
+ g_config_params.tcp_conn_count = val;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int32_t parse_mbuf_count_per_conn(void)
|
||||
+{
|
||||
+ const config_setting_t *arg = NULL;
|
||||
+
|
||||
+ arg = config_lookup(&g_config, "mbuf_count_per_conn");
|
||||
+ if (arg == NULL) {
|
||||
+ g_config_params.tcp_conn_count = MBUF_COUNT_PER_CONN;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ int32_t val = config_setting_get_int(arg);
|
||||
+ if (val <= 0) {
|
||||
+ LSTACK_PRE_LOG(LSTACK_ERR, "cfg mbuf_count_per_conn %d invaild, it should be > 0.\n", val);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ g_config_params.mbuf_count_per_conn = val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
|
||||
index 5475f31..f60963f 100644
|
||||
--- a/src/lstack/core/lstack_dpdk.c
|
||||
+++ b/src/lstack/core/lstack_dpdk.c
|
||||
@@ -179,7 +179,9 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num)
|
||||
}
|
||||
|
||||
stack->rxtx_pktmbuf_pool = create_pktmbuf_mempool("rxtx_mbuf",
|
||||
- get_global_cfg_params()->mbuf_pool_size / stack_num, RXTX_CACHE_SZ, stack->queue_id);
|
||||
+ get_global_cfg_params()->mbuf_count_per_conn * get_global_cfg_params()->tcp_conn_count / stack_num,
|
||||
+ RXTX_CACHE_SZ,
|
||||
+ stack->queue_id);
|
||||
if (stack->rxtx_pktmbuf_pool == NULL) {
|
||||
return -1;
|
||||
}
|
||||
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
|
||||
index bdaa083..0b89e28 100644
|
||||
--- a/src/lstack/include/lstack_cfg.h
|
||||
+++ b/src/lstack/include/lstack_cfg.h
|
||||
@@ -74,7 +74,8 @@ struct cfg_params {
|
||||
uint16_t lpm_rx_pkts;
|
||||
uint32_t lpm_detect_ms;
|
||||
uint32_t lpm_pkts_in_detect;
|
||||
- uint32_t mbuf_pool_size;
|
||||
+ uint32_t tcp_conn_count;
|
||||
+ uint32_t mbuf_count_per_conn;
|
||||
uint32_t send_connect_number;
|
||||
uint32_t read_connect_number;
|
||||
uint32_t rpc_number;
|
||||
diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf
|
||||
index c27db22..b7a4ede 100644
|
||||
--- a/src/lstack/lstack.conf
|
||||
+++ b/src/lstack/lstack.conf
|
||||
@@ -16,8 +16,10 @@ kni_switch=0
|
||||
low_power_mode=0
|
||||
listen_shadow=0
|
||||
|
||||
-#number of mbuf pool for tx and rx. per mbuf is 2560 Byte.
|
||||
-mbuf_pool_size = 256000
|
||||
+#needed mbuf count = tcp_conn_count * mbuf_count_per_conn
|
||||
+tcp_conn_count = 1500
|
||||
+mbuf_count_per_conn = 170
|
||||
+
|
||||
|
||||
#protocol stack thread per loop params
|
||||
#send connect to nic
|
||||
--
|
||||
2.23.0
|
||||
|
||||
30
0192-fix-build-error-in-lstack.patch
Normal file
30
0192-fix-build-error-in-lstack.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From f259ff5f8850c7f1567b0c4b02b79e29ceee48c4 Mon Sep 17 00:00:00 2001
|
||||
From: jiangheng12 <jiangheng14@huawei.com>
|
||||
Date: Mon, 13 Feb 2023 20:36:22 +0800
|
||||
Subject: [PATCH] fix build error in lstack
|
||||
|
||||
---
|
||||
src/lstack/core/lstack_cfg.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
|
||||
index 0da5085..0c4b55b 100644
|
||||
--- a/src/lstack/core/lstack_cfg.c
|
||||
+++ b/src/lstack/core/lstack_cfg.c
|
||||
@@ -58,11 +58,12 @@ static int32_t parse_listen_shadow(void);
|
||||
static int32_t parse_app_bind_numa(void);
|
||||
static int32_t parse_main_thread_affinity(void);
|
||||
static int32_t parse_unix_prefix(void);
|
||||
-static int32_t parse_rxtx_pool_size(void);
|
||||
static int32_t parse_send_connect_number(void);
|
||||
static int32_t parse_read_connect_number(void);
|
||||
static int32_t parse_rpc_number(void);
|
||||
static int32_t parse_nic_read_number(void);
|
||||
+static int32_t parse_tcp_conn_count(void);
|
||||
+static int32_t parse_mbuf_count_per_conn(void);
|
||||
|
||||
struct config_vector_t {
|
||||
const char *name;
|
||||
--
|
||||
2.23.0
|
||||
|
||||
15
gazelle.spec
15
gazelle.spec
@ -2,7 +2,7 @@
|
||||
|
||||
Name: gazelle
|
||||
Version: 1.0.1
|
||||
Release: 47
|
||||
Release: 48
|
||||
Summary: gazelle is a high performance user-mode stack
|
||||
License: MulanPSL-2.0
|
||||
URL: https://gitee.com/openeuler/gazelle
|
||||
@ -201,6 +201,12 @@ Patch9183: 0183-add-log-message-when-wait-for-connecting-to-ltran.patch
|
||||
Patch9184: 0184-add-gazelle-fuzz.patch
|
||||
Patch9185: 0185-add-unitest.patch
|
||||
Patch9186: 0186-add-gazelle-setup-tools.patch
|
||||
Patch9187: 0187-test-readv-writev-epoll_create1-accept4.patch
|
||||
Patch9188: 0188-add-fucntest.patch
|
||||
Patch9189: 0189-fix-coredump-in-example-server-mum-mode.patch
|
||||
Patch9190: 0190-bring-up-kni-when-init.patch
|
||||
Patch9191: 0191-change-mbuf_pool_size-in-lstack.conf-to-tcp_conn_cou.patch
|
||||
Patch9192: 0192-fix-build-error-in-lstack.patch
|
||||
|
||||
%description
|
||||
%{name} is a high performance user-mode stack.
|
||||
@ -241,6 +247,13 @@ install -Dpm 0640 %{_builddir}/%{name}-%{version}/src/ltran/ltran.conf %{b
|
||||
%config(noreplace) %{conf_path}/ltran.conf
|
||||
|
||||
%changelog
|
||||
* Mon Feb 13 2023 net <jiangheng14@huawei.com> - 1.0.1-48
|
||||
- change mbuf_pool_size in lstack.conf to tcp_conn_count * mbuf_count_per_conn
|
||||
- bring up kni when init
|
||||
- fix coredump in example server mum mode
|
||||
- add fucntest
|
||||
- test readv writev epoll_create1 accept4
|
||||
|
||||
* Mon Feb 6 2023 jiangheng12 <jiangheng14@huawei.com> - 1.0.1-47
|
||||
- add gazelle setup tools
|
||||
- add unitest
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user