Proper format functions for ORIGINATOR_ID, CLUSTER_LIST
This commit is contained in:
parent
b21f68b4cd
commit
aebe06b40c
10 changed files with 32 additions and 19 deletions
|
@ -247,7 +247,7 @@ val_print(struct f_val v)
|
||||||
case T_SET: tree_print( v.val.t ); PRINTF( "\n" ); break;
|
case T_SET: tree_print( v.val.t ); PRINTF( "\n" ); break;
|
||||||
case T_ENUM: PRINTF( "(enum %x)%d", v.type, v.val.i ); break;
|
case T_ENUM: PRINTF( "(enum %x)%d", v.type, v.val.i ); break;
|
||||||
case T_PATH: as_path_format(v.val.ad, buf2, 1020); PRINTF( "(path %s)", buf2 ); break;
|
case T_PATH: as_path_format(v.val.ad, buf2, 1020); PRINTF( "(path %s)", buf2 ); break;
|
||||||
case T_CLIST: int_set_format(v.val.ad, buf2, 1020); PRINTF( "(clist %s)", buf2 ); break;
|
case T_CLIST: int_set_format(v.val.ad, 1, buf2, 1020); PRINTF( "(clist %s)", buf2 ); break;
|
||||||
case T_PATH_MASK: pm_format(v.val.path_mask, buf2, 1020); PRINTF( "(pathmask %s)", buf2 ); break;
|
case T_PATH_MASK: pm_format(v.val.path_mask, buf2, 1020); PRINTF( "(pathmask %s)", buf2 ); break;
|
||||||
default: PRINTF( "[unknown type %x]", v.type );
|
default: PRINTF( "[unknown type %x]", v.type );
|
||||||
#undef PRINTF
|
#undef PRINTF
|
||||||
|
|
11
nest/a-set.c
11
nest/a-set.c
|
@ -14,7 +14,7 @@
|
||||||
#include "lib/string.h"
|
#include "lib/string.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
int_set_format(struct adata *set, byte *buf, unsigned int size)
|
int_set_format(struct adata *set, int way, byte *buf, unsigned int size)
|
||||||
{
|
{
|
||||||
u32 *z = (u32 *) set->data;
|
u32 *z = (u32 *) set->data;
|
||||||
int l = set->length / 4;
|
int l = set->length / 4;
|
||||||
|
@ -30,7 +30,14 @@ int_set_format(struct adata *set, byte *buf, unsigned int size)
|
||||||
strcpy(buf, "...");
|
strcpy(buf, "...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
buf += bsprintf(buf, "(%d,%d)", *z >> 16, *z & 0xffff);
|
|
||||||
|
if (way)
|
||||||
|
buf += bsprintf(buf, "(%d,%d)", *z >> 16, *z & 0xffff);
|
||||||
|
else
|
||||||
|
buf += bsprintf(buf, "%d.%d.%d.%d",
|
||||||
|
(*z >> 24) & 0xff, (*z >> 16) & 0xff,
|
||||||
|
(*z >> 8) & 0xff, *z & 0xff);
|
||||||
|
|
||||||
z++;
|
z++;
|
||||||
sp = 0;
|
sp = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ int as_path_match(struct adata *path, struct f_path_mask *mask);
|
||||||
|
|
||||||
/* a-set.c */
|
/* a-set.c */
|
||||||
|
|
||||||
void int_set_format(struct adata *set, byte *buf, unsigned int size);
|
void int_set_format(struct adata *set, int way, byte *buf, unsigned int size);
|
||||||
struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val);
|
struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val);
|
||||||
int int_set_contains(struct adata *list, u32 val);
|
int int_set_contains(struct adata *list, u32 val);
|
||||||
struct adata *int_set_del(struct linpool *pool, struct adata *list, u32 val);
|
struct adata *int_set_del(struct linpool *pool, struct adata *list, u32 val);
|
||||||
|
|
|
@ -146,7 +146,7 @@ void get_route_info(rte *e, byte *buf, ea_list *attrs)
|
||||||
* or doing the whole conversion (used in case the value requires extra
|
* or doing the whole conversion (used in case the value requires extra
|
||||||
* care; return %GA_FULL).
|
* care; return %GA_FULL).
|
||||||
*/
|
*/
|
||||||
int get_attr(eattr *a, byte *buf)
|
int get_attr(eattr *a, byte *buf, int buflen)
|
||||||
{ DUMMY; }
|
{ DUMMY; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -48,7 +48,7 @@ struct protocol {
|
||||||
int (*shutdown)(struct proto *); /* Stop the instance */
|
int (*shutdown)(struct proto *); /* Stop the instance */
|
||||||
void (*get_status)(struct proto *, byte *buf); /* Get instance status (for `show protocols' command) */
|
void (*get_status)(struct proto *, byte *buf); /* Get instance status (for `show protocols' command) */
|
||||||
void (*get_route_info)(struct rte *, byte *buf, struct ea_list *attrs); /* Get route information (for `show route' command) */
|
void (*get_route_info)(struct rte *, byte *buf, struct ea_list *attrs); /* Get route information (for `show route' command) */
|
||||||
int (*get_attr)(struct eattr *, byte *buf); /* ASCIIfy dynamic attribute (returns GA_*) */
|
int (*get_attr)(struct eattr *, byte *buf, int buflen); /* ASCIIfy dynamic attribute (returns GA_*) */
|
||||||
};
|
};
|
||||||
|
|
||||||
void protos_build(void);
|
void protos_build(void);
|
||||||
|
|
|
@ -386,7 +386,7 @@ ea_format(eattr *e, byte *buf)
|
||||||
{
|
{
|
||||||
buf += bsprintf(buf, "%s.", p->name);
|
buf += bsprintf(buf, "%s.", p->name);
|
||||||
if (p->get_attr)
|
if (p->get_attr)
|
||||||
status = p->get_attr(e, buf);
|
status = p->get_attr(e, buf, end - buf);
|
||||||
buf += strlen(buf);
|
buf += strlen(buf);
|
||||||
}
|
}
|
||||||
else if (EA_PROTO(e->id))
|
else if (EA_PROTO(e->id))
|
||||||
|
@ -429,7 +429,7 @@ ea_format(eattr *e, byte *buf)
|
||||||
as_path_format(ad, buf, end - buf);
|
as_path_format(ad, buf, end - buf);
|
||||||
break;
|
break;
|
||||||
case EAF_TYPE_INT_SET:
|
case EAF_TYPE_INT_SET:
|
||||||
int_set_format(ad, buf, end - buf);
|
int_set_format(ad, 1, buf, end - buf);
|
||||||
break;
|
break;
|
||||||
case EAF_TYPE_UNDEF:
|
case EAF_TYPE_UNDEF:
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -35,7 +35,7 @@ struct attr_desc {
|
||||||
int type;
|
int type;
|
||||||
int allow_in_ebgp;
|
int allow_in_ebgp;
|
||||||
int (*validate)(struct bgp_proto *p, byte *attr, int len);
|
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
|
static int
|
||||||
|
@ -47,7 +47,7 @@ bgp_check_origin(struct bgp_proto *p UNUSED, byte *a UNUSED, int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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" };
|
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
|
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;
|
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
|
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;
|
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
|
static int
|
||||||
bgp_check_reach_nlri(struct bgp_proto *p UNUSED, byte *a UNUSED, int len UNUSED)
|
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 },
|
bgp_check_aggregator, NULL },
|
||||||
{ "community", -1, BAF_OPTIONAL | BAF_TRANSITIVE, EAF_TYPE_INT_SET, 1, /* BA_COMMUNITY */
|
{ "community", -1, BAF_OPTIONAL | BAF_TRANSITIVE, EAF_TYPE_INT_SET, 1, /* BA_COMMUNITY */
|
||||||
NULL, NULL },
|
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 },
|
NULL, NULL },
|
||||||
{ "cluster_list", -1, BAF_OPTIONAL, EAF_TYPE_INT_SET, 0, /* BA_CLUSTER_LIST */
|
{ "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_DPA */
|
||||||
{ NULL, }, /* BA_ADVERTISER */
|
{ NULL, }, /* BA_ADVERTISER */
|
||||||
{ NULL, }, /* BA_RCID_PATH */
|
{ NULL, }, /* BA_RCID_PATH */
|
||||||
|
@ -1306,7 +1312,7 @@ err:
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bgp_get_attr(eattr *a, byte *buf)
|
bgp_get_attr(eattr *a, byte *buf, int buflen)
|
||||||
{
|
{
|
||||||
unsigned int i = EA_ID(a->id);
|
unsigned int i = EA_ID(a->id);
|
||||||
struct attr_desc *d;
|
struct attr_desc *d;
|
||||||
|
@ -1319,7 +1325,7 @@ bgp_get_attr(eattr *a, byte *buf)
|
||||||
{
|
{
|
||||||
*buf++ = ':';
|
*buf++ = ':';
|
||||||
*buf++ = ' ';
|
*buf++ = ' ';
|
||||||
d->format(a, buf);
|
d->format(a, buf, buflen);
|
||||||
return GA_FULL;
|
return GA_FULL;
|
||||||
}
|
}
|
||||||
return GA_NAME;
|
return GA_NAME;
|
||||||
|
|
|
@ -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);
|
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);
|
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);
|
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 *);
|
int bgp_rte_better(struct rte *, struct rte *);
|
||||||
void bgp_rt_notify(struct proto *, struct network *, struct rte *, struct rte *, struct ea_list *);
|
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 *);
|
int bgp_import_control(struct proto *, struct rte **, struct ea_list **, struct linpool *);
|
||||||
|
|
|
@ -529,7 +529,7 @@ ospf_get_route_info(rte * rte, byte * buf, ea_list * attrs UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ospf_get_attr(eattr * a, byte * buf)
|
ospf_get_attr(eattr * a, byte * buf, int buflen UNUSED)
|
||||||
{
|
{
|
||||||
switch (a->id)
|
switch (a->id)
|
||||||
{
|
{
|
||||||
|
|
|
@ -972,7 +972,7 @@ rip_init_config(struct rip_proto_config *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rip_get_attr(eattr *a, byte *buf)
|
rip_get_attr(eattr *a, byte *buf, int buflen UNUSED)
|
||||||
{
|
{
|
||||||
switch (a->id) {
|
switch (a->id) {
|
||||||
case EA_RIP_METRIC: buf += bsprintf( buf, "metric: %d", a->u.data ); return GA_FULL;
|
case EA_RIP_METRIC: buf += bsprintf( buf, "metric: %d", a->u.data ); return GA_FULL;
|
||||||
|
|
Loading…
Reference in a new issue