]> git.proxmox.com Git - mirror_frr.git/blob - eigrpd/eigrp_dump.c
Merge pull request #3560 from opensourcerouting/fix-sh-bgp-community
[mirror_frr.git] / eigrpd / eigrp_dump.c
1 /*
2 * EIGRP Dump Functions and Debugging.
3 * Copyright (C) 2013-2014
4 * Authors:
5 * Donnie Savage
6 * Jan Janovic
7 * Matej Perina
8 * Peter Orsag
9 * Peter Paluch
10 *
11 * This file is part of GNU Zebra.
12 *
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
16 * later version.
17 *
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.
22 *
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
26 */
27
28 #include <zebra.h>
29
30 #include "linklist.h"
31 #include "thread.h"
32 #include "prefix.h"
33 #include "command.h"
34 #include "stream.h"
35 #include "log.h"
36 #include "sockopt.h"
37 #include "table.h"
38 #include "keychain.h"
39
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"
50
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;
57
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;
64
65
66 static int config_write_debug(struct vty *vty)
67 {
68 int write = 0;
69 int i;
70
71 const char *type_str[] = {"update", "request", "query", "reply",
72 "hello", "", "probe", "ack",
73 "", "SIA query", "SIA reply", "stub",
74 "all"};
75 const char *detail_str[] = {
76 "", " send", " recv", "",
77 " detail", " send detail", " recv detail", " detail"};
78
79
80 /* debug eigrp event. */
81
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)
86 continue;
87
88 vty_out(vty, "debug eigrp packet %s%s\n", type_str[i],
89 detail_str[conf_debug_eigrp_packet[i]]);
90 write = 1;
91 }
92
93 return write;
94 }
95
96 static int eigrp_neighbor_packet_queue_sum(struct eigrp_interface *ei)
97 {
98 struct eigrp_neighbor *nbr;
99 struct listnode *node, *nnode;
100 int sum;
101 sum = 0;
102
103 for (ALL_LIST_ELEMENTS(ei->nbrs, node, nnode, nbr)) {
104 sum += nbr->retrans_queue->count;
105 }
106
107 return sum;
108 }
109
110 /*
111 * Expects header to be in host order
112 */
113 void eigrp_ip_header_dump(struct ip *iph)
114 {
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));
127 }
128
129 /*
130 * Expects header to be in host order
131 */
132 void eigrp_header_dump(struct eigrp_header *eigrph)
133 {
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));
143 }
144
145 const char *eigrp_if_name_string(struct eigrp_interface *ei)
146 {
147 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
148
149 if (!ei)
150 return "inactive";
151
152 snprintf(buf, EIGRP_IF_STRING_MAXLEN, "%s", ei->ifp->name);
153 return buf;
154 }
155
156 const char *eigrp_topology_ip_string(struct eigrp_prefix_entry *tn)
157 {
158 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
159 uint32_t ifaddr;
160
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);
165 return buf;
166 }
167
168
169 const char *eigrp_if_ip_string(struct eigrp_interface *ei)
170 {
171 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
172 uint32_t ifaddr;
173
174 if (!ei)
175 return "inactive";
176
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);
181
182 return buf;
183 }
184
185 const char *eigrp_neigh_ip_string(struct eigrp_neighbor *nbr)
186 {
187 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
188 uint32_t ifaddr;
189
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);
194
195 return buf;
196 }
197
198 void show_ip_eigrp_interface_header(struct vty *vty, struct eigrp *eigrp)
199 {
200
201 vty_out(vty,
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");
207 }
208
209 void show_ip_eigrp_interface_sub(struct vty *vty, struct eigrp *eigrp,
210 struct eigrp_interface *ei)
211 {
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);
220 }
221
222 void show_ip_eigrp_interface_detail(struct vty *vty, struct eigrp *eigrp,
223 struct eigrp_interface *ei)
224 {
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,
229 "/", 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",
235 "set");
236 vty_out(vty, "%-2s %s \n", "", "Use multicast");
237 }
238
239 void show_ip_eigrp_neighbor_header(struct vty *vty, struct eigrp *eigrp)
240 {
241 vty_out(vty,
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",
245 "Num");
246 }
247
248 void show_ip_eigrp_neighbor_sub(struct vty *vty, struct eigrp_neighbor *nbr,
249 int detail)
250 {
251
252 vty_out(vty, "%-3u %-17s %-21s", 0, eigrp_neigh_ip_string(nbr),
253 eigrp_if_name_string(nbr->ei));
254 if (nbr->t_holddown)
255 vty_out(vty, "%-7lu",
256 thread_timer_remain_second(nbr->t_holddown));
257 else
258 vty_out(vty, "- ");
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);
262
263
264 if (detail) {
265 vty_out(vty, " Version %u.%u/%u.%u", nbr->os_rel_major,
266 nbr->os_rel_minor, nbr->tlv_rel_major,
267 nbr->tlv_rel_minor);
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));
271 }
272 }
273
274 /*
275 * Print standard header for show EIGRP topology output
276 */
277 void show_ip_eigrp_topology_header(struct vty *vty, struct eigrp *eigrp)
278 {
279 vty_out(vty, "\nEIGRP Topology Table for AS(%d)/ID(%s)\n\n", eigrp->AS,
280 inet_ntoa(eigrp->router_id));
281 vty_out(vty,
282 "Codes: P - Passive, A - Active, U - Update, Q - Query, "
283 "R - Reply\n r - reply Status, s - sia Status\n\n");
284 }
285
286 void show_ip_eigrp_prefix_entry(struct vty *vty, struct eigrp_prefix_entry *tn)
287 {
288 struct list *successors = eigrp_topology_get_successor(tn);
289 char buffer[PREFIX_STRLEN];
290
291 vty_out(vty, "%-3c", (tn->state > 0) ? 'A' : 'P');
292
293 vty_out(vty, "%s, ",
294 prefix2str(tn->destination, buffer, PREFIX_STRLEN));
295 vty_out(vty, "%u successors, ", (successors) ? successors->count : 0);
296 vty_out(vty, "FD is %u, serno: %" PRIu64 " \n", tn->fdistance,
297 tn->serno);
298
299 if (successors)
300 list_delete(&successors);
301 }
302
303 void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
304 struct eigrp_nexthop_entry *te, int *first)
305 {
306 if (te->reported_distance == EIGRP_MAX_METRIC)
307 return;
308
309 if (*first) {
310 show_ip_eigrp_prefix_entry(vty, te->prefix);
311 *first = 0;
312 }
313
314 if (te->adv_router == eigrp->neighbor_self)
315 vty_out(vty, "%-7s%s, %s\n", " ", "via Connected",
316 eigrp_if_name_string(te->ei));
317 else {
318 vty_out(vty, "%-7s%s%s (%u/%u), %s\n", " ", "via ",
319 inet_ntoa(te->adv_router->src), te->distance,
320 te->reported_distance, eigrp_if_name_string(te->ei));
321 }
322 }
323
324
325 DEFUN_NOSH (show_debugging_eigrp,
326 show_debugging_eigrp_cmd,
327 "show debugging [eigrp]",
328 SHOW_STR
329 DEBUG_STR
330 EIGRP_STR)
331 {
332 int i;
333
334 vty_out(vty, "EIGRP debugging status:\n");
335
336 /* Show debug status for events. */
337 if (IS_DEBUG_EIGRP(event, EVENT))
338 vty_out(vty, " EIGRP event debugging is on\n");
339
340 /* Show debug status for EIGRP Packets. */
341 for (i = 0; i < 11; i++) {
342 if (i == 8)
343 continue;
344
345 if (IS_DEBUG_EIGRP_PACKET(i, SEND)
346 && IS_DEBUG_EIGRP_PACKET(i, RECV)) {
347 vty_out(vty, " EIGRP packet %s%s debugging is on\n",
348 lookup_msg(eigrp_packet_type_str, i + 1, NULL),
349 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
350 ? " detail"
351 : "");
352 } else {
353 if (IS_DEBUG_EIGRP_PACKET(i, SEND))
354 vty_out(vty,
355 " EIGRP packet %s send%s debugging is on\n",
356 lookup_msg(eigrp_packet_type_str, i + 1,
357 NULL),
358 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
359 ? " detail"
360 : "");
361 if (IS_DEBUG_EIGRP_PACKET(i, RECV))
362 vty_out(vty,
363 " EIGRP packet %s receive%s debugging is on\n",
364 lookup_msg(eigrp_packet_type_str, i + 1,
365 NULL),
366 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
367 ? " detail"
368 : "");
369 }
370 }
371
372 return CMD_SUCCESS;
373 }
374
375
376 /*
377 [no] debug eigrp packet (hello|dd|ls-request|ls-update|ls-ack|all)
378 [send|recv [detail]]
379 */
380
381 DEFUN (debug_eigrp_transmit,
382 debug_eigrp_transmit_cmd,
383 "debug eigrp transmit <send|recv|all> [detail]",
384 DEBUG_STR
385 EIGRP_STR
386 "EIGRP transmission events\n"
387 "packet sent\n"
388 "packet received\n"
389 "all packets\n"
390 "Detailed Information\n")
391 {
392 int flag = 0;
393 int idx = 2;
394
395 /* send or recv. */
396 if (argv_find(argv, argc, "send", &idx))
397 flag = EIGRP_DEBUG_SEND;
398 else if (argv_find(argv, argc, "recv", &idx))
399 flag = EIGRP_DEBUG_RECV;
400 else if (argv_find(argv, argc, "all", &idx))
401 flag = EIGRP_DEBUG_SEND_RECV;
402
403 /* detail option */
404 if (argv_find(argv, argc, "detail", &idx))
405 flag = EIGRP_DEBUG_PACKET_DETAIL;
406
407 if (vty->node == CONFIG_NODE)
408 DEBUG_TRANSMIT_ON(0, flag);
409 else
410 TERM_DEBUG_TRANSMIT_ON(0, flag);
411
412 return CMD_SUCCESS;
413 }
414
415 DEFUN (no_debug_eigrp_transmit,
416 no_debug_eigrp_transmit_cmd,
417 "no debug eigrp transmit <send|recv|all> [detail]",
418 NO_STR
419 UNDEBUG_STR
420 EIGRP_STR
421 "EIGRP transmission events\n"
422 "packet sent\n"
423 "packet received\n"
424 "all packets\n"
425 "Detailed Information\n")
426 {
427 int flag = 0;
428 int idx = 3;
429
430 /* send or recv. */
431 if (argv_find(argv, argc, "send", &idx))
432 flag = EIGRP_DEBUG_SEND;
433 else if (argv_find(argv, argc, "recv", &idx))
434 flag = EIGRP_DEBUG_RECV;
435 else if (argv_find(argv, argc, "all", &idx))
436 flag = EIGRP_DEBUG_SEND_RECV;
437
438 /* detail option */
439 if (argv_find(argv, argc, "detail", &idx))
440 flag = EIGRP_DEBUG_PACKET_DETAIL;
441
442 if (vty->node == CONFIG_NODE)
443 DEBUG_TRANSMIT_OFF(0, flag);
444 else
445 TERM_DEBUG_TRANSMIT_OFF(0, flag);
446
447 return CMD_SUCCESS;
448 }
449
450 DEFUN (debug_eigrp_packets,
451 debug_eigrp_packets_all_cmd,
452 "debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
453 DEBUG_STR
454 EIGRP_STR
455 "EIGRP packets\n"
456 "EIGRP SIA-Query packets\n"
457 "EIGRP SIA-Reply packets\n"
458 "EIGRP ack packets\n"
459 "EIGRP hello packets\n"
460 "EIGRP probe packets\n"
461 "EIGRP query packets\n"
462 "EIGRP reply packets\n"
463 "EIGRP request packets\n"
464 "EIGRP retransmissions\n"
465 "EIGRP stub packets\n"
466 "Display all EIGRP packets except Hellos\n"
467 "EIGRP update packets\n"
468 "Display all EIGRP packets\n"
469 "Send Packets\n"
470 "Receive Packets\n"
471 "Detail Information\n")
472 {
473 int type = 0;
474 int flag = 0;
475 int i;
476 int idx = 0;
477
478 /* Check packet type. */
479 if (argv_find(argv, argc, "hello", &idx))
480 type = EIGRP_DEBUG_HELLO;
481 if (argv_find(argv, argc, "update", &idx))
482 type = EIGRP_DEBUG_UPDATE;
483 if (argv_find(argv, argc, "query", &idx))
484 type = EIGRP_DEBUG_QUERY;
485 if (argv_find(argv, argc, "ack", &idx))
486 type = EIGRP_DEBUG_ACK;
487 if (argv_find(argv, argc, "probe", &idx))
488 type = EIGRP_DEBUG_PROBE;
489 if (argv_find(argv, argc, "stub", &idx))
490 type = EIGRP_DEBUG_STUB;
491 if (argv_find(argv, argc, "reply", &idx))
492 type = EIGRP_DEBUG_REPLY;
493 if (argv_find(argv, argc, "request", &idx))
494 type = EIGRP_DEBUG_REQUEST;
495 if (argv_find(argv, argc, "siaquery", &idx))
496 type = EIGRP_DEBUG_SIAQUERY;
497 if (argv_find(argv, argc, "siareply", &idx))
498 type = EIGRP_DEBUG_SIAREPLY;
499 if (argv_find(argv, argc, "all", &idx))
500 type = EIGRP_DEBUG_PACKETS_ALL;
501
502
503 /* All packet types, both send and recv. */
504 flag = EIGRP_DEBUG_SEND_RECV;
505
506 /* send or recv. */
507 if (argv_find(argv, argc, "s", &idx))
508 flag = EIGRP_DEBUG_SEND;
509 else if (argv_find(argv, argc, "r", &idx))
510 flag = EIGRP_DEBUG_RECV;
511
512 /* detail. */
513 if (argv_find(argv, argc, "detail", &idx))
514 flag |= EIGRP_DEBUG_PACKET_DETAIL;
515
516 for (i = 0; i < 11; i++)
517 if (type & (0x01 << i)) {
518 if (vty->node == CONFIG_NODE)
519 DEBUG_PACKET_ON(i, flag);
520 else
521 TERM_DEBUG_PACKET_ON(i, flag);
522 }
523
524 return CMD_SUCCESS;
525 }
526
527 DEFUN (no_debug_eigrp_packets,
528 no_debug_eigrp_packets_all_cmd,
529 "no debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
530 NO_STR
531 UNDEBUG_STR
532 EIGRP_STR
533 "EIGRP packets\n"
534 "EIGRP SIA-Query packets\n"
535 "EIGRP SIA-Reply packets\n"
536 "EIGRP ack packets\n"
537 "EIGRP hello packets\n"
538 "EIGRP probe packets\n"
539 "EIGRP query packets\n"
540 "EIGRP reply packets\n"
541 "EIGRP request packets\n"
542 "EIGRP retransmissions\n"
543 "EIGRP stub packets\n"
544 "Display all EIGRP packets except Hellos\n"
545 "EIGRP update packets\n"
546 "Display all EIGRP packets\n"
547 "Send Packets\n"
548 "Receive Packets\n"
549 "Detailed Information\n")
550 {
551 int type = 0;
552 int flag = 0;
553 int i;
554 int idx = 0;
555
556 /* Check packet type. */
557 if (argv_find(argv, argc, "hello", &idx))
558 type = EIGRP_DEBUG_HELLO;
559 if (argv_find(argv, argc, "update", &idx))
560 type = EIGRP_DEBUG_UPDATE;
561 if (argv_find(argv, argc, "query", &idx))
562 type = EIGRP_DEBUG_QUERY;
563 if (argv_find(argv, argc, "ack", &idx))
564 type = EIGRP_DEBUG_ACK;
565 if (argv_find(argv, argc, "probe", &idx))
566 type = EIGRP_DEBUG_PROBE;
567 if (argv_find(argv, argc, "stub", &idx))
568 type = EIGRP_DEBUG_STUB;
569 if (argv_find(argv, argc, "reply", &idx))
570 type = EIGRP_DEBUG_REPLY;
571 if (argv_find(argv, argc, "request", &idx))
572 type = EIGRP_DEBUG_REQUEST;
573 if (argv_find(argv, argc, "siaquery", &idx))
574 type = EIGRP_DEBUG_SIAQUERY;
575 if (argv_find(argv, argc, "siareply", &idx))
576 type = EIGRP_DEBUG_SIAREPLY;
577
578 /* Default, both send and recv. */
579 flag = EIGRP_DEBUG_SEND_RECV;
580
581 /* send or recv. */
582 if (argv_find(argv, argc, "send", &idx))
583 flag = EIGRP_DEBUG_SEND;
584 else if (argv_find(argv, argc, "reply", &idx))
585 flag = EIGRP_DEBUG_RECV;
586
587 /* detail. */
588 if (argv_find(argv, argc, "detail", &idx))
589 flag |= EIGRP_DEBUG_PACKET_DETAIL;
590
591 for (i = 0; i < 11; i++)
592 if (type & (0x01 << i)) {
593 if (vty->node == CONFIG_NODE)
594 DEBUG_PACKET_OFF(i, flag);
595 else
596 TERM_DEBUG_PACKET_OFF(i, flag);
597 }
598
599 return CMD_SUCCESS;
600 }
601
602 /* Debug node. */
603 static struct cmd_node eigrp_debug_node = {
604 DEBUG_NODE, "", 1 /* VTYSH */
605 };
606
607 /* Initialize debug commands. */
608 void eigrp_debug_init()
609 {
610 install_node(&eigrp_debug_node, config_write_debug);
611
612 install_element(ENABLE_NODE, &show_debugging_eigrp_cmd);
613 install_element(ENABLE_NODE, &debug_eigrp_packets_all_cmd);
614 install_element(ENABLE_NODE, &no_debug_eigrp_packets_all_cmd);
615 install_element(ENABLE_NODE, &debug_eigrp_transmit_cmd);
616 install_element(ENABLE_NODE, &no_debug_eigrp_transmit_cmd);
617
618 install_element(CONFIG_NODE, &show_debugging_eigrp_cmd);
619 install_element(CONFIG_NODE, &debug_eigrp_packets_all_cmd);
620 install_element(CONFIG_NODE, &no_debug_eigrp_packets_all_cmd);
621 install_element(CONFIG_NODE, &debug_eigrp_transmit_cmd);
622 install_element(CONFIG_NODE, &no_debug_eigrp_transmit_cmd);
623 }