diff options
| author | songyanchao <[email protected]> | 2022-11-15 10:25:16 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2022-11-15 10:25:16 +0000 |
| commit | 1ba7813f8db2c0ec08b6c6a26bf228668086605c (patch) | |
| tree | 200059d45091f3add77ed48b506ce0c173149524 | |
| parent | 336178dfb66237dc540f1e193127577b0a7aa19d (diff) | |
🐞 fix(TSG-12379): 修改 Classifier Rule 为空时规则解析异常问题v4.6.8-20221115
修改 Classifier Rule 为空时规则解析异常问题
| -rw-r--r-- | service/src/node_classifier.c | 80 |
1 files changed, 47 insertions, 33 deletions
diff --git a/service/src/node_classifier.c b/service/src/node_classifier.c index 9d2adb1..83fb896 100644 --- a/service/src/node_classifier.c +++ b/service/src/node_classifier.c @@ -858,6 +858,48 @@ int classifier_v4_repeated_rule_check(struct classifier_management * _classifier return RT_SUCCESS; } +/* Dump classifier rule ipv4 */ +void dump_classifier_rule_ipv4(struct classifier_rule * rule) +{ + struct in_addr src_addr, dst_addr; + src_addr.s_addr = htonl(rule->field[CLASSIFIER_FIELD_SRC_IP_V4].value.u32); + dst_addr.s_addr = htonl(rule->field[CLASSIFIER_FIELD_DST_IP_V4].value.u32); + MR_INFO(" Src Ip Addr : %s", inet_ntoa(src_addr)); + MR_INFO(" Src Ip Mask : %u", rule->field[CLASSIFIER_FIELD_SRC_IP_V4].mask_range.u32); + MR_INFO(" Dst Ip Addr : %s", inet_ntoa(dst_addr)); + MR_INFO(" Dst Ip Mask : %u", rule->field[CLASSIFIER_FIELD_DST_IP_V4].mask_range.u32); +} + +/* Dump classifier rule ipv6 */ +void dump_classifier_rule_ipv6(struct classifier_rule * rule) +{ + uint32_t src_ip_addr_v6[4] = {}, dst_ip_addr_v6[4] = {}, src_ip_mask_v6 = 0, dst_ip_mask_v6 = 0; + char str_ipv6_src[INET6_ADDRSTRLEN] = {0}, str_ipv6_dst[INET6_ADDRSTRLEN] = {0}; + src_ip_addr_v6[0] = htonl(rule->field[CLASSIFIER_SRC1_FIELD_IPV6].value.u32); + src_ip_addr_v6[1] = htonl(rule->field[CLASSIFIER_SRC2_FIELD_IPV6].value.u32); + src_ip_addr_v6[2] = htonl(rule->field[CLASSIFIER_SRC3_FIELD_IPV6].value.u32); + src_ip_addr_v6[3] = htonl(rule->field[CLASSIFIER_SRC4_FIELD_IPV6].value.u32); + dst_ip_addr_v6[0] = htonl(rule->field[CLASSIFIER_DST1_FIELD_IPV6].value.u32); + dst_ip_addr_v6[1] = htonl(rule->field[CLASSIFIER_DST2_FIELD_IPV6].value.u32); + dst_ip_addr_v6[2] = htonl(rule->field[CLASSIFIER_DST3_FIELD_IPV6].value.u32); + dst_ip_addr_v6[3] = htonl(rule->field[CLASSIFIER_DST4_FIELD_IPV6].value.u32); + inet_ntop(AF_INET6, src_ip_addr_v6, str_ipv6_src, INET6_ADDRSTRLEN); + inet_ntop(AF_INET6, dst_ip_addr_v6, str_ipv6_dst, INET6_ADDRSTRLEN); + src_ip_mask_v6 = rule->field[CLASSIFIER_SRC1_FIELD_IPV6].mask_range.u32 + + rule->field[CLASSIFIER_SRC2_FIELD_IPV6].mask_range.u32 + + rule->field[CLASSIFIER_SRC3_FIELD_IPV6].mask_range.u32 + + rule->field[CLASSIFIER_SRC4_FIELD_IPV6].mask_range.u32; + dst_ip_mask_v6 = rule->field[CLASSIFIER_DST1_FIELD_IPV6].mask_range.u32 + + rule->field[CLASSIFIER_DST2_FIELD_IPV6].mask_range.u32 + + rule->field[CLASSIFIER_DST3_FIELD_IPV6].mask_range.u32 + + rule->field[CLASSIFIER_DST4_FIELD_IPV6].mask_range.u32; + + MR_INFO(" Src Ip Addr : %s", str_ipv6_src); + MR_INFO(" Src Ip Mask : %u", src_ip_mask_v6); + MR_INFO(" Dst Ip Addr : %s", str_ipv6_dst); + MR_INFO(" Dst Ip Mask : %u", dst_ip_mask_v6); +} + /* Dump single classifier rule */ void dump_classifier_rule(struct classifier_rule * rule, struct mr_action * action) { @@ -869,47 +911,19 @@ void dump_classifier_rule(struct classifier_rule * rule, struct mr_action * acti switch (rule->field[CLASSIFIER_FIELD_IP_VERSION].value.u16) { case MR_NODE_COMMON_IP_VERSION_V4: { - struct in_addr src_addr, dst_addr; - src_addr.s_addr = htonl(rule->field[CLASSIFIER_FIELD_SRC_IP_V4].value.u32); - dst_addr.s_addr = htonl(rule->field[CLASSIFIER_FIELD_DST_IP_V4].value.u32); MR_INFO(" Ip Version : IPv4"); - MR_INFO(" Src Ip Addr : %s", inet_ntoa(src_addr)); - MR_INFO(" Src Ip Mask : %u", rule->field[CLASSIFIER_FIELD_SRC_IP_V4].mask_range.u32); - MR_INFO(" Dst Ip Addr : %s", inet_ntoa(dst_addr)); - MR_INFO(" Dst Ip Mask : %u", rule->field[CLASSIFIER_FIELD_DST_IP_V4].mask_range.u32); + dump_classifier_rule_ipv4(rule); } break; case MR_NODE_COMMON_IP_VERSION_V6: { - uint32_t src_ip_addr_v6[4] = {}, dst_ip_addr_v6[4] = {}, src_ip_mask_v6 = 0, dst_ip_mask_v6 = 0; - char str_ipv6_src[INET6_ADDRSTRLEN] = {0}, str_ipv6_dst[INET6_ADDRSTRLEN] = {0}; - src_ip_addr_v6[0] = htonl(rule->field[CLASSIFIER_SRC1_FIELD_IPV6].value.u32); - src_ip_addr_v6[1] = htonl(rule->field[CLASSIFIER_SRC2_FIELD_IPV6].value.u32); - src_ip_addr_v6[2] = htonl(rule->field[CLASSIFIER_SRC3_FIELD_IPV6].value.u32); - src_ip_addr_v6[3] = htonl(rule->field[CLASSIFIER_SRC4_FIELD_IPV6].value.u32); - dst_ip_addr_v6[0] = htonl(rule->field[CLASSIFIER_DST1_FIELD_IPV6].value.u32); - dst_ip_addr_v6[1] = htonl(rule->field[CLASSIFIER_DST2_FIELD_IPV6].value.u32); - dst_ip_addr_v6[2] = htonl(rule->field[CLASSIFIER_DST3_FIELD_IPV6].value.u32); - dst_ip_addr_v6[3] = htonl(rule->field[CLASSIFIER_DST4_FIELD_IPV6].value.u32); - inet_ntop(AF_INET6, src_ip_addr_v6, str_ipv6_src, INET6_ADDRSTRLEN); - inet_ntop(AF_INET6, dst_ip_addr_v6, str_ipv6_dst, INET6_ADDRSTRLEN); - src_ip_mask_v6 = rule->field[CLASSIFIER_SRC1_FIELD_IPV6].mask_range.u32 + - rule->field[CLASSIFIER_SRC2_FIELD_IPV6].mask_range.u32 + - rule->field[CLASSIFIER_SRC3_FIELD_IPV6].mask_range.u32 + - rule->field[CLASSIFIER_SRC4_FIELD_IPV6].mask_range.u32; - dst_ip_mask_v6 = rule->field[CLASSIFIER_DST1_FIELD_IPV6].mask_range.u32 + - rule->field[CLASSIFIER_DST2_FIELD_IPV6].mask_range.u32 + - rule->field[CLASSIFIER_DST3_FIELD_IPV6].mask_range.u32 + - rule->field[CLASSIFIER_DST4_FIELD_IPV6].mask_range.u32; - MR_INFO(" Ip Version : IPv6"); - MR_INFO(" Src Ip Addr : %s", str_ipv6_src); - MR_INFO(" Src Ip Mask : %u", src_ip_mask_v6); - MR_INFO(" Dst Ip Addr : %s", str_ipv6_dst); - MR_INFO(" Dst Ip Mask : %u", dst_ip_mask_v6); + dump_classifier_rule_ipv6(rule); } break; case MR_NODE_COMMON_IP_VERSION_ANY: MR_INFO(" Ip Version : Any"); + dump_classifier_rule_ipv4(rule); + dump_classifier_rule_ipv6(rule); break; } @@ -1244,7 +1258,7 @@ int parse_classifier_rule_remote_add(struct classifier_management * _classifier_ /******************* Parse dst addr *******************/ /* Parsing IPv4 dst addr and mask */ - uint32_t dst_ip_mask_v4; + uint32_t dst_ip_mask_v4 = 0; struct in_addr dst_ip_addr_v4; dst_ip_addr_v4.s_addr = MR_CLASSIFIER_DEFAULT_IP_ADDR_V4; if (cj_dst_ip_addr_v4 != NULL) |
