summaryrefslogtreecommitdiff
path: root/filter/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter/data.c')
-rw-r--r--filter/data.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/filter/data.c b/filter/data.c
index b389b8e8..912e2b00 100644
--- a/filter/data.c
+++ b/filter/data.c
@@ -146,34 +146,41 @@ val_compare(const struct f_val *v1, const struct f_val *v2)
}
}
+static inline int
+pmi_same(const struct f_path_mask_item *mi1, const struct f_path_mask_item *mi2)
+{
+ if (mi1->kind != mi2->kind)
+ return 0;
+
+ switch (mi1->kind) {
+ case PM_ASN:
+ if (mi1->asn != mi2->asn)
+ return 0;
+ break;
+ case PM_ASN_EXPR:
+ if (!f_same(mi1->expr, mi2->expr))
+ return 0;
+ break;
+ case PM_ASN_RANGE:
+ if (mi1->from != mi2->from)
+ return 0;
+ if (mi1->to != mi2->to)
+ return 0;
+ break;
+ }
+
+ return 1;
+}
+
static int
pm_same(const struct f_path_mask *m1, const struct f_path_mask *m2)
{
if (m1->len != m2->len)
for (uint i=0; i<m1->len; i++)
- {
- if (m1->item[i].kind != m2->item[i].kind)
+ if (!pmi_same(&(m1->item[i]), &(m2->item[i])))
return 0;
- switch (m1->item[i].kind) {
- case PM_ASN:
- if (m1->item[i].asn != m2->item[i].asn)
- return 0;
- break;
- case PM_ASN_EXPR:
- if (!f_same(m1->item[i].expr, m2->item[i].expr))
- return 0;
- break;
- case PM_ASN_RANGE:
- if (m1->item[i].from != m2->item[i].from)
- return 0;
- if (m1->item[i].to != m2->item[i].to)
- return 0;
- break;
- }
- }
-
return 1;
}
@@ -200,6 +207,8 @@ val_same(const struct f_val *v1, const struct f_val *v2)
switch (v1->type) {
case T_PATH_MASK:
return pm_same(v1->val.path_mask, v2->val.path_mask);
+ case T_PATH_MASK_ITEM:
+ return pmi_same(&(v1->val.pmi), &(v2->val.pmi));
case T_PATH:
case T_CLIST:
case T_ECLIST: