]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Add command to show only established sessions
authorDonatas Abraitis <donatas.abraitis@gmail.com>
Thu, 9 Jul 2020 13:00:27 +0000 (16:00 +0300)
committerDonatas Abraitis <donatas.abraitis@gmail.com>
Thu, 9 Jul 2020 13:10:20 +0000 (16:10 +0300)
```
exit1-debian-9# show bgp summary

IPv4 Unicast Summary:
BGP router identifier 192.168.0.1, local AS number 100 vrf-id 0
BGP table version 8
RIB entries 15, using 2880 bytes of memory
Peers 2, using 43 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
192.168.0.2     4        200        10         6        0    0    0 00:00:35            8        8
2a02:4780::2    4          0         0         1        0    0    0    never       Active        0

Total number of neighbors 2
exit1-debian-9# show bgp summary established

IPv4 Unicast Summary:
BGP router identifier 192.168.0.1, local AS number 100 vrf-id 0
BGP table version 8
RIB entries 15, using 2880 bytes of memory
Peers 2, using 43 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt
192.168.0.2     4        200        10         6        0    0    0 00:00:39            8        8

Total number of neighbors 2
exit1-debian-9# show bgp summary failed

IPv4 Unicast Summary:
BGP router identifier 192.168.0.1, local AS number 100 vrf-id 0
BGP table version 8
RIB entries 15, using 2880 bytes of memory
Peers 2, using 43 KiB of memory

Neighbor        EstdCnt DropCnt ResetTime Reason
2a02:4780::2          0       0     never Waiting for peer OPEN

Total number of neighbors 2
exit1-debian-9#
```

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

index d2257b01264713c7160010d9413001777fdd83b1..1a0e5c0cd35b94b5ad0f75dda22542c69cff5685 100644 (file)
@@ -4075,7 +4075,7 @@ DEFUN(show_bgp_l2vpn_evpn_es,
  */
 DEFUN(show_bgp_l2vpn_evpn_summary,
       show_bgp_l2vpn_evpn_summary_cmd,
-      "show bgp [vrf VRFNAME] l2vpn evpn summary [failed] [json]",
+      "show bgp [vrf VRFNAME] l2vpn evpn summary [established|failed] [json]",
       SHOW_STR
       BGP_STR
       "bgp vrf\n"
@@ -4083,6 +4083,7 @@ DEFUN(show_bgp_l2vpn_evpn_summary,
       L2VPN_HELP_STR
       EVPN_HELP_STR
       "Summary of BGP neighbor status\n"
+      "Show only sessions in Established state\n"
       "Show only sessions not in Established state\n"
       JSON_STR)
 {
@@ -4090,13 +4091,17 @@ DEFUN(show_bgp_l2vpn_evpn_summary,
        bool uj = use_json(argc, argv);
        char *vrf = NULL;
        bool show_failed = false;
+       bool show_established = false;
 
        if (argv_find(argv, argc, "vrf", &idx_vrf))
                vrf = argv[++idx_vrf]->arg;
        if (argv_find(argv, argc, "failed", &idx_vrf))
                show_failed = true;
-       return bgp_show_summary_vty(vty, vrf, AFI_L2VPN, SAFI_EVPN,
-                                   show_failed, uj);
+       if (argv_find(argv, argc, "established", &idx_vrf))
+               show_established = true;
+
+       return bgp_show_summary_vty(vty, vrf, AFI_L2VPN, SAFI_EVPN, show_failed,
+                                   show_established, uj);
 }
 
 /*
index 449dab12b03db90c339763fe9967c6c6c4b2d6ba..c38db2eb677e5fd84db3f3f9fb7c22dbd6e2db69 100644 (file)
@@ -8861,7 +8861,8 @@ static void bgp_show_failed_summary(struct vty *vty, struct bgp *bgp,
 
 /* Show BGP peer's summary information. */
 static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
-                           bool show_failed, bool use_json)
+                           bool show_failed, bool show_established,
+                           bool use_json)
 {
        struct peer *peer;
        struct listnode *node, *nnode;
@@ -9194,6 +9195,10 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
                                bgp_show_failed_summary(vty, bgp, peer,
                                                        json_peer, 0, use_json);
                        } else if (!show_failed) {
+                               if (show_established
+                                   && bgp_has_peer_failed(peer, afi, safi))
+                                       continue;
+
                                json_peer = json_object_new_object();
                                if (peer_dynamic_neighbor(peer)) {
                                        json_object_boolean_true_add(json_peer,
@@ -9283,6 +9288,10 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
                                                        max_neighbor_width,
                                                        use_json);
                        } else if (!show_failed) {
+                               if (show_established
+                                   && bgp_has_peer_failed(peer, afi, safi))
+                                       continue;
+
                                memset(dn_flag, '\0', sizeof(dn_flag));
                                if (peer_dynamic_neighbor(peer)) {
                                        dn_flag[0] = '*';
@@ -9405,7 +9414,8 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
 }
 
 static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
-                                     int safi, bool show_failed, bool use_json)
+                                     int safi, bool show_failed,
+                                     bool show_established, bool use_json)
 {
        int is_first = 1;
        int afi_wildcard = (afi == AFI_MAX);
@@ -9448,7 +9458,8 @@ static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
                                                                         false));
                                        }
                                }
-                               bgp_show_summary(vty, bgp, afi, safi, show_failed,
+                               bgp_show_summary(vty, bgp, afi, safi,
+                                                show_failed, show_established,
                                                 use_json);
                        }
                        safi++;
@@ -9472,6 +9483,7 @@ static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
 
 static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
                                               safi_t safi, bool show_failed,
+                                              bool show_established,
                                               bool use_json)
 {
        struct listnode *node, *nnode;
@@ -9501,7 +9513,7 @@ static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
                                        : bgp->name);
                }
                bgp_show_summary_afi_safi(vty, bgp, afi, safi, show_failed,
-                                         use_json);
+                                         show_established, use_json);
        }
 
        if (use_json)
@@ -9511,15 +9523,16 @@ static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
 }
 
 int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
-                        safi_t safi, bool show_failed, bool use_json)
+                        safi_t safi, bool show_failed, bool show_established,
+                        bool use_json)
 {
        struct bgp *bgp;
 
        if (name) {
                if (strmatch(name, "all")) {
-                       bgp_show_all_instances_summary_vty(vty, afi, safi,
-                                                          show_failed,
-                                                          use_json);
+                       bgp_show_all_instances_summary_vty(
+                               vty, afi, safi, show_failed, show_established,
+                               use_json);
                        return CMD_SUCCESS;
                } else {
                        bgp = bgp_lookup_by_name(name);
@@ -9534,7 +9547,8 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
                        }
 
                        bgp_show_summary_afi_safi(vty, bgp, afi, safi,
-                                                 show_failed, use_json);
+                                                 show_failed, show_established,
+                                                 use_json);
                        return CMD_SUCCESS;
                }
        }
@@ -9543,7 +9557,7 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
 
        if (bgp)
                bgp_show_summary_afi_safi(vty, bgp, afi, safi, show_failed,
-                                         use_json);
+                                         show_established, use_json);
        else {
                if (use_json)
                        vty_out(vty, "{}\n");
@@ -9558,7 +9572,7 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
 /* `show [ip] bgp summary' commands. */
 DEFUN (show_ip_bgp_summary,
        show_ip_bgp_summary_cmd,
-       "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [failed] [json]",
+       "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [established|failed] [json]",
        SHOW_STR
        IP_STR
        BGP_STR
@@ -9566,6 +9580,7 @@ DEFUN (show_ip_bgp_summary,
        BGP_AFI_HELP_STR
        BGP_SAFI_WITH_LABEL_HELP_STR
        "Summary of BGP neighbor status\n"
+       "Show only sessions in Established state\n"
        "Show only sessions not in Established state\n"
        JSON_STR)
 {
@@ -9573,6 +9588,7 @@ DEFUN (show_ip_bgp_summary,
        afi_t afi = AFI_MAX;
        safi_t safi = SAFI_MAX;
        bool show_failed = false;
+       bool show_established = false;
 
        int idx = 0;
 
@@ -9594,10 +9610,13 @@ DEFUN (show_ip_bgp_summary,
 
        if (argv_find(argv, argc, "failed", &idx))
                show_failed = true;
+       if (argv_find(argv, argc, "established", &idx))
+               show_established = true;
 
        bool uj = use_json(argc, argv);
 
-       return bgp_show_summary_vty(vty, vrf, afi, safi, show_failed, uj);
+       return bgp_show_summary_vty(vty, vrf, afi, safi, show_failed,
+                                   show_established, uj);
 }
 
 const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json)
index d6ca198d095e0bc4f80050218fea3a0d875c8dba..95eefbc36fe3133b306b44307e74334d90cb1893 100644 (file)
@@ -178,6 +178,7 @@ extern int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
 int bgp_vty_find_and_parse_bgp(struct vty *vty, struct cmd_token **argv,
                               int argc, struct bgp **bgp, bool use_json);
 extern int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
-                               safi_t safi, bool show_failed, bool use_json);
+                               safi_t safi, bool show_failed,
+                               bool show_established, bool use_json);
 
 #endif /* _QUAGGA_BGP_VTY_H */