]> git.proxmox.com Git - mirror_frr.git/blob - eigrpd/eigrp_dump.c
Merge pull request #1012 from donaldsharp/eigrp_send_version
[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_ipv4->prefix.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
293 vty_out(vty, "%-3c", (tn->state > 0) ? 'A' : 'P');
294
295 vty_out(vty, "%s/%u, ", inet_ntoa(tn->destination_ipv4->prefix),
296 tn->destination_ipv4->prefixlen);
297 vty_out(vty, "%u successors, ", successors->count);
298 vty_out(vty, "FD is %u, serno: %" PRIu64 " \n", tn->fdistance,
299 tn->serno);
300
301 list_delete(successors);
302 }
303
304 void show_ip_eigrp_neighbor_entry(struct vty *vty, struct eigrp *eigrp,
305 struct eigrp_neighbor_entry *te, int *first)
306 {
307 if (te->reported_distance == EIGRP_MAX_METRIC)
308 return;
309
310 if (*first) {
311 show_ip_eigrp_prefix_entry(vty, te->prefix);
312 *first = 0;
313 }
314
315 if (te->adv_router == eigrp->neighbor_self)
316 vty_out(vty, "%-7s%s, %s\n", " ", "via Connected",
317 eigrp_if_name_string(te->ei));
318 else {
319 vty_out(vty, "%-7s%s%s (%u/%u), %s\n", " ", "via ",
320 inet_ntoa(te->adv_router->src), te->distance,
321 te->reported_distance, eigrp_if_name_string(te->ei));
322 }
323 }
324
325
326 DEFUN_NOSH (show_debugging_eigrp,
327 show_debugging_eigrp_cmd,
328 "show debugging [eigrp]",
329 SHOW_STR
330 DEBUG_STR
331 EIGRP_STR)
332 {
333 int i;
334
335 vty_out(vty, "EIGRP debugging status:\n");
336
337 /* Show debug status for events. */
338 if (IS_DEBUG_EIGRP(event, EVENT))
339 vty_out(vty, " EIGRP event debugging is on\n");
340
341 /* Show debug status for EIGRP Packets. */
342 for (i = 0; i < 11; i++) {
343 if (i == 8)
344 continue;
345
346 if (IS_DEBUG_EIGRP_PACKET(i, SEND)
347 && IS_DEBUG_EIGRP_PACKET(i, RECV)) {
348 vty_out(vty, " EIGRP packet %s%s debugging is on\n",
349 lookup_msg(eigrp_packet_type_str, i + 1, NULL),
350 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
351 ? " detail"
352 : "");
353 } else {
354 if (IS_DEBUG_EIGRP_PACKET(i, SEND))
355 vty_out(vty,
356 " EIGRP packet %s send%s debugging is on\n",
357 lookup_msg(eigrp_packet_type_str, i + 1,
358 NULL),
359 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
360 ? " detail"
361 : "");
362 if (IS_DEBUG_EIGRP_PACKET(i, RECV))
363 vty_out(vty,
364 " EIGRP packet %s receive%s debugging is on\n",
365 lookup_msg(eigrp_packet_type_str, i + 1,
366 NULL),
367 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
368 ? " detail"
369 : "");
370 }
371 }
372
373 return CMD_SUCCESS;
374 }
375
376
377 /*
378 [no] debug eigrp packet (hello|dd|ls-request|ls-update|ls-ack|all)
379 [send|recv [detail]]
380 */
381
382 DEFUN (debug_eigrp_transmit,
383 debug_eigrp_transmit_cmd,
384 "debug eigrp transmit <send|recv|all> [detail]",
385 DEBUG_STR
386 EIGRP_STR
387 "EIGRP transmission events\n"
388 "packet sent\n"
389 "packet received\n"
390 "all packets\n"
391 "Detailed Information\n")
392 {
393 int flag = 0;
394 int idx = 2;
395
396 /* send or recv. */
397 if (argv_find(argv, argc, "send", &idx))
398 flag = EIGRP_DEBUG_SEND;
399 else if (argv_find(argv, argc, "recv", &idx))
400 flag = EIGRP_DEBUG_RECV;
401 else if (argv_find(argv, argc, "all", &idx))
402 flag = EIGRP_DEBUG_SEND_RECV;
403
404 /* detail option */
405 if (argv_find(argv, argc, "detail", &idx))
406 flag = EIGRP_DEBUG_PACKET_DETAIL;
407
408 if (vty->node == CONFIG_NODE)
409 DEBUG_TRANSMIT_ON(0, flag);
410 else
411 TERM_DEBUG_TRANSMIT_ON(0, flag);
412
413 return CMD_SUCCESS;
414 }
415
416 DEFUN (no_debug_eigrp_transmit,
417 no_debug_eigrp_transmit_cmd,
418 "no debug eigrp transmit <send|recv|all> [detail]",
419 NO_STR
420 UNDEBUG_STR
421 EIGRP_STR
422 "EIGRP transmission events\n"
423 "packet sent\n"
424 "packet received\n"
425 "all packets\n"
426 "Detailed Information\n")
427 {
428 int flag = 0;
429 int idx = 3;
430
431 /* send or recv. */
432 if (argv_find(argv, argc, "send", &idx))
433 flag = EIGRP_DEBUG_SEND;
434 else if (argv_find(argv, argc, "recv", &idx))
435 flag = EIGRP_DEBUG_RECV;
436 else if (argv_find(argv, argc, "all", &idx))
437 flag = EIGRP_DEBUG_SEND_RECV;
438
439 /* detail option */
440 if (argv_find(argv, argc, "detail", &idx))
441 flag = EIGRP_DEBUG_PACKET_DETAIL;
442
443 if (vty->node == CONFIG_NODE)
444 DEBUG_TRANSMIT_OFF(0, flag);
445 else
446 TERM_DEBUG_TRANSMIT_OFF(0, flag);
447
448 return CMD_SUCCESS;
449 }
450
451 DEFUN (debug_eigrp_packets,
452 debug_eigrp_packets_all_cmd,
453 "debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
454 DEBUG_STR
455 EIGRP_STR
456 "EIGRP packets\n"
457 "EIGRP SIA-Query packets\n"
458 "EIGRP SIA-Reply packets\n"
459 "EIGRP ack packets\n"
460 "EIGRP hello packets\n"
461 "EIGRP probe packets\n"
462 "EIGRP query packets\n"
463 "EIGRP reply packets\n"
464 "EIGRP request packets\n"
465 "EIGRP retransmissions\n"
466 "EIGRP stub packets\n"
467 "Display all EIGRP packets except Hellos\n"
468 "EIGRP update packets\n"
469 "Display all EIGRP packets\n"
470 "Send Packets\n"
471 "Receive Packets\n"
472 "Detail Information\n")
473 {
474 int type = 0;
475 int flag = 0;
476 int i;
477 int idx = 0;
478
479 /* Check packet type. */
480 if (argv_find(argv, argc, "hello", &idx))
481 type = EIGRP_DEBUG_HELLO;
482 if (argv_find(argv, argc, "update", &idx))
483 type = EIGRP_DEBUG_UPDATE;
484 if (argv_find(argv, argc, "query", &idx))
485 type = EIGRP_DEBUG_QUERY;
486 if (argv_find(argv, argc, "ack", &idx))
487 type = EIGRP_DEBUG_ACK;
488 if (argv_find(argv, argc, "probe", &idx))
489 type = EIGRP_DEBUG_PROBE;
490 if (argv_find(argv, argc, "stub", &idx))
491 type = EIGRP_DEBUG_STUB;
492 if (argv_find(argv, argc, "reply", &idx))
493 type = EIGRP_DEBUG_REPLY;
494 if (argv_find(argv, argc, "request", &idx))
495 type = EIGRP_DEBUG_REQUEST;
496 if (argv_find(argv, argc, "siaquery", &idx))
497 type = EIGRP_DEBUG_SIAQUERY;
498 if (argv_find(argv, argc, "siareply", &idx))
499 type = EIGRP_DEBUG_SIAREPLY;
500 if (argv_find(argv, argc, "all", &idx))
501 type = EIGRP_DEBUG_PACKETS_ALL;
502
503
504 /* All packet types, both send and recv. */
505 flag = EIGRP_DEBUG_SEND_RECV;
506
507 /* send or recv. */
508 if (argv_find(argv, argc, "s", &idx))
509 flag = EIGRP_DEBUG_SEND;
510 else if (argv_find(argv, argc, "r", &idx))
511 flag = EIGRP_DEBUG_RECV;
512
513 /* detail. */
514 if (argv_find(argv, argc, "detail", &idx))
515 flag |= EIGRP_DEBUG_PACKET_DETAIL;
516
517 for (i = 0; i < 11; i++)
518 if (type & (0x01 << i)) {
519 if (vty->node == CONFIG_NODE)
520 DEBUG_PACKET_ON(i, flag);
521 else
522 TERM_DEBUG_PACKET_ON(i, flag);
523 }
524
525 return CMD_SUCCESS;
526 }
527
528 DEFUN (no_debug_eigrp_packets,
529 no_debug_eigrp_packets_all_cmd,
530 "no debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
531 NO_STR
532 UNDEBUG_STR
533 EIGRP_STR
534 "EIGRP packets\n"
535 "EIGRP SIA-Query packets\n"
536 "EIGRP SIA-Reply packets\n"
537 "EIGRP ack packets\n"
538 "EIGRP hello packets\n"
539 "EIGRP probe packets\n"
540 "EIGRP query packets\n"
541 "EIGRP reply packets\n"
542 "EIGRP request packets\n"
543 "EIGRP retransmissions\n"
544 "EIGRP stub packets\n"
545 "Display all EIGRP packets except Hellos\n"
546 "EIGRP update packets\n"
547 "Display all EIGRP packets\n"
548 "Send Packets\n"
549 "Receive Packets\n"
550 "Detailed Information\n")
551 {
552 int type = 0;
553 int flag = 0;
554 int i;
555 int idx = 0;
556
557 /* Check packet type. */
558 if (argv_find(argv, argc, "hello", &idx))
559 type = EIGRP_DEBUG_HELLO;
560 if (argv_find(argv, argc, "update", &idx))
561 type = EIGRP_DEBUG_UPDATE;
562 if (argv_find(argv, argc, "query", &idx))
563 type = EIGRP_DEBUG_QUERY;
564 if (argv_find(argv, argc, "ack", &idx))
565 type = EIGRP_DEBUG_ACK;
566 if (argv_find(argv, argc, "probe", &idx))
567 type = EIGRP_DEBUG_PROBE;
568 if (argv_find(argv, argc, "stub", &idx))
569 type = EIGRP_DEBUG_STUB;
570 if (argv_find(argv, argc, "reply", &idx))
571 type = EIGRP_DEBUG_REPLY;
572 if (argv_find(argv, argc, "request", &idx))
573 type = EIGRP_DEBUG_REQUEST;
574 if (argv_find(argv, argc, "siaquery", &idx))
575 type = EIGRP_DEBUG_SIAQUERY;
576 if (argv_find(argv, argc, "siareply", &idx))
577 type = EIGRP_DEBUG_SIAREPLY;
578
579 /* Default, both send and recv. */
580 flag = EIGRP_DEBUG_SEND_RECV;
581
582 /* send or recv. */
583 if (argv_find(argv, argc, "send", &idx))
584 flag = EIGRP_DEBUG_SEND;
585 else if (argv_find(argv, argc, "reply", &idx))
586 flag = EIGRP_DEBUG_RECV;
587
588 /* detail. */
589 if (argv_find(argv, argc, "detail", &idx))
590 flag |= EIGRP_DEBUG_PACKET_DETAIL;
591
592 for (i = 0; i < 11; i++)
593 if (type & (0x01 << i)) {
594 if (vty->node == CONFIG_NODE)
595 DEBUG_PACKET_OFF(i, flag);
596 else
597 TERM_DEBUG_PACKET_OFF(i, flag);
598 }
599
600 return CMD_SUCCESS;
601 }
602
603 /* Debug node. */
604 static struct cmd_node eigrp_debug_node = {
605 DEBUG_NODE, "", 1 /* VTYSH */
606 };
607
608 /* Initialize debug commands. */
609 void eigrp_debug_init()
610 {
611 install_node(&eigrp_debug_node, config_write_debug);
612
613 install_element(ENABLE_NODE, &show_debugging_eigrp_cmd);
614 install_element(ENABLE_NODE, &debug_eigrp_packets_all_cmd);
615 install_element(ENABLE_NODE, &no_debug_eigrp_packets_all_cmd);
616 install_element(ENABLE_NODE, &debug_eigrp_transmit_cmd);
617 install_element(ENABLE_NODE, &no_debug_eigrp_transmit_cmd);
618
619 install_element(CONFIG_NODE, &show_debugging_eigrp_cmd);
620 install_element(CONFIG_NODE, &debug_eigrp_packets_all_cmd);
621 install_element(CONFIG_NODE, &no_debug_eigrp_packets_all_cmd);
622 install_element(CONFIG_NODE, &debug_eigrp_transmit_cmd);
623 install_element(CONFIG_NODE, &no_debug_eigrp_transmit_cmd);
624 }