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;