Merge pull request #6827 from maduri111/bgpd-show-bgp-all

bgpd: show <ip> bgp <ipv4/ipv6> all
This commit is contained in:
Donatas Abraitis 2020-09-10 15:11:14 +03:00 committed by GitHub
commit a68b613b09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 456 additions and 115 deletions

View File

@ -36,6 +36,8 @@
#include "bgpd/bgp_attr.h" #include "bgpd/bgp_attr.h"
#include "bgpd/bgp_advertise.h" #include "bgpd/bgp_advertise.h"
const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json);
/* Global variable to access damping configuration */ /* Global variable to access damping configuration */
static struct bgp_damp_config damp[AFI_MAX][SAFI_MAX]; static struct bgp_damp_config damp[AFI_MAX][SAFI_MAX];
@ -653,16 +655,9 @@ const char *bgp_damp_reuse_time_vty(struct vty *vty, struct bgp_path_info *path,
json); json);
} }
int bgp_show_dampening_parameters(struct vty *vty, afi_t afi, safi_t safi) static int bgp_print_dampening_parameters(struct bgp *bgp, struct vty *vty,
afi_t afi, safi_t safi)
{ {
struct bgp *bgp;
bgp = bgp_get_default();
if (bgp == NULL) {
vty_out(vty, "No BGP process is configured\n");
return CMD_WARNING;
}
if (CHECK_FLAG(bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)) { if (CHECK_FLAG(bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)) {
vty_out(vty, "Half-life time: %lld min\n", vty_out(vty, "Half-life time: %lld min\n",
(long long)damp[afi][safi].half_life / 60); (long long)damp[afi][safi].half_life / 60);
@ -677,7 +672,52 @@ int bgp_show_dampening_parameters(struct vty *vty, afi_t afi, safi_t safi)
vty_out(vty, "\n"); vty_out(vty, "\n");
} else } else
vty_out(vty, "dampening not enabled for %s\n", vty_out(vty, "dampening not enabled for %s\n",
afi == AFI_IP ? "IPv4" : "IPv6"); get_afi_safi_str(afi, safi, false));
return CMD_SUCCESS; return CMD_SUCCESS;
} }
int bgp_show_dampening_parameters(struct vty *vty, afi_t afi, safi_t safi,
uint8_t show_flags)
{
struct bgp *bgp;
bgp = bgp_get_default();
if (bgp == NULL) {
vty_out(vty, "No BGP process is configured\n");
return CMD_WARNING;
}
if (!CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_ALL))
return bgp_print_dampening_parameters(bgp, vty, afi, safi);
if (CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP)
|| CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP6)) {
afi = CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP) ? AFI_IP
: AFI_IP6;
FOREACH_SAFI (safi) {
if (strmatch(get_afi_safi_str(afi, safi, true),
"Unknown"))
continue;
if (!CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON))
vty_out(vty, "\nFor address family: %s\n\n",
get_afi_safi_str(afi, safi, false));
bgp_print_dampening_parameters(bgp, vty, afi, safi);
}
} else {
FOREACH_AFI_SAFI (afi, safi) {
if (strmatch(get_afi_safi_str(afi, safi, true),
"Unknown"))
continue;
if (!CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON))
vty_out(vty, "\nFor address family: %s\n",
get_afi_safi_str(afi, safi, false));
bgp_print_dampening_parameters(bgp, vty, afi, safi);
}
}
return CMD_SUCCESS;
}

View File

@ -151,6 +151,7 @@ extern const char *bgp_damp_reuse_time_vty(struct vty *vty,
char *timebuf, size_t len, afi_t afi, char *timebuf, size_t len, afi_t afi,
safi_t safi, bool use_json, safi_t safi, bool use_json,
json_object *json); json_object *json);
extern int bgp_show_dampening_parameters(struct vty *vty, afi_t, safi_t); extern int bgp_show_dampening_parameters(struct vty *vty, afi_t, safi_t,
uint8_t);
#endif /* _QUAGGA_BGP_DAMP_H */ #endif /* _QUAGGA_BGP_DAMP_H */

View File

@ -9757,15 +9757,14 @@ static int bgp_show_regexp(struct vty *vty, struct bgp *bgp, const char *regstr,
bool use_json); bool use_json);
static int bgp_show_community(struct vty *vty, struct bgp *bgp, static int bgp_show_community(struct vty *vty, struct bgp *bgp,
const char *comstr, int exact, afi_t afi, const char *comstr, int exact, afi_t afi,
safi_t safi, bool use_json); safi_t safi, uint8_t show_flags);
static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi, static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
struct bgp_table *table, enum bgp_show_type type, struct bgp_table *table, enum bgp_show_type type,
void *output_arg, bool use_json, char *rd, void *output_arg, char *rd, int is_last,
int is_last, unsigned long *output_cum, unsigned long *output_cum, unsigned long *total_cum,
unsigned long *total_cum, unsigned long *json_header_depth, uint8_t show_flags)
unsigned long *json_header_depth, bool wide)
{ {
struct bgp_path_info *pi; struct bgp_path_info *pi;
struct bgp_dest *dest; struct bgp_dest *dest;
@ -9776,13 +9775,23 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
struct prefix *p; struct prefix *p;
json_object *json_paths = NULL; json_object *json_paths = NULL;
int first = 1; int first = 1;
bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
bool wide = CHECK_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
bool all = CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_ALL);
if (output_cum && *output_cum != 0) if (output_cum && *output_cum != 0)
header = 0; header = 0;
if (use_json && !*json_header_depth) { if (use_json && !*json_header_depth) {
if (all)
*json_header_depth = 1;
else {
vty_out(vty, "{\n");
*json_header_depth = 2;
}
vty_out(vty, vty_out(vty,
"{\n \"vrfId\": %d,\n \"vrfName\": \"%s\",\n \"tableVersion\": %" PRId64",\n \"routerId\": \"%s\",\n \"defaultLocPrf\": %u,\n" " \"vrfId\": %d,\n \"vrfName\": \"%s\",\n \"tableVersion\": %" PRId64",\n \"routerId\": \"%s\",\n \"defaultLocPrf\": %u,\n"
" \"localAS\": %u,\n \"routes\": { ", " \"localAS\": %u,\n \"routes\": { ",
bgp->vrf_id == VRF_UNKNOWN ? -1 : (int)bgp->vrf_id, bgp->vrf_id == VRF_UNKNOWN ? -1 : (int)bgp->vrf_id,
bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT
@ -9790,7 +9799,6 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
: bgp->name, : bgp->name,
table->version, inet_ntoa(bgp->router_id), table->version, inet_ntoa(bgp->router_id),
bgp->default_local_pref, bgp->as); bgp->default_local_pref, bgp->as);
*json_header_depth = 2;
if (rd) { if (rd) {
vty_out(vty, " \"routeDistinguishers\" : {"); vty_out(vty, " \"routeDistinguishers\" : {");
++*json_header_depth; ++*json_header_depth;
@ -10071,7 +10079,8 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, safi_t safi,
unsigned long i; unsigned long i;
for (i = 0; i < *json_header_depth; ++i) for (i = 0; i < *json_header_depth; ++i)
vty_out(vty, " } "); vty_out(vty, " } ");
vty_out(vty, "\n"); if (!all)
vty_out(vty, "\n");
} }
} else { } else {
if (is_last) { if (is_last) {
@ -10101,9 +10110,13 @@ int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi,
unsigned long json_header_depth = 0; unsigned long json_header_depth = 0;
struct bgp_table *itable; struct bgp_table *itable;
bool show_msg; bool show_msg;
uint8_t show_flags = 0;
show_msg = (!use_json && type == bgp_show_type_normal); show_msg = (!use_json && type == bgp_show_type_normal);
if (use_json)
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
for (dest = bgp_table_top(table); dest; dest = next) { for (dest = bgp_table_top(table); dest; dest = next) {
const struct prefix *dest_p = bgp_dest_get_prefix(dest); const struct prefix *dest_p = bgp_dest_get_prefix(dest);
@ -10119,8 +10132,9 @@ int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi,
memcpy(&prd, dest_p, sizeof(struct prefix_rd)); memcpy(&prd, dest_p, sizeof(struct prefix_rd));
prefix_rd2str(&prd, rd, sizeof(rd)); prefix_rd2str(&prd, rd, sizeof(rd));
bgp_show_table(vty, bgp, safi, itable, type, output_arg, bgp_show_table(vty, bgp, safi, itable, type, output_arg,
use_json, rd, next == NULL, &output_cum, rd, next == NULL, &output_cum,
&total_cum, &json_header_depth, false); &total_cum, &json_header_depth,
show_flags);
if (next == NULL) if (next == NULL)
show_msg = false; show_msg = false;
} }
@ -10137,11 +10151,12 @@ int bgp_show_table_rd(struct vty *vty, struct bgp *bgp, safi_t safi,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
static int bgp_show(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi, static int bgp_show(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
enum bgp_show_type type, void *output_arg, bool use_json, enum bgp_show_type type, void *output_arg,
bool wide) uint8_t show_flags)
{ {
struct bgp_table *table; struct bgp_table *table;
unsigned long json_header_depth = 0; unsigned long json_header_depth = 0;
bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
if (bgp == NULL) { if (bgp == NULL) {
bgp = bgp_get_default(); bgp = bgp_get_default();
@ -10171,18 +10186,18 @@ static int bgp_show(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
else if (safi == SAFI_LABELED_UNICAST) else if (safi == SAFI_LABELED_UNICAST)
safi = SAFI_UNICAST; safi = SAFI_UNICAST;
return bgp_show_table(vty, bgp, safi, table, type, output_arg, use_json, return bgp_show_table(vty, bgp, safi, table, type, output_arg, NULL, 1,
NULL, 1, NULL, NULL, &json_header_depth, wide); NULL, NULL, &json_header_depth, show_flags);
} }
static void bgp_show_all_instances_routes_vty(struct vty *vty, afi_t afi, static void bgp_show_all_instances_routes_vty(struct vty *vty, afi_t afi,
safi_t safi, bool use_json, safi_t safi, uint8_t show_flags)
bool wide)
{ {
struct listnode *node, *nnode; struct listnode *node, *nnode;
struct bgp *bgp; struct bgp *bgp;
int is_first = 1; int is_first = 1;
bool route_output = false; bool route_output = false;
bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
if (use_json) if (use_json)
vty_out(vty, "{\n"); vty_out(vty, "{\n");
@ -10206,7 +10221,7 @@ static void bgp_show_all_instances_routes_vty(struct vty *vty, afi_t afi,
: bgp->name); : bgp->name);
} }
bgp_show(vty, bgp, afi, safi, bgp_show_type_normal, NULL, bgp_show(vty, bgp, afi, safi, bgp_show_type_normal, NULL,
use_json, wide); show_flags);
} }
if (use_json) if (use_json)
@ -10667,6 +10682,10 @@ static int bgp_show_lcommunity(struct vty *vty, struct bgp *bgp, int argc,
int i; int i;
char *str; char *str;
int first = 0; int first = 0;
uint8_t show_flags = 0;
if (uj)
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
b = buffer_new(1024); b = buffer_new(1024);
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
@ -10694,7 +10713,7 @@ static int bgp_show_lcommunity(struct vty *vty, struct bgp *bgp, int argc,
return bgp_show(vty, bgp, afi, safi, return bgp_show(vty, bgp, afi, safi,
(exact ? bgp_show_type_lcommunity_exact (exact ? bgp_show_type_lcommunity_exact
: bgp_show_type_lcommunity), : bgp_show_type_lcommunity),
lcom, uj, false); lcom, show_flags);
} }
static int bgp_show_lcommunity_list(struct vty *vty, struct bgp *bgp, static int bgp_show_lcommunity_list(struct vty *vty, struct bgp *bgp,
@ -10702,6 +10721,11 @@ static int bgp_show_lcommunity_list(struct vty *vty, struct bgp *bgp,
safi_t safi, bool uj) safi_t safi, bool uj)
{ {
struct community_list *list; struct community_list *list;
uint8_t show_flags = 0;
if (uj)
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
list = community_list_lookup(bgp_clist, lcom, 0, list = community_list_lookup(bgp_clist, lcom, 0,
LARGE_COMMUNITY_LIST_MASTER); LARGE_COMMUNITY_LIST_MASTER);
@ -10714,7 +10738,7 @@ static int bgp_show_lcommunity_list(struct vty *vty, struct bgp *bgp,
return bgp_show(vty, bgp, afi, safi, return bgp_show(vty, bgp, afi, safi,
(exact ? bgp_show_type_lcommunity_list_exact (exact ? bgp_show_type_lcommunity_list_exact
: bgp_show_type_lcommunity_list), : bgp_show_type_lcommunity_list),
list, uj, false); list, show_flags);
} }
DEFUN (show_ip_bgp_large_community_list, DEFUN (show_ip_bgp_large_community_list,
@ -10777,14 +10801,17 @@ DEFUN (show_ip_bgp_large_community,
bool exact_match = 0; bool exact_match = 0;
struct bgp *bgp = NULL; struct bgp *bgp = NULL;
bool uj = use_json(argc, argv); bool uj = use_json(argc, argv);
uint8_t show_flags = 0;
if (uj) if (uj) {
argc--; argc--;
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
}
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
&bgp, uj); &bgp, uj);
if (!idx) if (!idx)
return CMD_WARNING; return CMD_WARNING;
if (argv_find(argv, argc, "AA:BB:CC", &idx)) { if (argv_find(argv, argc, "AA:BB:CC", &idx)) {
if (argv_find(argv, argc, "exact-match", &idx)) if (argv_find(argv, argc, "exact-match", &idx))
@ -10793,7 +10820,7 @@ DEFUN (show_ip_bgp_large_community,
exact_match, afi, safi, uj); exact_match, afi, safi, uj);
} else } else
return bgp_show(vty, bgp, afi, safi, return bgp_show(vty, bgp, afi, safi,
bgp_show_type_lcommunity_all, NULL, uj, false); bgp_show_type_lcommunity_all, NULL, show_flags);
} }
static int bgp_table_stats_single(struct vty *vty, struct bgp *bgp, afi_t afi, static int bgp_table_stats_single(struct vty *vty, struct bgp *bgp, afi_t afi,
@ -10940,11 +10967,11 @@ DEFUN(show_ip_bgp_afi_safi_statistics, show_ip_bgp_afi_safi_statistics_cmd,
} }
/* BGP route print out function without JSON */ /* BGP route print out function without JSON */
DEFUN(show_ip_bgp, show_ip_bgp_cmd, DEFPY(show_ip_bgp, show_ip_bgp_cmd,
"show [ip] bgp [<view|vrf> VIEWVRFNAME] [" BGP_AFI_CMD_STR "show [ip] bgp [<view|vrf> VIEWVRFNAME] [" BGP_AFI_CMD_STR
" [" BGP_SAFI_WITH_LABEL_CMD_STR " [" BGP_SAFI_WITH_LABEL_CMD_STR
"]]\ "]]\
<dampening <parameters>\ <[all$all] dampening <parameters>\
|route-map WORD\ |route-map WORD\
|prefix-list WORD\ |prefix-list WORD\
|filter-list WORD\ |filter-list WORD\
@ -10954,6 +10981,7 @@ DEFUN(show_ip_bgp, show_ip_bgp_cmd,
>", >",
SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
BGP_SAFI_WITH_LABEL_HELP_STR BGP_SAFI_WITH_LABEL_HELP_STR
"Display the entries for all address families\n"
"Display detailed information about dampening\n" "Display detailed information about dampening\n"
"Display detail of configured dampening parameters\n" "Display detail of configured dampening parameters\n"
"Display routes matching the route-map\n" "Display routes matching the route-map\n"
@ -10976,6 +11004,17 @@ DEFUN(show_ip_bgp, show_ip_bgp_cmd,
int exact_match = 0; int exact_match = 0;
struct bgp *bgp = NULL; struct bgp *bgp = NULL;
int idx = 0; int idx = 0;
uint8_t show_flags = 0;
/* [<ipv4|ipv6> [all]] */
if (all) {
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_ALL);
if (argv_find(argv, argc, "ipv4", &idx))
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP);
if (argv_find(argv, argc, "ipv6", &idx))
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP6);
}
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
&bgp, false); &bgp, false);
@ -10984,7 +11023,8 @@ DEFUN(show_ip_bgp, show_ip_bgp_cmd,
if (argv_find(argv, argc, "dampening", &idx)) { if (argv_find(argv, argc, "dampening", &idx)) {
if (argv_find(argv, argc, "parameters", &idx)) if (argv_find(argv, argc, "parameters", &idx))
return bgp_show_dampening_parameters(vty, afi, safi); return bgp_show_dampening_parameters(vty, afi, safi,
show_flags);
} }
if (argv_find(argv, argc, "prefix-list", &idx)) if (argv_find(argv, argc, "prefix-list", &idx))
@ -11020,6 +11060,7 @@ DEFUN(show_ip_bgp, show_ip_bgp_cmd,
DEFPY (show_ip_bgp_json, DEFPY (show_ip_bgp_json,
show_ip_bgp_json_cmd, show_ip_bgp_json_cmd,
"show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]]\ "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]]\
[all$all]\
[cidr-only\ [cidr-only\
|dampening <flap-statistics|dampened-paths>\ |dampening <flap-statistics|dampened-paths>\
|community [AA:NN|local-AS|no-advertise|no-export\ |community [AA:NN|local-AS|no-advertise|no-export\
@ -11034,6 +11075,7 @@ DEFPY (show_ip_bgp_json,
BGP_INSTANCE_HELP_STR BGP_INSTANCE_HELP_STR
BGP_AFI_HELP_STR BGP_AFI_HELP_STR
BGP_SAFI_WITH_LABEL_HELP_STR BGP_SAFI_WITH_LABEL_HELP_STR
"Display the entries for all address families\n"
"Display only routes with non-natural netmasks\n" "Display only routes with non-natural netmasks\n"
"Display detailed information about dampening\n" "Display detailed information about dampening\n"
"Display flap statistics of routes\n" "Display flap statistics of routes\n"
@ -11064,9 +11106,29 @@ DEFPY (show_ip_bgp_json,
struct bgp *bgp = NULL; struct bgp *bgp = NULL;
int idx = 0; int idx = 0;
int exact_match = 0; int exact_match = 0;
char *community = NULL;
bool first = true;
uint8_t show_flags = 0;
if (uj)
if (uj) {
argc--; argc--;
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
}
/* [<ipv4|ipv6> [all]] */
if (all) {
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_ALL);
if (argv_find(argv, argc, "ipv4", &idx))
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP);
if (argv_find(argv, argc, "ipv6", &idx))
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP6);
}
if (wide)
SET_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
&bgp, uj); &bgp, uj);
@ -11074,23 +11136,17 @@ DEFPY (show_ip_bgp_json,
return CMD_WARNING; return CMD_WARNING;
if (argv_find(argv, argc, "cidr-only", &idx)) if (argv_find(argv, argc, "cidr-only", &idx))
return bgp_show(vty, bgp, afi, safi, bgp_show_type_cidr_only, sh_type = bgp_show_type_cidr_only;
NULL, uj, wide);
if (argv_find(argv, argc, "dampening", &idx)) { if (argv_find(argv, argc, "dampening", &idx)) {
if (argv_find(argv, argc, "dampened-paths", &idx)) if (argv_find(argv, argc, "dampened-paths", &idx))
return bgp_show(vty, bgp, afi, safi, sh_type = bgp_show_type_dampend_paths;
bgp_show_type_dampend_paths, NULL, uj,
wide);
else if (argv_find(argv, argc, "flap-statistics", &idx)) else if (argv_find(argv, argc, "flap-statistics", &idx))
return bgp_show(vty, bgp, afi, safi, sh_type = bgp_show_type_flap_statistics;
bgp_show_type_flap_statistics, NULL, uj,
wide);
} }
if (argv_find(argv, argc, "community", &idx)) { if (argv_find(argv, argc, "community", &idx)) {
char *maybecomm = NULL; char *maybecomm = NULL;
char *community = NULL;
if (idx + 1 < argc) { if (idx + 1 < argc) {
if (argv[idx + 1]->type == VARIABLE_TKN) if (argv[idx + 1]->type == VARIABLE_TKN)
@ -11106,16 +11162,103 @@ DEFPY (show_ip_bgp_json,
if (argv_find(argv, argc, "exact-match", &idx)) if (argv_find(argv, argc, "exact-match", &idx))
exact_match = 1; exact_match = 1;
if (community) if (!community)
return bgp_show_community(vty, bgp, community, sh_type = bgp_show_type_community_all;
exact_match, afi, safi, uj);
else
return (bgp_show(vty, bgp, afi, safi,
bgp_show_type_community_all, NULL, uj,
wide));
} }
return bgp_show(vty, bgp, afi, safi, sh_type, NULL, uj, wide); if (!all) {
/* show bgp: AFI_IP6, show ip bgp: AFI_IP */
if (community)
return bgp_show_community(vty, bgp, community,
exact_match, afi, safi,
show_flags);
else
return bgp_show(vty, bgp, afi, safi, sh_type, NULL,
show_flags);
} else {
/* show <ip> bgp ipv4 all: AFI_IP, show <ip> bgp ipv6 all:
* AFI_IP6 */
if (uj)
vty_out(vty, "{\n");
if (CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP)
|| CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP6)) {
afi = CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP)
? AFI_IP
: AFI_IP6;
FOREACH_SAFI (safi) {
if (strmatch(get_afi_safi_str(afi, safi, true),
"Unknown"))
continue;
if (!bgp_afi_safi_peer_exists(bgp, afi, safi))
continue;
if (uj) {
if (first)
first = false;
else
vty_out(vty, ",\n");
vty_out(vty, "\"%s\":{\n",
get_afi_safi_str(afi, safi,
true));
} else
vty_out(vty,
"\nFor address family: %s\n",
get_afi_safi_str(afi, safi,
false));
if (community)
bgp_show_community(vty, bgp, community,
exact_match, afi,
safi, show_flags);
else
bgp_show(vty, bgp, afi, safi, sh_type,
NULL, show_flags);
if (uj)
vty_out(vty, "}\n");
}
} else {
/* show <ip> bgp all: for each AFI and SAFI*/
FOREACH_AFI_SAFI (afi, safi) {
if (strmatch(get_afi_safi_str(afi, safi, true),
"Unknown"))
continue;
if (!bgp_afi_safi_peer_exists(bgp, afi, safi))
continue;
if (uj) {
if (first)
first = false;
else
vty_out(vty, ",\n");
vty_out(vty, "\"%s\":{\n",
get_afi_safi_str(afi, safi,
true));
} else
vty_out(vty,
"\nFor address family: %s\n",
get_afi_safi_str(afi, safi,
false));
if (community)
bgp_show_community(vty, bgp, community,
exact_match, afi,
safi, show_flags);
else
bgp_show(vty, bgp, afi, safi, sh_type,
NULL, show_flags);
if (uj)
vty_out(vty, "}\n");
}
}
if (uj)
vty_out(vty, "}\n");
}
return CMD_SUCCESS;
} }
DEFUN (show_ip_bgp_route, DEFUN (show_ip_bgp_route,
@ -11242,16 +11385,22 @@ DEFPY (show_ip_bgp_instance_all,
safi_t safi = SAFI_UNICAST; safi_t safi = SAFI_UNICAST;
struct bgp *bgp = NULL; struct bgp *bgp = NULL;
int idx = 0; int idx = 0;
uint8_t show_flags = 0;
if (uj) if (uj) {
argc--; argc--;
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
}
if (wide)
SET_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
&bgp, uj); &bgp, uj);
if (!idx) if (!idx)
return CMD_WARNING; return CMD_WARNING;
bgp_show_all_instances_routes_vty(vty, afi, safi, uj, wide); bgp_show_all_instances_routes_vty(vty, afi, safi, show_flags);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -11261,6 +11410,10 @@ static int bgp_show_regexp(struct vty *vty, struct bgp *bgp, const char *regstr,
{ {
regex_t *regex; regex_t *regex;
int rc; int rc;
uint8_t show_flags = 0;
if (use_json)
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
if (!config_bgp_aspath_validate(regstr)) { if (!config_bgp_aspath_validate(regstr)) {
vty_out(vty, "Invalid character in REGEX %s\n", vty_out(vty, "Invalid character in REGEX %s\n",
@ -11274,7 +11427,7 @@ static int bgp_show_regexp(struct vty *vty, struct bgp *bgp, const char *regstr,
return CMD_WARNING; return CMD_WARNING;
} }
rc = bgp_show(vty, bgp, afi, safi, type, regex, use_json, false); rc = bgp_show(vty, bgp, afi, safi, type, regex, show_flags);
bgp_regex_free(regex); bgp_regex_free(regex);
return rc; return rc;
} }
@ -11284,6 +11437,7 @@ static int bgp_show_prefix_list(struct vty *vty, struct bgp *bgp,
safi_t safi, enum bgp_show_type type) safi_t safi, enum bgp_show_type type)
{ {
struct prefix_list *plist; struct prefix_list *plist;
uint8_t show_flags = 0;
plist = prefix_list_lookup(afi, prefix_list_str); plist = prefix_list_lookup(afi, prefix_list_str);
if (plist == NULL) { if (plist == NULL) {
@ -11292,7 +11446,7 @@ static int bgp_show_prefix_list(struct vty *vty, struct bgp *bgp,
return CMD_WARNING; return CMD_WARNING;
} }
return bgp_show(vty, bgp, afi, safi, type, plist, 0, false); return bgp_show(vty, bgp, afi, safi, type, plist, show_flags);
} }
static int bgp_show_filter_list(struct vty *vty, struct bgp *bgp, static int bgp_show_filter_list(struct vty *vty, struct bgp *bgp,
@ -11300,6 +11454,7 @@ static int bgp_show_filter_list(struct vty *vty, struct bgp *bgp,
enum bgp_show_type type) enum bgp_show_type type)
{ {
struct as_list *as_list; struct as_list *as_list;
uint8_t show_flags = 0;
as_list = as_list_lookup(filter); as_list = as_list_lookup(filter);
if (as_list == NULL) { if (as_list == NULL) {
@ -11308,7 +11463,7 @@ static int bgp_show_filter_list(struct vty *vty, struct bgp *bgp,
return CMD_WARNING; return CMD_WARNING;
} }
return bgp_show(vty, bgp, afi, safi, type, as_list, 0, false); return bgp_show(vty, bgp, afi, safi, type, as_list, show_flags);
} }
static int bgp_show_route_map(struct vty *vty, struct bgp *bgp, static int bgp_show_route_map(struct vty *vty, struct bgp *bgp,
@ -11316,6 +11471,7 @@ static int bgp_show_route_map(struct vty *vty, struct bgp *bgp,
enum bgp_show_type type) enum bgp_show_type type)
{ {
struct route_map *rmap; struct route_map *rmap;
uint8_t show_flags = 0;
rmap = route_map_lookup_by_name(rmap_str); rmap = route_map_lookup_by_name(rmap_str);
if (!rmap) { if (!rmap) {
@ -11323,12 +11479,12 @@ static int bgp_show_route_map(struct vty *vty, struct bgp *bgp,
return CMD_WARNING; return CMD_WARNING;
} }
return bgp_show(vty, bgp, afi, safi, type, rmap, 0, false); return bgp_show(vty, bgp, afi, safi, type, rmap, show_flags);
} }
static int bgp_show_community(struct vty *vty, struct bgp *bgp, static int bgp_show_community(struct vty *vty, struct bgp *bgp,
const char *comstr, int exact, afi_t afi, const char *comstr, int exact, afi_t afi,
safi_t safi, bool use_json) safi_t safi, uint8_t show_flags)
{ {
struct community *com; struct community *com;
int ret = 0; int ret = 0;
@ -11342,7 +11498,7 @@ static int bgp_show_community(struct vty *vty, struct bgp *bgp,
ret = bgp_show(vty, bgp, afi, safi, ret = bgp_show(vty, bgp, afi, safi,
(exact ? bgp_show_type_community_exact (exact ? bgp_show_type_community_exact
: bgp_show_type_community), : bgp_show_type_community),
com, use_json, false); com, show_flags);
community_free(&com); community_free(&com);
return ret; return ret;
@ -11353,6 +11509,7 @@ static int bgp_show_community_list(struct vty *vty, struct bgp *bgp,
safi_t safi) safi_t safi)
{ {
struct community_list *list; struct community_list *list;
uint8_t show_flags = 0;
list = community_list_lookup(bgp_clist, com, 0, COMMUNITY_LIST_MASTER); list = community_list_lookup(bgp_clist, com, 0, COMMUNITY_LIST_MASTER);
if (list == NULL) { if (list == NULL) {
@ -11363,7 +11520,7 @@ static int bgp_show_community_list(struct vty *vty, struct bgp *bgp,
return bgp_show(vty, bgp, afi, safi, return bgp_show(vty, bgp, afi, safi,
(exact ? bgp_show_type_community_list_exact (exact ? bgp_show_type_community_list_exact
: bgp_show_type_community_list), : bgp_show_type_community_list),
list, 0, false); list, show_flags);
} }
static int bgp_show_prefix_longer(struct vty *vty, struct bgp *bgp, static int bgp_show_prefix_longer(struct vty *vty, struct bgp *bgp,
@ -11372,6 +11529,7 @@ static int bgp_show_prefix_longer(struct vty *vty, struct bgp *bgp,
{ {
int ret; int ret;
struct prefix *p; struct prefix *p;
uint8_t show_flags = 0;
p = prefix_new(); p = prefix_new();
@ -11381,7 +11539,7 @@ static int bgp_show_prefix_longer(struct vty *vty, struct bgp *bgp,
return CMD_WARNING; return CMD_WARNING;
} }
ret = bgp_show(vty, bgp, afi, safi, type, p, 0, false); ret = bgp_show(vty, bgp, afi, safi, type, p, show_flags);
prefix_free(&p); prefix_free(&p);
return ret; return ret;
} }
@ -12195,8 +12353,8 @@ static void show_adj_route_header(struct vty *vty, struct bgp *bgp,
static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi, static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi,
safi_t safi, enum bgp_show_adj_route_type type, safi_t safi, enum bgp_show_adj_route_type type,
const char *rmap_name, bool use_json, const char *rmap_name, json_object *json,
json_object *json, bool wide) uint8_t show_flags)
{ {
struct bgp_table *table; struct bgp_table *table;
struct bgp_adj_in *ain; struct bgp_adj_in *ain;
@ -12215,6 +12373,8 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi,
json_object *json_ar = NULL; json_object *json_ar = NULL;
struct peer_af *paf; struct peer_af *paf;
bool route_filtered; bool route_filtered;
bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
bool wide = CHECK_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
if (use_json) { if (use_json) {
json_scode = json_object_new_object(); json_scode = json_object_new_object();
@ -12423,9 +12583,10 @@ static void show_adj_route(struct vty *vty, struct peer *peer, afi_t afi,
static int peer_adj_routes(struct vty *vty, struct peer *peer, afi_t afi, static int peer_adj_routes(struct vty *vty, struct peer *peer, afi_t afi,
safi_t safi, enum bgp_show_adj_route_type type, safi_t safi, enum bgp_show_adj_route_type type,
const char *rmap_name, bool use_json, bool wide) const char *rmap_name, uint8_t show_flags)
{ {
json_object *json = NULL; json_object *json = NULL;
bool use_json = CHECK_FLAG(show_flags, BGP_SHOW_OPT_JSON);
if (use_json) if (use_json)
json = json_object_new_object(); json = json_object_new_object();
@ -12460,8 +12621,7 @@ static int peer_adj_routes(struct vty *vty, struct peer *peer, afi_t afi,
return CMD_WARNING; return CMD_WARNING;
} }
show_adj_route(vty, peer, afi, safi, type, rmap_name, use_json, json, show_adj_route(vty, peer, afi, safi, type, rmap_name, json, show_flags);
wide);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -12491,6 +12651,13 @@ DEFPY (show_ip_bgp_instance_neighbor_bestpath_route,
struct peer *peer; struct peer *peer;
enum bgp_show_adj_route_type type = bgp_show_adj_route_bestpath; enum bgp_show_adj_route_type type = bgp_show_adj_route_bestpath;
int idx = 0; int idx = 0;
uint8_t show_flags = 0;
if (uj)
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
if (wide)
SET_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
&bgp, uj); &bgp, uj);
@ -12505,18 +12672,20 @@ DEFPY (show_ip_bgp_instance_neighbor_bestpath_route,
if (!peer) if (!peer)
return CMD_WARNING; return CMD_WARNING;
return peer_adj_routes(vty, peer, afi, safi, type, rmap_name, uj, wide); return peer_adj_routes(vty, peer, afi, safi, type, rmap_name,
show_flags);
} }
DEFPY (show_ip_bgp_instance_neighbor_advertised_route, DEFPY (show_ip_bgp_instance_neighbor_advertised_route,
show_ip_bgp_instance_neighbor_advertised_route_cmd, show_ip_bgp_instance_neighbor_advertised_route_cmd,
"show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] neighbors <A.B.C.D|X:X::X:X|WORD> <advertised-routes|received-routes|filtered-routes> [route-map WORD] [json$uj | wide$wide]", "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] [all$all] neighbors <A.B.C.D|X:X::X:X|WORD> <advertised-routes|received-routes|filtered-routes> [route-map WORD] [json$uj | wide$wide]",
SHOW_STR SHOW_STR
IP_STR IP_STR
BGP_STR BGP_STR
BGP_INSTANCE_HELP_STR BGP_INSTANCE_HELP_STR
BGP_AFI_HELP_STR BGP_AFI_HELP_STR
BGP_SAFI_WITH_LABEL_HELP_STR BGP_SAFI_WITH_LABEL_HELP_STR
"Display the entries for all address families\n"
"Detailed information on TCP and BGP neighbor connections\n" "Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n" "Neighbor to display information about\n"
"Neighbor to display information about\n" "Neighbor to display information about\n"
@ -12537,9 +12706,25 @@ DEFPY (show_ip_bgp_instance_neighbor_advertised_route,
struct peer *peer; struct peer *peer;
enum bgp_show_adj_route_type type = bgp_show_adj_route_advertised; enum bgp_show_adj_route_type type = bgp_show_adj_route_advertised;
int idx = 0; int idx = 0;
bool first = true;
uint8_t show_flags = 0;
if (uj) if (uj) {
argc--; argc--;
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
}
if (all) {
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_ALL);
if (argv_find(argv, argc, "ipv4", &idx))
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP);
if (argv_find(argv, argc, "ipv6", &idx))
SET_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP6);
}
if (wide)
SET_FLAG(show_flags, BGP_SHOW_OPT_WIDE);
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
&bgp, uj); &bgp, uj);
@ -12564,7 +12749,66 @@ DEFPY (show_ip_bgp_instance_neighbor_advertised_route,
if (argv_find(argv, argc, "route-map", &idx)) if (argv_find(argv, argc, "route-map", &idx))
rmap_name = argv[++idx]->arg; rmap_name = argv[++idx]->arg;
return peer_adj_routes(vty, peer, afi, safi, type, rmap_name, uj, wide); if (!all)
return peer_adj_routes(vty, peer, afi, safi, type, rmap_name,
show_flags);
if (uj)
vty_out(vty, "{\n");
if (CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP)
|| CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP6)) {
afi = CHECK_FLAG(show_flags, BGP_SHOW_OPT_AFI_IP) ? AFI_IP
: AFI_IP6;
FOREACH_SAFI (safi) {
if (strmatch(get_afi_safi_str(afi, safi, true),
"Unknown"))
continue;
if (!bgp_afi_safi_peer_exists(bgp, afi, safi))
continue;
if (uj) {
if (first)
first = false;
else
vty_out(vty, ",\n");
vty_out(vty, "\"%s\":",
get_afi_safi_str(afi, safi, true));
} else
vty_out(vty, "\nFor address family: %s\n",
get_afi_safi_str(afi, safi, false));
peer_adj_routes(vty, peer, afi, safi, type, rmap_name,
show_flags);
}
} else {
FOREACH_AFI_SAFI (afi, safi) {
if (strmatch(get_afi_safi_str(afi, safi, true),
"Unknown"))
continue;
if (!bgp_afi_safi_peer_exists(bgp, afi, safi))
continue;
if (uj) {
if (first)
first = false;
else
vty_out(vty, ",\n");
vty_out(vty, "\"%s\":",
get_afi_safi_str(afi, safi, true));
} else
vty_out(vty, "\nFor address family: %s\n",
get_afi_safi_str(afi, safi, false));
peer_adj_routes(vty, peer, afi, safi, type, rmap_name,
show_flags);
}
}
if (uj)
vty_out(vty, "}\n");
return CMD_SUCCESS;
} }
DEFUN (show_ip_bgp_neighbor_received_prefix_filter, DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
@ -12653,6 +12897,11 @@ static int bgp_show_neighbor_route(struct vty *vty, struct peer *peer,
afi_t afi, safi_t safi, afi_t afi, safi_t safi,
enum bgp_show_type type, bool use_json) enum bgp_show_type type, bool use_json)
{ {
uint8_t show_flags = 0;
if (use_json)
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
/* labeled-unicast routes live in the unicast table */ /* labeled-unicast routes live in the unicast table */
if (safi == SAFI_LABELED_UNICAST) if (safi == SAFI_LABELED_UNICAST)
safi = SAFI_UNICAST; safi = SAFI_UNICAST;
@ -12672,8 +12921,7 @@ static int bgp_show_neighbor_route(struct vty *vty, struct peer *peer,
return CMD_WARNING; return CMD_WARNING;
} }
return bgp_show(vty, peer->bgp, afi, safi, type, &peer->su, use_json, return bgp_show(vty, peer->bgp, afi, safi, type, &peer->su, show_flags);
false);
} }
DEFUN (show_ip_bgp_flowspec_routes_detailed, DEFUN (show_ip_bgp_flowspec_routes_detailed,
@ -12693,17 +12941,20 @@ DEFUN (show_ip_bgp_flowspec_routes_detailed,
struct bgp *bgp = NULL; struct bgp *bgp = NULL;
int idx = 0; int idx = 0;
bool uj = use_json(argc, argv); bool uj = use_json(argc, argv);
uint8_t show_flags = 0;
if (uj) if (uj) {
argc--; argc--;
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
}
bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi, bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
&bgp, uj); &bgp, uj);
if (!idx) if (!idx)
return CMD_WARNING; return CMD_WARNING;
return bgp_show(vty, bgp, afi, safi, bgp_show_type_detail, NULL, uj, return bgp_show(vty, bgp, afi, safi, bgp_show_type_detail, NULL,
false); show_flags);
} }
DEFUN (show_ip_bgp_neighbor_routes, DEFUN (show_ip_bgp_neighbor_routes,

View File

@ -498,6 +498,13 @@ DECLARE_HOOK(bgp_process,
struct peer *peer, bool withdraw), struct peer *peer, bool withdraw),
(bgp, afi, safi, bn, peer, withdraw)) (bgp, afi, safi, bn, peer, withdraw))
/* BGP show options */
#define BGP_SHOW_OPT_JSON (1 << 0)
#define BGP_SHOW_OPT_WIDE (1 << 1)
#define BGP_SHOW_OPT_AFI_ALL (1 << 2)
#define BGP_SHOW_OPT_AFI_IP (1 << 3)
#define BGP_SHOW_OPT_AFI_IP6 (1 << 4)
/* Prototypes. */ /* Prototypes. */
extern void bgp_rib_remove(struct bgp_dest *dest, struct bgp_path_info *pi, extern void bgp_rib_remove(struct bgp_dest *dest, struct bgp_path_info *pi,
struct peer *peer, afi_t afi, safi_t safi); struct peer *peer, afi_t afi, safi_t safi);

View File

@ -9867,15 +9867,16 @@ int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
} }
/* `show [ip] bgp summary' commands. */ /* `show [ip] bgp summary' commands. */
DEFUN (show_ip_bgp_summary, DEFPY (show_ip_bgp_summary,
show_ip_bgp_summary_cmd, show_ip_bgp_summary_cmd,
"show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [established|failed] [json]", "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] [all$all] summary [established|failed] [json$uj]",
SHOW_STR SHOW_STR
IP_STR IP_STR
BGP_STR BGP_STR
BGP_INSTANCE_HELP_STR BGP_INSTANCE_HELP_STR
BGP_AFI_HELP_STR BGP_AFI_HELP_STR
BGP_SAFI_WITH_LABEL_HELP_STR BGP_SAFI_WITH_LABEL_HELP_STR
"Display the entries for all address families\n"
"Summary of BGP neighbor status\n" "Summary of BGP neighbor status\n"
"Show only sessions in Established state\n" "Show only sessions in Established state\n"
"Show only sessions not in Established state\n" "Show only sessions not in Established state\n"
@ -9890,7 +9891,7 @@ DEFUN (show_ip_bgp_summary,
int idx = 0; int idx = 0;
/* show [ip] bgp */ /* show [ip] bgp */
if (argv_find(argv, argc, "ip", &idx)) if (!all && argv_find(argv, argc, "ip", &idx))
afi = AFI_IP; afi = AFI_IP;
/* [<vrf> VIEWVRFNAME] */ /* [<vrf> VIEWVRFNAME] */
if (argv_find(argv, argc, "vrf", &idx)) { if (argv_find(argv, argc, "vrf", &idx)) {
@ -9910,8 +9911,6 @@ DEFUN (show_ip_bgp_summary,
if (argv_find(argv, argc, "established", &idx)) if (argv_find(argv, argc, "established", &idx))
show_established = true; show_established = true;
bool uj = use_json(argc, argv);
return bgp_show_summary_vty(vty, vrf, afi, safi, show_failed, return bgp_show_summary_vty(vty, vrf, afi, safi, show_failed,
show_established, uj); show_established, uj);
} }

View File

@ -2721,17 +2721,17 @@ daemon project, while :clicmd:`show bgp` command is the new format. The choice
has been done to keep old format with IPv4 routing table, while new format has been done to keep old format with IPv4 routing table, while new format
displays IPv6 routing table. displays IPv6 routing table.
.. index:: show ip bgp [wide] .. index:: show ip bgp [all] [wide|json]
.. clicmd:: show ip bgp [wide] .. clicmd:: show ip bgp [all] [wide|json]
.. index:: show ip bgp A.B.C.D [wide] .. index:: show ip bgp A.B.C.D [json]
.. clicmd:: show ip bgp A.B.C.D [wide] .. clicmd:: show ip bgp A.B.C.D [json]
.. index:: show bgp [wide] .. index:: show bgp [all] [wide|json]
.. clicmd:: show bgp [wide] .. clicmd:: show bgp [all] [wide|json]
.. index:: show bgp X:X::X:X [wide] .. index:: show bgp X:X::X:X [json]
.. clicmd:: show bgp X:X::X:X [wide] .. clicmd:: show bgp X:X::X:X [json]
These commands display BGP routes. When no route is specified, the default These commands display BGP routes. When no route is specified, the default
is to display all BGP routes. is to display all BGP routes.
@ -2753,6 +2753,11 @@ displays IPv6 routing table.
This is especially handy dealing with IPv6 prefixes and This is especially handy dealing with IPv6 prefixes and
if :clicmd:`[no] bgp default show-nexthop-hostname` is enabled. if :clicmd:`[no] bgp default show-nexthop-hostname` is enabled.
If _all_ option is specified, _ip_ keyword is ignored, show bgp all and
show ip bgp all commands display routes for all AFIs and SAFIs.
If _json_ option is specified, output is displayed in JSON format.
Some other commands provide additional options for filtering the output. Some other commands provide additional options for filtering the output.
.. index:: show [ip] bgp regexp LINE .. index:: show [ip] bgp regexp LINE
@ -2761,8 +2766,8 @@ Some other commands provide additional options for filtering the output.
This command displays BGP routes using AS path regular expression This command displays BGP routes using AS path regular expression
(:ref:`bgp-regular-expressions`). (:ref:`bgp-regular-expressions`).
.. index:: show [ip] bgp summary .. index:: show [ip] bgp [all] summary [json]
.. clicmd:: show [ip] bgp summary .. clicmd:: show [ip] bgp [all] summary [json]
Show a bgp peer summary for the specified address family. Show a bgp peer summary for the specified address family.
@ -2771,8 +2776,8 @@ and should no longer be used. In order to reach the other BGP routing tables
other than the IPv6 routing table given by :clicmd:`show bgp`, the new command other than the IPv6 routing table given by :clicmd:`show bgp`, the new command
structure is extended with :clicmd:`show bgp [afi] [safi]`. structure is extended with :clicmd:`show bgp [afi] [safi]`.
.. index:: show bgp [afi] [safi] .. index:: show bgp [afi] [safi] [all] [wide|json]
.. clicmd:: show bgp [afi] [safi] .. clicmd:: show bgp [afi] [safi] [all] [wide|json]
.. index:: show bgp <ipv4|ipv6> <unicast|multicast|vpn|labeled-unicast> .. index:: show bgp <ipv4|ipv6> <unicast|multicast|vpn|labeled-unicast>
.. clicmd:: show bgp <ipv4|ipv6> <unicast|multicast|vpn|labeled-unicast> .. clicmd:: show bgp <ipv4|ipv6> <unicast|multicast|vpn|labeled-unicast>
@ -2788,20 +2793,20 @@ structure is extended with :clicmd:`show bgp [afi] [safi]`.
Additionally, you can also filter this output by route type. Additionally, you can also filter this output by route type.
.. index:: show bgp [afi] [safi] summary .. index:: show bgp [afi] [safi] [all] summary [json]
.. clicmd:: show bgp [afi] [safi] summary .. clicmd:: show bgp [afi] [safi] [all] summary [json]
Show a bgp peer summary for the specified address family, and subsequent Show a bgp peer summary for the specified address family, and subsequent
address-family. address-family.
.. index:: show bgp [afi] [safi] summary failed [json] .. index:: show bgp [afi] [safi] [all] summary failed [json]
.. clicmd:: show bgp [afi] [safi] summary failed [json] .. clicmd:: show bgp [afi] [safi] [all] summary failed [json]
Show a bgp peer summary for peers that are not succesfully exchanging routes Show a bgp peer summary for peers that are not succesfully exchanging routes
for the specified address family, and subsequent address-family. for the specified address family, and subsequent address-family.
.. index:: show bgp [afi] [safi] summary established [json] .. index:: show bgp [afi] [safi] [all] summary established [json]
.. clicmd:: show bgp [afi] [safi] summary established [json] .. clicmd:: show bgp [afi] [safi] [all] summary established [json]
Show a bgp peer summary for peers that are succesfully exchanging routes Show a bgp peer summary for peers that are succesfully exchanging routes
for the specified address family, and subsequent address-family. for the specified address family, and subsequent address-family.
@ -2812,14 +2817,14 @@ structure is extended with :clicmd:`show bgp [afi] [safi]`.
This command shows information on a specific BGP peer of the relevant This command shows information on a specific BGP peer of the relevant
afi and safi selected. afi and safi selected.
.. index:: show bgp [afi] [safi] dampening dampened-paths .. index:: show bgp [afi] [safi] [all] dampening dampened-paths [wide|json]
.. clicmd:: show bgp [afi] [safi] dampening dampened-paths .. clicmd:: show bgp [afi] [safi] [all] dampening dampened-paths [wide|json]
Display paths suppressed due to dampening of the selected afi and safi Display paths suppressed due to dampening of the selected afi and safi
selected. selected.
.. index:: show bgp [afi] [safi] dampening flap-statistics .. index:: show bgp [afi] [safi] [all] dampening flap-statistics [wide|json]
.. clicmd:: show bgp [afi] [safi] dampening flap-statistics .. clicmd:: show bgp [afi] [safi] [all] dampening flap-statistics [wide|json]
Display flap statistics of routes of the selected afi and safi selected. Display flap statistics of routes of the selected afi and safi selected.
@ -2833,6 +2838,31 @@ structure is extended with :clicmd:`show bgp [afi] [safi]`.
Display statistics of routes of all the afi and safi. Display statistics of routes of all the afi and safi.
.. index:: show [ip] bgp [afi] [safi] [all] cidr-only [wide|json]
.. clicmd:: show [ip] bgp [afi] [safi] [all] cidr-only [wide|json]
Display routes with non-natural netmasks.
.. index:: show [ip] bgp [afi] [safi] [all] neighbors A.B.C.D [advertised-routes|received-routes|filtered-routes] [json|wide]
.. clicmd:: show [ip] bgp [afi] [safi] [all] neighbors A.B.C.D [advertised-routes|received-routes|filtered-routes] [json|wide]
Display the routes advertised to a BGP neighbor or received routes
from neighbor or filtered routes received from neighbor based on the
option specified.
If _wide_ option is specified, then the prefix table's width is increased
to fully display the prefix and the nexthop.
This is especially handy dealing with IPv6 prefixes and
if :clicmd:`[no] bgp default show-nexthop-hostname` is enabled.
If _all_ option is specified, _ip_ keyword is ignored and,
routes displayed for all AFIs and SAFIs.
if afi is specified, with _all_ option, routes will be displayed for
each SAFI in the selcted AFI
If _json_ option is specified, output is displayed in JSON format.
.. _bgp-display-routes-by-community: .. _bgp-display-routes-by-community:
Displaying Routes by Community Attribute Displaying Routes by Community Attribute
@ -2841,14 +2871,14 @@ Displaying Routes by Community Attribute
The following commands allow displaying routes based on their community The following commands allow displaying routes based on their community
attribute. attribute.
.. index:: show [ip] bgp <ipv4|ipv6> community .. index:: show [ip] bgp <ipv4|ipv6> [all] community [wide|json]
.. clicmd:: show [ip] bgp <ipv4|ipv6> community .. clicmd:: show [ip] bgp <ipv4|ipv6> [all] community [wide|json]
.. index:: show [ip] bgp <ipv4|ipv6> community COMMUNITY .. index:: show [ip] bgp <ipv4|ipv6> [all] community COMMUNITY [wide|json]
.. clicmd:: show [ip] bgp <ipv4|ipv6> community COMMUNITY .. clicmd:: show [ip] bgp <ipv4|ipv6> [all] community COMMUNITY [wide|json]
.. index:: show [ip] bgp <ipv4|ipv6> community COMMUNITY exact-match .. index:: show [ip] bgp <ipv4|ipv6> [all] community COMMUNITY exact-match [wide|json]
.. clicmd:: show [ip] bgp <ipv4|ipv6> community COMMUNITY exact-match .. clicmd:: show [ip] bgp <ipv4|ipv6> [all] community COMMUNITY exact-match [wide|json]
These commands display BGP routes which have the community attribute. These commands display BGP routes which have the community attribute.
attribute. When ``COMMUNITY`` is specified, BGP routes that match that attribute. When ``COMMUNITY`` is specified, BGP routes that match that
@ -2865,6 +2895,19 @@ attribute.
match the specified community list. When `exact-match` is specified, it match the specified community list. When `exact-match` is specified, it
displays only routes that have an exact match. displays only routes that have an exact match.
If _wide_ option is specified, then the prefix table's width is increased
to fully display the prefix and the nexthop.
This is especially handy dealing with IPv6 prefixes and
if :clicmd:`[no] bgp default show-nexthop-hostname` is enabled.
If _all_ option is specified, _ip_ keyword is ignored and,
routes displayed for all AFIs and SAFIs.
if afi is specified, with _all_ option, routes will be displayed for
each SAFI in the selcted AFI
If _json_ option is specified, output is displayed in JSON format.
.. _bgp-display-routes-by-lcommunity: .. _bgp-display-routes-by-lcommunity:
Displaying Routes by Large Community Attribute Displaying Routes by Large Community Attribute