Annotation of embedaddon/quagga/ospfd/ospf_dump.c, revision 1.1.1.1
1.1 misho 1: /*
2: * OSPFd dump routine.
3: * Copyright (C) 1999, 2000 Toshiaki Takada
4: *
5: * This file is part of GNU Zebra.
6: *
7: * GNU Zebra is free software; you can redistribute it and/or modify it
8: * under the terms of the GNU General Public License as published by the
9: * Free Software Foundation; either version 2, or (at your option) any
10: * later version.
11: *
12: * GNU Zebra is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * General Public License for more details.
16: *
17: * You should have received a copy of the GNU General Public License
18: * along with GNU Zebra; see the file COPYING. If not, write to the
19: * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20: * Boston, MA 02111-1307, USA.
21: */
22:
23: #include <zebra.h>
24:
25: #include "linklist.h"
26: #include "thread.h"
27: #include "prefix.h"
28: #include "command.h"
29: #include "stream.h"
30: #include "log.h"
31: #include "sockopt.h"
32:
33: #include "ospfd/ospfd.h"
34: #include "ospfd/ospf_interface.h"
35: #include "ospfd/ospf_ism.h"
36: #include "ospfd/ospf_asbr.h"
37: #include "ospfd/ospf_lsa.h"
38: #include "ospfd/ospf_lsdb.h"
39: #include "ospfd/ospf_neighbor.h"
40: #include "ospfd/ospf_nsm.h"
41: #include "ospfd/ospf_dump.h"
42: #include "ospfd/ospf_packet.h"
43: #include "ospfd/ospf_network.h"
44:
45: const struct message ospf_ism_state_msg[] =
46: {
47: { ISM_DependUpon, "DependUpon" },
48: { ISM_Down, "Down" },
49: { ISM_Loopback, "Loopback" },
50: { ISM_Waiting, "Waiting" },
51: { ISM_PointToPoint, "Point-To-Point" },
52: { ISM_DROther, "DROther" },
53: { ISM_Backup, "Backup" },
54: { ISM_DR, "DR" },
55: };
56: const int ospf_ism_state_msg_max = OSPF_ISM_STATE_MAX;
57:
58: const struct message ospf_nsm_state_msg[] =
59: {
60: { NSM_DependUpon, "DependUpon" },
61: { NSM_Deleted, "Deleted" },
62: { NSM_Down, "Down" },
63: { NSM_Attempt, "Attempt" },
64: { NSM_Init, "Init" },
65: { NSM_TwoWay, "2-Way" },
66: { NSM_ExStart, "ExStart" },
67: { NSM_Exchange, "Exchange" },
68: { NSM_Loading, "Loading" },
69: { NSM_Full, "Full" },
70: };
71: const int ospf_nsm_state_msg_max = OSPF_NSM_STATE_MAX;
72:
73: const struct message ospf_lsa_type_msg[] =
74: {
75: { OSPF_UNKNOWN_LSA, "unknown" },
76: { OSPF_ROUTER_LSA, "router-LSA" },
77: { OSPF_NETWORK_LSA, "network-LSA" },
78: { OSPF_SUMMARY_LSA, "summary-LSA" },
79: { OSPF_ASBR_SUMMARY_LSA, "summary-LSA" },
80: { OSPF_AS_EXTERNAL_LSA, "AS-external-LSA" },
81: { OSPF_GROUP_MEMBER_LSA, "GROUP MEMBER LSA" },
82: { OSPF_AS_NSSA_LSA, "NSSA-LSA" },
83: { 8, "Type-8 LSA" },
84: { OSPF_OPAQUE_LINK_LSA, "Link-Local Opaque-LSA" },
85: { OSPF_OPAQUE_AREA_LSA, "Area-Local Opaque-LSA" },
86: { OSPF_OPAQUE_AS_LSA, "AS-external Opaque-LSA" },
87: };
88: const int ospf_lsa_type_msg_max = OSPF_MAX_LSA;
89:
90: const struct message ospf_link_state_id_type_msg[] =
91: {
92: { OSPF_UNKNOWN_LSA, "(unknown)" },
93: { OSPF_ROUTER_LSA, "" },
94: { OSPF_NETWORK_LSA, "(address of Designated Router)" },
95: { OSPF_SUMMARY_LSA, "(summary Network Number)" },
96: { OSPF_ASBR_SUMMARY_LSA, "(AS Boundary Router address)" },
97: { OSPF_AS_EXTERNAL_LSA, "(External Network Number)" },
98: { OSPF_GROUP_MEMBER_LSA, "(Group membership information)" },
99: { OSPF_AS_NSSA_LSA, "(External Network Number for NSSA)" },
100: { 8, "(Type-8 LSID)" },
101: { OSPF_OPAQUE_LINK_LSA, "(Link-Local Opaque-Type/ID)" },
102: { OSPF_OPAQUE_AREA_LSA, "(Area-Local Opaque-Type/ID)" },
103: { OSPF_OPAQUE_AS_LSA, "(AS-external Opaque-Type/ID)" },
104: };
105: const int ospf_link_state_id_type_msg_max = OSPF_MAX_LSA;
106:
107: const struct message ospf_network_type_msg[] =
108: {
109: { OSPF_IFTYPE_NONE, "NONE" },
110: { OSPF_IFTYPE_POINTOPOINT, "Point-to-Point" },
111: { OSPF_IFTYPE_BROADCAST, "Broadcast" },
112: { OSPF_IFTYPE_NBMA, "NBMA" },
113: { OSPF_IFTYPE_POINTOMULTIPOINT, "Point-to-MultiPoint" },
114: { OSPF_IFTYPE_VIRTUALLINK, "Virtual-Link" },
115: };
116: const int ospf_network_type_msg_max = OSPF_IFTYPE_MAX;
117:
118: /* Configuration debug option variables. */
119: unsigned long conf_debug_ospf_packet[5] = {0, 0, 0, 0, 0};
120: unsigned long conf_debug_ospf_event = 0;
121: unsigned long conf_debug_ospf_ism = 0;
122: unsigned long conf_debug_ospf_nsm = 0;
123: unsigned long conf_debug_ospf_lsa = 0;
124: unsigned long conf_debug_ospf_zebra = 0;
125: unsigned long conf_debug_ospf_nssa = 0;
126:
127: /* Enable debug option variables -- valid only session. */
128: unsigned long term_debug_ospf_packet[5] = {0, 0, 0, 0, 0};
129: unsigned long term_debug_ospf_event = 0;
130: unsigned long term_debug_ospf_ism = 0;
131: unsigned long term_debug_ospf_nsm = 0;
132: unsigned long term_debug_ospf_lsa = 0;
133: unsigned long term_debug_ospf_zebra = 0;
134: unsigned long term_debug_ospf_nssa = 0;
135:
136:
137:
138: const char *
139: ospf_redist_string(u_int route_type)
140: {
141: return (route_type == ZEBRA_ROUTE_MAX) ?
142: "Default" : zebra_route_string(route_type);
143: }
144:
145: #define OSPF_AREA_STRING_MAXLEN 16
146: const char *
147: ospf_area_name_string (struct ospf_area *area)
148: {
149: static char buf[OSPF_AREA_STRING_MAXLEN] = "";
150: u_int32_t area_id;
151:
152: if (!area)
153: return "-";
154:
155: area_id = ntohl (area->area_id.s_addr);
156: snprintf (buf, OSPF_AREA_STRING_MAXLEN, "%d.%d.%d.%d",
157: (area_id >> 24) & 0xff, (area_id >> 16) & 0xff,
158: (area_id >> 8) & 0xff, area_id & 0xff);
159: return buf;
160: }
161:
162: #define OSPF_AREA_DESC_STRING_MAXLEN 23
163: const char *
164: ospf_area_desc_string (struct ospf_area *area)
165: {
166: static char buf[OSPF_AREA_DESC_STRING_MAXLEN] = "";
167: u_char type;
168:
169: if (!area)
170: return "(incomplete)";
171:
172: type = area->external_routing;
173: switch (type)
174: {
175: case OSPF_AREA_NSSA:
176: snprintf (buf, OSPF_AREA_DESC_STRING_MAXLEN, "%s [NSSA]",
177: ospf_area_name_string (area));
178: break;
179: case OSPF_AREA_STUB:
180: snprintf (buf, OSPF_AREA_DESC_STRING_MAXLEN, "%s [Stub]",
181: ospf_area_name_string (area));
182: break;
183: default:
184: return ospf_area_name_string (area);
185: }
186:
187: return buf;
188: }
189:
190: #define OSPF_IF_STRING_MAXLEN 40
191: const char *
192: ospf_if_name_string (struct ospf_interface *oi)
193: {
194: static char buf[OSPF_IF_STRING_MAXLEN] = "";
195: u_int32_t ifaddr;
196:
197: if (!oi)
198: return "inactive";
199:
200: if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
201: return oi->ifp->name;
202:
203: ifaddr = ntohl (oi->address->u.prefix4.s_addr);
204: snprintf (buf, OSPF_IF_STRING_MAXLEN,
205: "%s:%d.%d.%d.%d", oi->ifp->name,
206: (ifaddr >> 24) & 0xff, (ifaddr >> 16) & 0xff,
207: (ifaddr >> 8) & 0xff, ifaddr & 0xff);
208: return buf;
209: }
210:
211:
212: void
213: ospf_nbr_state_message (struct ospf_neighbor *nbr, char *buf, size_t size)
214: {
215: int state;
216: struct ospf_interface *oi = nbr->oi;
217:
218: if (IPV4_ADDR_SAME (&DR (oi), &nbr->address.u.prefix4))
219: state = ISM_DR;
220: else if (IPV4_ADDR_SAME (&BDR (oi), &nbr->address.u.prefix4))
221: state = ISM_Backup;
222: else
223: state = ISM_DROther;
224:
225: memset (buf, 0, size);
226:
227: snprintf (buf, size, "%s/%s",
228: LOOKUP (ospf_nsm_state_msg, nbr->state),
229: LOOKUP (ospf_ism_state_msg, state));
230: }
231:
232: const char *
233: ospf_timeval_dump (struct timeval *t, char *buf, size_t size)
234: {
235: /* Making formatted timer strings. */
236: #define MINUTE_IN_SECONDS 60
237: #define HOUR_IN_SECONDS (60*MINUTE_IN_SECONDS)
238: #define DAY_IN_SECONDS (24*HOUR_IN_SECONDS)
239: #define WEEK_IN_SECONDS (7*DAY_IN_SECONDS)
240: unsigned long w, d, h, m, s, ms;
241:
242: if (!t)
243: return "inactive";
244:
245: w = d = h = m = s = ms = 0;
246: memset (buf, 0, size);
247:
248: ms = t->tv_usec / 1000;
249:
250: if (ms >= 1000)
251: {
252: t->tv_sec += ms / 1000;
253: ms %= 1000;
254: }
255:
256: if (t->tv_sec > WEEK_IN_SECONDS)
257: {
258: w = t->tv_sec / WEEK_IN_SECONDS;
259: t->tv_sec -= w * WEEK_IN_SECONDS;
260: }
261:
262: if (t->tv_sec > DAY_IN_SECONDS)
263: {
264: d = t->tv_sec / DAY_IN_SECONDS;
265: t->tv_sec -= d * DAY_IN_SECONDS;
266: }
267:
268: if (t->tv_sec >= HOUR_IN_SECONDS)
269: {
270: h = t->tv_sec / HOUR_IN_SECONDS;
271: t->tv_sec -= h * HOUR_IN_SECONDS;
272: }
273:
274: if (t->tv_sec >= MINUTE_IN_SECONDS)
275: {
276: m = t->tv_sec / MINUTE_IN_SECONDS;
277: t->tv_sec -= m * MINUTE_IN_SECONDS;
278: }
279:
280: if (w > 99)
281: snprintf (buf, size, "%ldw%1ldd", w, d);
282: else if (w)
283: snprintf (buf, size, "%ldw%1ldd%02ldh", w, d, h);
284: else if (d)
285: snprintf (buf, size, "%1ldd%02ldh%02ldm", d, h, m);
286: else if (h)
287: snprintf (buf, size, "%ldh%02ldm%02lds", h, m, t->tv_sec);
288: else if (m)
289: snprintf (buf, size, "%ldm%02lds", m, t->tv_sec);
290: else
291: snprintf (buf, size, "%ld.%03lds", t->tv_sec, ms);
292:
293: return buf;
294: }
295:
296: const char *
297: ospf_timer_dump (struct thread *t, char *buf, size_t size)
298: {
299: struct timeval result;
300: if (!t)
301: return "inactive";
302:
303: result = tv_sub (t->u.sands, recent_relative_time());
304: return ospf_timeval_dump (&result, buf, size);
305: }
306:
307: #define OSPF_OPTION_STR_MAXLEN 24
308:
309: char *
310: ospf_options_dump (u_char options)
311: {
312: static char buf[OSPF_OPTION_STR_MAXLEN];
313:
314: snprintf (buf, OSPF_OPTION_STR_MAXLEN, "*|%s|%s|%s|%s|%s|%s|*",
315: (options & OSPF_OPTION_O) ? "O" : "-",
316: (options & OSPF_OPTION_DC) ? "DC" : "-",
317: (options & OSPF_OPTION_EA) ? "EA" : "-",
318: (options & OSPF_OPTION_NP) ? "N/P" : "-",
319: (options & OSPF_OPTION_MC) ? "MC" : "-",
320: (options & OSPF_OPTION_E) ? "E" : "-");
321:
322: return buf;
323: }
324:
325: static void
326: ospf_packet_hello_dump (struct stream *s, u_int16_t length)
327: {
328: struct ospf_hello *hello;
329: int i;
330:
331: hello = (struct ospf_hello *) STREAM_PNT (s);
332:
333: zlog_debug ("Hello");
334: zlog_debug (" NetworkMask %s", inet_ntoa (hello->network_mask));
335: zlog_debug (" HelloInterval %d", ntohs (hello->hello_interval));
336: zlog_debug (" Options %d (%s)", hello->options,
337: ospf_options_dump (hello->options));
338: zlog_debug (" RtrPriority %d", hello->priority);
339: zlog_debug (" RtrDeadInterval %ld", (u_long)ntohl (hello->dead_interval));
340: zlog_debug (" DRouter %s", inet_ntoa (hello->d_router));
341: zlog_debug (" BDRouter %s", inet_ntoa (hello->bd_router));
342:
343: length -= OSPF_HEADER_SIZE + OSPF_HELLO_MIN_SIZE;
344: zlog_debug (" # Neighbors %d", length / 4);
345: for (i = 0; length > 0; i++, length -= sizeof (struct in_addr))
346: zlog_debug (" Neighbor %s", inet_ntoa (hello->neighbors[i]));
347: }
348:
349: static char *
350: ospf_dd_flags_dump (u_char flags, char *buf, size_t size)
351: {
352: memset (buf, 0, size);
353:
354: snprintf (buf, size, "%s|%s|%s",
355: (flags & OSPF_DD_FLAG_I) ? "I" : "-",
356: (flags & OSPF_DD_FLAG_M) ? "M" : "-",
357: (flags & OSPF_DD_FLAG_MS) ? "MS" : "-");
358:
359: return buf;
360: }
361:
362: void
363: ospf_lsa_header_dump (struct lsa_header *lsah)
364: {
365: const char *lsah_type = LOOKUP (ospf_lsa_type_msg, lsah->type);
366:
367: zlog_debug (" LSA Header");
368: zlog_debug (" LS age %d", ntohs (lsah->ls_age));
369: zlog_debug (" Options %d (%s)", lsah->options,
370: ospf_options_dump (lsah->options));
371: zlog_debug (" LS type %d (%s)", lsah->type,
372: (lsah->type ? lsah_type : "unknown type"));
373: zlog_debug (" Link State ID %s", inet_ntoa (lsah->id));
374: zlog_debug (" Advertising Router %s", inet_ntoa (lsah->adv_router));
375: zlog_debug (" LS sequence number 0x%lx", (u_long)ntohl (lsah->ls_seqnum));
376: zlog_debug (" LS checksum 0x%x", ntohs (lsah->checksum));
377: zlog_debug (" length %d", ntohs (lsah->length));
378: }
379:
380: static char *
381: ospf_router_lsa_flags_dump (u_char flags, char *buf, size_t size)
382: {
383: memset (buf, 0, size);
384:
385: snprintf (buf, size, "%s|%s|%s",
386: (flags & ROUTER_LSA_VIRTUAL) ? "V" : "-",
387: (flags & ROUTER_LSA_EXTERNAL) ? "E" : "-",
388: (flags & ROUTER_LSA_BORDER) ? "B" : "-");
389:
390: return buf;
391: }
392:
393: static void
394: ospf_router_lsa_dump (struct stream *s, u_int16_t length)
395: {
396: char buf[BUFSIZ];
397: struct router_lsa *rl;
398: int i, len;
399:
400: rl = (struct router_lsa *) STREAM_PNT (s);
401:
402: zlog_debug (" Router-LSA");
403: zlog_debug (" flags %s",
404: ospf_router_lsa_flags_dump (rl->flags, buf, BUFSIZ));
405: zlog_debug (" # links %d", ntohs (rl->links));
406:
407: len = ntohs (rl->header.length) - OSPF_LSA_HEADER_SIZE - 4;
408: for (i = 0; len > 0; i++)
409: {
410: zlog_debug (" Link ID %s", inet_ntoa (rl->link[i].link_id));
411: zlog_debug (" Link Data %s", inet_ntoa (rl->link[i].link_data));
412: zlog_debug (" Type %d", (u_char) rl->link[i].type);
413: zlog_debug (" TOS %d", (u_char) rl->link[i].tos);
414: zlog_debug (" metric %d", ntohs (rl->link[i].metric));
415:
416: len -= 12;
417: }
418: }
419:
420: static void
421: ospf_network_lsa_dump (struct stream *s, u_int16_t length)
422: {
423: struct network_lsa *nl;
424: int i, cnt;
425:
426: nl = (struct network_lsa *) STREAM_PNT (s);
427: cnt = (ntohs (nl->header.length) - (OSPF_LSA_HEADER_SIZE + 4)) / 4;
428:
429: zlog_debug (" Network-LSA");
430: /*
431: zlog_debug ("LSA total size %d", ntohs (nl->header.length));
432: zlog_debug ("Network-LSA size %d",
433: ntohs (nl->header.length) - OSPF_LSA_HEADER_SIZE);
434: */
435: zlog_debug (" Network Mask %s", inet_ntoa (nl->mask));
436: zlog_debug (" # Attached Routers %d", cnt);
437: for (i = 0; i < cnt; i++)
438: zlog_debug (" Attached Router %s", inet_ntoa (nl->routers[i]));
439: }
440:
441: static void
442: ospf_summary_lsa_dump (struct stream *s, u_int16_t length)
443: {
444: struct summary_lsa *sl;
445: int size;
446: int i;
447:
448: sl = (struct summary_lsa *) STREAM_PNT (s);
449:
450: zlog_debug (" Summary-LSA");
451: zlog_debug (" Network Mask %s", inet_ntoa (sl->mask));
452:
453: size = ntohs (sl->header.length) - OSPF_LSA_HEADER_SIZE - 4;
454: for (i = 0; size > 0; size -= 4, i++)
455: zlog_debug (" TOS=%d metric %d", sl->tos,
456: GET_METRIC (sl->metric));
457: }
458:
459: static void
460: ospf_as_external_lsa_dump (struct stream *s, u_int16_t length)
461: {
462: struct as_external_lsa *al;
463: int size;
464: int i;
465:
466: al = (struct as_external_lsa *) STREAM_PNT (s);
467: zlog_debug (" %s", ospf_lsa_type_msg[al->header.type].str);
468: zlog_debug (" Network Mask %s", inet_ntoa (al->mask));
469:
470: size = ntohs (al->header.length) - OSPF_LSA_HEADER_SIZE -4;
471: for (i = 0; size > 0; size -= 12, i++)
472: {
473: zlog_debug (" bit %s TOS=%d metric %d",
474: IS_EXTERNAL_METRIC (al->e[i].tos) ? "E" : "-",
475: al->e[i].tos & 0x7f, GET_METRIC (al->e[i].metric));
476: zlog_debug (" Forwarding address %s", inet_ntoa (al->e[i].fwd_addr));
477: zlog_debug (" External Route Tag %d", al->e[i].route_tag);
478: }
479: }
480:
481: static void
482: ospf_lsa_header_list_dump (struct stream *s, u_int16_t length)
483: {
484: struct lsa_header *lsa;
485:
486: zlog_debug (" # LSA Headers %d", length / OSPF_LSA_HEADER_SIZE);
487:
488: /* LSA Headers. */
489: while (length > 0)
490: {
491: lsa = (struct lsa_header *) STREAM_PNT (s);
492: ospf_lsa_header_dump (lsa);
493:
494: stream_forward_getp (s, OSPF_LSA_HEADER_SIZE);
495: length -= OSPF_LSA_HEADER_SIZE;
496: }
497: }
498:
499: static void
500: ospf_packet_db_desc_dump (struct stream *s, u_int16_t length)
501: {
502: struct ospf_db_desc *dd;
503: char dd_flags[8];
504:
505: u_int32_t gp;
506:
507: gp = stream_get_getp (s);
508: dd = (struct ospf_db_desc *) STREAM_PNT (s);
509:
510: zlog_debug ("Database Description");
511: zlog_debug (" Interface MTU %d", ntohs (dd->mtu));
512: zlog_debug (" Options %d (%s)", dd->options,
513: ospf_options_dump (dd->options));
514: zlog_debug (" Flags %d (%s)", dd->flags,
515: ospf_dd_flags_dump (dd->flags, dd_flags, sizeof dd_flags));
516: zlog_debug (" Sequence Number 0x%08lx", (u_long)ntohl (dd->dd_seqnum));
517:
518: length -= OSPF_HEADER_SIZE + OSPF_DB_DESC_MIN_SIZE;
519:
520: stream_forward_getp (s, OSPF_DB_DESC_MIN_SIZE);
521:
522: ospf_lsa_header_list_dump (s, length);
523:
524: stream_set_getp (s, gp);
525: }
526:
527: static void
528: ospf_packet_ls_req_dump (struct stream *s, u_int16_t length)
529: {
530: u_int32_t sp;
531: u_int32_t ls_type;
532: struct in_addr ls_id;
533: struct in_addr adv_router;
534:
535: sp = stream_get_getp (s);
536:
537: length -= OSPF_HEADER_SIZE;
538:
539: zlog_debug ("Link State Request");
540: zlog_debug (" # Requests %d", length / 12);
541:
542: for (; length > 0; length -= 12)
543: {
544: ls_type = stream_getl (s);
545: ls_id.s_addr = stream_get_ipv4 (s);
546: adv_router.s_addr = stream_get_ipv4 (s);
547:
548: zlog_debug (" LS type %d", ls_type);
549: zlog_debug (" Link State ID %s", inet_ntoa (ls_id));
550: zlog_debug (" Advertising Router %s",
551: inet_ntoa (adv_router));
552: }
553:
554: stream_set_getp (s, sp);
555: }
556:
557: static void
558: ospf_packet_ls_upd_dump (struct stream *s, u_int16_t length)
559: {
560: u_int32_t sp;
561: struct lsa_header *lsa;
562: int lsa_len;
563: u_int32_t count;
564:
565: length -= OSPF_HEADER_SIZE;
566:
567: sp = stream_get_getp (s);
568:
569: count = stream_getl (s);
570: length -= 4;
571:
572: zlog_debug ("Link State Update");
573: zlog_debug (" # LSAs %d", count);
574:
575: while (length > 0 && count > 0)
576: {
577: if (length < OSPF_HEADER_SIZE || length % 4 != 0)
578: {
579: zlog_debug (" Remaining %d bytes; Incorrect length.", length);
580: break;
581: }
582:
583: lsa = (struct lsa_header *) STREAM_PNT (s);
584: lsa_len = ntohs (lsa->length);
585: ospf_lsa_header_dump (lsa);
586:
587: switch (lsa->type)
588: {
589: case OSPF_ROUTER_LSA:
590: ospf_router_lsa_dump (s, length);
591: break;
592: case OSPF_NETWORK_LSA:
593: ospf_network_lsa_dump (s, length);
594: break;
595: case OSPF_SUMMARY_LSA:
596: case OSPF_ASBR_SUMMARY_LSA:
597: ospf_summary_lsa_dump (s, length);
598: break;
599: case OSPF_AS_EXTERNAL_LSA:
600: ospf_as_external_lsa_dump (s, length);
601: break;
602: case OSPF_AS_NSSA_LSA:
603: ospf_as_external_lsa_dump (s, length);
604: break;
605: #ifdef HAVE_OPAQUE_LSA
606: case OSPF_OPAQUE_LINK_LSA:
607: case OSPF_OPAQUE_AREA_LSA:
608: case OSPF_OPAQUE_AS_LSA:
609: ospf_opaque_lsa_dump (s, length);
610: break;
611: #endif /* HAVE_OPAQUE_LSA */
612: default:
613: break;
614: }
615:
616: stream_forward_getp (s, lsa_len);
617: length -= lsa_len;
618: count--;
619: }
620:
621: stream_set_getp (s, sp);
622: }
623:
624: static void
625: ospf_packet_ls_ack_dump (struct stream *s, u_int16_t length)
626: {
627: u_int32_t sp;
628:
629: length -= OSPF_HEADER_SIZE;
630: sp = stream_get_getp (s);
631:
632: zlog_debug ("Link State Acknowledgment");
633: ospf_lsa_header_list_dump (s, length);
634:
635: stream_set_getp (s, sp);
636: }
637:
638: /* Expects header to be in host order */
639: void
640: ospf_ip_header_dump (struct ip *iph)
641: {
642: /* IP Header dump. */
643: zlog_debug ("ip_v %d", iph->ip_v);
644: zlog_debug ("ip_hl %d", iph->ip_hl);
645: zlog_debug ("ip_tos %d", iph->ip_tos);
646: zlog_debug ("ip_len %d", iph->ip_len);
647: zlog_debug ("ip_id %u", (u_int32_t) iph->ip_id);
648: zlog_debug ("ip_off %u", (u_int32_t) iph->ip_off);
649: zlog_debug ("ip_ttl %d", iph->ip_ttl);
650: zlog_debug ("ip_p %d", iph->ip_p);
651: zlog_debug ("ip_sum 0x%x", (u_int32_t) iph->ip_sum);
652: zlog_debug ("ip_src %s", inet_ntoa (iph->ip_src));
653: zlog_debug ("ip_dst %s", inet_ntoa (iph->ip_dst));
654: }
655:
656: static void
657: ospf_header_dump (struct ospf_header *ospfh)
658: {
659: char buf[9];
660:
661: zlog_debug ("Header");
662: zlog_debug (" Version %d", ospfh->version);
663: zlog_debug (" Type %d (%s)", ospfh->type,
664: ospf_packet_type_str[ospfh->type]);
665: zlog_debug (" Packet Len %d", ntohs (ospfh->length));
666: zlog_debug (" Router ID %s", inet_ntoa (ospfh->router_id));
667: zlog_debug (" Area ID %s", inet_ntoa (ospfh->area_id));
668: zlog_debug (" Checksum 0x%x", ntohs (ospfh->checksum));
669: zlog_debug (" AuType %d", ntohs (ospfh->auth_type));
670:
671: switch (ntohs (ospfh->auth_type))
672: {
673: case OSPF_AUTH_NULL:
674: break;
675: case OSPF_AUTH_SIMPLE:
676: memset (buf, 0, 9);
677: strncpy (buf, (char *) ospfh->u.auth_data, 8);
678: zlog_debug (" Simple Password %s", buf);
679: break;
680: case OSPF_AUTH_CRYPTOGRAPHIC:
681: zlog_debug (" Cryptographic Authentication");
682: zlog_debug (" Key ID %d", ospfh->u.crypt.key_id);
683: zlog_debug (" Auth Data Len %d", ospfh->u.crypt.auth_data_len);
684: zlog_debug (" Sequence number %ld",
685: (u_long)ntohl (ospfh->u.crypt.crypt_seqnum));
686: break;
687: default:
688: zlog_debug ("* This is not supported authentication type");
689: break;
690: }
691:
692: }
693:
694: void
695: ospf_packet_dump (struct stream *s)
696: {
697: struct ospf_header *ospfh;
698: unsigned long gp;
699:
700: /* Preserve pointer. */
701: gp = stream_get_getp (s);
702:
703: /* OSPF Header dump. */
704: ospfh = (struct ospf_header *) STREAM_PNT (s);
705:
706: /* Until detail flag is set, return. */
707: if (!(term_debug_ospf_packet[ospfh->type - 1] & OSPF_DEBUG_DETAIL))
708: return;
709:
710: /* Show OSPF header detail. */
711: ospf_header_dump (ospfh);
712: stream_forward_getp (s, OSPF_HEADER_SIZE);
713:
714: switch (ospfh->type)
715: {
716: case OSPF_MSG_HELLO:
717: ospf_packet_hello_dump (s, ntohs (ospfh->length));
718: break;
719: case OSPF_MSG_DB_DESC:
720: ospf_packet_db_desc_dump (s, ntohs (ospfh->length));
721: break;
722: case OSPF_MSG_LS_REQ:
723: ospf_packet_ls_req_dump (s, ntohs (ospfh->length));
724: break;
725: case OSPF_MSG_LS_UPD:
726: ospf_packet_ls_upd_dump (s, ntohs (ospfh->length));
727: break;
728: case OSPF_MSG_LS_ACK:
729: ospf_packet_ls_ack_dump (s, ntohs (ospfh->length));
730: break;
731: default:
732: break;
733: }
734:
735: stream_set_getp (s, gp);
736: }
737:
738:
739: /*
740: [no] debug ospf packet (hello|dd|ls-request|ls-update|ls-ack|all)
741: [send|recv [detail]]
742: */
743: DEFUN (debug_ospf_packet,
744: debug_ospf_packet_all_cmd,
745: "debug ospf packet (hello|dd|ls-request|ls-update|ls-ack|all)",
746: DEBUG_STR
747: OSPF_STR
748: "OSPF packets\n"
749: "OSPF Hello\n"
750: "OSPF Database Description\n"
751: "OSPF Link State Request\n"
752: "OSPF Link State Update\n"
753: "OSPF Link State Acknowledgment\n"
754: "OSPF all packets\n")
755: {
756: int type = 0;
757: int flag = 0;
758: int i;
759:
760: assert (argc > 0);
761:
762: /* Check packet type. */
763: if (strncmp (argv[0], "h", 1) == 0)
764: type = OSPF_DEBUG_HELLO;
765: else if (strncmp (argv[0], "d", 1) == 0)
766: type = OSPF_DEBUG_DB_DESC;
767: else if (strncmp (argv[0], "ls-r", 4) == 0)
768: type = OSPF_DEBUG_LS_REQ;
769: else if (strncmp (argv[0], "ls-u", 4) == 0)
770: type = OSPF_DEBUG_LS_UPD;
771: else if (strncmp (argv[0], "ls-a", 4) == 0)
772: type = OSPF_DEBUG_LS_ACK;
773: else if (strncmp (argv[0], "a", 1) == 0)
774: type = OSPF_DEBUG_ALL;
775:
776: /* Default, both send and recv. */
777: if (argc == 1)
778: flag = OSPF_DEBUG_SEND | OSPF_DEBUG_RECV;
779:
780: /* send or recv. */
781: if (argc >= 2)
782: {
783: if (strncmp (argv[1], "s", 1) == 0)
784: flag = OSPF_DEBUG_SEND;
785: else if (strncmp (argv[1], "r", 1) == 0)
786: flag = OSPF_DEBUG_RECV;
787: else if (strncmp (argv[1], "d", 1) == 0)
788: flag = OSPF_DEBUG_SEND | OSPF_DEBUG_RECV | OSPF_DEBUG_DETAIL;
789: }
790:
791: /* detail. */
792: if (argc == 3)
793: if (strncmp (argv[2], "d", 1) == 0)
794: flag |= OSPF_DEBUG_DETAIL;
795:
796: for (i = 0; i < 5; i++)
797: if (type & (0x01 << i))
798: {
799: if (vty->node == CONFIG_NODE)
800: DEBUG_PACKET_ON (i, flag);
801: else
802: TERM_DEBUG_PACKET_ON (i, flag);
803: }
804:
805: return CMD_SUCCESS;
806: }
807:
808: ALIAS (debug_ospf_packet,
809: debug_ospf_packet_send_recv_cmd,
810: "debug ospf packet (hello|dd|ls-request|ls-update|ls-ack|all) (send|recv|detail)",
811: "Debugging functions\n"
812: "OSPF information\n"
813: "OSPF packets\n"
814: "OSPF Hello\n"
815: "OSPF Database Description\n"
816: "OSPF Link State Request\n"
817: "OSPF Link State Update\n"
818: "OSPF Link State Acknowledgment\n"
819: "OSPF all packets\n"
820: "Packet sent\n"
821: "Packet received\n"
822: "Detail information\n")
823:
824: ALIAS (debug_ospf_packet,
825: debug_ospf_packet_send_recv_detail_cmd,
826: "debug ospf packet (hello|dd|ls-request|ls-update|ls-ack|all) (send|recv) (detail|)",
827: "Debugging functions\n"
828: "OSPF information\n"
829: "OSPF packets\n"
830: "OSPF Hello\n"
831: "OSPF Database Description\n"
832: "OSPF Link State Request\n"
833: "OSPF Link State Update\n"
834: "OSPF Link State Acknowledgment\n"
835: "OSPF all packets\n"
836: "Packet sent\n"
837: "Packet received\n"
838: "Detail Information\n")
839:
840:
841: DEFUN (no_debug_ospf_packet,
842: no_debug_ospf_packet_all_cmd,
843: "no debug ospf packet (hello|dd|ls-request|ls-update|ls-ack|all)",
844: NO_STR
845: DEBUG_STR
846: OSPF_STR
847: "OSPF packets\n"
848: "OSPF Hello\n"
849: "OSPF Database Description\n"
850: "OSPF Link State Request\n"
851: "OSPF Link State Update\n"
852: "OSPF Link State Acknowledgment\n"
853: "OSPF all packets\n")
854: {
855: int type = 0;
856: int flag = 0;
857: int i;
858:
859: assert (argc > 0);
860:
861: /* Check packet type. */
862: if (strncmp (argv[0], "h", 1) == 0)
863: type = OSPF_DEBUG_HELLO;
864: else if (strncmp (argv[0], "d", 1) == 0)
865: type = OSPF_DEBUG_DB_DESC;
866: else if (strncmp (argv[0], "ls-r", 4) == 0)
867: type = OSPF_DEBUG_LS_REQ;
868: else if (strncmp (argv[0], "ls-u", 4) == 0)
869: type = OSPF_DEBUG_LS_UPD;
870: else if (strncmp (argv[0], "ls-a", 4) == 0)
871: type = OSPF_DEBUG_LS_ACK;
872: else if (strncmp (argv[0], "a", 1) == 0)
873: type = OSPF_DEBUG_ALL;
874:
875: /* Default, both send and recv. */
876: if (argc == 1)
877: flag = OSPF_DEBUG_SEND | OSPF_DEBUG_RECV | OSPF_DEBUG_DETAIL ;
878:
879: /* send or recv. */
880: if (argc == 2)
881: {
882: if (strncmp (argv[1], "s", 1) == 0)
883: flag = OSPF_DEBUG_SEND | OSPF_DEBUG_DETAIL;
884: else if (strncmp (argv[1], "r", 1) == 0)
885: flag = OSPF_DEBUG_RECV | OSPF_DEBUG_DETAIL;
886: else if (strncmp (argv[1], "d", 1) == 0)
887: flag = OSPF_DEBUG_DETAIL;
888: }
889:
890: /* detail. */
891: if (argc == 3)
892: if (strncmp (argv[2], "d", 1) == 0)
893: flag = OSPF_DEBUG_DETAIL;
894:
895: for (i = 0; i < 5; i++)
896: if (type & (0x01 << i))
897: {
898: if (vty->node == CONFIG_NODE)
899: DEBUG_PACKET_OFF (i, flag);
900: else
901: TERM_DEBUG_PACKET_OFF (i, flag);
902: }
903:
904: #ifdef DEBUG
905: /*
906: for (i = 0; i < 5; i++)
907: zlog_debug ("flag[%d] = %d", i, ospf_debug_packet[i]);
908: */
909: #endif /* DEBUG */
910:
911: return CMD_SUCCESS;
912: }
913:
914: ALIAS (no_debug_ospf_packet,
915: no_debug_ospf_packet_send_recv_cmd,
916: "no debug ospf packet (hello|dd|ls-request|ls-update|ls-ack|all) (send|recv|detail)",
917: NO_STR
918: "Debugging functions\n"
919: "OSPF information\n"
920: "OSPF packets\n"
921: "OSPF Hello\n"
922: "OSPF Database Description\n"
923: "OSPF Link State Request\n"
924: "OSPF Link State Update\n"
925: "OSPF Link State Acknowledgment\n"
926: "OSPF all packets\n"
927: "Packet sent\n"
928: "Packet received\n"
929: "Detail Information\n")
930:
931: ALIAS (no_debug_ospf_packet,
932: no_debug_ospf_packet_send_recv_detail_cmd,
933: "no debug ospf packet (hello|dd|ls-request|ls-update|ls-ack|all) (send|recv) (detail|)",
934: NO_STR
935: "Debugging functions\n"
936: "OSPF information\n"
937: "OSPF packets\n"
938: "OSPF Hello\n"
939: "OSPF Database Description\n"
940: "OSPF Link State Request\n"
941: "OSPF Link State Update\n"
942: "OSPF Link State Acknowledgment\n"
943: "OSPF all packets\n"
944: "Packet sent\n"
945: "Packet received\n"
946: "Detail Information\n")
947:
948:
949: DEFUN (debug_ospf_ism,
950: debug_ospf_ism_cmd,
951: "debug ospf ism",
952: DEBUG_STR
953: OSPF_STR
954: "OSPF Interface State Machine\n")
955: {
956: if (vty->node == CONFIG_NODE)
957: {
958: if (argc == 0)
959: DEBUG_ON (ism, ISM);
960: else if (argc == 1)
961: {
962: if (strncmp (argv[0], "s", 1) == 0)
963: DEBUG_ON (ism, ISM_STATUS);
964: else if (strncmp (argv[0], "e", 1) == 0)
965: DEBUG_ON (ism, ISM_EVENTS);
966: else if (strncmp (argv[0], "t", 1) == 0)
967: DEBUG_ON (ism, ISM_TIMERS);
968: }
969:
970: return CMD_SUCCESS;
971: }
972:
973: /* ENABLE_NODE. */
974: if (argc == 0)
975: TERM_DEBUG_ON (ism, ISM);
976: else if (argc == 1)
977: {
978: if (strncmp (argv[0], "s", 1) == 0)
979: TERM_DEBUG_ON (ism, ISM_STATUS);
980: else if (strncmp (argv[0], "e", 1) == 0)
981: TERM_DEBUG_ON (ism, ISM_EVENTS);
982: else if (strncmp (argv[0], "t", 1) == 0)
983: TERM_DEBUG_ON (ism, ISM_TIMERS);
984: }
985:
986: return CMD_SUCCESS;
987: }
988:
989: ALIAS (debug_ospf_ism,
990: debug_ospf_ism_sub_cmd,
991: "debug ospf ism (status|events|timers)",
992: DEBUG_STR
993: OSPF_STR
994: "OSPF Interface State Machine\n"
995: "ISM Status Information\n"
996: "ISM Event Information\n"
997: "ISM TImer Information\n")
998:
999: DEFUN (no_debug_ospf_ism,
1000: no_debug_ospf_ism_cmd,
1001: "no debug ospf ism",
1002: NO_STR
1003: DEBUG_STR
1004: OSPF_STR
1005: "OSPF Interface State Machine")
1006: {
1007: if (vty->node == CONFIG_NODE)
1008: {
1009: if (argc == 0)
1010: DEBUG_OFF (ism, ISM);
1011: else if (argc == 1)
1012: {
1013: if (strncmp (argv[0], "s", 1) == 0)
1014: DEBUG_OFF (ism, ISM_STATUS);
1015: else if (strncmp (argv[0], "e", 1) == 0)
1016: DEBUG_OFF (ism, ISM_EVENTS);
1017: else if (strncmp (argv[0], "t", 1) == 0)
1018: DEBUG_OFF (ism, ISM_TIMERS);
1019: }
1020: return CMD_SUCCESS;
1021: }
1022:
1023: /* ENABLE_NODE. */
1024: if (argc == 0)
1025: TERM_DEBUG_OFF (ism, ISM);
1026: else if (argc == 1)
1027: {
1028: if (strncmp (argv[0], "s", 1) == 0)
1029: TERM_DEBUG_OFF (ism, ISM_STATUS);
1030: else if (strncmp (argv[0], "e", 1) == 0)
1031: TERM_DEBUG_OFF (ism, ISM_EVENTS);
1032: else if (strncmp (argv[0], "t", 1) == 0)
1033: TERM_DEBUG_OFF (ism, ISM_TIMERS);
1034: }
1035:
1036: return CMD_SUCCESS;
1037: }
1038:
1039: ALIAS (no_debug_ospf_ism,
1040: no_debug_ospf_ism_sub_cmd,
1041: "no debug ospf ism (status|events|timers)",
1042: NO_STR
1043: "Debugging functions\n"
1044: "OSPF information\n"
1045: "OSPF Interface State Machine\n"
1046: "ISM Status Information\n"
1047: "ISM Event Information\n"
1048: "ISM Timer Information\n")
1049:
1050:
1051: DEFUN (debug_ospf_nsm,
1052: debug_ospf_nsm_cmd,
1053: "debug ospf nsm",
1054: DEBUG_STR
1055: OSPF_STR
1056: "OSPF Neighbor State Machine\n")
1057: {
1058: if (vty->node == CONFIG_NODE)
1059: {
1060: if (argc == 0)
1061: DEBUG_ON (nsm, NSM);
1062: else if (argc == 1)
1063: {
1064: if (strncmp (argv[0], "s", 1) == 0)
1065: DEBUG_ON (nsm, NSM_STATUS);
1066: else if (strncmp (argv[0], "e", 1) == 0)
1067: DEBUG_ON (nsm, NSM_EVENTS);
1068: else if (strncmp (argv[0], "t", 1) == 0)
1069: DEBUG_ON (nsm, NSM_TIMERS);
1070: }
1071:
1072: return CMD_SUCCESS;
1073: }
1074:
1075: /* ENABLE_NODE. */
1076: if (argc == 0)
1077: TERM_DEBUG_ON (nsm, NSM);
1078: else if (argc == 1)
1079: {
1080: if (strncmp (argv[0], "s", 1) == 0)
1081: TERM_DEBUG_ON (nsm, NSM_STATUS);
1082: else if (strncmp (argv[0], "e", 1) == 0)
1083: TERM_DEBUG_ON (nsm, NSM_EVENTS);
1084: else if (strncmp (argv[0], "t", 1) == 0)
1085: TERM_DEBUG_ON (nsm, NSM_TIMERS);
1086: }
1087:
1088: return CMD_SUCCESS;
1089: }
1090:
1091: ALIAS (debug_ospf_nsm,
1092: debug_ospf_nsm_sub_cmd,
1093: "debug ospf nsm (status|events|timers)",
1094: DEBUG_STR
1095: OSPF_STR
1096: "OSPF Neighbor State Machine\n"
1097: "NSM Status Information\n"
1098: "NSM Event Information\n"
1099: "NSM Timer Information\n")
1100:
1101: DEFUN (no_debug_ospf_nsm,
1102: no_debug_ospf_nsm_cmd,
1103: "no debug ospf nsm",
1104: NO_STR
1105: DEBUG_STR
1106: OSPF_STR
1107: "OSPF Neighbor State Machine")
1108: {
1109: if (vty->node == CONFIG_NODE)
1110: {
1111: if (argc == 0)
1112: DEBUG_OFF (nsm, NSM);
1113: else if (argc == 1)
1114: {
1115: if (strncmp (argv[0], "s", 1) == 0)
1116: DEBUG_OFF (nsm, NSM_STATUS);
1117: else if (strncmp (argv[0], "e", 1) == 0)
1118: DEBUG_OFF (nsm, NSM_EVENTS);
1119: else if (strncmp (argv[0], "t", 1) == 0)
1120: DEBUG_OFF (nsm, NSM_TIMERS);
1121: }
1122:
1123: return CMD_SUCCESS;
1124: }
1125:
1126: /* ENABLE_NODE. */
1127: if (argc == 0)
1128: TERM_DEBUG_OFF (nsm, NSM);
1129: else if (argc == 1)
1130: {
1131: if (strncmp (argv[0], "s", 1) == 0)
1132: TERM_DEBUG_OFF (nsm, NSM_STATUS);
1133: else if (strncmp (argv[0], "e", 1) == 0)
1134: TERM_DEBUG_OFF (nsm, NSM_EVENTS);
1135: else if (strncmp (argv[0], "t", 1) == 0)
1136: TERM_DEBUG_OFF (nsm, NSM_TIMERS);
1137: }
1138:
1139: return CMD_SUCCESS;
1140: }
1141:
1142: ALIAS (no_debug_ospf_nsm,
1143: no_debug_ospf_nsm_sub_cmd,
1144: "no debug ospf nsm (status|events|timers)",
1145: NO_STR
1146: "Debugging functions\n"
1147: "OSPF information\n"
1148: "OSPF Interface State Machine\n"
1149: "NSM Status Information\n"
1150: "NSM Event Information\n"
1151: "NSM Timer Information\n")
1152:
1153:
1154: DEFUN (debug_ospf_lsa,
1155: debug_ospf_lsa_cmd,
1156: "debug ospf lsa",
1157: DEBUG_STR
1158: OSPF_STR
1159: "OSPF Link State Advertisement\n")
1160: {
1161: if (vty->node == CONFIG_NODE)
1162: {
1163: if (argc == 0)
1164: DEBUG_ON (lsa, LSA);
1165: else if (argc == 1)
1166: {
1167: if (strncmp (argv[0], "g", 1) == 0)
1168: DEBUG_ON (lsa, LSA_GENERATE);
1169: else if (strncmp (argv[0], "f", 1) == 0)
1170: DEBUG_ON (lsa, LSA_FLOODING);
1171: else if (strncmp (argv[0], "i", 1) == 0)
1172: DEBUG_ON (lsa, LSA_INSTALL);
1173: else if (strncmp (argv[0], "r", 1) == 0)
1174: DEBUG_ON (lsa, LSA_REFRESH);
1175: }
1176:
1177: return CMD_SUCCESS;
1178: }
1179:
1180: /* ENABLE_NODE. */
1181: if (argc == 0)
1182: TERM_DEBUG_ON (lsa, LSA);
1183: else if (argc == 1)
1184: {
1185: if (strncmp (argv[0], "g", 1) == 0)
1186: TERM_DEBUG_ON (lsa, LSA_GENERATE);
1187: else if (strncmp (argv[0], "f", 1) == 0)
1188: TERM_DEBUG_ON (lsa, LSA_FLOODING);
1189: else if (strncmp (argv[0], "i", 1) == 0)
1190: TERM_DEBUG_ON (lsa, LSA_INSTALL);
1191: else if (strncmp (argv[0], "r", 1) == 0)
1192: TERM_DEBUG_ON (lsa, LSA_REFRESH);
1193: }
1194:
1195: return CMD_SUCCESS;
1196: }
1197:
1198: ALIAS (debug_ospf_lsa,
1199: debug_ospf_lsa_sub_cmd,
1200: "debug ospf lsa (generate|flooding|install|refresh)",
1201: DEBUG_STR
1202: OSPF_STR
1203: "OSPF Link State Advertisement\n"
1204: "LSA Generation\n"
1205: "LSA Flooding\n"
1206: "LSA Install/Delete\n"
1207: "LSA Refresh\n")
1208:
1209: DEFUN (no_debug_ospf_lsa,
1210: no_debug_ospf_lsa_cmd,
1211: "no debug ospf lsa",
1212: NO_STR
1213: DEBUG_STR
1214: OSPF_STR
1215: "OSPF Link State Advertisement\n")
1216: {
1217: if (vty->node == CONFIG_NODE)
1218: {
1219: if (argc == 0)
1220: DEBUG_OFF (lsa, LSA);
1221: else if (argc == 1)
1222: {
1223: if (strncmp (argv[0], "g", 1) == 0)
1224: DEBUG_OFF (lsa, LSA_GENERATE);
1225: else if (strncmp (argv[0], "f", 1) == 0)
1226: DEBUG_OFF (lsa, LSA_FLOODING);
1227: else if (strncmp (argv[0], "i", 1) == 0)
1228: DEBUG_OFF (lsa, LSA_INSTALL);
1229: else if (strncmp (argv[0], "r", 1) == 0)
1230: DEBUG_OFF (lsa, LSA_REFRESH);
1231: }
1232:
1233: return CMD_SUCCESS;
1234: }
1235:
1236: /* ENABLE_NODE. */
1237: if (argc == 0)
1238: TERM_DEBUG_OFF (lsa, LSA);
1239: else if (argc == 1)
1240: {
1241: if (strncmp (argv[0], "g", 1) == 0)
1242: TERM_DEBUG_OFF (lsa, LSA_GENERATE);
1243: else if (strncmp (argv[0], "f", 1) == 0)
1244: TERM_DEBUG_OFF (lsa, LSA_FLOODING);
1245: else if (strncmp (argv[0], "i", 1) == 0)
1246: TERM_DEBUG_OFF (lsa, LSA_INSTALL);
1247: else if (strncmp (argv[0], "r", 1) == 0)
1248: TERM_DEBUG_OFF (lsa, LSA_REFRESH);
1249: }
1250:
1251: return CMD_SUCCESS;
1252: }
1253:
1254: ALIAS (no_debug_ospf_lsa,
1255: no_debug_ospf_lsa_sub_cmd,
1256: "no debug ospf lsa (generate|flooding|install|refresh)",
1257: NO_STR
1258: DEBUG_STR
1259: OSPF_STR
1260: "OSPF Link State Advertisement\n"
1261: "LSA Generation\n"
1262: "LSA Flooding\n"
1263: "LSA Install/Delete\n"
1264: "LSA Refres\n")
1265:
1266:
1267: DEFUN (debug_ospf_zebra,
1268: debug_ospf_zebra_cmd,
1269: "debug ospf zebra",
1270: DEBUG_STR
1271: OSPF_STR
1272: "OSPF Zebra information\n")
1273: {
1274: if (vty->node == CONFIG_NODE)
1275: {
1276: if (argc == 0)
1277: DEBUG_ON (zebra, ZEBRA);
1278: else if (argc == 1)
1279: {
1280: if (strncmp (argv[0], "i", 1) == 0)
1281: DEBUG_ON (zebra, ZEBRA_INTERFACE);
1282: else if (strncmp (argv[0], "r", 1) == 0)
1283: DEBUG_ON (zebra, ZEBRA_REDISTRIBUTE);
1284: }
1285:
1286: return CMD_SUCCESS;
1287: }
1288:
1289: /* ENABLE_NODE. */
1290: if (argc == 0)
1291: TERM_DEBUG_ON (zebra, ZEBRA);
1292: else if (argc == 1)
1293: {
1294: if (strncmp (argv[0], "i", 1) == 0)
1295: TERM_DEBUG_ON (zebra, ZEBRA_INTERFACE);
1296: else if (strncmp (argv[0], "r", 1) == 0)
1297: TERM_DEBUG_ON (zebra, ZEBRA_REDISTRIBUTE);
1298: }
1299:
1300: return CMD_SUCCESS;
1301: }
1302:
1303: ALIAS (debug_ospf_zebra,
1304: debug_ospf_zebra_sub_cmd,
1305: "debug ospf zebra (interface|redistribute)",
1306: DEBUG_STR
1307: OSPF_STR
1308: "OSPF Zebra information\n"
1309: "Zebra interface\n"
1310: "Zebra redistribute\n")
1311:
1312: DEFUN (no_debug_ospf_zebra,
1313: no_debug_ospf_zebra_cmd,
1314: "no debug ospf zebra",
1315: NO_STR
1316: DEBUG_STR
1317: OSPF_STR
1318: "OSPF Zebra information\n")
1319: {
1320: if (vty->node == CONFIG_NODE)
1321: {
1322: if (argc == 0)
1323: DEBUG_OFF (zebra, ZEBRA);
1324: else if (argc == 1)
1325: {
1326: if (strncmp (argv[0], "i", 1) == 0)
1327: DEBUG_OFF (zebra, ZEBRA_INTERFACE);
1328: else if (strncmp (argv[0], "r", 1) == 0)
1329: DEBUG_OFF (zebra, ZEBRA_REDISTRIBUTE);
1330: }
1331:
1332: return CMD_SUCCESS;
1333: }
1334:
1335: /* ENABLE_NODE. */
1336: if (argc == 0)
1337: TERM_DEBUG_OFF (zebra, ZEBRA);
1338: else if (argc == 1)
1339: {
1340: if (strncmp (argv[0], "i", 1) == 0)
1341: TERM_DEBUG_OFF (zebra, ZEBRA_INTERFACE);
1342: else if (strncmp (argv[0], "r", 1) == 0)
1343: TERM_DEBUG_OFF (zebra, ZEBRA_REDISTRIBUTE);
1344: }
1345:
1346: return CMD_SUCCESS;
1347: }
1348:
1349: ALIAS (no_debug_ospf_zebra,
1350: no_debug_ospf_zebra_sub_cmd,
1351: "no debug ospf zebra (interface|redistribute)",
1352: NO_STR
1353: DEBUG_STR
1354: OSPF_STR
1355: "OSPF Zebra information\n"
1356: "Zebra interface\n"
1357: "Zebra redistribute\n")
1358:
1359: DEFUN (debug_ospf_event,
1360: debug_ospf_event_cmd,
1361: "debug ospf event",
1362: DEBUG_STR
1363: OSPF_STR
1364: "OSPF event information\n")
1365: {
1366: if (vty->node == CONFIG_NODE)
1367: CONF_DEBUG_ON (event, EVENT);
1368: TERM_DEBUG_ON (event, EVENT);
1369: return CMD_SUCCESS;
1370: }
1371:
1372: DEFUN (no_debug_ospf_event,
1373: no_debug_ospf_event_cmd,
1374: "no debug ospf event",
1375: NO_STR
1376: DEBUG_STR
1377: OSPF_STR
1378: "OSPF event information\n")
1379: {
1380: if (vty->node == CONFIG_NODE)
1381: CONF_DEBUG_OFF (event, EVENT);
1382: TERM_DEBUG_OFF (event, EVENT);
1383: return CMD_SUCCESS;
1384: }
1385:
1386: DEFUN (debug_ospf_nssa,
1387: debug_ospf_nssa_cmd,
1388: "debug ospf nssa",
1389: DEBUG_STR
1390: OSPF_STR
1391: "OSPF nssa information\n")
1392: {
1393: if (vty->node == CONFIG_NODE)
1394: CONF_DEBUG_ON (nssa, NSSA);
1395: TERM_DEBUG_ON (nssa, NSSA);
1396: return CMD_SUCCESS;
1397: }
1398:
1399: DEFUN (no_debug_ospf_nssa,
1400: no_debug_ospf_nssa_cmd,
1401: "no debug ospf nssa",
1402: NO_STR
1403: DEBUG_STR
1404: OSPF_STR
1405: "OSPF nssa information\n")
1406: {
1407: if (vty->node == CONFIG_NODE)
1408: CONF_DEBUG_OFF (nssa, NSSA);
1409: TERM_DEBUG_OFF (nssa, NSSA);
1410: return CMD_SUCCESS;
1411: }
1412:
1413:
1414: DEFUN (show_debugging_ospf,
1415: show_debugging_ospf_cmd,
1416: "show debugging ospf",
1417: SHOW_STR
1418: DEBUG_STR
1419: OSPF_STR)
1420: {
1421: int i;
1422:
1423: vty_out (vty, "OSPF debugging status:%s", VTY_NEWLINE);
1424:
1425: /* Show debug status for events. */
1426: if (IS_DEBUG_OSPF(event,EVENT))
1427: vty_out (vty, " OSPF event debugging is on%s", VTY_NEWLINE);
1428:
1429: /* Show debug status for ISM. */
1430: if (IS_DEBUG_OSPF (ism, ISM) == OSPF_DEBUG_ISM)
1431: vty_out (vty, " OSPF ISM debugging is on%s", VTY_NEWLINE);
1432: else
1433: {
1434: if (IS_DEBUG_OSPF (ism, ISM_STATUS))
1435: vty_out (vty, " OSPF ISM status debugging is on%s", VTY_NEWLINE);
1436: if (IS_DEBUG_OSPF (ism, ISM_EVENTS))
1437: vty_out (vty, " OSPF ISM event debugging is on%s", VTY_NEWLINE);
1438: if (IS_DEBUG_OSPF (ism, ISM_TIMERS))
1439: vty_out (vty, " OSPF ISM timer debugging is on%s", VTY_NEWLINE);
1440: }
1441:
1442: /* Show debug status for NSM. */
1443: if (IS_DEBUG_OSPF (nsm, NSM) == OSPF_DEBUG_NSM)
1444: vty_out (vty, " OSPF NSM debugging is on%s", VTY_NEWLINE);
1445: else
1446: {
1447: if (IS_DEBUG_OSPF (nsm, NSM_STATUS))
1448: vty_out (vty, " OSPF NSM status debugging is on%s", VTY_NEWLINE);
1449: if (IS_DEBUG_OSPF (nsm, NSM_EVENTS))
1450: vty_out (vty, " OSPF NSM event debugging is on%s", VTY_NEWLINE);
1451: if (IS_DEBUG_OSPF (nsm, NSM_TIMERS))
1452: vty_out (vty, " OSPF NSM timer debugging is on%s", VTY_NEWLINE);
1453: }
1454:
1455: /* Show debug status for OSPF Packets. */
1456: for (i = 0; i < 5; i++)
1457: if (IS_DEBUG_OSPF_PACKET (i, SEND) && IS_DEBUG_OSPF_PACKET (i, RECV))
1458: {
1459: vty_out (vty, " OSPF packet %s%s debugging is on%s",
1460: ospf_packet_type_str[i + 1],
1461: IS_DEBUG_OSPF_PACKET (i, DETAIL) ? " detail" : "",
1462: VTY_NEWLINE);
1463: }
1464: else
1465: {
1466: if (IS_DEBUG_OSPF_PACKET (i, SEND))
1467: vty_out (vty, " OSPF packet %s send%s debugging is on%s",
1468: ospf_packet_type_str[i + 1],
1469: IS_DEBUG_OSPF_PACKET (i, DETAIL) ? " detail" : "",
1470: VTY_NEWLINE);
1471: if (IS_DEBUG_OSPF_PACKET (i, RECV))
1472: vty_out (vty, " OSPF packet %s receive%s debugging is on%s",
1473: ospf_packet_type_str[i + 1],
1474: IS_DEBUG_OSPF_PACKET (i, DETAIL) ? " detail" : "",
1475: VTY_NEWLINE);
1476: }
1477:
1478: /* Show debug status for OSPF LSAs. */
1479: if (IS_DEBUG_OSPF (lsa, LSA) == OSPF_DEBUG_LSA)
1480: vty_out (vty, " OSPF LSA debugging is on%s", VTY_NEWLINE);
1481: else
1482: {
1483: if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1484: vty_out (vty, " OSPF LSA generation debugging is on%s", VTY_NEWLINE);
1485: if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
1486: vty_out (vty, " OSPF LSA flooding debugging is on%s", VTY_NEWLINE);
1487: if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
1488: vty_out (vty, " OSPF LSA install debugging is on%s", VTY_NEWLINE);
1489: if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
1490: vty_out (vty, " OSPF LSA refresh debugging is on%s", VTY_NEWLINE);
1491: }
1492:
1493: /* Show debug status for Zebra. */
1494: if (IS_DEBUG_OSPF (zebra, ZEBRA) == OSPF_DEBUG_ZEBRA)
1495: vty_out (vty, " OSPF Zebra debugging is on%s", VTY_NEWLINE);
1496: else
1497: {
1498: if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE))
1499: vty_out (vty, " OSPF Zebra interface debugging is on%s", VTY_NEWLINE);
1500: if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
1501: vty_out (vty, " OSPF Zebra redistribute debugging is on%s", VTY_NEWLINE);
1502: }
1503:
1504: /* Show debug status for NSSA. */
1505: if (IS_DEBUG_OSPF (nssa, NSSA) == OSPF_DEBUG_NSSA)
1506: vty_out (vty, " OSPF NSSA debugging is on%s", VTY_NEWLINE);
1507:
1508: return CMD_SUCCESS;
1509: }
1510:
1511: /* Debug node. */
1512: static struct cmd_node debug_node =
1513: {
1514: DEBUG_NODE,
1515: "",
1516: 1 /* VTYSH */
1517: };
1518:
1519: static int
1520: config_write_debug (struct vty *vty)
1521: {
1522: int write = 0;
1523: int i, r;
1524:
1525: const char *type_str[] = {"hello", "dd", "ls-request", "ls-update", "ls-ack"};
1526: const char *detail_str[] = {"", " send", " recv", "", " detail",
1527: " send detail", " recv detail", " detail"};
1528:
1529: /* debug ospf ism (status|events|timers). */
1530: if (IS_CONF_DEBUG_OSPF (ism, ISM) == OSPF_DEBUG_ISM)
1531: vty_out (vty, "debug ospf ism%s", VTY_NEWLINE);
1532: else
1533: {
1534: if (IS_CONF_DEBUG_OSPF (ism, ISM_STATUS))
1535: vty_out (vty, "debug ospf ism status%s", VTY_NEWLINE);
1536: if (IS_CONF_DEBUG_OSPF (ism, ISM_EVENTS))
1537: vty_out (vty, "debug ospf ism event%s", VTY_NEWLINE);
1538: if (IS_CONF_DEBUG_OSPF (ism, ISM_TIMERS))
1539: vty_out (vty, "debug ospf ism timer%s", VTY_NEWLINE);
1540: }
1541:
1542: /* debug ospf nsm (status|events|timers). */
1543: if (IS_CONF_DEBUG_OSPF (nsm, NSM) == OSPF_DEBUG_NSM)
1544: vty_out (vty, "debug ospf nsm%s", VTY_NEWLINE);
1545: else
1546: {
1547: if (IS_CONF_DEBUG_OSPF (nsm, NSM_STATUS))
1548: vty_out (vty, "debug ospf nsm status%s", VTY_NEWLINE);
1549: if (IS_CONF_DEBUG_OSPF (nsm, NSM_EVENTS))
1550: vty_out (vty, "debug ospf nsm event%s", VTY_NEWLINE);
1551: if (IS_CONF_DEBUG_OSPF (nsm, NSM_TIMERS))
1552: vty_out (vty, "debug ospf nsm timer%s", VTY_NEWLINE);
1553: }
1554:
1555: /* debug ospf lsa (generate|flooding|install|refresh). */
1556: if (IS_CONF_DEBUG_OSPF (lsa, LSA) == OSPF_DEBUG_LSA)
1557: vty_out (vty, "debug ospf lsa%s", VTY_NEWLINE);
1558: else
1559: {
1560: if (IS_CONF_DEBUG_OSPF (lsa, LSA_GENERATE))
1561: vty_out (vty, "debug ospf lsa generate%s", VTY_NEWLINE);
1562: if (IS_CONF_DEBUG_OSPF (lsa, LSA_FLOODING))
1563: vty_out (vty, "debug ospf lsa flooding%s", VTY_NEWLINE);
1564: if (IS_CONF_DEBUG_OSPF (lsa, LSA_INSTALL))
1565: vty_out (vty, "debug ospf lsa install%s", VTY_NEWLINE);
1566: if (IS_CONF_DEBUG_OSPF (lsa, LSA_REFRESH))
1567: vty_out (vty, "debug ospf lsa refresh%s", VTY_NEWLINE);
1568:
1569: write = 1;
1570: }
1571:
1572: /* debug ospf zebra (interface|redistribute). */
1573: if (IS_CONF_DEBUG_OSPF (zebra, ZEBRA) == OSPF_DEBUG_ZEBRA)
1574: vty_out (vty, "debug ospf zebra%s", VTY_NEWLINE);
1575: else
1576: {
1577: if (IS_CONF_DEBUG_OSPF (zebra, ZEBRA_INTERFACE))
1578: vty_out (vty, "debug ospf zebra interface%s", VTY_NEWLINE);
1579: if (IS_CONF_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
1580: vty_out (vty, "debug ospf zebra redistribute%s", VTY_NEWLINE);
1581:
1582: write = 1;
1583: }
1584:
1585: /* debug ospf event. */
1586: if (IS_CONF_DEBUG_OSPF (event, EVENT) == OSPF_DEBUG_EVENT)
1587: {
1588: vty_out (vty, "debug ospf event%s", VTY_NEWLINE);
1589: write = 1;
1590: }
1591:
1592: /* debug ospf nssa. */
1593: if (IS_CONF_DEBUG_OSPF (nssa, NSSA) == OSPF_DEBUG_NSSA)
1594: {
1595: vty_out (vty, "debug ospf nssa%s", VTY_NEWLINE);
1596: write = 1;
1597: }
1598:
1599: /* debug ospf packet all detail. */
1600: r = OSPF_DEBUG_SEND_RECV|OSPF_DEBUG_DETAIL;
1601: for (i = 0; i < 5; i++)
1602: r &= conf_debug_ospf_packet[i] & (OSPF_DEBUG_SEND_RECV|OSPF_DEBUG_DETAIL);
1603: if (r == (OSPF_DEBUG_SEND_RECV|OSPF_DEBUG_DETAIL))
1604: {
1605: vty_out (vty, "debug ospf packet all detail%s", VTY_NEWLINE);
1606: return 1;
1607: }
1608:
1609: /* debug ospf packet all. */
1610: r = OSPF_DEBUG_SEND_RECV;
1611: for (i = 0; i < 5; i++)
1612: r &= conf_debug_ospf_packet[i] & OSPF_DEBUG_SEND_RECV;
1613: if (r == OSPF_DEBUG_SEND_RECV)
1614: {
1615: vty_out (vty, "debug ospf packet all%s", VTY_NEWLINE);
1616: for (i = 0; i < 5; i++)
1617: if (conf_debug_ospf_packet[i] & OSPF_DEBUG_DETAIL)
1618: vty_out (vty, "debug ospf packet %s detail%s",
1619: type_str[i],
1620: VTY_NEWLINE);
1621: return 1;
1622: }
1623:
1624: /* debug ospf packet (hello|dd|ls-request|ls-update|ls-ack)
1625: (send|recv) (detail). */
1626: for (i = 0; i < 5; i++)
1627: {
1628: if (conf_debug_ospf_packet[i] == 0)
1629: continue;
1630:
1631: vty_out (vty, "debug ospf packet %s%s%s",
1632: type_str[i], detail_str[conf_debug_ospf_packet[i]],
1633: VTY_NEWLINE);
1634: write = 1;
1635: }
1636:
1637: return write;
1638: }
1639:
1640: /* Initialize debug commands. */
1641: void
1642: debug_init ()
1643: {
1644: install_node (&debug_node, config_write_debug);
1645:
1646: install_element (ENABLE_NODE, &show_debugging_ospf_cmd);
1647: install_element (ENABLE_NODE, &debug_ospf_packet_send_recv_detail_cmd);
1648: install_element (ENABLE_NODE, &debug_ospf_packet_send_recv_cmd);
1649: install_element (ENABLE_NODE, &debug_ospf_packet_all_cmd);
1650: install_element (ENABLE_NODE, &debug_ospf_ism_sub_cmd);
1651: install_element (ENABLE_NODE, &debug_ospf_ism_cmd);
1652: install_element (ENABLE_NODE, &debug_ospf_nsm_sub_cmd);
1653: install_element (ENABLE_NODE, &debug_ospf_nsm_cmd);
1654: install_element (ENABLE_NODE, &debug_ospf_lsa_sub_cmd);
1655: install_element (ENABLE_NODE, &debug_ospf_lsa_cmd);
1656: install_element (ENABLE_NODE, &debug_ospf_zebra_sub_cmd);
1657: install_element (ENABLE_NODE, &debug_ospf_zebra_cmd);
1658: install_element (ENABLE_NODE, &debug_ospf_event_cmd);
1659: install_element (ENABLE_NODE, &debug_ospf_nssa_cmd);
1660: install_element (ENABLE_NODE, &no_debug_ospf_packet_send_recv_detail_cmd);
1661: install_element (ENABLE_NODE, &no_debug_ospf_packet_send_recv_cmd);
1662: install_element (ENABLE_NODE, &no_debug_ospf_packet_all_cmd);
1663: install_element (ENABLE_NODE, &no_debug_ospf_ism_sub_cmd);
1664: install_element (ENABLE_NODE, &no_debug_ospf_ism_cmd);
1665: install_element (ENABLE_NODE, &no_debug_ospf_nsm_sub_cmd);
1666: install_element (ENABLE_NODE, &no_debug_ospf_nsm_cmd);
1667: install_element (ENABLE_NODE, &no_debug_ospf_lsa_sub_cmd);
1668: install_element (ENABLE_NODE, &no_debug_ospf_lsa_cmd);
1669: install_element (ENABLE_NODE, &no_debug_ospf_zebra_sub_cmd);
1670: install_element (ENABLE_NODE, &no_debug_ospf_zebra_cmd);
1671: install_element (ENABLE_NODE, &no_debug_ospf_event_cmd);
1672: install_element (ENABLE_NODE, &no_debug_ospf_nssa_cmd);
1673:
1674: install_element (CONFIG_NODE, &debug_ospf_packet_send_recv_detail_cmd);
1675: install_element (CONFIG_NODE, &debug_ospf_packet_send_recv_cmd);
1676: install_element (CONFIG_NODE, &debug_ospf_packet_all_cmd);
1677: install_element (CONFIG_NODE, &debug_ospf_ism_sub_cmd);
1678: install_element (CONFIG_NODE, &debug_ospf_ism_cmd);
1679: install_element (CONFIG_NODE, &debug_ospf_nsm_sub_cmd);
1680: install_element (CONFIG_NODE, &debug_ospf_nsm_cmd);
1681: install_element (CONFIG_NODE, &debug_ospf_lsa_sub_cmd);
1682: install_element (CONFIG_NODE, &debug_ospf_lsa_cmd);
1683: install_element (CONFIG_NODE, &debug_ospf_zebra_sub_cmd);
1684: install_element (CONFIG_NODE, &debug_ospf_zebra_cmd);
1685: install_element (CONFIG_NODE, &debug_ospf_event_cmd);
1686: install_element (CONFIG_NODE, &debug_ospf_nssa_cmd);
1687: install_element (CONFIG_NODE, &no_debug_ospf_packet_send_recv_detail_cmd);
1688: install_element (CONFIG_NODE, &no_debug_ospf_packet_send_recv_cmd);
1689: install_element (CONFIG_NODE, &no_debug_ospf_packet_all_cmd);
1690: install_element (CONFIG_NODE, &no_debug_ospf_ism_sub_cmd);
1691: install_element (CONFIG_NODE, &no_debug_ospf_ism_cmd);
1692: install_element (CONFIG_NODE, &no_debug_ospf_nsm_sub_cmd);
1693: install_element (CONFIG_NODE, &no_debug_ospf_nsm_cmd);
1694: install_element (CONFIG_NODE, &no_debug_ospf_lsa_sub_cmd);
1695: install_element (CONFIG_NODE, &no_debug_ospf_lsa_cmd);
1696: install_element (CONFIG_NODE, &no_debug_ospf_zebra_sub_cmd);
1697: install_element (CONFIG_NODE, &no_debug_ospf_zebra_cmd);
1698: install_element (CONFIG_NODE, &no_debug_ospf_event_cmd);
1699: install_element (CONFIG_NODE, &no_debug_ospf_nssa_cmd);
1700: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>