]> git.proxmox.com Git - mirror_frr.git/blame - eigrpd/eigrp_dump.c
Merge pull request #1244 from donaldsharp/flush_routes
[mirror_frr.git] / eigrpd / eigrp_dump.c
CommitLineData
7f57883e
DS
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 *
896014f4
DL
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
7f57883e
DS
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. */
52unsigned long term_debug_eigrp = 0;
53unsigned long term_debug_eigrp_nei = 0;
4dfa4846 54unsigned long term_debug_eigrp_packet[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
7f57883e
DS
55unsigned long term_debug_eigrp_zebra = 6;
56unsigned long term_debug_eigrp_transmit = 0;
57
58/* Configuration debug option variables. */
59unsigned long conf_debug_eigrp = 0;
60unsigned long conf_debug_eigrp_nei = 0;
4dfa4846 61unsigned long conf_debug_eigrp_packet[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
7f57883e
DS
62unsigned long conf_debug_eigrp_zebra = 0;
63unsigned long conf_debug_eigrp_transmit = 0;
64
65
d62a17ae 66static int config_write_debug(struct vty *vty)
7f57883e 67{
d62a17ae 68 int write = 0;
69 int i;
7f57883e 70
d62a17ae 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"};
7f57883e
DS
78
79
d62a17ae 80 /* debug eigrp event. */
7f57883e 81
d62a17ae 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;
7f57883e 87
d62a17ae 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 }
7f57883e 92
d62a17ae 93 return write;
7f57883e
DS
94}
95
d62a17ae 96static int eigrp_neighbor_packet_queue_sum(struct eigrp_interface *ei)
7f57883e 97{
d62a17ae 98 struct eigrp_neighbor *nbr;
99 struct listnode *node, *nnode;
100 int sum;
101 sum = 0;
7f57883e 102
d62a17ae 103 for (ALL_LIST_ELEMENTS(ei->nbrs, node, nnode, nbr)) {
104 sum += nbr->retrans_queue->count;
105 }
7f57883e 106
d62a17ae 107 return sum;
7f57883e
DS
108}
109
110/*
111 * Expects header to be in host order
112 */
d62a17ae 113void eigrp_ip_header_dump(struct ip *iph)
7f57883e 114{
d62a17ae 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));
7f57883e
DS
127}
128
129/*
130 * Expects header to be in host order
131 */
d62a17ae 132void eigrp_header_dump(struct eigrp_header *eigrph)
7f57883e 133{
d62a17ae 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));
7f57883e
DS
143}
144
d62a17ae 145const char *eigrp_if_name_string(struct eigrp_interface *ei)
7f57883e 146{
d62a17ae 147 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
7f57883e 148
d62a17ae 149 if (!ei)
150 return "inactive";
7f57883e 151
d62a17ae 152 snprintf(buf, EIGRP_IF_STRING_MAXLEN, "%s", ei->ifp->name);
153 return buf;
7f57883e
DS
154}
155
d62a17ae 156const char *eigrp_topology_ip_string(struct eigrp_prefix_entry *tn)
7f57883e 157{
d62a17ae 158 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
159 u_int32_t ifaddr;
160
02b45998 161 ifaddr = ntohl(tn->destination->u.prefix4.s_addr);
d62a17ae 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;
7f57883e
DS
166}
167
168
d62a17ae 169const char *eigrp_if_ip_string(struct eigrp_interface *ei)
7f57883e 170{
d62a17ae 171 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
172 u_int32_t ifaddr;
7f57883e 173
d62a17ae 174 if (!ei)
175 return "inactive";
7f57883e 176
d62a17ae 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);
7f57883e 181
d62a17ae 182 return buf;
7f57883e
DS
183}
184
d62a17ae 185const char *eigrp_neigh_ip_string(struct eigrp_neighbor *nbr)
7f57883e 186{
d62a17ae 187 static char buf[EIGRP_IF_STRING_MAXLEN] = "";
188 u_int32_t ifaddr;
7f57883e 189
d62a17ae 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);
7f57883e 194
d62a17ae 195 return buf;
7f57883e
DS
196}
197
d62a17ae 198void show_ip_eigrp_interface_header(struct vty *vty, struct eigrp *eigrp)
7f57883e
DS
199{
200
d62a17ae 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");
7f57883e
DS
207}
208
d62a17ae 209void show_ip_eigrp_interface_sub(struct vty *vty, struct eigrp *eigrp,
210 struct eigrp_interface *ei)
7f57883e 211{
d62a17ae 212 vty_out(vty, "%-11s ", eigrp_if_name_string(ei));
b748db67
DS
213 vty_out(vty, "%-11u", ei->params.bandwidth);
214 vty_out(vty, "%-11u", ei->params.delay);
d62a17ae 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);
b748db67
DS
219 vty_out(vty, "%-8u %-8u \n", ei->params.v_hello,
220 ei->params.v_wait);
7f57883e
DS
221}
222
d62a17ae 223void show_ip_eigrp_interface_detail(struct vty *vty, struct eigrp *eigrp,
224 struct eigrp_interface *ei)
7f57883e 225{
d62a17ae 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");
7f57883e
DS
238}
239
d62a17ae 240void show_ip_eigrp_neighbor_header(struct vty *vty, struct eigrp *eigrp)
7f57883e 241{
d62a17ae 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");
7f57883e
DS
247}
248
d62a17ae 249void show_ip_eigrp_neighbor_sub(struct vty *vty, struct eigrp_neighbor *nbr,
250 int detail)
7f57883e
DS
251{
252
d62a17ae 253 vty_out(vty, "%-3u %-17s %-21s", 0, eigrp_neigh_ip_string(nbr),
254 eigrp_if_name_string(nbr->ei));
2085179b
AL
255 if (nbr->t_holddown)
256 vty_out(vty, "%-7lu", thread_timer_remain_second(nbr->t_holddown));
257 else
258 vty_out(vty, "- ");
d62a17ae 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 }
7f57883e
DS
272}
273
274/*
275 * Print standard header for show EIGRP topology output
276 */
d62a17ae 277void show_ip_eigrp_topology_header(struct vty *vty, struct eigrp *eigrp)
7f57883e 278{
d62a17ae 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");
7f57883e
DS
287}
288
d62a17ae 289void show_ip_eigrp_prefix_entry(struct vty *vty, struct eigrp_prefix_entry *tn)
7f57883e 290{
d62a17ae 291 struct list *successors = eigrp_topology_get_successor(tn);
02b45998 292 char buffer[PREFIX_STRLEN];
057fad8d 293
d62a17ae 294 vty_out(vty, "%-3c", (tn->state > 0) ? 'A' : 'P');
910a5c0e 295
02b45998
DS
296 vty_out(vty, "%s, ",
297 prefix2str(tn->destination, buffer, PREFIX_STRLEN));
dbfd865b
DS
298 vty_out(vty, "%u successors, ",
299 (successors) ? successors->count : 0);
d62a17ae 300 vty_out(vty, "FD is %u, serno: %" PRIu64 " \n", tn->fdistance,
301 tn->serno);
057fad8d 302
dbfd865b
DS
303 if (successors)
304 list_delete(successors);
7f57883e
DS
305}
306
255ab940
DS
307void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
308 struct eigrp_nexthop_entry *te, int *first)
7f57883e 309{
d62a17ae 310 if (te->reported_distance == EIGRP_MAX_METRIC)
311 return;
312
313 if (*first) {
314 show_ip_eigrp_prefix_entry(vty, te->prefix);
315 *first = 0;
316 }
317
318 if (te->adv_router == eigrp->neighbor_self)
319 vty_out(vty, "%-7s%s, %s\n", " ", "via Connected",
320 eigrp_if_name_string(te->ei));
321 else {
322 vty_out(vty, "%-7s%s%s (%u/%u), %s\n", " ", "via ",
323 inet_ntoa(te->adv_router->src), te->distance,
324 te->reported_distance, eigrp_if_name_string(te->ei));
325 }
7f57883e
DS
326}
327
328
87f6dc50
DS
329DEFUN_NOSH (show_debugging_eigrp,
330 show_debugging_eigrp_cmd,
331 "show debugging [eigrp]",
332 SHOW_STR
333 DEBUG_STR
334 EIGRP_STR)
7f57883e 335{
d62a17ae 336 int i;
337
338 vty_out(vty, "EIGRP debugging status:\n");
339
340 /* Show debug status for events. */
341 if (IS_DEBUG_EIGRP(event, EVENT))
342 vty_out(vty, " EIGRP event debugging is on\n");
343
344 /* Show debug status for EIGRP Packets. */
345 for (i = 0; i < 11; i++) {
346 if (i == 8)
347 continue;
348
349 if (IS_DEBUG_EIGRP_PACKET(i, SEND)
350 && IS_DEBUG_EIGRP_PACKET(i, RECV)) {
351 vty_out(vty, " EIGRP packet %s%s debugging is on\n",
352 lookup_msg(eigrp_packet_type_str, i + 1, NULL),
353 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
354 ? " detail"
355 : "");
356 } else {
357 if (IS_DEBUG_EIGRP_PACKET(i, SEND))
358 vty_out(vty,
359 " EIGRP packet %s send%s debugging is on\n",
360 lookup_msg(eigrp_packet_type_str, i + 1,
361 NULL),
362 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
363 ? " detail"
364 : "");
365 if (IS_DEBUG_EIGRP_PACKET(i, RECV))
366 vty_out(vty,
367 " EIGRP packet %s receive%s debugging is on\n",
368 lookup_msg(eigrp_packet_type_str, i + 1,
369 NULL),
370 IS_DEBUG_EIGRP_PACKET(i, PACKET_DETAIL)
371 ? " detail"
372 : "");
373 }
374 }
375
376 return CMD_SUCCESS;
7f57883e
DS
377}
378
379
380/*
f9e5c9ca
DS
381 [no] debug eigrp packet (hello|dd|ls-request|ls-update|ls-ack|all)
382 [send|recv [detail]]
7f57883e
DS
383*/
384
385DEFUN (debug_eigrp_transmit,
386 debug_eigrp_transmit_cmd,
387 "debug eigrp transmit <send|recv|all> [detail]",
388 DEBUG_STR
389 EIGRP_STR
390 "EIGRP transmission events\n"
391 "packet sent\n"
392 "packet received\n"
393 "all packets\n"
394 "Detailed Information\n")
395{
d62a17ae 396 int flag = 0;
397 int idx = 2;
398
399 /* send or recv. */
400 if (argv_find(argv, argc, "send", &idx))
401 flag = EIGRP_DEBUG_SEND;
402 else if (argv_find(argv, argc, "recv", &idx))
403 flag = EIGRP_DEBUG_RECV;
89bb508b 404 else if (argv_find(argv, argc, "all", &idx))
d62a17ae 405 flag = EIGRP_DEBUG_SEND_RECV;
406
407 /* detail option */
89bb508b 408 if (argv_find(argv, argc, "detail", &idx))
d62a17ae 409 flag = EIGRP_DEBUG_PACKET_DETAIL;
410
411 if (vty->node == CONFIG_NODE)
412 DEBUG_TRANSMIT_ON(0, flag);
413 else
414 TERM_DEBUG_TRANSMIT_ON(0, flag);
415
416 return CMD_SUCCESS;
7f57883e
DS
417}
418
419DEFUN (no_debug_eigrp_transmit,
420 no_debug_eigrp_transmit_cmd,
421 "no debug eigrp transmit <send|recv|all> [detail]",
422 NO_STR
423 UNDEBUG_STR
424 EIGRP_STR
425 "EIGRP transmission events\n"
426 "packet sent\n"
427 "packet received\n"
428 "all packets\n"
429 "Detailed Information\n")
430{
d62a17ae 431 int flag = 0;
432 int idx = 3;
433
434 /* send or recv. */
89bb508b 435 if (argv_find(argv, argc, "send", &idx))
d62a17ae 436 flag = EIGRP_DEBUG_SEND;
89bb508b 437 else if (argv_find(argv, argc, "recv", &idx))
d62a17ae 438 flag = EIGRP_DEBUG_RECV;
89bb508b 439 else if (argv_find(argv, argc, "all", &idx))
d62a17ae 440 flag = EIGRP_DEBUG_SEND_RECV;
441
442 /* detail option */
89bb508b 443 if (argv_find(argv, argc, "detail", &idx))
d62a17ae 444 flag = EIGRP_DEBUG_PACKET_DETAIL;
445
446 if (vty->node == CONFIG_NODE)
447 DEBUG_TRANSMIT_OFF(0, flag);
448 else
449 TERM_DEBUG_TRANSMIT_OFF(0, flag);
450
451 return CMD_SUCCESS;
7f57883e
DS
452}
453
454DEFUN (debug_eigrp_packets,
455 debug_eigrp_packets_all_cmd,
456 "debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
457 DEBUG_STR
458 EIGRP_STR
459 "EIGRP packets\n"
460 "EIGRP SIA-Query packets\n"
461 "EIGRP SIA-Reply packets\n"
462 "EIGRP ack packets\n"
463 "EIGRP hello packets\n"
464 "EIGRP probe packets\n"
465 "EIGRP query packets\n"
466 "EIGRP reply packets\n"
467 "EIGRP request packets\n"
468 "EIGRP retransmissions\n"
469 "EIGRP stub packets\n"
470 "Display all EIGRP packets except Hellos\n"
471 "EIGRP update packets\n"
472 "Display all EIGRP packets\n"
473 "Send Packets\n"
474 "Receive Packets\n"
475 "Detail Information\n")
476{
d62a17ae 477 int type = 0;
478 int flag = 0;
479 int i;
480 int idx = 0;
481
482 /* Check packet type. */
89bb508b 483 if (argv_find(argv, argc, "hello", &idx))
d62a17ae 484 type = EIGRP_DEBUG_HELLO;
89bb508b 485 if (argv_find(argv, argc, "update", &idx))
d62a17ae 486 type = EIGRP_DEBUG_UPDATE;
89bb508b 487 if (argv_find(argv, argc, "query", &idx))
d62a17ae 488 type = EIGRP_DEBUG_QUERY;
89bb508b 489 if (argv_find(argv, argc, "ack", &idx))
d62a17ae 490 type = EIGRP_DEBUG_ACK;
89bb508b 491 if (argv_find(argv, argc, "probe", &idx))
d62a17ae 492 type = EIGRP_DEBUG_PROBE;
89bb508b 493 if (argv_find(argv, argc, "stub", &idx))
d62a17ae 494 type = EIGRP_DEBUG_STUB;
89bb508b 495 if (argv_find(argv, argc, "reply", &idx))
d62a17ae 496 type = EIGRP_DEBUG_REPLY;
89bb508b 497 if (argv_find(argv, argc, "request", &idx))
d62a17ae 498 type = EIGRP_DEBUG_REQUEST;
89bb508b 499 if (argv_find(argv, argc, "siaquery", &idx))
d62a17ae 500 type = EIGRP_DEBUG_SIAQUERY;
89bb508b 501 if (argv_find(argv, argc, "siareply", &idx))
d62a17ae 502 type = EIGRP_DEBUG_SIAREPLY;
89bb508b 503 if (argv_find(argv, argc, "all", &idx))
d62a17ae 504 type = EIGRP_DEBUG_PACKETS_ALL;
505
506
507 /* All packet types, both send and recv. */
508 flag = EIGRP_DEBUG_SEND_RECV;
509
510 /* send or recv. */
89bb508b 511 if (argv_find(argv, argc, "s", &idx))
d62a17ae 512 flag = EIGRP_DEBUG_SEND;
89bb508b 513 else if (argv_find(argv, argc, "r", &idx))
d62a17ae 514 flag = EIGRP_DEBUG_RECV;
515
516 /* detail. */
89bb508b 517 if (argv_find(argv, argc, "detail", &idx))
d62a17ae 518 flag |= EIGRP_DEBUG_PACKET_DETAIL;
519
520 for (i = 0; i < 11; i++)
521 if (type & (0x01 << i)) {
522 if (vty->node == CONFIG_NODE)
523 DEBUG_PACKET_ON(i, flag);
524 else
525 TERM_DEBUG_PACKET_ON(i, flag);
526 }
527
528 return CMD_SUCCESS;
7f57883e
DS
529}
530
531DEFUN (no_debug_eigrp_packets,
532 no_debug_eigrp_packets_all_cmd,
533 "no debug eigrp packets <siaquery|siareply|ack|hello|probe|query|reply|request|retry|stub|terse|update|all> [send|receive] [detail]",
534 NO_STR
535 UNDEBUG_STR
536 EIGRP_STR
537 "EIGRP packets\n"
538 "EIGRP SIA-Query packets\n"
539 "EIGRP SIA-Reply packets\n"
540 "EIGRP ack packets\n"
541 "EIGRP hello packets\n"
542 "EIGRP probe packets\n"
543 "EIGRP query packets\n"
544 "EIGRP reply packets\n"
545 "EIGRP request packets\n"
546 "EIGRP retransmissions\n"
547 "EIGRP stub packets\n"
548 "Display all EIGRP packets except Hellos\n"
549 "EIGRP update packets\n"
550 "Display all EIGRP packets\n"
551 "Send Packets\n"
552 "Receive Packets\n"
553 "Detailed Information\n")
554{
d62a17ae 555 int type = 0;
556 int flag = 0;
557 int i;
558 int idx = 0;
559
560 /* Check packet type. */
89bb508b 561 if (argv_find(argv, argc, "hello", &idx))
d62a17ae 562 type = EIGRP_DEBUG_HELLO;
89bb508b 563 if (argv_find(argv, argc, "update", &idx))
d62a17ae 564 type = EIGRP_DEBUG_UPDATE;
89bb508b 565 if (argv_find(argv, argc, "query", &idx))
d62a17ae 566 type = EIGRP_DEBUG_QUERY;
89bb508b 567 if (argv_find(argv, argc, "ack", &idx))
d62a17ae 568 type = EIGRP_DEBUG_ACK;
89bb508b 569 if (argv_find(argv, argc, "probe", &idx))
d62a17ae 570 type = EIGRP_DEBUG_PROBE;
89bb508b 571 if (argv_find(argv, argc, "stub", &idx))
d62a17ae 572 type = EIGRP_DEBUG_STUB;
89bb508b 573 if (argv_find(argv, argc, "reply", &idx))
d62a17ae 574 type = EIGRP_DEBUG_REPLY;
89bb508b 575 if (argv_find(argv, argc, "request", &idx))
d62a17ae 576 type = EIGRP_DEBUG_REQUEST;
89bb508b 577 if (argv_find(argv, argc, "siaquery", &idx))
d62a17ae 578 type = EIGRP_DEBUG_SIAQUERY;
89bb508b 579 if (argv_find(argv, argc, "siareply", &idx))
d62a17ae 580 type = EIGRP_DEBUG_SIAREPLY;
581
582 /* Default, both send and recv. */
583 flag = EIGRP_DEBUG_SEND_RECV;
584
585 /* send or recv. */
89bb508b 586 if (argv_find(argv, argc, "send", &idx))
d62a17ae 587 flag = EIGRP_DEBUG_SEND;
89bb508b 588 else if (argv_find(argv, argc, "reply", &idx))
d62a17ae 589 flag = EIGRP_DEBUG_RECV;
590
591 /* detail. */
89bb508b 592 if (argv_find(argv, argc, "detail", &idx))
d62a17ae 593 flag |= EIGRP_DEBUG_PACKET_DETAIL;
594
595 for (i = 0; i < 11; i++)
596 if (type & (0x01 << i)) {
597 if (vty->node == CONFIG_NODE)
598 DEBUG_PACKET_OFF(i, flag);
599 else
600 TERM_DEBUG_PACKET_OFF(i, flag);
601 }
602
603 return CMD_SUCCESS;
7f57883e
DS
604}
605
606/* Debug node. */
d62a17ae 607static struct cmd_node eigrp_debug_node = {
608 DEBUG_NODE, "", 1 /* VTYSH */
7f57883e
DS
609};
610
611/* Initialize debug commands. */
d62a17ae 612void eigrp_debug_init()
7f57883e 613{
d62a17ae 614 install_node(&eigrp_debug_node, config_write_debug);
615
616 install_element(ENABLE_NODE, &show_debugging_eigrp_cmd);
617 install_element(ENABLE_NODE, &debug_eigrp_packets_all_cmd);
618 install_element(ENABLE_NODE, &no_debug_eigrp_packets_all_cmd);
619 install_element(ENABLE_NODE, &debug_eigrp_transmit_cmd);
620 install_element(ENABLE_NODE, &no_debug_eigrp_transmit_cmd);
621
622 install_element(CONFIG_NODE, &show_debugging_eigrp_cmd);
623 install_element(CONFIG_NODE, &debug_eigrp_packets_all_cmd);
624 install_element(CONFIG_NODE, &no_debug_eigrp_packets_all_cmd);
af83cb12 625 install_element(CONFIG_NODE, &debug_eigrp_transmit_cmd);
d62a17ae 626 install_element(CONFIG_NODE, &no_debug_eigrp_transmit_cmd);
7f57883e 627}