summaryrefslogtreecommitdiffstats
path: root/proto/bgp
diff options
context:
space:
mode:
Diffstat (limited to 'proto/bgp')
-rw-r--r--proto/bgp/attrs.c29
1 files changed, 18 insertions, 11 deletions
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;
}