代码拉取完成,页面将自动刷新
From c2cf2ef0cc9f28a8322e17870d209f546ad6711d Mon Sep 17 00:00:00 2001
From: yinbin6 <yinbin8@huawei.com>
Date: Mon, 4 Mar 2024 11:15:34 +0800
Subject: [PATCH] FAUT INJECT: add fault inject unset method
---
src/lstack/core/lstack_control_plane.c | 2 +-
src/lstack/include/lstack_fault_inject.h | 2 +-
src/lstack/netif/lstack_fault_inject.c | 60 ++++++++++++----
src/ltran/ltran_dfx.c | 92 +++++++++++++++++++++---
4 files changed, 131 insertions(+), 25 deletions(-)
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index 783f21c..9f0c313 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -590,7 +590,7 @@ static int32_t handle_stat_request(int32_t sockfd)
#ifdef GAZELLE_FAULT_INJECT_ENABLE
if (msg.stat_mode == GAZELLE_STAT_FAULT_INJECT_SET ||
msg.stat_mode == GAZELLE_STAT_FAULT_INJECT_UNSET) {
- return handle_fault_inject_cmd(sockfd, &msg);
+ return handle_fault_inject_cmd(sockfd, msg.data.inject, msg.stat_mode);
}
#endif /* GAZELLE_FAULT_INJECT_ENABLE */
diff --git a/src/lstack/include/lstack_fault_inject.h b/src/lstack/include/lstack_fault_inject.h
index d54f1f2..afd8faf 100644
--- a/src/lstack/include/lstack_fault_inject.h
+++ b/src/lstack/include/lstack_fault_inject.h
@@ -15,6 +15,6 @@
#include <stdbool.h>
-int32_t handle_fault_inject_cmd(int32_t sockfd, struct gazelle_stat_msg_request *msg);
+int32_t handle_fault_inject_cmd(int32_t sockfd, struct gazelle_fault_inject_data inject, enum GAZELLE_STAT_MODE stat_mode);
#endif /* __GAZELLE_INJECT_H__ */
diff --git a/src/lstack/netif/lstack_fault_inject.c b/src/lstack/netif/lstack_fault_inject.c
index 4daad10..41e7d95 100644
--- a/src/lstack/netif/lstack_fault_inject.c
+++ b/src/lstack/netif/lstack_fault_inject.c
@@ -150,21 +150,10 @@ static int32_t inject_packet_loss_random(struct protocol_stack *stack, struct rt
return nr_pkts;
}
-int32_t handle_fault_inject_cmd(int32_t sockfd, struct gazelle_stat_msg_request *msg)
+static int32_t inject_respond_msg(int32_t sockfd)
{
struct gazelle_stack_dfx_data rsp = {0};
int32_t ret = 0;
-
- ret = memcpy_s(&g_inject_tbl[msg->data.inject.inject_type].inject_data,
- sizeof(struct gazelle_fault_inject_data),
- &msg->data.inject, sizeof(struct gazelle_fault_inject_data));
- if (ret != EOK) {
- LSTACK_LOG(ERR, LSTACK, "fault inject memcpy_s error, ret = %d", ret);
- return -1;
- }
-
- inject_strategy_update();
-
for (int32_t i = 0; i < GAZELLE_FAULT_INJECT_TYPE_MAX; ++i) {
ret = memcpy_s(&rsp.data.inject, sizeof(struct gazelle_fault_inject_data),
&g_inject_tbl[i].inject_data, sizeof(struct gazelle_fault_inject_data));
@@ -185,3 +174,50 @@ int32_t handle_fault_inject_cmd(int32_t sockfd, struct gazelle_stat_msg_request
return 0;
}
+static int32_t inject_unset_cmd(int32_t sockfd, struct gazelle_fault_inject_data inject)
+{
+ if (inject.inject_type == GAZELLE_FAULT_INJECT_TYPE_MAX) {
+ /* means unset all kinds of fault inject type */
+ for (int32_t i = 0; i < GAZELLE_FAULT_INJECT_TYPE_MAX; ++i) {
+ g_inject_tbl[i].inject_data.fault_inject_on = 0;
+ }
+ } else {
+ int32_t ret = 0;
+ ret = memcpy_s(&g_inject_tbl[inject.inject_type].inject_data,
+ sizeof(struct gazelle_fault_inject_data),
+ &inject, sizeof(struct gazelle_fault_inject_data));
+ if (ret != EOK) {
+ LSTACK_LOG(ERR, LSTACK, "fault inject memcpy_s error, ret = %d", ret);
+ return -1;
+ }
+ }
+
+ inject_strategy_update();
+
+ return inject_respond_msg(sockfd);
+}
+
+static int32_t inject_set_cmd(int32_t sockfd, struct gazelle_fault_inject_data inject)
+{
+ int32_t ret = 0;
+ ret = memcpy_s(&g_inject_tbl[inject.inject_type].inject_data,
+ sizeof(struct gazelle_fault_inject_data),
+ &inject, sizeof(struct gazelle_fault_inject_data));
+ if (ret != EOK) {
+ LSTACK_LOG(ERR, LSTACK, "fault inject memcpy_s error, ret = %d", ret);
+ return -1;
+ }
+
+ inject_strategy_update();
+
+ return inject_respond_msg(sockfd);
+}
+
+int32_t handle_fault_inject_cmd(int32_t sockfd, struct gazelle_fault_inject_data inject, enum GAZELLE_STAT_MODE stat_mode)
+{
+ if (stat_mode == GAZELLE_STAT_FAULT_INJECT_UNSET) {
+ return inject_unset_cmd(sockfd, inject);
+ }
+ return inject_set_cmd(sockfd, inject);
+}
+
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 413bf89..96509e5 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -97,7 +97,7 @@ static struct gazelle_fault_inject_rule_list g_gazelle_fault_inject_rule_list[]
};
static void gazelle_print_fault_inject_set_status(void *buf, const struct gazelle_stat_msg_request *req_msg);
-
+static void gazelle_print_fault_inject_unset_status(void *buf, const struct gazelle_stat_msg_request *req_msg);
#endif /* GAZELLE_FAULT_INJECT_ENABLE */
static bool g_use_ltran = false;
@@ -1504,6 +1504,7 @@ static int32_t parse_dfx_lstack_args(int32_t argc, char *argv[], struct gazelle_
#define INJECT_DIGITAL_FIRST_INDEX 3
#define INJECT_DIGITAL_SECOND_INDEX 4
#define INJECT_RULE_INDEX 5
+#define INJECT_UNSET_TYPE_INDEX 3
static void gazelle_print_fault_inject_type_info(struct gazelle_fault_inject_data *inject)
@@ -1549,6 +1550,33 @@ static void gazelle_print_fault_inject_set_status(void *buf, const struct gazell
static void gazelle_print_fault_inject_unset_status(void *buf, const struct gazelle_stat_msg_request *req_msg)
{
+ int32_t ret;
+ static int32_t inject_enable[GAZELLE_FAULT_INJECT_TYPE_MAX];
+ struct gazelle_stack_dfx_data *stat = (struct gazelle_stack_dfx_data *)buf;
+ struct gazelle_fault_inject_data *inject = &stat->data.inject;
+
+ printf("\n\t\t\t\t\t **** INJECT ENABLE ITEM **** \n\n");
+ do {
+ inject_enable[inject->inject_type] = inject->fault_inject_on;
+ gazelle_print_fault_inject_type_info(inject);
+ if (stat->eof != 0) {
+ break;
+ }
+ ret = dfx_stat_read_from_ltran(buf, sizeof(struct gazelle_stack_dfx_data), req_msg->stat_mode);
+ if (ret != GAZELLE_OK) {
+ return;
+ }
+ } while (true);
+
+ printf("\n\n\t\t\t\t\t **** INJECT DISABLE ITEM **** \n\n");
+ printf("\tThe currently closed inject types are: ");
+ for (int32_t i = 1; i < GAZELLE_FAULT_INJECT_TYPE_MAX; ++i) {
+ if (!inject_enable[i]) {
+ /* i - 1 means fault inject type mapping inject_type_item name */
+ printf("\"%s\" ", inject_type_list[i - 1].inject_type_item);
+ }
+ }
+ printf("\n");
return;
}
@@ -1653,21 +1681,45 @@ static int32_t parse_fault_inject_digital_data(char *argv[], struct gazelle_stat
return parse_success;
}
-static int32_t parse_dfx_fault_inject_args(int32_t argc, char *argv[], struct gazelle_stat_msg_request *req_msg)
+static int32_t parse_fault_inject_unset_type(char *argv[], struct gazelle_stat_msg_request *req_msg)
{
- int32_t num_cmd = 0; /* while parse error, num_cmd will return as 0, or num_cmd should be returned as 1. */
-
- req_msg->data.inject.fault_inject_on = 1; /* set fault inject on */
+ int32_t num_cmd = 0;
+
+ if (strcmp(argv[INJECT_TYPE_INDEX], "unset") != 0) {
+ printf("FAULT_INJECT error: unrecognized input -- %s, should be \"unset\"\n", argv[INJECT_TYPE_INDEX]);
+ return num_cmd;
+ }
+
+ req_msg->data.inject.fault_inject_on = 0; /* unset fault inject */
+ req_msg->stat_mode = GAZELLE_STAT_FAULT_INJECT_UNSET;
+
+ if (strcmp(argv[INJECT_UNSET_TYPE_INDEX], "all") == 0) {
+ req_msg->data.inject.inject_type = GAZELLE_FAULT_INJECT_TYPE_MAX;
+ return ++num_cmd;
+ }
- if (argc == GAZELLE_SET_FAULT_INJECT_PARAM_COUNT) {
- req_msg->stat_mode = GAZELLE_STAT_FAULT_INJECT_SET;
- } else if (argc == GAZELLE_UNSET_FAULT_INJECT_PARAM_COUNT) {
- req_msg->stat_mode = GAZELLE_STAT_FAULT_INJECT_UNSET;
- } else {
- printf("FAULT_INJECT error: Count of params wrong , correct count is 6 or 4, now is %d\n", argc);
+ int32_t inject_type_count = sizeof(inject_type_list) / sizeof(inject_type_list[0]);
+ for (int32_t i = 0; i < inject_type_count; ++i) {
+ if (strcmp(inject_type_list[i].inject_type_item, argv[INJECT_UNSET_TYPE_INDEX]) == 0) {
+ req_msg->data.inject.inject_type = inject_type_list[i].inject_type_parsed;
+ break;
+ }
+ }
+ if (req_msg->data.inject.inject_type == GAZELLE_FAULT_INJECT_TYPE_ERR) {
+ printf("FAULT_INJECT error: input inject type is wrong -- %s\n", argv[INJECT_TYPE_INDEX]);
return num_cmd;
}
+ return ++num_cmd;
+}
+
+static int32_t parse_fault_inject_set_type(char *argv[], struct gazelle_stat_msg_request *req_msg)
+{
+ int32_t num_cmd = 0;
+
+ req_msg->data.inject.fault_inject_on = 1; /* set fault inject on */
+ req_msg->stat_mode = GAZELLE_STAT_FAULT_INJECT_SET;
+
int32_t inject_type_count = sizeof(inject_type_list) / sizeof(inject_type_list[0]);
for (int32_t i = 0; i < inject_type_count; ++i) {
if (strcmp(inject_type_list[i].inject_type_item, argv[INJECT_TYPE_INDEX]) == 0) {
@@ -1698,6 +1750,24 @@ static int32_t parse_dfx_fault_inject_args(int32_t argc, char *argv[], struct ga
return num_cmd;
}
+static int32_t parse_dfx_fault_inject_args(int32_t argc, char *argv[], struct gazelle_stat_msg_request *req_msg)
+{
+ int32_t num_cmd = 0; /* while parse error, num_cmd will return as 0, or num_cmd should be returned as 1. */
+
+ if (argc == GAZELLE_UNSET_FAULT_INJECT_PARAM_COUNT) {
+ num_cmd = parse_fault_inject_unset_type(argv, req_msg);
+ return num_cmd;
+ }
+
+ if (argc == GAZELLE_SET_FAULT_INJECT_PARAM_COUNT) {
+ num_cmd = parse_fault_inject_set_type(argv, req_msg);
+ return num_cmd;
+ }
+
+ printf("FAULT_INJECT error: Count of params wrong , correct count is 6 or 4, now is %d\n", argc);
+ return num_cmd;
+}
+
#endif /* GAZELLE_FAULT_INJECT_ENABLE */
static int32_t parse_dfx_cmd_args(int32_t argc, char *argv[], struct gazelle_stat_msg_request *req_msg)
--
2.27.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。