summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <[email protected]>2023-12-26 07:51:02 +0000
committerroot <[email protected]>2023-12-26 07:51:02 +0000
commit4afee2a381319f8f5ca07af1fe4d76e4d798fcb6 (patch)
tree456683206926d77468efdd06d0b8c5ec006661c0
parent71eff2932e237c5729b16445e94b8f1a88d689a1 (diff)
TSG-18141: shaping 自己去重rule id
-rw-r--r--shaping/src/shaper_maat.cpp44
-rw-r--r--shaping/test/gtest_shaper_maat.cpp65
2 files changed, 105 insertions, 4 deletions
diff --git a/shaping/src/shaper_maat.cpp b/shaping/src/shaper_maat.cpp
index 61f2e23..f159c2f 100644
--- a/shaping/src/shaper_maat.cpp
+++ b/shaping/src/shaper_maat.cpp
@@ -338,12 +338,48 @@ int shaper_rule_is_enabled(struct shaping_thread_ctx *ctx, long long rule_id)
return 0;
}
+static int shaper_rules_dup_remove(struct shaping_flow *sf, long long *rule_compile_ids, int rule_num, long long *rule_ids_remove_dup)
+{
+ int i, j;
+ int rule_num_remove_dup = 0;
+
+ for (i = 0; i < rule_num; i++) {
+ for (j = 0; j < sf->rule_num; j++) {
+ if (rule_compile_ids[i] == sf->matched_rule_infos[j].id) {
+ break;
+ }
+ }
+ if (j == sf->rule_num) {
+ rule_ids_remove_dup[rule_num_remove_dup] = rule_compile_ids[i];
+ rule_num_remove_dup++;
+ }
+ }
+
+ return rule_num_remove_dup;
+}
+
void shaper_rules_update(struct shaping_thread_ctx *ctx, struct shaping_flow *sf, long long *rule_compile_ids, int rule_num)
{
int i, j;
int priority_changed = 0;
+ long long rule_ids_remove_dup[SHAPING_RULE_NUM_MAX] = {0};
+ int rule_num_remove_dup = 0;
+
+ if (rule_num > SHAPING_RULE_NUM_MAX) {
+ char *addr_str = addr_tuple4_to_str(&sf->tuple4);
+ LOG_ERROR("%s: ctrl_active has too many rules %d exceed limit %d for flow: %s", LOG_TAG_MAAT, rule_num, SHAPING_RULE_NUM_MAX, addr_str);
+ if (addr_str) {
+ free(addr_str);
+ }
+ return;
+ }
+
+ rule_num_remove_dup = shaper_rules_dup_remove(sf, rule_compile_ids, rule_num, rule_ids_remove_dup);
+ if (rule_num_remove_dup == 0) {
+ return;
+ }
- if (sf->rule_num + rule_num > SHAPING_RULE_NUM_MAX) {
+ if (sf->rule_num + rule_num_remove_dup > SHAPING_RULE_NUM_MAX) {
char *addr_str = addr_tuple4_to_str(&sf->tuple4);
LOG_ERROR("%s: shaping exceed maat rule num limit %d for flow: %s", LOG_TAG_MAAT, SHAPING_RULE_NUM_MAX, addr_str);
if (addr_str) {
@@ -352,15 +388,15 @@ void shaper_rules_update(struct shaping_thread_ctx *ctx, struct shaping_flow *sf
return;
}
- for (i = sf->rule_num, j = 0; i < sf->rule_num + rule_num; i++, j++) {
- shaper_rule_update(ctx, sf, &sf->matched_rule_infos[i], rule_compile_ids[j], &priority_changed);
+ for (i = sf->rule_num, j = 0; i < sf->rule_num + rule_num_remove_dup; i++, j++) {
+ shaper_rule_update(ctx, sf, &sf->matched_rule_infos[i], rule_ids_remove_dup[j], &priority_changed);
}
if (sf->rule_num > 0 && priority_changed) {
shaper_stat_refresh(ctx, sf, ctx->thread_index, 1);
}
- sf->rule_num += rule_num;
+ sf->rule_num += rule_num_remove_dup;
shaper_profiles_priority_update(sf);
return;
diff --git a/shaping/test/gtest_shaper_maat.cpp b/shaping/test/gtest_shaper_maat.cpp
index feed669..ff94efe 100644
--- a/shaping/test/gtest_shaper_maat.cpp
+++ b/shaping/test/gtest_shaper_maat.cpp
@@ -113,6 +113,71 @@ TEST(shaping_flow, update_rule)
free(ctx.maat_info);
}
+TEST(shaping_flow, update_rule_dup)
+{
+ struct shaping_thread_ctx ctx;
+ struct shaping_flow sf;
+ struct shaping_rule_info *rule_info;
+ long long rule_ids[] = {1, 2, 3, 4};
+ int prioritys[] = {1, 2, 3, 4};
+ int profile_nums[] = {1, 2, 3, 1};
+ int profile_ids[][MAX_REF_PROFILE] = {{1}, {2, 3}, {4, 5, 6}, {7}};
+
+ stub_init();
+
+ stub_set_matched_shaping_rules(4, rule_ids, prioritys, profile_nums, profile_ids);
+
+ ctx.maat_info = (struct shaping_maat_info *)calloc(1, sizeof(struct shaping_maat_info));
+ ctx.maat_info->rule_table_id = STUB_MAAT_SHAPING_RULE_TABLE_ID;
+ ctx.maat_info->profile_table_id = STUB_MAAT_SHAPING_PROFILE_TABLE_ID;
+
+ memset(&sf, 0, sizeof(sf));
+ sf.priority = SHAPING_PRIORITY_NUM_MAX;
+
+ long long rule_id1[] = {1, 2, 3};
+ shaper_rules_update(&ctx, &sf, rule_id1, 3);
+
+ EXPECT_EQ(sf.rule_num, 3);
+
+ rule_info = &sf.matched_rule_infos[0];
+ EXPECT_EQ(rule_info->id, 1);
+ EXPECT_EQ(rule_info->primary.id, 1);
+ EXPECT_EQ(rule_info->primary.priority, 1);
+ EXPECT_EQ(rule_info->borrowing_num, 0);
+
+ rule_info = &sf.matched_rule_infos[1];
+ EXPECT_EQ(rule_info->id, 2);
+ EXPECT_EQ(rule_info->primary.id, 2);
+ EXPECT_EQ(rule_info->primary.priority, 1);
+ EXPECT_EQ(rule_info->borrowing_num, 1);
+ EXPECT_EQ(rule_info->borrowing[0].id, 3);
+ EXPECT_EQ(rule_info->borrowing[0].priority, 2);
+
+ rule_info = &sf.matched_rule_infos[2];
+ EXPECT_EQ(rule_info->id, 3);
+ EXPECT_EQ(rule_info->primary.id, 4);
+ EXPECT_EQ(rule_info->primary.priority, 1);
+ EXPECT_EQ(rule_info->borrowing_num, 2);
+ EXPECT_EQ(rule_info->borrowing[0].id, 5);
+ EXPECT_EQ(rule_info->borrowing[0].priority, 2);
+ EXPECT_EQ(rule_info->borrowing[1].id, 6);
+ EXPECT_EQ(rule_info->borrowing[1].priority, 3);
+
+ long long rule_id2[] = {1};
+ shaper_rules_update(&ctx, &sf, rule_id2, 1);
+ EXPECT_EQ(sf.rule_num, 3);
+
+ long long rule_id3[] = {2, 3, 4};
+ shaper_rules_update(&ctx, &sf, rule_id3, 3);
+ EXPECT_EQ(sf.rule_num, 4);
+ rule_info = &sf.matched_rule_infos[3];
+ EXPECT_EQ(rule_info->id, 4);
+ EXPECT_EQ(rule_info->primary.id, 7);
+ EXPECT_EQ(rule_info->primary.priority, 1);
+
+ free(ctx.maat_info);
+}
+
TEST(shaping_flow, update_rule_after_priority_confirmed)
{
struct shaping_thread_ctx ctx;