summaryrefslogtreecommitdiff
path: root/eigrpd/eigrp_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'eigrpd/eigrp_vty.c')
-rw-r--r--eigrpd/eigrp_vty.c156
1 files changed, 112 insertions, 44 deletions
diff --git a/eigrpd/eigrp_vty.c b/eigrpd/eigrp_vty.c
index e4a499425b..4426cf67e9 100644
--- a/eigrpd/eigrp_vty.c
+++ b/eigrpd/eigrp_vty.c
@@ -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");
@@ -187,6 +212,24 @@ DEFPY (show_ip_eigrp_topology,
return CMD_SUCCESS;
}
+static void eigrp_interface_helper(struct vty *vty, struct eigrp *eigrp,
+ const char *ifname, const char *detail)
+{
+ struct eigrp_interface *ei;
+ struct listnode *node;
+
+ if (!ifname)
+ show_ip_eigrp_interface_header(vty, eigrp);
+
+ for (ALL_LIST_ELEMENTS_RO(eigrp->eiflist, node, ei)) {
+ if (!ifname || strcmp(ei->ifp->name, ifname) == 0) {
+ show_ip_eigrp_interface_sub(vty, eigrp, ei);
+ if (detail)
+ show_ip_eigrp_interface_detail(vty, eigrp, ei);
+ }
+ }
+}
+
DEFPY (show_ip_eigrp_interfaces,
show_ip_eigrp_interfaces_cmd,
"show ip eigrp [vrf NAME] interfaces [IFNAME] [detail]$detail",
@@ -198,28 +241,52 @@ DEFPY (show_ip_eigrp_interfaces,
"Interface name to look at\n"
"Detailed information\n")
{
- struct eigrp_interface *ei;
struct eigrp *eigrp;
- struct listnode *node;
- 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 *vrf;
+
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ eigrp = eigrp_lookup(vrf->vrf_id);
+ if (!eigrp)
+ continue;
+
+ vty_out(vty, "VRF %s:\n", vrf->name);
+
+ eigrp_interface_helper(vty, eigrp, ifname, detail);
+ }
+ } else {
+ eigrp = eigrp_vty_get_eigrp(vty, vrf);
+ if (eigrp == NULL) {
+ vty_out(vty, "EIGRP Routing Process not enabled\n");
+ return CMD_SUCCESS;
+ }
+
+ eigrp_interface_helper(vty, eigrp, ifname, detail);
}
- if (!ifname)
- show_ip_eigrp_interface_header(vty, eigrp);
+
+ return CMD_SUCCESS;
+}
+
+static void eigrp_neighbors_helper(struct vty *vty, struct eigrp *eigrp,
+ const char *ifname, const char *detail)
+{
+ struct eigrp_interface *ei;
+ struct listnode *node, *node2, *nnode2;
+ struct eigrp_neighbor *nbr;
+
+ show_ip_eigrp_neighbor_header(vty, eigrp);
for (ALL_LIST_ELEMENTS_RO(eigrp->eiflist, node, ei)) {
if (!ifname || strcmp(ei->ifp->name, ifname) == 0) {
- show_ip_eigrp_interface_sub(vty, eigrp, ei);
- if (detail)
- show_ip_eigrp_interface_detail(vty, eigrp, ei);
+ for (ALL_LIST_ELEMENTS(ei->nbrs, node2, nnode2, nbr)) {
+ if (detail || (nbr->state == EIGRP_NEIGHBOR_UP))
+ show_ip_eigrp_neighbor_sub(vty, nbr,
+ !!detail);
+ }
}
}
-
- return CMD_SUCCESS;
}
DEFPY (show_ip_eigrp_neighbors,
@@ -234,26 +301,27 @@ DEFPY (show_ip_eigrp_neighbors,
"Detailed Information\n")
{
struct eigrp *eigrp;
- struct eigrp_interface *ei;
- struct listnode *node, *node2, *nnode2;
- struct eigrp_neighbor *nbr;
- 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 *vrf;
- show_ip_eigrp_neighbor_header(vty, eigrp);
+ RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
+ eigrp = eigrp_lookup(vrf->vrf_id);
+ if (!eigrp)
+ continue;
- for (ALL_LIST_ELEMENTS_RO(eigrp->eiflist, node, ei)) {
- if (!ifname || strcmp(ei->ifp->name, ifname) == 0) {
- for (ALL_LIST_ELEMENTS(ei->nbrs, node2, nnode2, nbr)) {
- if (detail || (nbr->state == EIGRP_NEIGHBOR_UP))
- show_ip_eigrp_neighbor_sub(vty, nbr,
- !!detail);
- }
+ vty_out(vty, "VRF %s:\n", vrf->name);
+
+ eigrp_neighbors_helper(vty, eigrp, ifname, detail);
+ }
+ } else {
+ eigrp = eigrp_vty_get_eigrp(vty, vrf);
+ if (eigrp == NULL) {
+ vty_out(vty, " EIGRP Routing Process not enabled\n");
+ return CMD_SUCCESS;
}
+
+ eigrp_neighbors_helper(vty, eigrp, ifname, detail);
}
return CMD_SUCCESS;