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);
return CMD_WARNING;
}
if (strncmp (afi_str, "ipv", 3) == 0)
{
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
afi = bgp_vty_afi_from_arg(afi_str);
if (afi == AFI_MAX)
{
vty_out (vty, "%% Invalid address family \"%s\"%s",
afi_str, VTY_NEWLINE);
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);
}

View File

@ -107,23 +107,52 @@ bgp_node_safi (struct vty *vty)
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
bgp_parse_afi(const char *str, afi_t *afi)
{
if (!strcmp(str, "ipv4")) {
*afi = AFI_IP;
return 0;
}
#ifdef HAVE_IPV6
if (!strcmp(str, "ipv6")) {
*afi = AFI_IP6;
return 0;
}
#endif /* HAVE_IPV6 */
*afi = bgp_vty_afi_from_arg(str);
if (*afi != AFI_MAX)
return 0;
else
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
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)
safi = SAFI_ENCAP;
else if (strncmp (safi_str, "v", 1) == 0)
safi = SAFI_MPLS_VPN;
safi = SAFI_MPLS_VPN;
return safi;
}
@ -149,6 +178,37 @@ bgp_parse_safi(const char *str, safi_t *safi)
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
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:
vty_out (vty,
"%%BGP: Enable %s %s address family for the neighbor %s%s",
afi == AFI_IP6 ? "IPv6" : safi == SAFI_MPLS_VPN ? "VPNv4" : "IPv4",
safi == SAFI_MULTICAST ? "Multicast" : "Unicast",
peer->host, VTY_NEWLINE);
"%%BGP: Enable %s address family for the neighbor %s%s",
afi_safi_print(afi, safi), peer->host, VTY_NEWLINE);
break;
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);
@ -5440,13 +5498,10 @@ DEFUN (address_family_ipv4,
DEFUN (address_family_ipv4_safi,
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"
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n")
BGP_SAFI_HELP_STR)
{
int idx_safi = 2;
switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg))
@ -5481,19 +5536,28 @@ DEFUN (address_family_ipv6,
DEFUN (address_family_ipv6_safi,
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"
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n")
BGP_SAFI_HELP_STR)
{
int idx_safi = 2;
if (strncmp (argv[idx_safi]->arg, "m", 1) == 0)
vty->node = BGP_IPV6M_NODE;
else
vty->node = BGP_IPV6_NODE;
switch (bgp_vty_safi_from_arg(argv[idx_safi]->arg))
{
case SAFI_MULTICAST:
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;
}
@ -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 */
DEFUN (clear_ip_bgp_all,
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
IP_STR
BGP_STR
@ -5656,20 +5720,8 @@ DEFUN (clear_ip_bgp_all,
"Clear all external peers\n"
"Clear all members of peer-group\n"
"BGP peer-group name\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 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_AFI_HELP_STR
BGP_SAFI_HELP_STR
BGP_SOFT_STR
BGP_SOFT_IN_STR
BGP_SOFT_OUT_STR
@ -5746,19 +5798,10 @@ DEFUN (clear_ip_bgp_all,
{
clr_sort = clear_external;
}
/* [<ipv4 [<unicast|multicast>]|ipv6 [<unicast|multicast>]|encap [unicast]||vpnv4 [unicast]>] */
if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx))
/* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
{
afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP;
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);
argv_find_and_parse_safi (argv, argc, &idx, &safi);
}
/* [<soft [<in|out>]|in [prefix-filter]|out>] */
if (argv_find (argv, argc, "soft", &idx))
@ -5808,44 +5851,38 @@ DEFUN (clear_ip_bgp_prefix,
DEFUN (clear_bgp_ipv6_safi_prefix,
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
IP_STR
BGP_STR
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
BGP_SAFI_HELP_STR
"Clear bestpath and re-advertise\n"
"IPv6 prefix\n")
{
int idx_safi = 3;
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, safi, NULL);
return bgp_clear_prefix (vty, NULL, argv[idx_ipv6_prefixlen]->arg, AFI_IP6,
bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL);
}
DEFUN (clear_bgp_instance_ipv6_safi_prefix,
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
IP_STR
BGP_STR
BGP_INSTANCE_HELP_STR
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
BGP_SAFI_HELP_STR
"Clear bestpath and re-advertise\n"
"IPv6 prefix\n")
{
int idx_word = 3;
int idx_safi = 5;
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, safi, NULL);
return bgp_clear_prefix (vty, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg, AFI_IP6,
bgp_vty_safi_from_arg(argv[idx_safi]->arg), NULL);
}
DEFUN (show_bgp_views,
@ -6465,10 +6502,10 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi,
{
if (use_json)
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
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)
@ -6566,30 +6603,18 @@ bgp_show_summary_vty (struct vty *vty, const char *name,
/* `show [ip] bgp summary' commands. */
DEFUN (show_ip_bgp_summary,
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
IP_STR
BGP_STR
BGP_INSTANCE_HELP_STR
"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 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"
BGP_AFI_HELP_STR
BGP_SAFI_HELP_STR
"Summary of BGP neighbor status\n"
JSON_STR)
{
char *vrf = NULL;
afi_t afi = AFI_IP6;
afi_t afi = AFI_IP6; /* why default to v6? */
safi_t safi = SAFI_UNICAST;
int idx = 0;
@ -6600,23 +6625,10 @@ DEFUN (show_ip_bgp_summary,
/* [<view|vrf> WORD] */
if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx))
vrf = argv[++idx]->arg;
/* [<ipv4 [<unicast|multicast>]|ipv6 [<unicast|multicast>]|encap [unicast]|vpnv4 [unicast]>] */
if (argv_find (argv, argc, "ipv4", &idx) || argv_find (argv, argc, "ipv6", &idx))
/* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
{
afi = strmatch(argv[idx]->text, "ipv6") ? AFI_IP6 : AFI_IP;
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;
argv_find_and_parse_safi (argv, argc, &idx, &safi);
}
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)
return "IPv4 Multicast";
else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
return "VPN-IPv4 Unicast";
return "IPv4 VPN";
else if (afi == AFI_IP && safi == SAFI_ENCAP)
return "ENCAP-IPv4 Unicast";
return "IPv4 Encap";
else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
return "IPv6 Unicast";
else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
return "IPv6 Multicast";
else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
return "VPN-IPv6 Unicast";
return "IPv6 VPN";
else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
return "ENCAP-IPv6 Unicast";
return "IPv6 Encap";
else
return "Unknown";
}
@ -8507,14 +8519,11 @@ DEFUN (show_ip_bgp_neighbors,
same.*/
DEFUN (show_ip_bgp_paths,
show_ip_bgp_paths_cmd,
"show [ip] bgp [<unicast|multicast|vpn|encap>] paths",
"show [ip] bgp ["BGP_SAFI_CMD_STR"] paths",
SHOW_STR
IP_STR
BGP_STR
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
BGP_SAFI_HELP_STR
"Path information\n")
{
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,
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
IP_STR
BGP_STR
BGP_INSTANCE_HELP_STR
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
BGP_SAFI_HELP_STR
"Address Family\n"
BGP_SAFI_HELP_STR
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
@ -8645,7 +8653,7 @@ DEFUN (show_ip_bgp_updgrps,
/* [<view|vrf> WORD] */
if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx))
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))
{
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,
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
IP_STR
BGP_STR
"Address Family\n"
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
BGP_AFI_SAFI_HELP_STR
"Detailed info about dynamic update groups\n"
"Advertisement queue\n"
"Announced routes\n"
@ -8799,12 +8802,10 @@ DEFUN (show_bgp_updgrps_afi_adj,
int idx_afi = 2;
int idx_safi = 3;
int idx_type = 5;
afi_t afi;
safi_t safi;
afi = (strcmp(argv[idx_afi]->arg, "ipv4") == 0) ? AFI_IP : AFI_IP6;
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);
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, 0);
return CMD_SUCCESS;
}
@ -8892,16 +8893,11 @@ DEFUN (show_ip_bgp_instance_updgrps_adj_s,
DEFUN (show_bgp_updgrps_afi_adj_s,
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
IP_STR
BGP_STR
"Address Family\n"
"Address Family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
"Address Family modifier\n"
BGP_AFI_SAFI_HELP_STR
"Detailed info about dynamic update groups\n"
"Specific subgroup to display info for\n"
"Advertisement queue\n"
@ -8913,15 +8909,14 @@ DEFUN (show_bgp_updgrps_afi_adj_s,
int idx_safi = 3;
int idx_subgroup_id = 5;
int idx_type = 6;
afi_t afi;
safi_t safi;
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);
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;
}

View File

@ -26,12 +26,16 @@ struct bgp;
#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 AFI_SAFI_STR \
"Address family\n" \
"Address Family modifier\n" \
"Address Family modifier\n" \
"Address Family modifier\n" \
#define BGP_AFI_CMD_STR "<ipv4|ipv6>"
#define BGP_AFI_HELP_STR "Address Family\nAddress Family\n"
#define BGP_SAFI_CMD_STR "<unicast|multicast|vpn|encap>"
#define BGP_SAFI_HELP_STR \
"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 const char *afi_safi_print (afi_t, safi_t);
@ -49,7 +53,16 @@ bgp_parse_afi(const char *str, afi_t *afi);
extern int
bgp_parse_safi(const char *str, safi_t *safi);
extern afi_t
bgp_vty_afi_from_arg(const char *afi_str);
extern safi_t
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 */