diff options
| author | root <[email protected]> | 2023-12-26 07:51:02 +0000 |
|---|---|---|
| committer | root <[email protected]> | 2023-12-26 07:51:02 +0000 |
| commit | 4afee2a381319f8f5ca07af1fe4d76e4d798fcb6 (patch) | |
| tree | 456683206926d77468efdd06d0b8c5ec006661c0 | |
| parent | 71eff2932e237c5729b16445e94b8f1a88d689a1 (diff) | |
TSG-18141: shaping 自己去重rule id
| -rw-r--r-- | shaping/src/shaper_maat.cpp | 44 | ||||
| -rw-r--r-- | shaping/test/gtest_shaper_maat.cpp | 65 |
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; |
