BGP: "show ip bgp neighbor json" keys are stepping all over each other

Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by:   Donald Sharp <sharpd@cumulusnetworks.com>

Ticket: CM-11007

bgp_show_neighbor() was allocating a json_neigh struct and using that
for every single peer...so the resulting json was a munge of state from
all peers

We need to allocate a new json_neigh for each neighbor.
This commit is contained in:
Daniel Walton 2016-05-18 13:31:59 +00:00
parent b1e0634c96
commit e8f7da3a90

View File

@ -10948,7 +10948,7 @@ bgp_show_peer_afi (struct vty *vty, struct peer *p, afi_t afi, safi_t safi,
}
static void
bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *json, json_object *json_neigh)
bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *json)
{
struct bgp *bgp;
char buf1[PREFIX2STR_BUFFER], buf[SU_ADDRSTRLEN];
@ -10960,9 +10960,13 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js
safi_t safi;
u_int16_t i;
u_char *msg;
json_object *json_neigh = NULL;
bgp = p->bgp;
if (use_json)
json_neigh = json_object_new_object();
if (!use_json)
{
if (p->conf_if) /* Configured interface name. */
@ -11909,7 +11913,7 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js
{
if (use_json)
{
json_object_string_add(json_hold, "reducePrefixNumFrom", p->host);
json_object_boolean_true_add(json_hold, "reducePrefixNumFrom");
json_object_int_add(json_hold, "restartInTimerMsec", thread_timer_remain_second (p->t_pmax_restart) * 1000);
}
else
@ -11920,7 +11924,7 @@ bgp_show_peer (struct vty *vty, struct peer *p, u_char use_json, json_object *js
else
{
if (use_json)
json_object_string_add(json_hold, "reducePrefixNumAndClearIpBgp", p->host);
json_object_boolean_true_add(json_hold, "reducePrefixNumAndClearIpBgp");
else
vty_out (vty, " Reduce the no. of prefix and clear ip bgp %s to restore peering%s",
p->host, VTY_NEWLINE);
@ -12093,10 +12097,6 @@ bgp_show_neighbor (struct vty *vty, struct bgp *bgp, enum show_type type,
struct listnode *node, *nnode;
struct peer *peer;
int find = 0;
json_object *json_neigh = NULL;
if (use_json)
json_neigh = json_object_new_object();
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
{
@ -12106,7 +12106,7 @@ bgp_show_neighbor (struct vty *vty, struct bgp *bgp, enum show_type type,
switch (type)
{
case show_all:
bgp_show_peer (vty, peer, use_json, json, json_neigh);
bgp_show_peer (vty, peer, use_json, json);
break;
case show_peer:
if (conf_if)
@ -12115,7 +12115,7 @@ bgp_show_neighbor (struct vty *vty, struct bgp *bgp, enum show_type type,
(peer->hostname && !strcmp(peer->hostname, conf_if)))
{
find = 1;
bgp_show_peer (vty, peer, use_json, json, json_neigh);
bgp_show_peer (vty, peer, use_json, json);
}
}
else
@ -12123,7 +12123,7 @@ bgp_show_neighbor (struct vty *vty, struct bgp *bgp, enum show_type type,
if (sockunion_same (&peer->su, su))
{
find = 1;
bgp_show_peer (vty, peer, use_json, json, json_neigh);
bgp_show_peer (vty, peer, use_json, json);
}
}
break;