2 * EIGRP Dump Functions and Debugging.
3 * Copyright (C) 2013-2014
11 * This file is part of GNU Zebra.
13 * GNU Zebra is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU General Public License as published by the
15 * Free Software Foundation; either version 2, or (at your option) any
18 * GNU Zebra is distributed in the hope that it will be useful, but
19 * WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * General Public License for more details.
23 * You should have received a copy of the GNU General Public License along
24 * with this program; see the file COPYING; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
40 #include "eigrpd/eigrp_structs.h"
41 #include "eigrpd/eigrpd.h"
42 #include "eigrpd/eigrp_interface.h"
43 #include "eigrpd/eigrp_neighbor.h"
44 #include "eigrpd/eigrp_packet.h"
45 #include "eigrpd/eigrp_zebra.h"
46 #include "eigrpd/eigrp_vty.h"
47 #include "eigrpd/eigrp_network.h"
48 #include "eigrpd/eigrp_dump.h"
49 #include "eigrpd/eigrp_topology.h"
51 /* Enable debug option variables -- valid only session. */
52 unsigned long term_debug_eigrp
= 0;
53 unsigned long term_debug_eigrp_nei
= 0;
54 unsigned long term_debug_eigrp_packet
[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
55 unsigned long term_debug_eigrp_zebra
= 6;
56 unsigned long term_debug_eigrp_transmit
= 0;
58 /* Configuration debug option variables. */
59 unsigned long conf_debug_eigrp
= 0;
60 unsigned long conf_debug_eigrp_nei
= 0;
61 unsigned long conf_debug_eigrp_packet
[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
62 unsigned long conf_debug_eigrp_zebra
= 0;
63 unsigned long conf_debug_eigrp_transmit
= 0;
66 static int config_write_debug(struct vty
*vty
)
71 const char *type_str
[] = {"update", "request", "query", "reply",
72 "hello", "", "probe", "ack",
73 "", "SIA query", "SIA reply", "stub",
75 const char *detail_str
[] = {
76 "", " send", " recv", "",
77 " detail", " send detail", " recv detail", " detail"};
80 /* debug eigrp event. */
82 /* debug eigrp packet */
83 for (i
= 0; i
< 10; i
++) {
84 if (conf_debug_eigrp_packet
[i
] == 0
85 && term_debug_eigrp_packet
[i
] == 0)
88 vty_out(vty
, "debug eigrp packet %s%s\n", type_str
[i
],
89 detail_str
[conf_debug_eigrp_packet
[i
]]);
96 static int eigrp_neighbor_packet_queue_sum(struct eigrp_interface
*ei
)
98 struct eigrp_neighbor
*nbr
;
99 struct listnode
*node
, *nnode
;
103 for (ALL_LIST_ELEMENTS(ei
->nbrs
, node
, nnode
, nbr
)) {
104 sum
+= nbr
->retrans_queue
->count
;
111 * Expects header to be in host order
113 void eigrp_ip_header_dump(struct ip
*iph
)
115 /* IP Header dump. */
116 zlog_debug("ip_v %u", iph
->ip_v
);
117 zlog_debug("ip_hl %u", iph
->ip_hl
);
118 zlog_debug("ip_tos %u", iph
->ip_tos
);
119 zlog_debug("ip_len %u", iph
->ip_len
);
120 zlog_debug("ip_id %u", (uint32_t)iph
->ip_id
);
121 zlog_debug("ip_off %u", (uint32_t)iph
->ip_off
);
122 zlog_debug("ip_ttl %u", iph
->ip_ttl
);
123 zlog_debug("ip_p %u", iph
->ip_p
);
124 zlog_debug("ip_sum 0x%x", (uint32_t)iph
->ip_sum
);
125 zlog_debug("ip_src %s", inet_ntoa(iph
->ip_src
));
126 zlog_debug("ip_dst %s", inet_ntoa(iph
->ip_dst
));
130 * Expects header to be in host order
132 void eigrp_header_dump(struct eigrp_header
*eigrph
)
134 /* EIGRP Header dump. */
135 zlog_debug("eigrp_version %u", eigrph
->version
);
136 zlog_debug("eigrp_opcode %u", eigrph
->opcode
);
137 zlog_debug("eigrp_checksum 0x%x", ntohs(eigrph
->checksum
));
138 zlog_debug("eigrp_flags 0x%x", ntohl(eigrph
->flags
));
139 zlog_debug("eigrp_sequence %u", ntohl(eigrph
->sequence
));
140 zlog_debug("eigrp_ack %u", ntohl(eigrph
->ack
));
141 zlog_debug("eigrp_vrid %u", ntohs(eigrph
->vrid
));
142 zlog_debug("eigrp_AS %u", ntohs(eigrph
->ASNumber
));
145 const char *eigrp_if_name_string(struct eigrp_interface
*ei
)
147 static char buf
[EIGRP_IF_STRING_MAXLEN
] = "";
152 snprintf(buf
, EIGRP_IF_STRING_MAXLEN
, "%s", ei
->ifp
->name
);
156 const char *eigrp_topology_ip_string(struct eigrp_prefix_entry
*tn
)
158 static char buf
[EIGRP_IF_STRING_MAXLEN
] = "";
161 ifaddr
= ntohl(tn
->destination
->u
.prefix4
.s_addr
);
162 snprintf(buf
, EIGRP_IF_STRING_MAXLEN
, "%u.%u.%u.%u",
163 (ifaddr
>> 24) & 0xff, (ifaddr
>> 16) & 0xff,
164 (ifaddr
>> 8) & 0xff, ifaddr
& 0xff);
169 const char *eigrp_if_ip_string(struct eigrp_interface
*ei
)
171 static char buf
[EIGRP_IF_STRING_MAXLEN
] = "";
177 ifaddr
= ntohl(ei
->address
->u
.prefix4
.s_addr
);
178 snprintf(buf
, EIGRP_IF_STRING_MAXLEN
, "%u.%u.%u.%u",
179 (ifaddr
>> 24) & 0xff, (ifaddr
>> 16) & 0xff,
180 (ifaddr
>> 8) & 0xff, ifaddr
& 0xff);
185 const char *eigrp_neigh_ip_string(struct eigrp_neighbor
*nbr
)
187 static char buf
[EIGRP_IF_STRING_MAXLEN
] = "";
190 ifaddr
= ntohl(nbr
->src
.s_addr
);
191 snprintf(buf
, EIGRP_IF_STRING_MAXLEN
, "%u.%u.%u.%u",
192 (ifaddr
>> 24) & 0xff, (ifaddr
>> 16) & 0xff,
193 (ifaddr
>> 8) & 0xff, ifaddr
& 0xff);
198 void show_ip_eigrp_interface_header(struct vty
*vty
, struct eigrp
*eigrp
)
202 "\nEIGRP interfaces for AS(%d)\n\n %-10s %-10s %-10s %-6s %-12s %-7s %-14s %-12s %-8s %-8s %-8s\n %-39s %-12s %-7s %-14s %-12s %-8s\n",
203 eigrp
->AS
, "Interface", "Bandwidth", "Delay", "Peers",
204 "Xmit Queue", "Mean", "Pacing Time", "Multicast", "Pending",
205 "Hello", "Holdtime", "", "Un/Reliable", "SRTT", "Un/Reliable",
206 "Flow Timer", "Routes");
209 void show_ip_eigrp_interface_sub(struct vty
*vty
, struct eigrp
*eigrp
,
210 struct eigrp_interface
*ei
)
212 vty_out(vty
, "%-11s ", eigrp_if_name_string(ei
));
213 vty_out(vty
, "%-11u", ei
->params
.bandwidth
);
214 vty_out(vty
, "%-11u", ei
->params
.delay
);
215 vty_out(vty
, "%-7u", ei
->nbrs
->count
);
216 vty_out(vty
, "%u %c %-10u", 0, '/',
217 eigrp_neighbor_packet_queue_sum(ei
));
218 vty_out(vty
, "%-7u %-14u %-12u %-8u", 0, 0, 0, 0);
219 vty_out(vty
, "%-8u %-8u \n", ei
->params
.v_hello
, ei
->params
.v_wait
);
222 void show_ip_eigrp_interface_detail(struct vty
*vty
, struct eigrp
*eigrp
,
223 struct eigrp_interface
*ei
)
225 vty_out(vty
, "%-2s %s %d %-3s \n", "", "Hello interval is ", 0, " sec");
226 vty_out(vty
, "%-2s %s %s \n", "", "Next xmit serial", "<none>");
227 vty_out(vty
, "%-2s %s %d %s %d %s %d %s %d \n", "",
228 "Un/reliable mcasts: ", 0, "/", 0, "Un/reliable ucasts: ", 0,
230 vty_out(vty
, "%-2s %s %d %s %d %s %d \n", "", "Mcast exceptions: ", 0,
231 " CR packets: ", 0, " ACKs suppressed: ", 0);
232 vty_out(vty
, "%-2s %s %d %s %d \n", "", "Retransmissions sent: ", 0,
233 "Out-of-sequence rcvd: ", 0);
234 vty_out(vty
, "%-2s %s %s %s \n", "", "Authentication mode is ", "not",
236 vty_out(vty
, "%-2s %s \n", "", "Use multicast");
239 void show_ip_eigrp_neighbor_header(struct vty
*vty
, struct eigrp
*eigrp
)
242 "\nEIGRP neighbors for AS(%d)\n\n%-3s %-17s %-20s %-6s %-8s %-6s %-5s %-5s %-5s\n %-41s %-6s %-8s %-6s %-4s %-6s %-5s \n",
243 eigrp
->AS
, "H", "Address", "Interface", "Hold", "Uptime",
244 "SRTT", "RTO", "Q", "Seq", "", "(sec)", "", "(ms)", "", "Cnt",
248 void show_ip_eigrp_neighbor_sub(struct vty
*vty
, struct eigrp_neighbor
*nbr
,
252 vty_out(vty
, "%-3u %-17s %-21s", 0, eigrp_neigh_ip_string(nbr
),
253 eigrp_if_name_string(nbr
->ei
));
255 vty_out(vty
, "%-7lu",
256 thread_timer_remain_second(nbr
->t_holddown
));
259 vty_out(vty
, "%-8u %-6u %-5u", 0, 0, EIGRP_PACKET_RETRANS_TIME
);
260 vty_out(vty
, "%-7lu", nbr
->retrans_queue
->count
);
261 vty_out(vty
, "%u\n", nbr
->recv_sequence_number
);
265 vty_out(vty
, " Version %u.%u/%u.%u", nbr
->os_rel_major
,
266 nbr
->os_rel_minor
, nbr
->tlv_rel_major
,
268 vty_out(vty
, ", Retrans: %lu, Retries: %lu",
269 nbr
->retrans_queue
->count
, 0UL);
270 vty_out(vty
, ", %s\n", eigrp_nbr_state_str(nbr
));
275 * Print standard header for show EIGRP topology output
277 void show_ip_eigrp_topology_header(struct vty
*vty
, struct eigrp
*eigrp
)
279 struct in_addr router_id
;
280 router_id
.s_addr
= eigrp
->router_id
;
282 vty_out(vty
, "\nEIGRP Topology Table for AS(%d)/ID(%s)\n\n", eigrp
->AS
,
283 inet_ntoa(router_id
));
285 "Codes: P - Passive, A - Active, U - Update, Q - Query, "
286 "R - Reply\n r - reply Status, s - sia Status\n\n");
289 void show_ip_eigrp_prefix_entry(struct vty
*vty
, struct eigrp_prefix_entry
*tn
)
291 struct list
*successors
= eigrp_topology_get_successor(tn
);
292 char buffer
[PREFIX_STRLEN
];
294 vty_out(vty
, "%-3c", (tn
->state
> 0) ? 'A' : 'P');
297 prefix2str(tn
->destination
, buffer
, PREFIX_STRLEN
));
298 vty_out(vty
, "%u successors, ", (successors
) ? successors
->count
: 0);
299 vty_out(vty
, "FD is %u, serno: %" PRIu64
" \n", tn
->fdistance
,
303 list_delete_and_null(&successors
);
306 void show_ip_eigrp_nexthop_entry(struct vty
*vty
, struct eigrp
*eigrp
,
307 struct eigrp_nexthop_entry
*te
, int *first
)
309 if (te
->reported_distance
== EIGRP_MAX_METRIC
)
313 show_ip_eigrp_prefix_entry(vty
, te
->prefix
);
317 if (te
->adv_router
== eigrp
->neighbor_self
)
318 vty_out(vty
, "%-7s%s, %s\n", " ", "via Connected",
319 eigrp_if_name_string(te
->ei
));
321 vty_out(vty
, "%-7s%s%s (%u/%u), %s\n", " ", "via ",
322 inet_ntoa(te
->adv_router
->src
), te
->distance
,
323 te
->reported_distance
, eigrp_if_name_string(te
->ei
));
328 DEFUN_NOSH (show_debugging_eigrp
,
329 show_debugging_eigrp_cmd
,
330 "show debugging [eigrp]",
337 vty_out(vty
, "EIGRP debugging status:\n");
339 /* Show debug status for events. */
340 if (IS_DEBUG_EIGRP(event
, EVENT
))
341 vty_out(vty
, " EIGRP event debugging is on\n");
343 /* Show debug status for EIGRP Packets. */
344 for (i
= 0; i
< 11; i
++) {
348 if (IS_DEBUG_EIGRP_PACKET(i
, SEND
)
349 && IS_DEBUG_EIGRP_PACKET(i
, RECV
)) {
350 vty_out(vty
, " EIGRP packet %s%s debugging is on\n",
351 lookup_msg(eigrp_packet_type_str
, i
+ 1, NULL
),
352 IS_DEBUG_EIGRP_PACKET(i
, PACKET_DETAIL
)
356 if (IS_DEBUG_EIGRP_PACKET(i
, SEND
))
358 " EIGRP packet %s send%s debugging is on\n",
359 lookup_msg(eigrp_packet_type_str
, i
+ 1,
361 IS_DEBUG_EIGRP_PACKET(i
, PACKET_DETAIL
)
364 if (IS_DEBUG_EIGRP_PACKET(i
, RECV
))
366 " EIGRP packet %s receive%s debugging is on\n",
367 lookup_msg(eigrp_packet_type_str
, i
+ 1,
369 IS_DEBUG_EIGRP_PACKET(i
, PACKET_DETAIL
)
380 [no] debug eigrp packet (hello|dd|ls-request|ls-update|ls-ack|all)
384 DEFUN (debug_eigrp_transmit
,
385 debug_eigrp_transmit_cmd
,
386 "debug eigrp transmit <send|recv|all> [detail]",
389 "EIGRP transmission events\n"
393 "Detailed Information\n")
399 if (argv_find(argv
, argc
, "send", &idx
))
400 flag
= EIGRP_DEBUG_SEND
;
401 else if (argv_find(argv
, argc
, "recv", &idx
))
402 flag
= EIGRP_DEBUG_RECV
;
403 else if (argv_find(argv
, argc
, "all", &idx
))
404 flag
= EIGRP_DEBUG_SEND_RECV
;
407 if (argv_find(argv
, argc
, "detail", &idx
))
408 flag
= EIGRP_DEBUG_PACKET_DETAIL
;
410 if (vty
->node
== CONFIG_NODE
)
411 DEBUG_TRANSMIT_ON(0, flag
);
413 TERM_DEBUG_TRANSMIT_ON(0, flag
);
418 DEFUN (no_debug_eigrp_transmit
,
419 no_debug_eigrp_transmit_cmd
,
420 "no debug eigrp transmit <send|recv|all> [detail]",
424 "EIGRP transmission events\n"
428 "Detailed Information\n")
434 if (argv_find(argv
, argc
, "send", &idx
))
435 flag
= EIGRP_DEBUG_SEND
;
436 else if (argv_find(argv
, argc
, "recv", &idx
))
437 flag
= EIGRP_DEBUG_RECV
;
438 else if (argv_find(argv
, argc
, "all", &idx
))
439 flag
= EIGRP_DEBUG_SEND_RECV
;
442 if (argv_find(argv
, argc
, "detail", &idx
))
443 flag
= EIGRP_DEBUG_PACKET_DETAIL
;
445 if (vty
->node
== CONFIG_NODE
)
446 DEBUG_TRANSMIT_OFF(0, flag
);
448 TERM_DEBUG_TRANSMIT_OFF(0, flag
);
453 DEFUN (debug_eigrp_packets
,
454 debug_eigrp_packets_all_cmd
,
455 "debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
459 "EIGRP SIA-Query packets\n"
460 "EIGRP SIA-Reply packets\n"
461 "EIGRP ack packets\n"
462 "EIGRP hello packets\n"
463 "EIGRP probe packets\n"
464 "EIGRP query packets\n"
465 "EIGRP reply packets\n"
466 "EIGRP request packets\n"
467 "EIGRP retransmissions\n"
468 "EIGRP stub packets\n"
469 "Display all EIGRP packets except Hellos\n"
470 "EIGRP update packets\n"
471 "Display all EIGRP packets\n"
474 "Detail Information\n")
481 /* Check packet type. */
482 if (argv_find(argv
, argc
, "hello", &idx
))
483 type
= EIGRP_DEBUG_HELLO
;
484 if (argv_find(argv
, argc
, "update", &idx
))
485 type
= EIGRP_DEBUG_UPDATE
;
486 if (argv_find(argv
, argc
, "query", &idx
))
487 type
= EIGRP_DEBUG_QUERY
;
488 if (argv_find(argv
, argc
, "ack", &idx
))
489 type
= EIGRP_DEBUG_ACK
;
490 if (argv_find(argv
, argc
, "probe", &idx
))
491 type
= EIGRP_DEBUG_PROBE
;
492 if (argv_find(argv
, argc
, "stub", &idx
))
493 type
= EIGRP_DEBUG_STUB
;
494 if (argv_find(argv
, argc
, "reply", &idx
))
495 type
= EIGRP_DEBUG_REPLY
;
496 if (argv_find(argv
, argc
, "request", &idx
))
497 type
= EIGRP_DEBUG_REQUEST
;
498 if (argv_find(argv
, argc
, "siaquery", &idx
))
499 type
= EIGRP_DEBUG_SIAQUERY
;
500 if (argv_find(argv
, argc
, "siareply", &idx
))
501 type
= EIGRP_DEBUG_SIAREPLY
;
502 if (argv_find(argv
, argc
, "all", &idx
))
503 type
= EIGRP_DEBUG_PACKETS_ALL
;
506 /* All packet types, both send and recv. */
507 flag
= EIGRP_DEBUG_SEND_RECV
;
510 if (argv_find(argv
, argc
, "s", &idx
))
511 flag
= EIGRP_DEBUG_SEND
;
512 else if (argv_find(argv
, argc
, "r", &idx
))
513 flag
= EIGRP_DEBUG_RECV
;
516 if (argv_find(argv
, argc
, "detail", &idx
))
517 flag
|= EIGRP_DEBUG_PACKET_DETAIL
;
519 for (i
= 0; i
< 11; i
++)
520 if (type
& (0x01 << i
)) {
521 if (vty
->node
== CONFIG_NODE
)
522 DEBUG_PACKET_ON(i
, flag
);
524 TERM_DEBUG_PACKET_ON(i
, flag
);
530 DEFUN (no_debug_eigrp_packets
,
531 no_debug_eigrp_packets_all_cmd
,
532 "no debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
537 "EIGRP SIA-Query packets\n"
538 "EIGRP SIA-Reply packets\n"
539 "EIGRP ack packets\n"
540 "EIGRP hello packets\n"
541 "EIGRP probe packets\n"
542 "EIGRP query packets\n"
543 "EIGRP reply packets\n"
544 "EIGRP request packets\n"
545 "EIGRP retransmissions\n"
546 "EIGRP stub packets\n"
547 "Display all EIGRP packets except Hellos\n"
548 "EIGRP update packets\n"
549 "Display all EIGRP packets\n"
552 "Detailed Information\n")
559 /* Check packet type. */
560 if (argv_find(argv
, argc
, "hello", &idx
))
561 type
= EIGRP_DEBUG_HELLO
;
562 if (argv_find(argv
, argc
, "update", &idx
))
563 type
= EIGRP_DEBUG_UPDATE
;
564 if (argv_find(argv
, argc
, "query", &idx
))
565 type
= EIGRP_DEBUG_QUERY
;
566 if (argv_find(argv
, argc
, "ack", &idx
))
567 type
= EIGRP_DEBUG_ACK
;
568 if (argv_find(argv
, argc
, "probe", &idx
))
569 type
= EIGRP_DEBUG_PROBE
;
570 if (argv_find(argv
, argc
, "stub", &idx
))
571 type
= EIGRP_DEBUG_STUB
;
572 if (argv_find(argv
, argc
, "reply", &idx
))
573 type
= EIGRP_DEBUG_REPLY
;
574 if (argv_find(argv
, argc
, "request", &idx
))
575 type
= EIGRP_DEBUG_REQUEST
;
576 if (argv_find(argv
, argc
, "siaquery", &idx
))
577 type
= EIGRP_DEBUG_SIAQUERY
;
578 if (argv_find(argv
, argc
, "siareply", &idx
))
579 type
= EIGRP_DEBUG_SIAREPLY
;
581 /* Default, both send and recv. */
582 flag
= EIGRP_DEBUG_SEND_RECV
;
585 if (argv_find(argv
, argc
, "send", &idx
))
586 flag
= EIGRP_DEBUG_SEND
;
587 else if (argv_find(argv
, argc
, "reply", &idx
))
588 flag
= EIGRP_DEBUG_RECV
;
591 if (argv_find(argv
, argc
, "detail", &idx
))
592 flag
|= EIGRP_DEBUG_PACKET_DETAIL
;
594 for (i
= 0; i
< 11; i
++)
595 if (type
& (0x01 << i
)) {
596 if (vty
->node
== CONFIG_NODE
)
597 DEBUG_PACKET_OFF(i
, flag
);
599 TERM_DEBUG_PACKET_OFF(i
, flag
);
606 static struct cmd_node eigrp_debug_node
= {
607 DEBUG_NODE
, "", 1 /* VTYSH */
610 /* Initialize debug commands. */
611 void eigrp_debug_init()
613 install_node(&eigrp_debug_node
, config_write_debug
);
615 install_element(ENABLE_NODE
, &show_debugging_eigrp_cmd
);
616 install_element(ENABLE_NODE
, &debug_eigrp_packets_all_cmd
);
617 install_element(ENABLE_NODE
, &no_debug_eigrp_packets_all_cmd
);
618 install_element(ENABLE_NODE
, &debug_eigrp_transmit_cmd
);
619 install_element(ENABLE_NODE
, &no_debug_eigrp_transmit_cmd
);
621 install_element(CONFIG_NODE
, &show_debugging_eigrp_cmd
);
622 install_element(CONFIG_NODE
, &debug_eigrp_packets_all_cmd
);
623 install_element(CONFIG_NODE
, &no_debug_eigrp_packets_all_cmd
);
624 install_element(CONFIG_NODE
, &debug_eigrp_transmit_cmd
);
625 install_element(CONFIG_NODE
, &no_debug_eigrp_transmit_cmd
);