From 46f296b4029da9fe165953d432fb589c7070bfc9 Mon Sep 17 00:00:00 2001 From: Lou Berger Date: Fri, 6 Jan 2017 10:50:31 -0500 Subject: [PATCH] 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 --- bgpd/bgp_route.c | 37 ++----- bgpd/bgp_vty.c | 283 +++++++++++++++++++++++------------------------ bgpd/bgp_vty.h | 23 +++- 3 files changed, 166 insertions(+), 177 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 511cb882bb24..0df3a0c80081 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -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); } diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index a86908f1992d..d39df63a1851 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -107,23 +107,52 @@ bgp_node_safi (struct vty *vty) return safi; } -int -bgp_parse_afi(const char *str, afi_t *afi) +/* supports */ +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 */ 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 ", + "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 ", + "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 [ WORD] []|ipv6 []] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> []|in [prefix-filter]|out>]", + "clear [ip] bgp [ WORD] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> []|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; } - /* []|ipv6 []|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); } /* []|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 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 WORD ipv6 prefix X:X::X:X/M", + "clear [ip] bgp 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 [ WORD] []|ipv6 []|vpnv4 >] summary [json]", + "show [ip] bgp [ 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, /* [ WORD] */ if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) vrf = argv[++idx]->arg; - /* []|ipv6 []|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); @@ -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 [] 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 [ WORD] []|ipv6 []|vpnv4 [unicast]>] update-groups [SUBGROUP-ID]", + "show [ip] bgp [ WORD] [] 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, /* [ WORD] */ if (argv_find (argv, argc, "view", &idx) || argv_find (argv, argc, "vrf", &idx)) vrf = argv[++idx]->arg; - /* []|ipv6 []|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 update-groups ", + "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups ", 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 update-groups SUBGROUP-ID ", + "show [ip] bgp "BGP_AFI_SAFI_CMD_STR" update-groups SUBGROUP-ID ", 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; } diff --git a/bgpd/bgp_vty.h b/bgpd/bgp_vty.h index 51b728066469..0fd2ae1be29a 100644 --- a/bgpd/bgp_vty.h +++ b/bgpd/bgp_vty.h @@ -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 "" +#define BGP_AFI_HELP_STR "Address Family\nAddress Family\n" +#define BGP_SAFI_CMD_STR "" +#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 */