File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_dump.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_20, HEAD
quagga

    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>