summaryrefslogtreecommitdiff
path: root/nest/a-path.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-06-01 19:32:41 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2009-06-01 19:32:41 +0200
commit92a72a4cbdd010f69e8d054019770e55a47637e0 (patch)
tree75c45f29473f4ad20a3ff7031ad7720273c1e149 /nest/a-path.c
parentf429d4348275030a9f488046c4021aa377ad1a79 (diff)
Adds support for dynamic pair and bgp mask expressions.
Diffstat (limited to 'nest/a-path.c')
-rw-r--r--nest/a-path.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/nest/a-path.c b/nest/a-path.c
index f5499877..dba214d2 100644
--- a/nest/a-path.c
+++ b/nest/a-path.c
@@ -401,6 +401,7 @@ as_path_match(struct adata *path, struct f_path_mask *mask)
struct pm_pos pos[2048 + 1];
int plen = parse_path(path, pos);
int l, h, i, nh, nl;
+ u32 val;
/* l and h are bound of interval of positions where
are marked states */
@@ -424,14 +425,20 @@ as_path_match(struct adata *path, struct f_path_mask *mask)
h = plen;
break;
- case PM_QUESTION:
case PM_ASN:
+ val = mask->val;
+ goto step;
+ case PM_ASN_EXPR:
+ val = f_eval_asn((struct f_inst *) mask->val);
+ goto step;
+ case PM_QUESTION:
+ step:
nh = -1;
for (i = h; i >= l; i--)
if (pos[i].mark)
{
pos[i].mark = 0;
- if ((mask->kind == PM_QUESTION) || pm_match(pos + i, mask->val))
+ if ((mask->kind == PM_QUESTION) || pm_match(pos + i, val))
pm_mark(pos, i, plen, &nl, &nh);
}