mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 20:55:25 +00:00
bgpd: remove some deep nesting
Some of this was so egregiously stupid, I couldn't look at it without gouging my eyes out... Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
2b79110731
commit
ea47320b1d
@ -375,155 +375,150 @@ static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
|
||||
if (prd && memcmp(rn->p.u.val, prd->val, 8) != 0)
|
||||
continue;
|
||||
|
||||
if ((table = rn->info) != NULL) {
|
||||
rd_header = 1;
|
||||
if ((table = rn->info) == NULL)
|
||||
continue;
|
||||
|
||||
for (rm = bgp_table_top(table); rm;
|
||||
rm = bgp_route_next(rm))
|
||||
for (ri = rm->info; ri; ri = ri->next) {
|
||||
total_count++;
|
||||
if (type == bgp_show_type_neighbor) {
|
||||
union sockunion *su =
|
||||
output_arg;
|
||||
rd_header = 1;
|
||||
|
||||
if (ri->peer->su_remote == NULL
|
||||
|| !sockunion_same(
|
||||
ri->peer->su_remote,
|
||||
su))
|
||||
continue;
|
||||
}
|
||||
if (header == 0) {
|
||||
if (use_json) {
|
||||
if (option
|
||||
== SHOW_DISPLAY_TAGS) {
|
||||
json_object_int_add(
|
||||
json,
|
||||
"bgpTableVersion",
|
||||
0);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"bgpLocalRouterId",
|
||||
inet_ntoa(
|
||||
bgp->router_id));
|
||||
json_object_object_add(
|
||||
json,
|
||||
"bgpStatusCodes",
|
||||
json_scode);
|
||||
json_object_object_add(
|
||||
json,
|
||||
"bgpOriginCodes",
|
||||
json_ocode);
|
||||
}
|
||||
} else {
|
||||
if (option
|
||||
== SHOW_DISPLAY_TAGS)
|
||||
vty_out(vty,
|
||||
V4_HEADER_TAG);
|
||||
else if (
|
||||
option
|
||||
== SHOW_DISPLAY_OVERLAY)
|
||||
vty_out(vty,
|
||||
V4_HEADER_OVERLAY);
|
||||
else {
|
||||
vty_out(vty,
|
||||
"BGP table version is 0, local router ID is %s\n",
|
||||
inet_ntoa(
|
||||
bgp->router_id));
|
||||
vty_out(vty,
|
||||
"Status codes: s suppressed, d damped, h history, * valid, > best, i - internal\n");
|
||||
vty_out(vty,
|
||||
"Origin codes: i - IGP, e - EGP, ? - incomplete\n\n");
|
||||
vty_out(vty,
|
||||
V4_HEADER);
|
||||
}
|
||||
}
|
||||
header = 0;
|
||||
}
|
||||
if (rd_header) {
|
||||
u_int16_t type;
|
||||
struct rd_as rd_as;
|
||||
struct rd_ip rd_ip;
|
||||
u_char *pnt;
|
||||
for (rm = bgp_table_top(table); rm;
|
||||
rm = bgp_route_next(rm))
|
||||
for (ri = rm->info; ri; ri = ri->next) {
|
||||
total_count++;
|
||||
if (type == bgp_show_type_neighbor) {
|
||||
union sockunion *su =
|
||||
output_arg;
|
||||
|
||||
pnt = rn->p.u.val;
|
||||
|
||||
/* Decode RD type. */
|
||||
type = decode_rd_type(pnt);
|
||||
/* Decode RD value. */
|
||||
if (type == RD_TYPE_AS)
|
||||
decode_rd_as(pnt + 2,
|
||||
&rd_as);
|
||||
else if (type == RD_TYPE_AS4)
|
||||
decode_rd_as4(pnt + 2,
|
||||
&rd_as);
|
||||
else if (type == RD_TYPE_IP)
|
||||
decode_rd_ip(pnt + 2,
|
||||
&rd_ip);
|
||||
if (use_json) {
|
||||
char buffer[BUFSIZ];
|
||||
if (type == RD_TYPE_AS
|
||||
|| type == RD_TYPE_AS4)
|
||||
sprintf(buffer,
|
||||
"%u:%d",
|
||||
rd_as.as,
|
||||
rd_as.val);
|
||||
else if (type
|
||||
== RD_TYPE_IP)
|
||||
sprintf(buffer,
|
||||
"%s:%d",
|
||||
inet_ntoa(
|
||||
rd_ip.ip),
|
||||
rd_ip.val);
|
||||
json_object_string_add(
|
||||
json_nroute,
|
||||
"routeDistinguisher",
|
||||
buffer);
|
||||
} else {
|
||||
vty_out(vty,
|
||||
"Route Distinguisher: ");
|
||||
if (type == RD_TYPE_AS)
|
||||
vty_out(vty,
|
||||
"as2 %u:%d",
|
||||
rd_as.as,
|
||||
rd_as.val);
|
||||
else if (type
|
||||
== RD_TYPE_AS4)
|
||||
vty_out(vty,
|
||||
"as4 %u:%d",
|
||||
rd_as.as,
|
||||
rd_as.val);
|
||||
else if (type
|
||||
== RD_TYPE_IP)
|
||||
vty_out(vty,
|
||||
"ip %s:%d",
|
||||
inet_ntoa(
|
||||
rd_ip.ip),
|
||||
rd_ip.val);
|
||||
vty_out(vty, "\n\n");
|
||||
}
|
||||
rd_header = 0;
|
||||
}
|
||||
if (use_json)
|
||||
json_array =
|
||||
json_object_new_array();
|
||||
else
|
||||
json_array = NULL;
|
||||
if (option == SHOW_DISPLAY_TAGS)
|
||||
route_vty_out_tag(
|
||||
vty, &rm->p, ri, 0,
|
||||
SAFI_EVPN, json_array);
|
||||
else if (option == SHOW_DISPLAY_OVERLAY)
|
||||
route_vty_out_overlay(
|
||||
vty, &rm->p, ri, 0,
|
||||
json_array);
|
||||
else
|
||||
route_vty_out(vty, &rm->p, ri,
|
||||
0, SAFI_EVPN,
|
||||
json_array);
|
||||
output_count++;
|
||||
if (ri->peer->su_remote == NULL
|
||||
|| !sockunion_same(
|
||||
ri->peer->su_remote,
|
||||
su))
|
||||
continue;
|
||||
}
|
||||
/* XXX json */
|
||||
}
|
||||
if (header == 0) {
|
||||
if (use_json) {
|
||||
if (option
|
||||
== SHOW_DISPLAY_TAGS) {
|
||||
json_object_int_add(
|
||||
json,
|
||||
"bgpTableVersion",
|
||||
0);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"bgpLocalRouterId",
|
||||
inet_ntoa(
|
||||
bgp->router_id));
|
||||
json_object_object_add(
|
||||
json,
|
||||
"bgpStatusCodes",
|
||||
json_scode);
|
||||
json_object_object_add(
|
||||
json,
|
||||
"bgpOriginCodes",
|
||||
json_ocode);
|
||||
}
|
||||
} else {
|
||||
if (option
|
||||
== SHOW_DISPLAY_TAGS)
|
||||
vty_out(vty,
|
||||
V4_HEADER_TAG);
|
||||
else if (
|
||||
option
|
||||
== SHOW_DISPLAY_OVERLAY)
|
||||
vty_out(vty,
|
||||
V4_HEADER_OVERLAY);
|
||||
else {
|
||||
vty_out(vty,
|
||||
"BGP table version is 0, local router ID is %s\n",
|
||||
inet_ntoa(
|
||||
bgp->router_id));
|
||||
vty_out(vty,
|
||||
"Status codes: s suppressed, d damped, h history, * valid, > best, i - internal\n");
|
||||
vty_out(vty,
|
||||
"Origin codes: i - IGP, e - EGP, ? - incomplete\n\n");
|
||||
vty_out(vty,
|
||||
V4_HEADER);
|
||||
}
|
||||
}
|
||||
header = 0;
|
||||
}
|
||||
if (rd_header) {
|
||||
u_int16_t type;
|
||||
struct rd_as rd_as;
|
||||
struct rd_ip rd_ip;
|
||||
u_char *pnt;
|
||||
|
||||
pnt = rn->p.u.val;
|
||||
|
||||
/* Decode RD type. */
|
||||
type = decode_rd_type(pnt);
|
||||
/* Decode RD value. */
|
||||
if (type == RD_TYPE_AS)
|
||||
decode_rd_as(pnt + 2, &rd_as);
|
||||
else if (type == RD_TYPE_AS4)
|
||||
decode_rd_as4(pnt + 2, &rd_as);
|
||||
else if (type == RD_TYPE_IP)
|
||||
decode_rd_ip(pnt + 2, &rd_ip);
|
||||
if (use_json) {
|
||||
char buffer[BUFSIZ];
|
||||
if (type == RD_TYPE_AS
|
||||
|| type == RD_TYPE_AS4)
|
||||
sprintf(buffer,
|
||||
"%u:%d",
|
||||
rd_as.as,
|
||||
rd_as.val);
|
||||
else if (type
|
||||
== RD_TYPE_IP)
|
||||
sprintf(buffer,
|
||||
"%s:%d",
|
||||
inet_ntoa(
|
||||
rd_ip.ip),
|
||||
rd_ip.val);
|
||||
json_object_string_add(
|
||||
json_nroute,
|
||||
"routeDistinguisher",
|
||||
buffer);
|
||||
} else {
|
||||
vty_out(vty,
|
||||
"Route Distinguisher: ");
|
||||
if (type == RD_TYPE_AS)
|
||||
vty_out(vty,
|
||||
"as2 %u:%d",
|
||||
rd_as.as,
|
||||
rd_as.val);
|
||||
else if (type
|
||||
== RD_TYPE_AS4)
|
||||
vty_out(vty,
|
||||
"as4 %u:%d",
|
||||
rd_as.as,
|
||||
rd_as.val);
|
||||
else if (type
|
||||
== RD_TYPE_IP)
|
||||
vty_out(vty,
|
||||
"ip %s:%d",
|
||||
inet_ntoa(
|
||||
rd_ip.ip),
|
||||
rd_ip.val);
|
||||
vty_out(vty, "\n\n");
|
||||
}
|
||||
rd_header = 0;
|
||||
}
|
||||
if (use_json)
|
||||
json_array = json_object_new_array();
|
||||
else
|
||||
json_array = NULL;
|
||||
if (option == SHOW_DISPLAY_TAGS)
|
||||
route_vty_out_tag(vty, &rm->p, ri, 0,
|
||||
SAFI_EVPN,
|
||||
json_array);
|
||||
else if (option == SHOW_DISPLAY_OVERLAY)
|
||||
route_vty_out_overlay(vty, &rm->p, ri,
|
||||
0, json_array);
|
||||
else
|
||||
route_vty_out(vty, &rm->p, ri, 0,
|
||||
SAFI_EVPN, json_array);
|
||||
output_count++;
|
||||
}
|
||||
/* XXX json */
|
||||
}
|
||||
if (output_count == 0)
|
||||
vty_out(vty, "No prefixes displayed, %ld exist\n", total_count);
|
||||
|
903
bgpd/bgp_route.c
903
bgpd/bgp_route.c
File diff suppressed because it is too large
Load Diff
643
bgpd/bgp_vty.c
643
bgpd/bgp_vty.c
@ -6610,368 +6610,369 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
|
||||
if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
|
||||
continue;
|
||||
|
||||
if (peer->afc[afi][safi]) {
|
||||
if (!count) {
|
||||
unsigned long ents;
|
||||
char memstrbuf[MTYPE_MEMSTR_LEN];
|
||||
int vrf_id_ui;
|
||||
if (!peer->afc[afi][safi])
|
||||
continue;
|
||||
|
||||
vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
|
||||
? -1
|
||||
: bgp->vrf_id;
|
||||
if (!count) {
|
||||
unsigned long ents;
|
||||
char memstrbuf[MTYPE_MEMSTR_LEN];
|
||||
int vrf_id_ui;
|
||||
|
||||
/* Usage summary and header */
|
||||
vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
|
||||
? -1
|
||||
: bgp->vrf_id;
|
||||
|
||||
/* Usage summary and header */
|
||||
if (use_json) {
|
||||
json_object_string_add(
|
||||
json, "routerId",
|
||||
inet_ntoa(bgp->router_id));
|
||||
json_object_int_add(json, "as",
|
||||
bgp->as);
|
||||
json_object_int_add(json, "vrfId",
|
||||
vrf_id_ui);
|
||||
json_object_string_add(
|
||||
json, "vrfName",
|
||||
(bgp->inst_type
|
||||
== BGP_INSTANCE_TYPE_DEFAULT)
|
||||
? "Default"
|
||||
: bgp->name);
|
||||
} else {
|
||||
vty_out(vty,
|
||||
"BGP router identifier %s, local AS number %u vrf-id %d",
|
||||
inet_ntoa(bgp->router_id),
|
||||
bgp->as, vrf_id_ui);
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
|
||||
if (bgp_update_delay_configured(bgp)) {
|
||||
if (use_json) {
|
||||
json_object_string_add(
|
||||
json, "routerId",
|
||||
inet_ntoa(bgp->router_id));
|
||||
json_object_int_add(json, "as",
|
||||
bgp->as);
|
||||
json_object_int_add(json, "vrfId",
|
||||
vrf_id_ui);
|
||||
json_object_string_add(
|
||||
json, "vrfName",
|
||||
(bgp->inst_type
|
||||
== BGP_INSTANCE_TYPE_DEFAULT)
|
||||
? "Default"
|
||||
: bgp->name);
|
||||
} else {
|
||||
vty_out(vty,
|
||||
"BGP router identifier %s, local AS number %u vrf-id %d",
|
||||
inet_ntoa(bgp->router_id),
|
||||
bgp->as, vrf_id_ui);
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
json_object_int_add(
|
||||
json,
|
||||
"updateDelayLimit",
|
||||
bgp->v_update_delay);
|
||||
|
||||
if (bgp_update_delay_configured(bgp)) {
|
||||
if (use_json) {
|
||||
if (bgp->v_update_delay
|
||||
!= bgp->v_establish_wait)
|
||||
json_object_int_add(
|
||||
json,
|
||||
"updateDelayLimit",
|
||||
bgp->v_update_delay);
|
||||
"updateDelayEstablishWait",
|
||||
bgp->v_establish_wait);
|
||||
|
||||
if (bgp->v_update_delay
|
||||
!= bgp->v_establish_wait)
|
||||
json_object_int_add(
|
||||
json,
|
||||
"updateDelayEstablishWait",
|
||||
bgp->v_establish_wait);
|
||||
|
||||
if (bgp_update_delay_active(
|
||||
bgp)) {
|
||||
if (bgp_update_delay_active(
|
||||
bgp)) {
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayFirstNeighbor",
|
||||
bgp->update_delay_begin_time);
|
||||
json_object_boolean_true_add(
|
||||
json,
|
||||
"updateDelayInProgress");
|
||||
} else {
|
||||
if (bgp->update_delay_over) {
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayFirstNeighbor",
|
||||
bgp->update_delay_begin_time);
|
||||
json_object_boolean_true_add(
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayInProgress");
|
||||
} else {
|
||||
if (bgp->update_delay_over) {
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayFirstNeighbor",
|
||||
bgp->update_delay_begin_time);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayBestpathResumed",
|
||||
bgp->update_delay_end_time);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayZebraUpdateResume",
|
||||
bgp->update_delay_zebra_resume_time);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayPeerUpdateResume",
|
||||
bgp->update_delay_peers_resume_time);
|
||||
}
|
||||
"updateDelayBestpathResumed",
|
||||
bgp->update_delay_end_time);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayZebraUpdateResume",
|
||||
bgp->update_delay_zebra_resume_time);
|
||||
json_object_string_add(
|
||||
json,
|
||||
"updateDelayPeerUpdateResume",
|
||||
bgp->update_delay_peers_resume_time);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
} else {
|
||||
vty_out(vty,
|
||||
"Read-only mode update-delay limit: %d seconds\n",
|
||||
bgp->v_update_delay);
|
||||
if (bgp->v_update_delay
|
||||
!= bgp->v_establish_wait)
|
||||
vty_out(vty,
|
||||
"Read-only mode update-delay limit: %d seconds\n",
|
||||
bgp->v_update_delay);
|
||||
if (bgp->v_update_delay
|
||||
!= bgp->v_establish_wait)
|
||||
vty_out(vty,
|
||||
" Establish wait: %d seconds\n",
|
||||
bgp->v_establish_wait);
|
||||
" Establish wait: %d seconds\n",
|
||||
bgp->v_establish_wait);
|
||||
|
||||
if (bgp_update_delay_active(
|
||||
bgp)) {
|
||||
if (bgp_update_delay_active(
|
||||
bgp)) {
|
||||
vty_out(vty,
|
||||
" First neighbor established: %s\n",
|
||||
bgp->update_delay_begin_time);
|
||||
vty_out(vty,
|
||||
" Delay in progress\n");
|
||||
} else {
|
||||
if (bgp->update_delay_over) {
|
||||
vty_out(vty,
|
||||
" First neighbor established: %s\n",
|
||||
bgp->update_delay_begin_time);
|
||||
vty_out(vty,
|
||||
" Delay in progress\n");
|
||||
} else {
|
||||
if (bgp->update_delay_over) {
|
||||
vty_out(vty,
|
||||
" First neighbor established: %s\n",
|
||||
bgp->update_delay_begin_time);
|
||||
vty_out(vty,
|
||||
" Best-paths resumed: %s\n",
|
||||
bgp->update_delay_end_time);
|
||||
vty_out(vty,
|
||||
" zebra update resumed: %s\n",
|
||||
bgp->update_delay_zebra_resume_time);
|
||||
vty_out(vty,
|
||||
" peers update resumed: %s\n",
|
||||
bgp->update_delay_peers_resume_time);
|
||||
}
|
||||
" Best-paths resumed: %s\n",
|
||||
bgp->update_delay_end_time);
|
||||
vty_out(vty,
|
||||
" zebra update resumed: %s\n",
|
||||
bgp->update_delay_zebra_resume_time);
|
||||
vty_out(vty,
|
||||
" peers update resumed: %s\n",
|
||||
bgp->update_delay_peers_resume_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (use_json) {
|
||||
if (bgp_maxmed_onstartup_configured(bgp)
|
||||
&& bgp->maxmed_active)
|
||||
json_object_boolean_true_add(
|
||||
json,
|
||||
"maxMedOnStartup");
|
||||
if (bgp->v_maxmed_admin)
|
||||
json_object_boolean_true_add(
|
||||
json,
|
||||
"maxMedAdministrative");
|
||||
|
||||
json_object_int_add(
|
||||
json, "tableVersion",
|
||||
bgp_table_version(
|
||||
bgp->rib[afi][safi]));
|
||||
|
||||
ents = bgp_table_count(
|
||||
bgp->rib[afi][safi]);
|
||||
json_object_int_add(json, "ribCount",
|
||||
ents);
|
||||
json_object_int_add(
|
||||
json, "ribMemory",
|
||||
ents * sizeof(struct bgp_node));
|
||||
|
||||
ents = listcount(bgp->peer);
|
||||
json_object_int_add(json, "peerCount",
|
||||
ents);
|
||||
json_object_int_add(
|
||||
json, "peerMemory",
|
||||
ents * sizeof(struct peer));
|
||||
|
||||
if ((ents = listcount(bgp->group))) {
|
||||
json_object_int_add(
|
||||
json, "peerGroupCount",
|
||||
ents);
|
||||
json_object_int_add(
|
||||
json, "peerGroupMemory",
|
||||
ents * sizeof(struct
|
||||
peer_group));
|
||||
}
|
||||
|
||||
if (CHECK_FLAG(bgp->af_flags[afi][safi],
|
||||
BGP_CONFIG_DAMPENING))
|
||||
json_object_boolean_true_add(
|
||||
json,
|
||||
"dampeningEnabled");
|
||||
} else {
|
||||
if (bgp_maxmed_onstartup_configured(bgp)
|
||||
&& bgp->maxmed_active)
|
||||
vty_out(vty,
|
||||
"Max-med on-startup active\n");
|
||||
if (bgp->v_maxmed_admin)
|
||||
vty_out(vty,
|
||||
"Max-med administrative active\n");
|
||||
|
||||
vty_out(vty,
|
||||
"BGP table version %" PRIu64
|
||||
"\n",
|
||||
bgp_table_version(
|
||||
bgp->rib[afi][safi]));
|
||||
|
||||
ents = bgp_table_count(
|
||||
bgp->rib[afi][safi]);
|
||||
vty_out(vty,
|
||||
"RIB entries %ld, using %s of memory\n",
|
||||
ents,
|
||||
mtype_memstr(
|
||||
memstrbuf,
|
||||
sizeof(memstrbuf),
|
||||
ents * sizeof(struct
|
||||
bgp_node)));
|
||||
|
||||
/* Peer related usage */
|
||||
ents = listcount(bgp->peer);
|
||||
vty_out(vty,
|
||||
"Peers %ld, using %s of memory\n",
|
||||
ents,
|
||||
mtype_memstr(
|
||||
memstrbuf,
|
||||
sizeof(memstrbuf),
|
||||
ents * sizeof(struct
|
||||
peer)));
|
||||
|
||||
if ((ents = listcount(bgp->group)))
|
||||
vty_out(vty,
|
||||
"Peer groups %ld, using %s of memory\n",
|
||||
ents,
|
||||
mtype_memstr(
|
||||
memstrbuf,
|
||||
sizeof(memstrbuf),
|
||||
ents * sizeof(struct
|
||||
peer_group)));
|
||||
|
||||
if (CHECK_FLAG(bgp->af_flags[afi][safi],
|
||||
BGP_CONFIG_DAMPENING))
|
||||
vty_out(vty,
|
||||
"Dampening enabled.\n");
|
||||
vty_out(vty, "\n");
|
||||
|
||||
/* Subtract 8 here because 'Neighbor' is
|
||||
* 8 characters */
|
||||
vty_out(vty, "Neighbor");
|
||||
vty_out(vty, "%*s",
|
||||
max_neighbor_width - 8, " ");
|
||||
vty_out(vty,
|
||||
"V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
|
||||
}
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
if (use_json) {
|
||||
json_peer = json_object_new_object();
|
||||
|
||||
if (peer_dynamic_neighbor(peer))
|
||||
if (bgp_maxmed_onstartup_configured(bgp)
|
||||
&& bgp->maxmed_active)
|
||||
json_object_boolean_true_add(
|
||||
json_peer, "dynamicPeer");
|
||||
json,
|
||||
"maxMedOnStartup");
|
||||
if (bgp->v_maxmed_admin)
|
||||
json_object_boolean_true_add(
|
||||
json,
|
||||
"maxMedAdministrative");
|
||||
|
||||
if (peer->hostname)
|
||||
json_object_string_add(json_peer,
|
||||
"hostname",
|
||||
peer->hostname);
|
||||
|
||||
if (peer->domainname)
|
||||
json_object_string_add(
|
||||
json_peer, "domainname",
|
||||
peer->domainname);
|
||||
|
||||
json_object_int_add(json_peer, "remoteAs",
|
||||
peer->as);
|
||||
json_object_int_add(json_peer, "version", 4);
|
||||
json_object_int_add(
|
||||
json_peer, "msgRcvd",
|
||||
peer->open_in + peer->update_in
|
||||
+ peer->keepalive_in
|
||||
+ peer->notify_in
|
||||
+ peer->refresh_in
|
||||
+ peer->dynamic_cap_in);
|
||||
json, "tableVersion",
|
||||
bgp_table_version(
|
||||
bgp->rib[afi][safi]));
|
||||
|
||||
ents = bgp_table_count(
|
||||
bgp->rib[afi][safi]);
|
||||
json_object_int_add(json, "ribCount",
|
||||
ents);
|
||||
json_object_int_add(
|
||||
json_peer, "msgSent",
|
||||
peer->open_out + peer->update_out
|
||||
+ peer->keepalive_out
|
||||
+ peer->notify_out
|
||||
+ peer->refresh_out
|
||||
+ peer->dynamic_cap_out);
|
||||
json, "ribMemory",
|
||||
ents * sizeof(struct bgp_node));
|
||||
|
||||
json_object_int_add(json_peer, "tableVersion",
|
||||
peer->version[afi][safi]);
|
||||
json_object_int_add(json_peer, "outq",
|
||||
peer->obuf->count);
|
||||
json_object_int_add(json_peer, "inq", 0);
|
||||
peer_uptime(peer->uptime, timebuf,
|
||||
BGP_UPTIME_LEN, use_json,
|
||||
json_peer);
|
||||
ents = listcount(bgp->peer);
|
||||
json_object_int_add(json, "peerCount",
|
||||
ents);
|
||||
json_object_int_add(
|
||||
json_peer, "prefixReceivedCount",
|
||||
peer->pcount[afi][pfx_rcd_safi]);
|
||||
json, "peerMemory",
|
||||
ents * sizeof(struct peer));
|
||||
|
||||
if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
|
||||
json_object_string_add(json_peer,
|
||||
"state",
|
||||
"Idle (Admin)");
|
||||
else if (CHECK_FLAG(
|
||||
peer->sflags,
|
||||
PEER_STATUS_PREFIX_OVERFLOW))
|
||||
json_object_string_add(json_peer,
|
||||
"state",
|
||||
"Idle (PfxCt)");
|
||||
else
|
||||
json_object_string_add(
|
||||
json_peer, "state",
|
||||
lookup_msg(bgp_status_msg,
|
||||
peer->status, NULL));
|
||||
if ((ents = listcount(bgp->group))) {
|
||||
json_object_int_add(
|
||||
json, "peerGroupCount",
|
||||
ents);
|
||||
json_object_int_add(
|
||||
json, "peerGroupMemory",
|
||||
ents * sizeof(struct
|
||||
peer_group));
|
||||
}
|
||||
|
||||
if (peer->conf_if)
|
||||
json_object_string_add(json_peer,
|
||||
"idType",
|
||||
"interface");
|
||||
else if (peer->su.sa.sa_family == AF_INET)
|
||||
json_object_string_add(
|
||||
json_peer, "idType", "ipv4");
|
||||
else if (peer->su.sa.sa_family == AF_INET6)
|
||||
json_object_string_add(
|
||||
json_peer, "idType", "ipv6");
|
||||
|
||||
json_object_object_add(json_peers, peer->host,
|
||||
json_peer);
|
||||
if (CHECK_FLAG(bgp->af_flags[afi][safi],
|
||||
BGP_CONFIG_DAMPENING))
|
||||
json_object_boolean_true_add(
|
||||
json,
|
||||
"dampeningEnabled");
|
||||
} else {
|
||||
memset(dn_flag, '\0', sizeof(dn_flag));
|
||||
if (peer_dynamic_neighbor(peer)) {
|
||||
dn_count++;
|
||||
dn_flag[0] = '*';
|
||||
}
|
||||
if (bgp_maxmed_onstartup_configured(bgp)
|
||||
&& bgp->maxmed_active)
|
||||
vty_out(vty,
|
||||
"Max-med on-startup active\n");
|
||||
if (bgp->v_maxmed_admin)
|
||||
vty_out(vty,
|
||||
"Max-med administrative active\n");
|
||||
|
||||
if (peer->hostname
|
||||
&& bgp_flag_check(bgp,
|
||||
BGP_FLAG_SHOW_HOSTNAME))
|
||||
len = vty_out(vty, "%s%s(%s)", dn_flag,
|
||||
peer->hostname,
|
||||
peer->host);
|
||||
else
|
||||
len = vty_out(vty, "%s%s", dn_flag,
|
||||
peer->host);
|
||||
vty_out(vty,
|
||||
"BGP table version %" PRIu64
|
||||
"\n",
|
||||
bgp_table_version(
|
||||
bgp->rib[afi][safi]));
|
||||
|
||||
/* pad the neighbor column with spaces */
|
||||
if (len < max_neighbor_width)
|
||||
vty_out(vty, "%*s",
|
||||
max_neighbor_width - len, " ");
|
||||
ents = bgp_table_count(
|
||||
bgp->rib[afi][safi]);
|
||||
vty_out(vty,
|
||||
"RIB entries %ld, using %s of memory\n",
|
||||
ents,
|
||||
mtype_memstr(
|
||||
memstrbuf,
|
||||
sizeof(memstrbuf),
|
||||
ents * sizeof(struct
|
||||
bgp_node)));
|
||||
|
||||
vty_out(vty, "4 %10u %7d %7d %8" PRIu64
|
||||
" %4d %4zd %8s",
|
||||
peer->as,
|
||||
peer->open_in + peer->update_in
|
||||
+ peer->keepalive_in
|
||||
+ peer->notify_in
|
||||
+ peer->refresh_in
|
||||
+ peer->dynamic_cap_in,
|
||||
peer->open_out + peer->update_out
|
||||
+ peer->keepalive_out
|
||||
+ peer->notify_out
|
||||
+ peer->refresh_out
|
||||
+ peer->dynamic_cap_out,
|
||||
peer->version[afi][safi], 0,
|
||||
peer->obuf->count,
|
||||
peer_uptime(peer->uptime, timebuf,
|
||||
BGP_UPTIME_LEN, 0, NULL));
|
||||
/* Peer related usage */
|
||||
ents = listcount(bgp->peer);
|
||||
vty_out(vty,
|
||||
"Peers %ld, using %s of memory\n",
|
||||
ents,
|
||||
mtype_memstr(
|
||||
memstrbuf,
|
||||
sizeof(memstrbuf),
|
||||
ents * sizeof(struct
|
||||
peer)));
|
||||
|
||||
if (peer->status == Established)
|
||||
vty_out(vty, " %12ld",
|
||||
peer->pcount[afi]
|
||||
[pfx_rcd_safi]);
|
||||
else {
|
||||
if (CHECK_FLAG(peer->flags,
|
||||
PEER_FLAG_SHUTDOWN))
|
||||
vty_out(vty, " Idle (Admin)");
|
||||
else if (
|
||||
CHECK_FLAG(
|
||||
peer->sflags,
|
||||
PEER_STATUS_PREFIX_OVERFLOW))
|
||||
vty_out(vty, " Idle (PfxCt)");
|
||||
else
|
||||
vty_out(vty, " %12s",
|
||||
lookup_msg(
|
||||
bgp_status_msg,
|
||||
peer->status,
|
||||
NULL));
|
||||
}
|
||||
if ((ents = listcount(bgp->group)))
|
||||
vty_out(vty,
|
||||
"Peer groups %ld, using %s of memory\n",
|
||||
ents,
|
||||
mtype_memstr(
|
||||
memstrbuf,
|
||||
sizeof(memstrbuf),
|
||||
ents * sizeof(struct
|
||||
peer_group)));
|
||||
|
||||
if (CHECK_FLAG(bgp->af_flags[afi][safi],
|
||||
BGP_CONFIG_DAMPENING))
|
||||
vty_out(vty,
|
||||
"Dampening enabled.\n");
|
||||
vty_out(vty, "\n");
|
||||
|
||||
/* Subtract 8 here because 'Neighbor' is
|
||||
* 8 characters */
|
||||
vty_out(vty, "Neighbor");
|
||||
vty_out(vty, "%*s",
|
||||
max_neighbor_width - 8, " ");
|
||||
vty_out(vty,
|
||||
"V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
|
||||
}
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
if (use_json) {
|
||||
json_peer = json_object_new_object();
|
||||
|
||||
if (peer_dynamic_neighbor(peer))
|
||||
json_object_boolean_true_add(
|
||||
json_peer, "dynamicPeer");
|
||||
|
||||
if (peer->hostname)
|
||||
json_object_string_add(json_peer,
|
||||
"hostname",
|
||||
peer->hostname);
|
||||
|
||||
if (peer->domainname)
|
||||
json_object_string_add(
|
||||
json_peer, "domainname",
|
||||
peer->domainname);
|
||||
|
||||
json_object_int_add(json_peer, "remoteAs",
|
||||
peer->as);
|
||||
json_object_int_add(json_peer, "version", 4);
|
||||
json_object_int_add(
|
||||
json_peer, "msgRcvd",
|
||||
peer->open_in + peer->update_in
|
||||
+ peer->keepalive_in
|
||||
+ peer->notify_in
|
||||
+ peer->refresh_in
|
||||
+ peer->dynamic_cap_in);
|
||||
json_object_int_add(
|
||||
json_peer, "msgSent",
|
||||
peer->open_out + peer->update_out
|
||||
+ peer->keepalive_out
|
||||
+ peer->notify_out
|
||||
+ peer->refresh_out
|
||||
+ peer->dynamic_cap_out);
|
||||
|
||||
json_object_int_add(json_peer, "tableVersion",
|
||||
peer->version[afi][safi]);
|
||||
json_object_int_add(json_peer, "outq",
|
||||
peer->obuf->count);
|
||||
json_object_int_add(json_peer, "inq", 0);
|
||||
peer_uptime(peer->uptime, timebuf,
|
||||
BGP_UPTIME_LEN, use_json,
|
||||
json_peer);
|
||||
json_object_int_add(
|
||||
json_peer, "prefixReceivedCount",
|
||||
peer->pcount[afi][pfx_rcd_safi]);
|
||||
|
||||
if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
|
||||
json_object_string_add(json_peer,
|
||||
"state",
|
||||
"Idle (Admin)");
|
||||
else if (CHECK_FLAG(
|
||||
peer->sflags,
|
||||
PEER_STATUS_PREFIX_OVERFLOW))
|
||||
json_object_string_add(json_peer,
|
||||
"state",
|
||||
"Idle (PfxCt)");
|
||||
else
|
||||
json_object_string_add(
|
||||
json_peer, "state",
|
||||
lookup_msg(bgp_status_msg,
|
||||
peer->status, NULL));
|
||||
|
||||
if (peer->conf_if)
|
||||
json_object_string_add(json_peer,
|
||||
"idType",
|
||||
"interface");
|
||||
else if (peer->su.sa.sa_family == AF_INET)
|
||||
json_object_string_add(
|
||||
json_peer, "idType", "ipv4");
|
||||
else if (peer->su.sa.sa_family == AF_INET6)
|
||||
json_object_string_add(
|
||||
json_peer, "idType", "ipv6");
|
||||
|
||||
json_object_object_add(json_peers, peer->host,
|
||||
json_peer);
|
||||
} else {
|
||||
memset(dn_flag, '\0', sizeof(dn_flag));
|
||||
if (peer_dynamic_neighbor(peer)) {
|
||||
dn_count++;
|
||||
dn_flag[0] = '*';
|
||||
}
|
||||
|
||||
if (peer->hostname
|
||||
&& bgp_flag_check(bgp,
|
||||
BGP_FLAG_SHOW_HOSTNAME))
|
||||
len = vty_out(vty, "%s%s(%s)", dn_flag,
|
||||
peer->hostname,
|
||||
peer->host);
|
||||
else
|
||||
len = vty_out(vty, "%s%s", dn_flag,
|
||||
peer->host);
|
||||
|
||||
/* pad the neighbor column with spaces */
|
||||
if (len < max_neighbor_width)
|
||||
vty_out(vty, "%*s",
|
||||
max_neighbor_width - len, " ");
|
||||
|
||||
vty_out(vty, "4 %10u %7d %7d %8" PRIu64
|
||||
" %4d %4zd %8s",
|
||||
peer->as,
|
||||
peer->open_in + peer->update_in
|
||||
+ peer->keepalive_in
|
||||
+ peer->notify_in
|
||||
+ peer->refresh_in
|
||||
+ peer->dynamic_cap_in,
|
||||
peer->open_out + peer->update_out
|
||||
+ peer->keepalive_out
|
||||
+ peer->notify_out
|
||||
+ peer->refresh_out
|
||||
+ peer->dynamic_cap_out,
|
||||
peer->version[afi][safi], 0,
|
||||
peer->obuf->count,
|
||||
peer_uptime(peer->uptime, timebuf,
|
||||
BGP_UPTIME_LEN, 0, NULL));
|
||||
|
||||
if (peer->status == Established)
|
||||
vty_out(vty, " %12ld",
|
||||
peer->pcount[afi]
|
||||
[pfx_rcd_safi]);
|
||||
else {
|
||||
if (CHECK_FLAG(peer->flags,
|
||||
PEER_FLAG_SHUTDOWN))
|
||||
vty_out(vty, " Idle (Admin)");
|
||||
else if (
|
||||
CHECK_FLAG(
|
||||
peer->sflags,
|
||||
PEER_STATUS_PREFIX_OVERFLOW))
|
||||
vty_out(vty, " Idle (PfxCt)");
|
||||
else
|
||||
vty_out(vty, " %12s",
|
||||
lookup_msg(
|
||||
bgp_status_msg,
|
||||
peer->status,
|
||||
NULL));
|
||||
}
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (use_json) {
|
||||
|
Loading…
Reference in New Issue
Block a user