]> git.proxmox.com Git - mirror_frr.git/blob - eigrpd/eigrp_dump.c
Merge branch 'master' of https://github.com/dwalton76/frr into bgpd-draft-ietf-grow...
[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", (u_int32_t)iph->ip_id);
121 zlog_debug("ip_off %u", (u_int32_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", (u_int32_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 u_int32_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 u_int32_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 u_int32_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", IF_DEF_PARAMS(ei->ifp)->bandwidth);
214 vty_out(vty, "%-11u", IF_DEF_PARAMS(ei->ifp)->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", IF_DEF_PARAMS(ei->ifp)->v_hello,
220 IF_DEF_PARAMS(ei->ifp)->v_wait);
221 }
222
223 void show_ip_eigrp_interface_detail(struct vty *vty, struct eigrp *eigrp,
224 struct eigrp_interface *ei)
225 {
226 vty_out(vty, "%-2s %s %d %-3s \n", "", "Hello interval is ", 0, " sec");
227 vty_out(vty, "%-2s %s %s \n", "", "Next xmit serial", "<none>");
228 vty_out(vty, "%-2s %s %d %s %d %s %d %s %d \n", "",
229 "Un/reliable mcasts: ", 0, "/", 0, "Un/reliable ucasts: ", 0,
230 "/", 0);
231 vty_out(vty, "%-2s %s %d %s %d %s %d \n", "", "Mcast exceptions: ", 0,
232 " CR packets: ", 0, " ACKs supressed: ", 0);
233 vty_out(vty, "%-2s %s %d %s %d \n", "", "Retransmissions sent: ", 0,
234 "Out-of-sequence rcvd: ", 0);
235 vty_out(vty, "%-2s %s %s %s \n", "", "Authentication mode is ", "not",
236 "set");
237 vty_out(vty, "%-2s %s \n", "", "Use multicast");
238 }
239
240 void show_ip_eigrp_neighbor_header(struct vty *vty, struct eigrp *eigrp)
241 {
242 vty_out(vty,
243 "\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",
244 eigrp->AS, "H", "Address", "Interface", "Hold", "Uptime",
245 "SRTT", "RTO", "Q", "Seq", "", "(sec)", "", "(ms)", "", "Cnt",
246 "Num");
247 }
248
249 void show_ip_eigrp_neighbor_sub(struct vty *vty, struct eigrp_neighbor *nbr,
250 int detail)
251 {
252
253 vty_out(vty, "%-3u %-17s %-21s", 0, eigrp_neigh_ip_string(nbr),
254 eigrp_if_name_string(nbr->ei));
255 if (nbr->t_holddown)
256 vty_out(vty, "%-7lu", 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 struct in_addr router_id;
280 router_id.s_addr = eigrp->router_id;
281
282 vty_out(vty, "\nEIGRP Topology Table for AS(%d)/ID(%s)\n\n", eigrp->AS,
283 inet_ntoa(router_id));
284 vty_out(vty,
285 "Codes: P - Passive, A - Active, U - Update, Q - Query, "
286 "R - Reply\n r - reply Status, s - sia Status\n\n");
287 }
288
289 void show_ip_eigrp_prefix_entry(struct vty *vty, struct eigrp_prefix_entry *tn)
290 {
291 struct list *successors = eigrp_topology_get_successor(tn);
292 char buffer[PREFIX_STRLEN];
293
294 vty_out(vty, "%-3c", (tn->state > 0) ? 'A' : 'P');
295
296 vty_out(vty, "%s, ",
297 prefix2str(tn->destination, buffer, PREFIX_STRLEN));
298 vty_out(vty, "%u successors, ", successors->count);
299 vty_out(vty, "FD is %u, serno: %" PRIu64 " \n", tn->fdistance,
300 tn->serno);
301
302 list_delete(successors);
303 }
304
305 void show_ip_eigrp_neighbor_entry(struct vty *vty, struct eigrp *eigrp,
306 struct eigrp_neighbor_entry *te, int *first)
307 {
308 if (te->reported_distance == EIGRP_MAX_METRIC)
309 return;
310
311 if (*first) {
312 show_ip_eigrp_prefix_entry(vty, te->prefix);
313 *first = 0;
314 }
315
316 if (te->adv_router == eigrp->neighbor_self)
317 vty_out(vty, "%-7s%s, %s\n", " ", "via Connected",
318 eigrp_if_name_string(te->ei));
319 else {
320 vty_out(vty, "%-7s%s%s (%u/%u), %s\n", " ", "via ",
321 inet_ntoa(te->adv_router->src), te->distance,
322 te->reported_distance, eigrp_if_name_string(te->ei));
323 }
324 }
325
326
327 DEFUN_NOSH (show_debugging_eigrp,
328 show_debugging_eigrp_cmd,
329 "show debugging [eigrp]",
330 SHOW_STR
331 DEBUG_STR
332 EIGRP_STR)
333 {
334 int i;
335
336 vty_out(vty, "EIGRP debugging status:\n");
337
338 /* Show debug status for events. */
339 if (IS_DEBUG_EIGRP(event, EVENT))
340 vty_out(vty, " EIGRP event debugging is on\n");
341
342 /* Show debug status for EIGRP Packets. */
343 for (i = 0; i < 11; i++) {
344 if (i == 8)
345 continue;
346
347 if (IS_DEBUG_EIGRP_PACKET(i, SEND)
348 && IS_DEBUG_EIGRP_PACKET(i, RECV)) {
349 vty_out(vty, " EIGRP packet %s%s debugging is on\n",
350 lookup_msg(eigrp_packet_type_str, i + 1, NULL),
351 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
352 ? " detail"
353 : "");
354 } else {
355 if (IS_DEBUG_EIGRP_PACKET(i, SEND))
356 vty_out(vty,
357 " EIGRP packet %s send%s debugging is on\n",
358 lookup_msg(eigrp_packet_type_str, i + 1,
359 NULL),
360 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
361 ? " detail"
362 : "");
363 if (IS_DEBUG_EIGRP_PACKET(i, RECV))
364 vty_out(vty,
365 " EIGRP packet %s receive%s debugging is on\n",
366 lookup_msg(eigrp_packet_type_str, i + 1,
367 NULL),
368 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
369 ? " detail"
370 : "");
371 }
372 }
373
374 return CMD_SUCCESS;
375 }
376
377
378 /*
379 [no] debug eigrp packet (hello|dd|ls-request|ls-update|ls-ack|all)
380 [send|recv [detail]]
381 */
382
383 DEFUN (debug_eigrp_transmit,
384 debug_eigrp_transmit_cmd,
385 "debug eigrp transmit <send|recv|all> [detail]",
386 DEBUG_STR
387 EIGRP_STR
388 "EIGRP transmission events\n"
389 "packet sent\n"
390 "packet received\n"
391 "all packets\n"
392 "Detailed Information\n")
393 {
394 int flag = 0;
395 int idx = 2;
396
397 /* send or recv. */
398 if (argv_find(argv, argc, "send", &idx))
399 flag = EIGRP_DEBUG_SEND;
400 else if (argv_find(argv, argc, "recv", &idx))
401 flag = EIGRP_DEBUG_RECV;
402 else if (argv_find(argv, argc, "all", &idx))
403 flag = EIGRP_DEBUG_SEND_RECV;
404
405 /* detail option */
406 if (argv_find(argv, argc, "detail", &idx))
407 flag = EIGRP_DEBUG_PACKET_DETAIL;
408
409 if (vty->node == CONFIG_NODE)
410 DEBUG_TRANSMIT_ON(0, flag);
411 else
412 TERM_DEBUG_TRANSMIT_ON(0, flag);
413
414 return CMD_SUCCESS;
415 }
416
417 DEFUN (no_debug_eigrp_transmit,
418 no_debug_eigrp_transmit_cmd,
419 "no debug eigrp transmit <send|recv|all> [detail]",
420 NO_STR
421 UNDEBUG_STR
422 EIGRP_STR
423 "EIGRP transmission events\n"
424 "packet sent\n"
425 "packet received\n"
426 "all packets\n"
427 "Detailed Information\n")
428 {
429 int flag = 0;
430 int idx = 3;
431
432 /* send or recv. */
433 if (argv_find(argv, argc, "send", &idx))
434 flag = EIGRP_DEBUG_SEND;
435 else if (argv_find(argv, argc, "recv", &idx))
436 flag = EIGRP_DEBUG_RECV;
437 else if (argv_find(argv, argc, "all", &idx))
438 flag = EIGRP_DEBUG_SEND_RECV;
439
440 /* detail option */
441 if (argv_find(argv, argc, "detail", &idx))
442 flag = EIGRP_DEBUG_PACKET_DETAIL;
443
444 if (vty->node == CONFIG_NODE)
445 DEBUG_TRANSMIT_OFF(0, flag);
446 else
447 TERM_DEBUG_TRANSMIT_OFF(0, flag);
448
449 return CMD_SUCCESS;
450 }
451
452 DEFUN (debug_eigrp_packets,
453 debug_eigrp_packets_all_cmd,
454 "debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
455 DEBUG_STR
456 EIGRP_STR
457 "EIGRP packets\n"
458 "EIGRP SIA-Query packets\n"
459 "EIGRP SIA-Reply packets\n"
460 "EIGRP ack packets\n"
461 "EIGRP hello packets\n"
462 "EIGRP probe packets\n"
463 "EIGRP query packets\n"
464 "EIGRP reply packets\n"
465 "EIGRP request packets\n"
466 "EIGRP retransmissions\n"
467 "EIGRP stub packets\n"
468 "Display all EIGRP packets except Hellos\n"
469 "EIGRP update packets\n"
470 "Display all EIGRP packets\n"
471 "Send Packets\n"
472 "Receive Packets\n"
473 "Detail Information\n")
474 {
475 int type = 0;
476 int flag = 0;
477 int i;
478 int idx = 0;
479
480 /* Check packet type. */
481 if (argv_find(argv, argc, "hello", &idx))
482 type = EIGRP_DEBUG_HELLO;
483 if (argv_find(argv, argc, "update", &idx))
484 type = EIGRP_DEBUG_UPDATE;
485 if (argv_find(argv, argc, "query", &idx))
486 type = EIGRP_DEBUG_QUERY;
487 if (argv_find(argv, argc, "ack", &idx))
488 type = EIGRP_DEBUG_ACK;
489 if (argv_find(argv, argc, "probe", &idx))
490 type = EIGRP_DEBUG_PROBE;
491 if (argv_find(argv, argc, "stub", &idx))
492 type = EIGRP_DEBUG_STUB;
493 if (argv_find(argv, argc, "reply", &idx))
494 type = EIGRP_DEBUG_REPLY;
495 if (argv_find(argv, argc, "request", &idx))
496 type = EIGRP_DEBUG_REQUEST;
497 if (argv_find(argv, argc, "siaquery", &idx))
498 type = EIGRP_DEBUG_SIAQUERY;
499 if (argv_find(argv, argc, "siareply", &idx))
500 type = EIGRP_DEBUG_SIAREPLY;
501 if (argv_find(argv, argc, "all", &idx))
502 type = EIGRP_DEBUG_PACKETS_ALL;
503
504
505 /* All packet types, both send and recv. */
506 flag = EIGRP_DEBUG_SEND_RECV;
507
508 /* send or recv. */
509 if (argv_find(argv, argc, "s", &idx))
510 flag = EIGRP_DEBUG_SEND;
511 else if (argv_find(argv, argc, "r", &idx))
512 flag = EIGRP_DEBUG_RECV;
513
514 /* detail. */
515 if (argv_find(argv, argc, "detail", &idx))
516 flag |= EIGRP_DEBUG_PACKET_DETAIL;
517
518 for (i = 0; i < 11; i++)
519 if (type & (0x01 << i)) {
520 if (vty->node == CONFIG_NODE)
521 DEBUG_PACKET_ON(i, flag);
522 else
523 TERM_DEBUG_PACKET_ON(i, flag);
524 }
525
526 return CMD_SUCCESS;
527 }
528
529 DEFUN (no_debug_eigrp_packets,
530 no_debug_eigrp_packets_all_cmd,
531 "no debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
532 NO_STR
533 UNDEBUG_STR
534 EIGRP_STR
535 "EIGRP packets\n"
536 "EIGRP SIA-Query packets\n"
537 "EIGRP SIA-Reply packets\n"
538 "EIGRP ack packets\n"
539 "EIGRP hello packets\n"
540 "EIGRP probe packets\n"
541 "EIGRP query packets\n"
542 "EIGRP reply packets\n"
543 "EIGRP request packets\n"
544 "EIGRP retransmissions\n"
545 "EIGRP stub packets\n"
546 "Display all EIGRP packets except Hellos\n"
547 "EIGRP update packets\n"
548 "Display all EIGRP packets\n"
549 "Send Packets\n"
550 "Receive Packets\n"
551 "Detailed Information\n")
552 {
553 int type = 0;
554 int flag = 0;
555 int i;
556 int idx = 0;
557
558 /* Check packet type. */
559 if (argv_find(argv, argc, "hello", &idx))
560 type = EIGRP_DEBUG_HELLO;
561 if (argv_find(argv, argc, "update", &idx))
562 type = EIGRP_DEBUG_UPDATE;
563 if (argv_find(argv, argc, "query", &idx))
564 type = EIGRP_DEBUG_QUERY;
565 if (argv_find(argv, argc, "ack", &idx))
566 type = EIGRP_DEBUG_ACK;
567 if (argv_find(argv, argc, "probe", &idx))
568 type = EIGRP_DEBUG_PROBE;
569 if (argv_find(argv, argc, "stub", &idx))
570 type = EIGRP_DEBUG_STUB;
571 if (argv_find(argv, argc, "reply", &idx))
572 type = EIGRP_DEBUG_REPLY;
573 if (argv_find(argv, argc, "request", &idx))
574 type = EIGRP_DEBUG_REQUEST;
575 if (argv_find(argv, argc, "siaquery", &idx))
576 type = EIGRP_DEBUG_SIAQUERY;
577 if (argv_find(argv, argc, "siareply", &idx))
578 type = EIGRP_DEBUG_SIAREPLY;
579
580 /* Default, both send and recv. */
581 flag = EIGRP_DEBUG_SEND_RECV;
582
583 /* send or recv. */
584 if (argv_find(argv, argc, "send", &idx))
585 flag = EIGRP_DEBUG_SEND;
586 else if (argv_find(argv, argc, "reply", &idx))
587 flag = EIGRP_DEBUG_RECV;
588
589 /* detail. */
590 if (argv_find(argv, argc, "detail", &idx))
591 flag |= EIGRP_DEBUG_PACKET_DETAIL;
592
593 for (i = 0; i < 11; i++)
594 if (type & (0x01 << i)) {
595 if (vty->node == CONFIG_NODE)
596 DEBUG_PACKET_OFF(i, flag);
597 else
598 TERM_DEBUG_PACKET_OFF(i, flag);
599 }
600
601 return CMD_SUCCESS;
602 }
603
604 /* Debug node. */
605 static struct cmd_node eigrp_debug_node = {
606 DEBUG_NODE, "", 1 /* VTYSH */
607 };
608
609 /* Initialize debug commands. */
610 void eigrp_debug_init()
611 {
612 install_node(&eigrp_debug_node, config_write_debug);
613
614 install_element(ENABLE_NODE, &show_debugging_eigrp_cmd);
615 install_element(ENABLE_NODE, &debug_eigrp_packets_all_cmd);
616 install_element(ENABLE_NODE, &no_debug_eigrp_packets_all_cmd);
617 install_element(ENABLE_NODE, &debug_eigrp_transmit_cmd);
618 install_element(ENABLE_NODE, &no_debug_eigrp_transmit_cmd);
619
620 install_element(CONFIG_NODE, &show_debugging_eigrp_cmd);
621 install_element(CONFIG_NODE, &debug_eigrp_packets_all_cmd);
622 install_element(CONFIG_NODE, &no_debug_eigrp_packets_all_cmd);
623 install_element(CONFIG_NODE, &debug_eigrp_transmit_cmd);
624 install_element(CONFIG_NODE, &no_debug_eigrp_transmit_cmd);
625 }