]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Add peerState field into JSON output for show bgp summary 7595/head
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Tue, 24 Nov 2020 13:51:51 +0000 (15:51 +0200)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Tue, 24 Nov 2020 14:04:45 +0000 (16:04 +0200)
vtysh -c 'show bgp summary json' | \
> jq '.ipv4Unicast.peers."192.168.0.2".peerState'
"Passive"

vtysh -c 'show bgp summary json' | \
> jq '.ipv4Unicast.peers."192.168.0.2".state'
"Established"

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
bgpd/bgp_vty.c

index 5e26d3063b34b928062621f9f504f99fcc00b933..f757715a44b4027aecbe08d7ad5f7b914a313120 100644 (file)
@@ -10813,25 +10813,68 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
                                        json_object_int_add(json_peer,
                                                            "pfxSnt",
                                                            (PAF_SUBGRP(paf))->scount);
+
+                               /* BGP FSM state */
                                if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)
                                    || CHECK_FLAG(peer->bgp->flags,
                                                  BGP_FLAG_SHUTDOWN))
-                                       json_object_string_add(json_peer, "state",
+                                       json_object_string_add(json_peer,
+                                                              "state",
                                                               "Idle (Admin)");
                                else if (peer->afc_recv[afi][safi])
                                        json_object_string_add(
-                                                              json_peer, "state",
-                                                              lookup_msg(bgp_status_msg, peer->status,
-                                                                         NULL));
-                               else if (CHECK_FLAG(peer->sflags,
-                                                   PEER_STATUS_PREFIX_OVERFLOW))
-                                       json_object_string_add(json_peer, "state",
+                                               json_peer, "state",
+                                               lookup_msg(bgp_status_msg,
+                                                          peer->status, NULL));
+                               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));
+                                               json_peer, "state",
+                                               lookup_msg(bgp_status_msg,
+                                                          peer->status, NULL));
+
+                               /* BGP peer state */
+                               if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)
+                                   || CHECK_FLAG(peer->bgp->flags,
+                                                 BGP_FLAG_SHUTDOWN))
+                                       json_object_string_add(json_peer,
+                                                              "peerState",
+                                                              "Admin");
+                               else if (CHECK_FLAG(
+                                                peer->sflags,
+                                                PEER_STATUS_PREFIX_OVERFLOW))
+                                       json_object_string_add(json_peer,
+                                                              "peerState",
+                                                              "PfxCt");
+                               else if (CHECK_FLAG(peer->flags,
+                                                   PEER_FLAG_PASSIVE))
+                                       json_object_string_add(json_peer,
+                                                              "peerState",
+                                                              "Passive");
+                               else if (CHECK_FLAG(peer->sflags,
+                                                   PEER_STATUS_NSF_WAIT))
+                                       json_object_string_add(json_peer,
+                                                              "peerState",
+                                                              "NSF passive");
+                               else if (CHECK_FLAG(
+                                                peer->bgp->flags,
+                                                BGP_FLAG_EBGP_REQUIRES_POLICY)
+                                        && (!bgp_inbound_policy_exists(peer,
+                                                                       filter)
+                                            || !bgp_outbound_policy_exists(
+                                                    peer, filter)))
+                                       json_object_string_add(json_peer,
+                                                              "peerState",
+                                                              "Policy");
+                               else
+                                       json_object_string_add(
+                                               json_peer, "peerState", "OK");
+
                                json_object_int_add(json_peer, "connectionsEstablished",
                                                    peer->established);
                                json_object_int_add(json_peer, "connectionsDropped",