File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_dump.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 11:53:41 2012 UTC (12 years, 1 month ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, HEAD
quagga 0.99.20.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>