return safi;
}
-int
-bgp_parse_afi(const char *str, afi_t *afi)
+/* supports <ipv4|ipv6> */
+afi_t
+bgp_vty_afi_from_arg(const char *afi_str)
{
- if (!strcmp(str, "ipv4")) {
- *afi = AFI_IP;
- return 0;
+ afi_t afi = AFI_MAX; /* unknown */
+ if (!strcmp(afi_str, "ipv4")) {
+ afi = AFI_IP;
}
#ifdef HAVE_IPV6
- if (!strcmp(str, "ipv6")) {
- *afi = AFI_IP6;
- return 0;
- }
+ else if (!strcmp(afi_str, "ipv6")) {
+ afi = AFI_IP6;
+ }
#endif /* HAVE_IPV6 */
+ return afi;
+}
+
+int
+bgp_parse_afi(const char *str, afi_t *afi)
+{
+ *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)
{
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;
}
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)
{
{
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);
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))
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;
}
/* 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
"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
{
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))
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,
{
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)
/* `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;
/* [<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))
- {
- 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))
+ /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
+ if (argv_find_and_parse_afi (argv, argc, &idx, &afi))
{
- 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);
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";
}
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);
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"
/* [<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;
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"
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;
}
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"
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;
}