mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 17:15:14 +00:00
bgpd: Fixup json with RouteDistinguishers
The json option for displaying a bgp table with route Distinguishers in it was not properly working. This code cleans this issue up. Additionally attempt to make the code a bit easier to read and handle. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
98ce9a06b4
commit
445c24803d
@ -6500,7 +6500,15 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
|
||||
|
||||
/* Print attribute */
|
||||
attr = binfo->attr;
|
||||
if (attr) {
|
||||
if (!attr) {
|
||||
if (json_paths)
|
||||
json_object_array_add(json_paths, json_path);
|
||||
else
|
||||
vty_out(vty, "\n");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* For ENCAP and EVPN routes, nexthop address family is not
|
||||
* neccessarily the same as the prefix address family.
|
||||
@ -6513,35 +6521,50 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
|
||||
*/
|
||||
if ((safi == SAFI_ENCAP) || (safi == SAFI_MPLS_VPN)) {
|
||||
char buf[BUFSIZ];
|
||||
char nexthop[128];
|
||||
int af = NEXTHOP_FAMILY(attr->mp_nexthop_len);
|
||||
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
vty_out(vty, "%s",
|
||||
inet_ntop(af,
|
||||
&attr->mp_nexthop_global_in,
|
||||
sprintf(nexthop, "%s",
|
||||
inet_ntop(af, &attr->mp_nexthop_global_in,
|
||||
buf, BUFSIZ));
|
||||
break;
|
||||
case AF_INET6:
|
||||
vty_out(vty, "%s",
|
||||
sprintf(nexthop, "%s",
|
||||
inet_ntop(af, &attr->mp_nexthop_global,
|
||||
buf, BUFSIZ));
|
||||
break;
|
||||
default:
|
||||
vty_out(vty, "?");
|
||||
sprintf(nexthop, "?");
|
||||
break;
|
||||
}
|
||||
|
||||
if (json_paths) {
|
||||
json_nexthop_global = json_object_new_object();
|
||||
|
||||
json_object_string_add(json_nexthop_global,
|
||||
"afi",
|
||||
(af == AF_INET) ?
|
||||
"ip" : "ipv6");
|
||||
json_object_string_add(json_nexthop_global,
|
||||
(af == AF_INET) ?
|
||||
"ip" : "ipv6",
|
||||
nexthop);
|
||||
json_object_boolean_true_add(json_nexthop_global,
|
||||
"used");
|
||||
} else
|
||||
vty_out(vty, "%s", nexthop);
|
||||
} else if (safi == SAFI_EVPN) {
|
||||
if (json_paths) {
|
||||
json_nexthop_global = json_object_new_object();
|
||||
|
||||
json_object_string_add(
|
||||
json_nexthop_global, "ip",
|
||||
json_object_string_add(json_nexthop_global, "ip",
|
||||
inet_ntoa(attr->nexthop));
|
||||
json_object_string_add(json_nexthop_global,
|
||||
"afi", "ipv4");
|
||||
json_object_boolean_true_add(
|
||||
json_nexthop_global, "used");
|
||||
json_object_boolean_true_add(json_nexthop_global,
|
||||
"used");
|
||||
} else
|
||||
vty_out(vty, "%-16s", inet_ntoa(attr->nexthop));
|
||||
}
|
||||
@ -6553,19 +6576,18 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
|
||||
|
||||
if ((safi == SAFI_MPLS_VPN)
|
||||
|| (safi == SAFI_EVPN))
|
||||
json_object_string_add(
|
||||
json_nexthop_global, "ip",
|
||||
inet_ntoa(
|
||||
attr->mp_nexthop_global_in));
|
||||
json_object_string_add(json_nexthop_global,
|
||||
"ip",
|
||||
inet_ntoa(attr->mp_nexthop_global_in));
|
||||
else
|
||||
json_object_string_add(
|
||||
json_nexthop_global, "ip",
|
||||
json_object_string_add(json_nexthop_global,
|
||||
"ip",
|
||||
inet_ntoa(attr->nexthop));
|
||||
|
||||
json_object_string_add(json_nexthop_global,
|
||||
"afi", "ipv4");
|
||||
json_object_boolean_true_add(
|
||||
json_nexthop_global, "used");
|
||||
json_object_boolean_true_add(json_nexthop_global,
|
||||
"used");
|
||||
} else {
|
||||
if ((safi == SAFI_MPLS_VPN)
|
||||
|| (safi == SAFI_EVPN))
|
||||
@ -6586,8 +6608,7 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
|
||||
|
||||
if (json_paths) {
|
||||
json_nexthop_global = json_object_new_object();
|
||||
json_object_string_add(
|
||||
json_nexthop_global, "ip",
|
||||
json_object_string_add(json_nexthop_global, "ip",
|
||||
inet_ntop(AF_INET6,
|
||||
&attr->mp_nexthop_global, buf,
|
||||
BUFSIZ));
|
||||
@ -6667,10 +6688,8 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
|
||||
" ");
|
||||
}
|
||||
} else {
|
||||
len = vty_out(
|
||||
vty, "%s",
|
||||
inet_ntop(
|
||||
AF_INET6,
|
||||
len = vty_out(vty, "%s",
|
||||
inet_ntop(AF_INET6,
|
||||
&attr->mp_nexthop_global,
|
||||
buf, BUFSIZ));
|
||||
len = 16 - len;
|
||||
@ -6732,13 +6751,6 @@ void route_vty_out(struct vty *vty, struct prefix *p, struct bgp_info *binfo,
|
||||
bgp_origin_long_str[attr->origin]);
|
||||
else
|
||||
vty_out(vty, "%s", bgp_origin_str[attr->origin]);
|
||||
} else {
|
||||
if (json_paths)
|
||||
json_object_string_add(json_path, "alert",
|
||||
"No attributes");
|
||||
else
|
||||
vty_out(vty, "No attributes to print\n");
|
||||
}
|
||||
|
||||
if (json_paths) {
|
||||
if (json_nexthop_global || json_nexthop_ll) {
|
||||
@ -8152,9 +8164,15 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
|
||||
bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT ? "Default"
|
||||
: bgp->name,
|
||||
table->version, inet_ntoa(bgp->router_id));
|
||||
if (rd)
|
||||
vty_out(vty, " \"routeDistinguishers\" : {");
|
||||
json_paths = json_object_new_object();
|
||||
}
|
||||
|
||||
if (use_json && rd) {
|
||||
vty_out(vty, " \"%s\" : { ", rd);
|
||||
}
|
||||
|
||||
/* Start processing of routes. */
|
||||
for (rn = bgp_table_top(table); rn; rn = bgp_route_next(rn)) {
|
||||
if (rn->info == NULL)
|
||||
@ -8331,8 +8349,6 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
|
||||
vty_out(vty,
|
||||
"Route Distinguisher: %s\n",
|
||||
rd);
|
||||
else
|
||||
vty_out(vty, "rd:\"%s\",", rd);
|
||||
}
|
||||
if (type == bgp_show_type_dampend_paths
|
||||
|| type == bgp_show_type_damp_neighbor)
|
||||
@ -8428,6 +8444,8 @@ int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi,
|
||||
&output_cum, &total_cum);
|
||||
}
|
||||
}
|
||||
if (use_json)
|
||||
vty_out(vty, " } }");
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
static int bgp_show(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
|
||||
|
Loading…
Reference in New Issue
Block a user