bgpd: restore some missing afi/safi commands (Issue #14)

Added defines and parse utility functions
      Fix vty code that treated vpn&encap as AFIs
      and some other related vty printing/handline issues
This commit is contained in:
Lou Berger 2017-01-06 10:50:31 -05:00
parent 3324ef9359
commit 46f296b402
3 changed files with 167 additions and 178 deletions

View File

@ -8804,39 +8804,20 @@ bgp_table_stats_vty (struct vty *vty, const char *name,
vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE); vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
return CMD_WARNING; return CMD_WARNING;
} }
if (strncmp (afi_str, "ipv", 3) == 0) afi = bgp_vty_afi_from_arg(afi_str);
{ if (afi == AFI_MAX)
if (strncmp (afi_str, "ipv4", 4) == 0)
afi = AFI_IP;
else if (strncmp (afi_str, "ipv6", 4) == 0)
afi = AFI_IP6;
else
{
vty_out (vty, "%% Invalid address family %s%s",
afi_str, VTY_NEWLINE);
return CMD_WARNING;
}
if (strncmp (safi_str, "m", 1) == 0)
safi = SAFI_MULTICAST;
else if (strncmp (safi_str, "u", 1) == 0)
safi = SAFI_UNICAST;
else if (strncmp (safi_str, "e", 1) == 0)
safi = SAFI_ENCAP;
else if (strncmp (safi_str, "vpnv4", 5) == 0 || strncmp (safi_str, "vpnv6", 5) == 0)
safi = SAFI_MPLS_VPN;
else
{
vty_out (vty, "%% Invalid subsequent address family %s%s",
safi_str, VTY_NEWLINE);
return CMD_WARNING;
}
}
else
{ {
vty_out (vty, "%% Invalid address family \"%s\"%s", vty_out (vty, "%% Invalid address family \"%s\"%s",
afi_str, VTY_NEWLINE); afi_str, VTY_NEWLINE);
return CMD_WARNING; return CMD_WARNING;
} }
safi = bgp_vty_safi_from_arg(safi_str);
if (safi == SAFI_MAX)
{
vty_out (vty, "%% Invalid subsequent address family %s%s",
safi_str, VTY_NEWLINE);
return CMD_WARNING;
}
return bgp_table_stats (vty, bgp, afi, safi); return bgp_table_stats (vty, bgp, afi, safi);
} }

View File

@ -107,23 +107,52 @@ bgp_node_safi (struct vty *vty)
return safi; return safi;
} }
/* supports <ipv4|ipv6> */
afi_t
bgp_vty_afi_from_arg(const char *afi_str)
{
afi_t afi = AFI_MAX; /* unknown */
if (!strcmp(afi_str, "ipv4")) {
afi = AFI_IP;
}
#ifdef HAVE_IPV6
else if (!strcmp(afi_str, "ipv6")) {
afi = AFI_IP6;
}
#endif /* HAVE_IPV6 */
return afi;
}
int int
bgp_parse_afi(const char *str, afi_t *afi) bgp_parse_afi(const char *str, afi_t *afi)
{ {
if (!strcmp(str, "ipv4")) { *afi = bgp_vty_afi_from_arg(str);
*afi = AFI_IP; if (*afi != AFI_MAX)
return 0; return 0;
} else
#ifdef HAVE_IPV6
if (!strcmp(str, "ipv6")) {
*afi = AFI_IP6;
return 0;
}
#endif /* HAVE_IPV6 */
return -1; return -1;
} }
/* supports (unicast|multicast|vpn|encap) */ int
argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index, afi_t *afi)
{
int ret = 0;
if (argv_find (argv, argc, "ipv4", index))
{
ret = 1;
if (afi)
*afi = AFI_IP;
}
else if (argv_find (argv, argc, "ipv6", index))
{
ret = 1;
if (afi)
*afi = AFI_IP6;
}
return ret;
}
/* supports <unicast|multicast|vpn|encap> */
safi_t safi_t
bgp_vty_safi_from_arg(const char *safi_str) bgp_vty_safi_from_arg(const char *safi_str)
{ {
@ -135,7 +164,7 @@ bgp_vty_safi_from_arg(const char *safi_str)
else if (strncmp (safi_str, "e", 1) == 0) else if (strncmp (safi_str, "e", 1) == 0)
safi = SAFI_ENCAP; safi = SAFI_ENCAP;
else if (strncmp (safi_str, "v", 1) == 0) else if (strncmp (safi_str, "v", 1) == 0)
safi = SAFI_MPLS_VPN; safi = SAFI_MPLS_VPN;
return safi; return safi;
} }
@ -149,6 +178,37 @@ bgp_parse_safi(const char *str, safi_t *safi)
return -1; return -1;
} }
int
argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index, safi_t *safi)
{
int ret = 0;
if (argv_find (argv, argc, "unicast", index))
{
ret = 1;
if (safi)
*safi = SAFI_UNICAST;
}
else if (argv_find (argv, argc, "multicast", index))
{
ret = 1;
if (safi)
*safi = SAFI_MULTICAST;
}
else if (argv_find (argv, argc, "vpn", index))
{
ret = 1;
if (safi)
*safi = SAFI_MPLS_VPN;
}
else if (argv_find (argv, argc, "encap", index))
{
ret = 1;
if (safi)
*safi = SAFI_ENCAP;
}
return ret;
}
static int static int
peer_address_self_check (struct bgp *bgp, union sockunion *su) peer_address_self_check (struct bgp *bgp, union sockunion *su)
{ {
@ -363,10 +423,8 @@ bgp_clear_vty_error (struct vty *vty, struct peer *peer, afi_t afi,
{ {
case BGP_ERR_AF_UNCONFIGURED: case BGP_ERR_AF_UNCONFIGURED:
vty_out (vty, vty_out (vty,
"%%BGP: Enable %s %s address family for the neighbor %s%s", "%%BGP: Enable %s address family for the neighbor %s%s",
afi == AFI_IP6 ? "IPv6" : safi == SAFI_MPLS_VPN ? "VPNv4" : "IPv4", afi_safi_print(afi, safi), peer->host, VTY_NEWLINE);
safi == SAFI_MULTICAST ? "Multicast" : "Unicast",
peer->host, VTY_NEWLINE);
break; break;
case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED: case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED:
vty_out (vty, "%%BGP: Inbound soft reconfig for %s not possible as it%s has neither refresh capability, nor inbound soft reconfig%s", peer->host, VTY_NEWLINE, VTY_NEWLINE); vty_out (vty, "%%BGP: Inbound soft reconfig for %s not possible as it%s has neither refresh capability, nor inbound soft reconfig%s", peer->host, VTY_NEWLINE, VTY_NEWLINE);
@ -5440,13 +5498,10 @@ DEFUN (address_family_ipv4,
DEFUN (address_family_ipv4_safi, DEFUN (address_family_ipv4_safi,
address_family_ipv4_safi_cmd, address_family_ipv4_safi_cmd,
"address-family ipv4 <unicast|multicast|vpn|encap>", "address-family ipv4 "BGP_SAFI_CMD_STR,
"Enter Address Family command mode\n" "Enter Address Family command mode\n"
"Address Family\n" "Address Family\n"
"Address Family modifier\n" BGP_SAFI_HELP_STR)
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n")
{ {
int idx_safi = 2; int idx_safi = 2;
switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg)) switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg))
@ -5481,19 +5536,28 @@ DEFUN (address_family_ipv6,
DEFUN (address_family_ipv6_safi, DEFUN (address_family_ipv6_safi,
address_family_ipv6_safi_cmd, address_family_ipv6_safi_cmd,
"address-family ipv6 <unicast|multicast|vpn|encap>", "address-family ipv6 "BGP_SAFI_CMD_STR,
"Enter Address Family command mode\n" "Enter Address Family command mode\n"
"Address Family\n" "Address Family\n"
"Address Family modifier\n" BGP_SAFI_HELP_STR)
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n")
{ {
int idx_safi = 2; int idx_safi = 2;
if (strncmp (argv[idx_safi]->arg, "m", 1) == 0) switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg))
vty->node = BGP_IPV6M_NODE; {
else case SAFI_MULTICAST:
vty->node = BGP_IPV6_NODE; vty->node = BGP_IPV6M_NODE;
break;
case SAFI_ENCAP:
vty->node = BGP_ENCAPV6_NODE;
break;
case SAFI_MPLS_VPN:
vty->node = BGP_VPNV6_NODE;
break;
case SAFI_UNICAST:
default:
vty->node = BGP_IPV6_NODE;
break;
}
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -5643,7 +5707,7 @@ bgp_clear_prefix (struct vty *vty, const char *view_name, const char *ip_str,
/* one clear bgp command to rule them all */ /* one clear bgp command to rule them all */
DEFUN (clear_ip_bgp_all, DEFUN (clear_ip_bgp_all,
clear_ip_bgp_all_cmd, clear_ip_bgp_all_cmd,
"clear [ip] bgp [<view|vrf> WORD] [<ipv4 [<unicast|multicast|vpn|encap>]|ipv6 [<unicast|multicast|vpn|encap>]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> [<soft [<in|out>]|in [prefix-filter]|out>]", "clear [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> [<soft [<in|out>]|in [prefix-filter]|out>]",
CLEAR_STR CLEAR_STR
IP_STR IP_STR
BGP_STR BGP_STR
@ -5656,20 +5720,8 @@ DEFUN (clear_ip_bgp_all,
"Clear all external peers\n" "Clear all external peers\n"
"Clear all members of peer-group\n" "Clear all members of peer-group\n"
"BGP peer-group name\n" "BGP peer-group name\n"
"Address Family\n" BGP_AFI_HELP_STR
"Address Family modifier\n" BGP_SAFI_HELP_STR
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family\n"
"Address Family modifier\n"
"Address Family\n"
"Address Family modifier\n"
BGP_SOFT_STR BGP_SOFT_STR
BGP_SOFT_IN_STR BGP_SOFT_IN_STR
BGP_SOFT_OUT_STR BGP_SOFT_OUT_STR
@ -5746,19 +5798,10 @@ DEFUN (clear_ip_bgp_all,
{ {
clr_sort = clear_external; clr_sort = clear_external;
} }
/* [<ipv4 [<unicast|multicast>]|ipv6 [<unicast|multicast>]|encap [unicast]||vpnv4 [unicast]>] */ /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx)) if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
{ {
afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP; argv_find_and_parse_safi (argv, argc, &idx, &safi);
if (argv_find (argv, argc, "unicast", &idx) || argv_find (argv, argc, "multicast", &idx))
safi = bgp_vty_safi_from_arg (argv[idx]->text);
}
else if (argv_find (argv, argc, "encap", &idx) || argv_find (argv, argc, "vpnv4", &idx))
{
afi = AFI_IP;
safi = bgp_vty_safi_from_arg (argv[idx]->text);
// advance idx if necessary
argv_find (argv, argc, "unicast", &idx);
} }
/* [<soft [<in|out>]|in [prefix-filter]|out>] */ /* [<soft [<in|out>]|in [prefix-filter]|out>] */
if (argv_find (argv, argc, "soft", &idx)) if (argv_find (argv, argc, "soft", &idx))
@ -5808,44 +5851,38 @@ DEFUN (clear_ip_bgp_prefix,
DEFUN (clear_bgp_ipv6_safi_prefix, DEFUN (clear_bgp_ipv6_safi_prefix,
clear_bgp_ipv6_safi_prefix_cmd, clear_bgp_ipv6_safi_prefix_cmd,
"clear [ip] bgp ipv6 <unicast|multicast|vpn|encap> prefix X:X::X:X/M", "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
CLEAR_STR CLEAR_STR
IP_STR IP_STR
BGP_STR BGP_STR
"Address Family\n" "Address Family\n"
"Address Family modifier\n" BGP_SAFI_HELP_STR
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Clear bestpath and re-advertise\n" "Clear bestpath and re-advertise\n"
"IPv6 prefix\n") "IPv6 prefix\n")
{ {
int idx_safi = 3; int idx_safi = 3;
int idx_ipv6_prefixlen = 5; int idx_ipv6_prefixlen = 5;
safi_t safi = bgp_vty_safi_from_arg (argv[idx_safi]->arg); return bgp_clear_prefix (vty, NULL, argv[idx_ipv6_prefixlen]->arg, AFI_IP6,
return bgp_clear_prefix (vty, NULL, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, safi, NULL); bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL);
} }
DEFUN (clear_bgp_instance_ipv6_safi_prefix, DEFUN (clear_bgp_instance_ipv6_safi_prefix,
clear_bgp_instance_ipv6_safi_prefix_cmd, clear_bgp_instance_ipv6_safi_prefix_cmd,
"clear [ip] bgp <view|vrf> WORD ipv6 <unicast|multicast|vpn|encap> prefix X:X::X:X/M", "clear [ip] bgp <view|vrf> WORD ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
CLEAR_STR CLEAR_STR
IP_STR IP_STR
BGP_STR BGP_STR
BGP_INSTANCE_HELP_STR BGP_INSTANCE_HELP_STR
"Address Family\n" "Address Family\n"
"Address Family modifier\n" BGP_SAFI_HELP_STR
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Clear bestpath and re-advertise\n" "Clear bestpath and re-advertise\n"
"IPv6 prefix\n") "IPv6 prefix\n")
{ {
int idx_word = 3; int idx_word = 3;
int idx_safi = 5; int idx_safi = 5;
int idx_ipv6_prefixlen = 7; int idx_ipv6_prefixlen = 7;
safi_t safi = bgp_vty_safi_from_arg (argv[idx_safi]->text); return bgp_clear_prefix (vty, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg, AFI_IP6,
return bgp_clear_prefix (vty, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg, AFI_IP6, safi, NULL); bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL);
} }
DEFUN (show_bgp_views, DEFUN (show_bgp_views,
@ -6465,10 +6502,10 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi,
{ {
if (use_json) if (use_json)
vty_out(vty, "{\"error\": {\"message\": \"No %s neighbor configured\"}}%s", vty_out(vty, "{\"error\": {\"message\": \"No %s neighbor configured\"}}%s",
afi == AFI_IP ? "IPv4" : "IPv6", VTY_NEWLINE); afi_safi_print(afi, safi), VTY_NEWLINE);
else else
vty_out (vty, "No %s neighbor is configured%s", vty_out (vty, "No %s neighbor is configured%s",
afi == AFI_IP ? "IPv4" : "IPv6", VTY_NEWLINE); afi_safi_print(afi, safi), VTY_NEWLINE);
} }
if (dn_count && ! use_json) if (dn_count && ! use_json)
@ -6566,30 +6603,18 @@ bgp_show_summary_vty (struct vty *vty, const char *name,
/* `show [ip] bgp summary' commands. */ /* `show [ip] bgp summary' commands. */
DEFUN (show_ip_bgp_summary, DEFUN (show_ip_bgp_summary,
show_ip_bgp_summary_cmd, show_ip_bgp_summary_cmd,
"show [ip] bgp [<view|vrf> WORD] [<ipv4 [<unicast|multicast|vpn|encap>]|ipv6 [<unicast|multicast|vpn|encap>]|vpnv4 <all|rd ASN:nn_or_IP-address:nn>>] summary [json]", "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] summary [json]",
SHOW_STR SHOW_STR
IP_STR IP_STR
BGP_STR BGP_STR
BGP_INSTANCE_HELP_STR BGP_INSTANCE_HELP_STR
"Address Family\n" BGP_AFI_HELP_STR
"Address Family modifier\n" BGP_SAFI_HELP_STR
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family\n"
"Display information about all VPNv4 NLRIs\n"
"Display information for a route distinguisher\n"
"VPN Route Distinguisher\n"
"Summary of BGP neighbor status\n" "Summary of BGP neighbor status\n"
JSON_STR) JSON_STR)
{ {
char *vrf = NULL; char *vrf = NULL;
afi_t afi = AFI_IP6; afi_t afi = AFI_IP6; /* why default to v6? */
safi_t safi = SAFI_UNICAST; safi_t safi = SAFI_UNICAST;
int idx = 0; int idx = 0;
@ -6600,23 +6625,10 @@ DEFUN (show_ip_bgp_summary,
/* [<view|vrf> WORD] */ /* [<view|vrf> WORD] */
if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx))
vrf = argv[++idx]->arg; vrf = argv[++idx]->arg;
/* [<ipv4 [<unicast|multicast>]|ipv6 [<unicast|multicast>]|encap [unicast]|vpnv4 [unicast]>] */ /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx)) if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
{ {
afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP; argv_find_and_parse_safi (argv, argc, &idx, &safi);
if (argv_find (argv, argc, "unicast", &idx) || argv_find (argv, argc, "multicast", &idx))
safi = bgp_vty_safi_from_arg (argv[idx]->text);
}
else if (argv_find (argv, argc, "encap", &idx))
{
afi = AFI_IP;
safi = SAFI_ENCAP;
}
else if (argv_find (argv, argc, "vpnv4", &idx))
{
// we show the same thing regardless of rd and all
afi = AFI_IP;
safi = SAFI_MPLS_VPN;
} }
int uj = use_json (argc, argv); int uj = use_json (argc, argv);
@ -6632,17 +6644,17 @@ afi_safi_print (afi_t afi, safi_t safi)
else if (afi == AFI_IP && safi == SAFI_MULTICAST) else if (afi == AFI_IP && safi == SAFI_MULTICAST)
return "IPv4 Multicast"; return "IPv4 Multicast";
else if (afi == AFI_IP && safi == SAFI_MPLS_VPN) else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
return "VPN-IPv4 Unicast"; return "IPv4 VPN";
else if (afi == AFI_IP && safi == SAFI_ENCAP) else if (afi == AFI_IP && safi == SAFI_ENCAP)
return "ENCAP-IPv4 Unicast"; return "IPv4 Encap";
else if (afi == AFI_IP6 && safi == SAFI_UNICAST) else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
return "IPv6 Unicast"; return "IPv6 Unicast";
else if (afi == AFI_IP6 && safi == SAFI_MULTICAST) else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
return "IPv6 Multicast"; return "IPv6 Multicast";
else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN) else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
return "VPN-IPv6 Unicast"; return "IPv6 VPN";
else if (afi == AFI_IP6 && safi == SAFI_ENCAP) else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
return "ENCAP-IPv6 Unicast"; return "IPv6 Encap";
else else
return "Unknown"; return "Unknown";
} }
@ -8507,14 +8519,11 @@ DEFUN (show_ip_bgp_neighbors,
same.*/ same.*/
DEFUN (show_ip_bgp_paths, DEFUN (show_ip_bgp_paths,
show_ip_bgp_paths_cmd, show_ip_bgp_paths_cmd,
"show [ip] bgp [<unicast|multicast|vpn|encap>] paths", "show [ip] bgp ["BGP_SAFI_CMD_STR"] paths",
SHOW_STR SHOW_STR
IP_STR IP_STR
BGP_STR BGP_STR
"Address Family modifier\n" BGP_SAFI_HELP_STR
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Path information\n") "Path information\n")
{ {
vty_out (vty, "Address Refcnt Path%s", VTY_NEWLINE); vty_out (vty, "Address Refcnt Path%s", VTY_NEWLINE);
@ -8612,16 +8621,15 @@ bgp_show_update_groups(struct vty *vty, const char *name,
DEFUN (show_ip_bgp_updgrps, DEFUN (show_ip_bgp_updgrps,
show_ip_bgp_updgrps_cmd, show_ip_bgp_updgrps_cmd,
"show [ip] bgp [<view|vrf> WORD] [<ipv4 [<unicast|multicast|vpn|encap>]|ipv6 [<unicast|multicast|vpn|encap>]|vpnv4 [unicast]>] update-groups [SUBGROUP-ID]", "show [ip] bgp [<view|vrf> WORD] [<ipv4 ["BGP_SAFI_CMD_STR"]|ipv6 ["BGP_SAFI_CMD_STR"]|encap [unicast]|vpnv4 [unicast]>] update-groups [SUBGROUP-ID]",
SHOW_STR SHOW_STR
IP_STR IP_STR
BGP_STR BGP_STR
BGP_INSTANCE_HELP_STR BGP_INSTANCE_HELP_STR
"Address Family\n" "Address Family\n"
"Address Family modifier\n" BGP_SAFI_HELP_STR
"Address Family modifier\n" "Address Family\n"
"Address Family modifier\n" BGP_SAFI_HELP_STR
"Address Family modifier\n"
"Address Family\n" "Address Family\n"
"Address Family modifier\n" "Address Family modifier\n"
"Address Family modifier\n" "Address Family modifier\n"
@ -8645,7 +8653,7 @@ DEFUN (show_ip_bgp_updgrps,
/* [<view|vrf> WORD] */ /* [<view|vrf> WORD] */
if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx))
vrf = argv[++idx]->arg; vrf = argv[++idx]->arg;
/* [<ipv4 [<unicast|multicast>]|ipv6 [<unicast|multicast>]|encap [unicast]|vpnv4 [unicast]>] */ /* [<ipv4 ["BGP_SAFI_CMD_STR"]|ipv6 ["BGP_SAFI_CMD_STR"]|encap [unicast]|vpnv4 [unicast]>] */
if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx)) if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx))
{ {
afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP; afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP;
@ -8780,16 +8788,11 @@ DEFUN (show_ip_bgp_instance_updgrps_adj,
DEFUN (show_bgp_updgrps_afi_adj, DEFUN (show_bgp_updgrps_afi_adj,
show_bgp_updgrps_afi_adj_cmd, show_bgp_updgrps_afi_adj_cmd,
"show [ip] bgp <ipv4|ipv6> <unicast|multicast|vpn|encap> update-groups <advertise-queue|advertised-routes|packet-queue>", "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups <advertise-queue|advertised-routes|packet-queue>",
SHOW_STR SHOW_STR
IP_STR IP_STR
BGP_STR BGP_STR
"Address Family\n" BGP_AFI_SAFI_HELP_STR
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Detailed info about dynamic update groups\n" "Detailed info about dynamic update groups\n"
"Advertisement queue\n" "Advertisement queue\n"
"Announced routes\n" "Announced routes\n"
@ -8799,12 +8802,10 @@ DEFUN (show_bgp_updgrps_afi_adj,
int idx_afi = 2; int idx_afi = 2;
int idx_safi = 3; int idx_safi = 3;
int idx_type = 5; int idx_type = 5;
afi_t afi; show_bgp_updgrps_adj_info_aux(vty, NULL,
safi_t safi; bgp_vty_afi_from_arg(argv[idx_afi]->arg),
bgp_vty_safi_from_arg(argv[idx_safi]->arg),
afi = (strcmp(argv[idx_afi]->arg, "ipv4") == 0) ? AFI_IP : AFI_IP6; argv[idx_type]->arg, 0);
safi = bgp_vty_safi_from_arg(argv[idx_safi]->arg);
show_bgp_updgrps_adj_info_aux(vty, NULL, afi, safi, argv[idx_type]->arg, 0);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
@ -8892,16 +8893,11 @@ DEFUN (show_ip_bgp_instance_updgrps_adj_s,
DEFUN (show_bgp_updgrps_afi_adj_s, DEFUN (show_bgp_updgrps_afi_adj_s,
show_bgp_updgrps_afi_adj_s_cmd, show_bgp_updgrps_afi_adj_s_cmd,
"show [ip] bgp <ipv4|ipv6> <unicast|multicast|vpn|encap> update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>", "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
SHOW_STR SHOW_STR
IP_STR IP_STR
BGP_STR BGP_STR
"Address Family\n" BGP_AFI_SAFI_HELP_STR
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Detailed info about dynamic update groups\n" "Detailed info about dynamic update groups\n"
"Specific subgroup to display info for\n" "Specific subgroup to display info for\n"
"Advertisement queue\n" "Advertisement queue\n"
@ -8913,15 +8909,14 @@ DEFUN (show_bgp_updgrps_afi_adj_s,
int idx_safi = 3; int idx_safi = 3;
int idx_subgroup_id = 5; int idx_subgroup_id = 5;
int idx_type = 6; int idx_type = 6;
afi_t afi;
safi_t safi;
uint64_t subgrp_id; uint64_t subgrp_id;
afi = (strmatch(argv[idx_afi]->text, "ipv4")) ? AFI_IP : AFI_IP6;
safi = bgp_vty_safi_from_arg(argv[idx_safi]->text);
VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg); VTY_GET_ULL("subgroup-id", subgrp_id, argv[idx_subgroup_id]->arg);
show_bgp_updgrps_adj_info_aux(vty, NULL, afi, safi, argv[idx_type]->arg, subgrp_id); show_bgp_updgrps_adj_info_aux(vty, NULL,
bgp_vty_afi_from_arg(argv[idx_afi]->arg),
bgp_vty_safi_from_arg(argv[idx_safi]->arg),
argv[idx_type]->arg, subgrp_id);
return CMD_SUCCESS; return CMD_SUCCESS;
} }

View File

@ -26,12 +26,16 @@ struct bgp;
#define BGP_INSTANCE_HELP_STR "BGP view\nBGP VRF\nView/VRF name\n" #define BGP_INSTANCE_HELP_STR "BGP view\nBGP VRF\nView/VRF name\n"
#define BGP_INSTANCE_ALL_HELP_STR "BGP view\nBGP VRF\nAll Views/VRFs\n" #define BGP_INSTANCE_ALL_HELP_STR "BGP view\nBGP VRF\nAll Views/VRFs\n"
#define AFI_SAFI_STR \ #define BGP_AFI_CMD_STR "<ipv4|ipv6>"
"Address family\n" \ #define BGP_AFI_HELP_STR "Address Family\nAddress Family\n"
"Address Family modifier\n" \ #define BGP_SAFI_CMD_STR "<unicast|multicast|vpn|encap>"
"Address Family modifier\n" \ #define BGP_SAFI_HELP_STR \
"Address Family modifier\n" \ "Address Family modifier\n" \
"Address Family modifier\n" \
"Address Family modifier\n" \
"Address Family modifier\n" "Address Family modifier\n"
#define BGP_AFI_SAFI_CMD_STR BGP_AFI_CMD_STR" "BGP_SAFI_CMD_STR
#define BGP_AFI_SAFI_HELP_STR BGP_AFI_HELP_STR BGP_SAFI_HELP_STR
extern void bgp_vty_init (void); extern void bgp_vty_init (void);
extern const char *afi_safi_print (afi_t, safi_t); extern const char *afi_safi_print (afi_t, safi_t);
@ -49,7 +53,16 @@ bgp_parse_afi(const char *str, afi_t *afi);
extern int extern int
bgp_parse_safi(const char *str, safi_t *safi); bgp_parse_safi(const char *str, safi_t *safi);
extern afi_t
bgp_vty_afi_from_arg(const char *afi_str);
extern safi_t extern safi_t
bgp_vty_safi_from_arg(const char *safi_str); bgp_vty_safi_from_arg(const char *safi_str);
extern int
argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index, afi_t *afi);
extern int
argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index, safi_t *safi);
#endif /* _QUAGGA_BGP_VTY_H */ #endif /* _QUAGGA_BGP_VTY_H */