]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: Add 'rd all' keyword to EVPN/L3VPN show cmds
authorTrey Aspelund <taspelund@nvidia.com>
Tue, 9 Mar 2021 04:28:04 +0000 (04:28 +0000)
committerTrey Aspelund <taspelund@nvidia.com>
Fri, 19 Mar 2021 15:24:50 +0000 (15:24 +0000)
Adds support for 'rd all' matching for EVPN and L3VPN show commands.
Introduces evpn_show_route_rd_all_macip().
Cleanup some show commands to use SHOW_DISPLAY string constants.

Signed-off-by: Trey Aspelund <taspelund@nvidia.com>
bgpd/bgp_evpn_vty.c
bgpd/bgp_mplsvpn.c
bgpd/bgp_route.c

index b101589a79a32f9e609ba4257760731b54efe9e5..3d760a23a4932d85d08df32680eae586a61d5e9e 100644 (file)
@@ -1377,33 +1377,43 @@ DEFUN(show_ip_bgp_l2vpn_evpn,
       "show [ip] bgp l2vpn evpn [json]",
       SHOW_STR IP_STR BGP_STR L2VPN_HELP_STR EVPN_HELP_STR JSON_STR)
 {
-       return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal, NULL, 0,
+       return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal, NULL,
+                                    SHOW_DISPLAY_STANDARD,
                                     use_json(argc, argv));
 }
 
 DEFUN(show_ip_bgp_l2vpn_evpn_rd,
       show_ip_bgp_l2vpn_evpn_rd_cmd,
-      "show [ip] bgp l2vpn evpn rd ASN:NN_OR_IP-ADDRESS:NN [json]",
+      "show [ip] bgp l2vpn evpn rd <ASN:NN_OR_IP-ADDRESS:NN|all> [json]",
       SHOW_STR
       IP_STR
       BGP_STR
       L2VPN_HELP_STR
       EVPN_HELP_STR
       "Display information for a route distinguisher\n"
-      "VPN Route Distinguisher\n" JSON_STR)
+      "VPN Route Distinguisher\n"
+      "All VPN Route Distinguishers\n"
+      JSON_STR)
 {
        int idx_ext_community = 0;
        int ret;
        struct prefix_rd prd;
+       int rd_all = 0;
 
-       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
+       argv_find(argv, argc, "all", &rd_all);
+       if (rd_all)
+               return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal,
+                                            NULL, SHOW_DISPLAY_STANDARD,
+                                            use_json(argc, argv));
 
+       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
        ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
        if (!ret) {
                vty_out(vty, "%% Malformed Route Distinguisher\n");
                return CMD_WARNING;
        }
-       return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_normal, NULL, 0,
+       return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_normal, NULL,
+                                    SHOW_DISPLAY_STANDARD,
                                     use_json(argc, argv));
 }
 
@@ -1418,34 +1428,41 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_tags,
       "Display information about all EVPN NLRIs\n"
       "Display BGP tags for prefixes\n")
 {
-       return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal, NULL, 1,
-                                    0);
+       return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal, NULL,
+                                    SHOW_DISPLAY_TAGS, 0);
 }
 
 DEFUN(show_ip_bgp_l2vpn_evpn_rd_tags,
       show_ip_bgp_l2vpn_evpn_rd_tags_cmd,
-      "show [ip] bgp l2vpn evpn rd ASN:NN_OR_IP-ADDRESS:NN tags",
+      "show [ip] bgp l2vpn evpn rd <ASN:NN_OR_IP-ADDRESS:NN|all> tags",
       SHOW_STR
       IP_STR
       BGP_STR
       L2VPN_HELP_STR
       EVPN_HELP_STR
       "Display information for a route distinguisher\n"
-      "VPN Route Distinguisher\n" "Display BGP tags for prefixes\n")
+      "VPN Route Distinguisher\n"
+      "All VPN Route Distinguishers\n"
+      "Display BGP tags for prefixes\n")
 {
        int idx_ext_community = 0;
        int ret;
        struct prefix_rd prd;
+       int rd_all = 0;
 
-       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
+       argv_find(argv, argc, "all", &rd_all);
+       if (rd_all)
+               return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal,
+                                            NULL, SHOW_DISPLAY_TAGS, 0);
 
+       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
        ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
        if (!ret) {
                vty_out(vty, "%% Malformed Route Distinguisher\n");
                return CMD_WARNING;
        }
-       return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_normal, NULL, 1,
-                                    0);
+       return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_normal, NULL,
+                                    SHOW_DISPLAY_TAGS, 0);
 }
 
 DEFUN(show_ip_bgp_l2vpn_evpn_neighbor_routes,
@@ -1511,13 +1528,13 @@ DEFUN(show_ip_bgp_l2vpn_evpn_neighbor_routes,
                return CMD_WARNING;
        }
 
-       return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_neighbor, peer, 0,
-                                    uj);
+       return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_neighbor, peer,
+                                    SHOW_DISPLAY_STANDARD, uj);
 }
 
 DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,
       show_ip_bgp_l2vpn_evpn_rd_neighbor_routes_cmd,
-      "show [ip] bgp l2vpn evpn rd ASN:NN_OR_IP-ADDRESS:NN neighbors <A.B.C.D|X:X::X:X|WORD> routes [json]",
+      "show [ip] bgp l2vpn evpn rd <ASN:NN_OR_IP-ADDRESS:NN|all> neighbors <A.B.C.D|X:X::X:X|WORD> routes [json]",
       SHOW_STR
       IP_STR
       BGP_STR
@@ -1525,6 +1542,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,
       EVPN_HELP_STR
       "Display information for a route distinguisher\n"
       "VPN Route Distinguisher\n"
+      "All VPN Route Distinguishers\n"
       "Detailed information on TCP and BGP neighbor connections\n"
       "IPv4 Neighbor to display information about\n"
       "IPv6 Neighbor to display information about\n"
@@ -1541,6 +1559,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,
        afi_t afi = AFI_L2VPN;
        safi_t safi = SAFI_EVPN;
        struct bgp *bgp = NULL;
+       int rd_all = 0;
 
        bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
                                            &bgp, uj);
@@ -1549,20 +1568,26 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,
                return CMD_WARNING;
        }
 
-       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
-       ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
-       if (!ret) {
-               if (uj) {
-                       json_object *json_no = NULL;
-                       json_no = json_object_new_object();
-                       json_object_string_add(json_no, "warning",
-                                              "Malformed Route Distinguisher");
-                       vty_out(vty, "%s\n",
-                               json_object_to_json_string(json_no));
-                       json_object_free(json_no);
-               } else
-                       vty_out(vty, "%% Malformed Route Distinguisher\n");
-               return CMD_WARNING;
+       argv_find(argv, argc, "all", &rd_all);
+       if (!rd_all) {
+               argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN",
+                         &idx_ext_community);
+               ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
+               if (!ret) {
+                       if (uj) {
+                               json_object *json_no = NULL;
+                               json_no = json_object_new_object();
+                               json_object_string_add(
+                                       json_no, "warning",
+                                       "Malformed Route Distinguisher");
+                               vty_out(vty, "%s\n",
+                                       json_object_to_json_string(json_no));
+                               json_object_free(json_no);
+                       } else
+                               vty_out(vty,
+                                       "%% Malformed Route Distinguisher\n");
+                       return CMD_WARNING;
+               }
        }
 
        /* neighbors <A.B.C.D|X:X::X:X|WORD> */
@@ -1599,8 +1624,13 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_routes,
                return CMD_WARNING;
        }
 
-       return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_neighbor, peer, 0,
-                                    uj);
+
+       if (rd_all)
+               return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_neighbor,
+                                            peer, SHOW_DISPLAY_STANDARD, uj);
+       else
+               return bgp_show_ethernet_vpn(vty, &prd, bgp_show_type_neighbor,
+                                            peer, SHOW_DISPLAY_STANDARD, uj);
 }
 
 DEFUN(show_ip_bgp_l2vpn_evpn_neighbor_advertised_routes,
@@ -1674,7 +1704,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_neighbor_advertised_routes,
 
 DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,
       show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes_cmd,
-      "show [ip] bgp l2vpn evpn rd ASN:NN_OR_IP-ADDRESS:NN neighbors <A.B.C.D|X:X::X:X|WORD> advertised-routes [json]",
+      "show [ip] bgp l2vpn evpn rd <ASN:NN_OR_IP-ADDRESS:NN|all> neighbors <A.B.C.D|X:X::X:X|WORD> advertised-routes [json]",
       SHOW_STR
       IP_STR
       BGP_STR
@@ -1682,6 +1712,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,
       EVPN_HELP_STR
       "Display information for a route distinguisher\n"
       "VPN Route Distinguisher\n"
+      "All VPN Route Distinguishers\n"
       "Detailed information on TCP and BGP neighbor connections\n"
       "IPv4 Neighbor to display information about\n"
       "IPv6 Neighbor to display information about\n"
@@ -1698,6 +1729,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,
        char *peerstr = NULL;
        afi_t afi = AFI_L2VPN;
        safi_t safi = SAFI_EVPN;
+       int rd_all = 0;
 
        if (uj)
                argc--;
@@ -1712,8 +1744,6 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,
                return CMD_WARNING;
        }
 
-       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
-
        /* neighbors <A.B.C.D|X:X::X:X|WORD> */
        argv_find(argv, argc, "neighbors", &idx);
        peerstr = argv[++idx]->arg;
@@ -1748,19 +1778,29 @@ DEFUN(show_ip_bgp_l2vpn_evpn_rd_neighbor_advertised_routes,
                return CMD_WARNING;
        }
 
-       ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
-       if (!ret) {
-               if (uj) {
-                       json_object *json_no = NULL;
-                       json_no = json_object_new_object();
-                       json_object_string_add(json_no, "warning",
-                                              "Malformed Route Distinguisher");
-                       vty_out(vty, "%s\n",
-                               json_object_to_json_string(json_no));
-                       json_object_free(json_no);
-               } else
-                       vty_out(vty, "%% Malformed Route Distinguisher\n");
-               return CMD_WARNING;
+       argv_find(argv, argc, "all", &rd_all);
+       if (rd_all)
+               return show_adj_route_vpn(vty, peer, NULL, AFI_L2VPN, SAFI_EVPN,
+                                         uj);
+       else {
+               argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN",
+                         &idx_ext_community);
+               ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
+               if (!ret) {
+                       if (uj) {
+                               json_object *json_no = NULL;
+                               json_no = json_object_new_object();
+                               json_object_string_add(
+                                       json_no, "warning",
+                                       "Malformed Route Distinguisher");
+                               vty_out(vty, "%s\n",
+                                       json_object_to_json_string(json_no));
+                               json_object_free(json_no);
+                       } else
+                               vty_out(vty,
+                                       "%% Malformed Route Distinguisher\n");
+                       return CMD_WARNING;
+               }
        }
 
        return show_adj_route_vpn(vty, peer, &prd, AFI_L2VPN, SAFI_EVPN, uj);
@@ -1785,7 +1825,7 @@ DEFUN(show_ip_bgp_l2vpn_evpn_all_overlay,
 
 DEFUN(show_ip_bgp_evpn_rd_overlay,
       show_ip_bgp_evpn_rd_overlay_cmd,
-      "show [ip] bgp l2vpn evpn rd ASN:NN_OR_IP-ADDRESS:NN overlay",
+      "show [ip] bgp l2vpn evpn rd <ASN:NN_OR_IP-ADDRESS:NN|all> overlay",
       SHOW_STR
       IP_STR
       BGP_STR
@@ -1793,14 +1833,21 @@ DEFUN(show_ip_bgp_evpn_rd_overlay,
       EVPN_HELP_STR
       "Display information for a route distinguisher\n"
       "VPN Route Distinguisher\n"
+      "All VPN Route Distinguishers\n"
       "Display BGP Overlay Information for prefixes\n")
 {
        int idx_ext_community = 0;
        int ret;
        struct prefix_rd prd;
+       int rd_all = 0;
 
-       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
+       argv_find(argv, argc, "all", &rd_all);
+       if (rd_all)
+               return bgp_show_ethernet_vpn(vty, NULL, bgp_show_type_normal,
+                                            NULL, SHOW_DISPLAY_OVERLAY,
+                                            use_json(argc, argv));
 
+       argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN", &idx_ext_community);
        ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
        if (!ret) {
                vty_out(vty, "%% Malformed Route Distinguisher\n");
@@ -2698,6 +2745,130 @@ static void evpn_show_route_rd(struct vty *vty, struct bgp *bgp,
        }
 }
 
+/*
+ * Display BGP EVPN routing table -- all RDs and MAC and/or IP
+ * (vty handler).  Only matching type-2 routes will be displayed.
+ */
+static void evpn_show_route_rd_all_macip(struct vty *vty, struct bgp *bgp,
+                                        struct ethaddr *mac, struct ipaddr *ip,
+                                        json_object *json)
+{
+       struct bgp_dest *rd_dest;
+       struct bgp_table *table;
+       struct bgp_dest *dest;
+       struct bgp_path_info *pi;
+       afi_t afi = AFI_L2VPN;
+       safi_t safi = SAFI_EVPN;
+       uint32_t prefix_cnt, path_cnt;
+       prefix_cnt = path_cnt = 0;
+
+       /* EVPN routing table is a 2-level table with the first level being
+        * the RD. We need to look in every RD we know about.
+        */
+       for (rd_dest = bgp_table_top(bgp->rib[afi][safi]); rd_dest;
+            rd_dest = bgp_route_next(rd_dest)) {
+               json_object *json_paths = NULL;  /* paths array for prefix */
+               json_object *json_prefix = NULL; /* prefix within an RD */
+               json_object *json_rd = NULL;     /* holds all prefixes for RD */
+               char rd_str[RD_ADDRSTRLEN];
+               char prefix_str[BUFSIZ];
+               int add_rd_to_json = 0;
+               struct prefix_evpn ep;
+               const struct prefix *rd_destp = bgp_dest_get_prefix(rd_dest);
+
+               table = bgp_dest_get_bgp_table_info(rd_dest);
+               if (table == NULL)
+                       continue;
+
+               prefix_rd2str((struct prefix_rd *)rd_destp, rd_str,
+                             sizeof(rd_str));
+
+               /* Construct an RT-2 from the user-supplied mac(ip),
+                * then search the l2vpn evpn table for it.
+                */
+               build_evpn_type2_prefix(&ep, mac, ip);
+               dest = bgp_afi_node_lookup(bgp->rib[afi][safi], afi, safi,
+                                          (struct prefix *)&ep,
+                                          (struct prefix_rd *)rd_destp);
+               if (!dest)
+                       continue;
+
+               if (json)
+                       json_rd = json_object_new_object();
+
+               const struct prefix *p = bgp_dest_get_prefix(dest);
+
+               prefix2str(p, prefix_str, sizeof(prefix_str));
+
+               pi = bgp_dest_get_bgp_path_info(dest);
+               if (pi) {
+                       /* RD header - per RD. */
+                       bgp_evpn_show_route_rd_header(vty, rd_dest, json_rd,
+                                                     rd_str, RD_ADDRSTRLEN);
+                       prefix_cnt++;
+               }
+
+               if (json) {
+                       json_prefix = json_object_new_object();
+                       json_paths = json_object_new_array();
+                       json_object_string_add(json_prefix, "prefix",
+                                              prefix_str);
+                       json_object_int_add(json_prefix, "prefixLen",
+                                           p->prefixlen);
+               } else
+                       /* Prefix and num paths displayed once per prefix. */
+                       route_vty_out_detail_header(
+                               vty, bgp, dest, (struct prefix_rd *)rd_destp,
+                               AFI_L2VPN, SAFI_EVPN, json_prefix);
+
+               /* For EVPN, the prefix is displayed for each path (to
+                * fit in with code that already exists).
+                */
+               for (; pi; pi = pi->next) {
+                       json_object *json_path = NULL;
+
+                       add_rd_to_json = 1;
+                       path_cnt++;
+
+                       if (json)
+                               json_path = json_object_new_array();
+
+                       route_vty_out_detail(vty, bgp, dest, pi, AFI_L2VPN,
+                                            SAFI_EVPN, json_path);
+
+                       if (json)
+                               json_object_array_add(json_paths, json_path);
+                       else
+                               vty_out(vty, "\n");
+               }
+
+               if (json) {
+                       json_object_object_add(json_prefix, "paths",
+                                              json_paths);
+                       json_object_object_add(json_rd, prefix_str,
+                                              json_prefix);
+                       if (add_rd_to_json)
+                               json_object_object_add(json, rd_str, json_rd);
+                       else {
+                               json_object_free(json_rd);
+                               json_rd = NULL;
+                       }
+               }
+       }
+
+       if (json) {
+               json_object_int_add(json, "numPrefix", prefix_cnt);
+               json_object_int_add(json, "numPaths", path_cnt);
+       } else {
+               if (prefix_cnt == 0) {
+                       vty_out(vty, "No Matching EVPN prefixes exist\n");
+               } else {
+                       vty_out(vty, "Displayed %u prefixes (%u paths)\n",
+                               prefix_cnt, path_cnt);
+               }
+       }
+}
+
 /*
  * Display BGP EVPN routing table - all routes (vty handler).
  * If 'type' is non-zero, only routes matching that type are shown.
@@ -2810,6 +2981,7 @@ static void evpn_show_all_routes(struct vty *vty, struct bgp *bgp, int type,
                         */
                        for (; pi; pi = pi->next) {
                                json_object *json_path = NULL;
+
                                path_cnt++;
                                add_prefix_to_json = 1;
                                add_rd_to_json = 1;
@@ -4221,14 +4393,14 @@ DEFUN(show_bgp_l2vpn_evpn_route,
  */
 DEFUN(show_bgp_l2vpn_evpn_route_rd,
       show_bgp_l2vpn_evpn_route_rd_cmd,
-      "show bgp l2vpn evpn route rd ASN:NN_OR_IP-ADDRESS:NN [type "EVPN_TYPE_ALL_LIST"] [json]",
+      "show bgp l2vpn evpn route rd <ASN:NN_OR_IP-ADDRESS:NN|all> [type "EVPN_TYPE_ALL_LIST"] [json]",
       SHOW_STR
       BGP_STR
       L2VPN_HELP_STR
       EVPN_HELP_STR
       EVPN_RT_HELP_STR
       EVPN_RT_DIST_HELP_STR
-      EVPN_ASN_IP_HELP_STR
+      EVPN_ASN_IP_HELP_STR "All VPN Route Distinguishers\n"
       EVPN_TYPE_HELP_STR
       EVPN_TYPE_ALL_LIST_HELP_STR
       JSON_STR)
@@ -4237,9 +4409,10 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd,
        int ret;
        struct prefix_rd prd;
        int type = 0;
-       int rd_idx = 0;
        bool uj = false;
        json_object *json = NULL;
+       int idx_ext_community = 0;
+       int rd_all = 0;
 
        bgp = bgp_get_evpn();
        if (!bgp)
@@ -4250,10 +4423,12 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd,
        if (uj)
                json = json_object_new_object();
 
-       /* get the RD */
-       if (argv_find(argv, argc, "rd", &rd_idx)) {
-               ret = str2prefix_rd(argv[rd_idx + 1]->arg, &prd);
-
+       argv_find(argv, argc, "all", &rd_all);
+       if (!rd_all) {
+               /* get the RD */
+               argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN",
+                         &idx_ext_community);
+               ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
                if (!ret) {
                        vty_out(vty, "%% Malformed Route Distinguisher\n");
                        return CMD_WARNING;
@@ -4263,7 +4438,10 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd,
        if (bgp_evpn_cli_parse_type(&type, argv, argc) < 0)
                return CMD_WARNING;
 
-       evpn_show_route_rd(vty, bgp, &prd, type, json);
+       if (rd_all)
+               evpn_show_all_routes(vty, bgp, type, json, 1);
+       else
+               evpn_show_route_rd(vty, bgp, &prd, type, json);
 
        if (uj) {
                vty_out(vty, "%s\n", json_object_to_json_string_ext(
@@ -4279,14 +4457,14 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd,
  */
 DEFUN(show_bgp_l2vpn_evpn_route_rd_macip,
       show_bgp_l2vpn_evpn_route_rd_macip_cmd,
-      "show bgp l2vpn evpn route rd ASN:NN_OR_IP-ADDRESS:NN mac WORD [ip WORD] [json]",
+      "show bgp l2vpn evpn route rd <ASN:NN_OR_IP-ADDRESS:NN|all> mac WORD [ip WORD] [json]",
       SHOW_STR
       BGP_STR
       L2VPN_HELP_STR
       EVPN_HELP_STR
       EVPN_RT_HELP_STR
       EVPN_RT_DIST_HELP_STR
-      EVPN_ASN_IP_HELP_STR
+      EVPN_ASN_IP_HELP_STR "All VPN Route Distinguishers\n"
       "MAC\n"
       "MAC address (e.g., 00:e0:ec:20:12:62)\n"
       "IP\n"
@@ -4298,11 +4476,12 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd_macip,
        struct prefix_rd prd;
        struct ethaddr mac;
        struct ipaddr ip;
-       int rd_idx = 0;
+       int idx_ext_community = 0;
        int mac_idx = 0;
        int ip_idx = 0;
        bool uj = false;
        json_object *json = NULL;
+       int rd_all = 0;
 
        memset(&mac, 0, sizeof(struct ethaddr));
        memset(&ip, 0, sizeof(struct ipaddr));
@@ -4317,8 +4496,11 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd_macip,
                json = json_object_new_object();
 
        /* get the prd */
-       if (argv_find(argv, argc, "rd", &rd_idx)) {
-               ret = str2prefix_rd(argv[rd_idx + 1]->arg, &prd);
+       argv_find(argv, argc, "all", &rd_all);
+       if (!rd_all) {
+               argv_find(argv, argc, "ASN:NN_OR_IP-ADDRESS:NN",
+                         &idx_ext_community);
+               ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
                if (!ret) {
                        vty_out(vty, "%% Malformed Route Distinguisher\n");
                        return CMD_WARNING;
@@ -4341,7 +4523,10 @@ DEFUN(show_bgp_l2vpn_evpn_route_rd_macip,
                }
        }
 
-       evpn_show_route_rd_macip(vty, bgp, &prd, &mac, &ip, json);
+       if (rd_all)
+               evpn_show_route_rd_all_macip(vty, bgp, &mac, &ip, json);
+       else
+               evpn_show_route_rd_macip(vty, bgp, &prd, &mac, &ip, json);
 
        if (uj) {
                vty_out(vty, "%s\n", json_object_to_json_string_ext(
index d9acda8bd013861d849496ac42480461ef0a6c97..59c1561c5ac36166cec884d8fb948f4d24620567 100644 (file)
@@ -2043,7 +2043,7 @@ int bgp_show_mpls_vpn(struct vty *vty, afi_t afi, struct prefix_rd *prd,
 
 DEFUN (show_bgp_ip_vpn_all_rd,
        show_bgp_ip_vpn_all_rd_cmd,
-       "show bgp "BGP_AFI_CMD_STR" vpn all [rd ASN:NN_OR_IP-ADDRESS:NN] [json]",
+       "show bgp "BGP_AFI_CMD_STR" vpn all [rd <ASN:NN_OR_IP-ADDRESS:NN|all>] [json]",
        SHOW_STR
        BGP_STR
        BGP_VPNVX_HELP_STR
@@ -2051,6 +2051,7 @@ DEFUN (show_bgp_ip_vpn_all_rd,
        "Display VPN NLRI specific information\n"
        "Display information for a route distinguisher\n"
        "VPN Route Distinguisher\n"
+       "All VPN Route Distinguishers\n"
        JSON_STR)
 {
        int ret;
@@ -2059,7 +2060,9 @@ DEFUN (show_bgp_ip_vpn_all_rd,
        int idx = 0;
 
        if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
-               if (argv_find(argv, argc, "rd", &idx)) {
+               /* Constrain search if user supplies RD && RD != "all" */
+               if (argv_find(argv, argc, "rd", &idx)
+                   && strcmp(argv[idx + 1]->arg, "all")) {
                        ret = str2prefix_rd(argv[idx + 1]->arg, &prd);
                        if (!ret) {
                                vty_out(vty,
@@ -2080,26 +2083,27 @@ DEFUN (show_bgp_ip_vpn_all_rd,
 
 ALIAS(show_bgp_ip_vpn_all_rd,
       show_bgp_ip_vpn_rd_cmd,
-       "show bgp "BGP_AFI_CMD_STR" vpn rd ASN:NN_OR_IP-ADDRESS:NN [json]",
+       "show bgp "BGP_AFI_CMD_STR" vpn rd <ASN:NN_OR_IP-ADDRESS:NN|all> [json]",
        SHOW_STR
        BGP_STR
        BGP_VPNVX_HELP_STR
        "Display VPN NLRI specific information\n"
        "Display information for a route distinguisher\n"
        "VPN Route Distinguisher\n"
+       "All VPN Route Distinguishers\n"
        JSON_STR)
 
 #ifdef KEEP_OLD_VPN_COMMANDS
 DEFUN (show_ip_bgp_vpn_rd,
        show_ip_bgp_vpn_rd_cmd,
-       "show ip bgp "BGP_AFI_CMD_STR" vpn rd ASN:NN_OR_IP-ADDRESS:NN",
+       "show ip bgp "BGP_AFI_CMD_STR" vpn rd <ASN:NN_OR_IP-ADDRESS:NN|all>",
        SHOW_STR
        IP_STR
        BGP_STR
        BGP_AFI_HELP_STR
        "Address Family modifier\n"
        "Display information for a route distinguisher\n"
-       "VPN Route Distinguisher\n")
+       "VPN Route Distinguisher\n" "All VPN Route Distinguishers\n")
 {
        int idx_ext_community = argc - 1;
        int ret;
@@ -2108,6 +2112,10 @@ DEFUN (show_ip_bgp_vpn_rd,
        int idx = 0;
 
        if (argv_find_and_parse_vpnvx(argv, argc, &idx, &afi)) {
+               if (!strcmp(argv[idx_ext_community]->arg, "all"))
+                       return bgp_show_mpls_vpn(vty, afi, NULL,
+                                                bgp_show_type_normal, NULL, 0,
+                                                0);
                ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
                if (!ret) {
                        vty_out(vty, "%% Malformed Route Distinguisher\n");
@@ -2157,13 +2165,14 @@ DEFUN (show_ip_bgp_vpn_all_tags,
 
 DEFUN (show_ip_bgp_vpn_rd_tags,
        show_ip_bgp_vpn_rd_tags_cmd,
-       "show [ip] bgp <vpnv4|vpnv6> rd ASN:NN_OR_IP-ADDRESS:NN tags",
+       "show [ip] bgp <vpnv4|vpnv6> rd <ASN:NN_OR_IP-ADDRESS:NN|all> tags",
        SHOW_STR
        IP_STR
        BGP_STR
        BGP_VPNVX_HELP_STR
        "Display information for a route distinguisher\n"
        "VPN Route Distinguisher\n"
+       "All VPN Route Distinguishers\n"
        "Display BGP tags for prefixes\n")
 {
        int idx_ext_community = 5;
@@ -2173,6 +2182,10 @@ DEFUN (show_ip_bgp_vpn_rd_tags,
        int idx = 0;
 
        if (argv_find_and_parse_vpnvx(argv, argc, &idx, &afi)) {
+               if (!strcmp(argv[idx_ext_community]->arg, "all"))
+                       return bgp_show_mpls_vpn(vty, afi, NULL,
+                                                bgp_show_type_normal, NULL, 1,
+                                                0);
                ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
                if (!ret) {
                        vty_out(vty, "%% Malformed Route Distinguisher\n");
@@ -2247,13 +2260,14 @@ DEFUN (show_ip_bgp_vpn_all_neighbor_routes,
 
 DEFUN (show_ip_bgp_vpn_rd_neighbor_routes,
        show_ip_bgp_vpn_rd_neighbor_routes_cmd,
-       "show [ip] bgp <vpnv4|vpnv6> rd ASN:NN_OR_IP-ADDRESS:NN neighbors A.B.C.D routes [json]",
+       "show [ip] bgp <vpnv4|vpnv6> rd <ASN:NN_OR_IP-ADDRESS:NN|all> neighbors A.B.C.D routes [json]",
        SHOW_STR
        IP_STR
        BGP_STR
        BGP_VPNVX_HELP_STR
        "Display information for a route distinguisher\n"
        "VPN Route Distinguisher\n"
+       "All VPN Route Distinguishers\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Display routes learned from neighbor\n"
@@ -2265,26 +2279,32 @@ DEFUN (show_ip_bgp_vpn_rd_neighbor_routes,
        union sockunion su;
        struct peer *peer;
        struct prefix_rd prd;
+       bool prefix_rd_all = false;
        bool uj = use_json(argc, argv);
        afi_t afi;
        int idx = 0;
 
        if (argv_find_and_parse_vpnvx(argv, argc, &idx, &afi)) {
-               ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
-               if (!ret) {
-                       if (uj) {
-                               json_object *json_no = NULL;
-                               json_no = json_object_new_object();
-                               json_object_string_add(
-                                       json_no, "warning",
-                                       "Malformed Route Distinguisher");
-                               vty_out(vty, "%s\n",
-                                       json_object_to_json_string(json_no));
-                               json_object_free(json_no);
-                       } else
-                               vty_out(vty,
-                                       "%% Malformed Route Distinguisher\n");
-                       return CMD_WARNING;
+               if (!strcmp(argv[idx_ext_community]->arg, "all"))
+                       prefix_rd_all = true;
+               else {
+                       ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
+                       if (!ret) {
+                               if (uj) {
+                                       json_object *json_no = NULL;
+                                       json_no = json_object_new_object();
+                                       json_object_string_add(
+                                               json_no, "warning",
+                                               "Malformed Route Distinguisher");
+                                       vty_out(vty, "%s\n",
+                                               json_object_to_json_string(
+                                                       json_no));
+                                       json_object_free(json_no);
+                               } else
+                                       vty_out(vty,
+                                               "%% Malformed Route Distinguisher\n");
+                               return CMD_WARNING;
+                       }
                }
 
                ret = str2sockunion(argv[idx_ipv4]->arg, &su);
@@ -2320,8 +2340,14 @@ DEFUN (show_ip_bgp_vpn_rd_neighbor_routes,
                        return CMD_WARNING;
                }
 
-               return bgp_show_mpls_vpn(vty, afi, &prd, bgp_show_type_neighbor,
-                                        &su, 0, uj);
+               if (prefix_rd_all)
+                       return bgp_show_mpls_vpn(vty, afi, NULL,
+                                                bgp_show_type_neighbor, &su, 0,
+                                                uj);
+               else
+                       return bgp_show_mpls_vpn(vty, afi, &prd,
+                                                bgp_show_type_neighbor, &su, 0,
+                                                uj);
        }
        return CMD_SUCCESS;
 }
@@ -2387,13 +2413,14 @@ DEFUN (show_ip_bgp_vpn_all_neighbor_advertised_routes,
 
 DEFUN (show_ip_bgp_vpn_rd_neighbor_advertised_routes,
        show_ip_bgp_vpn_rd_neighbor_advertised_routes_cmd,
-       "show [ip] bgp <vpnv4|vpnv6> rd ASN:NN_OR_IP-ADDRESS:NN neighbors A.B.C.D advertised-routes [json]",
+       "show [ip] bgp <vpnv4|vpnv6> rd <ASN:NN_OR_IP-ADDRESS:NN|all> neighbors A.B.C.D advertised-routes [json]",
        SHOW_STR
        IP_STR
        BGP_STR
        BGP_VPNVX_HELP_STR
        "Display information for a route distinguisher\n"
        "VPN Route Distinguisher\n"
+       "All VPN Route Distinguishers\n"
        "Detailed information on TCP and BGP neighbor connections\n"
        "Neighbor to display information about\n"
        "Display the routes advertised to a BGP neighbor\n"
@@ -2442,6 +2469,9 @@ DEFUN (show_ip_bgp_vpn_rd_neighbor_advertised_routes,
                        return CMD_WARNING;
                }
 
+               if (!strcmp(argv[idx_ext_community]->arg, "all"))
+                       return show_adj_route_vpn(vty, peer, NULL, AFI_IP,
+                                                 SAFI_MPLS_VPN, uj);
                ret = str2prefix_rd(argv[idx_ext_community]->arg, &prd);
                if (!ret) {
                        if (uj) {
index 87fd5f28ca5296fcd9d12b106d067d19488ab93e..b3c6fbff8f58a6380196de16eea2a1ecd957e53a 100644 (file)
@@ -13824,13 +13824,14 @@ struct bgp_distance {
 
 DEFUN (show_bgp_afi_vpn_rd_route,
        show_bgp_afi_vpn_rd_route_cmd,
-       "show bgp "BGP_AFI_CMD_STR" vpn rd ASN:NN_OR_IP-ADDRESS:NN <A.B.C.D/M|X:X::X:X/M> [json]",
+       "show bgp "BGP_AFI_CMD_STR" vpn rd <ASN:NN_OR_IP-ADDRESS:NN|all> <A.B.C.D/M|X:X::X:X/M> [json]",
        SHOW_STR
        BGP_STR
        BGP_AFI_HELP_STR
        "Address Family modifier\n"
        "Display information for a route distinguisher\n"
        "Route Distinguisher\n"
+       "All Route Distinguishers\n"
        "Network in the BGP routing table to display\n"
        "Network in the BGP routing table to display\n"
        JSON_STR)
@@ -13845,6 +13846,11 @@ DEFUN (show_bgp_afi_vpn_rd_route,
                return CMD_WARNING;
        }
 
+       if (!strcmp(argv[5]->arg, "all"))
+               return bgp_show_route(vty, NULL, argv[6]->arg, afi,
+                                     SAFI_MPLS_VPN, NULL, 0, BGP_PATH_SHOW_ALL,
+                                     use_json(argc, argv));
+
        ret = str2prefix_rd(argv[5]->arg, &prd);
        if (!ret) {
                vty_out(vty, "%% Malformed Route Distinguisher\n");