gazelle/0131-add-mutil-NIC-support-in-gazelle.patch
wu-changsheng e417d29170 add muti nic and fix bugs
(cherry picked from commit 680f9fbf06160e2e9dda88d3b8238c53680ab899)
2022-11-14 14:06:01 +08:00

433 lines
15 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 29ce2b92248fce0ce90abbcf0625653a5327b232 Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
Date: Sat, 12 Nov 2022 21:12:03 +0800
Subject: [PATCH 17/20] add mutil NIC support in gazelle
---
src/common/gazelle_base_func.h | 2 +
src/common/gazelle_opt.h | 2 +
src/common/gazelle_parse_config.c | 31 +++++++++++
src/lstack/core/lstack_cfg.c | 46 ++++++++++++++++
src/lstack/core/lstack_control_plane.c | 17 ++++--
src/lstack/include/lstack_cfg.h | 1 +
src/ltran/ltran_base.h | 1 +
src/ltran/ltran_dfx.c | 35 +++++++++++-
src/ltran/ltran_param.c | 75 +++++++++++++++++++++++++-
src/ltran/ltran_param.h | 2 +
src/ltran/main.c | 9 ++++
11 files changed, 215 insertions(+), 6 deletions(-)
diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h
index fe3411a..22d7a7f 100644
--- a/src/common/gazelle_base_func.h
+++ b/src/common/gazelle_base_func.h
@@ -32,6 +32,8 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size);
int32_t check_and_set_run_dir(void);
+int32_t filename_check(const char* args);
+
#undef container_of
#define container_of(ptr, type, field) ((type *)(void*)(((char *)(ptr)) - offsetof(type, field)))
diff --git a/src/common/gazelle_opt.h b/src/common/gazelle_opt.h
index 7521e8c..e9e3676 100644
--- a/src/common/gazelle_opt.h
+++ b/src/common/gazelle_opt.h
@@ -75,6 +75,8 @@
#define GAZELLE_MAX_STACK_ARRAY_SIZE GAZELLE_CLIENT_NUM
#define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/gazelle_client.sock"
+#define GAZELLE_REG_SOCK_FILENAME "gazelle_client.sock"
+#define GAZELLE_SOCK_FILENAME_MAXLEN 128
#define GAZELLE_RUN_DIR "/var/run/gazelle/"
#define GAZELLE_FILE_PERMISSION 0700
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
index 8556e37..fc286d9 100644
--- a/src/common/gazelle_parse_config.c
+++ b/src/common/gazelle_parse_config.c
@@ -21,6 +21,16 @@
#include "gazelle_opt.h"
#include "gazelle_base_func.h"
+#ifdef LTRAN_COMPILE
+#include "ltran_log.h"
+#define COMMON_ERR(fmt, ...) LTRAN_ERR(fmt, ##__VA_ARGS__)
+#define COMMON_INFO(fmt, ...) LTRAN_INFO(fmt, ##__VA_ARGS__)
+#else
+#include "lstack_log.h"
+#define COMMON_ERR(fmt, ...) LSTACK_LOG(ERR, LSTACK, fmt, ##__VA_ARGS__)
+#define COMMON_INFO(fmt, ...) LSTACK_LOG(INFO, LSTACK, fmt, ##__VA_ARGS__)
+#endif
+
static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size)
{
const char *delim = "-";
@@ -87,3 +97,24 @@ int32_t check_and_set_run_dir(void)
}
return 0;
}
+
+/* return 1 for check error */
+int32_t filename_check(const char* args)
+{
+ if (args == NULL) {
+ return 1;
+ }
+
+ if (strlen(args) <= 0 || strlen(args) > GAZELLE_SOCK_FILENAME_MAXLEN - 1) {
+ COMMON_ERR("socket_filename_check: invalid unix sock name %s, filename exceeds the limit %d.\n", args, GAZELLE_SOCK_FILENAME_MAXLEN);
+ return 1;
+ }
+
+ char* sensitive_chars = strpbrk(args, "|;&$><`\\!\n");
+ if (sensitive_chars != NULL) {
+ COMMON_ERR("socket_filename_check: invalid unix sock name %s, filename contains sensitive characters.\n", args);
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index 2cd9989..1ff3794 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -56,6 +56,7 @@ static int32_t parse_gateway_addr(void);
static int32_t parse_kni_switch(void);
static int32_t parse_listen_shadow(void);
static int32_t parse_app_bind_numa(void);
+static int32_t parse_unix_prefix(void);
struct config_vector_t {
const char *name;
@@ -75,6 +76,7 @@ static struct config_vector_t g_config_tbl[] = {
{ "kni_switch", parse_kni_switch },
{ "listen_shadow", parse_listen_shadow },
{ "app_bind_numa", parse_app_bind_numa },
+ { "unix_prefix", parse_unix_prefix },
{ NULL, NULL }
};
@@ -803,3 +805,47 @@ int32_t cfg_init(void)
free(config_file);
return ret;
}
+
+static int32_t parse_unix_prefix(void)
+{
+ const config_setting_t *unix_prefix = NULL;
+ const char *args = NULL;
+ int32_t ret = 0;
+
+ ret = memset_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename),
+ 0, sizeof(g_config_params.unix_socket_filename));
+ if (ret != EOK) {
+ return ret;
+ }
+
+ ret = strncpy_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename),
+ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1);
+ if (ret != EOK) {
+ return ret;
+ }
+
+ unix_prefix = config_lookup(&g_config, "unix_prefix");
+
+ if (unix_prefix) {
+ args = config_setting_get_string(unix_prefix);
+
+ if (filename_check(args)) {
+ return -EINVAL;
+ }
+
+ ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename),
+ args, strlen(args) + 1);
+ if (ret != EOK) {
+ return ret;
+ }
+ }
+
+ ret = strncat_s(g_config_params.unix_socket_filename, sizeof(g_config_params.unix_socket_filename),
+ GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1);
+ if (ret != EOK) {
+ return ret;
+ }
+
+ return 0;
+}
+
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index 7f62254..0a10d83 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -67,9 +67,12 @@ static int control_unix_sock(struct sockaddr_un *address)
posix_api->close_fn(sockfd);
return -1;
}
+
+ struct cfg_params *global_params = get_global_cfg_params();
+
address->sun_family = AF_UNIX;
- int ret = strncpy_s(address->sun_path, sizeof(address->sun_path), GAZELLE_REG_SOCK_PATHNAME,
- strlen(GAZELLE_REG_SOCK_PATHNAME) + 1);
+ int ret = strncpy_s(address->sun_path, sizeof(address->sun_path), global_params->unix_socket_filename,
+ strlen(global_params->unix_socket_filename) + 1);
if (ret != EOK) {
posix_api->close_fn(sockfd);
return -1;
@@ -459,6 +462,14 @@ void control_fd_close(void)
/* 200ms: wait ltran instance logout */
rte_delay_ms(200);
}
+
+ struct cfg_params *global_params = get_global_cfg_params();
+ if (!global_params->use_ltran) {
+ int ret = unlink(global_params->unix_socket_filename);
+ if (ret == -1) {
+ LSTACK_LOG(ERR, LSTACK, "unlink failed, just skip it\n");
+ }
+ }
}
int32_t control_init_client(bool is_reconnect)
@@ -675,7 +686,7 @@ static int32_t control_init_server(void)
return -1;
}
- ret = unlink(GAZELLE_REG_SOCK_PATHNAME);
+ ret = unlink(get_global_cfg_params()->unix_socket_filename);
if (ret == -1) {
LSTACK_LOG(ERR, LSTACK, "unlink failed, just skip it\n");
}
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
index 80dfd24..3864250 100644
--- a/src/lstack/include/lstack_cfg.h
+++ b/src/lstack/include/lstack_cfg.h
@@ -80,6 +80,7 @@ struct cfg_params {
int dpdk_argc;
char **dpdk_argv;
struct secondary_attach_arg sec_attach_arg;
+ char unix_socket_filename[NAME_MAX];
};
struct cfg_params *get_global_cfg_params(void);
diff --git a/src/ltran/ltran_base.h b/src/ltran/ltran_base.h
index 41d4cfb..6be9152 100644
--- a/src/ltran/ltran_base.h
+++ b/src/ltran/ltran_base.h
@@ -99,5 +99,6 @@
#define GAZELLE_INET_ADDRSTRLEN 16
#define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/gazelle_cmd.sock"
+#define GAZELLE_DFX_SOCK_FILENAME "gazelle_cmd.sock"
#endif /* ifndef __GAZELLE_BASE_H__ */
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index de97a48..bab3f89 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -57,6 +57,8 @@ static struct gazelle_stat_lstack_total g_last_lstack_total[GAZELLE_MAX_STACK_AR
static bool g_use_ltran = false;
+static char* g_unix_prefix;
+
/* Use the largest data structure. */
#define GAZELLE_CMD_RESP_BUFFER_SIZE (sizeof(struct gazelle_stack_dfx_data) / sizeof(char))
@@ -162,15 +164,23 @@ static int32_t dfx_connect_ltran(bool use_ltran, bool probe)
printf("%s:%d memset_s fail ret=%d\n", __FUNCTION__, __LINE__, ret);
}
+ if (g_unix_prefix) {
+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_RUN_DIR,
+ strlen(GAZELLE_RUN_DIR) + 1);
+ if (ret != EOK) {
+ printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret);
+ }
+ }
+
addr.sun_family = AF_UNIX;
if (use_ltran) {
- ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME,
+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME,
strlen(GAZELLE_DFX_SOCK_PATHNAME) + 1);
if (ret != EOK) {
printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret);
}
} else {
- ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_PATHNAME,
+ ret = strncat_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_REG_SOCK_PATHNAME,
strlen(GAZELLE_REG_SOCK_PATHNAME) + 1);
if (ret != EOK) {
printf("%s:%d strncpy_s fail ret=%d\n", __FUNCTION__, __LINE__, ret);
@@ -1251,6 +1261,27 @@ int32_t main(int32_t argc, char *argv[])
struct gazelle_stat_msg_request req_msg[GAZELLE_CMD_MAX] = {0};
int32_t req_msg_num, ret;
+ int unix_arg = 0;
+ for (int32_t i = 1; i < argc; i++) {
+ if (unix_arg == 0) {
+ if (!strcmp(argv[i], "-u")) {
+ unix_arg++;
+ }
+ } else if (unix_arg == 1) {
+ g_unix_prefix = argv[i];
+ unix_arg++;
+ } else {
+ argv[i - unix_arg] = argv[i];
+ }
+ }
+
+ argv[argc - unix_arg] = argv[argc];
+ argc -= unix_arg;
+
+ if (g_unix_prefix && filename_check(g_unix_prefix)) {
+ return -1;
+ }
+
int32_t fd = dfx_connect_ltran(true, true);
if (fd > 0) {
g_use_ltran = true;
diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c
index fc45895..4974085 100644
--- a/src/ltran/ltran_param.c
+++ b/src/ltran/ltran_param.c
@@ -42,6 +42,7 @@
#define PARAM_BOND_RX_QUEUE_NUM "bond_rx_queue_num"
#define PARAM_BOND_MACS "bond_macs"
#define PARAM_TCP_CONN_SCAN_INTERVAL "tcp_conn_scan_interval"
+#define PARAM_UNIX_PREFIX "unix_prefix"
static struct ltran_config g_ltran_config = {0};
struct ltran_config* get_ltran_config(void)
@@ -537,6 +538,78 @@ struct param_parser {
param_parse_func func;
};
+static int32_t parse_unix_prefix(const config_t *config, const char *key, struct ltran_config *ltran_config)
+{
+ const char *prefix = NULL;
+ int32_t ret = 0;
+
+ ret = memset_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename),
+ 0, sizeof(ltran_config->unix_socket_filename));
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ ret = memset_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename),
+ 0, sizeof(ltran_config->dfx_socket_filename));
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ ret = strncpy_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename),
+ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1);
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ ret = strncpy_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename),
+ GAZELLE_RUN_DIR, strlen(GAZELLE_RUN_DIR) + 1);
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ ret = config_lookup_string(config, key, &prefix);
+ if (ret) {
+ if (filename_check(prefix)) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ ret = strncat_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename),
+ prefix, strlen(prefix) + 1);
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ ret = strncat_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename),
+ prefix, strlen(prefix) + 1);
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+ }
+
+ ret = strncat_s(ltran_config->unix_socket_filename, sizeof(ltran_config->unix_socket_filename),
+ GAZELLE_REG_SOCK_FILENAME, strlen(GAZELLE_REG_SOCK_FILENAME) + 1);
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ ret = strncat_s(ltran_config->dfx_socket_filename, sizeof(ltran_config->dfx_socket_filename),
+ GAZELLE_DFX_SOCK_FILENAME, strlen(GAZELLE_DFX_SOCK_FILENAME) + 1);
+ if (ret != EOK) {
+ gazelle_set_errno(GAZELLE_EINETATON);
+ return GAZELLE_ERR;
+ }
+
+ return GAZELLE_OK;
+}
+
struct param_parser g_param_parse_tbl[] = {
{PARAM_FORWARD_KIT_ARGS, parse_forward_kit_args},
{PARAM_DISPATCH_MAX_CLIENT, parse_dispatch_max_client},
@@ -551,6 +624,7 @@ struct param_parser g_param_parse_tbl[] = {
{PARAM_BOND_TX_QUEUE_NUM, parse_bond_tx_queue_num},
{PARAM_TCP_CONN_SCAN_INTERVAL, parse_tcp_conn_scan_interval},
{PARAM_KNI_SWITCH, parse_kni_switch},
+ {PARAM_UNIX_PREFIX, parse_unix_prefix},
};
int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config)
@@ -597,4 +671,3 @@ bool is_same_mac_addr(const uint8_t *smac, const uint8_t *dmac)
}
return true;
}
-
diff --git a/src/ltran/ltran_param.h b/src/ltran/ltran_param.h
index 3ec6451..6f013d5 100644
--- a/src/ltran/ltran_param.h
+++ b/src/ltran/ltran_param.h
@@ -56,6 +56,8 @@ struct ltran_config {
struct {
int32_t log_switch;
} log;
+ char unix_socket_filename[NAME_MAX];
+ char dfx_socket_filename[NAME_MAX];
};
int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *ltran_config);
diff --git a/src/ltran/main.c b/src/ltran/main.c
index 691595e..03b3ad5 100644
--- a/src/ltran/main.c
+++ b/src/ltran/main.c
@@ -58,6 +58,15 @@ static void sig_default_handler(int32_t sig)
LTRAN_ERR("ltran dumpedcaught signal%d.\n", sig);
print_stack();
dpdk_kni_release();
+ int ret = 0;
+ ret = unlink(get_ltran_config()->unix_socket_filename);
+ if (ret) {
+ LTRAN_WARN("unlink %s ERROR. errn: %d. ret=%d\n", get_ltran_config()->unix_socket_filename, errno, ret);
+ }
+ ret = unlink(get_ltran_config()->dfx_socket_filename);
+ if (ret) {
+ LTRAN_WARN("unlink %s ERROR. errn: %d. ret=%d\n", get_ltran_config()->dfx_socket_filename, errno, ret);
+ }
kill(getpid(), sig);
}
--
2.23.0