mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-18 17:18:42 +00:00
Moved nexthop + hostentry display to other eattrs
This commit is contained in:
parent
d5cac1a4ef
commit
bdd6f72839
@ -1057,6 +1057,49 @@ ea_show_lc_set(struct cli *c, const char *name, const struct adata *ad, byte *bu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ea_show_nexthop_list(struct cli *c, struct nexthop_adata *nhad)
|
||||||
|
{
|
||||||
|
if (!NEXTHOP_IS_REACHABLE(nhad))
|
||||||
|
return;
|
||||||
|
|
||||||
|
NEXTHOP_WALK(nh, nhad)
|
||||||
|
{
|
||||||
|
char mpls[MPLS_MAX_LABEL_STACK*12 + 5], *lsp = mpls;
|
||||||
|
char *onlink = (nh->flags & RNF_ONLINK) ? " onlink" : "";
|
||||||
|
char weight[16] = "";
|
||||||
|
|
||||||
|
if (nh->labels)
|
||||||
|
{
|
||||||
|
lsp += bsprintf(lsp, " mpls %d", nh->label[0]);
|
||||||
|
for (int i=1;i<nh->labels; i++)
|
||||||
|
lsp += bsprintf(lsp, "/%d", nh->label[i]);
|
||||||
|
}
|
||||||
|
*lsp = '\0';
|
||||||
|
|
||||||
|
if (!NEXTHOP_ONE(nhad))
|
||||||
|
bsprintf(weight, " weight %d", nh->weight + 1);
|
||||||
|
|
||||||
|
if (ipa_nonzero(nh->gw))
|
||||||
|
cli_printf(c, -1007, "\tvia %I on %s%s%s%s",
|
||||||
|
nh->gw, nh->iface->name, mpls, onlink, weight);
|
||||||
|
else
|
||||||
|
cli_printf(c, -1007, "\tdev %s%s%s",
|
||||||
|
nh->iface->name, mpls, onlink, weight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ea_show_hostentry(const struct adata *ad, byte *buf, uint size)
|
||||||
|
{
|
||||||
|
const struct hostentry_adata *had = (const struct hostentry_adata *) ad;
|
||||||
|
|
||||||
|
if (ipa_nonzero(had->he->link) && !ipa_equal(had->he->link, had->he->addr))
|
||||||
|
bsnprintf(buf, size, "via %I %I table %s", had->he->addr, had->he->link, had->he->tab->name);
|
||||||
|
else
|
||||||
|
bsnprintf(buf, size, "via %I table %s", had->he->addr, had->he->tab->name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ea_show - print an &eattr to CLI
|
* ea_show - print an &eattr to CLI
|
||||||
* @c: destination CLI
|
* @c: destination CLI
|
||||||
@ -1088,6 +1131,9 @@ ea_show(struct cli *c, const eattr *e)
|
|||||||
switch (e->type)
|
switch (e->type)
|
||||||
{
|
{
|
||||||
case T_INT:
|
case T_INT:
|
||||||
|
if ((cls == &ea_gen_igp_metric) && e->u.data >= IGP_METRIC_UNKNOWN)
|
||||||
|
return;
|
||||||
|
|
||||||
bsprintf(pos, "%u", e->u.data);
|
bsprintf(pos, "%u", e->u.data);
|
||||||
break;
|
break;
|
||||||
case T_OPAQUE:
|
case T_OPAQUE:
|
||||||
@ -1111,6 +1157,12 @@ ea_show(struct cli *c, const eattr *e)
|
|||||||
case T_LCLIST:
|
case T_LCLIST:
|
||||||
ea_show_lc_set(c, cls->name, ad, buf);
|
ea_show_lc_set(c, cls->name, ad, buf);
|
||||||
return;
|
return;
|
||||||
|
case T_NEXTHOP_LIST:
|
||||||
|
ea_show_nexthop_list(c, (struct nexthop_adata *) e->u.ptr);
|
||||||
|
return;
|
||||||
|
case T_HOSTENTRY:
|
||||||
|
ea_show_hostentry(ad, pos, end - pos);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
bsprintf(pos, "<type %02x>", e->type);
|
bsprintf(pos, "<type %02x>", e->type);
|
||||||
}
|
}
|
||||||
@ -1396,12 +1448,15 @@ rta_init(void)
|
|||||||
rte_src_init();
|
rte_src_init();
|
||||||
ea_class_init();
|
ea_class_init();
|
||||||
|
|
||||||
|
/* These attributes are required to be first for nice "show route" output */
|
||||||
|
ea_register_init(&ea_gen_nexthop);
|
||||||
|
ea_register_init(&ea_gen_hostentry);
|
||||||
|
|
||||||
|
/* Other generic route attributes */
|
||||||
ea_register_init(&ea_gen_preference);
|
ea_register_init(&ea_gen_preference);
|
||||||
ea_register_init(&ea_gen_igp_metric);
|
ea_register_init(&ea_gen_igp_metric);
|
||||||
ea_register_init(&ea_gen_from);
|
ea_register_init(&ea_gen_from);
|
||||||
ea_register_init(&ea_gen_source);
|
ea_register_init(&ea_gen_source);
|
||||||
ea_register_init(&ea_gen_nexthop);
|
|
||||||
ea_register_init(&ea_gen_hostentry);
|
|
||||||
ea_register_init(&ea_gen_flowspec_valid);
|
ea_register_init(&ea_gen_flowspec_valid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,41 +83,16 @@ rt_show_rte(struct cli *c, byte *ia, rte *e, struct rt_show_data *d, int primary
|
|||||||
net_is_flow(e->net) ? flowspec_valid_name(flowspec_valid) : had ? "recursive" : rta_dest_name(dest),
|
net_is_flow(e->net) ? flowspec_valid_name(flowspec_valid) : had ? "recursive" : rta_dest_name(dest),
|
||||||
e->src->proto->name, tm, from, primary ? (sync_error ? " !" : " *") : "", info);
|
e->src->proto->name, tm, from, primary ? (sync_error ? " !" : " *") : "", info);
|
||||||
|
|
||||||
if (dest == RTD_UNICAST)
|
|
||||||
NEXTHOP_WALK(nh, nhad)
|
|
||||||
{
|
|
||||||
char mpls[MPLS_MAX_LABEL_STACK*12 + 5], *lsp = mpls;
|
|
||||||
char *onlink = (nh->flags & RNF_ONLINK) ? " onlink" : "";
|
|
||||||
char weight[16] = "";
|
|
||||||
|
|
||||||
if (nh->labels)
|
|
||||||
{
|
|
||||||
lsp += bsprintf(lsp, " mpls %d", nh->label[0]);
|
|
||||||
for (int i=1;i<nh->labels; i++)
|
|
||||||
lsp += bsprintf(lsp, "/%d", nh->label[i]);
|
|
||||||
}
|
|
||||||
*lsp = '\0';
|
|
||||||
|
|
||||||
if (!NEXTHOP_ONE(nhad))
|
|
||||||
bsprintf(weight, " weight %d", nh->weight + 1);
|
|
||||||
|
|
||||||
if (ipa_nonzero(nh->gw))
|
|
||||||
cli_printf(c, -1007, "\tvia %I on %s%s%s%s",
|
|
||||||
nh->gw, nh->iface->name, mpls, onlink, weight);
|
|
||||||
else
|
|
||||||
cli_printf(c, -1007, "\tdev %s%s%s",
|
|
||||||
nh->iface->name, mpls, onlink, weight);
|
|
||||||
}
|
|
||||||
else if (had)
|
|
||||||
{
|
|
||||||
if (ipa_nonzero(had->he->link) && !ipa_equal(had->he->link, had->he->addr))
|
|
||||||
cli_printf(c, -1007, "\tvia %I %I table %s", had->he->addr, had->he->link, had->he->tab->name);
|
|
||||||
else
|
|
||||||
cli_printf(c, -1007, "\tvia %I table %s", had->he->addr, had->he->tab->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d->verbose)
|
if (d->verbose)
|
||||||
ea_show_list(c, a);
|
ea_show_list(c, a);
|
||||||
|
else if (dest == RTD_UNICAST)
|
||||||
|
ea_show_nexthop_list(c, nhad);
|
||||||
|
else if (had)
|
||||||
|
{
|
||||||
|
char hetext[256];
|
||||||
|
ea_show_hostentry(&had->ad, hetext, sizeof hetext);
|
||||||
|
cli_printf(c, -1007, "\t%s", hetext);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -459,6 +459,8 @@ struct hostentry_adata {
|
|||||||
void
|
void
|
||||||
ea_set_hostentry(ea_list **to, struct rtable *dep, struct rtable *tab, ip_addr gw, ip_addr ll, u32 lnum, u32 labels[lnum]);
|
ea_set_hostentry(ea_list **to, struct rtable *dep, struct rtable *tab, ip_addr gw, ip_addr ll, u32 lnum, u32 labels[lnum]);
|
||||||
|
|
||||||
|
void ea_show_hostentry(const struct adata *ad, byte *buf, uint size);
|
||||||
|
void ea_show_nexthop_list(struct cli *c, struct nexthop_adata *nhad);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default protocol preferences
|
* Default protocol preferences
|
||||||
|
@ -695,7 +695,7 @@ static_get_route_info(rte *rte, byte *buf)
|
|||||||
{
|
{
|
||||||
eattr *a = ea_find(rte->attrs, &ea_gen_igp_metric);
|
eattr *a = ea_find(rte->attrs, &ea_gen_igp_metric);
|
||||||
u32 pref = rt_get_preference(rte);
|
u32 pref = rt_get_preference(rte);
|
||||||
if (a)
|
if (a && (a->u.data < IGP_METRIC_UNKNOWN))
|
||||||
buf += bsprintf(buf, " (%d/%u)", pref, a->u.data);
|
buf += bsprintf(buf, " (%d/%u)", pref, a->u.data);
|
||||||
else
|
else
|
||||||
buf += bsprintf(buf, " (%d)", pref);
|
buf += bsprintf(buf, " (%d)", pref);
|
||||||
|
Loading…
Reference in New Issue
Block a user