]> git.puffer.fish Git - mirror/frr.git/commitdiff
eigrpd: Fix `show ip eigrp vrf all topology` to actually work
authorDonald Sharp <sharpd@cumulusnetworks.com>
Sat, 29 Aug 2020 16:57:28 +0000 (12:57 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 31 Aug 2020 12:46:17 +0000 (08:46 -0400)
Fix multiple forms of this command to behave appropriately
when `vrf all` is specified.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
eigrpd/eigrp_vty.c

index e4a499425b832883c66a3b565f679575a190b44d..9512f03f18fe3d6351a4194e9d438c0161bd3fdc 100644 (file)
@@ -101,6 +101,24 @@ static struct eigrp *eigrp_vty_get_eigrp(struct vty *vty, const char *vrf_name)
        return eigrp_lookup(vrf->vrf_id);
 }
 
+static void eigrp_topology_helper(struct vty *vty, struct eigrp *eigrp,
+                                 const char *all)
+{
+       struct eigrp_prefix_entry *tn;
+       struct route_node *rn;
+
+       show_ip_eigrp_topology_header(vty, eigrp);
+
+       for (rn = route_top(eigrp->topology_table); rn; rn = route_next(rn)) {
+               if (!rn->info)
+                       continue;
+
+               tn = rn->info;
+               eigrp_vty_display_prefix_entry(vty, eigrp, tn,
+                                              all ? true : false);
+       }
+}
+
 DEFPY (show_ip_eigrp_topology_all,
        show_ip_eigrp_topology_all_cmd,
        "show ip eigrp [vrf NAME] topology [all-links$all]",
@@ -112,28 +130,30 @@ DEFPY (show_ip_eigrp_topology_all,
        "Show all links in topology table\n")
 {
        struct eigrp *eigrp;
-       struct eigrp_prefix_entry *tn;
-       struct route_node *rn;
 
-       eigrp = eigrp_vty_get_eigrp(vty, vrf);
-       if (eigrp == NULL) {
-               vty_out(vty, " EIGRP Routing Process not enabled\n");
-               return CMD_SUCCESS;
-       }
+       if (vrf && strncmp(vrf, "all", sizeof("all")) == 0) {
+               struct vrf *v;
 
-       show_ip_eigrp_topology_header(vty, eigrp);
+               RB_FOREACH (v, vrf_name_head, &vrfs_by_name) {
+                       eigrp = eigrp_lookup(v->vrf_id);
+                       if (!eigrp)
+                               continue;
 
-       for (rn = route_top(eigrp->topology_table); rn; rn = route_next(rn)) {
-               if (!rn->info)
-                       continue;
+                       vty_out(vty, "VRF %s:\n", v->name);
 
-               tn = rn->info;
-               eigrp_vty_display_prefix_entry(vty, eigrp, tn,
-                                              all ? true : false);
+                       eigrp_topology_helper(vty, eigrp, all);
+               }
+       } else {
+               eigrp = eigrp_vty_get_eigrp(vty, vrf);
+               if (eigrp == NULL) {
+                       vty_out(vty, " EIGRP Routing Process not enabled\n");
+                       return CMD_SUCCESS;
+               }
+
+               eigrp_topology_helper(vty, eigrp, all);
        }
 
        return CMD_SUCCESS;
-
 }
 
 DEFPY (show_ip_eigrp_topology,
@@ -152,6 +172,11 @@ DEFPY (show_ip_eigrp_topology,
        struct route_node *rn;
        struct prefix cmp;
 
+       if (vrf && strncmp(vrf, "all", sizeof("all")) == 0) {
+               vty_out(vty, "Specifying vrf `all` for a particular address/prefix makes no sense\n");
+               return CMD_SUCCESS;
+       }
+
        eigrp = eigrp_vty_get_eigrp(vty, vrf);
        if (eigrp == NULL) {
                vty_out(vty, " EIGRP Routing Process not enabled\n");