diff options
Diffstat (limited to 'proto/bgp')
-rw-r--r-- | proto/bgp/attrs.c | 22 | ||||
-rw-r--r-- | proto/bgp/bgp.h | 2 |
2 files changed, 15 insertions, 9 deletions
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c index 811d52e..c13f905 100644 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@ -35,7 +35,7 @@ struct attr_desc { int type; int allow_in_ebgp; int (*validate)(struct bgp_proto *p, byte *attr, int len); - void (*format)(eattr *ea, byte *buf); + void (*format)(eattr *ea, byte *buf, int buflen); }; static int @@ -47,7 +47,7 @@ bgp_check_origin(struct bgp_proto *p UNUSED, byte *a UNUSED, int len) } static void -bgp_format_origin(eattr *a, byte *buf) +bgp_format_origin(eattr *a, byte *buf, int buflen) { static char *bgp_origin_names[] = { "IGP", "EGP", "Incomplete" }; @@ -104,7 +104,7 @@ bgp_check_next_hop(struct bgp_proto *p UNUSED, byte *a, int len) } static int -bgp_check_aggregator(struct bgp_proto *p, UNUSED byte *a, int len) +bgp_check_aggregator(struct bgp_proto *p, byte *a UNUSED, int len) { int exp_len = p->as4_session ? 8 : 6; @@ -112,11 +112,17 @@ bgp_check_aggregator(struct bgp_proto *p, UNUSED byte *a, int len) } static int -bgp_check_cluster_list(struct bgp_proto *p UNUSED, UNUSED byte *a, int len) +bgp_check_cluster_list(struct bgp_proto *p UNUSED, byte *a UNUSED, int len) { return ((len % 4) == 0) ? 0 : 5; } +static void +bgp_format_cluster_list(eattr *a, byte *buf, int buflen UNUSED) +{ + int_set_format(a->u.ptr, 0, buf, buflen); +} + static int bgp_check_reach_nlri(struct bgp_proto *p UNUSED, byte *a UNUSED, int len UNUSED) { @@ -156,10 +162,10 @@ static struct attr_desc bgp_attr_table[] = { bgp_check_aggregator, NULL }, { "community", -1, BAF_OPTIONAL | BAF_TRANSITIVE, EAF_TYPE_INT_SET, 1, /* BA_COMMUNITY */ NULL, NULL }, - { "originator_id", 4, BAF_OPTIONAL, EAF_TYPE_INT, 0, /* BA_ORIGINATOR_ID */ + { "originator_id", 4, BAF_OPTIONAL, EAF_TYPE_ROUTER_ID, 0, /* BA_ORIGINATOR_ID */ NULL, NULL }, { "cluster_list", -1, BAF_OPTIONAL, EAF_TYPE_INT_SET, 0, /* BA_CLUSTER_LIST */ - bgp_check_cluster_list, NULL }, + bgp_check_cluster_list, bgp_format_cluster_list }, { NULL, }, /* BA_DPA */ { NULL, }, /* BA_ADVERTISER */ { NULL, }, /* BA_RCID_PATH */ @@ -1306,7 +1312,7 @@ err: } int -bgp_get_attr(eattr *a, byte *buf) +bgp_get_attr(eattr *a, byte *buf, int buflen) { unsigned int i = EA_ID(a->id); struct attr_desc *d; @@ -1319,7 +1325,7 @@ bgp_get_attr(eattr *a, byte *buf) { *buf++ = ':'; *buf++ = ' '; - d->format(a, buf); + d->format(a, buf, buflen); return GA_FULL; } return GA_NAME; diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index ea64584..aaa2c4a 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -132,7 +132,7 @@ void bgp_close_conn(struct bgp_conn *c); void bgp_attach_attr(struct ea_list **to, struct linpool *pool, unsigned attr, uintptr_t val); byte *bgp_attach_attr_wa(struct ea_list **to, struct linpool *pool, unsigned attr, unsigned len); struct rta *bgp_decode_attrs(struct bgp_conn *conn, byte *a, unsigned int len, struct linpool *pool, int mandatory); -int bgp_get_attr(struct eattr *e, byte *buf); +int bgp_get_attr(struct eattr *e, byte *buf, int buflen); int bgp_rte_better(struct rte *, struct rte *); void bgp_rt_notify(struct proto *, struct network *, struct rte *, struct rte *, struct ea_list *); int bgp_import_control(struct proto *, struct rte **, struct ea_list **, struct linpool *); |