3 * Copyright (C) 2013-2016
15 * This file is part of GNU Zebra.
17 * GNU Zebra is free software; you can redistribute it and/or modify it
18 * under the terms of the GNU General Public License as published by the
19 * Free Software Foundation; either version 2, or (at your option) any
22 * GNU Zebra is distributed in the hope that it will be useful, but
23 * WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * General Public License for more details.
27 * You should have received a copy of the GNU General Public License along
28 * with this program; see the file COPYING; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
45 #include "distribute.h"
47 #include "eigrpd/eigrp_structs.h"
48 #include "eigrpd/eigrpd.h"
49 #include "eigrpd/eigrp_interface.h"
50 #include "eigrpd/eigrp_neighbor.h"
51 #include "eigrpd/eigrp_packet.h"
52 #include "eigrpd/eigrp_zebra.h"
53 #include "eigrpd/eigrp_vty.h"
54 #include "eigrpd/eigrp_network.h"
55 #include "eigrpd/eigrp_dump.h"
56 #include "eigrpd/eigrp_const.h"
58 #ifndef VTYSH_EXTRACT_PL
59 #include "eigrpd/eigrp_vty_clippy.c"
62 static void eigrp_vty_display_prefix_entry(struct vty
*vty
,
64 struct eigrp_prefix_entry
*pe
,
68 struct eigrp_nexthop_entry
*te
;
69 struct listnode
*node
;
71 for (ALL_LIST_ELEMENTS_RO(pe
->entries
, node
, te
)) {
74 & EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG
)
75 == EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG
)
77 & EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG
)
78 == EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG
))) {
79 show_ip_eigrp_nexthop_entry(vty
, eigrp
, te
,
86 static struct eigrp
*eigrp_vty_get_eigrp(struct vty
*vty
, const char *vrf_name
)
91 vrf
= vrf_lookup_by_name(vrf_name
);
93 vrf
= vrf_lookup_by_id(VRF_DEFAULT
);
96 vty_out(vty
, "VRF %s specified does not exist",
97 vrf_name
? vrf_name
: VRF_DEFAULT_NAME
);
101 return eigrp_lookup(vrf
->vrf_id
);
104 DEFPY (show_ip_eigrp_topology_all
,
105 show_ip_eigrp_topology_all_cmd
,
106 "show ip eigrp [vrf NAME] topology [all-links$all]",
109 "IP-EIGRP show commands\n"
111 "IP-EIGRP topology\n"
112 "Show all links in topology table\n")
115 struct eigrp_prefix_entry
*tn
;
116 struct route_node
*rn
;
118 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
120 vty_out(vty
, " EIGRP Routing Process not enabled\n");
124 show_ip_eigrp_topology_header(vty
, eigrp
);
126 for (rn
= route_top(eigrp
->topology_table
); rn
; rn
= route_next(rn
)) {
131 eigrp_vty_display_prefix_entry(vty
, eigrp
, tn
,
139 DEFPY (show_ip_eigrp_topology
,
140 show_ip_eigrp_topology_cmd
,
141 "show ip eigrp [vrf NAME] topology <A.B.C.D$address|A.B.C.D/M$prefix>",
144 "IP-EIGRP show commands\n"
146 "IP-EIGRP topology\n"
147 "For a specific address\n"
148 "For a specific prefix\n")
151 struct eigrp_prefix_entry
*tn
;
152 struct route_node
*rn
;
155 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
157 vty_out(vty
, " EIGRP Routing Process not enabled\n");
161 show_ip_eigrp_topology_header(vty
, eigrp
);
164 prefix_str
= address_str
;
166 if (str2prefix(prefix_str
, &cmp
) < 0) {
167 vty_out(vty
, "%% Malformed address\n");
171 rn
= route_node_match(eigrp
->topology_table
, &cmp
);
173 vty_out(vty
, "%% Network not in table\n");
178 vty_out(vty
, "%% Network not in table\n");
179 route_unlock_node(rn
);
184 eigrp_vty_display_prefix_entry(vty
, eigrp
, tn
, argc
== 5);
186 route_unlock_node(rn
);
190 DEFPY (show_ip_eigrp_interfaces
,
191 show_ip_eigrp_interfaces_cmd
,
192 "show ip eigrp [vrf NAME] interfaces [IFNAME] [detail]$detail",
195 "IP-EIGRP show commands\n"
197 "IP-EIGRP interfaces\n"
198 "Interface name to look at\n"
199 "Detailed information\n")
201 struct eigrp_interface
*ei
;
203 struct listnode
*node
;
205 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
207 vty_out(vty
, "EIGRP Routing Process not enabled\n");
212 show_ip_eigrp_interface_header(vty
, eigrp
);
214 for (ALL_LIST_ELEMENTS_RO(eigrp
->eiflist
, node
, ei
)) {
215 if (!ifname
|| strcmp(ei
->ifp
->name
, ifname
) == 0) {
216 show_ip_eigrp_interface_sub(vty
, eigrp
, ei
);
218 show_ip_eigrp_interface_detail(vty
, eigrp
, ei
);
225 DEFPY (show_ip_eigrp_neighbors
,
226 show_ip_eigrp_neighbors_cmd
,
227 "show ip eigrp [vrf NAME] neighbors [IFNAME] [detail]$detail",
230 "IP-EIGRP show commands\n"
232 "IP-EIGRP neighbors\n"
233 "Interface to show on\n"
234 "Detailed Information\n")
237 struct eigrp_interface
*ei
;
238 struct listnode
*node
, *node2
, *nnode2
;
239 struct eigrp_neighbor
*nbr
;
241 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
243 vty_out(vty
, " EIGRP Routing Process not enabled\n");
247 show_ip_eigrp_neighbor_header(vty
, eigrp
);
249 for (ALL_LIST_ELEMENTS_RO(eigrp
->eiflist
, node
, ei
)) {
250 if (!ifname
|| strcmp(ei
->ifp
->name
, ifname
) == 0) {
251 for (ALL_LIST_ELEMENTS(ei
->nbrs
, node2
, nnode2
, nbr
)) {
252 if (detail
|| (nbr
->state
== EIGRP_NEIGHBOR_UP
))
253 show_ip_eigrp_neighbor_sub(vty
, nbr
,
263 * Execute hard restart for all neighbors
265 DEFPY (clear_ip_eigrp_neighbors
,
266 clear_ip_eigrp_neighbors_cmd
,
267 "clear ip eigrp [vrf NAME] neighbors",
272 "Clear IP-EIGRP neighbors\n")
275 struct eigrp_interface
*ei
;
276 struct listnode
*node
, *node2
, *nnode2
;
277 struct eigrp_neighbor
*nbr
;
279 /* Check if eigrp process is enabled */
280 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
282 vty_out(vty
, " EIGRP Routing Process not enabled\n");
286 /* iterate over all eigrp interfaces */
287 for (ALL_LIST_ELEMENTS_RO(eigrp
->eiflist
, node
, ei
)) {
288 /* send Goodbye Hello */
289 eigrp_hello_send(ei
, EIGRP_HELLO_GRACEFUL_SHUTDOWN
, NULL
);
291 /* iterate over all neighbors on eigrp interface */
292 for (ALL_LIST_ELEMENTS(ei
->nbrs
, node2
, nnode2
, nbr
)) {
293 if (nbr
->state
!= EIGRP_NEIGHBOR_DOWN
) {
295 "Neighbor %s (%s) is down: manually cleared",
297 ifindex2ifname(nbr
->ei
->ifp
->ifindex
,
299 vty_time_print(vty
, 0);
301 "Neighbor %s (%s) is down: manually cleared\n",
303 ifindex2ifname(nbr
->ei
->ifp
->ifindex
,
306 /* set neighbor to DOWN */
307 nbr
->state
= EIGRP_NEIGHBOR_DOWN
;
308 /* delete neighbor */
309 eigrp_nbr_delete(nbr
);
318 * Execute hard restart for all neighbors on interface
320 DEFPY (clear_ip_eigrp_neighbors_int
,
321 clear_ip_eigrp_neighbors_int_cmd
,
322 "clear ip eigrp [vrf NAME] neighbors IFNAME",
327 "Clear IP-EIGRP neighbors\n"
328 "Interface's name\n")
331 struct eigrp_interface
*ei
;
332 struct listnode
*node2
, *nnode2
;
333 struct eigrp_neighbor
*nbr
;
335 /* Check if eigrp process is enabled */
336 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
338 vty_out(vty
, " EIGRP Routing Process not enabled\n");
342 /* lookup interface by specified name */
343 ei
= eigrp_if_lookup_by_name(eigrp
, ifname
);
345 vty_out(vty
, " Interface (%s) doesn't exist\n", ifname
);
349 /* send Goodbye Hello */
350 eigrp_hello_send(ei
, EIGRP_HELLO_GRACEFUL_SHUTDOWN
, NULL
);
352 /* iterate over all neighbors on eigrp interface */
353 for (ALL_LIST_ELEMENTS(ei
->nbrs
, node2
, nnode2
, nbr
)) {
354 if (nbr
->state
!= EIGRP_NEIGHBOR_DOWN
) {
355 zlog_debug("Neighbor %s (%s) is down: manually cleared",
357 ifindex2ifname(nbr
->ei
->ifp
->ifindex
,
359 vty_time_print(vty
, 0);
361 "Neighbor %s (%s) is down: manually cleared\n",
363 ifindex2ifname(nbr
->ei
->ifp
->ifindex
,
366 /* set neighbor to DOWN */
367 nbr
->state
= EIGRP_NEIGHBOR_DOWN
;
368 /* delete neighbor */
369 eigrp_nbr_delete(nbr
);
377 * Execute hard restart for neighbor specified by IP
379 DEFPY (clear_ip_eigrp_neighbors_IP
,
380 clear_ip_eigrp_neighbors_IP_cmd
,
381 "clear ip eigrp [vrf NAME] neighbors A.B.C.D$nbr_addr",
386 "Clear IP-EIGRP neighbors\n"
387 "IP-EIGRP neighbor address\n")
390 struct eigrp_neighbor
*nbr
;
392 /* Check if eigrp process is enabled */
393 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
395 vty_out(vty
, " EIGRP Routing Process not enabled\n");
399 /* lookup neighbor in whole process */
400 nbr
= eigrp_nbr_lookup_by_addr_process(eigrp
, nbr_addr
);
402 /* if neighbor doesn't exists, notify user and exit */
404 vty_out(vty
, "Neighbor with entered address doesn't exists.\n");
408 /* execute hard reset on neighbor */
409 eigrp_nbr_hard_restart(nbr
, vty
);
415 * Execute graceful restart for all neighbors
417 DEFPY (clear_ip_eigrp_neighbors_soft
,
418 clear_ip_eigrp_neighbors_soft_cmd
,
419 "clear ip eigrp [vrf NAME] neighbors soft",
424 "Clear IP-EIGRP neighbors\n"
425 "Resync with peers without adjacency reset\n")
429 /* Check if eigrp process is enabled */
430 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
432 vty_out(vty
, " EIGRP Routing Process not enabled\n");
436 /* execute graceful restart on all neighbors */
437 eigrp_update_send_process_GR(eigrp
, EIGRP_GR_MANUAL
, vty
);
443 * Execute graceful restart for all neighbors on interface
445 DEFPY (clear_ip_eigrp_neighbors_int_soft
,
446 clear_ip_eigrp_neighbors_int_soft_cmd
,
447 "clear ip eigrp [vrf NAME] neighbors IFNAME soft",
452 "Clear IP-EIGRP neighbors\n"
454 "Resync with peer without adjacency reset\n")
457 struct eigrp_interface
*ei
;
459 /* Check if eigrp process is enabled */
460 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
462 vty_out(vty
, " EIGRP Routing Process not enabled\n");
466 /* lookup interface by specified name */
467 ei
= eigrp_if_lookup_by_name(eigrp
, ifname
);
469 vty_out(vty
, " Interface (%s) doesn't exist\n", argv
[4]->arg
);
473 /* execute graceful restart for all neighbors on interface */
474 eigrp_update_send_interface_GR(ei
, EIGRP_GR_MANUAL
, vty
);
479 * Execute graceful restart for neighbor specified by IP
481 DEFPY (clear_ip_eigrp_neighbors_IP_soft
,
482 clear_ip_eigrp_neighbors_IP_soft_cmd
,
483 "clear ip eigrp [vrf NAME] neighbors A.B.C.D$nbr_addr soft",
488 "Clear IP-EIGRP neighbors\n"
489 "IP-EIGRP neighbor address\n"
490 "Resync with peer without adjacency reset\n")
493 struct eigrp_neighbor
*nbr
;
496 /* Check if eigrp process is enabled */
497 eigrp
= eigrp_vty_get_eigrp(vty
, vrf
);
499 vty_out(vty
, " EIGRP Routing Process not enabled\n");
503 /* lookup neighbor in whole process */
504 nbr
= eigrp_nbr_lookup_by_addr_process(eigrp
, nbr_addr
);
506 /* if neighbor doesn't exists, notify user and exit */
508 vty_out(vty
, "Neighbor with entered address doesn't exists.\n");
512 /* execute graceful restart on neighbor */
513 eigrp_update_send_GR(nbr
, EIGRP_GR_MANUAL
, vty
);
518 void eigrp_vty_show_init(void)
520 install_element(VIEW_NODE
, &show_ip_eigrp_interfaces_cmd
);
522 install_element(VIEW_NODE
, &show_ip_eigrp_neighbors_cmd
);
524 install_element(VIEW_NODE
, &show_ip_eigrp_topology_cmd
);
525 install_element(VIEW_NODE
, &show_ip_eigrp_topology_all_cmd
);
528 /* Install EIGRP related vty commands. */
529 void eigrp_vty_init(void)
531 /* commands for manual hard restart */
532 install_element(ENABLE_NODE
, &clear_ip_eigrp_neighbors_cmd
);
533 install_element(ENABLE_NODE
, &clear_ip_eigrp_neighbors_int_cmd
);
534 install_element(ENABLE_NODE
, &clear_ip_eigrp_neighbors_IP_cmd
);
535 /* commands for manual graceful restart */
536 install_element(ENABLE_NODE
, &clear_ip_eigrp_neighbors_soft_cmd
);
537 install_element(ENABLE_NODE
, &clear_ip_eigrp_neighbors_int_soft_cmd
);
538 install_element(ENABLE_NODE
, &clear_ip_eigrp_neighbors_IP_soft_cmd
);