From 2939f712d152f7e3ae438cc0f1d96dd9485e7487 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 9 Jul 2020 16:00:27 +0300 Subject: [PATCH 1/2] bgpd: Add command to show only established sessions ``` 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 --- bgpd/bgp_evpn_vty.c | 11 ++++++++--- bgpd/bgp_vty.c | 43 +++++++++++++++++++++++++++++++------------ bgpd/bgp_vty.h | 3 ++- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index 85604d856d..42987117d4 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -4077,7 +4077,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" @@ -4085,6 +4085,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) { @@ -4092,13 +4093,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); } /* diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 67ff31df8f..78521457fd 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -8772,7 +8772,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; @@ -9104,6 +9105,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, @@ -9193,6 +9198,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] = '*'; @@ -9315,7 +9324,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); @@ -9358,7 +9368,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++; @@ -9382,6 +9393,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; @@ -9411,7 +9423,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) @@ -9421,15 +9433,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); @@ -9444,7 +9457,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; } } @@ -9453,7 +9467,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"); @@ -9468,7 +9482,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 [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [failed] [json]", + "show [ip] bgp [ VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [established|failed] [json]", SHOW_STR IP_STR BGP_STR @@ -9476,6 +9490,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) { @@ -9483,6 +9498,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; @@ -9504,10 +9520,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) diff --git a/bgpd/bgp_vty.h b/bgpd/bgp_vty.h index d6ca198d09..95eefbc36f 100644 --- a/bgpd/bgp_vty.h +++ b/bgpd/bgp_vty.h @@ -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 */ From 2600443342d8e21d30df2b6ca095a5f2d0d4de2d Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 9 Jul 2020 16:05:08 +0300 Subject: [PATCH 2/2] doc: Add 'show bgp summary established' command Signed-off-by: Donatas Abraitis --- doc/user/bgp.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst index cb343e8dad..36227db604 100644 --- a/doc/user/bgp.rst +++ b/doc/user/bgp.rst @@ -2710,6 +2710,12 @@ structure is extended with :clicmd:`show bgp [afi] [safi]`. Show a bgp peer summary for peers that are not succesfully exchanging routes for the specified address family, and subsequent address-family. +.. index:: show bgp [afi] [safi] summary established [json] +.. clicmd:: show bgp [afi] [safi] summary established [json] + + Show a bgp peer summary for peers that are succesfully exchanging routes + for the specified address family, and subsequent address-family. + .. index:: show bgp [afi] [safi] neighbor [PEER] .. clicmd:: show bgp [afi] [safi] neighbor [PEER]