diff options
author | Pavel Machek <pavel@ucw.cz> | 2000-04-12 16:12:37 +0200 |
---|---|---|
committer | Pavel Machek <pavel@ucw.cz> | 2000-04-12 16:12:37 +0200 |
commit | 0a40e97328180576577da26a5ce8933f616d84f1 (patch) | |
tree | 4e682257ca3e2e09988ebe2a5567547a70cfd928 | |
parent | c2b28c99103a643dd29ad48152999d6dac7722fe (diff) | |
download | bird-0a40e97328180576577da26a5ce8933f616d84f1.tar bird-0a40e97328180576577da26a5ce8933f616d84f1.zip |
as_path_prepend is usable outside bgp.
-rw-r--r-- | filter/filter.c | 2 | ||||
-rw-r--r-- | proto/bgp/attrs.c | 29 |
2 files changed, 19 insertions, 12 deletions
diff --git a/filter/filter.c b/filter/filter.c index 4f6434f..cfb502f 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 e42a6ea..41f0644 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; } |