From 2a40efa5e6252eb5a5dbe5e82dcd9c67ad7838a9 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Mon, 17 Apr 2000 11:11:33 +0000 Subject: as_path_match moved to a-path.c --- nest/a-path.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ nest/attrs.h | 8 +++++++ 2 files changed, 75 insertions(+) (limited to 'nest') diff --git a/nest/a-path.c b/nest/a-path.c index d808bc9..3468e4a 100644 --- a/nest/a-path.c +++ b/nest/a-path.c @@ -99,3 +99,70 @@ as_path_getlen(struct adata *path) } return res; } + +#define MASK_PLUS do { mask = mask->next; if (!mask) return next == q; \ + asterix = (mask->val == PM_ANY); \ + if (asterix) { mask = mask->next; if (!mask) { return 1; } } \ + } while(0) + +int +as_path_match(struct adata *path, struct f_path_mask *mask) +{ + int i; + int asterix = 0; + u8 *p = path->data; + u8 *q = p+path->length; + int len; + u8 *next; + + asterix = (mask->val == PM_ANY); + if (asterix) { mask = mask->next; if (!mask) { return 1; } } + + while (pval)) { + MASK_PLUS; + goto retry; + } + if (!asterix && (get_u16(p) == mask->val)) { + p = next; + MASK_PLUS; + goto okay; + } + p+=2; + } + if (!asterix) + return 0; + okay: + } + break; + + case 2: /* This is a sequence */ + len = *p++; + for (i=0; ival)) + MASK_PLUS; + else if (!asterix) { + if (get_u16(p) != mask->val) + return 0; + MASK_PLUS; + } + p+=2; + } + break; + + default: + bug("This should not be in path"); + } + } + return 0; +} diff --git a/nest/attrs.h b/nest/attrs.h index 67ec52d..ede152c 100644 --- a/nest/attrs.h +++ b/nest/attrs.h @@ -18,6 +18,14 @@ struct adata *as_path_prepend(struct linpool *pool, struct adata *olda, int as); void as_path_format(struct adata *path, byte *buf, unsigned int size); int as_path_getlen(struct adata *path); +struct f_path_mask { + struct f_path_mask *next; + int val; +}; +#define PM_ANY -1 + +int as_path_match(struct adata *path, struct f_path_mask *mask); + /* a-set.c */ void int_set_format(struct adata *set, byte *buf, unsigned int size); -- cgit v1.2.3