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

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

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