diff options
Diffstat (limited to 'nest')
-rw-r--r-- | nest/a-path.c | 28 | ||||
-rw-r--r-- | nest/attrs.h | 1 |
2 files changed, 29 insertions, 0 deletions
diff --git a/nest/a-path.c b/nest/a-path.c index 0ea3e7b..0c46755 100644 --- a/nest/a-path.c +++ b/nest/a-path.c @@ -103,6 +103,34 @@ as_path_getlen(struct adata *path) return res; } +int +as_path_get_first(struct adata *path) +{ + int res = -1; + u8 *p = path->data; + u8 *q = p+path->length; + int len; + + while (p<q) + { + switch (*p++) + { + case AS_PATH_SET: + if (len = *p++) + res = get_u16(p); + p += 2*len; + break; + case AS_PATH_SEQUENCE: + if (len = *p++) + res = get_u16(p+2*(len-1)); + p += 2*len; + break; + default: bug("as_path_get_first: Invalid path segment"); + } + } + return res; +} + #define MASK_PLUS do { mask = mask->next; if (!mask) return next == q; \ asterisk = (mask->val == PM_ANY); \ if (asterisk) { mask = mask->next; if (!mask) { return 1; } } \ diff --git a/nest/attrs.h b/nest/attrs.h index 2618fa3..abd6b9e 100644 --- a/nest/attrs.h +++ b/nest/attrs.h @@ -17,6 +17,7 @@ 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); +int as_path_get_first(struct adata *path); struct f_path_mask { struct f_path_mask *next; |