From 0a40e97328180576577da26a5ce8933f616d84f1 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Wed, 12 Apr 2000 14:12:37 +0000 Subject: [PATCH] as_path_prepend is usable outside bgp. --- filter/filter.c | 2 +- proto/bgp/attrs.c | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/filter/filter.c b/filter/filter.c index 4f6434f1..cfb502fc 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -764,7 +764,7 @@ comlist_del(struct linpool *pool, struct adata *list, u32 val) } struct adata * -comlist_empty(struct linpool *pool) +adata_empty(struct linpool *pool) { struct adata *res = lp_alloc(pool, sizeof(struct adata)); res->length = 0; diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c index e42a6eae..41f06447 100644 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@ -278,19 +278,11 @@ bgp_create_attrs(struct bgp_proto *p, rte *e, ea_list **attrs, struct linpool *p return 0; /* Leave decision to the filters */ } -ea_list * -bgp_path_prepend(struct linpool *pool, eattr *a, ea_list *old, int as) +struct adata * +as_path_prepend(struct linpool *pool, struct adata *olda, int as) { - struct ea_list *e = lp_alloc(pool, sizeof(ea_list) + sizeof(eattr)); - struct adata *olda = a->u.ptr; struct adata *newa; - e->next = old; - e->flags = EALF_SORTED; - e->count = 1; - e->attrs[0].id = EA_CODE(EAP_BGP, BA_AS_PATH); - e->attrs[0].flags = BAF_TRANSITIVE; - e->attrs[0].type = EAF_TYPE_AS_PATH; if (olda->length && olda->data[0] == 2 && olda->data[1] < 255) /* Starting with sequence => just prepend the AS number */ { newa = lp_alloc(pool, sizeof(struct adata) + olda->length + 2); @@ -308,7 +300,22 @@ bgp_path_prepend(struct linpool *pool, eattr *a, ea_list *old, int as) memcpy(newa->data+4, olda->data, olda->length); } put_u16(newa->data+2, as); - e->attrs[0].u.ptr = newa; + return newa; +} + +static ea_list * +bgp_path_prepend(struct linpool *pool, eattr *a, ea_list *old, int as) +{ + struct ea_list *e = lp_alloc(pool, sizeof(ea_list) + sizeof(eattr)); + struct adata *olda = a->u.ptr; + + e->next = old; + e->flags = EALF_SORTED; + e->count = 1; + e->attrs[0].id = EA_CODE(EAP_BGP, BA_AS_PATH); + e->attrs[0].flags = BAF_TRANSITIVE; + e->attrs[0].type = EAF_TYPE_AS_PATH; + e->attrs[0].u.ptr = path_prepend(pool, olda, as); return e; }