Annotation of embedaddon/quagga/ospfd/ospf_vty.c, revision 1.1.1.1

1.1       misho       1: /* OSPF VTY interface.
                      2:  * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
                      3:  * Copyright (C) 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 Free
                     19:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     20:  * 02111-1307, USA.  
                     21:  */
                     22: 
                     23: #include <zebra.h>
                     24: 
                     25: #include "memory.h"
                     26: #include "thread.h"
                     27: #include "prefix.h"
                     28: #include "table.h"
                     29: #include "vty.h"
                     30: #include "command.h"
                     31: #include "plist.h"
                     32: #include "log.h"
                     33: #include "zclient.h"
                     34: 
                     35: #include "ospfd/ospfd.h"
                     36: #include "ospfd/ospf_asbr.h"
                     37: #include "ospfd/ospf_lsa.h"
                     38: #include "ospfd/ospf_lsdb.h"
                     39: #include "ospfd/ospf_ism.h"
                     40: #include "ospfd/ospf_interface.h"
                     41: #include "ospfd/ospf_nsm.h"
                     42: #include "ospfd/ospf_neighbor.h"
                     43: #include "ospfd/ospf_flood.h"
                     44: #include "ospfd/ospf_abr.h"
                     45: #include "ospfd/ospf_spf.h"
                     46: #include "ospfd/ospf_route.h"
                     47: #include "ospfd/ospf_zebra.h"
                     48: /*#include "ospfd/ospf_routemap.h" */
                     49: #include "ospfd/ospf_vty.h"
                     50: #include "ospfd/ospf_dump.h"
                     51: 
                     52: 
                     53: static const char *ospf_network_type_str[] =
                     54: {
                     55:   "Null",
                     56:   "POINTOPOINT",
                     57:   "BROADCAST",
                     58:   "NBMA",
                     59:   "POINTOMULTIPOINT",
                     60:   "VIRTUALLINK",
                     61:   "LOOPBACK"
                     62: };
                     63: 
                     64: 
                     65: /* Utility functions. */
                     66: static int
                     67: ospf_str2area_id (const char *str, struct in_addr *area_id, int *format)
                     68: {
                     69:   char *endptr = NULL;
                     70:   unsigned long ret;
                     71: 
                     72:   /* match "A.B.C.D". */
                     73:   if (strchr (str, '.') != NULL)
                     74:     {
                     75:       ret = inet_aton (str, area_id);
                     76:       if (!ret)
                     77:         return -1;
                     78:       *format = OSPF_AREA_ID_FORMAT_ADDRESS;
                     79:     }
                     80:   /* match "<0-4294967295>". */
                     81:   else
                     82:     {
                     83:       ret = strtoul (str, &endptr, 10);
                     84:       if (*endptr != '\0' || (ret == ULONG_MAX && errno == ERANGE))
                     85:         return -1;
                     86: 
                     87:       area_id->s_addr = htonl (ret);
                     88:       *format = OSPF_AREA_ID_FORMAT_DECIMAL;
                     89:     }
                     90: 
                     91:   return 0;
                     92: }
                     93: 
                     94: 
                     95: static int
                     96: str2distribute_source (const char *str, int *source)
                     97: {
                     98:   /* Sanity check. */
                     99:   if (str == NULL)
                    100:     return 0;
                    101: 
                    102:   if (strncmp (str, "k", 1) == 0)
                    103:     *source = ZEBRA_ROUTE_KERNEL;
                    104:   else if (strncmp (str, "c", 1) == 0)
                    105:     *source = ZEBRA_ROUTE_CONNECT;
                    106:   else if (strncmp (str, "s", 1) == 0)
                    107:     *source = ZEBRA_ROUTE_STATIC;
                    108:   else if (strncmp (str, "r", 1) == 0)
                    109:     *source = ZEBRA_ROUTE_RIP;
                    110:   else if (strncmp (str, "b", 1) == 0)
                    111:     *source = ZEBRA_ROUTE_BGP;
                    112:   else
                    113:     return 0;
                    114: 
                    115:   return 1;
                    116: }
                    117: 
                    118: static int
                    119: str2metric (const char *str, int *metric)
                    120: {
                    121:   /* Sanity check. */
                    122:   if (str == NULL)
                    123:     return 0;
                    124: 
                    125:   *metric = strtol (str, NULL, 10);
                    126:   if (*metric < 0 && *metric > 16777214)
                    127:     {
                    128:       /* vty_out (vty, "OSPF metric value is invalid%s", VTY_NEWLINE); */
                    129:       return 0;
                    130:     }
                    131: 
                    132:   return 1;
                    133: }
                    134: 
                    135: static int
                    136: str2metric_type (const char *str, int *metric_type)
                    137: {
                    138:   /* Sanity check. */
                    139:   if (str == NULL)
                    140:     return 0;
                    141: 
                    142:   if (strncmp (str, "1", 1) == 0)
                    143:     *metric_type = EXTERNAL_METRIC_TYPE_1;
                    144:   else if (strncmp (str, "2", 1) == 0)
                    145:     *metric_type = EXTERNAL_METRIC_TYPE_2;
                    146:   else
                    147:     return 0;
                    148: 
                    149:   return 1;
                    150: }
                    151: 
                    152: int
                    153: ospf_oi_count (struct interface *ifp)
                    154: {
                    155:   struct route_node *rn;
                    156:   int i = 0;
                    157: 
                    158:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                    159:     if (rn->info)
                    160:       i++;
                    161: 
                    162:   return i;
                    163: }
                    164: 
                    165: 
                    166: DEFUN (router_ospf,
                    167:        router_ospf_cmd,
                    168:        "router ospf",
                    169:        "Enable a routing process\n"
                    170:        "Start OSPF configuration\n")
                    171: {
                    172:   vty->node = OSPF_NODE;
                    173:   vty->index = ospf_get ();
                    174:  
                    175:   return CMD_SUCCESS;
                    176: }
                    177: 
                    178: DEFUN (no_router_ospf,
                    179:        no_router_ospf_cmd,
                    180:        "no router ospf",
                    181:        NO_STR
                    182:        "Enable a routing process\n"
                    183:        "Start OSPF configuration\n")
                    184: {
                    185:   struct ospf *ospf;
                    186: 
                    187:   ospf = ospf_lookup ();
                    188:   if (ospf == NULL)
                    189:     {
                    190:       vty_out (vty, "There isn't active ospf instance%s", VTY_NEWLINE);
                    191:       return CMD_WARNING;
                    192:     }
                    193: 
                    194:   ospf_finish (ospf);
                    195: 
                    196:   return CMD_SUCCESS;
                    197: }
                    198: 
                    199: DEFUN (ospf_router_id,
                    200:        ospf_router_id_cmd,
                    201:        "ospf router-id A.B.C.D",
                    202:        "OSPF specific commands\n"
                    203:        "router-id for the OSPF process\n"
                    204:        "OSPF router-id in IP address format\n")
                    205: {
                    206:   struct ospf *ospf = vty->index;
                    207:   struct in_addr router_id;
                    208:   int ret;
                    209: 
                    210:   ret = inet_aton (argv[0], &router_id);
                    211:   if (!ret)
                    212:     {
                    213:       vty_out (vty, "Please specify Router ID by A.B.C.D%s", VTY_NEWLINE);
                    214:       return CMD_WARNING;
                    215:     }
                    216: 
                    217:   ospf->router_id_static = router_id;
                    218:   
                    219:   ospf_router_id_update (ospf);
                    220:   
                    221:   return CMD_SUCCESS;
                    222: }
                    223: 
                    224: ALIAS (ospf_router_id,
                    225:        router_ospf_id_cmd,
                    226:        "router-id A.B.C.D",
                    227:        "router-id for the OSPF process\n"
                    228:        "OSPF router-id in IP address format\n")
                    229: 
                    230: DEFUN (no_ospf_router_id,
                    231:        no_ospf_router_id_cmd,
                    232:        "no ospf router-id",
                    233:        NO_STR
                    234:        "OSPF specific commands\n"
                    235:        "router-id for the OSPF process\n")
                    236: {
                    237:   struct ospf *ospf = vty->index;
                    238: 
                    239:   ospf->router_id_static.s_addr = 0;
                    240: 
                    241:   ospf_router_id_update (ospf);
                    242: 
                    243:   return CMD_SUCCESS;
                    244: }
                    245: 
                    246: ALIAS (no_ospf_router_id,
                    247:        no_router_ospf_id_cmd,
                    248:        "no router-id",
                    249:        NO_STR
                    250:        "router-id for the OSPF process\n")
                    251: 
                    252: static void
                    253: ospf_passive_interface_default (struct ospf *ospf, u_char newval)
                    254: {
                    255:   struct listnode *ln;
                    256:   struct interface *ifp;
                    257:   struct ospf_interface *oi;
                    258:   
                    259:   ospf->passive_interface_default = newval;
                    260: 
                    261:   for (ALL_LIST_ELEMENTS_RO (om->iflist, ln, ifp))
                    262:     {
                    263:       if (ifp &&
                    264:           OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
                    265:         UNSET_IF_PARAM (IF_DEF_PARAMS (ifp), passive_interface);
                    266:     }
                    267:   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, ln, oi))
                    268:     {
                    269:       if (OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
                    270:         UNSET_IF_PARAM (oi->params, passive_interface);
                    271:       /* update multicast memberships */
                    272:       ospf_if_set_multicast(oi);
                    273:     }
                    274: }
                    275: 
                    276: static void
                    277: ospf_passive_interface_update (struct ospf *ospf, struct interface *ifp,
                    278:                                struct in_addr addr, 
                    279:                                struct ospf_if_params *params, u_char value)
                    280: {
                    281:   u_char dflt;
                    282:   
                    283:   params->passive_interface = value;
                    284:   if (params != IF_DEF_PARAMS (ifp))
                    285:     {
                    286:       if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface))
                    287:         dflt = IF_DEF_PARAMS (ifp)->passive_interface;
                    288:       else
                    289:         dflt = ospf->passive_interface_default;
                    290:       
                    291:       if (value != dflt)
                    292:         SET_IF_PARAM (params, passive_interface);
                    293:       else
                    294:         UNSET_IF_PARAM (params, passive_interface);
                    295:       
                    296:       ospf_free_if_params (ifp, addr);
                    297:       ospf_if_update_params (ifp, addr);
                    298:     }
                    299:   else
                    300:     {
                    301:       if (value != ospf->passive_interface_default)
                    302:         SET_IF_PARAM (params, passive_interface);
                    303:       else
                    304:         UNSET_IF_PARAM (params, passive_interface);
                    305:     }
                    306: }
                    307: 
                    308: DEFUN (ospf_passive_interface,
                    309:        ospf_passive_interface_addr_cmd,
                    310:        "passive-interface IFNAME A.B.C.D",
                    311:        "Suppress routing updates on an interface\n"
                    312:        "Interface's name\n")
                    313: {
                    314:   struct interface *ifp;
                    315:   struct in_addr addr;
                    316:   int ret;
                    317:   struct ospf_if_params *params;
                    318:   struct route_node *rn;
                    319:   struct ospf *ospf = vty->index;
                    320: 
                    321:   if (argc == 0)
                    322:     {
                    323:       ospf_passive_interface_default (ospf, OSPF_IF_PASSIVE);
                    324:       return CMD_SUCCESS;
                    325:     }
                    326: 
                    327:   ifp = if_get_by_name (argv[0]);
                    328: 
                    329:   params = IF_DEF_PARAMS (ifp);
                    330: 
                    331:   if (argc == 2)
                    332:     {
                    333:       ret = inet_aton(argv[1], &addr);
                    334:       if (!ret)
                    335:        {
                    336:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                    337:                   VTY_NEWLINE);
                    338:          return CMD_WARNING;
                    339:        }
                    340: 
                    341:       params = ospf_get_if_params (ifp, addr);
                    342:       ospf_if_update_params (ifp, addr);
                    343:     }
                    344:   ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_PASSIVE);
                    345: 
                    346:   /* XXX We should call ospf_if_set_multicast on exactly those
                    347:    * interfaces for which the passive property changed.  It is too much
                    348:    * work to determine this set, so we do this for every interface.
                    349:    * This is safe and reasonable because ospf_if_set_multicast uses a
                    350:    * record of joined groups to avoid systems calls if the desired
                    351:    * memberships match the current memership.
                    352:    */
                    353: 
                    354:   for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
                    355:     {
                    356:       struct ospf_interface *oi = rn->info;
                    357: 
                    358:       if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_PASSIVE))
                    359:        ospf_if_set_multicast(oi);
                    360:     }
                    361:   /*
                    362:    * XXX It is not clear what state transitions the interface needs to
                    363:    * undergo when going from active to passive.  Fixing this will
                    364:    * require precise identification of interfaces having such a
                    365:    * transition.
                    366:    */
                    367: 
                    368:  return CMD_SUCCESS;
                    369: }
                    370: 
                    371: ALIAS (ospf_passive_interface,
                    372:        ospf_passive_interface_cmd,
                    373:        "passive-interface IFNAME",
                    374:        "Suppress routing updates on an interface\n"
                    375:        "Interface's name\n")
                    376: 
                    377: ALIAS (ospf_passive_interface,
                    378:        ospf_passive_interface_default_cmd,
                    379:        "passive-interface default",
                    380:        "Suppress routing updates on an interface\n"
                    381:        "Suppress routing updates on interfaces by default\n")
                    382: 
                    383: DEFUN (no_ospf_passive_interface,
                    384:        no_ospf_passive_interface_addr_cmd,
                    385:        "no passive-interface IFNAME A.B.C.D",
                    386:        NO_STR
                    387:        "Allow routing updates on an interface\n"
                    388:        "Interface's name\n")
                    389: {
                    390:   struct interface *ifp;
                    391:   struct in_addr addr;
                    392:   struct ospf_if_params *params;
                    393:   int ret;
                    394:   struct route_node *rn;
                    395:   struct ospf *ospf = vty->index;
                    396: 
                    397:   if (argc == 0)
                    398:     {
                    399:       ospf_passive_interface_default (ospf, OSPF_IF_ACTIVE);
                    400:       return CMD_SUCCESS;
                    401:     }
                    402:     
                    403:   ifp = if_get_by_name (argv[0]);
                    404: 
                    405:   params = IF_DEF_PARAMS (ifp);
                    406: 
                    407:   if (argc == 2)
                    408:     {
                    409:       ret = inet_aton(argv[1], &addr);
                    410:       if (!ret)
                    411:        {
                    412:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                    413:                   VTY_NEWLINE);
                    414:          return CMD_WARNING;
                    415:        }
                    416: 
                    417:       params = ospf_lookup_if_params (ifp, addr);
                    418:       if (params == NULL)
                    419:        return CMD_SUCCESS;
                    420:     }
                    421:   ospf_passive_interface_update (ospf, ifp, addr, params, OSPF_IF_ACTIVE);
                    422: 
                    423:   /* XXX We should call ospf_if_set_multicast on exactly those
                    424:    * interfaces for which the passive property changed.  It is too much
                    425:    * work to determine this set, so we do this for every interface.
                    426:    * This is safe and reasonable because ospf_if_set_multicast uses a
                    427:    * record of joined groups to avoid systems calls if the desired
                    428:    * memberships match the current memership.
                    429:    */
                    430:   for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next (rn))
                    431:     {
                    432:       struct ospf_interface *oi = rn->info;
                    433: 
                    434:       if (oi && (OSPF_IF_PARAM(oi, passive_interface) == OSPF_IF_ACTIVE))
                    435:         ospf_if_set_multicast(oi);
                    436:     }
                    437: 
                    438:   return CMD_SUCCESS;
                    439: }
                    440: 
                    441: ALIAS (no_ospf_passive_interface,
                    442:        no_ospf_passive_interface_cmd,
                    443:        "no passive-interface IFNAME",
                    444:        NO_STR
                    445:        "Allow routing updates on an interface\n"
                    446:        "Interface's name\n")
                    447: 
                    448: ALIAS (no_ospf_passive_interface,
                    449:        no_ospf_passive_interface_default_cmd,
                    450:        "no passive-interface default",
                    451:        NO_STR
                    452:        "Allow routing updates on an interface\n"
                    453:        "Allow routing updates on interfaces by default\n")
                    454:        
                    455: DEFUN (ospf_network_area,
                    456:        ospf_network_area_cmd,
                    457:        "network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
                    458:        "Enable routing on an IP network\n"
                    459:        "OSPF network prefix\n"
                    460:        "Set the OSPF area ID\n"
                    461:        "OSPF area ID in IP address format\n"
                    462:        "OSPF area ID as a decimal value\n")
                    463: {
                    464:   struct ospf *ospf= vty->index;
                    465:   struct prefix_ipv4 p;
                    466:   struct in_addr area_id;
                    467:   int ret, format;
                    468: 
                    469:   /* Get network prefix and Area ID. */
                    470:   VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
                    471:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
                    472: 
                    473:   ret = ospf_network_set (ospf, &p, area_id);
                    474:   if (ret == 0)
                    475:     {
                    476:       vty_out (vty, "There is already same network statement.%s", VTY_NEWLINE);
                    477:       return CMD_WARNING;
                    478:     }
                    479: 
                    480:   return CMD_SUCCESS;
                    481: }
                    482: 
                    483: DEFUN (no_ospf_network_area,
                    484:        no_ospf_network_area_cmd,
                    485:        "no network A.B.C.D/M area (A.B.C.D|<0-4294967295>)",
                    486:        NO_STR
                    487:        "Enable routing on an IP network\n"
                    488:        "OSPF network prefix\n"
                    489:        "Set the OSPF area ID\n"
                    490:        "OSPF area ID in IP address format\n"
                    491:        "OSPF area ID as a decimal value\n")
                    492: {
                    493:   struct ospf *ospf = (struct ospf *) vty->index;
                    494:   struct prefix_ipv4 p;
                    495:   struct in_addr area_id;
                    496:   int ret, format;
                    497: 
                    498:   /* Get network prefix and Area ID. */
                    499:   VTY_GET_IPV4_PREFIX ("network prefix", p, argv[0]);
                    500:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[1]);
                    501: 
                    502:   ret = ospf_network_unset (ospf, &p, area_id);
                    503:   if (ret == 0)
                    504:     {
                    505:       vty_out (vty, "Can't find specified network area configuration.%s",
                    506:               VTY_NEWLINE);
                    507:       return CMD_WARNING;
                    508:     }
                    509: 
                    510:   return CMD_SUCCESS;
                    511: }
                    512: 
                    513: 
                    514: DEFUN (ospf_area_range,
                    515:        ospf_area_range_cmd,
                    516:        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
                    517:        "OSPF area parameters\n"
                    518:        "OSPF area ID in IP address format\n"
                    519:        "OSPF area ID as a decimal value\n"
                    520:        "Summarize routes matching address/mask (border routers only)\n"
                    521:        "Area range prefix\n")
                    522: {
                    523:   struct ospf *ospf = vty->index;
                    524:   struct prefix_ipv4 p;
                    525:   struct in_addr area_id;
                    526:   int format;
                    527:   u_int32_t cost;
                    528: 
                    529:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                    530:   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
                    531: 
                    532:   ospf_area_range_set (ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
                    533:   if (argc > 2)
                    534:     {
                    535:       VTY_GET_INTEGER ("range cost", cost, argv[2]);
                    536:       ospf_area_range_cost_set (ospf, area_id, &p, cost);
                    537:     }
                    538: 
                    539:   return CMD_SUCCESS;
                    540: }
                    541: 
                    542: ALIAS (ospf_area_range,
                    543:        ospf_area_range_advertise_cmd,
                    544:        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise",
                    545:        "OSPF area parameters\n"
                    546:        "OSPF area ID in IP address format\n"
                    547:        "OSPF area ID as a decimal value\n"
                    548:        "OSPF area range for route advertise (default)\n"
                    549:        "Area range prefix\n"
                    550:        "Advertise this range (default)\n")
                    551: 
                    552: ALIAS (ospf_area_range,
                    553:        ospf_area_range_cost_cmd,
                    554:        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
                    555:        "OSPF area parameters\n"
                    556:        "OSPF area ID in IP address format\n"
                    557:        "OSPF area ID as a decimal value\n"
                    558:        "Summarize routes matching address/mask (border routers only)\n"
                    559:        "Area range prefix\n"
                    560:        "User specified metric for this range\n"
                    561:        "Advertised metric for this range\n")
                    562: 
                    563: ALIAS (ospf_area_range,
                    564:        ospf_area_range_advertise_cost_cmd,
                    565:        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
                    566:        "OSPF area parameters\n"
                    567:        "OSPF area ID in IP address format\n"
                    568:        "OSPF area ID as a decimal value\n"
                    569:        "Summarize routes matching address/mask (border routers only)\n"
                    570:        "Area range prefix\n"
                    571:        "Advertise this range (default)\n"
                    572:        "User specified metric for this range\n"
                    573:        "Advertised metric for this range\n")
                    574: 
                    575: DEFUN (ospf_area_range_not_advertise,
                    576:        ospf_area_range_not_advertise_cmd,
                    577:        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M not-advertise",
                    578:        "OSPF area parameters\n"
                    579:        "OSPF area ID in IP address format\n"
                    580:        "OSPF area ID as a decimal value\n"
                    581:        "Summarize routes matching address/mask (border routers only)\n"
                    582:        "Area range prefix\n"
                    583:        "DoNotAdvertise this range\n")
                    584: {
                    585:   struct ospf *ospf = vty->index;
                    586:   struct prefix_ipv4 p;
                    587:   struct in_addr area_id;
                    588:   int format;
                    589: 
                    590:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                    591:   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
                    592: 
                    593:   ospf_area_range_set (ospf, area_id, &p, 0);
                    594: 
                    595:   return CMD_SUCCESS;
                    596: }
                    597: 
                    598: DEFUN (no_ospf_area_range,
                    599:        no_ospf_area_range_cmd,
                    600:        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M",
                    601:        NO_STR
                    602:        "OSPF area parameters\n"
                    603:        "OSPF area ID in IP address format\n"
                    604:        "OSPF area ID as a decimal value\n"
                    605:        "Summarize routes matching address/mask (border routers only)\n"
                    606:        "Area range prefix\n")
                    607: {
                    608:   struct ospf *ospf = vty->index;
                    609:   struct prefix_ipv4 p;
                    610:   struct in_addr area_id;
                    611:   int format;
                    612: 
                    613:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                    614:   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
                    615: 
                    616:   ospf_area_range_unset (ospf, area_id, &p);
                    617: 
                    618:   return CMD_SUCCESS;
                    619: }
                    620: 
                    621: ALIAS (no_ospf_area_range,
                    622:        no_ospf_area_range_advertise_cmd,
                    623:        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M (advertise|not-advertise)",
                    624:        NO_STR
                    625:        "OSPF area parameters\n"
                    626:        "OSPF area ID in IP address format\n"
                    627:        "OSPF area ID as a decimal value\n"
                    628:        "Summarize routes matching address/mask (border routers only)\n"
                    629:        "Area range prefix\n"
                    630:        "Advertise this range (default)\n"
                    631:        "DoNotAdvertise this range\n")
                    632: 
                    633: ALIAS (no_ospf_area_range,
                    634:        no_ospf_area_range_cost_cmd,
                    635:        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M cost <0-16777215>",
                    636:        NO_STR
                    637:        "OSPF area parameters\n"
                    638:        "OSPF area ID in IP address format\n"
                    639:        "OSPF area ID as a decimal value\n"
                    640:        "Summarize routes matching address/mask (border routers only)\n"
                    641:        "Area range prefix\n"
                    642:        "User specified metric for this range\n"
                    643:        "Advertised metric for this range\n")
                    644: 
                    645: ALIAS (no_ospf_area_range,
                    646:        no_ospf_area_range_advertise_cost_cmd,
                    647:        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M advertise cost <0-16777215>",
                    648:        NO_STR
                    649:        "OSPF area parameters\n"
                    650:        "OSPF area ID in IP address format\n"
                    651:        "OSPF area ID as a decimal value\n"
                    652:        "Summarize routes matching address/mask (border routers only)\n"
                    653:        "Area range prefix\n"
                    654:        "Advertise this range (default)\n"
                    655:        "User specified metric for this range\n"
                    656:        "Advertised metric for this range\n")
                    657: 
                    658: DEFUN (ospf_area_range_substitute,
                    659:        ospf_area_range_substitute_cmd,
                    660:        "area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
                    661:        "OSPF area parameters\n"
                    662:        "OSPF area ID in IP address format\n"
                    663:        "OSPF area ID as a decimal value\n"
                    664:        "Summarize routes matching address/mask (border routers only)\n"
                    665:        "Area range prefix\n"
                    666:        "Announce area range as another prefix\n"
                    667:        "Network prefix to be announced instead of range\n")
                    668: {
                    669:   struct ospf *ospf = vty->index;
                    670:   struct prefix_ipv4 p, s;
                    671:   struct in_addr area_id;
                    672:   int format;
                    673: 
                    674:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                    675:   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
                    676:   VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
                    677: 
                    678:   ospf_area_range_substitute_set (ospf, area_id, &p, &s);
                    679: 
                    680:   return CMD_SUCCESS;
                    681: }
                    682: 
                    683: DEFUN (no_ospf_area_range_substitute,
                    684:        no_ospf_area_range_substitute_cmd,
                    685:        "no area (A.B.C.D|<0-4294967295>) range A.B.C.D/M substitute A.B.C.D/M",
                    686:        NO_STR
                    687:        "OSPF area parameters\n"
                    688:        "OSPF area ID in IP address format\n"
                    689:        "OSPF area ID as a decimal value\n"
                    690:        "Summarize routes matching address/mask (border routers only)\n"
                    691:        "Area range prefix\n"
                    692:        "Announce area range as another prefix\n"
                    693:        "Network prefix to be announced instead of range\n")
                    694: {
                    695:   struct ospf *ospf = vty->index;
                    696:   struct prefix_ipv4 p, s;
                    697:   struct in_addr area_id;
                    698:   int format;
                    699: 
                    700:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                    701:   VTY_GET_IPV4_PREFIX ("area range", p, argv[1]);
                    702:   VTY_GET_IPV4_PREFIX ("substituted network prefix", s, argv[2]);
                    703: 
                    704:   ospf_area_range_substitute_unset (ospf, area_id, &p);
                    705: 
                    706:   return CMD_SUCCESS;
                    707: }
                    708: 
                    709: 
                    710: /* Command Handler Logic in VLink stuff is delicate!!
                    711: 
                    712:        ALTER AT YOUR OWN RISK!!!!
                    713: 
                    714:        Various dummy values are used to represent 'NoChange' state for
                    715:        VLink configuration NOT being changed by a VLink command, and
                    716:        special syntax is used within the command strings so that the
                    717:        typed in command verbs can be seen in the configuration command
                    718:        bacckend handler.  This is to drastically reduce the verbeage
                    719:        required to coe up with a reasonably compatible Cisco VLink command
                    720: 
                    721:        - Matthew Grant <grantma@anathoth.gen.nz> 
                    722:        Wed, 21 Feb 2001 15:13:52 +1300
                    723:  */
                    724: 
                    725: 
                    726: /* Configuration data for virtual links 
                    727:  */ 
                    728: struct ospf_vl_config_data {
                    729:   struct vty *vty;             /* vty stuff */
                    730:   struct in_addr area_id;      /* area ID from command line */
                    731:   int format;                  /* command line area ID format */
                    732:   struct in_addr vl_peer;      /* command line vl_peer */
                    733:   int auth_type;               /* Authehntication type, if given */
                    734:   char *auth_key;              /* simple password if present */
                    735:   int crypto_key_id;           /* Cryptographic key ID */
                    736:   char *md5_key;               /* MD5 authentication key */
                    737:   int hello_interval;          /* Obvious what these are... */
                    738:   int retransmit_interval; 
                    739:   int transmit_delay;
                    740:   int dead_interval;
                    741: };
                    742: 
                    743: static void
                    744: ospf_vl_config_data_init (struct ospf_vl_config_data *vl_config, 
                    745:                          struct vty *vty)
                    746: {
                    747:   memset (vl_config, 0, sizeof (struct ospf_vl_config_data));
                    748:   vl_config->auth_type = OSPF_AUTH_CMD_NOTSEEN;
                    749:   vl_config->vty = vty;
                    750: }
                    751: 
                    752: static struct ospf_vl_data *
                    753: ospf_find_vl_data (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
                    754: {
                    755:   struct ospf_area *area;
                    756:   struct ospf_vl_data *vl_data;
                    757:   struct vty *vty;
                    758:   struct in_addr area_id;
                    759: 
                    760:   vty = vl_config->vty;
                    761:   area_id = vl_config->area_id;
                    762: 
                    763:   if (area_id.s_addr == OSPF_AREA_BACKBONE)
                    764:     {
                    765:       vty_out (vty, 
                    766:               "Configuring VLs over the backbone is not allowed%s",
                    767:                VTY_NEWLINE);
                    768:       return NULL;
                    769:     }
                    770:   area = ospf_area_get (ospf, area_id, vl_config->format);
                    771: 
                    772:   if (area->external_routing != OSPF_AREA_DEFAULT)
                    773:     {
                    774:       if (vl_config->format == OSPF_AREA_ID_FORMAT_ADDRESS)
                    775:        vty_out (vty, "Area %s is %s%s",
                    776:                 inet_ntoa (area_id),
                    777:                 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
                    778:                 VTY_NEWLINE);
                    779:       else
                    780:        vty_out (vty, "Area %ld is %s%s",
                    781:                 (u_long)ntohl (area_id.s_addr),
                    782:                 area->external_routing == OSPF_AREA_NSSA?"nssa":"stub",
                    783:                 VTY_NEWLINE);  
                    784:       return NULL;
                    785:     }
                    786:   
                    787:   if ((vl_data = ospf_vl_lookup (ospf, area, vl_config->vl_peer)) == NULL)
                    788:     {
                    789:       vl_data = ospf_vl_data_new (area, vl_config->vl_peer);
                    790:       if (vl_data->vl_oi == NULL)
                    791:        {
                    792:          vl_data->vl_oi = ospf_vl_new (ospf, vl_data);
                    793:          ospf_vl_add (ospf, vl_data);
                    794:          ospf_spf_calculate_schedule (ospf);
                    795:        }
                    796:     }
                    797:   return vl_data;
                    798: }
                    799: 
                    800: 
                    801: static int
                    802: ospf_vl_set_security (struct ospf_vl_data *vl_data,
                    803:                      struct ospf_vl_config_data *vl_config)
                    804: {
                    805:   struct crypt_key *ck;
                    806:   struct vty *vty;
                    807:   struct interface *ifp = vl_data->vl_oi->ifp;
                    808: 
                    809:   vty = vl_config->vty;
                    810: 
                    811:   if (vl_config->auth_type != OSPF_AUTH_CMD_NOTSEEN)
                    812:     {
                    813:       SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type);
                    814:       IF_DEF_PARAMS (ifp)->auth_type = vl_config->auth_type;
                    815:     }
                    816: 
                    817:   if (vl_config->auth_key)
                    818:     {
                    819:       memset(IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE+1);
                    820:       strncpy ((char *) IF_DEF_PARAMS (ifp)->auth_simple, vl_config->auth_key, 
                    821:               OSPF_AUTH_SIMPLE_SIZE);
                    822:     }
                    823:   else if (vl_config->md5_key)
                    824:     {
                    825:       if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id) 
                    826:          != NULL)
                    827:        {
                    828:          vty_out (vty, "OSPF: Key %d already exists%s",
                    829:                   vl_config->crypto_key_id, VTY_NEWLINE);
                    830:          return CMD_WARNING;
                    831:        }
                    832:       ck = ospf_crypt_key_new ();
                    833:       ck->key_id = vl_config->crypto_key_id;
                    834:       memset(ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
                    835:       strncpy ((char *) ck->auth_key, vl_config->md5_key, OSPF_AUTH_MD5_SIZE);
                    836:       
                    837:       ospf_crypt_key_add (IF_DEF_PARAMS (ifp)->auth_crypt, ck);
                    838:     }
                    839:   else if (vl_config->crypto_key_id != 0)
                    840:     {
                    841:       /* Delete a key */
                    842: 
                    843:       if (ospf_crypt_key_lookup (IF_DEF_PARAMS (ifp)->auth_crypt, 
                    844:                                 vl_config->crypto_key_id) == NULL)
                    845:        {
                    846:          vty_out (vty, "OSPF: Key %d does not exist%s", 
                    847:                   vl_config->crypto_key_id, VTY_NEWLINE);
                    848:          return CMD_WARNING;
                    849:        }
                    850:       
                    851:       ospf_crypt_key_delete (IF_DEF_PARAMS (ifp)->auth_crypt, vl_config->crypto_key_id);
                    852: 
                    853:     }
                    854:   
                    855:   return CMD_SUCCESS;
                    856: }
                    857: 
                    858: static int
                    859: ospf_vl_set_timers (struct ospf_vl_data *vl_data,
                    860:                    struct ospf_vl_config_data *vl_config)
                    861: {
                    862:   struct interface *ifp = ifp = vl_data->vl_oi->ifp;
                    863:   /* Virtual Link data initialised to defaults, so only set
                    864:      if a value given */
                    865:   if (vl_config->hello_interval)
                    866:     {
                    867:       SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello);
                    868:       IF_DEF_PARAMS (ifp)->v_hello = vl_config->hello_interval;
                    869:     }
                    870: 
                    871:   if (vl_config->dead_interval)
                    872:     {
                    873:       SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait);
                    874:       IF_DEF_PARAMS (ifp)->v_wait = vl_config->dead_interval;
                    875:     }
                    876: 
                    877:   if (vl_config->retransmit_interval)
                    878:     {
                    879:       SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval);
                    880:       IF_DEF_PARAMS (ifp)->retransmit_interval = vl_config->retransmit_interval;
                    881:     }
                    882:   
                    883:   if (vl_config->transmit_delay)
                    884:     {
                    885:       SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay);
                    886:       IF_DEF_PARAMS (ifp)->transmit_delay = vl_config->transmit_delay;
                    887:     }
                    888:   
                    889:   return CMD_SUCCESS;
                    890: }
                    891: 
                    892: 
                    893: 
                    894: /* The business end of all of the above */
                    895: static int
                    896: ospf_vl_set (struct ospf *ospf, struct ospf_vl_config_data *vl_config)
                    897: {
                    898:   struct ospf_vl_data *vl_data;
                    899:   int ret;
                    900: 
                    901:   vl_data = ospf_find_vl_data (ospf, vl_config);
                    902:   if (!vl_data)
                    903:     return CMD_WARNING;
                    904:   
                    905:   /* Process this one first as it can have a fatal result, which can
                    906:      only logically occur if the virtual link exists already
                    907:      Thus a command error does not result in a change to the
                    908:      running configuration such as unexpectedly altered timer 
                    909:      values etc.*/
                    910:   ret = ospf_vl_set_security (vl_data, vl_config);
                    911:   if (ret != CMD_SUCCESS)
                    912:     return ret;
                    913: 
                    914:   /* Set any time based parameters, these area already range checked */
                    915: 
                    916:   ret = ospf_vl_set_timers (vl_data, vl_config);
                    917:   if (ret != CMD_SUCCESS)
                    918:     return ret;
                    919: 
                    920:   return CMD_SUCCESS;
                    921: 
                    922: }
                    923: 
                    924: /* This stuff exists to make specifying all the alias commands A LOT simpler
                    925:  */
                    926: #define VLINK_HELPSTR_IPADDR \
                    927:        "OSPF area parameters\n" \
                    928:        "OSPF area ID in IP address format\n" \
                    929:        "OSPF area ID as a decimal value\n" \
                    930:        "Configure a virtual link\n" \
                    931:        "Router ID of the remote ABR\n"
                    932: 
                    933: #define VLINK_HELPSTR_AUTHTYPE_SIMPLE \
                    934:        "Enable authentication on this virtual link\n" \
                    935:        "dummy string \n" 
                    936: 
                    937: #define VLINK_HELPSTR_AUTHTYPE_ALL \
                    938:        VLINK_HELPSTR_AUTHTYPE_SIMPLE \
                    939:        "Use null authentication\n" \
                    940:        "Use message-digest authentication\n"
                    941: 
                    942: #define VLINK_HELPSTR_TIME_PARAM_NOSECS \
                    943:        "Time between HELLO packets\n" \
                    944:        "Time between retransmitting lost link state advertisements\n" \
                    945:        "Link state transmit delay\n" \
                    946:        "Interval after which a neighbor is declared dead\n"
                    947: 
                    948: #define VLINK_HELPSTR_TIME_PARAM \
                    949:        VLINK_HELPSTR_TIME_PARAM_NOSECS \
                    950:        "Seconds\n"
                    951: 
                    952: #define VLINK_HELPSTR_AUTH_SIMPLE \
                    953:        "Authentication password (key)\n" \
                    954:        "The OSPF password (key)"
                    955: 
                    956: #define VLINK_HELPSTR_AUTH_MD5 \
                    957:        "Message digest authentication password (key)\n" \
                    958:        "dummy string \n" \
                    959:        "Key ID\n" \
                    960:        "Use MD5 algorithm\n" \
                    961:        "The OSPF password (key)"
                    962: 
                    963: DEFUN (ospf_area_vlink,
                    964:        ospf_area_vlink_cmd,
                    965:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
                    966:        VLINK_HELPSTR_IPADDR)
                    967: {
                    968:   struct ospf *ospf = vty->index;
                    969:   struct ospf_vl_config_data vl_config;
                    970:   char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
                    971:   char md5_key[OSPF_AUTH_MD5_SIZE+1]; 
                    972:   int i;
                    973:   int ret;
                    974:   
                    975:   ospf_vl_config_data_init(&vl_config, vty);
                    976: 
                    977:   /* Read off first 2 parameters and check them */
                    978:   ret = ospf_str2area_id (argv[0], &vl_config.area_id, &vl_config.format);
                    979:   if (ret < 0)
                    980:     {
                    981:       vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
                    982:       return CMD_WARNING;
                    983:     }
                    984: 
                    985:   ret = inet_aton (argv[1], &vl_config.vl_peer);
                    986:   if (! ret)
                    987:     {
                    988:       vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
                    989:                VTY_NEWLINE);
                    990:       return CMD_WARNING;
                    991:     }
                    992: 
                    993:   if (argc <=2)
                    994:     {
                    995:       /* Thats all folks! - BUGS B. strikes again!!!*/
                    996: 
                    997:       return  ospf_vl_set (ospf, &vl_config);
                    998:     }
                    999: 
                   1000:   /* Deal with other parameters */
                   1001:   for (i=2; i < argc; i++)
                   1002:     {
                   1003: 
                   1004:       /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
                   1005: 
                   1006:       switch (argv[i][0])
                   1007:        {
                   1008: 
                   1009:        case 'a':
                   1010:          if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
                   1011:            {
                   1012:              /* authentication-key - this option can occur anywhere on 
                   1013:                                      command line.  At start of command line
                   1014:                                      must check for authentication option. */
                   1015:              memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
                   1016:              strncpy (auth_key, argv[i+1], OSPF_AUTH_SIMPLE_SIZE);
                   1017:              vl_config.auth_key = auth_key;
                   1018:              i++;
                   1019:            }
                   1020:          else if (strncmp (argv[i], "authentication", 14) == 0)
                   1021:            {
                   1022:              /* authentication  - this option can only occur at start
                   1023:                                   of command line */
                   1024:              vl_config.auth_type = OSPF_AUTH_SIMPLE;
                   1025:              if ((i+1) < argc)
                   1026:                {
                   1027:                  if (strncmp (argv[i+1], "n", 1) == 0)
                   1028:                    {
                   1029:                      /* "authentication null" */
                   1030:                      vl_config.auth_type = OSPF_AUTH_NULL;
                   1031:                      i++;
                   1032:                    }
                   1033:                  else if (strncmp (argv[i+1], "m", 1) == 0
                   1034:                           && strcmp (argv[i+1], "message-digest-") != 0)
                   1035:                    {
                   1036:                      /* "authentication message-digest" */ 
                   1037:                      vl_config.auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
                   1038:                      i++;
                   1039:                    }
                   1040:                }
                   1041:            }
                   1042:          break;
                   1043: 
                   1044:        case 'm':
                   1045:          /* message-digest-key */
                   1046:          i++;
                   1047:          vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
                   1048:          if (vl_config.crypto_key_id < 0)
                   1049:            return CMD_WARNING;
                   1050:          i++;
                   1051:          memset(md5_key, 0, OSPF_AUTH_MD5_SIZE+1);
                   1052:          strncpy (md5_key, argv[i], OSPF_AUTH_MD5_SIZE);
                   1053:          vl_config.md5_key = md5_key; 
                   1054:          break;
                   1055: 
                   1056:        case 'h':
                   1057:          /* Hello interval */
                   1058:          i++;
                   1059:          vl_config.hello_interval = strtol (argv[i], NULL, 10);
                   1060:          if (vl_config.hello_interval < 0) 
                   1061:            return CMD_WARNING;
                   1062:          break;
                   1063: 
                   1064:        case 'r':
                   1065:          /* Retransmit Interval */
                   1066:          i++;
                   1067:          vl_config.retransmit_interval = strtol (argv[i], NULL, 10);
                   1068:          if (vl_config.retransmit_interval < 0)
                   1069:            return CMD_WARNING;
                   1070:          break;
                   1071: 
                   1072:        case 't':
                   1073:          /* Transmit Delay */
                   1074:          i++;
                   1075:          vl_config.transmit_delay = strtol (argv[i], NULL, 10);
                   1076:          if (vl_config.transmit_delay < 0)
                   1077:            return CMD_WARNING;
                   1078:          break;
                   1079: 
                   1080:        case 'd':
                   1081:          /* Dead Interval */
                   1082:          i++;
                   1083:          vl_config.dead_interval = strtol (argv[i], NULL, 10);
                   1084:          if (vl_config.dead_interval < 0)
                   1085:            return CMD_WARNING;
                   1086:          break;
                   1087:        }
                   1088:     }
                   1089: 
                   1090: 
                   1091:   /* Action configuration */
                   1092: 
                   1093:   return ospf_vl_set (ospf, &vl_config);
                   1094: 
                   1095: }
                   1096: 
                   1097: DEFUN (no_ospf_area_vlink,
                   1098:        no_ospf_area_vlink_cmd,
                   1099:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D",
                   1100:        NO_STR
                   1101:        VLINK_HELPSTR_IPADDR)
                   1102: {
                   1103:   struct ospf *ospf = vty->index;
                   1104:   struct ospf_area *area;
                   1105:   struct ospf_vl_config_data vl_config;
                   1106:   struct ospf_vl_data *vl_data = NULL;
                   1107:   char auth_key[OSPF_AUTH_SIMPLE_SIZE+1];
                   1108:   int i;
                   1109:   int ret, format;
                   1110: 
                   1111:   ospf_vl_config_data_init(&vl_config, vty);
                   1112: 
                   1113:   ret = ospf_str2area_id (argv[0], &vl_config.area_id, &format);
                   1114:   if (ret < 0)
                   1115:     {
                   1116:       vty_out (vty, "OSPF area ID is invalid%s", VTY_NEWLINE);
                   1117:       return CMD_WARNING;
                   1118:     }
                   1119: 
                   1120:   area = ospf_area_lookup_by_area_id (ospf, vl_config.area_id);
                   1121:   if (!area)
                   1122:     {
                   1123:       vty_out (vty, "Area does not exist%s", VTY_NEWLINE);
                   1124:       return CMD_WARNING;
                   1125:     }
                   1126: 
                   1127:   ret = inet_aton (argv[1], &vl_config.vl_peer);
                   1128:   if (! ret)
                   1129:     {
                   1130:       vty_out (vty, "Please specify valid Router ID as a.b.c.d%s",
                   1131:                VTY_NEWLINE);
                   1132:       return CMD_WARNING;
                   1133:     }
                   1134: 
                   1135:   if (argc <=2)
                   1136:     {
                   1137:       /* Basic VLink no command */
                   1138:       /* Thats all folks! - BUGS B. strikes again!!!*/
                   1139:       if ((vl_data = ospf_vl_lookup (ospf, area, vl_config.vl_peer)))
                   1140:        ospf_vl_delete (ospf, vl_data);
                   1141: 
                   1142:       ospf_area_check_free (ospf, vl_config.area_id);
                   1143:       
                   1144:       return CMD_SUCCESS;
                   1145:     }
                   1146: 
                   1147:   /* If we are down here, we are reseting parameters */
                   1148: 
                   1149:   /* Deal with other parameters */
                   1150:   for (i=2; i < argc; i++)
                   1151:     {
                   1152:       /* vty_out (vty, "argv[%d] - %s%s", i, argv[i], VTY_NEWLINE); */
                   1153: 
                   1154:       switch (argv[i][0])
                   1155:        {
                   1156: 
                   1157:        case 'a':
                   1158:          if (i > 2 || strncmp (argv[i], "authentication-", 15) == 0)
                   1159:            {
                   1160:              /* authentication-key - this option can occur anywhere on 
                   1161:                                      command line.  At start of command line
                   1162:                                      must check for authentication option. */
                   1163:              memset (auth_key, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
                   1164:              vl_config.auth_key = auth_key;
                   1165:            }
                   1166:          else if (strncmp (argv[i], "authentication", 14) == 0)
                   1167:            {
                   1168:              /* authentication  - this option can only occur at start
                   1169:                                   of command line */
                   1170:              vl_config.auth_type = OSPF_AUTH_NOTSET;
                   1171:            }
                   1172:          break;
                   1173: 
                   1174:        case 'm':
                   1175:          /* message-digest-key */
                   1176:          /* Delete one key */
                   1177:          i++;
                   1178:          vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
                   1179:          if (vl_config.crypto_key_id < 0)
                   1180:            return CMD_WARNING;
                   1181:          vl_config.md5_key = NULL; 
                   1182:          break;
                   1183: 
                   1184:        case 'h':
                   1185:          /* Hello interval */
                   1186:          vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
                   1187:          break;
                   1188: 
                   1189:        case 'r':
                   1190:          /* Retransmit Interval */
                   1191:          vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
                   1192:          break;
                   1193: 
                   1194:        case 't':
                   1195:          /* Transmit Delay */
                   1196:          vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
                   1197:          break;
                   1198: 
                   1199:        case 'd':
                   1200:          /* Dead Interval */
                   1201:          i++;
                   1202:          vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
                   1203:          break;
                   1204:        }
                   1205:     }
                   1206: 
                   1207: 
                   1208:   /* Action configuration */
                   1209: 
                   1210:   return ospf_vl_set (ospf, &vl_config);
                   1211: }
                   1212: 
                   1213: ALIAS (ospf_area_vlink,
                   1214:        ospf_area_vlink_param1_cmd,
                   1215:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1216:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
                   1217:        VLINK_HELPSTR_IPADDR
                   1218:        VLINK_HELPSTR_TIME_PARAM)
                   1219: 
                   1220: ALIAS (no_ospf_area_vlink,
                   1221:        no_ospf_area_vlink_param1_cmd,
                   1222:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1223:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
                   1224:        NO_STR
                   1225:        VLINK_HELPSTR_IPADDR
                   1226:        VLINK_HELPSTR_TIME_PARAM)
                   1227: 
                   1228: ALIAS (ospf_area_vlink,
                   1229:        ospf_area_vlink_param2_cmd,
                   1230:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1231:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
                   1232:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
                   1233:        VLINK_HELPSTR_IPADDR
                   1234:        VLINK_HELPSTR_TIME_PARAM
                   1235:        VLINK_HELPSTR_TIME_PARAM)
                   1236: 
                   1237: ALIAS (no_ospf_area_vlink,
                   1238:        no_ospf_area_vlink_param2_cmd,
                   1239:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1240:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
                   1241:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
                   1242:        NO_STR
                   1243:        VLINK_HELPSTR_IPADDR
                   1244:        VLINK_HELPSTR_TIME_PARAM
                   1245:        VLINK_HELPSTR_TIME_PARAM)
                   1246: 
                   1247: ALIAS (ospf_area_vlink,
                   1248:        ospf_area_vlink_param3_cmd,
                   1249:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1250:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
                   1251:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
                   1252:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
                   1253:        VLINK_HELPSTR_IPADDR
                   1254:        VLINK_HELPSTR_TIME_PARAM
                   1255:        VLINK_HELPSTR_TIME_PARAM
                   1256:        VLINK_HELPSTR_TIME_PARAM)
                   1257: 
                   1258: ALIAS (no_ospf_area_vlink,
                   1259:        no_ospf_area_vlink_param3_cmd,
                   1260:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1261:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
                   1262:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
                   1263:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
                   1264:        NO_STR
                   1265:        VLINK_HELPSTR_IPADDR
                   1266:        VLINK_HELPSTR_TIME_PARAM
                   1267:        VLINK_HELPSTR_TIME_PARAM
                   1268:        VLINK_HELPSTR_TIME_PARAM)
                   1269: 
                   1270: ALIAS (ospf_area_vlink,
                   1271:        ospf_area_vlink_param4_cmd,
                   1272:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1273:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
                   1274:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
                   1275:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535> "
                   1276:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) <1-65535>",
                   1277:        VLINK_HELPSTR_IPADDR
                   1278:        VLINK_HELPSTR_TIME_PARAM
                   1279:        VLINK_HELPSTR_TIME_PARAM
                   1280:        VLINK_HELPSTR_TIME_PARAM
                   1281:        VLINK_HELPSTR_TIME_PARAM)
                   1282: 
                   1283: ALIAS (no_ospf_area_vlink,
                   1284:        no_ospf_area_vlink_param4_cmd,
                   1285:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1286:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
                   1287:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
                   1288:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval) "
                   1289:        "(hello-interval|retransmit-interval|transmit-delay|dead-interval)",
                   1290:        NO_STR
                   1291:        VLINK_HELPSTR_IPADDR
                   1292:        VLINK_HELPSTR_TIME_PARAM
                   1293:        VLINK_HELPSTR_TIME_PARAM
                   1294:        VLINK_HELPSTR_TIME_PARAM
                   1295:        VLINK_HELPSTR_TIME_PARAM)
                   1296: 
                   1297: ALIAS (ospf_area_vlink,
                   1298:        ospf_area_vlink_authtype_args_cmd,
                   1299:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1300:        "(authentication|) (message-digest|null)",
                   1301:        VLINK_HELPSTR_IPADDR
                   1302:        VLINK_HELPSTR_AUTHTYPE_ALL)
                   1303: 
                   1304: ALIAS (ospf_area_vlink,
                   1305:        ospf_area_vlink_authtype_cmd,
                   1306:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1307:        "(authentication|)",
                   1308:        VLINK_HELPSTR_IPADDR
                   1309:        VLINK_HELPSTR_AUTHTYPE_SIMPLE)
                   1310: 
                   1311: ALIAS (no_ospf_area_vlink,
                   1312:        no_ospf_area_vlink_authtype_cmd,
                   1313:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1314:        "(authentication|)",
                   1315:        NO_STR
                   1316:        VLINK_HELPSTR_IPADDR
                   1317:        VLINK_HELPSTR_AUTHTYPE_SIMPLE)
                   1318: 
                   1319: ALIAS (ospf_area_vlink,
                   1320:        ospf_area_vlink_md5_cmd,
                   1321:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1322:        "(message-digest-key|) <1-255> md5 KEY",
                   1323:        VLINK_HELPSTR_IPADDR
                   1324:        VLINK_HELPSTR_AUTH_MD5)
                   1325: 
                   1326: ALIAS (no_ospf_area_vlink,
                   1327:        no_ospf_area_vlink_md5_cmd,
                   1328:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1329:        "(message-digest-key|) <1-255>",
                   1330:        NO_STR
                   1331:        VLINK_HELPSTR_IPADDR
                   1332:        VLINK_HELPSTR_AUTH_MD5)
                   1333: 
                   1334: ALIAS (ospf_area_vlink,
                   1335:        ospf_area_vlink_authkey_cmd,
                   1336:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1337:        "(authentication-key|) AUTH_KEY",
                   1338:        VLINK_HELPSTR_IPADDR
                   1339:        VLINK_HELPSTR_AUTH_SIMPLE)
                   1340: 
                   1341: ALIAS (no_ospf_area_vlink,
                   1342:        no_ospf_area_vlink_authkey_cmd,
                   1343:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1344:        "(authentication-key|)",
                   1345:        NO_STR
                   1346:        VLINK_HELPSTR_IPADDR
                   1347:        VLINK_HELPSTR_AUTH_SIMPLE)
                   1348: 
                   1349: ALIAS (ospf_area_vlink,
                   1350:        ospf_area_vlink_authtype_args_authkey_cmd,
                   1351:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1352:        "(authentication|) (message-digest|null) "
                   1353:        "(authentication-key|) AUTH_KEY",
                   1354:        VLINK_HELPSTR_IPADDR
                   1355:        VLINK_HELPSTR_AUTHTYPE_ALL
                   1356:        VLINK_HELPSTR_AUTH_SIMPLE)
                   1357: 
                   1358: ALIAS (ospf_area_vlink,
                   1359:        ospf_area_vlink_authtype_authkey_cmd,
                   1360:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1361:        "(authentication|) "
                   1362:        "(authentication-key|) AUTH_KEY",
                   1363:        VLINK_HELPSTR_IPADDR
                   1364:        VLINK_HELPSTR_AUTHTYPE_SIMPLE
                   1365:        VLINK_HELPSTR_AUTH_SIMPLE)
                   1366: 
                   1367: ALIAS (no_ospf_area_vlink,
                   1368:        no_ospf_area_vlink_authtype_authkey_cmd,
                   1369:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1370:        "(authentication|) "
                   1371:        "(authentication-key|)",
                   1372:        NO_STR
                   1373:        VLINK_HELPSTR_IPADDR
                   1374:        VLINK_HELPSTR_AUTHTYPE_SIMPLE
                   1375:        VLINK_HELPSTR_AUTH_SIMPLE)
                   1376: 
                   1377: ALIAS (ospf_area_vlink,
                   1378:        ospf_area_vlink_authtype_args_md5_cmd,
                   1379:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1380:        "(authentication|) (message-digest|null) "
                   1381:        "(message-digest-key|) <1-255> md5 KEY",
                   1382:        VLINK_HELPSTR_IPADDR
                   1383:        VLINK_HELPSTR_AUTHTYPE_ALL
                   1384:        VLINK_HELPSTR_AUTH_MD5)
                   1385: 
                   1386: ALIAS (ospf_area_vlink,
                   1387:        ospf_area_vlink_authtype_md5_cmd,
                   1388:        "area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1389:        "(authentication|) "
                   1390:        "(message-digest-key|) <1-255> md5 KEY",
                   1391:        VLINK_HELPSTR_IPADDR
                   1392:        VLINK_HELPSTR_AUTHTYPE_SIMPLE
                   1393:        VLINK_HELPSTR_AUTH_MD5)
                   1394: 
                   1395: ALIAS (no_ospf_area_vlink,
                   1396:        no_ospf_area_vlink_authtype_md5_cmd,
                   1397:        "no area (A.B.C.D|<0-4294967295>) virtual-link A.B.C.D "
                   1398:        "(authentication|) "
                   1399:        "(message-digest-key|)",
                   1400:        NO_STR
                   1401:        VLINK_HELPSTR_IPADDR
                   1402:        VLINK_HELPSTR_AUTHTYPE_SIMPLE
                   1403:        VLINK_HELPSTR_AUTH_MD5)
                   1404: 
                   1405: 
                   1406: DEFUN (ospf_area_shortcut,
                   1407:        ospf_area_shortcut_cmd,
                   1408:        "area (A.B.C.D|<0-4294967295>) shortcut (default|enable|disable)",
                   1409:        "OSPF area parameters\n"
                   1410:        "OSPF area ID in IP address format\n"
                   1411:        "OSPF area ID as a decimal value\n"
                   1412:        "Configure the area's shortcutting mode\n"
                   1413:        "Set default shortcutting behavior\n"
                   1414:        "Enable shortcutting through the area\n"
                   1415:        "Disable shortcutting through the area\n")
                   1416: {
                   1417:   struct ospf *ospf = vty->index;
                   1418:   struct ospf_area *area;
                   1419:   struct in_addr area_id;
                   1420:   int mode;
                   1421:   int format;
                   1422: 
                   1423:   VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
                   1424: 
                   1425:   area = ospf_area_get (ospf, area_id, format);
                   1426: 
                   1427:   if (strncmp (argv[1], "de", 2) == 0)
                   1428:     mode = OSPF_SHORTCUT_DEFAULT;
                   1429:   else if (strncmp (argv[1], "di", 2) == 0)
                   1430:     mode = OSPF_SHORTCUT_DISABLE;
                   1431:   else if (strncmp (argv[1], "e", 1) == 0)
                   1432:     mode = OSPF_SHORTCUT_ENABLE;
                   1433:   else
                   1434:     return CMD_WARNING;
                   1435: 
                   1436:   ospf_area_shortcut_set (ospf, area, mode);
                   1437: 
                   1438:   if (ospf->abr_type != OSPF_ABR_SHORTCUT)
                   1439:     vty_out (vty, "Shortcut area setting will take effect "
                   1440:             "only when the router is configured as Shortcut ABR%s",
                   1441:             VTY_NEWLINE);
                   1442: 
                   1443:   return CMD_SUCCESS;
                   1444: }
                   1445: 
                   1446: DEFUN (no_ospf_area_shortcut,
                   1447:        no_ospf_area_shortcut_cmd,
                   1448:        "no area (A.B.C.D|<0-4294967295>) shortcut (enable|disable)",
                   1449:        NO_STR
                   1450:        "OSPF area parameters\n"
                   1451:        "OSPF area ID in IP address format\n"
                   1452:        "OSPF area ID as a decimal value\n"
                   1453:        "Deconfigure the area's shortcutting mode\n"
                   1454:        "Deconfigure enabled shortcutting through the area\n"
                   1455:        "Deconfigure disabled shortcutting through the area\n")
                   1456: {
                   1457:   struct ospf *ospf = vty->index;
                   1458:   struct ospf_area *area;
                   1459:   struct in_addr area_id;
                   1460:   int format;
                   1461: 
                   1462:   VTY_GET_OSPF_AREA_ID_NO_BB ("shortcut", area_id, format, argv[0]);
                   1463: 
                   1464:   area = ospf_area_lookup_by_area_id (ospf, area_id);
                   1465:   if (!area)
                   1466:     return CMD_SUCCESS;
                   1467: 
                   1468:   ospf_area_shortcut_unset (ospf, area);
                   1469: 
                   1470:   return CMD_SUCCESS;
                   1471: }
                   1472: 
                   1473: 
                   1474: DEFUN (ospf_area_stub,
                   1475:        ospf_area_stub_cmd,
                   1476:        "area (A.B.C.D|<0-4294967295>) stub",
                   1477:        "OSPF area parameters\n"
                   1478:        "OSPF area ID in IP address format\n"
                   1479:        "OSPF area ID as a decimal value\n"
                   1480:        "Configure OSPF area as stub\n")
                   1481: {
                   1482:   struct ospf *ospf = vty->index;
                   1483:   struct in_addr area_id;
                   1484:   int ret, format;
                   1485: 
                   1486:   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
                   1487: 
                   1488:   ret = ospf_area_stub_set (ospf, area_id);
                   1489:   if (ret == 0)
                   1490:     {
                   1491:       vty_out (vty, "First deconfigure all virtual link through this area%s",
                   1492:               VTY_NEWLINE);
                   1493:       return CMD_WARNING;
                   1494:     }
                   1495: 
                   1496:   ospf_area_no_summary_unset (ospf, area_id);
                   1497: 
                   1498:   return CMD_SUCCESS;
                   1499: }
                   1500: 
                   1501: DEFUN (ospf_area_stub_no_summary,
                   1502:        ospf_area_stub_no_summary_cmd,
                   1503:        "area (A.B.C.D|<0-4294967295>) stub no-summary",
                   1504:        "OSPF stub parameters\n"
                   1505:        "OSPF area ID in IP address format\n"
                   1506:        "OSPF area ID as a decimal value\n"
                   1507:        "Configure OSPF area as stub\n"
                   1508:        "Do not inject inter-area routes into stub\n")
                   1509: {
                   1510:   struct ospf *ospf = vty->index;
                   1511:   struct in_addr area_id;
                   1512:   int ret, format;
                   1513: 
                   1514:   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
                   1515: 
                   1516:   ret = ospf_area_stub_set (ospf, area_id);
                   1517:   if (ret == 0)
                   1518:     {
                   1519:       vty_out (vty, "%% Area cannot be stub as it contains a virtual link%s",
                   1520:               VTY_NEWLINE);
                   1521:       return CMD_WARNING;
                   1522:     }
                   1523: 
                   1524:   ospf_area_no_summary_set (ospf, area_id);
                   1525: 
                   1526:   return CMD_SUCCESS;
                   1527: }
                   1528: 
                   1529: DEFUN (no_ospf_area_stub,
                   1530:        no_ospf_area_stub_cmd,
                   1531:        "no area (A.B.C.D|<0-4294967295>) stub",
                   1532:        NO_STR
                   1533:        "OSPF area parameters\n"
                   1534:        "OSPF area ID in IP address format\n"
                   1535:        "OSPF area ID as a decimal value\n"
                   1536:        "Configure OSPF area as stub\n")
                   1537: {
                   1538:   struct ospf *ospf = vty->index;
                   1539:   struct in_addr area_id;
                   1540:   int format;
                   1541: 
                   1542:   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
                   1543: 
                   1544:   ospf_area_stub_unset (ospf, area_id);
                   1545:   ospf_area_no_summary_unset (ospf, area_id);
                   1546: 
                   1547:   return CMD_SUCCESS;
                   1548: }
                   1549: 
                   1550: DEFUN (no_ospf_area_stub_no_summary,
                   1551:        no_ospf_area_stub_no_summary_cmd,
                   1552:        "no area (A.B.C.D|<0-4294967295>) stub no-summary",
                   1553:        NO_STR
                   1554:        "OSPF area parameters\n"
                   1555:        "OSPF area ID in IP address format\n"
                   1556:        "OSPF area ID as a decimal value\n"
                   1557:        "Configure OSPF area as stub\n"
                   1558:        "Do not inject inter-area routes into area\n")
                   1559: {
                   1560:   struct ospf *ospf = vty->index;
                   1561:   struct in_addr area_id;
                   1562:   int format;
                   1563: 
                   1564:   VTY_GET_OSPF_AREA_ID_NO_BB ("stub", area_id, format, argv[0]);
                   1565:   ospf_area_no_summary_unset (ospf, area_id);
                   1566: 
                   1567:   return CMD_SUCCESS;
                   1568: }
                   1569: 
                   1570: static int
                   1571: ospf_area_nssa_cmd_handler (struct vty *vty, int argc, const char *argv[], 
                   1572:                             int nosum)
                   1573: {
                   1574:   struct ospf *ospf = vty->index;
                   1575:   struct in_addr area_id;
                   1576:   int ret, format;
                   1577: 
                   1578:   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
                   1579: 
                   1580:   ret = ospf_area_nssa_set (ospf, area_id);
                   1581:   if (ret == 0)
                   1582:     {
                   1583:       vty_out (vty, "%% Area cannot be nssa as it contains a virtual link%s",
                   1584:               VTY_NEWLINE);
                   1585:       return CMD_WARNING;
                   1586:     }
                   1587: 
                   1588:   if (argc > 1)
                   1589:     {
                   1590:       if (strncmp (argv[1], "translate-c", 11) == 0)
                   1591:         ospf_area_nssa_translator_role_set (ospf, area_id,
                   1592:                                            OSPF_NSSA_ROLE_CANDIDATE);
                   1593:       else if (strncmp (argv[1], "translate-n", 11) == 0)
                   1594:         ospf_area_nssa_translator_role_set (ospf, area_id,
                   1595:                                            OSPF_NSSA_ROLE_NEVER);
                   1596:       else if (strncmp (argv[1], "translate-a", 11) == 0)
                   1597:         ospf_area_nssa_translator_role_set (ospf, area_id,
                   1598:                                            OSPF_NSSA_ROLE_ALWAYS);
                   1599:     }
                   1600:   else
                   1601:     {
                   1602:       ospf_area_nssa_translator_role_set (ospf, area_id,
                   1603:                         OSPF_NSSA_ROLE_CANDIDATE);
                   1604:     }
                   1605: 
                   1606:   if (nosum)
                   1607:     ospf_area_no_summary_set (ospf, area_id);
                   1608:   else
                   1609:     ospf_area_no_summary_unset (ospf, area_id);
                   1610: 
                   1611:   ospf_schedule_abr_task (ospf);
                   1612:     
                   1613:   return CMD_SUCCESS;
                   1614: }
                   1615: 
                   1616: DEFUN (ospf_area_nssa_translate_no_summary,
                   1617:        ospf_area_nssa_translate_no_summary_cmd,
                   1618:        "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always) no-summary",
                   1619:        "OSPF area parameters\n"
                   1620:        "OSPF area ID in IP address format\n"
                   1621:        "OSPF area ID as a decimal value\n"
                   1622:        "Configure OSPF area as nssa\n"
                   1623:        "Configure NSSA-ABR for translate election (default)\n"
                   1624:        "Configure NSSA-ABR to never translate\n"
                   1625:        "Configure NSSA-ABR to always translate\n"
                   1626:        "Do not inject inter-area routes into nssa\n")
                   1627: {
                   1628:    return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
                   1629: }
                   1630: 
                   1631: DEFUN (ospf_area_nssa_translate,
                   1632:        ospf_area_nssa_translate_cmd,
                   1633:        "area (A.B.C.D|<0-4294967295>) nssa (translate-candidate|translate-never|translate-always)",
                   1634:        "OSPF area parameters\n"
                   1635:        "OSPF area ID in IP address format\n"
                   1636:        "OSPF area ID as a decimal value\n"
                   1637:        "Configure OSPF area as nssa\n"
                   1638:        "Configure NSSA-ABR for translate election (default)\n"
                   1639:        "Configure NSSA-ABR to never translate\n"
                   1640:        "Configure NSSA-ABR to always translate\n")
                   1641: {
                   1642:   return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
                   1643: }
                   1644: 
                   1645: DEFUN (ospf_area_nssa,
                   1646:        ospf_area_nssa_cmd,
                   1647:        "area (A.B.C.D|<0-4294967295>) nssa",
                   1648:        "OSPF area parameters\n"
                   1649:        "OSPF area ID in IP address format\n"
                   1650:        "OSPF area ID as a decimal value\n"
                   1651:        "Configure OSPF area as nssa\n")
                   1652: {
                   1653:   return ospf_area_nssa_cmd_handler (vty, argc, argv, 0);
                   1654: }
                   1655: 
                   1656: DEFUN (ospf_area_nssa_no_summary,
                   1657:        ospf_area_nssa_no_summary_cmd,
                   1658:        "area (A.B.C.D|<0-4294967295>) nssa no-summary",
                   1659:        "OSPF area parameters\n"
                   1660:        "OSPF area ID in IP address format\n"
                   1661:        "OSPF area ID as a decimal value\n"
                   1662:        "Configure OSPF area as nssa\n"
                   1663:        "Do not inject inter-area routes into nssa\n")
                   1664: {
                   1665:   return ospf_area_nssa_cmd_handler (vty, argc, argv, 1);
                   1666: }
                   1667: 
                   1668: DEFUN (no_ospf_area_nssa,
                   1669:        no_ospf_area_nssa_cmd,
                   1670:        "no area (A.B.C.D|<0-4294967295>) nssa",
                   1671:        NO_STR
                   1672:        "OSPF area parameters\n"
                   1673:        "OSPF area ID in IP address format\n"
                   1674:        "OSPF area ID as a decimal value\n"
                   1675:        "Configure OSPF area as nssa\n")
                   1676: {
                   1677:   struct ospf *ospf = vty->index;
                   1678:   struct in_addr area_id;
                   1679:   int format;
                   1680: 
                   1681:   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
                   1682: 
                   1683:   ospf_area_nssa_unset (ospf, area_id);
                   1684:   ospf_area_no_summary_unset (ospf, area_id);
                   1685: 
                   1686:   ospf_schedule_abr_task (ospf);
                   1687: 
                   1688:   return CMD_SUCCESS;
                   1689: }
                   1690: 
                   1691: DEFUN (no_ospf_area_nssa_no_summary,
                   1692:        no_ospf_area_nssa_no_summary_cmd,
                   1693:        "no area (A.B.C.D|<0-4294967295>) nssa no-summary",
                   1694:        NO_STR
                   1695:        "OSPF area parameters\n"
                   1696:        "OSPF area ID in IP address format\n"
                   1697:        "OSPF area ID as a decimal value\n"
                   1698:        "Configure OSPF area as nssa\n"
                   1699:        "Do not inject inter-area routes into nssa\n")
                   1700: {
                   1701:   struct ospf *ospf = vty->index;
                   1702:   struct in_addr area_id;
                   1703:   int format;
                   1704: 
                   1705:   VTY_GET_OSPF_AREA_ID_NO_BB ("NSSA", area_id, format, argv[0]);
                   1706:   ospf_area_no_summary_unset (ospf, area_id);
                   1707: 
                   1708:   return CMD_SUCCESS;
                   1709: }
                   1710: 
                   1711: DEFUN (ospf_area_default_cost,
                   1712:        ospf_area_default_cost_cmd,
                   1713:        "area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
                   1714:        "OSPF area parameters\n"
                   1715:        "OSPF area ID in IP address format\n"
                   1716:        "OSPF area ID as a decimal value\n"
                   1717:        "Set the summary-default cost of a NSSA or stub area\n"
                   1718:        "Stub's advertised default summary cost\n")
                   1719: {
                   1720:   struct ospf *ospf = vty->index;
                   1721:   struct ospf_area *area;
                   1722:   struct in_addr area_id;
                   1723:   u_int32_t cost;
                   1724:   int format;
                   1725:   struct prefix_ipv4 p;
                   1726: 
                   1727:   VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
                   1728:   VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
                   1729: 
                   1730:   area = ospf_area_get (ospf, area_id, format);
                   1731: 
                   1732:   if (area->external_routing == OSPF_AREA_DEFAULT)
                   1733:     {
                   1734:       vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
                   1735:       return CMD_WARNING;
                   1736:     }
                   1737: 
                   1738:   area->default_cost = cost;
                   1739: 
                   1740:   p.family = AF_INET;
                   1741:   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
                   1742:   p.prefixlen = 0;
                   1743:   if (IS_DEBUG_OSPF_EVENT)
                   1744:     zlog_debug ("ospf_abr_announce_stub_defaults(): "
                   1745:                 "announcing 0.0.0.0/0 to area %s",
                   1746:                inet_ntoa (area->area_id));
                   1747:   ospf_abr_announce_network_to_area (&p, area->default_cost, area);
                   1748: 
                   1749:   return CMD_SUCCESS;
                   1750: }
                   1751: 
                   1752: DEFUN (no_ospf_area_default_cost,
                   1753:        no_ospf_area_default_cost_cmd,
                   1754:        "no area (A.B.C.D|<0-4294967295>) default-cost <0-16777215>",
                   1755:        NO_STR
                   1756:        "OSPF area parameters\n"
                   1757:        "OSPF area ID in IP address format\n"
                   1758:        "OSPF area ID as a decimal value\n"
                   1759:        "Set the summary-default cost of a NSSA or stub area\n"
                   1760:        "Stub's advertised default summary cost\n")
                   1761: {
                   1762:   struct ospf *ospf = vty->index;
                   1763:   struct ospf_area *area;
                   1764:   struct in_addr area_id;
                   1765:   u_int32_t cost;
                   1766:   int format;
                   1767:   struct prefix_ipv4 p;
                   1768: 
                   1769:   VTY_GET_OSPF_AREA_ID_NO_BB ("default-cost", area_id, format, argv[0]);
                   1770:   VTY_GET_INTEGER_RANGE ("stub default cost", cost, argv[1], 0, 16777215);
                   1771: 
                   1772:   area = ospf_area_lookup_by_area_id (ospf, area_id);
                   1773:   if (area == NULL)
                   1774:     return CMD_SUCCESS;
                   1775: 
                   1776:   if (area->external_routing == OSPF_AREA_DEFAULT)
                   1777:     {
                   1778:       vty_out (vty, "The area is neither stub, nor NSSA%s", VTY_NEWLINE);
                   1779:       return CMD_WARNING;
                   1780:     }
                   1781: 
                   1782:   area->default_cost = 1;
                   1783: 
                   1784:   p.family = AF_INET;
                   1785:   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
                   1786:   p.prefixlen = 0;
                   1787:   if (IS_DEBUG_OSPF_EVENT)
                   1788:     zlog_debug ("ospf_abr_announce_stub_defaults(): "
                   1789:                 "announcing 0.0.0.0/0 to area %s",
                   1790:                inet_ntoa (area->area_id));
                   1791:   ospf_abr_announce_network_to_area (&p, area->default_cost, area);
                   1792: 
                   1793: 
                   1794:   ospf_area_check_free (ospf, area_id);
                   1795: 
                   1796:   return CMD_SUCCESS;
                   1797: }
                   1798: 
                   1799: DEFUN (ospf_area_export_list,
                   1800:        ospf_area_export_list_cmd,
                   1801:        "area (A.B.C.D|<0-4294967295>) export-list NAME",
                   1802:        "OSPF area parameters\n"
                   1803:        "OSPF area ID in IP address format\n"
                   1804:        "OSPF area ID as a decimal value\n"
                   1805:        "Set the filter for networks announced to other areas\n"
                   1806:        "Name of the access-list\n")
                   1807: {
                   1808:   struct ospf *ospf = vty->index;
                   1809:   struct ospf_area *area;
                   1810:   struct in_addr area_id;
                   1811:   int format;
                   1812: 
                   1813:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   1814: 
                   1815:   area = ospf_area_get (ospf, area_id, format);
                   1816:   ospf_area_export_list_set (ospf, area, argv[1]);
                   1817: 
                   1818:   return CMD_SUCCESS;
                   1819: }
                   1820: 
                   1821: DEFUN (no_ospf_area_export_list,
                   1822:        no_ospf_area_export_list_cmd,
                   1823:        "no area (A.B.C.D|<0-4294967295>) export-list NAME",
                   1824:        NO_STR
                   1825:        "OSPF area parameters\n"
                   1826:        "OSPF area ID in IP address format\n"
                   1827:        "OSPF area ID as a decimal value\n"
                   1828:        "Unset the filter for networks announced to other areas\n"
                   1829:        "Name of the access-list\n")
                   1830: {
                   1831:   struct ospf *ospf = vty->index;
                   1832:   struct ospf_area *area;
                   1833:   struct in_addr area_id;
                   1834:   int format;
                   1835: 
                   1836:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   1837: 
                   1838:   area = ospf_area_lookup_by_area_id (ospf, area_id);
                   1839:   if (area == NULL)
                   1840:     return CMD_SUCCESS;
                   1841: 
                   1842:   ospf_area_export_list_unset (ospf, area);
                   1843: 
                   1844:   return CMD_SUCCESS;
                   1845: }
                   1846: 
                   1847: 
                   1848: DEFUN (ospf_area_import_list,
                   1849:        ospf_area_import_list_cmd,
                   1850:        "area (A.B.C.D|<0-4294967295>) import-list NAME",
                   1851:        "OSPF area parameters\n"
                   1852:        "OSPF area ID in IP address format\n"
                   1853:        "OSPF area ID as a decimal value\n"
                   1854:        "Set the filter for networks from other areas announced to the specified one\n"
                   1855:        "Name of the access-list\n")
                   1856: {
                   1857:   struct ospf *ospf = vty->index;
                   1858:   struct ospf_area *area;
                   1859:   struct in_addr area_id;
                   1860:   int format;
                   1861: 
                   1862:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   1863: 
                   1864:   area = ospf_area_get (ospf, area_id, format);
                   1865:   ospf_area_import_list_set (ospf, area, argv[1]);
                   1866: 
                   1867:   return CMD_SUCCESS;
                   1868: }
                   1869: 
                   1870: DEFUN (no_ospf_area_import_list,
                   1871:        no_ospf_area_import_list_cmd,
                   1872:        "no area (A.B.C.D|<0-4294967295>) import-list NAME",
                   1873:        NO_STR
                   1874:        "OSPF area parameters\n"
                   1875:        "OSPF area ID in IP address format\n"
                   1876:        "OSPF area ID as a decimal value\n"
                   1877:        "Unset the filter for networks announced to other areas\n"
                   1878:        "Name of the access-list\n")
                   1879: {
                   1880:   struct ospf *ospf = vty->index;
                   1881:   struct ospf_area *area;
                   1882:   struct in_addr area_id;
                   1883:   int format;
                   1884: 
                   1885:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   1886: 
                   1887:   area = ospf_area_lookup_by_area_id (ospf, area_id);
                   1888:   if (area == NULL)
                   1889:     return CMD_SUCCESS;
                   1890: 
                   1891:   ospf_area_import_list_unset (ospf, area);
                   1892: 
                   1893:   return CMD_SUCCESS;
                   1894: }
                   1895: 
                   1896: DEFUN (ospf_area_filter_list,
                   1897:        ospf_area_filter_list_cmd,
                   1898:        "area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
                   1899:        "OSPF area parameters\n"
                   1900:        "OSPF area ID in IP address format\n"
                   1901:        "OSPF area ID as a decimal value\n"
                   1902:        "Filter networks between OSPF areas\n"
                   1903:        "Filter prefixes between OSPF areas\n"
                   1904:        "Name of an IP prefix-list\n"
                   1905:        "Filter networks sent to this area\n"
                   1906:        "Filter networks sent from this area\n")
                   1907: {
                   1908:   struct ospf *ospf = vty->index;
                   1909:   struct ospf_area *area;
                   1910:   struct in_addr area_id;
                   1911:   struct prefix_list *plist;
                   1912:   int format;
                   1913: 
                   1914:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   1915: 
                   1916:   area = ospf_area_get (ospf, area_id, format);
                   1917:   plist = prefix_list_lookup (AFI_IP, argv[1]);
                   1918:   if (strncmp (argv[2], "in", 2) == 0)
                   1919:     {
                   1920:       PREFIX_LIST_IN (area) = plist;
                   1921:       if (PREFIX_NAME_IN (area))
                   1922:        free (PREFIX_NAME_IN (area));
                   1923: 
                   1924:       PREFIX_NAME_IN (area) = strdup (argv[1]);
                   1925:       ospf_schedule_abr_task (ospf);
                   1926:     }
                   1927:   else
                   1928:     {
                   1929:       PREFIX_LIST_OUT (area) = plist;
                   1930:       if (PREFIX_NAME_OUT (area))
                   1931:        free (PREFIX_NAME_OUT (area));
                   1932: 
                   1933:       PREFIX_NAME_OUT (area) = strdup (argv[1]);
                   1934:       ospf_schedule_abr_task (ospf);
                   1935:     }
                   1936: 
                   1937:   return CMD_SUCCESS;
                   1938: }
                   1939: 
                   1940: DEFUN (no_ospf_area_filter_list,
                   1941:        no_ospf_area_filter_list_cmd,
                   1942:        "no area (A.B.C.D|<0-4294967295>) filter-list prefix WORD (in|out)",
                   1943:        NO_STR
                   1944:        "OSPF area parameters\n"
                   1945:        "OSPF area ID in IP address format\n"
                   1946:        "OSPF area ID as a decimal value\n"
                   1947:        "Filter networks between OSPF areas\n"
                   1948:        "Filter prefixes between OSPF areas\n"
                   1949:        "Name of an IP prefix-list\n"
                   1950:        "Filter networks sent to this area\n"
                   1951:        "Filter networks sent from this area\n")
                   1952: {
                   1953:   struct ospf *ospf = vty->index;
                   1954:   struct ospf_area *area;
                   1955:   struct in_addr area_id;
                   1956:   struct prefix_list *plist;
                   1957:   int format;
                   1958: 
                   1959:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   1960: 
                   1961:   if ((area = ospf_area_lookup_by_area_id (ospf, area_id)) == NULL)
                   1962:     return CMD_SUCCESS;
                   1963:   
                   1964:   plist = prefix_list_lookup (AFI_IP, argv[1]);
                   1965:   if (strncmp (argv[2], "in", 2) == 0)
                   1966:     {
                   1967:       if (PREFIX_NAME_IN (area))
                   1968:        if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
                   1969:          return CMD_SUCCESS;
                   1970: 
                   1971:       PREFIX_LIST_IN (area) = NULL;
                   1972:       if (PREFIX_NAME_IN (area))
                   1973:        free (PREFIX_NAME_IN (area));
                   1974: 
                   1975:       PREFIX_NAME_IN (area) = NULL;
                   1976: 
                   1977:       ospf_schedule_abr_task (ospf);
                   1978:     }
                   1979:   else
                   1980:     {
                   1981:       if (PREFIX_NAME_OUT (area))
                   1982:        if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
                   1983:          return CMD_SUCCESS;
                   1984: 
                   1985:       PREFIX_LIST_OUT (area) = NULL;
                   1986:       if (PREFIX_NAME_OUT (area))
                   1987:        free (PREFIX_NAME_OUT (area));
                   1988: 
                   1989:       PREFIX_NAME_OUT (area) = NULL;
                   1990: 
                   1991:       ospf_schedule_abr_task (ospf);
                   1992:     }
                   1993: 
                   1994:   return CMD_SUCCESS;
                   1995: }
                   1996: 
                   1997: 
                   1998: DEFUN (ospf_area_authentication_message_digest,
                   1999:        ospf_area_authentication_message_digest_cmd,
                   2000:        "area (A.B.C.D|<0-4294967295>) authentication message-digest",
                   2001:        "OSPF area parameters\n"
                   2002:        "Enable authentication\n"
                   2003:        "Use message-digest authentication\n")
                   2004: {
                   2005:   struct ospf *ospf = vty->index;
                   2006:   struct ospf_area *area;
                   2007:   struct in_addr area_id;
                   2008:   int format;
                   2009: 
                   2010:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   2011: 
                   2012:   area = ospf_area_get (ospf, area_id, format);
                   2013:   area->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
                   2014: 
                   2015:   return CMD_SUCCESS;
                   2016: }
                   2017: 
                   2018: DEFUN (ospf_area_authentication,
                   2019:        ospf_area_authentication_cmd,
                   2020:        "area (A.B.C.D|<0-4294967295>) authentication",
                   2021:        "OSPF area parameters\n"
                   2022:        "OSPF area ID in IP address format\n"
                   2023:        "OSPF area ID as a decimal value\n"
                   2024:        "Enable authentication\n")
                   2025: {
                   2026:   struct ospf *ospf = vty->index;
                   2027:   struct ospf_area *area;
                   2028:   struct in_addr area_id;
                   2029:   int format;
                   2030: 
                   2031:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   2032: 
                   2033:   area = ospf_area_get (ospf, area_id, format);
                   2034:   area->auth_type = OSPF_AUTH_SIMPLE;
                   2035: 
                   2036:   return CMD_SUCCESS;
                   2037: }
                   2038: 
                   2039: DEFUN (no_ospf_area_authentication,
                   2040:        no_ospf_area_authentication_cmd,
                   2041:        "no area (A.B.C.D|<0-4294967295>) authentication",
                   2042:        NO_STR
                   2043:        "OSPF area parameters\n"
                   2044:        "OSPF area ID in IP address format\n"
                   2045:        "OSPF area ID as a decimal value\n"
                   2046:        "Enable authentication\n")
                   2047: {
                   2048:   struct ospf *ospf = vty->index;
                   2049:   struct ospf_area *area;
                   2050:   struct in_addr area_id;
                   2051:   int format;
                   2052: 
                   2053:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
                   2054: 
                   2055:   area = ospf_area_lookup_by_area_id (ospf, area_id);
                   2056:   if (area == NULL)
                   2057:     return CMD_SUCCESS;
                   2058: 
                   2059:   area->auth_type = OSPF_AUTH_NULL;
                   2060: 
                   2061:   ospf_area_check_free (ospf, area_id);
                   2062:   
                   2063:   return CMD_SUCCESS;
                   2064: }
                   2065: 
                   2066: 
                   2067: DEFUN (ospf_abr_type,
                   2068:        ospf_abr_type_cmd,
                   2069:        "ospf abr-type (cisco|ibm|shortcut|standard)",
                   2070:        "OSPF specific commands\n"
                   2071:        "Set OSPF ABR type\n"
                   2072:        "Alternative ABR, cisco implementation\n"
                   2073:        "Alternative ABR, IBM implementation\n"
                   2074:        "Shortcut ABR\n"
                   2075:        "Standard behavior (RFC2328)\n")
                   2076: {
                   2077:   struct ospf *ospf = vty->index;
                   2078:   u_char abr_type = OSPF_ABR_UNKNOWN;
                   2079: 
                   2080:   if (strncmp (argv[0], "c", 1) == 0)
                   2081:     abr_type = OSPF_ABR_CISCO;
                   2082:   else if (strncmp (argv[0], "i", 1) == 0)
                   2083:     abr_type = OSPF_ABR_IBM;
                   2084:   else if (strncmp (argv[0], "sh", 2) == 0)
                   2085:     abr_type = OSPF_ABR_SHORTCUT;
                   2086:   else if (strncmp (argv[0], "st", 2) == 0)
                   2087:     abr_type = OSPF_ABR_STAND;
                   2088:   else
                   2089:     return CMD_WARNING;
                   2090: 
                   2091:   /* If ABR type value is changed, schedule ABR task. */
                   2092:   if (ospf->abr_type != abr_type)
                   2093:     {
                   2094:       ospf->abr_type = abr_type;
                   2095:       ospf_schedule_abr_task (ospf);
                   2096:     }
                   2097: 
                   2098:   return CMD_SUCCESS;
                   2099: }
                   2100: 
                   2101: DEFUN (no_ospf_abr_type,
                   2102:        no_ospf_abr_type_cmd,
                   2103:        "no ospf abr-type (cisco|ibm|shortcut|standard)",
                   2104:        NO_STR
                   2105:        "OSPF specific commands\n"
                   2106:        "Set OSPF ABR type\n"
                   2107:        "Alternative ABR, cisco implementation\n"
                   2108:        "Alternative ABR, IBM implementation\n"
                   2109:        "Shortcut ABR\n")
                   2110: {
                   2111:   struct ospf *ospf = vty->index;
                   2112:   u_char abr_type = OSPF_ABR_UNKNOWN;
                   2113: 
                   2114:   if (strncmp (argv[0], "c", 1) == 0)
                   2115:     abr_type = OSPF_ABR_CISCO;
                   2116:   else if (strncmp (argv[0], "i", 1) == 0)
                   2117:     abr_type = OSPF_ABR_IBM;
                   2118:   else if (strncmp (argv[0], "sh", 2) == 0)
                   2119:     abr_type = OSPF_ABR_SHORTCUT;
                   2120:   else if (strncmp (argv[0], "st", 2) == 0)
                   2121:     abr_type = OSPF_ABR_STAND;
                   2122:   else
                   2123:     return CMD_WARNING;
                   2124: 
                   2125:   /* If ABR type value is changed, schedule ABR task. */
                   2126:   if (ospf->abr_type == abr_type)
                   2127:     {
                   2128:       ospf->abr_type = OSPF_ABR_DEFAULT;
                   2129:       ospf_schedule_abr_task (ospf);
                   2130:     }
                   2131: 
                   2132:   return CMD_SUCCESS;
                   2133: }
                   2134: 
                   2135: DEFUN (ospf_log_adjacency_changes,
                   2136:        ospf_log_adjacency_changes_cmd,
                   2137:        "log-adjacency-changes",
                   2138:        "Log changes in adjacency state\n")
                   2139: {
                   2140:   struct ospf *ospf = vty->index;
                   2141: 
                   2142:   SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
                   2143:   return CMD_SUCCESS;
                   2144: }
                   2145: 
                   2146: DEFUN (ospf_log_adjacency_changes_detail,
                   2147:        ospf_log_adjacency_changes_detail_cmd,
                   2148:        "log-adjacency-changes detail",
                   2149:        "Log changes in adjacency state\n"
                   2150:        "Log all state changes\n")
                   2151: {
                   2152:   struct ospf *ospf = vty->index;
                   2153: 
                   2154:   SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
                   2155:   SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
                   2156:   return CMD_SUCCESS;
                   2157: }
                   2158: 
                   2159: DEFUN (no_ospf_log_adjacency_changes,
                   2160:        no_ospf_log_adjacency_changes_cmd,
                   2161:        "no log-adjacency-changes",
                   2162:        NO_STR
                   2163:        "Log changes in adjacency state\n")
                   2164: {
                   2165:   struct ospf *ospf = vty->index;
                   2166: 
                   2167:   UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
                   2168:   UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
                   2169:   return CMD_SUCCESS;
                   2170: }
                   2171: 
                   2172: DEFUN (no_ospf_log_adjacency_changes_detail,
                   2173:        no_ospf_log_adjacency_changes_detail_cmd,
                   2174:        "no log-adjacency-changes detail",
                   2175:        NO_STR
                   2176:        "Log changes in adjacency state\n"
                   2177:        "Log all state changes\n")
                   2178: {
                   2179:   struct ospf *ospf = vty->index;
                   2180: 
                   2181:   UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
                   2182:   return CMD_SUCCESS;
                   2183: }
                   2184: 
                   2185: DEFUN (ospf_compatible_rfc1583,
                   2186:        ospf_compatible_rfc1583_cmd,
                   2187:        "compatible rfc1583",
                   2188:        "OSPF compatibility list\n"
                   2189:        "compatible with RFC 1583\n")
                   2190: {
                   2191:   struct ospf *ospf = vty->index;
                   2192: 
                   2193:   if (!CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
                   2194:     {
                   2195:       SET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
                   2196:       ospf_spf_calculate_schedule (ospf);
                   2197:     }
                   2198:   return CMD_SUCCESS;
                   2199: }
                   2200: 
                   2201: DEFUN (no_ospf_compatible_rfc1583,
                   2202:        no_ospf_compatible_rfc1583_cmd,
                   2203:        "no compatible rfc1583",
                   2204:        NO_STR
                   2205:        "OSPF compatibility list\n"
                   2206:        "compatible with RFC 1583\n")
                   2207: {
                   2208:   struct ospf *ospf = vty->index;
                   2209: 
                   2210:   if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
                   2211:     {
                   2212:       UNSET_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE);
                   2213:       ospf_spf_calculate_schedule (ospf);
                   2214:     }
                   2215:   return CMD_SUCCESS;
                   2216: }
                   2217: 
                   2218: ALIAS (ospf_compatible_rfc1583,
                   2219:        ospf_rfc1583_flag_cmd,
                   2220:        "ospf rfc1583compatibility",
                   2221:        "OSPF specific commands\n"
                   2222:        "Enable the RFC1583Compatibility flag\n")
                   2223: 
                   2224: ALIAS (no_ospf_compatible_rfc1583,
                   2225:        no_ospf_rfc1583_flag_cmd,
                   2226:        "no ospf rfc1583compatibility",
                   2227:        NO_STR
                   2228:        "OSPF specific commands\n"
                   2229:        "Disable the RFC1583Compatibility flag\n")
                   2230: 
                   2231: static int
                   2232: ospf_timers_spf_set (struct vty *vty, unsigned int delay,
                   2233:                      unsigned int hold,
                   2234:                      unsigned int max)
                   2235: {
                   2236:   struct ospf *ospf = vty->index;
                   2237:   
                   2238:   ospf->spf_delay = delay;
                   2239:   ospf->spf_holdtime = hold;
                   2240:   ospf->spf_max_holdtime = max;
                   2241:   
                   2242:   return CMD_SUCCESS;
                   2243: }
                   2244: 
                   2245: DEFUN (ospf_timers_throttle_spf,
                   2246:        ospf_timers_throttle_spf_cmd,
                   2247:        "timers throttle spf <0-600000> <0-600000> <0-600000>",
                   2248:        "Adjust routing timers\n"
                   2249:        "Throttling adaptive timer\n"
                   2250:        "OSPF SPF timers\n"
                   2251:        "Delay (msec) from first change received till SPF calculation\n"
                   2252:        "Initial hold time (msec) between consecutive SPF calculations\n"
                   2253:        "Maximum hold time (msec)\n")
                   2254: {
                   2255:   unsigned int delay, hold, max;
                   2256:   
                   2257:   if (argc != 3)
                   2258:     {
                   2259:       vty_out (vty, "Insufficient arguments%s", VTY_NEWLINE);
                   2260:       return CMD_WARNING;
                   2261:     }
                   2262:   
                   2263:   VTY_GET_INTEGER_RANGE ("SPF delay timer", delay, argv[0], 0, 600000);
                   2264:   VTY_GET_INTEGER_RANGE ("SPF hold timer", hold, argv[1], 0, 600000);
                   2265:   VTY_GET_INTEGER_RANGE ("SPF max-hold timer", max, argv[2], 0, 600000);
                   2266:   
                   2267:   return ospf_timers_spf_set (vty, delay, hold, max);
                   2268: }
                   2269: 
                   2270: DEFUN_DEPRECATED (ospf_timers_spf,
                   2271:        ospf_timers_spf_cmd,
                   2272:        "timers spf <0-4294967295> <0-4294967295>",
                   2273:        "Adjust routing timers\n"
                   2274:        "OSPF SPF timers\n"
                   2275:        "Delay (s) between receiving a change to SPF calculation\n"
                   2276:        "Hold time (s) between consecutive SPF calculations\n")
                   2277: {
                   2278:   unsigned int delay, hold;
                   2279:   
                   2280:   if (argc != 2)
                   2281:     {
                   2282:       vty_out (vty, "Insufficient number of arguments%s", VTY_NEWLINE);
                   2283:       return CMD_WARNING;
                   2284:     }
                   2285:   
                   2286:   VTY_GET_INTEGER ("SPF delay timer", delay, argv[0]);
                   2287:   VTY_GET_INTEGER ("SPF hold timer", hold, argv[1]);
                   2288:   
                   2289:   /* truncate down the second values if they're greater than 600000ms */
                   2290:   if (delay > (600000 / 1000))
                   2291:     delay = 600000;
                   2292:   else if (delay == 0)
                   2293:     /* 0s delay was probably specified because of lack of ms resolution */
                   2294:     delay = OSPF_SPF_DELAY_DEFAULT;
                   2295:   if (hold > (600000 / 1000))
                   2296:     hold = 600000;
                   2297:       
                   2298:   return ospf_timers_spf_set (vty, delay * 1000, hold * 1000, hold * 1000);
                   2299: }
                   2300: 
                   2301: DEFUN (no_ospf_timers_throttle_spf,
                   2302:        no_ospf_timers_throttle_spf_cmd,
                   2303:        "no timers throttle spf",
                   2304:        NO_STR
                   2305:        "Adjust routing timers\n"
                   2306:        "Throttling adaptive timer\n"
                   2307:        "OSPF SPF timers\n")
                   2308: {
                   2309:   return ospf_timers_spf_set (vty,
                   2310:                               OSPF_SPF_DELAY_DEFAULT,
                   2311:                               OSPF_SPF_HOLDTIME_DEFAULT,
                   2312:                               OSPF_SPF_MAX_HOLDTIME_DEFAULT);
                   2313: }
                   2314: 
                   2315: ALIAS_DEPRECATED (no_ospf_timers_throttle_spf,
                   2316:                   no_ospf_timers_spf_cmd,
                   2317:                   "no timers spf",
                   2318:                   NO_STR
                   2319:                   "Adjust routing timers\n"
                   2320:                   "OSPF SPF timers\n")
                   2321: 
                   2322: DEFUN (ospf_neighbor,
                   2323:        ospf_neighbor_cmd,
                   2324:        "neighbor A.B.C.D",
                   2325:        NEIGHBOR_STR
                   2326:        "Neighbor IP address\n")
                   2327: {
                   2328:   struct ospf *ospf = vty->index;
                   2329:   struct in_addr nbr_addr;
                   2330:   unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
                   2331:   unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
                   2332: 
                   2333:   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
                   2334: 
                   2335:   if (argc > 1)
                   2336:     VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[1], 0, 255);
                   2337: 
                   2338:   if (argc > 2)
                   2339:     VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[2], 1, 65535);
                   2340: 
                   2341:   ospf_nbr_nbma_set (ospf, nbr_addr);
                   2342:   if (argc > 1)
                   2343:     ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
                   2344:   if (argc > 2)
                   2345:     ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, priority);
                   2346: 
                   2347:   return CMD_SUCCESS;
                   2348: }
                   2349: 
                   2350: ALIAS (ospf_neighbor,
                   2351:        ospf_neighbor_priority_poll_interval_cmd,
                   2352:        "neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
                   2353:        NEIGHBOR_STR
                   2354:        "Neighbor IP address\n"
                   2355:        "Neighbor Priority\n"
                   2356:        "Priority\n"
                   2357:        "Dead Neighbor Polling interval\n"
                   2358:        "Seconds\n")
                   2359: 
                   2360: ALIAS (ospf_neighbor,
                   2361:        ospf_neighbor_priority_cmd,
                   2362:        "neighbor A.B.C.D priority <0-255>",
                   2363:        NEIGHBOR_STR
                   2364:        "Neighbor IP address\n"
                   2365:        "Neighbor Priority\n"
                   2366:        "Seconds\n")
                   2367: 
                   2368: DEFUN (ospf_neighbor_poll_interval,
                   2369:        ospf_neighbor_poll_interval_cmd,
                   2370:        "neighbor A.B.C.D poll-interval <1-65535>",
                   2371:        NEIGHBOR_STR
                   2372:        "Neighbor IP address\n"
                   2373:        "Dead Neighbor Polling interval\n"
                   2374:        "Seconds\n")
                   2375: {
                   2376:   struct ospf *ospf = vty->index;
                   2377:   struct in_addr nbr_addr;
                   2378:   unsigned int priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;
                   2379:   unsigned int interval = OSPF_POLL_INTERVAL_DEFAULT;
                   2380: 
                   2381:   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
                   2382: 
                   2383:   if (argc > 1)
                   2384:     VTY_GET_INTEGER_RANGE ("poll interval", interval, argv[1], 1, 65535);
                   2385: 
                   2386:   if (argc > 2)
                   2387:     VTY_GET_INTEGER_RANGE ("neighbor priority", priority, argv[2], 0, 255);
                   2388: 
                   2389:   ospf_nbr_nbma_set (ospf, nbr_addr);
                   2390:   if (argc > 1)
                   2391:     ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
                   2392:   if (argc > 2)
                   2393:     ospf_nbr_nbma_priority_set (ospf, nbr_addr, priority);
                   2394: 
                   2395:   return CMD_SUCCESS;
                   2396: }
                   2397: 
                   2398: ALIAS (ospf_neighbor_poll_interval,
                   2399:        ospf_neighbor_poll_interval_priority_cmd,
                   2400:        "neighbor A.B.C.D poll-interval <1-65535> priority <0-255>",
                   2401:        NEIGHBOR_STR
                   2402:        "Neighbor address\n"
                   2403:        "OSPF dead-router polling interval\n"
                   2404:        "Seconds\n"
                   2405:        "OSPF priority of non-broadcast neighbor\n"
                   2406:        "Priority\n")
                   2407: 
                   2408: DEFUN (no_ospf_neighbor,
                   2409:        no_ospf_neighbor_cmd,
                   2410:        "no neighbor A.B.C.D",
                   2411:        NO_STR
                   2412:        NEIGHBOR_STR
                   2413:        "Neighbor IP address\n")
                   2414: {
                   2415:   struct ospf *ospf = vty->index;
                   2416:   struct in_addr nbr_addr;
                   2417:   int ret;
                   2418: 
                   2419:   VTY_GET_IPV4_ADDRESS ("neighbor address", nbr_addr, argv[0]);
                   2420: 
                   2421:   ret = ospf_nbr_nbma_unset (ospf, nbr_addr);
                   2422: 
                   2423:   return CMD_SUCCESS;
                   2424: }
                   2425: 
                   2426: ALIAS (no_ospf_neighbor,
                   2427:        no_ospf_neighbor_priority_cmd,
                   2428:        "no neighbor A.B.C.D priority <0-255>",
                   2429:        NO_STR
                   2430:        NEIGHBOR_STR
                   2431:        "Neighbor IP address\n"
                   2432:        "Neighbor Priority\n"
                   2433:        "Priority\n")
                   2434: 
                   2435: ALIAS (no_ospf_neighbor,
                   2436:        no_ospf_neighbor_poll_interval_cmd,
                   2437:        "no neighbor A.B.C.D poll-interval <1-65535>",
                   2438:        NO_STR
                   2439:        NEIGHBOR_STR
                   2440:        "Neighbor IP address\n"
                   2441:        "Dead Neighbor Polling interval\n"
                   2442:        "Seconds\n")
                   2443: 
                   2444: ALIAS (no_ospf_neighbor,
                   2445:        no_ospf_neighbor_priority_pollinterval_cmd,
                   2446:        "no neighbor A.B.C.D priority <0-255> poll-interval <1-65535>",
                   2447:        NO_STR
                   2448:        NEIGHBOR_STR
                   2449:        "Neighbor IP address\n"
                   2450:        "Neighbor Priority\n"
                   2451:        "Priority\n"
                   2452:        "Dead Neighbor Polling interval\n"
                   2453:        "Seconds\n")
                   2454: 
                   2455: 
                   2456: DEFUN (ospf_refresh_timer, ospf_refresh_timer_cmd,
                   2457:        "refresh timer <10-1800>",
                   2458:        "Adjust refresh parameters\n"
                   2459:        "Set refresh timer\n"
                   2460:        "Timer value in seconds\n")
                   2461: {
                   2462:   struct ospf *ospf = vty->index;
                   2463:   unsigned int interval;
                   2464:   
                   2465:   VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
                   2466:   interval = (interval / 10) * 10;
                   2467: 
                   2468:   ospf_timers_refresh_set (ospf, interval);
                   2469: 
                   2470:   return CMD_SUCCESS;
                   2471: }
                   2472: 
                   2473: DEFUN (no_ospf_refresh_timer, no_ospf_refresh_timer_val_cmd,
                   2474:        "no refresh timer <10-1800>",
                   2475:        "Adjust refresh parameters\n"
                   2476:        "Unset refresh timer\n"
                   2477:        "Timer value in seconds\n")
                   2478: {
                   2479:   struct ospf *ospf = vty->index;
                   2480:   unsigned int interval;
                   2481: 
                   2482:   if (argc == 1)
                   2483:     {
                   2484:       VTY_GET_INTEGER_RANGE ("refresh timer", interval, argv[0], 10, 1800);
                   2485:   
                   2486:       if (ospf->lsa_refresh_interval != interval ||
                   2487:          interval == OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
                   2488:        return CMD_SUCCESS;
                   2489:     }
                   2490: 
                   2491:   ospf_timers_refresh_unset (ospf);
                   2492: 
                   2493:   return CMD_SUCCESS;
                   2494: }
                   2495: 
                   2496: ALIAS (no_ospf_refresh_timer,
                   2497:        no_ospf_refresh_timer_cmd,
                   2498:        "no refresh timer",
                   2499:        "Adjust refresh parameters\n"
                   2500:        "Unset refresh timer\n")
                   2501: 
                   2502: DEFUN (ospf_auto_cost_reference_bandwidth,
                   2503:        ospf_auto_cost_reference_bandwidth_cmd,
                   2504:        "auto-cost reference-bandwidth <1-4294967>",
                   2505:        "Calculate OSPF interface cost according to bandwidth\n"
                   2506:        "Use reference bandwidth method to assign OSPF cost\n"
                   2507:        "The reference bandwidth in terms of Mbits per second\n")
                   2508: {
                   2509:   struct ospf *ospf = vty->index;
                   2510:   u_int32_t refbw;
                   2511:   struct listnode *node;
                   2512:   struct interface *ifp;
                   2513: 
                   2514:   refbw = strtol (argv[0], NULL, 10);
                   2515:   if (refbw < 1 || refbw > 4294967)
                   2516:     {
                   2517:       vty_out (vty, "reference-bandwidth value is invalid%s", VTY_NEWLINE);
                   2518:       return CMD_WARNING;
                   2519:     }
                   2520: 
                   2521:   /* If reference bandwidth is changed. */
                   2522:   if ((refbw * 1000) == ospf->ref_bandwidth)
                   2523:     return CMD_SUCCESS;
                   2524:   
                   2525:   ospf->ref_bandwidth = refbw * 1000;
                   2526:   for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
                   2527:     ospf_if_recalculate_output_cost (ifp);
                   2528:   
                   2529:   return CMD_SUCCESS;
                   2530: }
                   2531: 
                   2532: DEFUN (no_ospf_auto_cost_reference_bandwidth,
                   2533:        no_ospf_auto_cost_reference_bandwidth_cmd,
                   2534:        "no auto-cost reference-bandwidth",
                   2535:        NO_STR
                   2536:        "Calculate OSPF interface cost according to bandwidth\n"
                   2537:        "Use reference bandwidth method to assign OSPF cost\n")
                   2538: {
                   2539:   struct ospf *ospf = vty->index;
                   2540:   struct listnode *node, *nnode;
                   2541:   struct interface *ifp;
                   2542: 
                   2543:   if (ospf->ref_bandwidth == OSPF_DEFAULT_REF_BANDWIDTH)
                   2544:     return CMD_SUCCESS;
                   2545:   
                   2546:   ospf->ref_bandwidth = OSPF_DEFAULT_REF_BANDWIDTH;
                   2547:   vty_out (vty, "%% OSPF: Reference bandwidth is changed.%s", VTY_NEWLINE);
                   2548:   vty_out (vty, "        Please ensure reference bandwidth is consistent across all routers%s", VTY_NEWLINE);
                   2549: 
                   2550:   for (ALL_LIST_ELEMENTS (om->iflist, node, nnode, ifp))
                   2551:     ospf_if_recalculate_output_cost (ifp);
                   2552:       
                   2553:   return CMD_SUCCESS;
                   2554: }
                   2555: 
                   2556: const char *ospf_abr_type_descr_str[] = 
                   2557: {
                   2558:   "Unknown",
                   2559:   "Standard (RFC2328)",
                   2560:   "Alternative IBM",
                   2561:   "Alternative Cisco",
                   2562:   "Alternative Shortcut"
                   2563: };
                   2564: 
                   2565: const char *ospf_shortcut_mode_descr_str[] = 
                   2566: {
                   2567:   "Default",
                   2568:   "Enabled",
                   2569:   "Disabled"
                   2570: };
                   2571: 
                   2572: 
                   2573: 
                   2574: static void
                   2575: show_ip_ospf_area (struct vty *vty, struct ospf_area *area)
                   2576: {
                   2577:   /* Show Area ID. */
                   2578:   vty_out (vty, " Area ID: %s", inet_ntoa (area->area_id));
                   2579: 
                   2580:   /* Show Area type/mode. */
                   2581:   if (OSPF_IS_AREA_BACKBONE (area))
                   2582:     vty_out (vty, " (Backbone)%s", VTY_NEWLINE);
                   2583:   else
                   2584:     {
                   2585:       if (area->external_routing == OSPF_AREA_STUB)
                   2586:         vty_out (vty, " (Stub%s%s)",
                   2587:                         area->no_summary ? ", no summary" : "",
                   2588:                         area->shortcut_configured ? "; " : "");
                   2589: 
                   2590:       else if (area->external_routing == OSPF_AREA_NSSA)
                   2591:         vty_out (vty, " (NSSA%s%s)",
                   2592:                  area->no_summary ? ", no summary" : "",
                   2593:                  area->shortcut_configured ? "; " : "");
                   2594: 
                   2595:       vty_out (vty, "%s", VTY_NEWLINE);
                   2596:       vty_out (vty, "   Shortcutting mode: %s",
                   2597:                ospf_shortcut_mode_descr_str[area->shortcut_configured]);
                   2598:       vty_out (vty, ", S-bit consensus: %s%s",
                   2599:                area->shortcut_capability ? "ok" : "no", VTY_NEWLINE);
                   2600:     }
                   2601: 
                   2602:   /* Show number of interfaces. */
                   2603:   vty_out (vty, "   Number of interfaces in this area: Total: %d, "
                   2604:           "Active: %d%s", listcount (area->oiflist),
                   2605:           area->act_ints, VTY_NEWLINE);
                   2606: 
                   2607:   if (area->external_routing == OSPF_AREA_NSSA)
                   2608:     {
                   2609:       vty_out (vty, "   It is an NSSA configuration. %s   Elected NSSA/ABR performs type-7/type-5 LSA translation. %s", VTY_NEWLINE, VTY_NEWLINE);
                   2610:       if (! IS_OSPF_ABR (area->ospf))
                   2611:         vty_out (vty, "   It is not ABR, therefore not Translator. %s",
                   2612:                  VTY_NEWLINE);
                   2613:       else if (area->NSSATranslatorState)
                   2614:        {
                   2615:          vty_out (vty, "   We are an ABR and ");
                   2616:          if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
                   2617:            vty_out (vty, "the NSSA Elected Translator. %s", 
                   2618:                        VTY_NEWLINE);
                   2619:          else if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS)
                   2620:            vty_out (vty, "always an NSSA Translator. %s",
                   2621:                     VTY_NEWLINE);
                   2622:        }
                   2623:       else
                   2624:        {
                   2625:          vty_out (vty, "   We are an ABR, but ");
                   2626:          if (area->NSSATranslatorRole == OSPF_NSSA_ROLE_CANDIDATE)
                   2627:            vty_out (vty, "not the NSSA Elected Translator. %s",
                   2628:                     VTY_NEWLINE);
                   2629:          else
                   2630:            vty_out (vty, "never an NSSA Translator. %s", 
                   2631:                     VTY_NEWLINE);
                   2632:           }
                   2633:     }
                   2634:   /* Stub-router state for this area */
                   2635:   if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
                   2636:     {
                   2637:       char timebuf[OSPF_TIME_DUMP_SIZE];
                   2638:       vty_out (vty, "   Originating stub / maximum-distance Router-LSA%s",
                   2639:                VTY_NEWLINE);
                   2640:       if (CHECK_FLAG(area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
                   2641:         vty_out (vty, "     Administratively activated (indefinitely)%s",
                   2642:                  VTY_NEWLINE);
                   2643:       if (area->t_stub_router)
                   2644:         vty_out (vty, "     Active from startup, %s remaining%s",
                   2645:                  ospf_timer_dump (area->t_stub_router, timebuf, 
                   2646:                                   sizeof(timebuf)), VTY_NEWLINE);
                   2647:     }
                   2648:   
                   2649:   /* Show number of fully adjacent neighbors. */
                   2650:   vty_out (vty, "   Number of fully adjacent neighbors in this area:"
                   2651:                 " %d%s", area->full_nbrs, VTY_NEWLINE);
                   2652: 
                   2653:   /* Show authentication type. */
                   2654:   vty_out (vty, "   Area has ");
                   2655:   if (area->auth_type == OSPF_AUTH_NULL)
                   2656:     vty_out (vty, "no authentication%s", VTY_NEWLINE);
                   2657:   else if (area->auth_type == OSPF_AUTH_SIMPLE)
                   2658:     vty_out (vty, "simple password authentication%s", VTY_NEWLINE);
                   2659:   else if (area->auth_type == OSPF_AUTH_CRYPTOGRAPHIC)
                   2660:     vty_out (vty, "message digest authentication%s", VTY_NEWLINE);
                   2661: 
                   2662:   if (!OSPF_IS_AREA_BACKBONE (area))
                   2663:     vty_out (vty, "   Number of full virtual adjacencies going through"
                   2664:             " this area: %d%s", area->full_vls, VTY_NEWLINE);
                   2665: 
                   2666:   /* Show SPF calculation times. */
                   2667:   vty_out (vty, "   SPF algorithm executed %d times%s",
                   2668:           area->spf_calculation, VTY_NEWLINE);
                   2669: 
                   2670:   /* Show number of LSA. */
                   2671:   vty_out (vty, "   Number of LSA %ld%s", area->lsdb->total, VTY_NEWLINE);
                   2672:   vty_out (vty, "   Number of router LSA %ld. Checksum Sum 0x%08x%s",
                   2673:           ospf_lsdb_count (area->lsdb, OSPF_ROUTER_LSA),
                   2674:           ospf_lsdb_checksum (area->lsdb, OSPF_ROUTER_LSA), VTY_NEWLINE);
                   2675:   vty_out (vty, "   Number of network LSA %ld. Checksum Sum 0x%08x%s",
                   2676:            ospf_lsdb_count (area->lsdb, OSPF_NETWORK_LSA),
                   2677:            ospf_lsdb_checksum (area->lsdb, OSPF_NETWORK_LSA), VTY_NEWLINE);
                   2678:   vty_out (vty, "   Number of summary LSA %ld. Checksum Sum 0x%08x%s",
                   2679:            ospf_lsdb_count (area->lsdb, OSPF_SUMMARY_LSA),
                   2680:            ospf_lsdb_checksum (area->lsdb, OSPF_SUMMARY_LSA), VTY_NEWLINE);
                   2681:   vty_out (vty, "   Number of ASBR summary LSA %ld. Checksum Sum 0x%08x%s",
                   2682:            ospf_lsdb_count (area->lsdb, OSPF_ASBR_SUMMARY_LSA),
                   2683:            ospf_lsdb_checksum (area->lsdb, OSPF_ASBR_SUMMARY_LSA), VTY_NEWLINE);
                   2684:   vty_out (vty, "   Number of NSSA LSA %ld. Checksum Sum 0x%08x%s",
                   2685:            ospf_lsdb_count (area->lsdb, OSPF_AS_NSSA_LSA),
                   2686:            ospf_lsdb_checksum (area->lsdb, OSPF_AS_NSSA_LSA), VTY_NEWLINE);
                   2687: #ifdef HAVE_OPAQUE_LSA
                   2688:   vty_out (vty, "   Number of opaque link LSA %ld. Checksum Sum 0x%08x%s",
                   2689:            ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_LINK_LSA),
                   2690:            ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_LINK_LSA), VTY_NEWLINE);
                   2691:   vty_out (vty, "   Number of opaque area LSA %ld. Checksum Sum 0x%08x%s",
                   2692:            ospf_lsdb_count (area->lsdb, OSPF_OPAQUE_AREA_LSA),
                   2693:            ospf_lsdb_checksum (area->lsdb, OSPF_OPAQUE_AREA_LSA), VTY_NEWLINE);
                   2694: #endif /* HAVE_OPAQUE_LSA */
                   2695:   vty_out (vty, "%s", VTY_NEWLINE);
                   2696: }
                   2697: 
                   2698: DEFUN (show_ip_ospf,
                   2699:        show_ip_ospf_cmd,
                   2700:        "show ip ospf",
                   2701:        SHOW_STR
                   2702:        IP_STR
                   2703:        "OSPF information\n")
                   2704: {
                   2705:   struct listnode *node, *nnode;
                   2706:   struct ospf_area * area;
                   2707:   struct ospf *ospf;
                   2708:   struct timeval result;
                   2709:   char timebuf[OSPF_TIME_DUMP_SIZE];
                   2710: 
                   2711:   /* Check OSPF is enable. */
                   2712:   ospf = ospf_lookup ();
                   2713:   if (ospf == NULL)
                   2714:     {
                   2715:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   2716:       return CMD_SUCCESS;
                   2717:     }
                   2718: 
                   2719:   /* Show Router ID. */
                   2720:   vty_out (vty, " OSPF Routing Process, Router ID: %s%s",
                   2721:            inet_ntoa (ospf->router_id),
                   2722:            VTY_NEWLINE);
                   2723:   
                   2724:   /* Graceful shutdown */
                   2725:   if (ospf->t_deferred_shutdown)
                   2726:     vty_out (vty, " Deferred shutdown in progress, %s remaining%s",
                   2727:              ospf_timer_dump (ospf->t_deferred_shutdown,
                   2728:                               timebuf, sizeof (timebuf)), VTY_NEWLINE);
                   2729:   /* Show capability. */
                   2730:   vty_out (vty, " Supports only single TOS (TOS0) routes%s", VTY_NEWLINE);
                   2731:   vty_out (vty, " This implementation conforms to RFC2328%s", VTY_NEWLINE);
                   2732:   vty_out (vty, " RFC1583Compatibility flag is %s%s",
                   2733:           CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE) ?
                   2734:           "enabled" : "disabled", VTY_NEWLINE);
                   2735: #ifdef HAVE_OPAQUE_LSA
                   2736:   vty_out (vty, " OpaqueCapability flag is %s%s%s",
                   2737:           CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE) ?
                   2738:            "enabled" : "disabled",
                   2739:            IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf->opaque) ?
                   2740:            " (origination blocked)" : "",
                   2741:            VTY_NEWLINE);
                   2742: #endif /* HAVE_OPAQUE_LSA */
                   2743:   
                   2744:   /* Show stub-router configuration */
                   2745:   if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED
                   2746:       || ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
                   2747:     {
                   2748:       vty_out (vty, " Stub router advertisement is configured%s",
                   2749:                VTY_NEWLINE);
                   2750:       if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
                   2751:         vty_out (vty, "   Enabled for %us after start-up%s",
                   2752:                  ospf->stub_router_startup_time, VTY_NEWLINE);
                   2753:       if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
                   2754:         vty_out (vty, "   Enabled for %us prior to full shutdown%s",
                   2755:                  ospf->stub_router_shutdown_time, VTY_NEWLINE);
                   2756:     }
                   2757:   
                   2758:   /* Show SPF timers. */
                   2759:   vty_out (vty, " Initial SPF scheduling delay %d millisec(s)%s"
                   2760:                 " Minimum hold time between consecutive SPFs %d millisec(s)%s"
                   2761:                 " Maximum hold time between consecutive SPFs %d millisec(s)%s"
                   2762:                 " Hold time multiplier is currently %d%s",
                   2763:          ospf->spf_delay, VTY_NEWLINE,
                   2764:          ospf->spf_holdtime, VTY_NEWLINE,
                   2765:          ospf->spf_max_holdtime, VTY_NEWLINE,
                   2766:          ospf->spf_hold_multiplier, VTY_NEWLINE);
                   2767:   vty_out (vty, " SPF algorithm ");
                   2768:   if (ospf->ts_spf.tv_sec || ospf->ts_spf.tv_usec)
                   2769:     {
                   2770:       result = tv_sub (recent_relative_time (), ospf->ts_spf);
                   2771:       vty_out (vty, "last executed %s ago%s",
                   2772:                ospf_timeval_dump (&result, timebuf, sizeof (timebuf)),
                   2773:                VTY_NEWLINE);
                   2774:     }
                   2775:   else
                   2776:     vty_out (vty, "has not been run%s", VTY_NEWLINE);
                   2777:   vty_out (vty, " SPF timer %s%s%s",
                   2778:            (ospf->t_spf_calc ? "due in " : "is "),
                   2779:            ospf_timer_dump (ospf->t_spf_calc, timebuf, sizeof (timebuf)),
                   2780:            VTY_NEWLINE);
                   2781:   
                   2782:   /* Show refresh parameters. */
                   2783:   vty_out (vty, " Refresh timer %d secs%s",
                   2784:           ospf->lsa_refresh_interval, VTY_NEWLINE);
                   2785:           
                   2786:   /* Show ABR/ASBR flags. */
                   2787:   if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
                   2788:     vty_out (vty, " This router is an ABR, ABR type is: %s%s",
                   2789:              ospf_abr_type_descr_str[ospf->abr_type], VTY_NEWLINE);
                   2790: 
                   2791:   if (CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
                   2792:     vty_out (vty, " This router is an ASBR "
                   2793:              "(injecting external routing information)%s", VTY_NEWLINE);
                   2794: 
                   2795:   /* Show Number of AS-external-LSAs. */
                   2796:   vty_out (vty, " Number of external LSA %ld. Checksum Sum 0x%08x%s",
                   2797:           ospf_lsdb_count (ospf->lsdb, OSPF_AS_EXTERNAL_LSA),
                   2798:           ospf_lsdb_checksum (ospf->lsdb, OSPF_AS_EXTERNAL_LSA), VTY_NEWLINE);
                   2799: #ifdef HAVE_OPAQUE_LSA
                   2800:   vty_out (vty, " Number of opaque AS LSA %ld. Checksum Sum 0x%08x%s",
                   2801:           ospf_lsdb_count (ospf->lsdb, OSPF_OPAQUE_AS_LSA),
                   2802:           ospf_lsdb_checksum (ospf->lsdb, OSPF_OPAQUE_AS_LSA), VTY_NEWLINE);
                   2803: #endif /* HAVE_OPAQUE_LSA */
                   2804:   /* Show number of areas attached. */
                   2805:   vty_out (vty, " Number of areas attached to this router: %d%s",
                   2806:            listcount (ospf->areas), VTY_NEWLINE);
                   2807: 
                   2808:   if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
                   2809:     {
                   2810:       if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
                   2811:        vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
                   2812:       else
                   2813:        vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
                   2814:     }
                   2815: 
                   2816:   vty_out (vty, "%s",VTY_NEWLINE);
                   2817: 
                   2818:   /* Show each area status. */
                   2819:   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
                   2820:     show_ip_ospf_area (vty, area);
                   2821: 
                   2822:   return CMD_SUCCESS;
                   2823: }
                   2824: 
                   2825: 
                   2826: static void
                   2827: show_ip_ospf_interface_sub (struct vty *vty, struct ospf *ospf,
                   2828:                            struct interface *ifp)
                   2829: {
                   2830:   int is_up;
                   2831:   struct ospf_neighbor *nbr;
                   2832:   struct route_node *rn;
                   2833: 
                   2834:   /* Is interface up? */
                   2835:   vty_out (vty, "%s is %s%s", ifp->name,
                   2836:           ((is_up = if_is_operative(ifp)) ? "up" : "down"), VTY_NEWLINE);
                   2837:   vty_out (vty, "  ifindex %u, MTU %u bytes, BW %u Kbit %s%s",
                   2838:           ifp->ifindex, ifp->mtu, ifp->bandwidth, if_flag_dump(ifp->flags),
                   2839:           VTY_NEWLINE);
                   2840: 
                   2841:   /* Is interface OSPF enabled? */
                   2842:   if (ospf_oi_count(ifp) == 0)
                   2843:     {
                   2844:       vty_out (vty, "  OSPF not enabled on this interface%s", VTY_NEWLINE);
                   2845:       return;
                   2846:     }
                   2847:   else if (!is_up)
                   2848:     {
                   2849:       vty_out (vty, "  OSPF is enabled, but not running on this interface%s",
                   2850:               VTY_NEWLINE);
                   2851:       return;
                   2852:     }
                   2853: 
                   2854:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   2855:     {
                   2856:       struct ospf_interface *oi = rn->info;
                   2857:       
                   2858:       if (oi == NULL)
                   2859:        continue;
                   2860:       
                   2861:       /* Show OSPF interface information. */
                   2862:       vty_out (vty, "  Internet Address %s/%d,",
                   2863:               inet_ntoa (oi->address->u.prefix4), oi->address->prefixlen);
                   2864: 
                   2865:       if (oi->connected->destination || oi->type == OSPF_IFTYPE_VIRTUALLINK)
                   2866:         {
                   2867:           struct in_addr *dest;
                   2868:           const char *dstr;
                   2869:           
                   2870:          if (CONNECTED_PEER(oi->connected)
                   2871:              || oi->type == OSPF_IFTYPE_VIRTUALLINK)
                   2872:             dstr = "Peer";
                   2873:           else
                   2874:             dstr = "Broadcast";
                   2875:           
                   2876:           /* For Vlinks, showing the peer address is probably more
                   2877:            * informative than the local interface that is being used
                   2878:            */
                   2879:           if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
                   2880:             dest = &oi->vl_data->peer_addr;
                   2881:           else
                   2882:             dest = &oi->connected->destination->u.prefix4;
                   2883:           
                   2884:          vty_out (vty, " %s %s,", dstr, inet_ntoa (*dest));
                   2885:         }
                   2886: 
                   2887:       vty_out (vty, " Area %s%s", ospf_area_desc_string (oi->area),
                   2888:               VTY_NEWLINE);
                   2889: 
                   2890:       vty_out (vty, "  MTU mismatch detection:%s%s",
                   2891:            OSPF_IF_PARAM(oi, mtu_ignore) ? "disabled" : "enabled", VTY_NEWLINE);
                   2892: 
                   2893:       vty_out (vty, "  Router ID %s, Network Type %s, Cost: %d%s",
                   2894:               inet_ntoa (ospf->router_id), ospf_network_type_str[oi->type],
                   2895:               oi->output_cost, VTY_NEWLINE);
                   2896: 
                   2897:       vty_out (vty, "  Transmit Delay is %d sec, State %s, Priority %d%s",
                   2898:               OSPF_IF_PARAM (oi,transmit_delay), LOOKUP (ospf_ism_state_msg, oi->state),
                   2899:               PRIORITY (oi), VTY_NEWLINE);
                   2900: 
                   2901:   /* Show DR information. */
                   2902:       if (DR (oi).s_addr == 0)
                   2903:        vty_out (vty, "  No designated router on this network%s", VTY_NEWLINE);
                   2904:       else
                   2905:        {
                   2906:          nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
                   2907:          if (nbr == NULL)
                   2908:            vty_out (vty, "  No designated router on this network%s", VTY_NEWLINE);
                   2909:          else
                   2910:            {
                   2911:              vty_out (vty, "  Designated Router (ID) %s,",
                   2912:                       inet_ntoa (nbr->router_id));
                   2913:              vty_out (vty, " Interface Address %s%s",
                   2914:                       inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
                   2915:            }
                   2916:        }
                   2917: 
                   2918:       /* Show BDR information. */
                   2919:       if (BDR (oi).s_addr == 0)
                   2920:        vty_out (vty, "  No backup designated router on this network%s",
                   2921:                 VTY_NEWLINE);
                   2922:       else
                   2923:        {
                   2924:          nbr = ospf_nbr_lookup_by_addr (oi->nbrs, &BDR (oi));
                   2925:          if (nbr == NULL)
                   2926:            vty_out (vty, "  No backup designated router on this network%s",
                   2927:                     VTY_NEWLINE);
                   2928:          else
                   2929:            {
                   2930:              vty_out (vty, "  Backup Designated Router (ID) %s,",
                   2931:                       inet_ntoa (nbr->router_id));
                   2932:              vty_out (vty, " Interface Address %s%s",
                   2933:                       inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
                   2934:            }
                   2935:        }
                   2936:       
                   2937:       /* Next network-LSA sequence number we'll use, if we're elected DR */
                   2938:       if (oi->params && ntohl (oi->params->network_lsa_seqnum)
                   2939:                           != OSPF_INITIAL_SEQUENCE_NUMBER)
                   2940:         vty_out (vty, "  Saved Network-LSA sequence number 0x%x%s",
                   2941:                  ntohl (oi->params->network_lsa_seqnum), VTY_NEWLINE);
                   2942:       
                   2943:       vty_out (vty, "  Multicast group memberships:");
                   2944:       if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS)
                   2945:           || OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
                   2946:         {
                   2947:           if (OI_MEMBER_CHECK(oi, MEMBER_ALLROUTERS))
                   2948:             vty_out (vty, " OSPFAllRouters");
                   2949:           if (OI_MEMBER_CHECK(oi, MEMBER_DROUTERS))
                   2950:             vty_out (vty, " OSPFDesignatedRouters");
                   2951:         }
                   2952:       else
                   2953:         vty_out (vty, " <None>");
                   2954:       vty_out (vty, "%s", VTY_NEWLINE);
                   2955: 
                   2956:       vty_out (vty, "  Timer intervals configured,");
                   2957:       vty_out (vty, " Hello ");
                   2958:       if (OSPF_IF_PARAM (oi, fast_hello) == 0)
                   2959:         vty_out (vty, "%ds,", OSPF_IF_PARAM (oi, v_hello));
                   2960:       else
                   2961:         vty_out (vty, "%dms,", 1000 / OSPF_IF_PARAM (oi, fast_hello));
                   2962:       vty_out (vty, " Dead %ds, Wait %ds, Retransmit %d%s",
                   2963:               OSPF_IF_PARAM (oi, v_wait),
                   2964:               OSPF_IF_PARAM (oi, v_wait),
                   2965:               OSPF_IF_PARAM (oi, retransmit_interval),
                   2966:               VTY_NEWLINE);
                   2967:       
                   2968:       if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_ACTIVE)
                   2969:         {
                   2970:          char timebuf[OSPF_TIME_DUMP_SIZE];
                   2971:          vty_out (vty, "    Hello due in %s%s",
                   2972:                   ospf_timer_dump (oi->t_hello, timebuf, sizeof(timebuf)), 
                   2973:                   VTY_NEWLINE);
                   2974:         }
                   2975:       else /* passive-interface is set */
                   2976:        vty_out (vty, "    No Hellos (Passive interface)%s", VTY_NEWLINE);
                   2977:       
                   2978:       vty_out (vty, "  Neighbor Count is %d, Adjacent neighbor count is %d%s",
                   2979:               ospf_nbr_count (oi, 0), ospf_nbr_count (oi, NSM_Full),
                   2980:               VTY_NEWLINE);
                   2981:     }
                   2982: }
                   2983: 
                   2984: DEFUN (show_ip_ospf_interface,
                   2985:        show_ip_ospf_interface_cmd,
                   2986:        "show ip ospf interface [INTERFACE]",
                   2987:        SHOW_STR
                   2988:        IP_STR
                   2989:        "OSPF information\n"
                   2990:        "Interface information\n"
                   2991:        "Interface name\n")
                   2992: {
                   2993:   struct interface *ifp;
                   2994:   struct ospf *ospf;
                   2995:   struct listnode *node;
                   2996: 
                   2997:   ospf = ospf_lookup ();
                   2998:   if (ospf == NULL)
                   2999:     {
                   3000:       vty_out (vty, "OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3001:       return CMD_SUCCESS;
                   3002:     }
                   3003: 
                   3004:   /* Show All Interfaces. */
                   3005:   if (argc == 0)
                   3006:     for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
                   3007:       show_ip_ospf_interface_sub (vty, ospf, ifp);
                   3008:   /* Interface name is specified. */
                   3009:   else
                   3010:     {
                   3011:       if ((ifp = if_lookup_by_name (argv[0])) == NULL)
                   3012:         vty_out (vty, "No such interface name%s", VTY_NEWLINE);
                   3013:       else
                   3014:         show_ip_ospf_interface_sub (vty, ospf, ifp);
                   3015:     }
                   3016: 
                   3017:   return CMD_SUCCESS;
                   3018: }
                   3019: 
                   3020: static void
                   3021: show_ip_ospf_neighbour_header (struct vty *vty)
                   3022: {
                   3023:   vty_out (vty, "%s%15s %3s %-15s %9s %-15s %-20s %5s %5s %5s%s",
                   3024:            VTY_NEWLINE,
                   3025:            "Neighbor ID", "Pri", "State", "Dead Time",
                   3026:            "Address", "Interface", "RXmtL", "RqstL", "DBsmL",
                   3027:            VTY_NEWLINE);
                   3028: }
                   3029: 
                   3030: static void
                   3031: show_ip_ospf_neighbor_sub (struct vty *vty, struct ospf_interface *oi)
                   3032: {
                   3033:   struct route_node *rn;
                   3034:   struct ospf_neighbor *nbr;
                   3035:   char msgbuf[16];
                   3036:   char timebuf[OSPF_TIME_DUMP_SIZE];
                   3037: 
                   3038:   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
                   3039:     if ((nbr = rn->info))
                   3040:       /* Do not show myself. */
                   3041:       if (nbr != oi->nbr_self)
                   3042:        /* Down state is not shown. */
                   3043:        if (nbr->state != NSM_Down)
                   3044:          {
                   3045:            ospf_nbr_state_message (nbr, msgbuf, 16);
                   3046: 
                   3047:            if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
                   3048:              vty_out (vty, "%-15s %3d %-15s ",
                   3049:                       "-", nbr->priority,
                   3050:                       msgbuf);
                   3051:             else
                   3052:              vty_out (vty, "%-15s %3d %-15s ",
                   3053:                       inet_ntoa (nbr->router_id), nbr->priority,
                   3054:                       msgbuf);
                   3055:             
                   3056:             vty_out (vty, "%9s ",
                   3057:                      ospf_timer_dump (nbr->t_inactivity, timebuf, 
                   3058:                                       sizeof(timebuf)));
                   3059:             
                   3060:            vty_out (vty, "%-15s ", inet_ntoa (nbr->src));
                   3061:            vty_out (vty, "%-20s %5ld %5ld %5d%s",
                   3062:                     IF_NAME (oi), ospf_ls_retransmit_count (nbr),
                   3063:                     ospf_ls_request_count (nbr), ospf_db_summary_count (nbr),
                   3064:                     VTY_NEWLINE);
                   3065:          }
                   3066: }
                   3067: 
                   3068: DEFUN (show_ip_ospf_neighbor,
                   3069:        show_ip_ospf_neighbor_cmd,
                   3070:        "show ip ospf neighbor",
                   3071:        SHOW_STR
                   3072:        IP_STR
                   3073:        "OSPF information\n"
                   3074:        "Neighbor list\n")
                   3075: {
                   3076:   struct ospf *ospf;
                   3077:   struct ospf_interface *oi;
                   3078:   struct listnode *node;
                   3079: 
                   3080:   ospf = ospf_lookup ();
                   3081:   if (ospf == NULL)
                   3082:     {
                   3083:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3084:       return CMD_SUCCESS;
                   3085:     }
                   3086: 
                   3087:   show_ip_ospf_neighbour_header (vty);
                   3088: 
                   3089:   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
                   3090:     show_ip_ospf_neighbor_sub (vty, oi);
                   3091: 
                   3092:   return CMD_SUCCESS;
                   3093: }
                   3094: 
                   3095: DEFUN (show_ip_ospf_neighbor_all,
                   3096:        show_ip_ospf_neighbor_all_cmd,
                   3097:        "show ip ospf neighbor all",
                   3098:        SHOW_STR
                   3099:        IP_STR
                   3100:        "OSPF information\n"
                   3101:        "Neighbor list\n"
                   3102:        "include down status neighbor\n")
                   3103: {
                   3104:   struct ospf *ospf = ospf_lookup ();
                   3105:   struct listnode *node;
                   3106:   struct ospf_interface *oi;
                   3107: 
                   3108:   if (ospf == NULL)
                   3109:     {
                   3110:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3111:       return CMD_SUCCESS;
                   3112:     }
                   3113:   
                   3114:   show_ip_ospf_neighbour_header (vty);
                   3115:   
                   3116:   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
                   3117:     {
                   3118:       struct listnode *nbr_node;
                   3119:       struct ospf_nbr_nbma *nbr_nbma;
                   3120: 
                   3121:       show_ip_ospf_neighbor_sub (vty, oi);
                   3122: 
                   3123:     /* print Down neighbor status */
                   3124:     for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nbr_node, nbr_nbma))
                   3125:       {
                   3126:        if (nbr_nbma->nbr == NULL
                   3127:            || nbr_nbma->nbr->state == NSM_Down)
                   3128:          {
                   3129:            vty_out (vty, "%-15s %3d %-15s %9s ",
                   3130:                     "-", nbr_nbma->priority, "Down", "-");
                   3131:            vty_out (vty, "%-15s %-20s %5d %5d %5d%s", 
                   3132:                     inet_ntoa (nbr_nbma->addr), IF_NAME (oi),
                   3133:                     0, 0, 0, VTY_NEWLINE);
                   3134:          }
                   3135:       }
                   3136:     }
                   3137: 
                   3138:   return CMD_SUCCESS;
                   3139: }
                   3140: 
                   3141: DEFUN (show_ip_ospf_neighbor_int,
                   3142:        show_ip_ospf_neighbor_int_cmd,
                   3143:        "show ip ospf neighbor IFNAME",
                   3144:        SHOW_STR
                   3145:        IP_STR
                   3146:        "OSPF information\n"
                   3147:        "Neighbor list\n"
                   3148:        "Interface name\n")
                   3149: {
                   3150:   struct ospf *ospf;
                   3151:   struct interface *ifp;
                   3152:   struct route_node *rn;
                   3153:  
                   3154:   ifp = if_lookup_by_name (argv[0]);
                   3155:   if (!ifp)
                   3156:     {
                   3157:       vty_out (vty, "No such interface.%s", VTY_NEWLINE);
                   3158:       return CMD_WARNING;
                   3159:     }
                   3160: 
                   3161:   ospf = ospf_lookup ();
                   3162:   if (ospf == NULL)
                   3163:     {
                   3164:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3165:       return CMD_SUCCESS;
                   3166:     }
                   3167:   
                   3168:   show_ip_ospf_neighbour_header (vty);
                   3169:   
                   3170:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   3171:     {
                   3172:       struct ospf_interface *oi = rn->info;
                   3173: 
                   3174:       if (oi == NULL)
                   3175:        continue;
                   3176: 
                   3177:       show_ip_ospf_neighbor_sub (vty, oi);
                   3178:     }
                   3179: 
                   3180:   return CMD_SUCCESS;
                   3181: }
                   3182: 
                   3183: static void
                   3184: show_ip_ospf_nbr_nbma_detail_sub (struct vty *vty, struct ospf_interface *oi,
                   3185:                                  struct ospf_nbr_nbma *nbr_nbma)
                   3186: {
                   3187:   char timebuf[OSPF_TIME_DUMP_SIZE];
                   3188: 
                   3189:   /* Show neighbor ID. */
                   3190:   vty_out (vty, " Neighbor %s,", "-");
                   3191: 
                   3192:   /* Show interface address. */
                   3193:   vty_out (vty, " interface address %s%s",
                   3194:           inet_ntoa (nbr_nbma->addr), VTY_NEWLINE);
                   3195:   /* Show Area ID. */
                   3196:   vty_out (vty, "    In the area %s via interface %s%s",
                   3197:           ospf_area_desc_string (oi->area), IF_NAME (oi), VTY_NEWLINE);
                   3198:   /* Show neighbor priority and state. */
                   3199:   vty_out (vty, "    Neighbor priority is %d, State is %s,",
                   3200:           nbr_nbma->priority, "Down");
                   3201:   /* Show state changes. */
                   3202:   vty_out (vty, " %d state changes%s", nbr_nbma->state_change, VTY_NEWLINE);
                   3203: 
                   3204:   /* Show PollInterval */
                   3205:   vty_out (vty, "    Poll interval %d%s", nbr_nbma->v_poll, VTY_NEWLINE);
                   3206: 
                   3207:   /* Show poll-interval timer. */
                   3208:   vty_out (vty, "    Poll timer due in %s%s",
                   3209:           ospf_timer_dump (nbr_nbma->t_poll, timebuf, sizeof(timebuf)),
                   3210:            VTY_NEWLINE);
                   3211: 
                   3212:   /* Show poll-interval timer thread. */
                   3213:   vty_out (vty, "    Thread Poll Timer %s%s", 
                   3214:           nbr_nbma->t_poll != NULL ? "on" : "off", VTY_NEWLINE);
                   3215: }
                   3216: 
                   3217: static void
                   3218: show_ip_ospf_neighbor_detail_sub (struct vty *vty, struct ospf_interface *oi,
                   3219:                                  struct ospf_neighbor *nbr)
                   3220: {
                   3221:   char timebuf[OSPF_TIME_DUMP_SIZE];
                   3222: 
                   3223:   /* Show neighbor ID. */
                   3224:   if (nbr->state == NSM_Attempt && nbr->router_id.s_addr == 0)
                   3225:     vty_out (vty, " Neighbor %s,", "-");
                   3226:   else
                   3227:   vty_out (vty, " Neighbor %s,", inet_ntoa (nbr->router_id));
                   3228: 
                   3229:   /* Show interface address. */
                   3230:   vty_out (vty, " interface address %s%s",
                   3231:           inet_ntoa (nbr->address.u.prefix4), VTY_NEWLINE);
                   3232:   /* Show Area ID. */
                   3233:   vty_out (vty, "    In the area %s via interface %s%s",
                   3234:           ospf_area_desc_string (oi->area), oi->ifp->name, VTY_NEWLINE);
                   3235:   /* Show neighbor priority and state. */
                   3236:   vty_out (vty, "    Neighbor priority is %d, State is %s,",
                   3237:           nbr->priority, LOOKUP (ospf_nsm_state_msg, nbr->state));
                   3238:   /* Show state changes. */
                   3239:   vty_out (vty, " %d state changes%s", nbr->state_change, VTY_NEWLINE);
                   3240:   if (nbr->ts_last_progress.tv_sec || nbr->ts_last_progress.tv_usec)
                   3241:     {
                   3242:       struct timeval res
                   3243:         = tv_sub (recent_relative_time (), nbr->ts_last_progress);
                   3244:       vty_out (vty, "    Most recent state change statistics:%s",
                   3245:                VTY_NEWLINE);
                   3246:       vty_out (vty, "      Progressive change %s ago%s",
                   3247:                ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
                   3248:                VTY_NEWLINE);
                   3249:     }
                   3250:   if (nbr->ts_last_regress.tv_sec || nbr->ts_last_regress.tv_usec)
                   3251:     {
                   3252:       struct timeval res
                   3253:         = tv_sub (recent_relative_time (), nbr->ts_last_regress);
                   3254:       vty_out (vty, "      Regressive change %s ago, due to %s%s",
                   3255:                ospf_timeval_dump (&res, timebuf, sizeof(timebuf)),
                   3256:                (nbr->last_regress_str ? nbr->last_regress_str : "??"),
                   3257:                VTY_NEWLINE);
                   3258:     }
                   3259:   /* Show Designated Rotuer ID. */
                   3260:   vty_out (vty, "    DR is %s,", inet_ntoa (nbr->d_router));
                   3261:   /* Show Backup Designated Rotuer ID. */
                   3262:   vty_out (vty, " BDR is %s%s", inet_ntoa (nbr->bd_router), VTY_NEWLINE);
                   3263:   /* Show options. */
                   3264:   vty_out (vty, "    Options %d %s%s", nbr->options,
                   3265:           ospf_options_dump (nbr->options), VTY_NEWLINE);
                   3266:   /* Show Router Dead interval timer. */
                   3267:   vty_out (vty, "    Dead timer due in %s%s",
                   3268:           ospf_timer_dump (nbr->t_inactivity, timebuf, sizeof (timebuf)),
                   3269:            VTY_NEWLINE);
                   3270:   /* Show Database Summary list. */
                   3271:   vty_out (vty, "    Database Summary List %d%s",
                   3272:           ospf_db_summary_count (nbr), VTY_NEWLINE);
                   3273:   /* Show Link State Request list. */
                   3274:   vty_out (vty, "    Link State Request List %ld%s",
                   3275:           ospf_ls_request_count (nbr), VTY_NEWLINE);
                   3276:   /* Show Link State Retransmission list. */
                   3277:   vty_out (vty, "    Link State Retransmission List %ld%s",
                   3278:           ospf_ls_retransmit_count (nbr), VTY_NEWLINE);
                   3279:   /* Show inactivity timer thread. */
                   3280:   vty_out (vty, "    Thread Inactivity Timer %s%s", 
                   3281:           nbr->t_inactivity != NULL ? "on" : "off", VTY_NEWLINE);
                   3282:   /* Show Database Description retransmission thread. */
                   3283:   vty_out (vty, "    Thread Database Description Retransmision %s%s",
                   3284:           nbr->t_db_desc != NULL ? "on" : "off", VTY_NEWLINE);
                   3285:   /* Show Link State Request Retransmission thread. */
                   3286:   vty_out (vty, "    Thread Link State Request Retransmission %s%s",
                   3287:           nbr->t_ls_req != NULL ? "on" : "off", VTY_NEWLINE);
                   3288:   /* Show Link State Update Retransmission thread. */
                   3289:   vty_out (vty, "    Thread Link State Update Retransmission %s%s%s",
                   3290:           nbr->t_ls_upd != NULL ? "on" : "off", VTY_NEWLINE, VTY_NEWLINE);
                   3291: }
                   3292: 
                   3293: DEFUN (show_ip_ospf_neighbor_id,
                   3294:        show_ip_ospf_neighbor_id_cmd,
                   3295:        "show ip ospf neighbor A.B.C.D",
                   3296:        SHOW_STR
                   3297:        IP_STR
                   3298:        "OSPF information\n"
                   3299:        "Neighbor list\n"
                   3300:        "Neighbor ID\n")
                   3301: {
                   3302:   struct ospf *ospf;
                   3303:   struct listnode *node;
                   3304:   struct ospf_neighbor *nbr;
                   3305:   struct ospf_interface *oi;
                   3306:   struct in_addr router_id;
                   3307:   int ret;
                   3308: 
                   3309:   ret = inet_aton (argv[0], &router_id);
                   3310:   if (!ret)
                   3311:     {
                   3312:       vty_out (vty, "Please specify Neighbor ID by A.B.C.D%s", VTY_NEWLINE);
                   3313:       return CMD_WARNING;
                   3314:     }
                   3315: 
                   3316:   ospf = ospf_lookup ();
                   3317:   if (ospf == NULL)
                   3318:     {
                   3319:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3320:       return CMD_SUCCESS;
                   3321:     }
                   3322: 
                   3323:   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
                   3324:     if ((nbr = ospf_nbr_lookup_by_routerid (oi->nbrs, &router_id)))
                   3325:       show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
                   3326: 
                   3327:   return CMD_SUCCESS;
                   3328: }
                   3329: 
                   3330: DEFUN (show_ip_ospf_neighbor_detail,
                   3331:        show_ip_ospf_neighbor_detail_cmd,
                   3332:        "show ip ospf neighbor detail",
                   3333:        SHOW_STR
                   3334:        IP_STR
                   3335:        "OSPF information\n"
                   3336:        "Neighbor list\n"
                   3337:        "detail of all neighbors\n")
                   3338: {
                   3339:   struct ospf *ospf;
                   3340:   struct ospf_interface *oi;
                   3341:   struct listnode *node;
                   3342: 
                   3343:   ospf = ospf_lookup ();
                   3344:   if (ospf == NULL)
                   3345:     {
                   3346:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3347:       return CMD_SUCCESS;
                   3348:     }
                   3349: 
                   3350:   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
                   3351:     {
                   3352:       struct route_node *rn;
                   3353:       struct ospf_neighbor *nbr;
                   3354: 
                   3355:       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
                   3356:        if ((nbr = rn->info))
                   3357:          if (nbr != oi->nbr_self)
                   3358:            if (nbr->state != NSM_Down)
                   3359:              show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
                   3360:     }
                   3361: 
                   3362:   return CMD_SUCCESS;
                   3363: }
                   3364: 
                   3365: DEFUN (show_ip_ospf_neighbor_detail_all,
                   3366:        show_ip_ospf_neighbor_detail_all_cmd,
                   3367:        "show ip ospf neighbor detail all",
                   3368:        SHOW_STR
                   3369:        IP_STR
                   3370:        "OSPF information\n"
                   3371:        "Neighbor list\n"
                   3372:        "detail of all neighbors\n"
                   3373:        "include down status neighbor\n")
                   3374: {
                   3375:   struct ospf *ospf;
                   3376:   struct listnode *node;
                   3377:   struct ospf_interface *oi;
                   3378: 
                   3379:   ospf = ospf_lookup ();
                   3380:   if (ospf == NULL)
                   3381:     {
                   3382:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3383:       return CMD_SUCCESS;
                   3384:     }
                   3385: 
                   3386:   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
                   3387:     {
                   3388:       struct route_node *rn;
                   3389:       struct ospf_neighbor *nbr;
                   3390:       struct ospf_nbr_nbma *nbr_nbma;
                   3391: 
                   3392:       for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
                   3393:        if ((nbr = rn->info))
                   3394:          if (nbr != oi->nbr_self)
                   3395:            if (oi->type == OSPF_IFTYPE_NBMA && nbr->state != NSM_Down)
                   3396:              show_ip_ospf_neighbor_detail_sub (vty, oi, rn->info);
                   3397: 
                   3398:       if (oi->type == OSPF_IFTYPE_NBMA)
                   3399:        {
                   3400:          struct listnode *nd;
                   3401: 
                   3402:          for (ALL_LIST_ELEMENTS_RO (oi->nbr_nbma, nd, nbr_nbma))
                   3403:             if (nbr_nbma->nbr == NULL
                   3404:                 || nbr_nbma->nbr->state == NSM_Down)
                   3405:               show_ip_ospf_nbr_nbma_detail_sub (vty, oi, nbr_nbma);
                   3406:        }
                   3407:     }
                   3408: 
                   3409:   return CMD_SUCCESS;
                   3410: }
                   3411: 
                   3412: DEFUN (show_ip_ospf_neighbor_int_detail,
                   3413:        show_ip_ospf_neighbor_int_detail_cmd,
                   3414:        "show ip ospf neighbor IFNAME detail",
                   3415:        SHOW_STR
                   3416:        IP_STR
                   3417:        "OSPF information\n"
                   3418:        "Neighbor list\n"
                   3419:        "Interface name\n"
                   3420:        "detail of all neighbors")
                   3421: {
                   3422:   struct ospf *ospf;
                   3423:   struct ospf_interface *oi;
                   3424:   struct interface *ifp;
                   3425:   struct route_node *rn, *nrn;
                   3426:   struct ospf_neighbor *nbr;
                   3427: 
                   3428:   ifp = if_lookup_by_name (argv[0]);
                   3429:   if (!ifp)
                   3430:     {
                   3431:       vty_out (vty, "No such interface.%s", VTY_NEWLINE);
                   3432:       return CMD_WARNING;
                   3433:     }
                   3434: 
                   3435:   ospf = ospf_lookup ();
                   3436:   if (ospf == NULL)
                   3437:     {
                   3438:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   3439:       return CMD_SUCCESS;
                   3440:     }
                   3441: 
                   3442: 
                   3443:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   3444:     if ((oi = rn->info))
                   3445:       for (nrn = route_top (oi->nbrs); nrn; nrn = route_next (nrn))
                   3446:        if ((nbr = nrn->info))
                   3447:          if (nbr != oi->nbr_self)
                   3448:            if (nbr->state != NSM_Down)
                   3449:              show_ip_ospf_neighbor_detail_sub (vty, oi, nbr);
                   3450: 
                   3451:   return CMD_SUCCESS;
                   3452: }
                   3453: 
                   3454: 
                   3455: /* Show functions */
                   3456: static int
                   3457: show_lsa_summary (struct vty *vty, struct ospf_lsa *lsa, int self)
                   3458: {
                   3459:   struct router_lsa *rl;
                   3460:   struct summary_lsa *sl;
                   3461:   struct as_external_lsa *asel;
                   3462:   struct prefix_ipv4 p;
                   3463: 
                   3464:   if (lsa != NULL)
                   3465:     /* If self option is set, check LSA self flag. */
                   3466:     if (self == 0 || IS_LSA_SELF (lsa))
                   3467:       {
                   3468:        /* LSA common part show. */
                   3469:        vty_out (vty, "%-15s ", inet_ntoa (lsa->data->id));
                   3470:        vty_out (vty, "%-15s %4d 0x%08lx 0x%04x",
                   3471:                 inet_ntoa (lsa->data->adv_router), LS_AGE (lsa),
                   3472:                 (u_long)ntohl (lsa->data->ls_seqnum), ntohs (lsa->data->checksum));
                   3473:        /* LSA specific part show. */
                   3474:        switch (lsa->data->type)
                   3475:          {
                   3476:          case OSPF_ROUTER_LSA:
                   3477:            rl = (struct router_lsa *) lsa->data;
                   3478:            vty_out (vty, " %-d", ntohs (rl->links));
                   3479:            break;
                   3480:          case OSPF_SUMMARY_LSA:
                   3481:            sl = (struct summary_lsa *) lsa->data;
                   3482: 
                   3483:            p.family = AF_INET;
                   3484:            p.prefix = sl->header.id;
                   3485:            p.prefixlen = ip_masklen (sl->mask);
                   3486:            apply_mask_ipv4 (&p);
                   3487: 
                   3488:            vty_out (vty, " %s/%d", inet_ntoa (p.prefix), p.prefixlen);
                   3489:            break;
                   3490:          case OSPF_AS_EXTERNAL_LSA:
                   3491:          case OSPF_AS_NSSA_LSA:
                   3492:            asel = (struct as_external_lsa *) lsa->data;
                   3493: 
                   3494:            p.family = AF_INET;
                   3495:            p.prefix = asel->header.id;
                   3496:            p.prefixlen = ip_masklen (asel->mask);
                   3497:            apply_mask_ipv4 (&p);
                   3498: 
                   3499:            vty_out (vty, " %s %s/%d [0x%lx]",
                   3500:                     IS_EXTERNAL_METRIC (asel->e[0].tos) ? "E2" : "E1",
                   3501:                     inet_ntoa (p.prefix), p.prefixlen,
                   3502:                     (u_long)ntohl (asel->e[0].route_tag));
                   3503:            break;
                   3504:          case OSPF_NETWORK_LSA:
                   3505:          case OSPF_ASBR_SUMMARY_LSA:
                   3506: #ifdef HAVE_OPAQUE_LSA
                   3507:          case OSPF_OPAQUE_LINK_LSA:
                   3508:          case OSPF_OPAQUE_AREA_LSA:
                   3509:          case OSPF_OPAQUE_AS_LSA:
                   3510: #endif /* HAVE_OPAQUE_LSA */
                   3511:          default:
                   3512:            break;
                   3513:          }
                   3514:        vty_out (vty, VTY_NEWLINE);
                   3515:       }
                   3516: 
                   3517:   return 0;
                   3518: }
                   3519: 
                   3520: static const char *show_database_desc[] =
                   3521: {
                   3522:   "unknown",
                   3523:   "Router Link States",
                   3524:   "Net Link States",
                   3525:   "Summary Link States",
                   3526:   "ASBR-Summary Link States",
                   3527:   "AS External Link States",
                   3528:   "Group Membership LSA",
                   3529:   "NSSA-external Link States",
                   3530: #ifdef HAVE_OPAQUE_LSA
                   3531:   "Type-8 LSA",
                   3532:   "Link-Local Opaque-LSA",
                   3533:   "Area-Local Opaque-LSA",
                   3534:   "AS-external Opaque-LSA",
                   3535: #endif /* HAVE_OPAQUE_LSA */
                   3536: };
                   3537: 
                   3538: static const char *show_database_header[] =
                   3539: {
                   3540:   "",
                   3541:   "Link ID         ADV Router      Age  Seq#       CkSum  Link count",
                   3542:   "Link ID         ADV Router      Age  Seq#       CkSum",
                   3543:   "Link ID         ADV Router      Age  Seq#       CkSum  Route",
                   3544:   "Link ID         ADV Router      Age  Seq#       CkSum",
                   3545:   "Link ID         ADV Router      Age  Seq#       CkSum  Route",
                   3546:   " --- header for Group Member ----",
                   3547:   "Link ID         ADV Router      Age  Seq#       CkSum  Route",
                   3548: #ifdef HAVE_OPAQUE_LSA
                   3549:   " --- type-8 ---",
                   3550:   "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
                   3551:   "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
                   3552:   "Opaque-Type/Id  ADV Router      Age  Seq#       CkSum",
                   3553: #endif /* HAVE_OPAQUE_LSA */
                   3554: };
                   3555: 
                   3556: static void
                   3557: show_ip_ospf_database_header (struct vty *vty, struct ospf_lsa *lsa)
                   3558: {
                   3559:   struct router_lsa *rlsa = (struct router_lsa*) lsa->data;
                   3560:   
                   3561:   vty_out (vty, "  LS age: %d%s", LS_AGE (lsa), VTY_NEWLINE);
                   3562:   vty_out (vty, "  Options: 0x%-2x : %s%s", 
                   3563:            lsa->data->options,
                   3564:            ospf_options_dump(lsa->data->options), 
                   3565:            VTY_NEWLINE);
                   3566:   vty_out (vty, "  LS Flags: 0x%-2x %s%s",
                   3567:            lsa->flags,
                   3568:            ((lsa->flags & OSPF_LSA_LOCAL_XLT) ? "(Translated from Type-7)" : ""),
                   3569:            VTY_NEWLINE);
                   3570: 
                   3571:   if (lsa->data->type == OSPF_ROUTER_LSA)
                   3572:     {
                   3573:       vty_out (vty, "  Flags: 0x%x" , rlsa->flags);
                   3574: 
                   3575:       if (rlsa->flags)
                   3576:        vty_out (vty, " :%s%s%s%s",
                   3577:                 IS_ROUTER_LSA_BORDER (rlsa) ? " ABR" : "",
                   3578:                 IS_ROUTER_LSA_EXTERNAL (rlsa) ? " ASBR" : "",
                   3579:                 IS_ROUTER_LSA_VIRTUAL (rlsa) ? " VL-endpoint" : "",
                   3580:                 IS_ROUTER_LSA_SHORTCUT (rlsa) ? " Shortcut" : "");
                   3581: 
                   3582:       vty_out (vty, "%s", VTY_NEWLINE);
                   3583:     }
                   3584:   vty_out (vty, "  LS Type: %s%s",
                   3585:            LOOKUP (ospf_lsa_type_msg, lsa->data->type), VTY_NEWLINE);
                   3586:   vty_out (vty, "  Link State ID: %s %s%s", inet_ntoa (lsa->data->id),
                   3587:            LOOKUP (ospf_link_state_id_type_msg, lsa->data->type), VTY_NEWLINE);
                   3588:   vty_out (vty, "  Advertising Router: %s%s",
                   3589:            inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
                   3590:   vty_out (vty, "  LS Seq Number: %08lx%s", (u_long)ntohl (lsa->data->ls_seqnum),
                   3591:            VTY_NEWLINE);
                   3592:   vty_out (vty, "  Checksum: 0x%04x%s", ntohs (lsa->data->checksum),
                   3593:            VTY_NEWLINE);
                   3594:   vty_out (vty, "  Length: %d%s", ntohs (lsa->data->length), VTY_NEWLINE);
                   3595: }
                   3596: 
                   3597: const char *link_type_desc[] =
                   3598: {
                   3599:   "(null)",
                   3600:   "another Router (point-to-point)",
                   3601:   "a Transit Network",
                   3602:   "Stub Network",
                   3603:   "a Virtual Link",
                   3604: };
                   3605: 
                   3606: const char *link_id_desc[] =
                   3607: {
                   3608:   "(null)",
                   3609:   "Neighboring Router ID",
                   3610:   "Designated Router address",
                   3611:   "Net",
                   3612:   "Neighboring Router ID",
                   3613: };
                   3614: 
                   3615: const char *link_data_desc[] =
                   3616: {
                   3617:   "(null)",
                   3618:   "Router Interface address",
                   3619:   "Router Interface address",
                   3620:   "Network Mask",
                   3621:   "Router Interface address",
                   3622: };
                   3623: 
                   3624: /* Show router-LSA each Link information. */
                   3625: static void
                   3626: show_ip_ospf_database_router_links (struct vty *vty,
                   3627:                                     struct router_lsa *rl)
                   3628: {
                   3629:   int len, i, type;
                   3630: 
                   3631:   len = ntohs (rl->header.length) - 4;
                   3632:   for (i = 0; i < ntohs (rl->links) && len > 0; len -= 12, i++)
                   3633:     {
                   3634:       type = rl->link[i].type;
                   3635: 
                   3636:       vty_out (vty, "    Link connected to: %s%s",
                   3637:               link_type_desc[type], VTY_NEWLINE);
                   3638:       vty_out (vty, "     (Link ID) %s: %s%s", link_id_desc[type],
                   3639:               inet_ntoa (rl->link[i].link_id), VTY_NEWLINE);
                   3640:       vty_out (vty, "     (Link Data) %s: %s%s", link_data_desc[type],
                   3641:               inet_ntoa (rl->link[i].link_data), VTY_NEWLINE);
                   3642:       vty_out (vty, "      Number of TOS metrics: 0%s", VTY_NEWLINE);
                   3643:       vty_out (vty, "       TOS 0 Metric: %d%s",
                   3644:               ntohs (rl->link[i].metric), VTY_NEWLINE);
                   3645:       vty_out (vty, "%s", VTY_NEWLINE);
                   3646:     }
                   3647: }
                   3648: 
                   3649: /* Show router-LSA detail information. */
                   3650: static int
                   3651: show_router_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
                   3652: {
                   3653:   if (lsa != NULL)
                   3654:     {
                   3655:       struct router_lsa *rl = (struct router_lsa *) lsa->data;
                   3656: 
                   3657:       show_ip_ospf_database_header (vty, lsa);
                   3658:           
                   3659:       vty_out (vty, "   Number of Links: %d%s%s", ntohs (rl->links),
                   3660:               VTY_NEWLINE, VTY_NEWLINE);
                   3661: 
                   3662:       show_ip_ospf_database_router_links (vty, rl);
                   3663:       vty_out (vty, "%s", VTY_NEWLINE);
                   3664:     }
                   3665: 
                   3666:   return 0;
                   3667: }
                   3668: 
                   3669: /* Show network-LSA detail information. */
                   3670: static int
                   3671: show_network_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
                   3672: {
                   3673:   int length, i;
                   3674: 
                   3675:   if (lsa != NULL)
                   3676:     {
                   3677:       struct network_lsa *nl = (struct network_lsa *) lsa->data;
                   3678: 
                   3679:       show_ip_ospf_database_header (vty, lsa);
                   3680: 
                   3681:       vty_out (vty, "  Network Mask: /%d%s",
                   3682:               ip_masklen (nl->mask), VTY_NEWLINE);
                   3683: 
                   3684:       length = ntohs (lsa->data->length) - OSPF_LSA_HEADER_SIZE - 4;
                   3685: 
                   3686:       for (i = 0; length > 0; i++, length -= 4)
                   3687:        vty_out (vty, "        Attached Router: %s%s",
                   3688:                 inet_ntoa (nl->routers[i]), VTY_NEWLINE);
                   3689: 
                   3690:       vty_out (vty, "%s", VTY_NEWLINE);
                   3691:     }
                   3692: 
                   3693:   return 0;
                   3694: }
                   3695: 
                   3696: /* Show summary-LSA detail information. */
                   3697: static int
                   3698: show_summary_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
                   3699: {
                   3700:   if (lsa != NULL)
                   3701:     {
                   3702:       struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
                   3703: 
                   3704:       show_ip_ospf_database_header (vty, lsa);
                   3705: 
                   3706:       vty_out (vty, "  Network Mask: /%d%s", ip_masklen (sl->mask),
                   3707:               VTY_NEWLINE);
                   3708:       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
                   3709:               VTY_NEWLINE);
                   3710:          vty_out (vty, "%s", VTY_NEWLINE);
                   3711:     }
                   3712: 
                   3713:   return 0;
                   3714: }
                   3715: 
                   3716: /* Show summary-ASBR-LSA detail information. */
                   3717: static int
                   3718: show_summary_asbr_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
                   3719: {
                   3720:   if (lsa != NULL)
                   3721:     {
                   3722:       struct summary_lsa *sl = (struct summary_lsa *) lsa->data;
                   3723: 
                   3724:       show_ip_ospf_database_header (vty, lsa);
                   3725: 
                   3726:       vty_out (vty, "  Network Mask: /%d%s",
                   3727:               ip_masklen (sl->mask), VTY_NEWLINE);
                   3728:       vty_out (vty, "        TOS: 0  Metric: %d%s", GET_METRIC (sl->metric),
                   3729:               VTY_NEWLINE);
                   3730:          vty_out (vty, "%s", VTY_NEWLINE);
                   3731:     }
                   3732: 
                   3733:   return 0;
                   3734: }
                   3735: 
                   3736: /* Show AS-external-LSA detail information. */
                   3737: static int
                   3738: show_as_external_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
                   3739: {
                   3740:   if (lsa != NULL)
                   3741:     {
                   3742:       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
                   3743: 
                   3744:       show_ip_ospf_database_header (vty, lsa);
                   3745: 
                   3746:       vty_out (vty, "  Network Mask: /%d%s",
                   3747:               ip_masklen (al->mask), VTY_NEWLINE);
                   3748:       vty_out (vty, "        Metric Type: %s%s",
                   3749:               IS_EXTERNAL_METRIC (al->e[0].tos) ?
                   3750:               "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
                   3751:       vty_out (vty, "        TOS: 0%s", VTY_NEWLINE);
                   3752:       vty_out (vty, "        Metric: %d%s",
                   3753:               GET_METRIC (al->e[0].metric), VTY_NEWLINE);
                   3754:       vty_out (vty, "        Forward Address: %s%s",
                   3755:               inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
                   3756: 
                   3757:       vty_out (vty, "        External Route Tag: %lu%s%s",
                   3758:               (u_long)ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
                   3759:     }
                   3760: 
                   3761:   return 0;
                   3762: }
                   3763: 
                   3764: /* N.B. This function currently seems to be unused. */
                   3765: static int
                   3766: show_as_external_lsa_stdvty (struct ospf_lsa *lsa)
                   3767: {
                   3768:   struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
                   3769: 
                   3770:   /* show_ip_ospf_database_header (vty, lsa); */
                   3771: 
                   3772:   zlog_debug( "  Network Mask: /%d%s",
                   3773:             ip_masklen (al->mask), "\n");
                   3774:   zlog_debug( "        Metric Type: %s%s",
                   3775:             IS_EXTERNAL_METRIC (al->e[0].tos) ?
                   3776:             "2 (Larger than any link state path)" : "1", "\n");
                   3777:   zlog_debug( "        TOS: 0%s", "\n");
                   3778:   zlog_debug( "        Metric: %d%s",
                   3779:             GET_METRIC (al->e[0].metric), "\n");
                   3780:   zlog_debug( "        Forward Address: %s%s",
                   3781:             inet_ntoa (al->e[0].fwd_addr), "\n");
                   3782: 
                   3783:   zlog_debug( "        External Route Tag: %u%s%s",
                   3784:             ntohl (al->e[0].route_tag), "\n", "\n");
                   3785: 
                   3786:   return 0;
                   3787: }
                   3788: 
                   3789: /* Show AS-NSSA-LSA detail information. */
                   3790: static int
                   3791: show_as_nssa_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
                   3792: {
                   3793:   if (lsa != NULL)
                   3794:     {
                   3795:       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
                   3796: 
                   3797:       show_ip_ospf_database_header (vty, lsa);
                   3798: 
                   3799:       vty_out (vty, "  Network Mask: /%d%s",
                   3800:               ip_masklen (al->mask), VTY_NEWLINE);
                   3801:       vty_out (vty, "        Metric Type: %s%s",
                   3802:               IS_EXTERNAL_METRIC (al->e[0].tos) ?
                   3803:               "2 (Larger than any link state path)" : "1", VTY_NEWLINE);
                   3804:       vty_out (vty, "        TOS: 0%s", VTY_NEWLINE);
                   3805:       vty_out (vty, "        Metric: %d%s",
                   3806:               GET_METRIC (al->e[0].metric), VTY_NEWLINE);
                   3807:       vty_out (vty, "        NSSA: Forward Address: %s%s",
                   3808:               inet_ntoa (al->e[0].fwd_addr), VTY_NEWLINE);
                   3809: 
                   3810:       vty_out (vty, "        External Route Tag: %u%s%s",
                   3811:               ntohl (al->e[0].route_tag), VTY_NEWLINE, VTY_NEWLINE);
                   3812:     }
                   3813: 
                   3814:   return 0;
                   3815: }
                   3816: 
                   3817: static int
                   3818: show_func_dummy (struct vty *vty, struct ospf_lsa *lsa)
                   3819: {
                   3820:   return 0;
                   3821: }
                   3822: 
                   3823: #ifdef HAVE_OPAQUE_LSA
                   3824: static int
                   3825: show_opaque_lsa_detail (struct vty *vty, struct ospf_lsa *lsa)
                   3826: {
                   3827:   if (lsa != NULL)
                   3828:     {
                   3829:       show_ip_ospf_database_header (vty, lsa);
                   3830:       show_opaque_info_detail (vty, lsa);
                   3831: 
                   3832:       vty_out (vty, "%s", VTY_NEWLINE);
                   3833:     }
                   3834:   return 0;
                   3835: }
                   3836: #endif /* HAVE_OPAQUE_LSA */
                   3837: 
                   3838: int (*show_function[])(struct vty *, struct ospf_lsa *) =
                   3839: {
                   3840:   NULL,
                   3841:   show_router_lsa_detail,
                   3842:   show_network_lsa_detail,
                   3843:   show_summary_lsa_detail,
                   3844:   show_summary_asbr_lsa_detail,
                   3845:   show_as_external_lsa_detail,
                   3846:   show_func_dummy,
                   3847:   show_as_nssa_lsa_detail,  /* almost same as external */
                   3848: #ifdef HAVE_OPAQUE_LSA
                   3849:   NULL,                                /* type-8 */
                   3850:   show_opaque_lsa_detail,
                   3851:   show_opaque_lsa_detail,
                   3852:   show_opaque_lsa_detail,
                   3853: #endif /* HAVE_OPAQUE_LSA */
                   3854: };
                   3855: 
                   3856: static void
                   3857: show_lsa_prefix_set (struct vty *vty, struct prefix_ls *lp, struct in_addr *id,
                   3858:                     struct in_addr *adv_router)
                   3859: {
                   3860:   memset (lp, 0, sizeof (struct prefix_ls));
                   3861:   lp->family = 0;
                   3862:   if (id == NULL)
                   3863:     lp->prefixlen = 0;
                   3864:   else if (adv_router == NULL)
                   3865:     {
                   3866:       lp->prefixlen = 32;
                   3867:       lp->id = *id;
                   3868:     }
                   3869:   else
                   3870:     {
                   3871:       lp->prefixlen = 64;
                   3872:       lp->id = *id;
                   3873:       lp->adv_router = *adv_router;
                   3874:     }
                   3875: }
                   3876: 
                   3877: static void
                   3878: show_lsa_detail_proc (struct vty *vty, struct route_table *rt,
                   3879:                      struct in_addr *id, struct in_addr *adv_router)
                   3880: {
                   3881:   struct prefix_ls lp;
                   3882:   struct route_node *rn, *start;
                   3883:   struct ospf_lsa *lsa;
                   3884: 
                   3885:   show_lsa_prefix_set (vty, &lp, id, adv_router);
                   3886:   start = route_node_get (rt, (struct prefix *) &lp);
                   3887:   if (start)
                   3888:     {
                   3889:       route_lock_node (start);
                   3890:       for (rn = start; rn; rn = route_next_until (rn, start))
                   3891:        if ((lsa = rn->info))
                   3892:          {
                   3893:            if (show_function[lsa->data->type] != NULL)
                   3894:              show_function[lsa->data->type] (vty, lsa);
                   3895:          }
                   3896:       route_unlock_node (start);
                   3897:     }
                   3898: }
                   3899: 
                   3900: /* Show detail LSA information
                   3901:    -- if id is NULL then show all LSAs. */
                   3902: static void
                   3903: show_lsa_detail (struct vty *vty, struct ospf *ospf, int type,
                   3904:                 struct in_addr *id, struct in_addr *adv_router)
                   3905: {
                   3906:   struct listnode *node;
                   3907:   struct ospf_area *area;
                   3908:   
                   3909:   switch (type)
                   3910:     {
                   3911:     case OSPF_AS_EXTERNAL_LSA:
                   3912: #ifdef HAVE_OPAQUE_LSA
                   3913:     case OSPF_OPAQUE_AS_LSA:
                   3914: #endif /* HAVE_OPAQUE_LSA */
                   3915:       vty_out (vty, "                %s %s%s",
                   3916:                show_database_desc[type],
                   3917:                VTY_NEWLINE, VTY_NEWLINE);
                   3918:       show_lsa_detail_proc (vty, AS_LSDB (ospf, type), id, adv_router);
                   3919:       break;
                   3920:     default:
                   3921:       for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
                   3922:         {
                   3923:           vty_out (vty, "%s                %s (Area %s)%s%s",
                   3924:                    VTY_NEWLINE, show_database_desc[type],
                   3925:                    ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
                   3926:           show_lsa_detail_proc (vty, AREA_LSDB (area, type), id, adv_router);
                   3927:         }
                   3928:       break;
                   3929:     }
                   3930: }
                   3931: 
                   3932: static void
                   3933: show_lsa_detail_adv_router_proc (struct vty *vty, struct route_table *rt,
                   3934:                                 struct in_addr *adv_router)
                   3935: {
                   3936:   struct route_node *rn;
                   3937:   struct ospf_lsa *lsa;
                   3938: 
                   3939:   for (rn = route_top (rt); rn; rn = route_next (rn))
                   3940:     if ((lsa = rn->info))
                   3941:       if (IPV4_ADDR_SAME (adv_router, &lsa->data->adv_router))
                   3942:        {
                   3943:          if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
                   3944:            continue;
                   3945:          if (show_function[lsa->data->type] != NULL)
                   3946:            show_function[lsa->data->type] (vty, lsa);
                   3947:        }
                   3948: }
                   3949: 
                   3950: /* Show detail LSA information. */
                   3951: static void
                   3952: show_lsa_detail_adv_router (struct vty *vty, struct ospf *ospf, int type,
                   3953:                            struct in_addr *adv_router)
                   3954: {
                   3955:   struct listnode *node;
                   3956:   struct ospf_area *area;
                   3957: 
                   3958:   switch (type)
                   3959:     {
                   3960:     case OSPF_AS_EXTERNAL_LSA:
                   3961: #ifdef HAVE_OPAQUE_LSA
                   3962:     case OSPF_OPAQUE_AS_LSA:
                   3963: #endif /* HAVE_OPAQUE_LSA */
                   3964:       vty_out (vty, "                %s %s%s",
                   3965:                show_database_desc[type],
                   3966:                VTY_NEWLINE, VTY_NEWLINE);
                   3967:       show_lsa_detail_adv_router_proc (vty, AS_LSDB (ospf, type),
                   3968:                                        adv_router);
                   3969:       break;
                   3970:     default:
                   3971:       for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
                   3972:         {
                   3973:           vty_out (vty, "%s                %s (Area %s)%s%s",
                   3974:                    VTY_NEWLINE, show_database_desc[type],
                   3975:                    ospf_area_desc_string (area), VTY_NEWLINE, VTY_NEWLINE);
                   3976:           show_lsa_detail_adv_router_proc (vty, AREA_LSDB (area, type),
                   3977:                                            adv_router);
                   3978:        }
                   3979:       break;
                   3980:     }
                   3981: }
                   3982: 
                   3983: static void
                   3984: show_ip_ospf_database_summary (struct vty *vty, struct ospf *ospf, int self)
                   3985: {
                   3986:   struct ospf_lsa *lsa;
                   3987:   struct route_node *rn;
                   3988:   struct ospf_area *area;
                   3989:   struct listnode *node;
                   3990:   int type;
                   3991: 
                   3992:   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
                   3993:     {
                   3994:       for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
                   3995:        {
                   3996:          switch (type)
                   3997:            {
                   3998:            case OSPF_AS_EXTERNAL_LSA:
                   3999: #ifdef HAVE_OPAQUE_LSA
                   4000:             case OSPF_OPAQUE_AS_LSA:
                   4001: #endif /* HAVE_OPAQUE_LSA */
                   4002:              continue;
                   4003:            default:
                   4004:              break;
                   4005:            }
                   4006:           if (ospf_lsdb_count_self (area->lsdb, type) > 0 ||
                   4007:               (!self && ospf_lsdb_count (area->lsdb, type) > 0))
                   4008:             {
                   4009:               vty_out (vty, "                %s (Area %s)%s%s",
                   4010:                        show_database_desc[type],
                   4011:                       ospf_area_desc_string (area),
                   4012:                        VTY_NEWLINE, VTY_NEWLINE);
                   4013:               vty_out (vty, "%s%s", show_database_header[type], VTY_NEWLINE);
                   4014: 
                   4015:              LSDB_LOOP (AREA_LSDB (area, type), rn, lsa)
                   4016:                show_lsa_summary (vty, lsa, self);
                   4017: 
                   4018:               vty_out (vty, "%s", VTY_NEWLINE);
                   4019:          }
                   4020:        }
                   4021:     }
                   4022: 
                   4023:   for (type = OSPF_MIN_LSA; type < OSPF_MAX_LSA; type++)
                   4024:     {
                   4025:       switch (type)
                   4026:         {
                   4027:           case OSPF_AS_EXTERNAL_LSA:
                   4028: #ifdef HAVE_OPAQUE_LSA
                   4029:           case OSPF_OPAQUE_AS_LSA:
                   4030: #endif /* HAVE_OPAQUE_LSA */
                   4031:             break;
                   4032:           default:
                   4033:             continue;
                   4034:         }
                   4035:       if (ospf_lsdb_count_self (ospf->lsdb, type) ||
                   4036:          (!self && ospf_lsdb_count (ospf->lsdb, type)))
                   4037:         {
                   4038:           vty_out (vty, "                %s%s%s",
                   4039:               show_database_desc[type],
                   4040:               VTY_NEWLINE, VTY_NEWLINE);
                   4041:           vty_out (vty, "%s%s", show_database_header[type],
                   4042:               VTY_NEWLINE);
                   4043: 
                   4044:          LSDB_LOOP (AS_LSDB (ospf, type), rn, lsa)
                   4045:            show_lsa_summary (vty, lsa, self);
                   4046: 
                   4047:           vty_out (vty, "%s", VTY_NEWLINE);
                   4048:         }
                   4049:     }
                   4050: 
                   4051:   vty_out (vty, "%s", VTY_NEWLINE);
                   4052: }
                   4053: 
                   4054: static void
                   4055: show_ip_ospf_database_maxage (struct vty *vty, struct ospf *ospf)
                   4056: {
                   4057:   struct listnode *node;
                   4058:   struct ospf_lsa *lsa;
                   4059: 
                   4060:   vty_out (vty, "%s                MaxAge Link States:%s%s",
                   4061:            VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
                   4062: 
                   4063:   for (ALL_LIST_ELEMENTS_RO (ospf->maxage_lsa, node, lsa))
                   4064:     {
                   4065:       vty_out (vty, "Link type: %d%s", lsa->data->type, VTY_NEWLINE);
                   4066:       vty_out (vty, "Link State ID: %s%s",
                   4067:                inet_ntoa (lsa->data->id), VTY_NEWLINE);
                   4068:       vty_out (vty, "Advertising Router: %s%s",
                   4069:                inet_ntoa (lsa->data->adv_router), VTY_NEWLINE);
                   4070:       vty_out (vty, "LSA lock count: %d%s", lsa->lock, VTY_NEWLINE);
                   4071:       vty_out (vty, "%s", VTY_NEWLINE);
                   4072:     }
                   4073: }
                   4074: 
                   4075: #define OSPF_LSA_TYPE_NSSA_DESC      "NSSA external link state\n"
                   4076: #define OSPF_LSA_TYPE_NSSA_CMD_STR   "|nssa-external"
                   4077: 
                   4078: #ifdef HAVE_OPAQUE_LSA
                   4079: #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC "Link local Opaque-LSA\n"
                   4080: #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC "Link area Opaque-LSA\n"
                   4081: #define OSPF_LSA_TYPE_OPAQUE_AS_DESC   "Link AS Opaque-LSA\n"
                   4082: #define OSPF_LSA_TYPE_OPAQUE_CMD_STR   "|opaque-link|opaque-area|opaque-as"
                   4083: #else /* HAVE_OPAQUE_LSA */
                   4084: #define OSPF_LSA_TYPE_OPAQUE_LINK_DESC ""
                   4085: #define OSPF_LSA_TYPE_OPAQUE_AREA_DESC ""
                   4086: #define OSPF_LSA_TYPE_OPAQUE_AS_DESC   ""
                   4087: #define OSPF_LSA_TYPE_OPAQUE_CMD_STR   ""
                   4088: #endif /* HAVE_OPAQUE_LSA */
                   4089: 
                   4090: #define OSPF_LSA_TYPES_CMD_STR                                                \
                   4091:     "asbr-summary|external|network|router|summary"                            \
                   4092:     OSPF_LSA_TYPE_NSSA_CMD_STR                                                \
                   4093:     OSPF_LSA_TYPE_OPAQUE_CMD_STR
                   4094: 
                   4095: #define OSPF_LSA_TYPES_DESC                                                   \
                   4096:    "ASBR summary link states\n"                                               \
                   4097:    "External link states\n"                                                   \
                   4098:    "Network link states\n"                                                    \
                   4099:    "Router link states\n"                                                     \
                   4100:    "Network summary link states\n"                                            \
                   4101:    OSPF_LSA_TYPE_NSSA_DESC                                                    \
                   4102:    OSPF_LSA_TYPE_OPAQUE_LINK_DESC                                             \
                   4103:    OSPF_LSA_TYPE_OPAQUE_AREA_DESC                                             \
                   4104:    OSPF_LSA_TYPE_OPAQUE_AS_DESC     
                   4105: 
                   4106: DEFUN (show_ip_ospf_database,
                   4107:        show_ip_ospf_database_cmd,
                   4108:        "show ip ospf database",
                   4109:        SHOW_STR
                   4110:        IP_STR
                   4111:        "OSPF information\n"
                   4112:        "Database summary\n")
                   4113: {
                   4114:   struct ospf *ospf;
                   4115:   int type, ret;
                   4116:   struct in_addr id, adv_router;
                   4117: 
                   4118:   ospf = ospf_lookup ();
                   4119:   if (ospf == NULL)
                   4120:     {
                   4121:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   4122:       return CMD_SUCCESS;
                   4123:     }
                   4124: 
                   4125:   vty_out (vty, "%s       OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
                   4126:            inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
                   4127: 
                   4128:   /* Show all LSA. */
                   4129:   if (argc == 0)
                   4130:     {
                   4131:       show_ip_ospf_database_summary (vty, ospf, 0);
                   4132:       return CMD_SUCCESS;
                   4133:     }
                   4134: 
                   4135:   /* Set database type to show. */
                   4136:   if (strncmp (argv[0], "r", 1) == 0)
                   4137:     type = OSPF_ROUTER_LSA;
                   4138:   else if (strncmp (argv[0], "ne", 2) == 0)
                   4139:     type = OSPF_NETWORK_LSA;
                   4140:   else if (strncmp (argv[0], "ns", 2) == 0)
                   4141:     type = OSPF_AS_NSSA_LSA;
                   4142:   else if (strncmp (argv[0], "su", 2) == 0)
                   4143:     type = OSPF_SUMMARY_LSA;
                   4144:   else if (strncmp (argv[0], "a", 1) == 0)
                   4145:     type = OSPF_ASBR_SUMMARY_LSA;
                   4146:   else if (strncmp (argv[0], "e", 1) == 0)
                   4147:     type = OSPF_AS_EXTERNAL_LSA;
                   4148:   else if (strncmp (argv[0], "se", 2) == 0)
                   4149:     {
                   4150:       show_ip_ospf_database_summary (vty, ospf, 1);
                   4151:       return CMD_SUCCESS;
                   4152:     }
                   4153:   else if (strncmp (argv[0], "m", 1) == 0)
                   4154:     {
                   4155:       show_ip_ospf_database_maxage (vty, ospf);
                   4156:       return CMD_SUCCESS;
                   4157:     }
                   4158: #ifdef HAVE_OPAQUE_LSA
                   4159:   else if (strncmp (argv[0], "opaque-l", 8) == 0)
                   4160:     type = OSPF_OPAQUE_LINK_LSA;
                   4161:   else if (strncmp (argv[0], "opaque-ar", 9) == 0)
                   4162:     type = OSPF_OPAQUE_AREA_LSA;
                   4163:   else if (strncmp (argv[0], "opaque-as", 9) == 0)
                   4164:     type = OSPF_OPAQUE_AS_LSA;
                   4165: #endif /* HAVE_OPAQUE_LSA */
                   4166:   else
                   4167:     return CMD_WARNING;
                   4168: 
                   4169:   /* `show ip ospf database LSA'. */
                   4170:   if (argc == 1)
                   4171:     show_lsa_detail (vty, ospf, type, NULL, NULL);
                   4172:   else if (argc >= 2)
                   4173:     {
                   4174:       ret = inet_aton (argv[1], &id);
                   4175:       if (!ret)
                   4176:        return CMD_WARNING;
                   4177:       
                   4178:       /* `show ip ospf database LSA ID'. */
                   4179:       if (argc == 2)
                   4180:        show_lsa_detail (vty, ospf, type, &id, NULL);
                   4181:       /* `show ip ospf database LSA ID adv-router ADV_ROUTER'. */
                   4182:       else if (argc == 3)
                   4183:        {
                   4184:          if (strncmp (argv[2], "s", 1) == 0)
                   4185:            adv_router = ospf->router_id;
                   4186:          else
                   4187:            {
                   4188:              ret = inet_aton (argv[2], &adv_router);
                   4189:              if (!ret)
                   4190:                return CMD_WARNING;
                   4191:            }
                   4192:          show_lsa_detail (vty, ospf, type, &id, &adv_router);
                   4193:        }
                   4194:     }
                   4195: 
                   4196:   return CMD_SUCCESS;
                   4197: }
                   4198: 
                   4199: ALIAS (show_ip_ospf_database,
                   4200:        show_ip_ospf_database_type_cmd,
                   4201:        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR "|max-age|self-originate)",
                   4202:        SHOW_STR
                   4203:        IP_STR
                   4204:        "OSPF information\n"
                   4205:        "Database summary\n"
                   4206:        OSPF_LSA_TYPES_DESC
                   4207:        "LSAs in MaxAge list\n"
                   4208:        "Self-originated link states\n")
                   4209: 
                   4210: ALIAS (show_ip_ospf_database,
                   4211:        show_ip_ospf_database_type_id_cmd,
                   4212:        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D",
                   4213:        SHOW_STR
                   4214:        IP_STR
                   4215:        "OSPF information\n"
                   4216:        "Database summary\n"
                   4217:        OSPF_LSA_TYPES_DESC
                   4218:        "Link State ID (as an IP address)\n")
                   4219: 
                   4220: ALIAS (show_ip_ospf_database,
                   4221:        show_ip_ospf_database_type_id_adv_router_cmd,
                   4222:        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D adv-router A.B.C.D",
                   4223:        SHOW_STR
                   4224:        IP_STR
                   4225:        "OSPF information\n"
                   4226:        "Database summary\n"
                   4227:        OSPF_LSA_TYPES_DESC
                   4228:        "Link State ID (as an IP address)\n"
                   4229:        "Advertising Router link states\n"
                   4230:        "Advertising Router (as an IP address)\n")
                   4231: 
                   4232: ALIAS (show_ip_ospf_database,
                   4233:        show_ip_ospf_database_type_id_self_cmd,
                   4234:        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") A.B.C.D (self-originate|)",
                   4235:        SHOW_STR
                   4236:        IP_STR
                   4237:        "OSPF information\n"
                   4238:        "Database summary\n"
                   4239:        OSPF_LSA_TYPES_DESC
                   4240:        "Link State ID (as an IP address)\n"
                   4241:        "Self-originated link states\n"
                   4242:        "\n")
                   4243: 
                   4244: DEFUN (show_ip_ospf_database_type_adv_router,
                   4245:        show_ip_ospf_database_type_adv_router_cmd,
                   4246:        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") adv-router A.B.C.D",
                   4247:        SHOW_STR
                   4248:        IP_STR
                   4249:        "OSPF information\n"
                   4250:        "Database summary\n"
                   4251:        OSPF_LSA_TYPES_DESC
                   4252:        "Advertising Router link states\n"
                   4253:        "Advertising Router (as an IP address)\n")
                   4254: {
                   4255:   struct ospf *ospf;
                   4256:   int type, ret;
                   4257:   struct in_addr adv_router;
                   4258: 
                   4259:   ospf = ospf_lookup ();
                   4260:   if (ospf == NULL)
                   4261:     {
                   4262:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   4263:       return CMD_SUCCESS;
                   4264:     }
                   4265: 
                   4266:   vty_out (vty, "%s       OSPF Router with ID (%s)%s%s", VTY_NEWLINE,
                   4267:            inet_ntoa (ospf->router_id), VTY_NEWLINE, VTY_NEWLINE);
                   4268: 
                   4269:   if (argc != 2)
                   4270:     return CMD_WARNING;
                   4271: 
                   4272:   /* Set database type to show. */
                   4273:   if (strncmp (argv[0], "r", 1) == 0)
                   4274:     type = OSPF_ROUTER_LSA;
                   4275:   else if (strncmp (argv[0], "ne", 2) == 0)
                   4276:     type = OSPF_NETWORK_LSA;
                   4277:   else if (strncmp (argv[0], "ns", 2) == 0)
                   4278:     type = OSPF_AS_NSSA_LSA;
                   4279:   else if (strncmp (argv[0], "s", 1) == 0)
                   4280:     type = OSPF_SUMMARY_LSA;
                   4281:   else if (strncmp (argv[0], "a", 1) == 0)
                   4282:     type = OSPF_ASBR_SUMMARY_LSA;
                   4283:   else if (strncmp (argv[0], "e", 1) == 0)
                   4284:     type = OSPF_AS_EXTERNAL_LSA;
                   4285: #ifdef HAVE_OPAQUE_LSA
                   4286:   else if (strncmp (argv[0], "opaque-l", 8) == 0)
                   4287:     type = OSPF_OPAQUE_LINK_LSA;
                   4288:   else if (strncmp (argv[0], "opaque-ar", 9) == 0)
                   4289:     type = OSPF_OPAQUE_AREA_LSA;
                   4290:   else if (strncmp (argv[0], "opaque-as", 9) == 0)
                   4291:     type = OSPF_OPAQUE_AS_LSA;
                   4292: #endif /* HAVE_OPAQUE_LSA */
                   4293:   else
                   4294:     return CMD_WARNING;
                   4295: 
                   4296:   /* `show ip ospf database LSA adv-router ADV_ROUTER'. */
                   4297:   if (strncmp (argv[1], "s", 1) == 0)
                   4298:     adv_router = ospf->router_id;
                   4299:   else
                   4300:     {
                   4301:       ret = inet_aton (argv[1], &adv_router);
                   4302:       if (!ret)
                   4303:        return CMD_WARNING;
                   4304:     }
                   4305: 
                   4306:   show_lsa_detail_adv_router (vty, ospf, type, &adv_router);
                   4307: 
                   4308:   return CMD_SUCCESS;
                   4309: }
                   4310: 
                   4311: ALIAS (show_ip_ospf_database_type_adv_router,
                   4312:        show_ip_ospf_database_type_self_cmd,
                   4313:        "show ip ospf database (" OSPF_LSA_TYPES_CMD_STR ") (self-originate|)",
                   4314:        SHOW_STR
                   4315:        IP_STR
                   4316:        "OSPF information\n"
                   4317:        "Database summary\n"
                   4318:        OSPF_LSA_TYPES_DESC
                   4319:        "Self-originated link states\n")
                   4320: 
                   4321: 
                   4322: DEFUN (ip_ospf_authentication_args,
                   4323:        ip_ospf_authentication_args_addr_cmd,
                   4324:        "ip ospf authentication (null|message-digest) A.B.C.D",
                   4325:        "IP Information\n"
                   4326:        "OSPF interface commands\n"
                   4327:        "Enable authentication on this interface\n"
                   4328:        "Use null authentication\n"
                   4329:        "Use message-digest authentication\n"
                   4330:        "Address of interface")
                   4331: {
                   4332:   struct interface *ifp;
                   4333:   struct in_addr addr;
                   4334:   int ret;
                   4335:   struct ospf_if_params *params;
                   4336:   
                   4337:   ifp = vty->index;
                   4338:   params = IF_DEF_PARAMS (ifp);
                   4339: 
                   4340:   if (argc == 2)
                   4341:     {
                   4342:       ret = inet_aton(argv[1], &addr);
                   4343:       if (!ret)
                   4344:        {
                   4345:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4346:                   VTY_NEWLINE);
                   4347:          return CMD_WARNING;
                   4348:        }
                   4349: 
                   4350:       params = ospf_get_if_params (ifp, addr);
                   4351:       ospf_if_update_params (ifp, addr);
                   4352:     }
                   4353: 
                   4354:   /* Handle null authentication */
                   4355:   if ( argv[0][0] == 'n' )
                   4356:     {
                   4357:       SET_IF_PARAM (params, auth_type);
                   4358:       params->auth_type = OSPF_AUTH_NULL;
                   4359:       return CMD_SUCCESS;
                   4360:     }
                   4361: 
                   4362:   /* Handle message-digest authentication */
                   4363:   if ( argv[0][0] == 'm' )
                   4364:     {
                   4365:       SET_IF_PARAM (params, auth_type);
                   4366:       params->auth_type = OSPF_AUTH_CRYPTOGRAPHIC;
                   4367:       return CMD_SUCCESS;
                   4368:     }
                   4369: 
                   4370:   vty_out (vty, "You shouldn't get here!%s", VTY_NEWLINE);
                   4371:   return CMD_WARNING;
                   4372: }
                   4373: 
                   4374: ALIAS (ip_ospf_authentication_args,
                   4375:        ip_ospf_authentication_args_cmd,
                   4376:        "ip ospf authentication (null|message-digest)",
                   4377:        "IP Information\n"
                   4378:        "OSPF interface commands\n"
                   4379:        "Enable authentication on this interface\n"
                   4380:        "Use null authentication\n"
                   4381:        "Use message-digest authentication\n")
                   4382: 
                   4383: DEFUN (ip_ospf_authentication,
                   4384:        ip_ospf_authentication_addr_cmd,
                   4385:        "ip ospf authentication A.B.C.D",
                   4386:        "IP Information\n"
                   4387:        "OSPF interface commands\n"
                   4388:        "Enable authentication on this interface\n"
                   4389:        "Address of interface")
                   4390: {
                   4391:   struct interface *ifp;
                   4392:   struct in_addr addr;
                   4393:   int ret;
                   4394:   struct ospf_if_params *params;
                   4395:   
                   4396:   ifp = vty->index;
                   4397:   params = IF_DEF_PARAMS (ifp);
                   4398: 
                   4399:   if (argc == 1)
                   4400:     {
                   4401:       ret = inet_aton(argv[0], &addr);
                   4402:       if (!ret)
                   4403:        {
                   4404:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4405:                   VTY_NEWLINE);
                   4406:          return CMD_WARNING;
                   4407:        }
                   4408: 
                   4409:       params = ospf_get_if_params (ifp, addr);
                   4410:       ospf_if_update_params (ifp, addr);
                   4411:     }
                   4412:   
                   4413:   SET_IF_PARAM (params, auth_type);
                   4414:   params->auth_type = OSPF_AUTH_SIMPLE;
                   4415: 
                   4416:   return CMD_SUCCESS;
                   4417: }
                   4418: 
                   4419: ALIAS (ip_ospf_authentication,
                   4420:        ip_ospf_authentication_cmd,
                   4421:        "ip ospf authentication",
                   4422:        "IP Information\n"
                   4423:        "OSPF interface commands\n"
                   4424:        "Enable authentication on this interface\n")
                   4425: 
                   4426: DEFUN (no_ip_ospf_authentication,
                   4427:        no_ip_ospf_authentication_addr_cmd,
                   4428:        "no ip ospf authentication A.B.C.D",
                   4429:        NO_STR
                   4430:        "IP Information\n"
                   4431:        "OSPF interface commands\n"
                   4432:        "Enable authentication on this interface\n"
                   4433:        "Address of interface")
                   4434: {
                   4435:   struct interface *ifp;
                   4436:   struct in_addr addr;
                   4437:   int ret;
                   4438:   struct ospf_if_params *params;
                   4439:   
                   4440:   ifp = vty->index;
                   4441:   params = IF_DEF_PARAMS (ifp);
                   4442: 
                   4443:   if (argc == 1)
                   4444:     {
                   4445:       ret = inet_aton(argv[0], &addr);
                   4446:       if (!ret)
                   4447:        {
                   4448:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4449:                   VTY_NEWLINE);
                   4450:          return CMD_WARNING;
                   4451:        }
                   4452: 
                   4453:       params = ospf_lookup_if_params (ifp, addr);
                   4454:       if (params == NULL)
                   4455:        return CMD_SUCCESS;
                   4456:     }
                   4457: 
                   4458:   params->auth_type = OSPF_AUTH_NOTSET;
                   4459:   UNSET_IF_PARAM (params, auth_type);
                   4460:   
                   4461:   if (params != IF_DEF_PARAMS (ifp))
                   4462:     {
                   4463:       ospf_free_if_params (ifp, addr);
                   4464:       ospf_if_update_params (ifp, addr);
                   4465:     }
                   4466:   
                   4467:   return CMD_SUCCESS;
                   4468: }
                   4469: 
                   4470: ALIAS (no_ip_ospf_authentication,
                   4471:        no_ip_ospf_authentication_cmd,
                   4472:        "no ip ospf authentication",
                   4473:        NO_STR
                   4474:        "IP Information\n"
                   4475:        "OSPF interface commands\n"
                   4476:        "Enable authentication on this interface\n")
                   4477: 
                   4478: DEFUN (ip_ospf_authentication_key,
                   4479:        ip_ospf_authentication_key_addr_cmd,
                   4480:        "ip ospf authentication-key AUTH_KEY A.B.C.D",
                   4481:        "IP Information\n"
                   4482:        "OSPF interface commands\n"
                   4483:        "Authentication password (key)\n"
                   4484:        "The OSPF password (key)\n"
                   4485:        "Address of interface")
                   4486: {
                   4487:   struct interface *ifp;
                   4488:   struct in_addr addr;
                   4489:   int ret;
                   4490:   struct ospf_if_params *params;
                   4491:   
                   4492:   ifp = vty->index;
                   4493:   params = IF_DEF_PARAMS (ifp);
                   4494: 
                   4495:   if (argc == 2)
                   4496:     {
                   4497:       ret = inet_aton(argv[1], &addr);
                   4498:       if (!ret)
                   4499:        {
                   4500:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4501:                   VTY_NEWLINE);
                   4502:          return CMD_WARNING;
                   4503:        }
                   4504: 
                   4505:       params = ospf_get_if_params (ifp, addr);
                   4506:       ospf_if_update_params (ifp, addr);
                   4507:     }
                   4508: 
                   4509: 
                   4510:   memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE + 1);
                   4511:   strncpy ((char *) params->auth_simple, argv[0], OSPF_AUTH_SIMPLE_SIZE);
                   4512:   SET_IF_PARAM (params, auth_simple);
                   4513: 
                   4514:   return CMD_SUCCESS;
                   4515: }
                   4516: 
                   4517: ALIAS (ip_ospf_authentication_key,
                   4518:        ip_ospf_authentication_key_cmd,
                   4519:        "ip ospf authentication-key AUTH_KEY",
                   4520:        "IP Information\n"
                   4521:        "OSPF interface commands\n"
                   4522:        "Authentication password (key)\n"
                   4523:        "The OSPF password (key)")
                   4524: 
                   4525: ALIAS (ip_ospf_authentication_key,
                   4526:        ospf_authentication_key_cmd,
                   4527:        "ospf authentication-key AUTH_KEY",
                   4528:        "OSPF interface commands\n"
                   4529:        "Authentication password (key)\n"
                   4530:        "The OSPF password (key)")
                   4531: 
                   4532: DEFUN (no_ip_ospf_authentication_key,
                   4533:        no_ip_ospf_authentication_key_addr_cmd,
                   4534:        "no ip ospf authentication-key A.B.C.D",
                   4535:        NO_STR
                   4536:        "IP Information\n"
                   4537:        "OSPF interface commands\n"
                   4538:        "Authentication password (key)\n"
                   4539:        "Address of interface")
                   4540: {
                   4541:   struct interface *ifp;
                   4542:   struct in_addr addr;
                   4543:   int ret;
                   4544:   struct ospf_if_params *params;
                   4545:   
                   4546:   ifp = vty->index;
                   4547:   params = IF_DEF_PARAMS (ifp);
                   4548: 
                   4549:   if (argc == 1)
                   4550:     {
                   4551:       ret = inet_aton(argv[0], &addr);
                   4552:       if (!ret)
                   4553:        {
                   4554:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4555:                   VTY_NEWLINE);
                   4556:          return CMD_WARNING;
                   4557:        }
                   4558: 
                   4559:       params = ospf_lookup_if_params (ifp, addr);
                   4560:       if (params == NULL)
                   4561:        return CMD_SUCCESS;
                   4562:     }
                   4563: 
                   4564:   memset (params->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE);
                   4565:   UNSET_IF_PARAM (params, auth_simple);
                   4566:   
                   4567:   if (params != IF_DEF_PARAMS (ifp))
                   4568:     {
                   4569:       ospf_free_if_params (ifp, addr);
                   4570:       ospf_if_update_params (ifp, addr);
                   4571:     }
                   4572:   
                   4573:   return CMD_SUCCESS;
                   4574: }
                   4575: 
                   4576: ALIAS (no_ip_ospf_authentication_key,
                   4577:        no_ip_ospf_authentication_key_cmd,
                   4578:        "no ip ospf authentication-key",
                   4579:        NO_STR
                   4580:        "IP Information\n"
                   4581:        "OSPF interface commands\n"
                   4582:        "Authentication password (key)\n")
                   4583: 
                   4584: ALIAS (no_ip_ospf_authentication_key,
                   4585:        no_ospf_authentication_key_cmd,
                   4586:        "no ospf authentication-key",
                   4587:        NO_STR
                   4588:        "OSPF interface commands\n"
                   4589:        "Authentication password (key)\n")
                   4590: 
                   4591: DEFUN (ip_ospf_message_digest_key,
                   4592:        ip_ospf_message_digest_key_addr_cmd,
                   4593:        "ip ospf message-digest-key <1-255> md5 KEY A.B.C.D",
                   4594:        "IP Information\n"
                   4595:        "OSPF interface commands\n"
                   4596:        "Message digest authentication password (key)\n"
                   4597:        "Key ID\n"
                   4598:        "Use MD5 algorithm\n"
                   4599:        "The OSPF password (key)"
                   4600:        "Address of interface")
                   4601: {
                   4602:   struct interface *ifp;
                   4603:   struct crypt_key *ck;
                   4604:   u_char key_id;
                   4605:   struct in_addr addr;
                   4606:   int ret;
                   4607:   struct ospf_if_params *params;
                   4608:   
                   4609:   ifp = vty->index;
                   4610:   params = IF_DEF_PARAMS (ifp);
                   4611: 
                   4612:   if (argc == 3)
                   4613:     {
                   4614:       ret = inet_aton(argv[2], &addr);
                   4615:       if (!ret)
                   4616:        {
                   4617:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4618:                   VTY_NEWLINE);
                   4619:          return CMD_WARNING;
                   4620:        }
                   4621: 
                   4622:       params = ospf_get_if_params (ifp, addr);
                   4623:       ospf_if_update_params (ifp, addr);
                   4624:     }
                   4625: 
                   4626:   key_id = strtol (argv[0], NULL, 10);
                   4627:   if (ospf_crypt_key_lookup (params->auth_crypt, key_id) != NULL)
                   4628:     {
                   4629:       vty_out (vty, "OSPF: Key %d already exists%s", key_id, VTY_NEWLINE);
                   4630:       return CMD_WARNING;
                   4631:     }
                   4632: 
                   4633:   ck = ospf_crypt_key_new ();
                   4634:   ck->key_id = (u_char) key_id;
                   4635:   memset (ck->auth_key, 0, OSPF_AUTH_MD5_SIZE+1);
                   4636:   strncpy ((char *) ck->auth_key, argv[1], OSPF_AUTH_MD5_SIZE);
                   4637: 
                   4638:   ospf_crypt_key_add (params->auth_crypt, ck);
                   4639:   SET_IF_PARAM (params, auth_crypt);
                   4640:   
                   4641:   return CMD_SUCCESS;
                   4642: }
                   4643: 
                   4644: ALIAS (ip_ospf_message_digest_key,
                   4645:        ip_ospf_message_digest_key_cmd,
                   4646:        "ip ospf message-digest-key <1-255> md5 KEY",
                   4647:        "IP Information\n"
                   4648:        "OSPF interface commands\n"
                   4649:        "Message digest authentication password (key)\n"
                   4650:        "Key ID\n"
                   4651:        "Use MD5 algorithm\n"
                   4652:        "The OSPF password (key)")
                   4653: 
                   4654: ALIAS (ip_ospf_message_digest_key,
                   4655:        ospf_message_digest_key_cmd,
                   4656:        "ospf message-digest-key <1-255> md5 KEY",
                   4657:        "OSPF interface commands\n"
                   4658:        "Message digest authentication password (key)\n"
                   4659:        "Key ID\n"
                   4660:        "Use MD5 algorithm\n"
                   4661:        "The OSPF password (key)")
                   4662: 
                   4663: DEFUN (no_ip_ospf_message_digest_key,
                   4664:        no_ip_ospf_message_digest_key_addr_cmd,
                   4665:        "no ip ospf message-digest-key <1-255> A.B.C.D",
                   4666:        NO_STR
                   4667:        "IP Information\n"
                   4668:        "OSPF interface commands\n"
                   4669:        "Message digest authentication password (key)\n"
                   4670:        "Key ID\n"
                   4671:        "Address of interface")
                   4672: {
                   4673:   struct interface *ifp;
                   4674:   struct crypt_key *ck;
                   4675:   int key_id;
                   4676:   struct in_addr addr;
                   4677:   int ret;
                   4678:   struct ospf_if_params *params;
                   4679:   
                   4680:   ifp = vty->index;
                   4681:   params = IF_DEF_PARAMS (ifp);
                   4682: 
                   4683:   if (argc == 2)
                   4684:     {
                   4685:       ret = inet_aton(argv[1], &addr);
                   4686:       if (!ret)
                   4687:        {
                   4688:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4689:                   VTY_NEWLINE);
                   4690:          return CMD_WARNING;
                   4691:        }
                   4692: 
                   4693:       params = ospf_lookup_if_params (ifp, addr);
                   4694:       if (params == NULL)
                   4695:        return CMD_SUCCESS;
                   4696:     }
                   4697: 
                   4698:   key_id = strtol (argv[0], NULL, 10);
                   4699:   ck = ospf_crypt_key_lookup (params->auth_crypt, key_id);
                   4700:   if (ck == NULL)
                   4701:     {
                   4702:       vty_out (vty, "OSPF: Key %d does not exist%s", key_id, VTY_NEWLINE);
                   4703:       return CMD_WARNING;
                   4704:     }
                   4705: 
                   4706:   ospf_crypt_key_delete (params->auth_crypt, key_id);
                   4707: 
                   4708:   if (params != IF_DEF_PARAMS (ifp))
                   4709:     {
                   4710:       ospf_free_if_params (ifp, addr);
                   4711:       ospf_if_update_params (ifp, addr);
                   4712:     }
                   4713:   
                   4714:   return CMD_SUCCESS;
                   4715: }
                   4716: 
                   4717: ALIAS (no_ip_ospf_message_digest_key,
                   4718:        no_ip_ospf_message_digest_key_cmd,
                   4719:        "no ip ospf message-digest-key <1-255>",
                   4720:        NO_STR
                   4721:        "IP Information\n"
                   4722:        "OSPF interface commands\n"
                   4723:        "Message digest authentication password (key)\n"
                   4724:        "Key ID\n")
                   4725:      
                   4726: ALIAS (no_ip_ospf_message_digest_key,
                   4727:        no_ospf_message_digest_key_cmd,
                   4728:        "no ospf message-digest-key <1-255>",
                   4729:        NO_STR
                   4730:        "OSPF interface commands\n"
                   4731:        "Message digest authentication password (key)\n"
                   4732:        "Key ID\n")
                   4733: 
                   4734: DEFUN (ip_ospf_cost,
                   4735:        ip_ospf_cost_u32_inet4_cmd,
                   4736:        "ip ospf cost <1-65535> A.B.C.D",
                   4737:        "IP Information\n"
                   4738:        "OSPF interface commands\n"
                   4739:        "Interface cost\n"
                   4740:        "Cost\n"
                   4741:        "Address of interface")
                   4742: {
                   4743:   struct interface *ifp = vty->index;
                   4744:   u_int32_t cost;
                   4745:   struct in_addr addr;
                   4746:   int ret;
                   4747:   struct ospf_if_params *params;
                   4748:       
                   4749:   params = IF_DEF_PARAMS (ifp);
                   4750: 
                   4751:   cost = strtol (argv[0], NULL, 10);
                   4752: 
                   4753:   /* cost range is <1-65535>. */
                   4754:   if (cost < 1 || cost > 65535)
                   4755:     {
                   4756:       vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
                   4757:       return CMD_WARNING;
                   4758:     }
                   4759: 
                   4760:   if (argc == 2)
                   4761:     {
                   4762:       ret = inet_aton(argv[1], &addr);
                   4763:       if (!ret)
                   4764:        {
                   4765:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4766:                   VTY_NEWLINE);
                   4767:          return CMD_WARNING;
                   4768:        }
                   4769: 
                   4770:       params = ospf_get_if_params (ifp, addr);
                   4771:       ospf_if_update_params (ifp, addr);
                   4772:     }
                   4773: 
                   4774:   SET_IF_PARAM (params, output_cost_cmd);
                   4775:   params->output_cost_cmd = cost;
                   4776: 
                   4777:   ospf_if_recalculate_output_cost (ifp);
                   4778:     
                   4779:   return CMD_SUCCESS;
                   4780: }
                   4781: 
                   4782: ALIAS (ip_ospf_cost,
                   4783:        ip_ospf_cost_u32_cmd,
                   4784:        "ip ospf cost <1-65535>",
                   4785:        "IP Information\n"
                   4786:        "OSPF interface commands\n"
                   4787:        "Interface cost\n"
                   4788:        "Cost")
                   4789: 
                   4790: ALIAS (ip_ospf_cost,
                   4791:        ospf_cost_u32_cmd,
                   4792:        "ospf cost <1-65535>",
                   4793:        "OSPF interface commands\n"
                   4794:        "Interface cost\n"
                   4795:        "Cost")
                   4796: 
                   4797: ALIAS (ip_ospf_cost,
                   4798:        ospf_cost_u32_inet4_cmd,
                   4799:        "ospf cost <1-65535> A.B.C.D",
                   4800:        "OSPF interface commands\n"
                   4801:        "Interface cost\n"
                   4802:        "Cost\n"
                   4803:        "Address of interface")
                   4804: 
                   4805: DEFUN (no_ip_ospf_cost,
                   4806:        no_ip_ospf_cost_inet4_cmd,
                   4807:        "no ip ospf cost A.B.C.D",
                   4808:        NO_STR
                   4809:        "IP Information\n"
                   4810:        "OSPF interface commands\n"
                   4811:        "Interface cost\n"
                   4812:        "Address of interface")
                   4813: {
                   4814:   struct interface *ifp = vty->index;
                   4815:   struct in_addr addr;
                   4816:   int ret;
                   4817:   struct ospf_if_params *params;
                   4818:   
                   4819:   ifp = vty->index;
                   4820:   params = IF_DEF_PARAMS (ifp);
                   4821: 
                   4822:   if (argc == 1)
                   4823:     {
                   4824:       ret = inet_aton(argv[0], &addr);
                   4825:       if (!ret)
                   4826:        {
                   4827:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4828:                   VTY_NEWLINE);
                   4829:          return CMD_WARNING;
                   4830:        }
                   4831: 
                   4832:       params = ospf_lookup_if_params (ifp, addr);
                   4833:       if (params == NULL)
                   4834:        return CMD_SUCCESS;
                   4835:     }
                   4836: 
                   4837:   UNSET_IF_PARAM (params, output_cost_cmd);
                   4838: 
                   4839:   if (params != IF_DEF_PARAMS (ifp))
                   4840:     {
                   4841:       ospf_free_if_params (ifp, addr);
                   4842:       ospf_if_update_params (ifp, addr);
                   4843:     }
                   4844: 
                   4845:   ospf_if_recalculate_output_cost (ifp);
                   4846:   
                   4847:   return CMD_SUCCESS;
                   4848: }
                   4849: 
                   4850: ALIAS (no_ip_ospf_cost,
                   4851:        no_ip_ospf_cost_cmd,
                   4852:        "no ip ospf cost",
                   4853:        NO_STR
                   4854:        "IP Information\n"
                   4855:        "OSPF interface commands\n"
                   4856:        "Interface cost\n")
                   4857: 
                   4858: ALIAS (no_ip_ospf_cost,
                   4859:        no_ospf_cost_cmd,
                   4860:        "no ospf cost",
                   4861:        NO_STR
                   4862:        "OSPF interface commands\n"
                   4863:        "Interface cost\n")
                   4864: 
                   4865: ALIAS (no_ip_ospf_cost,
                   4866:        no_ospf_cost_inet4_cmd,
                   4867:        "no ospf cost A.B.C.D",
                   4868:        NO_STR
                   4869:        "OSPF interface commands\n"
                   4870:        "Interface cost\n"
                   4871:        "Address of interface")
                   4872: 
                   4873: DEFUN (no_ip_ospf_cost2,
                   4874:        no_ip_ospf_cost_u32_cmd,
                   4875:        "no ip ospf cost <1-65535>",
                   4876:        NO_STR
                   4877:        "IP Information\n"
                   4878:        "OSPF interface commands\n"
                   4879:        "Interface cost\n"
                   4880:        "Cost")
                   4881: {
                   4882:   struct interface *ifp = vty->index;
                   4883:   struct in_addr addr;
                   4884:   u_int32_t cost;
                   4885:   int ret;
                   4886:   struct ospf_if_params *params;
                   4887: 
                   4888:   ifp = vty->index;
                   4889:   params = IF_DEF_PARAMS (ifp);
                   4890: 
                   4891:   /* According to the semantics we are mimicking "no ip ospf cost N" is
                   4892:    * always treated as "no ip ospf cost" regardless of the actual value
                   4893:    * of N already configured for the interface. Thus the first argument
                   4894:    * is always checked to be a number, but is ignored after that.
                   4895:    */
                   4896:   cost = strtol (argv[0], NULL, 10);
                   4897:   if (cost < 1 || cost > 65535)
                   4898:     {
                   4899:       vty_out (vty, "Interface output cost is invalid%s", VTY_NEWLINE);
                   4900:       return CMD_WARNING;
                   4901:     }
                   4902: 
                   4903:   if (argc == 2)
                   4904:     {
                   4905:       ret = inet_aton(argv[1], &addr);
                   4906:       if (!ret)
                   4907:        {
                   4908:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4909:                   VTY_NEWLINE);
                   4910:          return CMD_WARNING;
                   4911:        }
                   4912: 
                   4913:       params = ospf_lookup_if_params (ifp, addr);
                   4914:       if (params == NULL)
                   4915:        return CMD_SUCCESS;
                   4916:     }
                   4917: 
                   4918:   UNSET_IF_PARAM (params, output_cost_cmd);
                   4919: 
                   4920:   if (params != IF_DEF_PARAMS (ifp))
                   4921:     {
                   4922:       ospf_free_if_params (ifp, addr);
                   4923:       ospf_if_update_params (ifp, addr);
                   4924:     }
                   4925: 
                   4926:   ospf_if_recalculate_output_cost (ifp);
                   4927: 
                   4928:   return CMD_SUCCESS;
                   4929: }
                   4930: 
                   4931: ALIAS (no_ip_ospf_cost2,
                   4932:        no_ospf_cost_u32_cmd,
                   4933:        "no ospf cost <1-65535>",
                   4934:        NO_STR
                   4935:        "OSPF interface commands\n"
                   4936:        "Interface cost\n"
                   4937:        "Cost")
                   4938: 
                   4939: ALIAS (no_ip_ospf_cost2,
                   4940:        no_ip_ospf_cost_u32_inet4_cmd,
                   4941:        "no ip ospf cost <1-65535> A.B.C.D",
                   4942:        NO_STR
                   4943:        "IP Information\n"
                   4944:        "OSPF interface commands\n"
                   4945:        "Interface cost\n"
                   4946:        "Cost\n"
                   4947:        "Address of interface")
                   4948: 
                   4949: ALIAS (no_ip_ospf_cost2,
                   4950:        no_ospf_cost_u32_inet4_cmd,
                   4951:        "no ospf cost <1-65535> A.B.C.D",
                   4952:        NO_STR
                   4953:        "OSPF interface commands\n"
                   4954:        "Interface cost\n"
                   4955:        "Cost\n"
                   4956:        "Address of interface")
                   4957: 
                   4958: static void
                   4959: ospf_nbr_timer_update (struct ospf_interface *oi)
                   4960: {
                   4961:   struct route_node *rn;
                   4962:   struct ospf_neighbor *nbr;
                   4963: 
                   4964:   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
                   4965:     if ((nbr = rn->info))
                   4966:       {
                   4967:        nbr->v_inactivity = OSPF_IF_PARAM (oi, v_wait);
                   4968:        nbr->v_db_desc = OSPF_IF_PARAM (oi, retransmit_interval);
                   4969:        nbr->v_ls_req = OSPF_IF_PARAM (oi, retransmit_interval);
                   4970:        nbr->v_ls_upd = OSPF_IF_PARAM (oi, retransmit_interval);
                   4971:       }
                   4972: }
                   4973: 
                   4974: static int
                   4975: ospf_vty_dead_interval_set (struct vty *vty, const char *interval_str,
                   4976:                             const char *nbr_str,
                   4977:                             const char *fast_hello_str)
                   4978: {
                   4979:   struct interface *ifp = vty->index;
                   4980:   u_int32_t seconds;
                   4981:   u_char hellomult;
                   4982:   struct in_addr addr;
                   4983:   int ret;
                   4984:   struct ospf_if_params *params;
                   4985:   struct ospf_interface *oi;
                   4986:   struct route_node *rn;
                   4987:       
                   4988:   params = IF_DEF_PARAMS (ifp);
                   4989:   
                   4990:   if (nbr_str)
                   4991:     {
                   4992:       ret = inet_aton(nbr_str, &addr);
                   4993:       if (!ret)
                   4994:        {
                   4995:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   4996:                   VTY_NEWLINE);
                   4997:          return CMD_WARNING;
                   4998:        }
                   4999: 
                   5000:       params = ospf_get_if_params (ifp, addr);
                   5001:       ospf_if_update_params (ifp, addr);
                   5002:     }
                   5003: 
                   5004:   if (interval_str)
                   5005:     {
                   5006:       VTY_GET_INTEGER_RANGE ("Router Dead Interval", seconds, interval_str,
                   5007:                              1, 65535);
                   5008:                              
                   5009:       /* reset fast_hello too, just to be sure */
                   5010:       UNSET_IF_PARAM (params, fast_hello);
                   5011:       params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
                   5012:     }
                   5013:   else if (fast_hello_str)
                   5014:     {
                   5015:       VTY_GET_INTEGER_RANGE ("Hello Multiplier", hellomult, fast_hello_str,
                   5016:                              1, 10);
                   5017:       /* 1s dead-interval with sub-second hellos desired */
                   5018:       seconds = OSPF_ROUTER_DEAD_INTERVAL_MINIMAL;
                   5019:       SET_IF_PARAM (params, fast_hello);
                   5020:       params->fast_hello = hellomult;
                   5021:     }
                   5022:   else
                   5023:     {
                   5024:       vty_out (vty, "Please specify dead-interval or hello-multiplier%s",
                   5025:               VTY_NEWLINE);
                   5026:       return CMD_WARNING;
                   5027:     }
                   5028:     
                   5029:   SET_IF_PARAM (params, v_wait);
                   5030:   params->v_wait = seconds;
                   5031:   
                   5032:   /* Update timer values in neighbor structure. */
                   5033:   if (nbr_str)
                   5034:     {
                   5035:       struct ospf *ospf;
                   5036:       if ((ospf = ospf_lookup()))
                   5037:        {
                   5038:          oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
                   5039:          if (oi)
                   5040:            ospf_nbr_timer_update (oi);
                   5041:        }
                   5042:     }
                   5043:   else
                   5044:     {
                   5045:       for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   5046:        if ((oi = rn->info))
                   5047:          ospf_nbr_timer_update (oi);
                   5048:     }
                   5049: 
                   5050:   return CMD_SUCCESS;
                   5051: }
                   5052: 
                   5053: 
                   5054: DEFUN (ip_ospf_dead_interval,
                   5055:        ip_ospf_dead_interval_addr_cmd,
                   5056:        "ip ospf dead-interval <1-65535> A.B.C.D",
                   5057:        "IP Information\n"
                   5058:        "OSPF interface commands\n"
                   5059:        "Interval after which a neighbor is declared dead\n"
                   5060:        "Seconds\n"
                   5061:        "Address of interface\n")
                   5062: {
                   5063:   if (argc == 2)
                   5064:     return ospf_vty_dead_interval_set (vty, argv[0], argv[1], NULL);
                   5065:   else
                   5066:     return ospf_vty_dead_interval_set (vty, argv[0], NULL, NULL);
                   5067: }
                   5068: 
                   5069: ALIAS (ip_ospf_dead_interval,
                   5070:        ip_ospf_dead_interval_cmd,
                   5071:        "ip ospf dead-interval <1-65535>",
                   5072:        "IP Information\n"
                   5073:        "OSPF interface commands\n"
                   5074:        "Interval after which a neighbor is declared dead\n"
                   5075:        "Seconds\n")
                   5076: 
                   5077: ALIAS (ip_ospf_dead_interval,
                   5078:        ospf_dead_interval_cmd,
                   5079:        "ospf dead-interval <1-65535>",
                   5080:        "OSPF interface commands\n"
                   5081:        "Interval after which a neighbor is declared dead\n"
                   5082:        "Seconds\n")
                   5083: 
                   5084: DEFUN (ip_ospf_dead_interval_minimal,
                   5085:        ip_ospf_dead_interval_minimal_addr_cmd,
                   5086:        "ip ospf dead-interval minimal hello-multiplier <1-10> A.B.C.D",
                   5087:        "IP Information\n"
                   5088:        "OSPF interface commands\n"
                   5089:        "Interval after which a neighbor is declared dead\n"
                   5090:        "Minimal 1s dead-interval with fast sub-second hellos\n"
                   5091:        "Hello multiplier factor\n"
                   5092:        "Number of Hellos to send each second\n"
                   5093:        "Address of interface\n")
                   5094: {
                   5095:   if (argc == 2)
                   5096:     return ospf_vty_dead_interval_set (vty, NULL, argv[1], argv[0]);
                   5097:   else
                   5098:     return ospf_vty_dead_interval_set (vty, NULL, NULL, argv[0]);
                   5099: }
                   5100: 
                   5101: ALIAS (ip_ospf_dead_interval_minimal,
                   5102:        ip_ospf_dead_interval_minimal_cmd,
                   5103:        "ip ospf dead-interval minimal hello-multiplier <1-10>",
                   5104:        "IP Information\n"
                   5105:        "OSPF interface commands\n"
                   5106:        "Interval after which a neighbor is declared dead\n"
                   5107:        "Minimal 1s dead-interval with fast sub-second hellos\n"
                   5108:        "Hello multiplier factor\n"
                   5109:        "Number of Hellos to send each second\n")
                   5110: 
                   5111: DEFUN (no_ip_ospf_dead_interval,
                   5112:        no_ip_ospf_dead_interval_addr_cmd,
                   5113:        "no ip ospf dead-interval A.B.C.D",
                   5114:        NO_STR
                   5115:        "IP Information\n"
                   5116:        "OSPF interface commands\n"
                   5117:        "Interval after which a neighbor is declared dead\n"
                   5118:        "Address of interface")
                   5119: {
                   5120:   struct interface *ifp = vty->index;
                   5121:   struct in_addr addr;
                   5122:   int ret;
                   5123:   struct ospf_if_params *params;
                   5124:   struct ospf_interface *oi;
                   5125:   struct route_node *rn;
                   5126: 
                   5127:   ifp = vty->index;
                   5128:   params = IF_DEF_PARAMS (ifp);
                   5129: 
                   5130:   if (argc == 1)
                   5131:     {
                   5132:       ret = inet_aton(argv[0], &addr);
                   5133:       if (!ret)
                   5134:        {
                   5135:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5136:                   VTY_NEWLINE);
                   5137:          return CMD_WARNING;
                   5138:        }
                   5139: 
                   5140:       params = ospf_lookup_if_params (ifp, addr);
                   5141:       if (params == NULL)
                   5142:        return CMD_SUCCESS;
                   5143:     }
                   5144: 
                   5145:   UNSET_IF_PARAM (params, v_wait);
                   5146:   params->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
                   5147:   
                   5148:   UNSET_IF_PARAM (params, fast_hello);
                   5149:   params->fast_hello = OSPF_FAST_HELLO_DEFAULT;
                   5150:   
                   5151:   if (params != IF_DEF_PARAMS (ifp))
                   5152:     {
                   5153:       ospf_free_if_params (ifp, addr);
                   5154:       ospf_if_update_params (ifp, addr);
                   5155:     }
                   5156: 
                   5157:   /* Update timer values in neighbor structure. */
                   5158:   if (argc == 1)
                   5159:     {
                   5160:       struct ospf *ospf;
                   5161:       
                   5162:       if ((ospf = ospf_lookup()))
                   5163:        {
                   5164:          oi = ospf_if_lookup_by_local_addr (ospf, ifp, addr);
                   5165:          if (oi)
                   5166:            ospf_nbr_timer_update (oi);
                   5167:        }
                   5168:     }
                   5169:   else
                   5170:     {
                   5171:       for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   5172:        if ((oi = rn->info))
                   5173:          ospf_nbr_timer_update (oi);
                   5174:     }
                   5175: 
                   5176:   return CMD_SUCCESS;
                   5177: }
                   5178: 
                   5179: ALIAS (no_ip_ospf_dead_interval,
                   5180:        no_ip_ospf_dead_interval_cmd,
                   5181:        "no ip ospf dead-interval",
                   5182:        NO_STR
                   5183:        "IP Information\n"
                   5184:        "OSPF interface commands\n"
                   5185:        "Interval after which a neighbor is declared dead\n")
                   5186: 
                   5187: ALIAS (no_ip_ospf_dead_interval,
                   5188:        no_ospf_dead_interval_cmd,
                   5189:        "no ospf dead-interval",
                   5190:        NO_STR
                   5191:        "OSPF interface commands\n"
                   5192:        "Interval after which a neighbor is declared dead\n")
                   5193: 
                   5194: DEFUN (ip_ospf_hello_interval,
                   5195:        ip_ospf_hello_interval_addr_cmd,
                   5196:        "ip ospf hello-interval <1-65535> A.B.C.D",
                   5197:        "IP Information\n"
                   5198:        "OSPF interface commands\n"
                   5199:        "Time between HELLO packets\n"
                   5200:        "Seconds\n"
                   5201:        "Address of interface")
                   5202: {
                   5203:   struct interface *ifp = vty->index;
                   5204:   u_int32_t seconds;
                   5205:   struct in_addr addr;
                   5206:   int ret;
                   5207:   struct ospf_if_params *params;
                   5208:       
                   5209:   params = IF_DEF_PARAMS (ifp);
                   5210: 
                   5211:   seconds = strtol (argv[0], NULL, 10);
                   5212:   
                   5213:   /* HelloInterval range is <1-65535>. */
                   5214:   if (seconds < 1 || seconds > 65535)
                   5215:     {
                   5216:       vty_out (vty, "Hello Interval is invalid%s", VTY_NEWLINE);
                   5217:       return CMD_WARNING;
                   5218:     }
                   5219: 
                   5220:   if (argc == 2)
                   5221:     {
                   5222:       ret = inet_aton(argv[1], &addr);
                   5223:       if (!ret)
                   5224:        {
                   5225:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5226:                   VTY_NEWLINE);
                   5227:          return CMD_WARNING;
                   5228:        }
                   5229: 
                   5230:       params = ospf_get_if_params (ifp, addr);
                   5231:       ospf_if_update_params (ifp, addr);
                   5232:     }
                   5233: 
                   5234:   SET_IF_PARAM (params, v_hello);
                   5235:   params->v_hello = seconds;
                   5236: 
                   5237:   return CMD_SUCCESS;
                   5238: }
                   5239: 
                   5240: ALIAS (ip_ospf_hello_interval,
                   5241:        ip_ospf_hello_interval_cmd,
                   5242:        "ip ospf hello-interval <1-65535>",
                   5243:        "IP Information\n"
                   5244:        "OSPF interface commands\n"
                   5245:        "Time between HELLO packets\n"
                   5246:        "Seconds\n")
                   5247: 
                   5248: ALIAS (ip_ospf_hello_interval,
                   5249:        ospf_hello_interval_cmd,
                   5250:        "ospf hello-interval <1-65535>",
                   5251:        "OSPF interface commands\n"
                   5252:        "Time between HELLO packets\n"
                   5253:        "Seconds\n")
                   5254: 
                   5255: DEFUN (no_ip_ospf_hello_interval,
                   5256:        no_ip_ospf_hello_interval_addr_cmd,
                   5257:        "no ip ospf hello-interval A.B.C.D",
                   5258:        NO_STR
                   5259:        "IP Information\n"
                   5260:        "OSPF interface commands\n"
                   5261:        "Time between HELLO packets\n"
                   5262:        "Address of interface")
                   5263: {
                   5264:   struct interface *ifp = vty->index;
                   5265:   struct in_addr addr;
                   5266:   int ret;
                   5267:   struct ospf_if_params *params;
                   5268:   
                   5269:   ifp = vty->index;
                   5270:   params = IF_DEF_PARAMS (ifp);
                   5271: 
                   5272:   if (argc == 1)
                   5273:     {
                   5274:       ret = inet_aton(argv[0], &addr);
                   5275:       if (!ret)
                   5276:        {
                   5277:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5278:                   VTY_NEWLINE);
                   5279:          return CMD_WARNING;
                   5280:        }
                   5281: 
                   5282:       params = ospf_lookup_if_params (ifp, addr);
                   5283:       if (params == NULL)
                   5284:        return CMD_SUCCESS;
                   5285:     }
                   5286: 
                   5287:   UNSET_IF_PARAM (params, v_hello);
                   5288:   params->v_hello = OSPF_HELLO_INTERVAL_DEFAULT;
                   5289: 
                   5290:   if (params != IF_DEF_PARAMS (ifp))
                   5291:     {
                   5292:       ospf_free_if_params (ifp, addr);
                   5293:       ospf_if_update_params (ifp, addr);
                   5294:     }
                   5295: 
                   5296:   return CMD_SUCCESS;
                   5297: }
                   5298: 
                   5299: ALIAS (no_ip_ospf_hello_interval,
                   5300:        no_ip_ospf_hello_interval_cmd,
                   5301:        "no ip ospf hello-interval",
                   5302:        NO_STR
                   5303:        "IP Information\n"
                   5304:        "OSPF interface commands\n"
                   5305:        "Time between HELLO packets\n")
                   5306: 
                   5307: ALIAS (no_ip_ospf_hello_interval,
                   5308:        no_ospf_hello_interval_cmd,
                   5309:        "no ospf hello-interval",
                   5310:        NO_STR
                   5311:        "OSPF interface commands\n"
                   5312:        "Time between HELLO packets\n")
                   5313: 
                   5314: DEFUN (ip_ospf_network,
                   5315:        ip_ospf_network_cmd,
                   5316:        "ip ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
                   5317:        "IP Information\n"
                   5318:        "OSPF interface commands\n"
                   5319:        "Network type\n"
                   5320:        "Specify OSPF broadcast multi-access network\n"
                   5321:        "Specify OSPF NBMA network\n"
                   5322:        "Specify OSPF point-to-multipoint network\n"
                   5323:        "Specify OSPF point-to-point network\n")
                   5324: {
                   5325:   struct interface *ifp = vty->index;
                   5326:   int old_type = IF_DEF_PARAMS (ifp)->type;
                   5327:   struct route_node *rn;
                   5328:   
                   5329:   if (strncmp (argv[0], "b", 1) == 0)
                   5330:     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_BROADCAST;
                   5331:   else if (strncmp (argv[0], "n", 1) == 0)
                   5332:     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_NBMA;
                   5333:   else if (strncmp (argv[0], "point-to-m", 10) == 0)
                   5334:     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOMULTIPOINT;
                   5335:   else if (strncmp (argv[0], "point-to-p", 10) == 0)
                   5336:     IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_POINTOPOINT;
                   5337: 
                   5338:   if (IF_DEF_PARAMS (ifp)->type == old_type)
                   5339:     return CMD_SUCCESS;
                   5340: 
                   5341:   SET_IF_PARAM (IF_DEF_PARAMS (ifp), type);
                   5342: 
                   5343:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   5344:     {
                   5345:       struct ospf_interface *oi = rn->info;
                   5346: 
                   5347:       if (!oi)
                   5348:        continue;
                   5349:       
                   5350:       oi->type = IF_DEF_PARAMS (ifp)->type;
                   5351:       
                   5352:       if (oi->state > ISM_Down)
                   5353:        {
                   5354:          OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
                   5355:          OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
                   5356:        }
                   5357:     }
                   5358: 
                   5359:   return CMD_SUCCESS;
                   5360: }
                   5361: 
                   5362: ALIAS (ip_ospf_network,
                   5363:        ospf_network_cmd,
                   5364:        "ospf network (broadcast|non-broadcast|point-to-multipoint|point-to-point)",
                   5365:        "OSPF interface commands\n"
                   5366:        "Network type\n"
                   5367:        "Specify OSPF broadcast multi-access network\n"
                   5368:        "Specify OSPF NBMA network\n"
                   5369:        "Specify OSPF point-to-multipoint network\n"
                   5370:        "Specify OSPF point-to-point network\n")
                   5371: 
                   5372: DEFUN (no_ip_ospf_network,
                   5373:        no_ip_ospf_network_cmd,
                   5374:        "no ip ospf network",
                   5375:        NO_STR
                   5376:        "IP Information\n"
                   5377:        "OSPF interface commands\n"
                   5378:        "Network type\n")
                   5379: {
                   5380:   struct interface *ifp = vty->index;
                   5381:   int old_type = IF_DEF_PARAMS (ifp)->type;
                   5382:   struct route_node *rn;
                   5383: 
                   5384:   IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp);
                   5385: 
                   5386:   if (IF_DEF_PARAMS (ifp)->type == old_type)
                   5387:     return CMD_SUCCESS;
                   5388: 
                   5389:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   5390:     {
                   5391:       struct ospf_interface *oi = rn->info;
                   5392: 
                   5393:       if (!oi)
                   5394:        continue;
                   5395:       
                   5396:       oi->type = IF_DEF_PARAMS (ifp)->type;
                   5397:       
                   5398:       if (oi->state > ISM_Down)
                   5399:        {
                   5400:          OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceDown);
                   5401:          OSPF_ISM_EVENT_EXECUTE (oi, ISM_InterfaceUp);
                   5402:        }
                   5403:     }
                   5404: 
                   5405:   return CMD_SUCCESS;
                   5406: }
                   5407: 
                   5408: ALIAS (no_ip_ospf_network,
                   5409:        no_ospf_network_cmd,
                   5410:        "no ospf network",
                   5411:        NO_STR
                   5412:        "OSPF interface commands\n"
                   5413:        "Network type\n")
                   5414: 
                   5415: DEFUN (ip_ospf_priority,
                   5416:        ip_ospf_priority_addr_cmd,
                   5417:        "ip ospf priority <0-255> A.B.C.D",
                   5418:        "IP Information\n"
                   5419:        "OSPF interface commands\n"
                   5420:        "Router priority\n"
                   5421:        "Priority\n"
                   5422:        "Address of interface")
                   5423: {
                   5424:   struct interface *ifp = vty->index;
                   5425:   u_int32_t priority;
                   5426:   struct route_node *rn;
                   5427:   struct in_addr addr;
                   5428:   int ret;
                   5429:   struct ospf_if_params *params;
                   5430:       
                   5431:   params = IF_DEF_PARAMS (ifp);
                   5432: 
                   5433:   priority = strtol (argv[0], NULL, 10);
                   5434:   
                   5435:   /* Router Priority range is <0-255>. */
                   5436:   if (priority < 0 || priority > 255)
                   5437:     {
                   5438:       vty_out (vty, "Router Priority is invalid%s", VTY_NEWLINE);
                   5439:       return CMD_WARNING;
                   5440:     }
                   5441: 
                   5442:   if (argc == 2)
                   5443:     {
                   5444:       ret = inet_aton(argv[1], &addr);
                   5445:       if (!ret)
                   5446:        {
                   5447:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5448:                   VTY_NEWLINE);
                   5449:          return CMD_WARNING;
                   5450:        }
                   5451: 
                   5452:       params = ospf_get_if_params (ifp, addr);
                   5453:       ospf_if_update_params (ifp, addr);
                   5454:     }
                   5455:   
                   5456:   SET_IF_PARAM (params, priority);
                   5457:   params->priority = priority;
                   5458: 
                   5459:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   5460:     {
                   5461:       struct ospf_interface *oi = rn->info;
                   5462:       
                   5463:       if (!oi)
                   5464:        continue;
                   5465:       
                   5466: 
                   5467:       if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
                   5468:        {
                   5469:          PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
                   5470:          OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
                   5471:        }
                   5472:     }
                   5473:   
                   5474:   return CMD_SUCCESS;
                   5475: }
                   5476: 
                   5477: ALIAS (ip_ospf_priority,
                   5478:        ip_ospf_priority_cmd,
                   5479:        "ip ospf priority <0-255>",
                   5480:        "IP Information\n"
                   5481:        "OSPF interface commands\n"
                   5482:        "Router priority\n"
                   5483:        "Priority\n")
                   5484: 
                   5485: ALIAS (ip_ospf_priority,
                   5486:        ospf_priority_cmd,
                   5487:        "ospf priority <0-255>",
                   5488:        "OSPF interface commands\n"
                   5489:        "Router priority\n"
                   5490:        "Priority\n")
                   5491: 
                   5492: DEFUN (no_ip_ospf_priority,
                   5493:        no_ip_ospf_priority_addr_cmd,
                   5494:        "no ip ospf priority A.B.C.D",
                   5495:        NO_STR
                   5496:        "IP Information\n"
                   5497:        "OSPF interface commands\n"
                   5498:        "Router priority\n"
                   5499:        "Address of interface")
                   5500: {
                   5501:   struct interface *ifp = vty->index;
                   5502:   struct route_node *rn;
                   5503:   struct in_addr addr;
                   5504:   int ret;
                   5505:   struct ospf_if_params *params;
                   5506:   
                   5507:   ifp = vty->index;
                   5508:   params = IF_DEF_PARAMS (ifp);
                   5509: 
                   5510:   if (argc == 1)
                   5511:     {
                   5512:       ret = inet_aton(argv[0], &addr);
                   5513:       if (!ret)
                   5514:        {
                   5515:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5516:                   VTY_NEWLINE);
                   5517:          return CMD_WARNING;
                   5518:        }
                   5519: 
                   5520:       params = ospf_lookup_if_params (ifp, addr);
                   5521:       if (params == NULL)
                   5522:        return CMD_SUCCESS;
                   5523:     }
                   5524: 
                   5525:   UNSET_IF_PARAM (params, priority);
                   5526:   params->priority = OSPF_ROUTER_PRIORITY_DEFAULT;
                   5527: 
                   5528:   if (params != IF_DEF_PARAMS (ifp))
                   5529:     {
                   5530:       ospf_free_if_params (ifp, addr);
                   5531:       ospf_if_update_params (ifp, addr);
                   5532:     }
                   5533:   
                   5534:   for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))
                   5535:     {
                   5536:       struct ospf_interface *oi = rn->info;
                   5537:       
                   5538:       if (!oi)
                   5539:        continue;
                   5540:       
                   5541:       
                   5542:       if (PRIORITY (oi) != OSPF_IF_PARAM (oi, priority))
                   5543:        {
                   5544:          PRIORITY (oi) = OSPF_IF_PARAM (oi, priority);
                   5545:          OSPF_ISM_EVENT_SCHEDULE (oi, ISM_NeighborChange);
                   5546:        }
                   5547:     }
                   5548:   
                   5549:   return CMD_SUCCESS;
                   5550: }
                   5551: 
                   5552: ALIAS (no_ip_ospf_priority,
                   5553:        no_ip_ospf_priority_cmd,
                   5554:        "no ip ospf priority",
                   5555:        NO_STR
                   5556:        "IP Information\n"
                   5557:        "OSPF interface commands\n"
                   5558:        "Router priority\n")
                   5559: 
                   5560: ALIAS (no_ip_ospf_priority,
                   5561:        no_ospf_priority_cmd,
                   5562:        "no ospf priority",
                   5563:        NO_STR
                   5564:        "OSPF interface commands\n"
                   5565:        "Router priority\n")
                   5566: 
                   5567: DEFUN (ip_ospf_retransmit_interval,
                   5568:        ip_ospf_retransmit_interval_addr_cmd,
                   5569:        "ip ospf retransmit-interval <3-65535> A.B.C.D",
                   5570:        "IP Information\n"
                   5571:        "OSPF interface commands\n"
                   5572:        "Time between retransmitting lost link state advertisements\n"
                   5573:        "Seconds\n"
                   5574:        "Address of interface")
                   5575: {
                   5576:   struct interface *ifp = vty->index;
                   5577:   u_int32_t seconds;
                   5578:   struct in_addr addr;
                   5579:   int ret;
                   5580:   struct ospf_if_params *params;
                   5581:       
                   5582:   params = IF_DEF_PARAMS (ifp);
                   5583:   seconds = strtol (argv[0], NULL, 10);
                   5584: 
                   5585:   /* Retransmit Interval range is <3-65535>. */
                   5586:   if (seconds < 3 || seconds > 65535)
                   5587:     {
                   5588:       vty_out (vty, "Retransmit Interval is invalid%s", VTY_NEWLINE);
                   5589:       return CMD_WARNING;
                   5590:     }
                   5591: 
                   5592: 
                   5593:   if (argc == 2)
                   5594:     {
                   5595:       ret = inet_aton(argv[1], &addr);
                   5596:       if (!ret)
                   5597:        {
                   5598:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5599:                   VTY_NEWLINE);
                   5600:          return CMD_WARNING;
                   5601:        }
                   5602: 
                   5603:       params = ospf_get_if_params (ifp, addr);
                   5604:       ospf_if_update_params (ifp, addr);
                   5605:     }
                   5606: 
                   5607:   SET_IF_PARAM (params, retransmit_interval);
                   5608:   params->retransmit_interval = seconds;
                   5609: 
                   5610:   return CMD_SUCCESS;
                   5611: }
                   5612: 
                   5613: ALIAS (ip_ospf_retransmit_interval,
                   5614:        ip_ospf_retransmit_interval_cmd,
                   5615:        "ip ospf retransmit-interval <3-65535>",
                   5616:        "IP Information\n"
                   5617:        "OSPF interface commands\n"
                   5618:        "Time between retransmitting lost link state advertisements\n"
                   5619:        "Seconds\n")
                   5620: 
                   5621: ALIAS (ip_ospf_retransmit_interval,
                   5622:        ospf_retransmit_interval_cmd,
                   5623:        "ospf retransmit-interval <3-65535>",
                   5624:        "OSPF interface commands\n"
                   5625:        "Time between retransmitting lost link state advertisements\n"
                   5626:        "Seconds\n")
                   5627: 
                   5628: DEFUN (no_ip_ospf_retransmit_interval,
                   5629:        no_ip_ospf_retransmit_interval_addr_cmd,
                   5630:        "no ip ospf retransmit-interval A.B.C.D",
                   5631:        NO_STR
                   5632:        "IP Information\n"
                   5633:        "OSPF interface commands\n"
                   5634:        "Time between retransmitting lost link state advertisements\n"
                   5635:        "Address of interface")
                   5636: {
                   5637:   struct interface *ifp = vty->index;
                   5638:   struct in_addr addr;
                   5639:   int ret;
                   5640:   struct ospf_if_params *params;
                   5641:   
                   5642:   ifp = vty->index;
                   5643:   params = IF_DEF_PARAMS (ifp);
                   5644: 
                   5645:   if (argc == 1)
                   5646:     {
                   5647:       ret = inet_aton(argv[0], &addr);
                   5648:       if (!ret)
                   5649:        {
                   5650:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5651:                   VTY_NEWLINE);
                   5652:          return CMD_WARNING;
                   5653:        }
                   5654: 
                   5655:       params = ospf_lookup_if_params (ifp, addr);
                   5656:       if (params == NULL)
                   5657:        return CMD_SUCCESS;
                   5658:     }
                   5659: 
                   5660:   UNSET_IF_PARAM (params, retransmit_interval);
                   5661:   params->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
                   5662: 
                   5663:   if (params != IF_DEF_PARAMS (ifp))
                   5664:     {
                   5665:       ospf_free_if_params (ifp, addr);
                   5666:       ospf_if_update_params (ifp, addr);
                   5667:     }
                   5668: 
                   5669:   return CMD_SUCCESS;
                   5670: }
                   5671: 
                   5672: ALIAS (no_ip_ospf_retransmit_interval,
                   5673:        no_ip_ospf_retransmit_interval_cmd,
                   5674:        "no ip ospf retransmit-interval",
                   5675:        NO_STR
                   5676:        "IP Information\n"
                   5677:        "OSPF interface commands\n"
                   5678:        "Time between retransmitting lost link state advertisements\n")
                   5679: 
                   5680: ALIAS (no_ip_ospf_retransmit_interval,
                   5681:        no_ospf_retransmit_interval_cmd,
                   5682:        "no ospf retransmit-interval",
                   5683:        NO_STR
                   5684:        "OSPF interface commands\n"
                   5685:        "Time between retransmitting lost link state advertisements\n")
                   5686: 
                   5687: DEFUN (ip_ospf_transmit_delay,
                   5688:        ip_ospf_transmit_delay_addr_cmd,
                   5689:        "ip ospf transmit-delay <1-65535> A.B.C.D",
                   5690:        "IP Information\n"
                   5691:        "OSPF interface commands\n"
                   5692:        "Link state transmit delay\n"
                   5693:        "Seconds\n"
                   5694:        "Address of interface")
                   5695: {
                   5696:   struct interface *ifp = vty->index;
                   5697:   u_int32_t seconds;
                   5698:   struct in_addr addr;
                   5699:   int ret;
                   5700:   struct ospf_if_params *params;
                   5701:       
                   5702:   params = IF_DEF_PARAMS (ifp);
                   5703:   seconds = strtol (argv[0], NULL, 10);
                   5704: 
                   5705:   /* Transmit Delay range is <1-65535>. */
                   5706:   if (seconds < 1 || seconds > 65535)
                   5707:     {
                   5708:       vty_out (vty, "Transmit Delay is invalid%s", VTY_NEWLINE);
                   5709:       return CMD_WARNING;
                   5710:     }
                   5711: 
                   5712:   if (argc == 2)
                   5713:     {
                   5714:       ret = inet_aton(argv[1], &addr);
                   5715:       if (!ret)
                   5716:        {
                   5717:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5718:                   VTY_NEWLINE);
                   5719:          return CMD_WARNING;
                   5720:        }
                   5721: 
                   5722:       params = ospf_get_if_params (ifp, addr);
                   5723:       ospf_if_update_params (ifp, addr);
                   5724:     }
                   5725: 
                   5726:   SET_IF_PARAM (params, transmit_delay); 
                   5727:   params->transmit_delay = seconds;
                   5728: 
                   5729:   return CMD_SUCCESS;
                   5730: }
                   5731: 
                   5732: ALIAS (ip_ospf_transmit_delay,
                   5733:        ip_ospf_transmit_delay_cmd,
                   5734:        "ip ospf transmit-delay <1-65535>",
                   5735:        "IP Information\n"
                   5736:        "OSPF interface commands\n"
                   5737:        "Link state transmit delay\n"
                   5738:        "Seconds\n")
                   5739: 
                   5740: ALIAS (ip_ospf_transmit_delay,
                   5741:        ospf_transmit_delay_cmd,
                   5742:        "ospf transmit-delay <1-65535>",
                   5743:        "OSPF interface commands\n"
                   5744:        "Link state transmit delay\n"
                   5745:        "Seconds\n")
                   5746: 
                   5747: DEFUN (no_ip_ospf_transmit_delay,
                   5748:        no_ip_ospf_transmit_delay_addr_cmd,
                   5749:        "no ip ospf transmit-delay A.B.C.D",
                   5750:        NO_STR
                   5751:        "IP Information\n"
                   5752:        "OSPF interface commands\n"
                   5753:        "Link state transmit delay\n"
                   5754:        "Address of interface")
                   5755: {
                   5756:   struct interface *ifp = vty->index;
                   5757:   struct in_addr addr;
                   5758:   int ret;
                   5759:   struct ospf_if_params *params;
                   5760:   
                   5761:   ifp = vty->index;
                   5762:   params = IF_DEF_PARAMS (ifp);
                   5763: 
                   5764:   if (argc == 1)
                   5765:     {
                   5766:       ret = inet_aton(argv[0], &addr);
                   5767:       if (!ret)
                   5768:        {
                   5769:          vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   5770:                   VTY_NEWLINE);
                   5771:          return CMD_WARNING;
                   5772:        }
                   5773: 
                   5774:       params = ospf_lookup_if_params (ifp, addr);
                   5775:       if (params == NULL)
                   5776:        return CMD_SUCCESS;
                   5777:     }
                   5778: 
                   5779:   UNSET_IF_PARAM (params, transmit_delay);
                   5780:   params->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
                   5781: 
                   5782:   if (params != IF_DEF_PARAMS (ifp))
                   5783:     {
                   5784:       ospf_free_if_params (ifp, addr);
                   5785:       ospf_if_update_params (ifp, addr);
                   5786:     }
                   5787: 
                   5788:   return CMD_SUCCESS;
                   5789: }
                   5790: 
                   5791: ALIAS (no_ip_ospf_transmit_delay,
                   5792:        no_ip_ospf_transmit_delay_cmd,
                   5793:        "no ip ospf transmit-delay",
                   5794:        NO_STR
                   5795:        "IP Information\n"
                   5796:        "OSPF interface commands\n"
                   5797:        "Link state transmit delay\n")
                   5798: 
                   5799: ALIAS (no_ip_ospf_transmit_delay,
                   5800:        no_ospf_transmit_delay_cmd,
                   5801:        "no ospf transmit-delay",
                   5802:        NO_STR
                   5803:        "OSPF interface commands\n"
                   5804:        "Link state transmit delay\n")
                   5805: 
                   5806: 
                   5807: DEFUN (ospf_redistribute_source_metric_type,
                   5808:        ospf_redistribute_source_metric_type_routemap_cmd,
                   5809:        "redistribute " QUAGGA_REDIST_STR_OSPFD 
                   5810:          " metric <0-16777214> metric-type (1|2) route-map WORD",
                   5811:        REDIST_STR
                   5812:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5813:        "Metric for redistributed routes\n"
                   5814:        "OSPF default metric\n"
                   5815:        "OSPF exterior metric type for redistributed routes\n"
                   5816:        "Set OSPF External Type 1 metrics\n"
                   5817:        "Set OSPF External Type 2 metrics\n"
                   5818:        "Route map reference\n"
                   5819:        "Pointer to route-map entries\n")
                   5820: {
                   5821:   struct ospf *ospf = vty->index;
                   5822:   int source;
                   5823:   int type = -1;
                   5824:   int metric = -1;
                   5825: 
                   5826:   /* Get distribute source. */
                   5827:   if (!str2distribute_source (argv[0], &source))
                   5828:     return CMD_WARNING;
                   5829: 
                   5830:   /* Get metric value. */
                   5831:   if (argc >= 2)
                   5832:     if (!str2metric (argv[1], &metric))
                   5833:       return CMD_WARNING;
                   5834: 
                   5835:   /* Get metric type. */
                   5836:   if (argc >= 3)
                   5837:     if (!str2metric_type (argv[2], &type))
                   5838:       return CMD_WARNING;
                   5839: 
                   5840:   if (argc == 4)
                   5841:     ospf_routemap_set (ospf, source, argv[3]);
                   5842:   else
                   5843:     ospf_routemap_unset (ospf, source);
                   5844:   
                   5845:   return ospf_redistribute_set (ospf, source, type, metric);
                   5846: }
                   5847: 
                   5848: ALIAS (ospf_redistribute_source_metric_type,
                   5849:        ospf_redistribute_source_metric_type_cmd,
                   5850:        "redistribute " QUAGGA_REDIST_STR_OSPFD 
                   5851:        " metric <0-16777214> metric-type (1|2)",
                   5852:        REDIST_STR
                   5853:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5854:        "Metric for redistributed routes\n"
                   5855:        "OSPF default metric\n"
                   5856:        "OSPF exterior metric type for redistributed routes\n"
                   5857:        "Set OSPF External Type 1 metrics\n"
                   5858:        "Set OSPF External Type 2 metrics\n")
                   5859: 
                   5860: ALIAS (ospf_redistribute_source_metric_type,
                   5861:        ospf_redistribute_source_metric_cmd,
                   5862:        "redistribute " QUAGGA_REDIST_STR_OSPFD " metric <0-16777214>",
                   5863:        REDIST_STR
                   5864:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5865:        "Metric for redistributed routes\n"
                   5866:        "OSPF default metric\n")
                   5867: 
                   5868: DEFUN (ospf_redistribute_source_type_metric,
                   5869:        ospf_redistribute_source_type_metric_routemap_cmd,
                   5870:        "redistribute " QUAGGA_REDIST_STR_OSPFD 
                   5871:          " metric-type (1|2) metric <0-16777214> route-map WORD",
                   5872:        REDIST_STR
                   5873:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5874:        "OSPF exterior metric type for redistributed routes\n"
                   5875:        "Set OSPF External Type 1 metrics\n"
                   5876:        "Set OSPF External Type 2 metrics\n"
                   5877:        "Metric for redistributed routes\n"
                   5878:        "OSPF default metric\n"
                   5879:        "Route map reference\n"
                   5880:        "Pointer to route-map entries\n")
                   5881: {
                   5882:   struct ospf *ospf = vty->index;
                   5883:   int source;
                   5884:   int type = -1;
                   5885:   int metric = -1;
                   5886: 
                   5887:   /* Get distribute source. */
                   5888:   if (!str2distribute_source (argv[0], &source))
                   5889:     return CMD_WARNING;
                   5890: 
                   5891:   /* Get metric value. */
                   5892:   if (argc >= 2)
                   5893:     if (!str2metric_type (argv[1], &type))
                   5894:       return CMD_WARNING;
                   5895: 
                   5896:   /* Get metric type. */
                   5897:   if (argc >= 3)
                   5898:     if (!str2metric (argv[2], &metric))
                   5899:       return CMD_WARNING;
                   5900: 
                   5901:   if (argc == 4)
                   5902:     ospf_routemap_set (ospf, source, argv[3]);
                   5903:   else
                   5904:     ospf_routemap_unset (ospf, source);
                   5905: 
                   5906:   return ospf_redistribute_set (ospf, source, type, metric);
                   5907: }
                   5908: 
                   5909: ALIAS (ospf_redistribute_source_type_metric,
                   5910:        ospf_redistribute_source_type_metric_cmd,
                   5911:        "redistribute " QUAGGA_REDIST_STR_OSPFD 
                   5912:          " metric-type (1|2) metric <0-16777214>",
                   5913:        REDIST_STR
                   5914:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5915:        "OSPF exterior metric type for redistributed routes\n"
                   5916:        "Set OSPF External Type 1 metrics\n"
                   5917:        "Set OSPF External Type 2 metrics\n"
                   5918:        "Metric for redistributed routes\n"
                   5919:        "OSPF default metric\n")
                   5920: 
                   5921: ALIAS (ospf_redistribute_source_type_metric,
                   5922:        ospf_redistribute_source_type_cmd,
                   5923:        "redistribute " QUAGGA_REDIST_STR_OSPFD " metric-type (1|2)",
                   5924:        REDIST_STR
                   5925:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5926:        "OSPF exterior metric type for redistributed routes\n"
                   5927:        "Set OSPF External Type 1 metrics\n"
                   5928:        "Set OSPF External Type 2 metrics\n")
                   5929: 
                   5930: ALIAS (ospf_redistribute_source_type_metric,
                   5931:        ospf_redistribute_source_cmd,
                   5932:        "redistribute " QUAGGA_REDIST_STR_OSPFD,
                   5933:        REDIST_STR
                   5934:        QUAGGA_REDIST_HELP_STR_OSPFD)
                   5935: 
                   5936: DEFUN (ospf_redistribute_source_metric_routemap,
                   5937:        ospf_redistribute_source_metric_routemap_cmd,
                   5938:        "redistribute " QUAGGA_REDIST_STR_OSPFD 
                   5939:          " metric <0-16777214> route-map WORD",
                   5940:        REDIST_STR
                   5941:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5942:        "Metric for redistributed routes\n"
                   5943:        "OSPF default metric\n"
                   5944:        "Route map reference\n"
                   5945:        "Pointer to route-map entries\n")
                   5946: {
                   5947:   struct ospf *ospf = vty->index;
                   5948:   int source;
                   5949:   int metric = -1;
                   5950: 
                   5951:   /* Get distribute source. */
                   5952:   if (!str2distribute_source (argv[0], &source))
                   5953:     return CMD_WARNING;
                   5954: 
                   5955:   /* Get metric value. */
                   5956:   if (argc >= 2)
                   5957:     if (!str2metric (argv[1], &metric))
                   5958:       return CMD_WARNING;
                   5959: 
                   5960:   if (argc == 3)
                   5961:     ospf_routemap_set (ospf, source, argv[2]);
                   5962:   else
                   5963:     ospf_routemap_unset (ospf, source);
                   5964:   
                   5965:   return ospf_redistribute_set (ospf, source, -1, metric);
                   5966: }
                   5967: 
                   5968: DEFUN (ospf_redistribute_source_type_routemap,
                   5969:        ospf_redistribute_source_type_routemap_cmd,
                   5970:        "redistribute " QUAGGA_REDIST_STR_OSPFD 
                   5971:          " metric-type (1|2) route-map WORD",
                   5972:        REDIST_STR
                   5973:        QUAGGA_REDIST_HELP_STR_OSPFD
                   5974:        "OSPF exterior metric type for redistributed routes\n"
                   5975:        "Set OSPF External Type 1 metrics\n"
                   5976:        "Set OSPF External Type 2 metrics\n"
                   5977:        "Route map reference\n"
                   5978:        "Pointer to route-map entries\n")
                   5979: {
                   5980:   struct ospf *ospf = vty->index;
                   5981:   int source;
                   5982:   int type = -1;
                   5983: 
                   5984:   /* Get distribute source. */
                   5985:   if (!str2distribute_source (argv[0], &source))
                   5986:     return CMD_WARNING;
                   5987: 
                   5988:   /* Get metric value. */
                   5989:   if (argc >= 2)
                   5990:     if (!str2metric_type (argv[1], &type))
                   5991:       return CMD_WARNING;
                   5992: 
                   5993:   if (argc == 3)
                   5994:     ospf_routemap_set (ospf, source, argv[2]);
                   5995:   else
                   5996:     ospf_routemap_unset (ospf, source);
                   5997: 
                   5998:   return ospf_redistribute_set (ospf, source, type, -1);
                   5999: }
                   6000: 
                   6001: DEFUN (ospf_redistribute_source_routemap,
                   6002:        ospf_redistribute_source_routemap_cmd,
                   6003:        "redistribute " QUAGGA_REDIST_STR_OSPFD " route-map WORD",
                   6004:        REDIST_STR
                   6005:        QUAGGA_REDIST_HELP_STR_OSPFD
                   6006:        "Route map reference\n"
                   6007:        "Pointer to route-map entries\n")
                   6008: {
                   6009:   struct ospf *ospf = vty->index;
                   6010:   int source;
                   6011: 
                   6012:   /* Get distribute source. */
                   6013:   if (!str2distribute_source (argv[0], &source))
                   6014:     return CMD_WARNING;
                   6015: 
                   6016:   if (argc == 2)
                   6017:     ospf_routemap_set (ospf, source, argv[1]);
                   6018:   else
                   6019:     ospf_routemap_unset (ospf, source);
                   6020: 
                   6021:   return ospf_redistribute_set (ospf, source, -1, -1);
                   6022: }
                   6023: 
                   6024: DEFUN (no_ospf_redistribute_source,
                   6025:        no_ospf_redistribute_source_cmd,
                   6026:        "no redistribute " QUAGGA_REDIST_STR_OSPFD,
                   6027:        NO_STR
                   6028:        REDIST_STR
                   6029:        QUAGGA_REDIST_HELP_STR_OSPFD)
                   6030: {
                   6031:   struct ospf *ospf = vty->index;
                   6032:   int source;
                   6033: 
                   6034:   if (!str2distribute_source (argv[0], &source))
                   6035:     return CMD_WARNING;
                   6036: 
                   6037:   ospf_routemap_unset (ospf, source);
                   6038:   return ospf_redistribute_unset (ospf, source);
                   6039: }
                   6040: 
                   6041: DEFUN (ospf_distribute_list_out,
                   6042:        ospf_distribute_list_out_cmd,
                   6043:        "distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
                   6044:        "Filter networks in routing updates\n"
                   6045:        "Access-list name\n"
                   6046:        OUT_STR
                   6047:        QUAGGA_REDIST_HELP_STR_OSPFD)
                   6048: {
                   6049:   struct ospf *ospf = vty->index;
                   6050:   int source;
                   6051: 
                   6052:   /* Get distribute source. */
                   6053:   if (!str2distribute_source (argv[1], &source))
                   6054:     return CMD_WARNING;
                   6055: 
                   6056:   return ospf_distribute_list_out_set (ospf, source, argv[0]);
                   6057: }
                   6058: 
                   6059: DEFUN (no_ospf_distribute_list_out,
                   6060:        no_ospf_distribute_list_out_cmd,
                   6061:        "no distribute-list WORD out " QUAGGA_REDIST_STR_OSPFD,
                   6062:        NO_STR
                   6063:        "Filter networks in routing updates\n"
                   6064:        "Access-list name\n"
                   6065:        OUT_STR
                   6066:        QUAGGA_REDIST_HELP_STR_OSPFD)
                   6067: {
                   6068:   struct ospf *ospf = vty->index;
                   6069:   int source;
                   6070: 
                   6071:   if (!str2distribute_source (argv[1], &source))
                   6072:     return CMD_WARNING;
                   6073: 
                   6074:   return ospf_distribute_list_out_unset (ospf, source, argv[0]);
                   6075: }
                   6076: 
                   6077: /* Default information originate. */
                   6078: DEFUN (ospf_default_information_originate_metric_type_routemap,
                   6079:        ospf_default_information_originate_metric_type_routemap_cmd,
                   6080:        "default-information originate metric <0-16777214> metric-type (1|2) route-map WORD",
                   6081:        "Control distribution of default information\n"
                   6082:        "Distribute a default route\n"
                   6083:        "OSPF default metric\n"
                   6084:        "OSPF metric\n"
                   6085:        "OSPF metric type for default routes\n"
                   6086:        "Set OSPF External Type 1 metrics\n"
                   6087:        "Set OSPF External Type 2 metrics\n"
                   6088:        "Route map reference\n"
                   6089:        "Pointer to route-map entries\n")
                   6090: {
                   6091:   struct ospf *ospf = vty->index;
                   6092:   int type = -1;
                   6093:   int metric = -1;
                   6094: 
                   6095:   /* Get metric value. */
                   6096:   if (argc >= 1)
                   6097:     if (!str2metric (argv[0], &metric))
                   6098:       return CMD_WARNING;
                   6099: 
                   6100:   /* Get metric type. */
                   6101:   if (argc >= 2)
                   6102:     if (!str2metric_type (argv[1], &type))
                   6103:       return CMD_WARNING;
                   6104: 
                   6105:   if (argc == 3)
                   6106:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
                   6107:   else
                   6108:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6109: 
                   6110:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
                   6111:                                        type, metric);
                   6112: }
                   6113: 
                   6114: ALIAS (ospf_default_information_originate_metric_type_routemap,
                   6115:        ospf_default_information_originate_metric_type_cmd,
                   6116:        "default-information originate metric <0-16777214> metric-type (1|2)",
                   6117:        "Control distribution of default information\n"
                   6118:        "Distribute a default route\n"
                   6119:        "OSPF default metric\n"
                   6120:        "OSPF metric\n"
                   6121:        "OSPF metric type for default routes\n"
                   6122:        "Set OSPF External Type 1 metrics\n"
                   6123:        "Set OSPF External Type 2 metrics\n")
                   6124: 
                   6125: ALIAS (ospf_default_information_originate_metric_type_routemap,
                   6126:        ospf_default_information_originate_metric_cmd,
                   6127:        "default-information originate metric <0-16777214>",
                   6128:        "Control distribution of default information\n"
                   6129:        "Distribute a default route\n"
                   6130:        "OSPF default metric\n"
                   6131:        "OSPF metric\n")
                   6132: 
                   6133: ALIAS (ospf_default_information_originate_metric_type_routemap,
                   6134:        ospf_default_information_originate_cmd,
                   6135:        "default-information originate",
                   6136:        "Control distribution of default information\n"
                   6137:        "Distribute a default route\n")
                   6138: 
                   6139: /* Default information originate. */
                   6140: DEFUN (ospf_default_information_originate_metric_routemap,
                   6141:        ospf_default_information_originate_metric_routemap_cmd,
                   6142:        "default-information originate metric <0-16777214> route-map WORD",
                   6143:        "Control distribution of default information\n"
                   6144:        "Distribute a default route\n"
                   6145:        "OSPF default metric\n"
                   6146:        "OSPF metric\n"
                   6147:        "Route map reference\n"
                   6148:        "Pointer to route-map entries\n")
                   6149: {
                   6150:   struct ospf *ospf = vty->index;
                   6151:   int metric = -1;
                   6152: 
                   6153:   /* Get metric value. */
                   6154:   if (argc >= 1)
                   6155:     if (!str2metric (argv[0], &metric))
                   6156:       return CMD_WARNING;
                   6157: 
                   6158:   if (argc == 2)
                   6159:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
                   6160:   else
                   6161:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6162: 
                   6163:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
                   6164:                                        -1, metric);
                   6165: }
                   6166: 
                   6167: /* Default information originate. */
                   6168: DEFUN (ospf_default_information_originate_routemap,
                   6169:        ospf_default_information_originate_routemap_cmd,
                   6170:        "default-information originate route-map WORD",
                   6171:        "Control distribution of default information\n"
                   6172:        "Distribute a default route\n"
                   6173:        "Route map reference\n"
                   6174:        "Pointer to route-map entries\n")
                   6175: {
                   6176:   struct ospf *ospf = vty->index;
                   6177: 
                   6178:   if (argc == 1)
                   6179:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
                   6180:   else
                   6181:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6182: 
                   6183:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA, -1, -1);
                   6184: }
                   6185: 
                   6186: DEFUN (ospf_default_information_originate_type_metric_routemap,
                   6187:        ospf_default_information_originate_type_metric_routemap_cmd,
                   6188:        "default-information originate metric-type (1|2) metric <0-16777214> route-map WORD",
                   6189:        "Control distribution of default information\n"
                   6190:        "Distribute a default route\n"
                   6191:        "OSPF metric type for default routes\n"
                   6192:        "Set OSPF External Type 1 metrics\n"
                   6193:        "Set OSPF External Type 2 metrics\n"
                   6194:        "OSPF default metric\n"
                   6195:        "OSPF metric\n"
                   6196:        "Route map reference\n"
                   6197:        "Pointer to route-map entries\n")
                   6198: {
                   6199:   struct ospf *ospf = vty->index;
                   6200:   int type = -1;
                   6201:   int metric = -1;
                   6202: 
                   6203:   /* Get metric type. */
                   6204:   if (argc >= 1)
                   6205:     if (!str2metric_type (argv[0], &type))
                   6206:       return CMD_WARNING;
                   6207: 
                   6208:   /* Get metric value. */
                   6209:   if (argc >= 2)
                   6210:     if (!str2metric (argv[1], &metric))
                   6211:       return CMD_WARNING;
                   6212: 
                   6213:   if (argc == 3)
                   6214:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
                   6215:   else
                   6216:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6217: 
                   6218:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
                   6219:                                        type, metric);
                   6220: }
                   6221: 
                   6222: ALIAS (ospf_default_information_originate_type_metric_routemap,
                   6223:        ospf_default_information_originate_type_metric_cmd,
                   6224:        "default-information originate metric-type (1|2) metric <0-16777214>",
                   6225:        "Control distribution of default information\n"
                   6226:        "Distribute a default route\n"
                   6227:        "OSPF metric type for default routes\n"
                   6228:        "Set OSPF External Type 1 metrics\n"
                   6229:        "Set OSPF External Type 2 metrics\n"
                   6230:        "OSPF default metric\n"
                   6231:        "OSPF metric\n")
                   6232: 
                   6233: ALIAS (ospf_default_information_originate_type_metric_routemap,
                   6234:        ospf_default_information_originate_type_cmd,
                   6235:        "default-information originate metric-type (1|2)",
                   6236:        "Control distribution of default information\n"
                   6237:        "Distribute a default route\n"
                   6238:        "OSPF metric type for default routes\n"
                   6239:        "Set OSPF External Type 1 metrics\n"
                   6240:        "Set OSPF External Type 2 metrics\n")
                   6241: 
                   6242: DEFUN (ospf_default_information_originate_type_routemap,
                   6243:        ospf_default_information_originate_type_routemap_cmd,
                   6244:        "default-information originate metric-type (1|2) route-map WORD",
                   6245:        "Control distribution of default information\n"
                   6246:        "Distribute a default route\n"
                   6247:        "OSPF metric type for default routes\n"
                   6248:        "Set OSPF External Type 1 metrics\n"
                   6249:        "Set OSPF External Type 2 metrics\n"
                   6250:        "Route map reference\n"
                   6251:        "Pointer to route-map entries\n")
                   6252: {
                   6253:   struct ospf *ospf = vty->index;
                   6254:   int type = -1;
                   6255: 
                   6256:   /* Get metric type. */
                   6257:   if (argc >= 1)
                   6258:     if (!str2metric_type (argv[0], &type))
                   6259:       return CMD_WARNING;
                   6260: 
                   6261:   if (argc == 2)
                   6262:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
                   6263:   else
                   6264:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6265: 
                   6266:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ZEBRA,
                   6267:                                        type, -1);
                   6268: }
                   6269: 
                   6270: DEFUN (ospf_default_information_originate_always_metric_type_routemap,
                   6271:        ospf_default_information_originate_always_metric_type_routemap_cmd,
                   6272:        "default-information originate always metric <0-16777214> metric-type (1|2) route-map WORD",
                   6273:        "Control distribution of default information\n"
                   6274:        "Distribute a default route\n"
                   6275:        "Always advertise default route\n"
                   6276:        "OSPF default metric\n"
                   6277:        "OSPF metric\n"
                   6278:        "OSPF metric type for default routes\n"
                   6279:        "Set OSPF External Type 1 metrics\n"
                   6280:        "Set OSPF External Type 2 metrics\n"
                   6281:        "Route map reference\n"
                   6282:        "Pointer to route-map entries\n")
                   6283: {
                   6284:   struct ospf *ospf = vty->index;
                   6285:   int type = -1;
                   6286:   int metric = -1;
                   6287: 
                   6288:   /* Get metric value. */
                   6289:   if (argc >= 1)
                   6290:     if (!str2metric (argv[0], &metric))
                   6291:       return CMD_WARNING;
                   6292: 
                   6293:   /* Get metric type. */
                   6294:   if (argc >= 2)
                   6295:     if (!str2metric_type (argv[1], &type))
                   6296:       return CMD_WARNING;
                   6297: 
                   6298:   if (argc == 3)
                   6299:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
                   6300:   else
                   6301:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6302: 
                   6303:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
                   6304:                                        type, metric);
                   6305: }
                   6306: 
                   6307: ALIAS (ospf_default_information_originate_always_metric_type_routemap,
                   6308:        ospf_default_information_originate_always_metric_type_cmd,
                   6309:        "default-information originate always metric <0-16777214> metric-type (1|2)",
                   6310:        "Control distribution of default information\n"
                   6311:        "Distribute a default route\n"
                   6312:        "Always advertise default route\n"
                   6313:        "OSPF default metric\n"
                   6314:        "OSPF metric\n"
                   6315:        "OSPF metric type for default routes\n"
                   6316:        "Set OSPF External Type 1 metrics\n"
                   6317:        "Set OSPF External Type 2 metrics\n")
                   6318: 
                   6319: ALIAS (ospf_default_information_originate_always_metric_type_routemap,
                   6320:        ospf_default_information_originate_always_metric_cmd,
                   6321:        "default-information originate always metric <0-16777214>",
                   6322:        "Control distribution of default information\n"
                   6323:        "Distribute a default route\n"
                   6324:        "Always advertise default route\n"
                   6325:        "OSPF default metric\n"
                   6326:        "OSPF metric\n"
                   6327:        "OSPF metric type for default routes\n")
                   6328: 
                   6329: ALIAS (ospf_default_information_originate_always_metric_type_routemap,
                   6330:        ospf_default_information_originate_always_cmd,
                   6331:        "default-information originate always",
                   6332:        "Control distribution of default information\n"
                   6333:        "Distribute a default route\n"
                   6334:        "Always advertise default route\n")
                   6335: 
                   6336: DEFUN (ospf_default_information_originate_always_metric_routemap,
                   6337:        ospf_default_information_originate_always_metric_routemap_cmd,
                   6338:        "default-information originate always metric <0-16777214> route-map WORD",
                   6339:        "Control distribution of default information\n"
                   6340:        "Distribute a default route\n"
                   6341:        "Always advertise default route\n"
                   6342:        "OSPF default metric\n"
                   6343:        "OSPF metric\n"
                   6344:        "Route map reference\n"
                   6345:        "Pointer to route-map entries\n")
                   6346: {
                   6347:   struct ospf *ospf = vty->index;
                   6348:   int metric = -1;
                   6349: 
                   6350:   /* Get metric value. */
                   6351:   if (argc >= 1)
                   6352:     if (!str2metric (argv[0], &metric))
                   6353:       return CMD_WARNING;
                   6354: 
                   6355:   if (argc == 2)
                   6356:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
                   6357:   else
                   6358:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6359: 
                   6360:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
                   6361:                                        -1, metric);
                   6362: }
                   6363: 
                   6364: DEFUN (ospf_default_information_originate_always_routemap,
                   6365:        ospf_default_information_originate_always_routemap_cmd,
                   6366:        "default-information originate always route-map WORD",
                   6367:        "Control distribution of default information\n"
                   6368:        "Distribute a default route\n"
                   6369:        "Always advertise default route\n"
                   6370:        "Route map reference\n"
                   6371:        "Pointer to route-map entries\n")
                   6372: {
                   6373:   struct ospf *ospf = vty->index;
                   6374: 
                   6375:   if (argc == 1)
                   6376:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[0]);
                   6377:   else
                   6378:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6379: 
                   6380:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS, -1, -1);
                   6381: }
                   6382: 
                   6383: DEFUN (ospf_default_information_originate_always_type_metric_routemap,
                   6384:        ospf_default_information_originate_always_type_metric_routemap_cmd,
                   6385:        "default-information originate always metric-type (1|2) metric <0-16777214> route-map WORD",
                   6386:        "Control distribution of default information\n"
                   6387:        "Distribute a default route\n"
                   6388:        "Always advertise default route\n"
                   6389:        "OSPF metric type for default routes\n"
                   6390:        "Set OSPF External Type 1 metrics\n"
                   6391:        "Set OSPF External Type 2 metrics\n"
                   6392:        "OSPF default metric\n"
                   6393:        "OSPF metric\n"
                   6394:        "Route map reference\n"
                   6395:        "Pointer to route-map entries\n")
                   6396: {
                   6397:   struct ospf *ospf = vty->index;
                   6398:   int type = -1;
                   6399:   int metric = -1;
                   6400: 
                   6401:   /* Get metric type. */
                   6402:   if (argc >= 1)
                   6403:     if (!str2metric_type (argv[0], &type))
                   6404:       return CMD_WARNING;
                   6405: 
                   6406:   /* Get metric value. */
                   6407:   if (argc >= 2)
                   6408:     if (!str2metric (argv[1], &metric))
                   6409:       return CMD_WARNING;
                   6410: 
                   6411:   if (argc == 3)
                   6412:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[2]);
                   6413:   else
                   6414:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6415: 
                   6416:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
                   6417:                                        type, metric);
                   6418: }
                   6419: 
                   6420: ALIAS (ospf_default_information_originate_always_type_metric_routemap,
                   6421:        ospf_default_information_originate_always_type_metric_cmd,
                   6422:        "default-information originate always metric-type (1|2) metric <0-16777214>",
                   6423:        "Control distribution of default information\n"
                   6424:        "Distribute a default route\n"
                   6425:        "Always advertise default route\n"
                   6426:        "OSPF metric type for default routes\n"
                   6427:        "Set OSPF External Type 1 metrics\n"
                   6428:        "Set OSPF External Type 2 metrics\n"
                   6429:        "OSPF default metric\n"
                   6430:        "OSPF metric\n")
                   6431: 
                   6432: ALIAS (ospf_default_information_originate_always_type_metric_routemap,
                   6433:        ospf_default_information_originate_always_type_cmd,
                   6434:        "default-information originate always metric-type (1|2)",
                   6435:        "Control distribution of default information\n"
                   6436:        "Distribute a default route\n"
                   6437:        "Always advertise default route\n"
                   6438:        "OSPF metric type for default routes\n"
                   6439:        "Set OSPF External Type 1 metrics\n"
                   6440:        "Set OSPF External Type 2 metrics\n")
                   6441: 
                   6442: DEFUN (ospf_default_information_originate_always_type_routemap,
                   6443:        ospf_default_information_originate_always_type_routemap_cmd,
                   6444:        "default-information originate always metric-type (1|2) route-map WORD",
                   6445:        "Control distribution of default information\n"
                   6446:        "Distribute a default route\n"
                   6447:        "Always advertise default route\n"
                   6448:        "OSPF metric type for default routes\n"
                   6449:        "Set OSPF External Type 1 metrics\n"
                   6450:        "Set OSPF External Type 2 metrics\n"
                   6451:        "Route map reference\n"
                   6452:        "Pointer to route-map entries\n")
                   6453: {
                   6454:   struct ospf *ospf = vty->index;
                   6455:   int type = -1;
                   6456: 
                   6457:   /* Get metric type. */
                   6458:   if (argc >= 1)
                   6459:     if (!str2metric_type (argv[0], &type))
                   6460:       return CMD_WARNING;
                   6461: 
                   6462:   if (argc == 2)
                   6463:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[1]);
                   6464:   else
                   6465:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6466: 
                   6467:   return ospf_redistribute_default_set (ospf, DEFAULT_ORIGINATE_ALWAYS,
                   6468:                                        type, -1);
                   6469: }
                   6470: 
                   6471: DEFUN (no_ospf_default_information_originate,
                   6472:        no_ospf_default_information_originate_cmd,
                   6473:        "no default-information originate",
                   6474:        NO_STR
                   6475:        "Control distribution of default information\n"
                   6476:        "Distribute a default route\n")
                   6477: {
                   6478:   struct ospf *ospf = vty->index;
                   6479:   struct prefix_ipv4 p;
                   6480:     
                   6481:   p.family = AF_INET;
                   6482:   p.prefix.s_addr = 0;
                   6483:   p.prefixlen = 0;
                   6484: 
                   6485:   ospf_external_lsa_flush (ospf, DEFAULT_ROUTE, &p, 0);
                   6486: 
                   6487:   if (EXTERNAL_INFO (DEFAULT_ROUTE)) {
                   6488:     ospf_external_info_delete (DEFAULT_ROUTE, p);
                   6489:     route_table_finish (EXTERNAL_INFO (DEFAULT_ROUTE));
                   6490:     EXTERNAL_INFO (DEFAULT_ROUTE) = NULL;
                   6491:   }
                   6492: 
                   6493:   ospf_routemap_unset (ospf, DEFAULT_ROUTE);
                   6494:   return ospf_redistribute_default_unset (ospf);
                   6495: }
                   6496: 
                   6497: DEFUN (ospf_default_metric,
                   6498:        ospf_default_metric_cmd,
                   6499:        "default-metric <0-16777214>",
                   6500:        "Set metric of redistributed routes\n"
                   6501:        "Default metric\n")
                   6502: {
                   6503:   struct ospf *ospf = vty->index;
                   6504:   int metric = -1;
                   6505: 
                   6506:   if (!str2metric (argv[0], &metric))
                   6507:     return CMD_WARNING;
                   6508: 
                   6509:   ospf->default_metric = metric;
                   6510: 
                   6511:   return CMD_SUCCESS;
                   6512: }
                   6513: 
                   6514: DEFUN (no_ospf_default_metric,
                   6515:        no_ospf_default_metric_cmd,
                   6516:        "no default-metric",
                   6517:        NO_STR
                   6518:        "Set metric of redistributed routes\n")
                   6519: {
                   6520:   struct ospf *ospf = vty->index;
                   6521: 
                   6522:   ospf->default_metric = -1;
                   6523: 
                   6524:   return CMD_SUCCESS;
                   6525: }
                   6526: 
                   6527: ALIAS (no_ospf_default_metric,
                   6528:        no_ospf_default_metric_val_cmd,
                   6529:        "no default-metric <0-16777214>",
                   6530:        NO_STR
                   6531:        "Set metric of redistributed routes\n"
                   6532:        "Default metric\n")
                   6533: 
                   6534: DEFUN (ospf_distance,
                   6535:        ospf_distance_cmd,
                   6536:        "distance <1-255>",
                   6537:        "Define an administrative distance\n"
                   6538:        "OSPF Administrative distance\n")
                   6539: {
                   6540:   struct ospf *ospf = vty->index;
                   6541: 
                   6542:   ospf->distance_all = atoi (argv[0]);
                   6543: 
                   6544:   return CMD_SUCCESS;
                   6545: }
                   6546: 
                   6547: DEFUN (no_ospf_distance,
                   6548:        no_ospf_distance_cmd,
                   6549:        "no distance <1-255>",
                   6550:        NO_STR
                   6551:        "Define an administrative distance\n"
                   6552:        "OSPF Administrative distance\n")
                   6553: {
                   6554:   struct ospf *ospf = vty->index;
                   6555: 
                   6556:   ospf->distance_all = 0;
                   6557: 
                   6558:   return CMD_SUCCESS;
                   6559: }
                   6560: 
                   6561: DEFUN (no_ospf_distance_ospf,
                   6562:        no_ospf_distance_ospf_cmd,
                   6563:        "no distance ospf",
                   6564:        NO_STR
                   6565:        "Define an administrative distance\n"
                   6566:        "OSPF Administrative distance\n"
                   6567:        "OSPF Distance\n")
                   6568: {
                   6569:   struct ospf *ospf = vty->index;
                   6570: 
                   6571:   ospf->distance_intra = 0;
                   6572:   ospf->distance_inter = 0;
                   6573:   ospf->distance_external = 0;
                   6574: 
                   6575:   return CMD_SUCCESS;
                   6576: }
                   6577: 
                   6578: DEFUN (ospf_distance_ospf_intra,
                   6579:        ospf_distance_ospf_intra_cmd,
                   6580:        "distance ospf intra-area <1-255>",
                   6581:        "Define an administrative distance\n"
                   6582:        "OSPF Administrative distance\n"
                   6583:        "Intra-area routes\n"
                   6584:        "Distance for intra-area routes\n")
                   6585: {
                   6586:   struct ospf *ospf = vty->index;
                   6587: 
                   6588:   ospf->distance_intra = atoi (argv[0]);
                   6589: 
                   6590:   return CMD_SUCCESS;
                   6591: }
                   6592: 
                   6593: DEFUN (ospf_distance_ospf_intra_inter,
                   6594:        ospf_distance_ospf_intra_inter_cmd,
                   6595:        "distance ospf intra-area <1-255> inter-area <1-255>",
                   6596:        "Define an administrative distance\n"
                   6597:        "OSPF Administrative distance\n"
                   6598:        "Intra-area routes\n"
                   6599:        "Distance for intra-area routes\n"
                   6600:        "Inter-area routes\n"
                   6601:        "Distance for inter-area routes\n")
                   6602: {
                   6603:   struct ospf *ospf = vty->index;
                   6604: 
                   6605:   ospf->distance_intra = atoi (argv[0]);
                   6606:   ospf->distance_inter = atoi (argv[1]);
                   6607: 
                   6608:   return CMD_SUCCESS;
                   6609: }
                   6610: 
                   6611: DEFUN (ospf_distance_ospf_intra_external,
                   6612:        ospf_distance_ospf_intra_external_cmd,
                   6613:        "distance ospf intra-area <1-255> external <1-255>",
                   6614:        "Define an administrative distance\n"
                   6615:        "OSPF Administrative distance\n"
                   6616:        "Intra-area routes\n"
                   6617:        "Distance for intra-area routes\n"
                   6618:        "External routes\n"
                   6619:        "Distance for external routes\n")
                   6620: {
                   6621:   struct ospf *ospf = vty->index;
                   6622: 
                   6623:   ospf->distance_intra = atoi (argv[0]);
                   6624:   ospf->distance_external = atoi (argv[1]);
                   6625: 
                   6626:   return CMD_SUCCESS;
                   6627: }
                   6628: 
                   6629: DEFUN (ospf_distance_ospf_intra_inter_external,
                   6630:        ospf_distance_ospf_intra_inter_external_cmd,
                   6631:        "distance ospf intra-area <1-255> inter-area <1-255> external <1-255>",
                   6632:        "Define an administrative distance\n"
                   6633:        "OSPF Administrative distance\n"
                   6634:        "Intra-area routes\n"
                   6635:        "Distance for intra-area routes\n"
                   6636:        "Inter-area routes\n"
                   6637:        "Distance for inter-area routes\n"
                   6638:        "External routes\n"
                   6639:        "Distance for external routes\n")
                   6640: {
                   6641:   struct ospf *ospf = vty->index;
                   6642: 
                   6643:   ospf->distance_intra = atoi (argv[0]);
                   6644:   ospf->distance_inter = atoi (argv[1]);
                   6645:   ospf->distance_external = atoi (argv[2]);
                   6646: 
                   6647:   return CMD_SUCCESS;
                   6648: }
                   6649: 
                   6650: DEFUN (ospf_distance_ospf_intra_external_inter,
                   6651:        ospf_distance_ospf_intra_external_inter_cmd,
                   6652:        "distance ospf intra-area <1-255> external <1-255> inter-area <1-255>",
                   6653:        "Define an administrative distance\n"
                   6654:        "OSPF Administrative distance\n"
                   6655:        "Intra-area routes\n"
                   6656:        "Distance for intra-area routes\n"
                   6657:        "External routes\n"
                   6658:        "Distance for external routes\n"
                   6659:        "Inter-area routes\n"
                   6660:        "Distance for inter-area routes\n")
                   6661: {
                   6662:   struct ospf *ospf = vty->index;
                   6663: 
                   6664:   ospf->distance_intra = atoi (argv[0]);
                   6665:   ospf->distance_external = atoi (argv[1]);
                   6666:   ospf->distance_inter = atoi (argv[2]);
                   6667: 
                   6668:   return CMD_SUCCESS;
                   6669: }
                   6670: 
                   6671: DEFUN (ospf_distance_ospf_inter,
                   6672:        ospf_distance_ospf_inter_cmd,
                   6673:        "distance ospf inter-area <1-255>",
                   6674:        "Define an administrative distance\n"
                   6675:        "OSPF Administrative distance\n"
                   6676:        "Inter-area routes\n"
                   6677:        "Distance for inter-area routes\n")
                   6678: {
                   6679:   struct ospf *ospf = vty->index;
                   6680: 
                   6681:   ospf->distance_inter = atoi (argv[0]);
                   6682: 
                   6683:   return CMD_SUCCESS;
                   6684: }
                   6685: 
                   6686: DEFUN (ospf_distance_ospf_inter_intra,
                   6687:        ospf_distance_ospf_inter_intra_cmd,
                   6688:        "distance ospf inter-area <1-255> intra-area <1-255>",
                   6689:        "Define an administrative distance\n"
                   6690:        "OSPF Administrative distance\n"
                   6691:        "Inter-area routes\n"
                   6692:        "Distance for inter-area routes\n"
                   6693:        "Intra-area routes\n"
                   6694:        "Distance for intra-area routes\n")
                   6695: {
                   6696:   struct ospf *ospf = vty->index;
                   6697: 
                   6698:   ospf->distance_inter = atoi (argv[0]);
                   6699:   ospf->distance_intra = atoi (argv[1]);
                   6700: 
                   6701:   return CMD_SUCCESS;
                   6702: }
                   6703: 
                   6704: DEFUN (ospf_distance_ospf_inter_external,
                   6705:        ospf_distance_ospf_inter_external_cmd,
                   6706:        "distance ospf inter-area <1-255> external <1-255>",
                   6707:        "Define an administrative distance\n"
                   6708:        "OSPF Administrative distance\n"
                   6709:        "Inter-area routes\n"
                   6710:        "Distance for inter-area routes\n"
                   6711:        "External routes\n"
                   6712:        "Distance for external routes\n")
                   6713: {
                   6714:   struct ospf *ospf = vty->index;
                   6715: 
                   6716:   ospf->distance_inter = atoi (argv[0]);
                   6717:   ospf->distance_external = atoi (argv[1]);
                   6718: 
                   6719:   return CMD_SUCCESS;
                   6720: }
                   6721: 
                   6722: DEFUN (ospf_distance_ospf_inter_intra_external,
                   6723:        ospf_distance_ospf_inter_intra_external_cmd,
                   6724:        "distance ospf inter-area <1-255> intra-area <1-255> external <1-255>",
                   6725:        "Define an administrative distance\n"
                   6726:        "OSPF Administrative distance\n"
                   6727:        "Inter-area routes\n"
                   6728:        "Distance for inter-area routes\n"
                   6729:        "Intra-area routes\n"
                   6730:        "Distance for intra-area routes\n"
                   6731:        "External routes\n"
                   6732:        "Distance for external routes\n")
                   6733: {
                   6734:   struct ospf *ospf = vty->index;
                   6735: 
                   6736:   ospf->distance_inter = atoi (argv[0]);
                   6737:   ospf->distance_intra = atoi (argv[1]);
                   6738:   ospf->distance_external = atoi (argv[2]);
                   6739: 
                   6740:   return CMD_SUCCESS;
                   6741: }
                   6742: 
                   6743: DEFUN (ospf_distance_ospf_inter_external_intra,
                   6744:        ospf_distance_ospf_inter_external_intra_cmd,
                   6745:        "distance ospf inter-area <1-255> external <1-255> intra-area <1-255>",
                   6746:        "Define an administrative distance\n"
                   6747:        "OSPF Administrative distance\n"
                   6748:        "Inter-area routes\n"
                   6749:        "Distance for inter-area routes\n"
                   6750:        "External routes\n"
                   6751:        "Distance for external routes\n"
                   6752:        "Intra-area routes\n"
                   6753:        "Distance for intra-area routes\n")
                   6754: {
                   6755:   struct ospf *ospf = vty->index;
                   6756: 
                   6757:   ospf->distance_inter = atoi (argv[0]);
                   6758:   ospf->distance_external = atoi (argv[1]);
                   6759:   ospf->distance_intra = atoi (argv[2]);
                   6760: 
                   6761:   return CMD_SUCCESS;
                   6762: }
                   6763: 
                   6764: DEFUN (ospf_distance_ospf_external,
                   6765:        ospf_distance_ospf_external_cmd,
                   6766:        "distance ospf external <1-255>",
                   6767:        "Define an administrative distance\n"
                   6768:        "OSPF Administrative distance\n"
                   6769:        "External routes\n"
                   6770:        "Distance for external routes\n")
                   6771: {
                   6772:   struct ospf *ospf = vty->index;
                   6773: 
                   6774:   ospf->distance_external = atoi (argv[0]);
                   6775: 
                   6776:   return CMD_SUCCESS;
                   6777: }
                   6778: 
                   6779: DEFUN (ospf_distance_ospf_external_intra,
                   6780:        ospf_distance_ospf_external_intra_cmd,
                   6781:        "distance ospf external <1-255> intra-area <1-255>",
                   6782:        "Define an administrative distance\n"
                   6783:        "OSPF Administrative distance\n"
                   6784:        "External routes\n"
                   6785:        "Distance for external routes\n"
                   6786:        "Intra-area routes\n"
                   6787:        "Distance for intra-area routes\n")
                   6788: {
                   6789:   struct ospf *ospf = vty->index;
                   6790: 
                   6791:   ospf->distance_external = atoi (argv[0]);
                   6792:   ospf->distance_intra = atoi (argv[1]);
                   6793: 
                   6794:   return CMD_SUCCESS;
                   6795: }
                   6796: 
                   6797: DEFUN (ospf_distance_ospf_external_inter,
                   6798:        ospf_distance_ospf_external_inter_cmd,
                   6799:        "distance ospf external <1-255> inter-area <1-255>",
                   6800:        "Define an administrative distance\n"
                   6801:        "OSPF Administrative distance\n"
                   6802:        "External routes\n"
                   6803:        "Distance for external routes\n"
                   6804:        "Inter-area routes\n"
                   6805:        "Distance for inter-area routes\n")
                   6806: {
                   6807:   struct ospf *ospf = vty->index;
                   6808: 
                   6809:   ospf->distance_external = atoi (argv[0]);
                   6810:   ospf->distance_inter = atoi (argv[1]);
                   6811: 
                   6812:   return CMD_SUCCESS;
                   6813: }
                   6814: 
                   6815: DEFUN (ospf_distance_ospf_external_intra_inter,
                   6816:        ospf_distance_ospf_external_intra_inter_cmd,
                   6817:        "distance ospf external <1-255> intra-area <1-255> inter-area <1-255>",
                   6818:        "Define an administrative distance\n"
                   6819:        "OSPF Administrative distance\n"
                   6820:        "External routes\n"
                   6821:        "Distance for external routes\n"
                   6822:        "Intra-area routes\n"
                   6823:        "Distance for intra-area routes\n"
                   6824:        "Inter-area routes\n"
                   6825:        "Distance for inter-area routes\n")
                   6826: {
                   6827:   struct ospf *ospf = vty->index;
                   6828: 
                   6829:   ospf->distance_external = atoi (argv[0]);
                   6830:   ospf->distance_intra = atoi (argv[1]);
                   6831:   ospf->distance_inter = atoi (argv[2]);
                   6832: 
                   6833:   return CMD_SUCCESS;
                   6834: }
                   6835: 
                   6836: DEFUN (ospf_distance_ospf_external_inter_intra,
                   6837:        ospf_distance_ospf_external_inter_intra_cmd,
                   6838:        "distance ospf external <1-255> inter-area <1-255> intra-area <1-255>",
                   6839:        "Define an administrative distance\n"
                   6840:        "OSPF Administrative distance\n"
                   6841:        "External routes\n"
                   6842:        "Distance for external routes\n"
                   6843:        "Inter-area routes\n"
                   6844:        "Distance for inter-area routes\n"
                   6845:        "Intra-area routes\n"
                   6846:        "Distance for intra-area routes\n")
                   6847: {
                   6848:   struct ospf *ospf = vty->index;
                   6849: 
                   6850:   ospf->distance_external = atoi (argv[0]);
                   6851:   ospf->distance_inter = atoi (argv[1]);
                   6852:   ospf->distance_intra = atoi (argv[2]);
                   6853: 
                   6854:   return CMD_SUCCESS;
                   6855: }
                   6856: 
                   6857: DEFUN (ospf_distance_source,
                   6858:        ospf_distance_source_cmd,
                   6859:        "distance <1-255> A.B.C.D/M",
                   6860:        "Administrative distance\n"
                   6861:        "Distance value\n"
                   6862:        "IP source prefix\n")
                   6863: {
                   6864:   struct ospf *ospf = vty->index;
                   6865: 
                   6866:   ospf_distance_set (vty, ospf, argv[0], argv[1], NULL);
                   6867: 
                   6868:   return CMD_SUCCESS;
                   6869: }
                   6870: 
                   6871: DEFUN (no_ospf_distance_source,
                   6872:        no_ospf_distance_source_cmd,
                   6873:        "no distance <1-255> A.B.C.D/M",
                   6874:        NO_STR
                   6875:        "Administrative distance\n"
                   6876:        "Distance value\n"
                   6877:        "IP source prefix\n")
                   6878: {
                   6879:   struct ospf *ospf = vty->index;
                   6880: 
                   6881:   ospf_distance_unset (vty, ospf, argv[0], argv[1], NULL);
                   6882: 
                   6883:   return CMD_SUCCESS;
                   6884: }
                   6885: 
                   6886: DEFUN (ospf_distance_source_access_list,
                   6887:        ospf_distance_source_access_list_cmd,
                   6888:        "distance <1-255> A.B.C.D/M WORD",
                   6889:        "Administrative distance\n"
                   6890:        "Distance value\n"
                   6891:        "IP source prefix\n"
                   6892:        "Access list name\n")
                   6893: {
                   6894:   struct ospf *ospf = vty->index;
                   6895: 
                   6896:   ospf_distance_set (vty, ospf, argv[0], argv[1], argv[2]);
                   6897: 
                   6898:   return CMD_SUCCESS;
                   6899: }
                   6900: 
                   6901: DEFUN (no_ospf_distance_source_access_list,
                   6902:        no_ospf_distance_source_access_list_cmd,
                   6903:        "no distance <1-255> A.B.C.D/M WORD",
                   6904:        NO_STR
                   6905:        "Administrative distance\n"
                   6906:        "Distance value\n"
                   6907:        "IP source prefix\n"
                   6908:        "Access list name\n")
                   6909: {
                   6910:   struct ospf *ospf = vty->index;
                   6911: 
                   6912:   ospf_distance_unset (vty, ospf, argv[0], argv[1], argv[2]);
                   6913: 
                   6914:   return CMD_SUCCESS;
                   6915: }
                   6916: 
                   6917: DEFUN (ip_ospf_mtu_ignore,
                   6918:        ip_ospf_mtu_ignore_addr_cmd,
                   6919:        "ip ospf mtu-ignore A.B.C.D",
                   6920:        "IP Information\n"
                   6921:        "OSPF interface commands\n"
                   6922:        "Disable mtu mismatch detection\n"
                   6923:        "Address of interface")
                   6924: {
                   6925:   struct interface *ifp = vty->index;
                   6926:   struct in_addr addr;
                   6927:   int ret;
                   6928:           
                   6929:   struct ospf_if_params *params;
                   6930:   params = IF_DEF_PARAMS (ifp);
                   6931:         
                   6932:   if (argc == 1)
                   6933:     {
                   6934:       ret = inet_aton(argv[0], &addr);
                   6935:       if (!ret)
                   6936:         {
                   6937:           vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   6938:                   VTY_NEWLINE);
                   6939:           return CMD_WARNING;
                   6940:         }
                   6941:       params = ospf_get_if_params (ifp, addr);
                   6942:       ospf_if_update_params (ifp, addr);
                   6943:     }
                   6944:   params->mtu_ignore = 1;
                   6945:   if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
                   6946:     SET_IF_PARAM (params, mtu_ignore);
                   6947:   else 
                   6948:     {
                   6949:       UNSET_IF_PARAM (params, mtu_ignore);
                   6950:       if (params != IF_DEF_PARAMS (ifp))
                   6951:         {
                   6952:           ospf_free_if_params (ifp, addr);
                   6953:           ospf_if_update_params (ifp, addr);
                   6954:         }
                   6955:     }
                   6956:   return CMD_SUCCESS;
                   6957: }
                   6958: 
                   6959: ALIAS (ip_ospf_mtu_ignore,
                   6960:       ip_ospf_mtu_ignore_cmd,
                   6961:       "ip ospf mtu-ignore",
                   6962:       "IP Information\n"
                   6963:       "OSPF interface commands\n"
                   6964:       "Disable mtu mismatch detection\n")
                   6965: 
                   6966:     
                   6967: DEFUN (no_ip_ospf_mtu_ignore,
                   6968:        no_ip_ospf_mtu_ignore_addr_cmd,
                   6969:        "no ip ospf mtu-ignore A.B.C.D",
                   6970:        "IP Information\n"
                   6971:        "OSPF interface commands\n"
                   6972:        "Disable mtu mismatch detection\n"
                   6973:        "Address of interface")
                   6974: {
                   6975:   struct interface *ifp = vty->index;
                   6976:   struct in_addr addr;
                   6977:   int ret;
                   6978:           
                   6979:   struct ospf_if_params *params;
                   6980:   params = IF_DEF_PARAMS (ifp);
                   6981:         
                   6982:   if (argc == 1)
                   6983:     {
                   6984:       ret = inet_aton(argv[0], &addr);
                   6985:       if (!ret)
                   6986:         {
                   6987:           vty_out (vty, "Please specify interface address by A.B.C.D%s",
                   6988:                   VTY_NEWLINE);
                   6989:           return CMD_WARNING;
                   6990:         }
                   6991:       params = ospf_get_if_params (ifp, addr);
                   6992:       ospf_if_update_params (ifp, addr);
                   6993:     }
                   6994:   params->mtu_ignore = 0;
                   6995:   if (params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
                   6996:     SET_IF_PARAM (params, mtu_ignore);
                   6997:   else 
                   6998:     {
                   6999:       UNSET_IF_PARAM (params, mtu_ignore);
                   7000:       if (params != IF_DEF_PARAMS (ifp))
                   7001:         {
                   7002:           ospf_free_if_params (ifp, addr);
                   7003:           ospf_if_update_params (ifp, addr);
                   7004:         }
                   7005:     }
                   7006:   return CMD_SUCCESS;
                   7007: }
                   7008: 
                   7009: ALIAS (no_ip_ospf_mtu_ignore,
                   7010:        no_ip_ospf_mtu_ignore_cmd,
                   7011:       "no ip ospf mtu-ignore",
                   7012:       "IP Information\n"
                   7013:       "OSPF interface commands\n"
                   7014:       "Disable mtu mismatch detection\n")
                   7015: 
                   7016: DEFUN (ospf_max_metric_router_lsa_admin,
                   7017:        ospf_max_metric_router_lsa_admin_cmd,
                   7018:        "max-metric router-lsa administrative",
                   7019:        "OSPF maximum / infinite-distance metric\n"
                   7020:        "Advertise own Router-LSA with infinite distance (stub router)\n"
                   7021:        "Administratively applied, for an indefinite period\n")
                   7022: {
                   7023:   struct listnode *ln;
                   7024:   struct ospf_area *area;
                   7025:   struct ospf *ospf = vty->index;
                   7026:     
                   7027:   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
                   7028:     {
                   7029:       SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
                   7030:       
                   7031:       if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
                   7032:           ospf_router_lsa_update_area (area);
                   7033:     }
                   7034:   return CMD_SUCCESS;
                   7035: }
                   7036: 
                   7037: DEFUN (no_ospf_max_metric_router_lsa_admin,
                   7038:        no_ospf_max_metric_router_lsa_admin_cmd,
                   7039:        "no max-metric router-lsa administrative",
                   7040:        NO_STR
                   7041:        "OSPF maximum / infinite-distance metric\n"
                   7042:        "Advertise own Router-LSA with infinite distance (stub router)\n"
                   7043:        "Administratively applied, for an indefinite period\n")
                   7044: {
                   7045:   struct listnode *ln;
                   7046:   struct ospf_area *area;
                   7047:   struct ospf *ospf = vty->index;
                   7048:     
                   7049:   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
                   7050:     {
                   7051:       UNSET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
                   7052:       
                   7053:       /* Don't trample on the start-up stub timer */
                   7054:       if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED)
                   7055:           && !area->t_stub_router)
                   7056:         {
                   7057:           UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
                   7058:           ospf_router_lsa_update_area (area);
                   7059:         }
                   7060:     }
                   7061:   return CMD_SUCCESS;
                   7062: }
                   7063: 
                   7064: DEFUN (ospf_max_metric_router_lsa_startup,
                   7065:        ospf_max_metric_router_lsa_startup_cmd,
                   7066:        "max-metric router-lsa on-startup <5-86400>",
                   7067:        "OSPF maximum / infinite-distance metric\n"
                   7068:        "Advertise own Router-LSA with infinite distance (stub router)\n"
                   7069:        "Automatically advertise stub Router-LSA on startup of OSPF\n"
                   7070:        "Time (seconds) to advertise self as stub-router\n")
                   7071: {
                   7072:   unsigned int seconds;
                   7073:   struct ospf *ospf = vty->index;
                   7074:     
                   7075:   if (argc != 1)
                   7076:     {
                   7077:       vty_out (vty, "%% Must supply stub-router period");
                   7078:       return CMD_WARNING;
                   7079:     }
                   7080:   
                   7081:   VTY_GET_INTEGER ("stub-router startup period", seconds, argv[0]);
                   7082:   
                   7083:   ospf->stub_router_startup_time = seconds;
                   7084:   
                   7085:   return CMD_SUCCESS;
                   7086: }
                   7087: 
                   7088: DEFUN (no_ospf_max_metric_router_lsa_startup,
                   7089:        no_ospf_max_metric_router_lsa_startup_cmd,
                   7090:        "no max-metric router-lsa on-startup",
                   7091:        NO_STR
                   7092:        "OSPF maximum / infinite-distance metric\n"
                   7093:        "Advertise own Router-LSA with infinite distance (stub router)\n"
                   7094:        "Automatically advertise stub Router-LSA on startup of OSPF\n")
                   7095: {
                   7096:   struct listnode *ln;
                   7097:   struct ospf_area *area;
                   7098:   struct ospf *ospf = vty->index;
                   7099:   
                   7100:   ospf->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
                   7101:   
                   7102:   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
                   7103:     {
                   7104:       SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
                   7105:       OSPF_TIMER_OFF (area->t_stub_router);
                   7106:       
                   7107:       /* Don't trample on admin stub routed */
                   7108:       if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
                   7109:         {
                   7110:           UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
                   7111:           ospf_router_lsa_update_area (area);
                   7112:         }
                   7113:     }
                   7114:   return CMD_SUCCESS;
                   7115: }
                   7116: 
                   7117: DEFUN (ospf_max_metric_router_lsa_shutdown,
                   7118:        ospf_max_metric_router_lsa_shutdown_cmd,
                   7119:        "max-metric router-lsa on-shutdown <5-86400>",
                   7120:        "OSPF maximum / infinite-distance metric\n"
                   7121:        "Advertise own Router-LSA with infinite distance (stub router)\n"
                   7122:        "Advertise stub-router prior to full shutdown of OSPF\n"
                   7123:        "Time (seconds) to wait till full shutdown\n")
                   7124: {
                   7125:   unsigned int seconds;
                   7126:   struct ospf *ospf = vty->index;
                   7127:     
                   7128:   if (argc != 1)
                   7129:     {
                   7130:       vty_out (vty, "%% Must supply stub-router shutdown period");
                   7131:       return CMD_WARNING;
                   7132:     }
                   7133:   
                   7134:   VTY_GET_INTEGER ("stub-router shutdown wait period", seconds, argv[0]);
                   7135:   
                   7136:   ospf->stub_router_shutdown_time = seconds;
                   7137:   
                   7138:   return CMD_SUCCESS;
                   7139: }
                   7140: 
                   7141: DEFUN (no_ospf_max_metric_router_lsa_shutdown,
                   7142:        no_ospf_max_metric_router_lsa_shutdown_cmd,
                   7143:        "no max-metric router-lsa on-shutdown",
                   7144:        NO_STR
                   7145:        "OSPF maximum / infinite-distance metric\n"
                   7146:        "Advertise own Router-LSA with infinite distance (stub router)\n"
                   7147:        "Advertise stub-router prior to full shutdown of OSPF\n")
                   7148: {
                   7149:   struct ospf *ospf = vty->index;
                   7150:     
                   7151:   ospf->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
                   7152:   
                   7153:   return CMD_SUCCESS;
                   7154: }
                   7155: 
                   7156: static void
                   7157: config_write_stub_router (struct vty *vty, struct ospf *ospf)
                   7158: {
                   7159:   struct listnode *ln;
                   7160:   struct ospf_area *area;
                   7161:   
                   7162:   if (ospf->stub_router_startup_time != OSPF_STUB_ROUTER_UNCONFIGURED)
                   7163:     vty_out (vty, " max-metric router-lsa on-startup %u%s",
                   7164:              ospf->stub_router_startup_time, VTY_NEWLINE);
                   7165:   if (ospf->stub_router_shutdown_time != OSPF_STUB_ROUTER_UNCONFIGURED)
                   7166:     vty_out (vty, " max-metric router-lsa on-shutdown %u%s",
                   7167:              ospf->stub_router_shutdown_time, VTY_NEWLINE);
                   7168:   for (ALL_LIST_ELEMENTS_RO (ospf->areas, ln, area))
                   7169:     {
                   7170:       if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
                   7171:         {
                   7172:           vty_out (vty, " max-metric router-lsa administrative%s",
                   7173:                    VTY_NEWLINE);
                   7174:           break;
                   7175:         }
                   7176:     }
                   7177:   return;
                   7178: }
                   7179: 
                   7180: static void
                   7181: show_ip_ospf_route_network (struct vty *vty, struct route_table *rt)
                   7182: {
                   7183:   struct route_node *rn;
                   7184:   struct ospf_route *or;
                   7185:   struct listnode *pnode, *pnnode;
                   7186:   struct ospf_path *path;
                   7187: 
                   7188:   vty_out (vty, "============ OSPF network routing table ============%s",
                   7189:           VTY_NEWLINE);
                   7190: 
                   7191:   for (rn = route_top (rt); rn; rn = route_next (rn))
                   7192:     if ((or = rn->info) != NULL)
                   7193:       {
                   7194:        char buf1[19];
                   7195:        snprintf (buf1, 19, "%s/%d",
                   7196:                  inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
                   7197: 
                   7198:        switch (or->path_type)
                   7199:          {
                   7200:          case OSPF_PATH_INTER_AREA:
                   7201:            if (or->type == OSPF_DESTINATION_NETWORK)
                   7202:              vty_out (vty, "N IA %-18s    [%d] area: %s%s", buf1, or->cost,
                   7203:                       inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
                   7204:            else if (or->type == OSPF_DESTINATION_DISCARD)
                   7205:              vty_out (vty, "D IA %-18s    Discard entry%s", buf1, VTY_NEWLINE);
                   7206:            break;
                   7207:          case OSPF_PATH_INTRA_AREA:
                   7208:            vty_out (vty, "N    %-18s    [%d] area: %s%s", buf1, or->cost,
                   7209:                     inet_ntoa (or->u.std.area_id), VTY_NEWLINE);
                   7210:            break;
                   7211:          default:
                   7212:            break;
                   7213:          }
                   7214: 
                   7215:         if (or->type == OSPF_DESTINATION_NETWORK)
                   7216:           for (ALL_LIST_ELEMENTS (or->paths, pnode, pnnode, path))
                   7217:             {
                   7218:               if (if_lookup_by_index(path->ifindex))
                   7219:                 {
                   7220:                   if (path->nexthop.s_addr == 0)
                   7221:                     vty_out (vty, "%24s   directly attached to %s%s",
                   7222:                              "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
                   7223:                   else
                   7224:                     vty_out (vty, "%24s   via %s, %s%s", "",
                   7225:                              inet_ntoa (path->nexthop),
                   7226:                             ifindex2ifname (path->ifindex), VTY_NEWLINE);
                   7227:                 }
                   7228:             }
                   7229:       }
                   7230:   vty_out (vty, "%s", VTY_NEWLINE);
                   7231: }
                   7232: 
                   7233: static void
                   7234: show_ip_ospf_route_router (struct vty *vty, struct route_table *rtrs)
                   7235: {
                   7236:   struct route_node *rn;
                   7237:   struct ospf_route *or;
                   7238:   struct listnode *pnode;
                   7239:   struct listnode *node;
                   7240:   struct ospf_path *path;
                   7241: 
                   7242:   vty_out (vty, "============ OSPF router routing table =============%s",
                   7243:           VTY_NEWLINE);
                   7244:   for (rn = route_top (rtrs); rn; rn = route_next (rn))
                   7245:     if (rn->info)
                   7246:       {
                   7247:        int flag = 0;
                   7248: 
                   7249:        vty_out (vty, "R    %-15s    ", inet_ntoa (rn->p.u.prefix4));
                   7250: 
                   7251:        for (ALL_LIST_ELEMENTS_RO ((struct list *)rn->info, node, or))
                   7252:           {
                   7253:             if (flag++)
                   7254:           vty_out (vty, "%24s", "");
                   7255: 
                   7256:             /* Show path. */
                   7257:             vty_out (vty, "%s [%d] area: %s",
                   7258:                      (or->path_type == OSPF_PATH_INTER_AREA ? "IA" : "  "),
                   7259:                      or->cost, inet_ntoa (or->u.std.area_id));
                   7260:             /* Show flags. */
                   7261:             vty_out (vty, "%s%s%s",
                   7262:                      (or->u.std.flags & ROUTER_LSA_BORDER ? ", ABR" : ""),
                   7263:                      (or->u.std.flags & ROUTER_LSA_EXTERNAL ? ", ASBR" : ""),
                   7264:                      VTY_NEWLINE);
                   7265:                   
                   7266:                   for (ALL_LIST_ELEMENTS_RO (or->paths, pnode, path))
                   7267:                     {
                   7268:                      if (if_lookup_by_index(path->ifindex))
                   7269:                        {
                   7270:                          if (path->nexthop.s_addr == 0)
                   7271:                            vty_out (vty, "%24s   directly attached to %s%s",
                   7272:                                     "", ifindex2ifname (path->ifindex),
                   7273:                                     VTY_NEWLINE);
                   7274:                          else
                   7275:                            vty_out (vty, "%24s   via %s, %s%s", "",
                   7276:                                     inet_ntoa (path->nexthop),
                   7277:                                     ifindex2ifname (path->ifindex),
                   7278:                                     VTY_NEWLINE);
                   7279:                        }
                   7280:                     }
                   7281:           }
                   7282:       }
                   7283:   vty_out (vty, "%s", VTY_NEWLINE);
                   7284: }
                   7285: 
                   7286: static void
                   7287: show_ip_ospf_route_external (struct vty *vty, struct route_table *rt)
                   7288: {
                   7289:   struct route_node *rn;
                   7290:   struct ospf_route *er;
                   7291:   struct listnode *pnode, *pnnode;
                   7292:   struct ospf_path *path;
                   7293: 
                   7294:   vty_out (vty, "============ OSPF external routing table ===========%s",
                   7295:           VTY_NEWLINE);
                   7296:   for (rn = route_top (rt); rn; rn = route_next (rn))
                   7297:     if ((er = rn->info) != NULL)
                   7298:       {
                   7299:        char buf1[19];
                   7300:        snprintf (buf1, 19, "%s/%d",
                   7301:                  inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
                   7302: 
                   7303:        switch (er->path_type)
                   7304:          {
                   7305:          case OSPF_PATH_TYPE1_EXTERNAL:
                   7306:            vty_out (vty, "N E1 %-18s    [%d] tag: %u%s", buf1,
                   7307:                     er->cost, er->u.ext.tag, VTY_NEWLINE);
                   7308:            break;
                   7309:          case OSPF_PATH_TYPE2_EXTERNAL:
                   7310:            vty_out (vty, "N E2 %-18s    [%d/%d] tag: %u%s", buf1, er->cost,
                   7311:                     er->u.ext.type2_cost, er->u.ext.tag, VTY_NEWLINE);
                   7312:            break;
                   7313:          }
                   7314: 
                   7315:         for (ALL_LIST_ELEMENTS (er->paths, pnode, pnnode, path))
                   7316:           {
                   7317:             if (if_lookup_by_index(path->ifindex))
                   7318:               {
                   7319:                 if (path->nexthop.s_addr == 0)
                   7320:                   vty_out (vty, "%24s   directly attached to %s%s",
                   7321:                            "", ifindex2ifname (path->ifindex), VTY_NEWLINE);
                   7322:                 else
                   7323:                   vty_out (vty, "%24s   via %s, %s%s", "",
                   7324:                            inet_ntoa (path->nexthop),
                   7325:                           ifindex2ifname (path->ifindex),
                   7326:                            VTY_NEWLINE);
                   7327:               }
                   7328:            }
                   7329:         }
                   7330:   vty_out (vty, "%s", VTY_NEWLINE);
                   7331: }
                   7332: 
                   7333: DEFUN (show_ip_ospf_border_routers,
                   7334:        show_ip_ospf_border_routers_cmd,
                   7335:        "show ip ospf border-routers",
                   7336:        SHOW_STR
                   7337:        IP_STR
                   7338:        "show all the ABR's and ASBR's\n"
                   7339:        "for this area\n")
                   7340: {
                   7341:   struct ospf *ospf;
                   7342: 
                   7343:   if ((ospf = ospf_lookup ()) == NULL)
                   7344:     {
                   7345:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   7346:       return CMD_SUCCESS;
                   7347:     }
                   7348: 
                   7349:   if (ospf->new_table == NULL)
                   7350:     {
                   7351:       vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
                   7352:       return CMD_SUCCESS;
                   7353:     }
                   7354: 
                   7355:   /* Show Network routes.
                   7356:   show_ip_ospf_route_network (vty, ospf->new_table);   */
                   7357: 
                   7358:   /* Show Router routes. */
                   7359:   show_ip_ospf_route_router (vty, ospf->new_rtrs);
                   7360: 
                   7361:   return CMD_SUCCESS;
                   7362: }
                   7363: 
                   7364: DEFUN (show_ip_ospf_route,
                   7365:        show_ip_ospf_route_cmd,
                   7366:        "show ip ospf route",
                   7367:        SHOW_STR
                   7368:        IP_STR
                   7369:        "OSPF information\n"
                   7370:        "OSPF routing table\n")
                   7371: {
                   7372:   struct ospf *ospf;
                   7373: 
                   7374:   if ((ospf = ospf_lookup ()) == NULL)
                   7375:     {
                   7376:       vty_out (vty, " OSPF Routing Process not enabled%s", VTY_NEWLINE);
                   7377:       return CMD_SUCCESS;
                   7378:     }
                   7379: 
                   7380:   if (ospf->new_table == NULL)
                   7381:     {
                   7382:       vty_out (vty, "No OSPF routing information exist%s", VTY_NEWLINE);
                   7383:       return CMD_SUCCESS;
                   7384:     }
                   7385: 
                   7386:   /* Show Network routes. */
                   7387:   show_ip_ospf_route_network (vty, ospf->new_table);
                   7388: 
                   7389:   /* Show Router routes. */
                   7390:   show_ip_ospf_route_router (vty, ospf->new_rtrs);
                   7391: 
                   7392:   /* Show AS External routes. */
                   7393:   show_ip_ospf_route_external (vty, ospf->old_external_route);
                   7394: 
                   7395:   return CMD_SUCCESS;
                   7396: }
                   7397: 
                   7398: 
                   7399: const char *ospf_abr_type_str[] = 
                   7400: {
                   7401:   "unknown",
                   7402:   "standard",
                   7403:   "ibm",
                   7404:   "cisco",
                   7405:   "shortcut"
                   7406: };
                   7407: 
                   7408: const char *ospf_shortcut_mode_str[] = 
                   7409: {
                   7410:   "default",
                   7411:   "enable",
                   7412:   "disable"
                   7413: };
                   7414: 
                   7415: 
                   7416: static void
                   7417: area_id2str (char *buf, int length, struct ospf_area *area)
                   7418: {
                   7419:   memset (buf, 0, length);
                   7420: 
                   7421:   if (area->format == OSPF_AREA_ID_FORMAT_ADDRESS)
                   7422:     strncpy (buf, inet_ntoa (area->area_id), length);
                   7423:   else
                   7424:     sprintf (buf, "%lu", (unsigned long) ntohl (area->area_id.s_addr));
                   7425: }
                   7426: 
                   7427: 
                   7428: const char *ospf_int_type_str[] = 
                   7429: {
                   7430:   "unknown",           /* should never be used. */
                   7431:   "point-to-point",
                   7432:   "broadcast",
                   7433:   "non-broadcast",
                   7434:   "point-to-multipoint",
                   7435:   "virtual-link",      /* should never be used. */
                   7436:   "loopback"
                   7437: };
                   7438: 
                   7439: /* Configuration write function for ospfd. */
                   7440: static int
                   7441: config_write_interface (struct vty *vty)
                   7442: {
                   7443:   struct listnode *n1, *n2;
                   7444:   struct interface *ifp;
                   7445:   struct crypt_key *ck;
                   7446:   int write = 0;
                   7447:   struct route_node *rn = NULL;
                   7448:   struct ospf_if_params *params;
                   7449: 
                   7450:   for (ALL_LIST_ELEMENTS_RO (iflist, n1, ifp))
                   7451:     {
                   7452:       if (memcmp (ifp->name, "VLINK", 5) == 0)
                   7453:        continue;
                   7454: 
                   7455:       vty_out (vty, "!%s", VTY_NEWLINE);
                   7456:       vty_out (vty, "interface %s%s", ifp->name,
                   7457:                VTY_NEWLINE);
                   7458:       if (ifp->desc)
                   7459:         vty_out (vty, " description %s%s", ifp->desc,
                   7460:                VTY_NEWLINE);
                   7461: 
                   7462:       write++;
                   7463: 
                   7464:       params = IF_DEF_PARAMS (ifp);
                   7465:       
                   7466:       do {
                   7467:        /* Interface Network print. */
                   7468:        if (OSPF_IF_PARAM_CONFIGURED (params, type) &&
                   7469:            params->type != OSPF_IFTYPE_LOOPBACK)
                   7470:          {
                   7471:            if (params->type != ospf_default_iftype(ifp))
                   7472:              {
                   7473:                vty_out (vty, " ip ospf network %s",
                   7474:                         ospf_int_type_str[params->type]);
                   7475:                if (params != IF_DEF_PARAMS (ifp))
                   7476:                  vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7477:                vty_out (vty, "%s", VTY_NEWLINE);
                   7478:              }
                   7479:          }
                   7480:        
                   7481:        /* OSPF interface authentication print */
                   7482:        if (OSPF_IF_PARAM_CONFIGURED (params, auth_type) &&
                   7483:            params->auth_type != OSPF_AUTH_NOTSET)
                   7484:          {
                   7485:            const char *auth_str;
                   7486:            
                   7487:            /* Translation tables are not that much help here due to syntax
                   7488:               of the simple option */
                   7489:            switch (params->auth_type)
                   7490:              {
                   7491:                
                   7492:              case OSPF_AUTH_NULL:
                   7493:                auth_str = " null";
                   7494:                break;
                   7495:                
                   7496:              case OSPF_AUTH_SIMPLE:
                   7497:                auth_str = "";
                   7498:                break;
                   7499:                
                   7500:              case OSPF_AUTH_CRYPTOGRAPHIC:
                   7501:                auth_str = " message-digest";
                   7502:                break;
                   7503:                
                   7504:              default:
                   7505:                auth_str = "";
                   7506:                break;
                   7507:              }
                   7508:            
                   7509:            vty_out (vty, " ip ospf authentication%s", auth_str);
                   7510:            if (params != IF_DEF_PARAMS (ifp))
                   7511:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7512:            vty_out (vty, "%s", VTY_NEWLINE);
                   7513:          }
                   7514: 
                   7515:        /* Simple Authentication Password print. */
                   7516:        if (OSPF_IF_PARAM_CONFIGURED (params, auth_simple) &&
                   7517:            params->auth_simple[0] != '\0')
                   7518:          {
                   7519:            vty_out (vty, " ip ospf authentication-key %s",
                   7520:                     params->auth_simple);
                   7521:            if (params != IF_DEF_PARAMS (ifp))
                   7522:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7523:            vty_out (vty, "%s", VTY_NEWLINE);
                   7524:          }
                   7525:        
                   7526:        /* Cryptographic Authentication Key print. */
                   7527:        for (ALL_LIST_ELEMENTS_RO (params->auth_crypt, n2, ck))
                   7528:          {
                   7529:            vty_out (vty, " ip ospf message-digest-key %d md5 %s",
                   7530:                     ck->key_id, ck->auth_key);
                   7531:            if (params != IF_DEF_PARAMS (ifp))
                   7532:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7533:            vty_out (vty, "%s", VTY_NEWLINE);
                   7534:          }
                   7535:        
                   7536:        /* Interface Output Cost print. */
                   7537:        if (OSPF_IF_PARAM_CONFIGURED (params, output_cost_cmd))
                   7538:          {
                   7539:            vty_out (vty, " ip ospf cost %u", params->output_cost_cmd);
                   7540:            if (params != IF_DEF_PARAMS (ifp))
                   7541:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7542:            vty_out (vty, "%s", VTY_NEWLINE);
                   7543:          }
                   7544:        
                   7545:        /* Hello Interval print. */
                   7546:        if (OSPF_IF_PARAM_CONFIGURED (params, v_hello) &&
                   7547:            params->v_hello != OSPF_HELLO_INTERVAL_DEFAULT)
                   7548:          {
                   7549:            vty_out (vty, " ip ospf hello-interval %u", params->v_hello);
                   7550:            if (params != IF_DEF_PARAMS (ifp))
                   7551:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7552:            vty_out (vty, "%s", VTY_NEWLINE);
                   7553:          }
                   7554:        
                   7555:        
                   7556:        /* Router Dead Interval print. */
                   7557:        if (OSPF_IF_PARAM_CONFIGURED (params, v_wait) &&
                   7558:            params->v_wait != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT)
                   7559:          {
                   7560:            vty_out (vty, " ip ospf dead-interval ");
                   7561:            
                   7562:            /* fast hello ? */
                   7563:            if (OSPF_IF_PARAM_CONFIGURED (params, fast_hello))
                   7564:              vty_out (vty, "minimal hello-multiplier %d",
                   7565:                       params->fast_hello);
                   7566:             else
                   7567:               vty_out (vty, "%u", params->v_wait);
                   7568:             
                   7569:            if (params != IF_DEF_PARAMS (ifp))
                   7570:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7571:            vty_out (vty, "%s", VTY_NEWLINE);
                   7572:          }
                   7573:        
                   7574:       /* Router Priority print. */
                   7575:        if (OSPF_IF_PARAM_CONFIGURED (params, priority) &&
                   7576:            params->priority != OSPF_ROUTER_PRIORITY_DEFAULT)
                   7577:          {
                   7578:            vty_out (vty, " ip ospf priority %u", params->priority);
                   7579:            if (params != IF_DEF_PARAMS (ifp))
                   7580:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7581:            vty_out (vty, "%s", VTY_NEWLINE);
                   7582:          }
                   7583:        
                   7584:        /* Retransmit Interval print. */
                   7585:        if (OSPF_IF_PARAM_CONFIGURED (params, retransmit_interval) &&
                   7586:            params->retransmit_interval != OSPF_RETRANSMIT_INTERVAL_DEFAULT)
                   7587:          {
                   7588:            vty_out (vty, " ip ospf retransmit-interval %u",
                   7589:                     params->retransmit_interval);
                   7590:            if (params != IF_DEF_PARAMS (ifp))
                   7591:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7592:            vty_out (vty, "%s", VTY_NEWLINE);
                   7593:          }
                   7594:        
                   7595:        /* Transmit Delay print. */
                   7596:        if (OSPF_IF_PARAM_CONFIGURED (params, transmit_delay) &&
                   7597:            params->transmit_delay != OSPF_TRANSMIT_DELAY_DEFAULT)
                   7598:          {
                   7599:            vty_out (vty, " ip ospf transmit-delay %u", params->transmit_delay);
                   7600:            if (params != IF_DEF_PARAMS (ifp))
                   7601:              vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7602:            vty_out (vty, "%s", VTY_NEWLINE);
                   7603:          }
                   7604: 
                   7605:     /* MTU ignore print. */
                   7606:     if (OSPF_IF_PARAM_CONFIGURED (params, mtu_ignore) &&
                   7607:        params->mtu_ignore != OSPF_MTU_IGNORE_DEFAULT)
                   7608:       {
                   7609:         if (params->mtu_ignore == 0)
                   7610:           vty_out (vty, " no ip ospf mtu-ignore");
                   7611:         else
                   7612:           vty_out (vty, " ip ospf mtu-ignore");
                   7613:         if (params != IF_DEF_PARAMS (ifp))
                   7614:            vty_out (vty, " %s", inet_ntoa (rn->p.u.prefix4));
                   7615:         vty_out (vty, "%s", VTY_NEWLINE);
                   7616:       }
                   7617: 
                   7618: 
                   7619:        while (1)
                   7620:          {
                   7621:            if (rn == NULL)
                   7622:              rn = route_top (IF_OIFS_PARAMS (ifp));
                   7623:            else
                   7624:              rn = route_next (rn);
                   7625: 
                   7626:            if (rn == NULL)
                   7627:              break;
                   7628:            params = rn->info;
                   7629:            if (params != NULL)
                   7630:              break;
                   7631:          }
                   7632:       } while (rn);
                   7633:       
                   7634: #ifdef HAVE_OPAQUE_LSA
                   7635:       ospf_opaque_config_write_if (vty, ifp);
                   7636: #endif /* HAVE_OPAQUE_LSA */
                   7637:     }
                   7638: 
                   7639:   return write;
                   7640: }
                   7641: 
                   7642: static int
                   7643: config_write_network_area (struct vty *vty, struct ospf *ospf)
                   7644: {
                   7645:   struct route_node *rn;
                   7646:   u_char buf[INET_ADDRSTRLEN];
                   7647: 
                   7648:   /* `network area' print. */
                   7649:   for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
                   7650:     if (rn->info)
                   7651:       {
                   7652:        struct ospf_network *n = rn->info;
                   7653: 
                   7654:        memset (buf, 0, INET_ADDRSTRLEN);
                   7655: 
                   7656:        /* Create Area ID string by specified Area ID format. */
                   7657:        if (n->format == OSPF_AREA_ID_FORMAT_ADDRESS)
                   7658:          strncpy ((char *) buf, inet_ntoa (n->area_id), INET_ADDRSTRLEN);
                   7659:        else
                   7660:          sprintf ((char *) buf, "%lu", 
                   7661:                   (unsigned long int) ntohl (n->area_id.s_addr));
                   7662: 
                   7663:        /* Network print. */
                   7664:        vty_out (vty, " network %s/%d area %s%s",
                   7665:                 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
                   7666:                 buf, VTY_NEWLINE);
                   7667:       }
                   7668: 
                   7669:   return 0;
                   7670: }
                   7671: 
                   7672: static int
                   7673: config_write_ospf_area (struct vty *vty, struct ospf *ospf)
                   7674: {
                   7675:   struct listnode *node;
                   7676:   struct ospf_area *area;
                   7677:   u_char buf[INET_ADDRSTRLEN];
                   7678: 
                   7679:   /* Area configuration print. */
                   7680:   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
                   7681:     {
                   7682:       struct route_node *rn1;
                   7683: 
                   7684:       area_id2str ((char *) buf, INET_ADDRSTRLEN, area);
                   7685: 
                   7686:       if (area->auth_type != OSPF_AUTH_NULL)
                   7687:        {
                   7688:          if (area->auth_type == OSPF_AUTH_SIMPLE)
                   7689:            vty_out (vty, " area %s authentication%s", buf, VTY_NEWLINE);
                   7690:          else
                   7691:            vty_out (vty, " area %s authentication message-digest%s",
                   7692:                     buf, VTY_NEWLINE);
                   7693:        }
                   7694: 
                   7695:       if (area->shortcut_configured != OSPF_SHORTCUT_DEFAULT)
                   7696:        vty_out (vty, " area %s shortcut %s%s", buf,
                   7697:                 ospf_shortcut_mode_str[area->shortcut_configured],
                   7698:                 VTY_NEWLINE);
                   7699: 
                   7700:       if ((area->external_routing == OSPF_AREA_STUB)
                   7701:          || (area->external_routing == OSPF_AREA_NSSA)
                   7702:          )
                   7703:        {
                   7704:          if (area->external_routing == OSPF_AREA_STUB)
                   7705:            vty_out (vty, " area %s stub", buf);
                   7706:          else if (area->external_routing == OSPF_AREA_NSSA)
                   7707:            {
                   7708:              vty_out (vty, " area %s nssa", buf);
                   7709:              switch (area->NSSATranslatorRole)
                   7710:                {
                   7711:                  case OSPF_NSSA_ROLE_NEVER:
                   7712:                    vty_out (vty, " translate-never");
                   7713:                    break;
                   7714:                  case OSPF_NSSA_ROLE_ALWAYS:
                   7715:                    vty_out (vty, " translate-always");
                   7716:                    break;
                   7717:                  case OSPF_NSSA_ROLE_CANDIDATE:
                   7718:                  default:
                   7719:                    vty_out (vty, " translate-candidate");
                   7720:                }
                   7721:            }
                   7722: 
                   7723:          if (area->no_summary)
                   7724:            vty_out (vty, " no-summary");
                   7725: 
                   7726:          vty_out (vty, "%s", VTY_NEWLINE);
                   7727: 
                   7728:          if (area->default_cost != 1)
                   7729:            vty_out (vty, " area %s default-cost %d%s", buf, 
                   7730:                     area->default_cost, VTY_NEWLINE);
                   7731:        }
                   7732: 
                   7733:       for (rn1 = route_top (area->ranges); rn1; rn1 = route_next (rn1))
                   7734:        if (rn1->info)
                   7735:          {
                   7736:            struct ospf_area_range *range = rn1->info;
                   7737: 
                   7738:            vty_out (vty, " area %s range %s/%d", buf,
                   7739:                     inet_ntoa (rn1->p.u.prefix4), rn1->p.prefixlen);
                   7740: 
                   7741:            if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
                   7742:              vty_out (vty, " cost %d", range->cost_config);
                   7743: 
                   7744:            if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
                   7745:              vty_out (vty, " not-advertise");
                   7746: 
                   7747:            if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
                   7748:              vty_out (vty, " substitute %s/%d",
                   7749:                       inet_ntoa (range->subst_addr), range->subst_masklen);
                   7750: 
                   7751:            vty_out (vty, "%s", VTY_NEWLINE);
                   7752:          }
                   7753: 
                   7754:       if (EXPORT_NAME (area))
                   7755:        vty_out (vty, " area %s export-list %s%s", buf,
                   7756:                 EXPORT_NAME (area), VTY_NEWLINE);
                   7757: 
                   7758:       if (IMPORT_NAME (area))
                   7759:        vty_out (vty, " area %s import-list %s%s", buf,
                   7760:                 IMPORT_NAME (area), VTY_NEWLINE);
                   7761: 
                   7762:       if (PREFIX_NAME_IN (area))
                   7763:        vty_out (vty, " area %s filter-list prefix %s in%s", buf,
                   7764:                 PREFIX_NAME_IN (area), VTY_NEWLINE);
                   7765: 
                   7766:       if (PREFIX_NAME_OUT (area))
                   7767:        vty_out (vty, " area %s filter-list prefix %s out%s", buf,
                   7768:                 PREFIX_NAME_OUT (area), VTY_NEWLINE);
                   7769:     }
                   7770: 
                   7771:   return 0;
                   7772: }
                   7773: 
                   7774: static int
                   7775: config_write_ospf_nbr_nbma (struct vty *vty, struct ospf *ospf)
                   7776: {
                   7777:   struct ospf_nbr_nbma *nbr_nbma;
                   7778:   struct route_node *rn;
                   7779: 
                   7780:   /* Static Neighbor configuration print. */
                   7781:   for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))
                   7782:     if ((nbr_nbma = rn->info))
                   7783:       {
                   7784:        vty_out (vty, " neighbor %s", inet_ntoa (nbr_nbma->addr));
                   7785: 
                   7786:        if (nbr_nbma->priority != OSPF_NEIGHBOR_PRIORITY_DEFAULT)
                   7787:          vty_out (vty, " priority %d", nbr_nbma->priority);
                   7788: 
                   7789:        if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)
                   7790:          vty_out (vty, " poll-interval %d", nbr_nbma->v_poll);
                   7791: 
                   7792:        vty_out (vty, "%s", VTY_NEWLINE);
                   7793:       }
                   7794: 
                   7795:   return 0;
                   7796: }
                   7797: 
                   7798: static int
                   7799: config_write_virtual_link (struct vty *vty, struct ospf *ospf)
                   7800: {
                   7801:   struct listnode *node;
                   7802:   struct ospf_vl_data *vl_data;
                   7803:   u_char buf[INET_ADDRSTRLEN];
                   7804: 
                   7805:   /* Virtual-Link print */
                   7806:   for (ALL_LIST_ELEMENTS_RO (ospf->vlinks, node, vl_data))
                   7807:     {
                   7808:       struct listnode *n2;
                   7809:       struct crypt_key *ck;
                   7810:       struct ospf_interface *oi;
                   7811: 
                   7812:       if (vl_data != NULL)
                   7813:        {
                   7814:          memset (buf, 0, INET_ADDRSTRLEN);
                   7815:          
                   7816:          if (vl_data->format == OSPF_AREA_ID_FORMAT_ADDRESS)
                   7817:            strncpy ((char *) buf, inet_ntoa (vl_data->vl_area_id), INET_ADDRSTRLEN);
                   7818:          else
                   7819:            sprintf ((char *) buf, "%lu", 
                   7820:                     (unsigned long int) ntohl (vl_data->vl_area_id.s_addr));
                   7821:          oi = vl_data->vl_oi;
                   7822: 
                   7823:          /* timers */
                   7824:          if (OSPF_IF_PARAM (oi, v_hello) != OSPF_HELLO_INTERVAL_DEFAULT ||
                   7825:              OSPF_IF_PARAM (oi, v_wait) != OSPF_ROUTER_DEAD_INTERVAL_DEFAULT ||
                   7826:              OSPF_IF_PARAM (oi, retransmit_interval) != OSPF_RETRANSMIT_INTERVAL_DEFAULT ||
                   7827:              OSPF_IF_PARAM (oi, transmit_delay) != OSPF_TRANSMIT_DELAY_DEFAULT)
                   7828:            vty_out (vty, " area %s virtual-link %s hello-interval %d retransmit-interval %d transmit-delay %d dead-interval %d%s",
                   7829:                     buf,
                   7830:                     inet_ntoa (vl_data->vl_peer), 
                   7831:                     OSPF_IF_PARAM (oi, v_hello),
                   7832:                     OSPF_IF_PARAM (oi, retransmit_interval),
                   7833:                     OSPF_IF_PARAM (oi, transmit_delay),
                   7834:                     OSPF_IF_PARAM (oi, v_wait),
                   7835:                     VTY_NEWLINE);
                   7836:          else
                   7837:            vty_out (vty, " area %s virtual-link %s%s", buf,
                   7838:                     inet_ntoa (vl_data->vl_peer), VTY_NEWLINE);
                   7839:          /* Auth key */
                   7840:          if (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple[0] != '\0')
                   7841:            vty_out (vty, " area %s virtual-link %s authentication-key %s%s",
                   7842:                     buf,
                   7843:                     inet_ntoa (vl_data->vl_peer),
                   7844:                     IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_simple,
                   7845:                     VTY_NEWLINE);
                   7846:          /* md5 keys */
                   7847:          for (ALL_LIST_ELEMENTS_RO (IF_DEF_PARAMS (vl_data->vl_oi->ifp)->auth_crypt,
                   7848:                                      n2, ck))
                   7849:             vty_out (vty, " area %s virtual-link %s"
                   7850:                      " message-digest-key %d md5 %s%s",
                   7851:                      buf,
                   7852:                      inet_ntoa (vl_data->vl_peer),
                   7853:                      ck->key_id, ck->auth_key, VTY_NEWLINE);
                   7854:         
                   7855:        }
                   7856:     }
                   7857: 
                   7858:   return 0;
                   7859: }
                   7860: 
                   7861: 
                   7862: static int
                   7863: config_write_ospf_redistribute (struct vty *vty, struct ospf *ospf)
                   7864: {
                   7865:   int type;
                   7866: 
                   7867:   /* redistribute print. */
                   7868:   for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
                   7869:     if (type != zclient->redist_default && zclient->redist[type])
                   7870:       {
                   7871:         vty_out (vty, " redistribute %s", zebra_route_string(type));
                   7872:        if (ospf->dmetric[type].value >= 0)
                   7873:          vty_out (vty, " metric %d", ospf->dmetric[type].value);
                   7874:        
                   7875:         if (ospf->dmetric[type].type == EXTERNAL_METRIC_TYPE_1)
                   7876:          vty_out (vty, " metric-type 1");
                   7877: 
                   7878:        if (ROUTEMAP_NAME (ospf, type))
                   7879:          vty_out (vty, " route-map %s", ROUTEMAP_NAME (ospf, type));
                   7880:        
                   7881:         vty_out (vty, "%s", VTY_NEWLINE);
                   7882:       }
                   7883: 
                   7884:   return 0;
                   7885: }
                   7886: 
                   7887: static int
                   7888: config_write_ospf_default_metric (struct vty *vty, struct ospf *ospf)
                   7889: {
                   7890:   if (ospf->default_metric != -1)
                   7891:     vty_out (vty, " default-metric %d%s", ospf->default_metric,
                   7892:             VTY_NEWLINE);
                   7893:   return 0;
                   7894: }
                   7895: 
                   7896: static int
                   7897: config_write_ospf_distribute (struct vty *vty, struct ospf *ospf)
                   7898: {
                   7899:   int type;
                   7900: 
                   7901:   if (ospf)
                   7902:     {
                   7903:       /* distribute-list print. */
                   7904:       for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
                   7905:        if (DISTRIBUTE_NAME (ospf, type))
                   7906:          vty_out (vty, " distribute-list %s out %s%s", 
                   7907:                   DISTRIBUTE_NAME (ospf, type),
                   7908:                   zebra_route_string(type), VTY_NEWLINE);
                   7909: 
                   7910:       /* default-information print. */
                   7911:       if (ospf->default_originate != DEFAULT_ORIGINATE_NONE)
                   7912:        {
                   7913:          vty_out (vty, " default-information originate");
                   7914:          if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
                   7915:            vty_out (vty, " always");
                   7916: 
                   7917:          if (ospf->dmetric[DEFAULT_ROUTE].value >= 0)
                   7918:            vty_out (vty, " metric %d",
                   7919:                     ospf->dmetric[DEFAULT_ROUTE].value);
                   7920:          if (ospf->dmetric[DEFAULT_ROUTE].type == EXTERNAL_METRIC_TYPE_1)
                   7921:            vty_out (vty, " metric-type 1");
                   7922: 
                   7923:          if (ROUTEMAP_NAME (ospf, DEFAULT_ROUTE))
                   7924:            vty_out (vty, " route-map %s",
                   7925:                     ROUTEMAP_NAME (ospf, DEFAULT_ROUTE));
                   7926:          
                   7927:          vty_out (vty, "%s", VTY_NEWLINE);
                   7928:        }
                   7929: 
                   7930:     }
                   7931: 
                   7932:   return 0;
                   7933: }
                   7934: 
                   7935: static int
                   7936: config_write_ospf_distance (struct vty *vty, struct ospf *ospf)
                   7937: {
                   7938:   struct route_node *rn;
                   7939:   struct ospf_distance *odistance;
                   7940: 
                   7941:   if (ospf->distance_all)
                   7942:     vty_out (vty, " distance %d%s", ospf->distance_all, VTY_NEWLINE);
                   7943: 
                   7944:   if (ospf->distance_intra 
                   7945:       || ospf->distance_inter 
                   7946:       || ospf->distance_external)
                   7947:     {
                   7948:       vty_out (vty, " distance ospf");
                   7949: 
                   7950:       if (ospf->distance_intra)
                   7951:        vty_out (vty, " intra-area %d", ospf->distance_intra);
                   7952:       if (ospf->distance_inter)
                   7953:        vty_out (vty, " inter-area %d", ospf->distance_inter);
                   7954:       if (ospf->distance_external)
                   7955:        vty_out (vty, " external %d", ospf->distance_external);
                   7956: 
                   7957:       vty_out (vty, "%s", VTY_NEWLINE);
                   7958:     }
                   7959:   
                   7960:   for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
                   7961:     if ((odistance = rn->info) != NULL)
                   7962:       {
                   7963:        vty_out (vty, " distance %d %s/%d %s%s", odistance->distance,
                   7964:                 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
                   7965:                 odistance->access_list ? odistance->access_list : "",
                   7966:                 VTY_NEWLINE);
                   7967:       }
                   7968:   return 0;
                   7969: }
                   7970: 
                   7971: /* OSPF configuration write function. */
                   7972: static int
                   7973: ospf_config_write (struct vty *vty)
                   7974: {
                   7975:   struct ospf *ospf;
                   7976:   struct interface *ifp;
                   7977:   struct ospf_interface *oi;
                   7978:   struct listnode *node;
                   7979:   int write = 0;
                   7980: 
                   7981:   ospf = ospf_lookup ();
                   7982:   if (ospf != NULL)
                   7983:     {
                   7984:       /* `router ospf' print. */
                   7985:       vty_out (vty, "router ospf%s", VTY_NEWLINE);
                   7986: 
                   7987:       write++;
                   7988: 
                   7989:       if (!ospf->networks)
                   7990:         return write;
                   7991: 
                   7992:       /* Router ID print. */
                   7993:       if (ospf->router_id_static.s_addr != 0)
                   7994:         vty_out (vty, " ospf router-id %s%s",
                   7995:                  inet_ntoa (ospf->router_id_static), VTY_NEWLINE);
                   7996: 
                   7997:       /* ABR type print. */
                   7998:       if (ospf->abr_type != OSPF_ABR_DEFAULT)
                   7999:         vty_out (vty, " ospf abr-type %s%s", 
                   8000:                  ospf_abr_type_str[ospf->abr_type], VTY_NEWLINE);
                   8001: 
                   8002:       /* log-adjacency-changes flag print. */
                   8003:       if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
                   8004:        {
                   8005:          vty_out(vty, " log-adjacency-changes");
                   8006:          if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
                   8007:            vty_out(vty, " detail");
                   8008:          vty_out(vty, "%s", VTY_NEWLINE);
                   8009:        }
                   8010: 
                   8011:       /* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
                   8012:       if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
                   8013:        vty_out (vty, " compatible rfc1583%s", VTY_NEWLINE);
                   8014: 
                   8015:       /* auto-cost reference-bandwidth configuration.  */
                   8016:       if (ospf->ref_bandwidth != OSPF_DEFAULT_REF_BANDWIDTH)
                   8017:         {
                   8018:           vty_out (vty, "! Important: ensure reference bandwidth "
                   8019:                         "is consistent across all routers%s", VTY_NEWLINE);
                   8020:           vty_out (vty, " auto-cost reference-bandwidth %d%s",
                   8021:                   ospf->ref_bandwidth / 1000, VTY_NEWLINE);
                   8022:         }
                   8023: 
                   8024:       /* SPF timers print. */
                   8025:       if (ospf->spf_delay != OSPF_SPF_DELAY_DEFAULT ||
                   8026:          ospf->spf_holdtime != OSPF_SPF_HOLDTIME_DEFAULT ||
                   8027:          ospf->spf_max_holdtime != OSPF_SPF_MAX_HOLDTIME_DEFAULT)
                   8028:        vty_out (vty, " timers throttle spf %d %d %d%s",
                   8029:                 ospf->spf_delay, ospf->spf_holdtime,
                   8030:                 ospf->spf_max_holdtime, VTY_NEWLINE);
                   8031:       
                   8032:       /* Max-metric router-lsa print */
                   8033:       config_write_stub_router (vty, ospf);
                   8034:       
                   8035:       /* SPF refresh parameters print. */
                   8036:       if (ospf->lsa_refresh_interval != OSPF_LSA_REFRESH_INTERVAL_DEFAULT)
                   8037:        vty_out (vty, " refresh timer %d%s",
                   8038:                 ospf->lsa_refresh_interval, VTY_NEWLINE);
                   8039: 
                   8040:       /* Redistribute information print. */
                   8041:       config_write_ospf_redistribute (vty, ospf);
                   8042: 
                   8043:       /* passive-interface print. */
                   8044:       if (ospf->passive_interface_default == OSPF_IF_PASSIVE)
                   8045:         vty_out (vty, " passive-interface default%s", VTY_NEWLINE);
                   8046:       
                   8047:       for (ALL_LIST_ELEMENTS_RO (om->iflist, node, ifp))
                   8048:         if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), passive_interface)
                   8049:             && IF_DEF_PARAMS (ifp)->passive_interface != 
                   8050:                               ospf->passive_interface_default)
                   8051:           {
                   8052:             vty_out (vty, " %spassive-interface %s%s",
                   8053:                      IF_DEF_PARAMS (ifp)->passive_interface ? "" : "no ",
                   8054:                      ifp->name, VTY_NEWLINE);
                   8055:           }
                   8056:       for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
                   8057:         {
                   8058:           if (!OSPF_IF_PARAM_CONFIGURED (oi->params, passive_interface))
                   8059:             continue;
                   8060:           if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp),
                   8061:                                         passive_interface))
                   8062:             {
                   8063:               if (oi->params->passive_interface == IF_DEF_PARAMS (oi->ifp)->passive_interface)
                   8064:                 continue;
                   8065:             }
                   8066:           else if (oi->params->passive_interface == ospf->passive_interface_default)
                   8067:             continue;
                   8068:           
                   8069:           vty_out (vty, " %spassive-interface %s %s%s",
                   8070:                    oi->params->passive_interface ? "" : "no ",
                   8071:                    oi->ifp->name,
                   8072:                    inet_ntoa (oi->address->u.prefix4), VTY_NEWLINE);
                   8073:         }
                   8074:       
                   8075:       /* Network area print. */
                   8076:       config_write_network_area (vty, ospf);
                   8077: 
                   8078:       /* Area config print. */
                   8079:       config_write_ospf_area (vty, ospf);
                   8080: 
                   8081:       /* static neighbor print. */
                   8082:       config_write_ospf_nbr_nbma (vty, ospf);
                   8083: 
                   8084:       /* Virtual-Link print. */
                   8085:       config_write_virtual_link (vty, ospf);
                   8086: 
                   8087:       /* Default metric configuration.  */
                   8088:       config_write_ospf_default_metric (vty, ospf);
                   8089: 
                   8090:       /* Distribute-list and default-information print. */
                   8091:       config_write_ospf_distribute (vty, ospf);
                   8092: 
                   8093:       /* Distance configuration. */
                   8094:       config_write_ospf_distance (vty, ospf);
                   8095: 
                   8096: #ifdef HAVE_OPAQUE_LSA
                   8097:       ospf_opaque_config_write_router (vty, ospf);
                   8098: #endif /* HAVE_OPAQUE_LSA */
                   8099:     }
                   8100: 
                   8101:   return write;
                   8102: }
                   8103: 
                   8104: void
                   8105: ospf_vty_show_init (void)
                   8106: {
                   8107:   /* "show ip ospf" commands. */
                   8108:   install_element (VIEW_NODE, &show_ip_ospf_cmd);
                   8109:   install_element (ENABLE_NODE, &show_ip_ospf_cmd);
                   8110: 
                   8111:   /* "show ip ospf database" commands. */
                   8112:   install_element (VIEW_NODE, &show_ip_ospf_database_type_cmd);
                   8113:   install_element (VIEW_NODE, &show_ip_ospf_database_type_id_cmd);
                   8114:   install_element (VIEW_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
                   8115:   install_element (VIEW_NODE, &show_ip_ospf_database_type_adv_router_cmd);
                   8116:   install_element (VIEW_NODE, &show_ip_ospf_database_type_id_self_cmd);
                   8117:   install_element (VIEW_NODE, &show_ip_ospf_database_type_self_cmd);
                   8118:   install_element (VIEW_NODE, &show_ip_ospf_database_cmd);
                   8119:   install_element (ENABLE_NODE, &show_ip_ospf_database_type_cmd);
                   8120:   install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_cmd);
                   8121:   install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_adv_router_cmd);
                   8122:   install_element (ENABLE_NODE, &show_ip_ospf_database_type_adv_router_cmd);
                   8123:   install_element (ENABLE_NODE, &show_ip_ospf_database_type_id_self_cmd);
                   8124:   install_element (ENABLE_NODE, &show_ip_ospf_database_type_self_cmd);
                   8125:   install_element (ENABLE_NODE, &show_ip_ospf_database_cmd);
                   8126: 
                   8127:   /* "show ip ospf interface" commands. */
                   8128:   install_element (VIEW_NODE, &show_ip_ospf_interface_cmd);
                   8129:   install_element (ENABLE_NODE, &show_ip_ospf_interface_cmd);
                   8130: 
                   8131:   /* "show ip ospf neighbor" commands. */
                   8132:   install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
                   8133:   install_element (VIEW_NODE, &show_ip_ospf_neighbor_int_cmd);
                   8134:   install_element (VIEW_NODE, &show_ip_ospf_neighbor_id_cmd);
                   8135:   install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
                   8136:   install_element (VIEW_NODE, &show_ip_ospf_neighbor_detail_cmd);
                   8137:   install_element (VIEW_NODE, &show_ip_ospf_neighbor_cmd);
                   8138:   install_element (VIEW_NODE, &show_ip_ospf_neighbor_all_cmd);
                   8139:   install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
                   8140:   install_element (ENABLE_NODE, &show_ip_ospf_neighbor_int_cmd);
                   8141:   install_element (ENABLE_NODE, &show_ip_ospf_neighbor_id_cmd);
                   8142:   install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_all_cmd);
                   8143:   install_element (ENABLE_NODE, &show_ip_ospf_neighbor_detail_cmd);
                   8144:   install_element (ENABLE_NODE, &show_ip_ospf_neighbor_cmd);
                   8145:   install_element (ENABLE_NODE, &show_ip_ospf_neighbor_all_cmd);
                   8146: 
                   8147:   /* "show ip ospf route" commands. */
                   8148:   install_element (VIEW_NODE, &show_ip_ospf_route_cmd);
                   8149:   install_element (ENABLE_NODE, &show_ip_ospf_route_cmd);
                   8150:   install_element (VIEW_NODE, &show_ip_ospf_border_routers_cmd);
                   8151:   install_element (ENABLE_NODE, &show_ip_ospf_border_routers_cmd);
                   8152: }
                   8153: 
                   8154: 
                   8155: /* ospfd's interface node. */
                   8156: static struct cmd_node interface_node =
                   8157: {
                   8158:   INTERFACE_NODE,
                   8159:   "%s(config-if)# ",
                   8160:   1
                   8161: };
                   8162: 
                   8163: /* Initialization of OSPF interface. */
                   8164: static void
                   8165: ospf_vty_if_init (void)
                   8166: {
                   8167:   /* Install interface node. */
                   8168:   install_node (&interface_node, config_write_interface);
                   8169: 
                   8170:   install_element (CONFIG_NODE, &interface_cmd);
                   8171:   install_element (CONFIG_NODE, &no_interface_cmd);
                   8172:   install_default (INTERFACE_NODE);
                   8173: 
                   8174:   /* "description" commands. */
                   8175:   install_element (INTERFACE_NODE, &interface_desc_cmd);
                   8176:   install_element (INTERFACE_NODE, &no_interface_desc_cmd);
                   8177: 
                   8178:   /* "ip ospf authentication" commands. */
                   8179:   install_element (INTERFACE_NODE, &ip_ospf_authentication_args_addr_cmd);
                   8180:   install_element (INTERFACE_NODE, &ip_ospf_authentication_args_cmd);
                   8181:   install_element (INTERFACE_NODE, &ip_ospf_authentication_addr_cmd);
                   8182:   install_element (INTERFACE_NODE, &ip_ospf_authentication_cmd);
                   8183:   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_addr_cmd);
                   8184:   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_cmd);
                   8185:   install_element (INTERFACE_NODE, &ip_ospf_authentication_key_addr_cmd);
                   8186:   install_element (INTERFACE_NODE, &ip_ospf_authentication_key_cmd);
                   8187:   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_addr_cmd);
                   8188:   install_element (INTERFACE_NODE, &no_ip_ospf_authentication_key_cmd);
                   8189: 
                   8190:   /* "ip ospf message-digest-key" commands. */
                   8191:   install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_addr_cmd);
                   8192:   install_element (INTERFACE_NODE, &ip_ospf_message_digest_key_cmd);
                   8193:   install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_addr_cmd);
                   8194:   install_element (INTERFACE_NODE, &no_ip_ospf_message_digest_key_cmd);
                   8195: 
                   8196:   /* "ip ospf cost" commands. */
                   8197:   install_element (INTERFACE_NODE, &ip_ospf_cost_u32_inet4_cmd);
                   8198:   install_element (INTERFACE_NODE, &ip_ospf_cost_u32_cmd);
                   8199:   install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_cmd);
                   8200:   install_element (INTERFACE_NODE, &no_ip_ospf_cost_u32_inet4_cmd);
                   8201:   install_element (INTERFACE_NODE, &no_ip_ospf_cost_inet4_cmd);
                   8202:   install_element (INTERFACE_NODE, &no_ip_ospf_cost_cmd);
                   8203: 
                   8204:   /* "ip ospf mtu-ignore" commands. */
                   8205:   install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_addr_cmd);
                   8206:   install_element (INTERFACE_NODE, &ip_ospf_mtu_ignore_cmd);
                   8207:   install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_addr_cmd);
                   8208:   install_element (INTERFACE_NODE, &no_ip_ospf_mtu_ignore_cmd);
                   8209: 
                   8210:   /* "ip ospf dead-interval" commands. */
                   8211:   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_addr_cmd);
                   8212:   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_cmd);
                   8213:   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_addr_cmd);
                   8214:   install_element (INTERFACE_NODE, &ip_ospf_dead_interval_minimal_cmd);
                   8215:   install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_addr_cmd);
                   8216:   install_element (INTERFACE_NODE, &no_ip_ospf_dead_interval_cmd);
                   8217:   
                   8218:   /* "ip ospf hello-interval" commands. */
                   8219:   install_element (INTERFACE_NODE, &ip_ospf_hello_interval_addr_cmd);
                   8220:   install_element (INTERFACE_NODE, &ip_ospf_hello_interval_cmd);
                   8221:   install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_addr_cmd);
                   8222:   install_element (INTERFACE_NODE, &no_ip_ospf_hello_interval_cmd);
                   8223: 
                   8224:   /* "ip ospf network" commands. */
                   8225:   install_element (INTERFACE_NODE, &ip_ospf_network_cmd);
                   8226:   install_element (INTERFACE_NODE, &no_ip_ospf_network_cmd);
                   8227: 
                   8228:   /* "ip ospf priority" commands. */
                   8229:   install_element (INTERFACE_NODE, &ip_ospf_priority_addr_cmd);
                   8230:   install_element (INTERFACE_NODE, &ip_ospf_priority_cmd);
                   8231:   install_element (INTERFACE_NODE, &no_ip_ospf_priority_addr_cmd);
                   8232:   install_element (INTERFACE_NODE, &no_ip_ospf_priority_cmd);
                   8233: 
                   8234:   /* "ip ospf retransmit-interval" commands. */
                   8235:   install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_addr_cmd);
                   8236:   install_element (INTERFACE_NODE, &ip_ospf_retransmit_interval_cmd);
                   8237:   install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_addr_cmd);
                   8238:   install_element (INTERFACE_NODE, &no_ip_ospf_retransmit_interval_cmd);
                   8239: 
                   8240:   /* "ip ospf transmit-delay" commands. */
                   8241:   install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_addr_cmd);
                   8242:   install_element (INTERFACE_NODE, &ip_ospf_transmit_delay_cmd);
                   8243:   install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_addr_cmd);
                   8244:   install_element (INTERFACE_NODE, &no_ip_ospf_transmit_delay_cmd);
                   8245: 
                   8246:   /* These commands are compatibitliy for previous version. */
                   8247:   install_element (INTERFACE_NODE, &ospf_authentication_key_cmd);
                   8248:   install_element (INTERFACE_NODE, &no_ospf_authentication_key_cmd);
                   8249:   install_element (INTERFACE_NODE, &ospf_message_digest_key_cmd);
                   8250:   install_element (INTERFACE_NODE, &no_ospf_message_digest_key_cmd);
                   8251:   install_element (INTERFACE_NODE, &ospf_cost_u32_cmd);
                   8252:   install_element (INTERFACE_NODE, &ospf_cost_u32_inet4_cmd);
                   8253:   install_element (INTERFACE_NODE, &no_ospf_cost_cmd);
                   8254:   install_element (INTERFACE_NODE, &no_ospf_cost_u32_cmd);
                   8255:   install_element (INTERFACE_NODE, &no_ospf_cost_u32_inet4_cmd);
                   8256:   install_element (INTERFACE_NODE, &no_ospf_cost_inet4_cmd);
                   8257:   install_element (INTERFACE_NODE, &ospf_dead_interval_cmd);
                   8258:   install_element (INTERFACE_NODE, &no_ospf_dead_interval_cmd);
                   8259:   install_element (INTERFACE_NODE, &ospf_hello_interval_cmd);
                   8260:   install_element (INTERFACE_NODE, &no_ospf_hello_interval_cmd);
                   8261:   install_element (INTERFACE_NODE, &ospf_network_cmd);
                   8262:   install_element (INTERFACE_NODE, &no_ospf_network_cmd);
                   8263:   install_element (INTERFACE_NODE, &ospf_priority_cmd);
                   8264:   install_element (INTERFACE_NODE, &no_ospf_priority_cmd);
                   8265:   install_element (INTERFACE_NODE, &ospf_retransmit_interval_cmd);
                   8266:   install_element (INTERFACE_NODE, &no_ospf_retransmit_interval_cmd);
                   8267:   install_element (INTERFACE_NODE, &ospf_transmit_delay_cmd);
                   8268:   install_element (INTERFACE_NODE, &no_ospf_transmit_delay_cmd);
                   8269: }
                   8270: 
                   8271: static void
                   8272: ospf_vty_zebra_init (void)
                   8273: {
                   8274:   install_element (OSPF_NODE, &ospf_redistribute_source_type_metric_cmd);
                   8275:   install_element (OSPF_NODE, &ospf_redistribute_source_metric_type_cmd);
                   8276:   install_element (OSPF_NODE, &ospf_redistribute_source_type_cmd);
                   8277:   install_element (OSPF_NODE, &ospf_redistribute_source_metric_cmd);
                   8278:   install_element (OSPF_NODE, &ospf_redistribute_source_cmd);
                   8279:   install_element (OSPF_NODE,
                   8280:                   &ospf_redistribute_source_metric_type_routemap_cmd);
                   8281:   install_element (OSPF_NODE,
                   8282:                   &ospf_redistribute_source_type_metric_routemap_cmd);
                   8283:   install_element (OSPF_NODE, &ospf_redistribute_source_metric_routemap_cmd);
                   8284:   install_element (OSPF_NODE, &ospf_redistribute_source_type_routemap_cmd);
                   8285:   install_element (OSPF_NODE, &ospf_redistribute_source_routemap_cmd);
                   8286:   
                   8287:   install_element (OSPF_NODE, &no_ospf_redistribute_source_cmd);
                   8288: 
                   8289:   install_element (OSPF_NODE, &ospf_distribute_list_out_cmd);
                   8290:   install_element (OSPF_NODE, &no_ospf_distribute_list_out_cmd);
                   8291: 
                   8292:   install_element (OSPF_NODE,
                   8293:                   &ospf_default_information_originate_metric_type_cmd);
                   8294:   install_element (OSPF_NODE, &ospf_default_information_originate_metric_cmd);
                   8295:   install_element (OSPF_NODE,
                   8296:                   &ospf_default_information_originate_type_metric_cmd);
                   8297:   install_element (OSPF_NODE, &ospf_default_information_originate_type_cmd);
                   8298:   install_element (OSPF_NODE, &ospf_default_information_originate_cmd);
                   8299:   install_element (OSPF_NODE,
                   8300:                   &ospf_default_information_originate_always_metric_type_cmd);
                   8301:   install_element (OSPF_NODE,
                   8302:                   &ospf_default_information_originate_always_metric_cmd);
                   8303:   install_element (OSPF_NODE,
                   8304:                   &ospf_default_information_originate_always_cmd);
                   8305:   install_element (OSPF_NODE,
                   8306:                   &ospf_default_information_originate_always_type_metric_cmd);
                   8307:   install_element (OSPF_NODE,
                   8308:                   &ospf_default_information_originate_always_type_cmd);
                   8309: 
                   8310:   install_element (OSPF_NODE,
                   8311:                   &ospf_default_information_originate_metric_type_routemap_cmd);
                   8312:   install_element (OSPF_NODE,
                   8313:                   &ospf_default_information_originate_metric_routemap_cmd);
                   8314:   install_element (OSPF_NODE,
                   8315:                   &ospf_default_information_originate_routemap_cmd);
                   8316:   install_element (OSPF_NODE,
                   8317:                   &ospf_default_information_originate_type_metric_routemap_cmd);
                   8318:   install_element (OSPF_NODE,
                   8319:                   &ospf_default_information_originate_type_routemap_cmd);
                   8320:   install_element (OSPF_NODE,
                   8321:                   &ospf_default_information_originate_always_metric_type_routemap_cmd);
                   8322:   install_element (OSPF_NODE,
                   8323:                   &ospf_default_information_originate_always_metric_routemap_cmd);
                   8324:   install_element (OSPF_NODE,
                   8325:                   &ospf_default_information_originate_always_routemap_cmd);
                   8326:   install_element (OSPF_NODE,
                   8327:                   &ospf_default_information_originate_always_type_metric_routemap_cmd);
                   8328:   install_element (OSPF_NODE,
                   8329:                   &ospf_default_information_originate_always_type_routemap_cmd);
                   8330: 
                   8331:   install_element (OSPF_NODE, &no_ospf_default_information_originate_cmd);
                   8332: 
                   8333:   install_element (OSPF_NODE, &ospf_default_metric_cmd);
                   8334:   install_element (OSPF_NODE, &no_ospf_default_metric_cmd);
                   8335:   install_element (OSPF_NODE, &no_ospf_default_metric_val_cmd);
                   8336: 
                   8337:   install_element (OSPF_NODE, &ospf_distance_cmd);
                   8338:   install_element (OSPF_NODE, &no_ospf_distance_cmd);
                   8339:   install_element (OSPF_NODE, &no_ospf_distance_ospf_cmd);
                   8340:   install_element (OSPF_NODE, &ospf_distance_ospf_intra_cmd);
                   8341:   install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_cmd);
                   8342:   install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_cmd);
                   8343:   install_element (OSPF_NODE, &ospf_distance_ospf_intra_inter_external_cmd);
                   8344:   install_element (OSPF_NODE, &ospf_distance_ospf_intra_external_inter_cmd);
                   8345:   install_element (OSPF_NODE, &ospf_distance_ospf_inter_cmd);
                   8346:   install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_cmd);
                   8347:   install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_cmd);
                   8348:   install_element (OSPF_NODE, &ospf_distance_ospf_inter_intra_external_cmd);
                   8349:   install_element (OSPF_NODE, &ospf_distance_ospf_inter_external_intra_cmd);
                   8350:   install_element (OSPF_NODE, &ospf_distance_ospf_external_cmd);
                   8351:   install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_cmd);
                   8352:   install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_cmd);
                   8353:   install_element (OSPF_NODE, &ospf_distance_ospf_external_intra_inter_cmd);
                   8354:   install_element (OSPF_NODE, &ospf_distance_ospf_external_inter_intra_cmd);
                   8355: #if 0
                   8356:   install_element (OSPF_NODE, &ospf_distance_source_cmd);
                   8357:   install_element (OSPF_NODE, &no_ospf_distance_source_cmd);
                   8358:   install_element (OSPF_NODE, &ospf_distance_source_access_list_cmd);
                   8359:   install_element (OSPF_NODE, &no_ospf_distance_source_access_list_cmd);
                   8360: #endif /* 0 */
                   8361: }
                   8362: 
                   8363: static struct cmd_node ospf_node =
                   8364: {
                   8365:   OSPF_NODE,
                   8366:   "%s(config-router)# ",
                   8367:   1
                   8368: };
                   8369: 
                   8370: 
                   8371: /* Install OSPF related vty commands. */
                   8372: void
                   8373: ospf_vty_init (void)
                   8374: {
                   8375:   /* Install ospf top node. */
                   8376:   install_node (&ospf_node, ospf_config_write);
                   8377: 
                   8378:   /* "router ospf" commands. */
                   8379:   install_element (CONFIG_NODE, &router_ospf_cmd);
                   8380:   install_element (CONFIG_NODE, &no_router_ospf_cmd);
                   8381: 
                   8382:   install_default (OSPF_NODE);
                   8383: 
                   8384:   /* "ospf router-id" commands. */
                   8385:   install_element (OSPF_NODE, &ospf_router_id_cmd);
                   8386:   install_element (OSPF_NODE, &no_ospf_router_id_cmd);
                   8387:   install_element (OSPF_NODE, &router_ospf_id_cmd);
                   8388:   install_element (OSPF_NODE, &no_router_ospf_id_cmd);
                   8389: 
                   8390:   /* "passive-interface" commands. */
                   8391:   install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);
                   8392:   install_element (OSPF_NODE, &ospf_passive_interface_cmd);
                   8393:   install_element (OSPF_NODE, &ospf_passive_interface_default_cmd);
                   8394:   install_element (OSPF_NODE, &no_ospf_passive_interface_addr_cmd);
                   8395:   install_element (OSPF_NODE, &no_ospf_passive_interface_cmd);
                   8396:   install_element (OSPF_NODE, &no_ospf_passive_interface_default_cmd);
                   8397: 
                   8398:   /* "ospf abr-type" commands. */
                   8399:   install_element (OSPF_NODE, &ospf_abr_type_cmd);
                   8400:   install_element (OSPF_NODE, &no_ospf_abr_type_cmd);
                   8401: 
                   8402:   /* "ospf log-adjacency-changes" commands. */
                   8403:   install_element (OSPF_NODE, &ospf_log_adjacency_changes_cmd);
                   8404:   install_element (OSPF_NODE, &ospf_log_adjacency_changes_detail_cmd);
                   8405:   install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_cmd);
                   8406:   install_element (OSPF_NODE, &no_ospf_log_adjacency_changes_detail_cmd);
                   8407: 
                   8408:   /* "ospf rfc1583-compatible" commands. */
                   8409:   install_element (OSPF_NODE, &ospf_rfc1583_flag_cmd);
                   8410:   install_element (OSPF_NODE, &no_ospf_rfc1583_flag_cmd);
                   8411:   install_element (OSPF_NODE, &ospf_compatible_rfc1583_cmd);
                   8412:   install_element (OSPF_NODE, &no_ospf_compatible_rfc1583_cmd);
                   8413: 
                   8414:   /* "network area" commands. */
                   8415:   install_element (OSPF_NODE, &ospf_network_area_cmd);
                   8416:   install_element (OSPF_NODE, &no_ospf_network_area_cmd);
                   8417: 
                   8418:   /* "area authentication" commands. */
                   8419:   install_element (OSPF_NODE, &ospf_area_authentication_message_digest_cmd);
                   8420:   install_element (OSPF_NODE, &ospf_area_authentication_cmd);
                   8421:   install_element (OSPF_NODE, &no_ospf_area_authentication_cmd);
                   8422: 
                   8423:   /* "area range" commands.  */
                   8424:   install_element (OSPF_NODE, &ospf_area_range_cmd);
                   8425:   install_element (OSPF_NODE, &ospf_area_range_advertise_cmd);
                   8426:   install_element (OSPF_NODE, &ospf_area_range_cost_cmd);
                   8427:   install_element (OSPF_NODE, &ospf_area_range_advertise_cost_cmd);
                   8428:   install_element (OSPF_NODE, &ospf_area_range_not_advertise_cmd);
                   8429:   install_element (OSPF_NODE, &no_ospf_area_range_cmd);
                   8430:   install_element (OSPF_NODE, &no_ospf_area_range_advertise_cmd);
                   8431:   install_element (OSPF_NODE, &no_ospf_area_range_cost_cmd);
                   8432:   install_element (OSPF_NODE, &no_ospf_area_range_advertise_cost_cmd);
                   8433:   install_element (OSPF_NODE, &ospf_area_range_substitute_cmd);
                   8434:   install_element (OSPF_NODE, &no_ospf_area_range_substitute_cmd);
                   8435: 
                   8436:   /* "area virtual-link" commands. */
                   8437:   install_element (OSPF_NODE, &ospf_area_vlink_cmd);
                   8438:   install_element (OSPF_NODE, &no_ospf_area_vlink_cmd);
                   8439: 
                   8440:   install_element (OSPF_NODE, &ospf_area_vlink_param1_cmd);
                   8441:   install_element (OSPF_NODE, &no_ospf_area_vlink_param1_cmd);
                   8442: 
                   8443:   install_element (OSPF_NODE, &ospf_area_vlink_param2_cmd);
                   8444:   install_element (OSPF_NODE, &no_ospf_area_vlink_param2_cmd);
                   8445: 
                   8446:   install_element (OSPF_NODE, &ospf_area_vlink_param3_cmd);
                   8447:   install_element (OSPF_NODE, &no_ospf_area_vlink_param3_cmd);
                   8448: 
                   8449:   install_element (OSPF_NODE, &ospf_area_vlink_param4_cmd);
                   8450:   install_element (OSPF_NODE, &no_ospf_area_vlink_param4_cmd);
                   8451: 
                   8452:   install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_cmd);
                   8453:   install_element (OSPF_NODE, &ospf_area_vlink_authtype_cmd);
                   8454:   install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_cmd);
                   8455: 
                   8456:   install_element (OSPF_NODE, &ospf_area_vlink_md5_cmd);
                   8457:   install_element (OSPF_NODE, &no_ospf_area_vlink_md5_cmd);
                   8458: 
                   8459:   install_element (OSPF_NODE, &ospf_area_vlink_authkey_cmd);
                   8460:   install_element (OSPF_NODE, &no_ospf_area_vlink_authkey_cmd);
                   8461: 
                   8462:   install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_authkey_cmd);
                   8463:   install_element (OSPF_NODE, &ospf_area_vlink_authtype_authkey_cmd);
                   8464:   install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_authkey_cmd);
                   8465: 
                   8466:   install_element (OSPF_NODE, &ospf_area_vlink_authtype_args_md5_cmd);
                   8467:   install_element (OSPF_NODE, &ospf_area_vlink_authtype_md5_cmd);
                   8468:   install_element (OSPF_NODE, &no_ospf_area_vlink_authtype_md5_cmd);
                   8469: 
                   8470:   /* "area stub" commands. */
                   8471:   install_element (OSPF_NODE, &ospf_area_stub_no_summary_cmd);
                   8472:   install_element (OSPF_NODE, &ospf_area_stub_cmd);
                   8473:   install_element (OSPF_NODE, &no_ospf_area_stub_no_summary_cmd);
                   8474:   install_element (OSPF_NODE, &no_ospf_area_stub_cmd);
                   8475: 
                   8476:   /* "area nssa" commands. */
                   8477:   install_element (OSPF_NODE, &ospf_area_nssa_cmd);
                   8478:   install_element (OSPF_NODE, &ospf_area_nssa_translate_no_summary_cmd);
                   8479:   install_element (OSPF_NODE, &ospf_area_nssa_translate_cmd);
                   8480:   install_element (OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
                   8481:   install_element (OSPF_NODE, &no_ospf_area_nssa_cmd);
                   8482:   install_element (OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
                   8483: 
                   8484:   install_element (OSPF_NODE, &ospf_area_default_cost_cmd);
                   8485:   install_element (OSPF_NODE, &no_ospf_area_default_cost_cmd);
                   8486: 
                   8487:   install_element (OSPF_NODE, &ospf_area_shortcut_cmd);
                   8488:   install_element (OSPF_NODE, &no_ospf_area_shortcut_cmd);
                   8489: 
                   8490:   install_element (OSPF_NODE, &ospf_area_export_list_cmd);
                   8491:   install_element (OSPF_NODE, &no_ospf_area_export_list_cmd);
                   8492: 
                   8493:   install_element (OSPF_NODE, &ospf_area_filter_list_cmd);
                   8494:   install_element (OSPF_NODE, &no_ospf_area_filter_list_cmd);
                   8495: 
                   8496:   install_element (OSPF_NODE, &ospf_area_import_list_cmd);
                   8497:   install_element (OSPF_NODE, &no_ospf_area_import_list_cmd);
                   8498:   
                   8499:   /* SPF timer commands */
                   8500:   install_element (OSPF_NODE, &ospf_timers_spf_cmd);
                   8501:   install_element (OSPF_NODE, &no_ospf_timers_spf_cmd);
                   8502:   install_element (OSPF_NODE, &ospf_timers_throttle_spf_cmd);
                   8503:   install_element (OSPF_NODE, &no_ospf_timers_throttle_spf_cmd);
                   8504:   
                   8505:   /* refresh timer commands */
                   8506:   install_element (OSPF_NODE, &ospf_refresh_timer_cmd);
                   8507:   install_element (OSPF_NODE, &no_ospf_refresh_timer_val_cmd);
                   8508:   install_element (OSPF_NODE, &no_ospf_refresh_timer_cmd);
                   8509:   
                   8510:   /* max-metric commands */
                   8511:   install_element (OSPF_NODE, &ospf_max_metric_router_lsa_admin_cmd);
                   8512:   install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_admin_cmd);
                   8513:   install_element (OSPF_NODE, &ospf_max_metric_router_lsa_startup_cmd);
                   8514:   install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_startup_cmd);
                   8515:   install_element (OSPF_NODE, &ospf_max_metric_router_lsa_shutdown_cmd);
                   8516:   install_element (OSPF_NODE, &no_ospf_max_metric_router_lsa_shutdown_cmd);
                   8517:   
                   8518:   /* reference bandwidth commands */
                   8519:   install_element (OSPF_NODE, &ospf_auto_cost_reference_bandwidth_cmd);
                   8520:   install_element (OSPF_NODE, &no_ospf_auto_cost_reference_bandwidth_cmd);
                   8521: 
                   8522:   /* "neighbor" commands. */
                   8523:   install_element (OSPF_NODE, &ospf_neighbor_cmd);
                   8524:   install_element (OSPF_NODE, &ospf_neighbor_priority_poll_interval_cmd);
                   8525:   install_element (OSPF_NODE, &ospf_neighbor_priority_cmd);
                   8526:   install_element (OSPF_NODE, &ospf_neighbor_poll_interval_cmd);
                   8527:   install_element (OSPF_NODE, &ospf_neighbor_poll_interval_priority_cmd);
                   8528:   install_element (OSPF_NODE, &no_ospf_neighbor_cmd);
                   8529:   install_element (OSPF_NODE, &no_ospf_neighbor_priority_cmd);
                   8530:   install_element (OSPF_NODE, &no_ospf_neighbor_poll_interval_cmd);
                   8531: 
                   8532:   /* Init interface related vty commands. */
                   8533:   ospf_vty_if_init ();
                   8534: 
                   8535:   /* Init zebra related vty commands. */
                   8536:   ospf_vty_zebra_init ();
                   8537: }

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