Fetch the repository succeeded.
This action will force synchronization from src-openEuler/gazelle, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。