summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2022-11-15 10:25:16 +0000
committersongyanchao <[email protected]>2022-11-15 10:25:16 +0000
commit1ba7813f8db2c0ec08b6c6a26bf228668086605c (patch)
tree200059d45091f3add77ed48b506ce0c173149524
parent336178dfb66237dc540f1e193127577b0a7aa19d (diff)
🐞 fix(TSG-12379): 修改 Classifier Rule 为空时规则解析异常问题v4.6.8-20221115
修改 Classifier Rule 为空时规则解析异常问题
-rw-r--r--service/src/node_classifier.c80
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)