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 %pI4", &iph
->ip_src
);
126 zlog_debug("ip_dst %pI4", &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
)
150 return ei
->ifp
->name
;
153 void show_ip_eigrp_interface_header(struct vty
*vty
, struct eigrp
*eigrp
)
157 "\nEIGRP interfaces for AS(%d)\n\n%-16s %-10s %-10s %-6s %-12s %-7s %-14s %-12s %-8s %-8s %-8s\n %-44s %-12s %-7s %-14s %-12s %-8s\n",
158 eigrp
->AS
, "Interface", "Bandwidth", "Delay", "Peers",
159 "Xmit Queue", "Mean", "Pacing Time", "Multicast", "Pending",
160 "Hello", "Holdtime", "", "Un/Reliable", "SRTT", "Un/Reliable",
161 "Flow Timer", "Routes");
164 void show_ip_eigrp_interface_sub(struct vty
*vty
, struct eigrp
*eigrp
,
165 struct eigrp_interface
*ei
)
167 vty_out(vty
, "%-16s ", IF_NAME(ei
));
168 vty_out(vty
, "%-11u", ei
->params
.bandwidth
);
169 vty_out(vty
, "%-11u", ei
->params
.delay
);
170 vty_out(vty
, "%-7u", ei
->nbrs
->count
);
171 vty_out(vty
, "%u %c %-10u", 0, '/',
172 eigrp_neighbor_packet_queue_sum(ei
));
173 vty_out(vty
, "%-7u %-14u %-12u %-8u", 0, 0, 0, 0);
174 vty_out(vty
, "%-8u %-8u \n", ei
->params
.v_hello
, ei
->params
.v_wait
);
177 void show_ip_eigrp_interface_detail(struct vty
*vty
, struct eigrp
*eigrp
,
178 struct eigrp_interface
*ei
)
180 vty_out(vty
, "%-2s %s %d %-3s \n", "", "Hello interval is ", 0, " sec");
181 vty_out(vty
, "%-2s %s %s \n", "", "Next xmit serial", "<none>");
182 vty_out(vty
, "%-2s %s %d %s %d %s %d %s %d \n", "",
183 "Un/reliable mcasts: ", 0, "/", 0, "Un/reliable ucasts: ", 0,
185 vty_out(vty
, "%-2s %s %d %s %d %s %d \n", "", "Mcast exceptions: ", 0,
186 " CR packets: ", 0, " ACKs suppressed: ", 0);
187 vty_out(vty
, "%-2s %s %d %s %d \n", "", "Retransmissions sent: ", 0,
188 "Out-of-sequence rcvd: ", 0);
189 vty_out(vty
, "%-2s %s %s %s \n", "", "Authentication mode is ", "not",
191 vty_out(vty
, "%-2s %s \n", "", "Use multicast");
194 void show_ip_eigrp_neighbor_header(struct vty
*vty
, struct eigrp
*eigrp
)
197 "\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",
198 eigrp
->AS
, "H", "Address", "Interface", "Hold", "Uptime",
199 "SRTT", "RTO", "Q", "Seq", "", "(sec)", "", "(ms)", "", "Cnt",
203 void show_ip_eigrp_neighbor_sub(struct vty
*vty
, struct eigrp_neighbor
*nbr
,
207 vty_out(vty
, "%-3u %-17pI4 %-21s", 0, &nbr
->src
, IF_NAME(nbr
->ei
));
209 vty_out(vty
, "%-7lu",
210 thread_timer_remain_second(nbr
->t_holddown
));
213 vty_out(vty
, "%-8u %-6u %-5u", 0, 0, EIGRP_PACKET_RETRANS_TIME
);
214 vty_out(vty
, "%-7lu", nbr
->retrans_queue
->count
);
215 vty_out(vty
, "%u\n", nbr
->recv_sequence_number
);
219 vty_out(vty
, " Version %u.%u/%u.%u", nbr
->os_rel_major
,
220 nbr
->os_rel_minor
, nbr
->tlv_rel_major
,
222 vty_out(vty
, ", Retrans: %lu, Retries: %lu",
223 nbr
->retrans_queue
->count
, 0UL);
224 vty_out(vty
, ", %s\n", eigrp_nbr_state_str(nbr
));
229 * Print standard header for show EIGRP topology output
231 void show_ip_eigrp_topology_header(struct vty
*vty
, struct eigrp
*eigrp
)
233 vty_out(vty
, "\nEIGRP Topology Table for AS(%d)/ID(%pI4)\n\n",
234 eigrp
->AS
, &eigrp
->router_id
);
236 "Codes: P - Passive, A - Active, U - Update, Q - Query, R - Reply\n r - reply Status, s - sia Status\n\n");
239 void show_ip_eigrp_prefix_descriptor(struct vty
*vty
,
240 struct eigrp_prefix_descriptor
*tn
)
242 struct list
*successors
= eigrp_topology_get_successor(tn
);
244 vty_out(vty
, "%-3c", (tn
->state
> 0) ? 'A' : 'P');
246 vty_out(vty
, "%pFX, ", tn
->destination
);
247 vty_out(vty
, "%u successors, ", (successors
) ? successors
->count
: 0);
248 vty_out(vty
, "FD is %u, serno: %" PRIu64
" \n", tn
->fdistance
,
252 list_delete(&successors
);
255 void show_ip_eigrp_route_descriptor(struct vty
*vty
, struct eigrp
*eigrp
,
256 struct eigrp_route_descriptor
*te
,
259 if (te
->reported_distance
== EIGRP_MAX_METRIC
)
263 show_ip_eigrp_prefix_descriptor(vty
, te
->prefix
);
267 if (te
->adv_router
== eigrp
->neighbor_self
)
268 vty_out(vty
, "%-7s%s, %s\n", " ", "via Connected",
271 vty_out(vty
, "%-7s%s%pI4 (%u/%u), %s\n", " ", "via ",
272 &te
->adv_router
->src
, te
->distance
,
273 te
->reported_distance
, IF_NAME(te
->ei
));
278 DEFUN_NOSH (show_debugging_eigrp
,
279 show_debugging_eigrp_cmd
,
280 "show debugging [eigrp]",
287 vty_out(vty
, "EIGRP debugging status:\n");
289 /* Show debug status for events. */
290 if (IS_DEBUG_EIGRP(event
, EVENT
))
291 vty_out(vty
, " EIGRP event debugging is on\n");
293 /* Show debug status for EIGRP Packets. */
294 for (i
= 0; i
< 11; i
++) {
298 if (IS_DEBUG_EIGRP_PACKET(i
, SEND
)
299 && IS_DEBUG_EIGRP_PACKET(i
, RECV
)) {
300 vty_out(vty
, " EIGRP packet %s%s debugging is on\n",
301 lookup_msg(eigrp_packet_type_str
, i
+ 1, NULL
),
302 IS_DEBUG_EIGRP_PACKET(i
, PACKET_DETAIL
)
306 if (IS_DEBUG_EIGRP_PACKET(i
, SEND
))
308 " EIGRP packet %s send%s debugging is on\n",
309 lookup_msg(eigrp_packet_type_str
, i
+ 1,
311 IS_DEBUG_EIGRP_PACKET(i
, PACKET_DETAIL
)
314 if (IS_DEBUG_EIGRP_PACKET(i
, RECV
))
316 " EIGRP packet %s receive%s debugging is on\n",
317 lookup_msg(eigrp_packet_type_str
, i
+ 1,
319 IS_DEBUG_EIGRP_PACKET(i
, PACKET_DETAIL
)
330 [no] debug eigrp packet (hello|dd|ls-request|ls-update|ls-ack|all)
334 DEFUN (debug_eigrp_transmit
,
335 debug_eigrp_transmit_cmd
,
336 "debug eigrp transmit <send|recv|all> [detail]",
339 "EIGRP transmission events\n"
343 "Detailed Information\n")
349 if (argv_find(argv
, argc
, "send", &idx
))
350 flag
= EIGRP_DEBUG_SEND
;
351 else if (argv_find(argv
, argc
, "recv", &idx
))
352 flag
= EIGRP_DEBUG_RECV
;
353 else if (argv_find(argv
, argc
, "all", &idx
))
354 flag
= EIGRP_DEBUG_SEND_RECV
;
357 if (argv_find(argv
, argc
, "detail", &idx
))
358 flag
= EIGRP_DEBUG_PACKET_DETAIL
;
360 if (vty
->node
== CONFIG_NODE
)
361 DEBUG_TRANSMIT_ON(0, flag
);
363 TERM_DEBUG_TRANSMIT_ON(0, flag
);
368 DEFUN (no_debug_eigrp_transmit
,
369 no_debug_eigrp_transmit_cmd
,
370 "no debug eigrp transmit <send|recv|all> [detail]",
374 "EIGRP transmission events\n"
378 "Detailed Information\n")
384 if (argv_find(argv
, argc
, "send", &idx
))
385 flag
= EIGRP_DEBUG_SEND
;
386 else if (argv_find(argv
, argc
, "recv", &idx
))
387 flag
= EIGRP_DEBUG_RECV
;
388 else if (argv_find(argv
, argc
, "all", &idx
))
389 flag
= EIGRP_DEBUG_SEND_RECV
;
392 if (argv_find(argv
, argc
, "detail", &idx
))
393 flag
= EIGRP_DEBUG_PACKET_DETAIL
;
395 if (vty
->node
== CONFIG_NODE
)
396 DEBUG_TRANSMIT_OFF(0, flag
);
398 TERM_DEBUG_TRANSMIT_OFF(0, flag
);
403 DEFUN (debug_eigrp_packets
,
404 debug_eigrp_packets_all_cmd
,
405 "debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
409 "EIGRP SIA-Query packets\n"
410 "EIGRP SIA-Reply packets\n"
411 "EIGRP ack packets\n"
412 "EIGRP hello packets\n"
413 "EIGRP probe packets\n"
414 "EIGRP query packets\n"
415 "EIGRP reply packets\n"
416 "EIGRP request packets\n"
417 "EIGRP retransmissions\n"
418 "EIGRP stub packets\n"
419 "Display all EIGRP packets except Hellos\n"
420 "EIGRP update packets\n"
421 "Display all EIGRP packets\n"
424 "Detail Information\n")
431 /* Check packet type. */
432 if (argv_find(argv
, argc
, "hello", &idx
))
433 type
= EIGRP_DEBUG_HELLO
;
434 if (argv_find(argv
, argc
, "update", &idx
))
435 type
= EIGRP_DEBUG_UPDATE
;
436 if (argv_find(argv
, argc
, "query", &idx
))
437 type
= EIGRP_DEBUG_QUERY
;
438 if (argv_find(argv
, argc
, "ack", &idx
))
439 type
= EIGRP_DEBUG_ACK
;
440 if (argv_find(argv
, argc
, "probe", &idx
))
441 type
= EIGRP_DEBUG_PROBE
;
442 if (argv_find(argv
, argc
, "stub", &idx
))
443 type
= EIGRP_DEBUG_STUB
;
444 if (argv_find(argv
, argc
, "reply", &idx
))
445 type
= EIGRP_DEBUG_REPLY
;
446 if (argv_find(argv
, argc
, "request", &idx
))
447 type
= EIGRP_DEBUG_REQUEST
;
448 if (argv_find(argv
, argc
, "siaquery", &idx
))
449 type
= EIGRP_DEBUG_SIAQUERY
;
450 if (argv_find(argv
, argc
, "siareply", &idx
))
451 type
= EIGRP_DEBUG_SIAREPLY
;
452 if (argv_find(argv
, argc
, "all", &idx
))
453 type
= EIGRP_DEBUG_PACKETS_ALL
;
456 /* All packet types, both send and recv. */
457 flag
= EIGRP_DEBUG_SEND_RECV
;
460 if (argv_find(argv
, argc
, "s", &idx
))
461 flag
= EIGRP_DEBUG_SEND
;
462 else if (argv_find(argv
, argc
, "r", &idx
))
463 flag
= EIGRP_DEBUG_RECV
;
466 if (argv_find(argv
, argc
, "detail", &idx
))
467 flag
|= EIGRP_DEBUG_PACKET_DETAIL
;
469 for (i
= 0; i
< 11; i
++)
470 if (type
& (0x01 << i
)) {
471 if (vty
->node
== CONFIG_NODE
)
472 DEBUG_PACKET_ON(i
, flag
);
474 TERM_DEBUG_PACKET_ON(i
, flag
);
480 DEFUN (no_debug_eigrp_packets
,
481 no_debug_eigrp_packets_all_cmd
,
482 "no debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
487 "EIGRP SIA-Query packets\n"
488 "EIGRP SIA-Reply packets\n"
489 "EIGRP ack packets\n"
490 "EIGRP hello packets\n"
491 "EIGRP probe packets\n"
492 "EIGRP query packets\n"
493 "EIGRP reply packets\n"
494 "EIGRP request packets\n"
495 "EIGRP retransmissions\n"
496 "EIGRP stub packets\n"
497 "Display all EIGRP packets except Hellos\n"
498 "EIGRP update packets\n"
499 "Display all EIGRP packets\n"
502 "Detailed Information\n")
509 /* Check packet type. */
510 if (argv_find(argv
, argc
, "hello", &idx
))
511 type
= EIGRP_DEBUG_HELLO
;
512 if (argv_find(argv
, argc
, "update", &idx
))
513 type
= EIGRP_DEBUG_UPDATE
;
514 if (argv_find(argv
, argc
, "query", &idx
))
515 type
= EIGRP_DEBUG_QUERY
;
516 if (argv_find(argv
, argc
, "ack", &idx
))
517 type
= EIGRP_DEBUG_ACK
;
518 if (argv_find(argv
, argc
, "probe", &idx
))
519 type
= EIGRP_DEBUG_PROBE
;
520 if (argv_find(argv
, argc
, "stub", &idx
))
521 type
= EIGRP_DEBUG_STUB
;
522 if (argv_find(argv
, argc
, "reply", &idx
))
523 type
= EIGRP_DEBUG_REPLY
;
524 if (argv_find(argv
, argc
, "request", &idx
))
525 type
= EIGRP_DEBUG_REQUEST
;
526 if (argv_find(argv
, argc
, "siaquery", &idx
))
527 type
= EIGRP_DEBUG_SIAQUERY
;
528 if (argv_find(argv
, argc
, "siareply", &idx
))
529 type
= EIGRP_DEBUG_SIAREPLY
;
531 /* Default, both send and recv. */
532 flag
= EIGRP_DEBUG_SEND_RECV
;
535 if (argv_find(argv
, argc
, "send", &idx
))
536 flag
= EIGRP_DEBUG_SEND
;
537 else if (argv_find(argv
, argc
, "reply", &idx
))
538 flag
= EIGRP_DEBUG_RECV
;
541 if (argv_find(argv
, argc
, "detail", &idx
))
542 flag
|= EIGRP_DEBUG_PACKET_DETAIL
;
544 for (i
= 0; i
< 11; i
++)
545 if (type
& (0x01 << i
)) {
546 if (vty
->node
== CONFIG_NODE
)
547 DEBUG_PACKET_OFF(i
, flag
);
549 TERM_DEBUG_PACKET_OFF(i
, flag
);
556 static int config_write_debug(struct vty
*vty
);
557 static struct cmd_node eigrp_debug_node
= {
561 .config_write
= config_write_debug
,
564 /* Initialize debug commands. */
565 void eigrp_debug_init(void)
567 install_node(&eigrp_debug_node
);
569 install_element(ENABLE_NODE
, &show_debugging_eigrp_cmd
);
570 install_element(ENABLE_NODE
, &debug_eigrp_packets_all_cmd
);
571 install_element(ENABLE_NODE
, &no_debug_eigrp_packets_all_cmd
);
572 install_element(ENABLE_NODE
, &debug_eigrp_transmit_cmd
);
573 install_element(ENABLE_NODE
, &no_debug_eigrp_transmit_cmd
);
575 install_element(CONFIG_NODE
, &show_debugging_eigrp_cmd
);
576 install_element(CONFIG_NODE
, &debug_eigrp_packets_all_cmd
);
577 install_element(CONFIG_NODE
, &no_debug_eigrp_packets_all_cmd
);
578 install_element(CONFIG_NODE
, &debug_eigrp_transmit_cmd
);
579 install_element(CONFIG_NODE
, &no_debug_eigrp_transmit_cmd
);