From 29ce2b92248fce0ce90abbcf0625653a5327b232 Mon Sep 17 00:00:00 2001 From: kircher 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 dumped,caught 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