Annotation of embedaddon/quagga/ospfd/ospf_dump.c, revision 1.1.1.3

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

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