summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2019-08-06 18:54:19 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2019-08-06 18:54:19 +0200
commit9f3e09832081bc029dc98ae6dda49ee86d138fde (patch)
tree9bb699abd5e9aa4b188188514b04c0bb22b95b72
parentef113c6f725349a2ab52f3cbef18403f82c84134 (diff)
Filter: Allow to use set constants / expressions in path masks
Allow to not only use set literals in path masks, but also existing set constants or set expressions.
-rw-r--r--filter/f-inst.c12
-rw-r--r--filter/test.conf5
-rw-r--r--nest/a-path.c2
-rw-r--r--nest/attrs.h4
4 files changed, 20 insertions, 3 deletions
diff --git a/filter/f-inst.c b/filter/f-inst.c
index 0867ac4a..49ae993a 100644
--- a/filter/f-inst.c
+++ b/filter/f-inst.c
@@ -308,12 +308,24 @@
case T_PATH_MASK_ITEM:
pm->item[i] = vv(i).val.pmi;
break;
+
case T_INT:
pm->item[i] = (struct f_path_mask_item) {
.asn = vv(i).val.i,
.kind = PM_ASN,
};
break;
+
+ case T_SET:
+ if (vv(i).val.t->from.type != T_INT)
+ runtime("Only integer sets allowed in path mask");
+
+ pm->item[i] = (struct f_path_mask_item) {
+ .set = vv(i).val.t,
+ .kind = PM_ASN_SET,
+ };
+ break;
+
default:
runtime( "Error resolving path mask template: value not an integer" );
}
diff --git a/filter/test.conf b/filter/test.conf
index 04074965..09a4a88a 100644
--- a/filter/test.conf
+++ b/filter/test.conf
@@ -597,11 +597,15 @@ function mkpath(int a; int b)
return [= a b 3 2 1 =];
}
+define set35 = [3 .. 5];
+
function t_path()
bgpmask pm1;
bgppath p2;
+int set set12;
{
pm1 = [= 4 3 2 1 =];
+ set12 = [1, 2];
bt_assert(format(pm1) = "[= 4 3 2 1 =]");
@@ -627,6 +631,7 @@ bgppath p2;
bt_assert(p2 ~ [= * 4 3 * 1 =]);
bt_assert(p2 ~ [= (3+2) (2*2) 3 2 1 =]);
bt_assert(p2 ~ [= 5 [2, 4, 6] 3 [1..2] 1 =]);
+ bt_assert(p2 ~ [= 5 set35 3 set12 set12 =]);
bt_assert(p2 ~ mkpath(5, 4));
bt_assert(p2.len = 5);
diff --git a/nest/a-path.c b/nest/a-path.c
index 4ee34cf4..b6a30f54 100644
--- a/nest/a-path.c
+++ b/nest/a-path.c
@@ -741,7 +741,7 @@ pm_match(struct pm_pos *pos, u32 asn, u32 asn2)
}
static int
-pm_match_set(struct pm_pos *pos, struct f_tree *set)
+pm_match_set(struct pm_pos *pos, const struct f_tree *set)
{
struct f_val asn = { .type = T_INT };
diff --git a/nest/attrs.h b/nest/attrs.h
index a17b8c05..6fb0a8fa 100644
--- a/nest/attrs.h
+++ b/nest/attrs.h
@@ -65,8 +65,8 @@ static inline struct adata *as_path_prepend(struct linpool *pool, const struct a
struct f_path_mask_item {
union {
u32 asn; /* PM_ASN */
- struct f_line *expr; /* PM_ASN_EXPR */
- struct f_tree *set; /* PM_ASN_SET */
+ const struct f_line *expr; /* PM_ASN_EXPR */
+ const struct f_tree *set; /* PM_ASN_SET */
struct { /* PM_ASN_RANGE */
u32 from;
u32 to;