File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_vty.c
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:12 2016 UTC (7 years, 9 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /* OSPF VTY interface.
    2:  * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
    3:  * Copyright (C) 2000 Toshiaki Takada
    4:  *
    5:  * This file is part of GNU Zebra.
    6:  *
    7:  * GNU Zebra is free software; you can redistribute it and/or modify it
    8:  * under the terms of the GNU General Public License as published by the
    9:  * Free Software Foundation; either version 2, or (at your option) any
   10:  * later version.
   11:  *
   12:  * GNU Zebra is distributed in the hope that it will be useful, but
   13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
   14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   15:  * General Public License for more details.
   16:  *
   17:  * You should have received a copy of the GNU General Public License
   18:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
   19:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   20:  * 02111-1307, USA.  
   21:  */
   22: 
   23: #include <zebra.h>
   24: 
   25: #include "memory.h"
   26: #include "thread.h"
   27: #include "prefix.h"
   28: #include "table.h"
   29: #include "vty.h"
   30: #include "command.h"
   31: #include "plist.h"
   32: #include "log.h"
   33: #include "zclient.h"
   34: 
   35: #include "ospfd/ospfd.h"
   36: #include "ospfd/ospf_asbr.h"
   37: #include "ospfd/ospf_lsa.h"
   38: #include "ospfd/ospf_lsdb.h"
   39: #include "ospfd/ospf_ism.h"
   40: #include "ospfd/ospf_interface.h"
   41: #include "ospfd/ospf_nsm.h"
   42: #include "ospfd/ospf_neighbor.h"
   43: #include "ospfd/ospf_flood.h"
   44: #include "ospfd/ospf_abr.h"
   45: #include "ospfd/ospf_spf.h"
   46: #include "ospfd/ospf_route.h"
   47: #include "ospfd/ospf_zebra.h"
   48: /*#include "ospfd/ospf_routemap.h" */
   49: #include "ospfd/ospf_vty.h"
   50: #include "ospfd/ospf_dump.h"
   51: 
   52: 
   53: static const char *ospf_network_type_str[] =
   54: {
   55:   "Null",
   56:   "POINTOPOINT",
   57:   "BROADCAST",
   58:   "NBMA",
   59:   "POINTOMULTIPOINT",
   60:   "VIRTUALLINK",
   61:   "LOOPBACK"
   62: };
   63: 
   64: 
   65: /* Utility functions. */
   66: static int
   67: ospf_str2area_id (const char *str, struct in_addr *area_id, int *format)
   68: {
   69:   char *endptr = NULL;
   70:   unsigned long ret;
   71: 
   72:   /* match "A.B.C.D". */
   73:   if (strchr (str, '.') != NULL)
   74:     {
   75:       ret = inet_aton (str, area_id);
   76:       if (!ret)
   77:         return -1;
   78:       *format = OSPF_AREA_ID_FORMAT_ADDRESS;
   79:     }
   80:   /* match "<0-4294967295>". */
   81:   else
   82:     {
   83:       if (*str == '-')
   84:         return -1;
   85:       errno = 0;
   86:       ret = strtoul (str, &endptr, 10);
   87:       if (*endptr != '\0' || errno || ret > UINT32_MAX)
   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: 
   97: 
   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: 
  145: 
  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
  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)
  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:     }
  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))
  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: 
  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: 
  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);
  365:       ospf_passive_interface_update_addr (ospf, ifp, params,
  366:                                           OSPF_IF_PASSIVE, addr);
  367:     }
  368:   
  369:   ospf_passive_interface_update (ospf, ifp, params, OSPF_IF_PASSIVE);
  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;
  445:       ospf_passive_interface_update_addr (ospf, ifp, params, OSPF_IF_ACTIVE, 
  446:                                           addr);
  447:     }
  448:   ospf_passive_interface_update (ospf, ifp, params, OSPF_IF_ACTIVE);
  449:   
  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: {
  491:   struct ospf *ospf = vty->index;
  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: 
  540: 
  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")
  684: 
  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: 
  736: 
  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);
  821: 	  ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
  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: 
 1432: 
 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: 
 1500: 
 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]);
 1796:   VTY_CHECK_INTEGER_RANGE ("stub default cost", argv[1], 0, OSPF_LS_INFINITY);
 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: 
 2021: 
 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"
 2026:        "OSPF area ID in IP address format\n"
 2027:        "OSPF area ID as a decimal value\n"
 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: 
 2092: 
 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);
 2222:       ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
 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);
 2239:       ospf_spf_calculate_schedule (ospf, SPF_FLAG_CONFIG_CHANGE);
 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")
 2256: 
 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: 
 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: 
 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")
 2424: 
 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)
 2448:     ospf_nbr_nbma_poll_interval_set (ospf, nbr_addr, interval);
 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: 
 2523:   (void)ospf_nbr_nbma_unset (ospf, nbr_addr);
 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: 
 2557: 
 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: 
 2675: 
 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);
 2835:   vty_out (vty, " OpaqueCapability flag is %s%s",
 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);
 2870:       vty_out (vty, " Last SPF duration %s%s",
 2871: 	       ospf_timeval_dump (&ospf->ts_spf_duration, timebuf, sizeof (timebuf)),
 2872: 	       VTY_NEWLINE);
 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: 
 2922: 
 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: 
 3551: 
 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: {
 3720:   int len, type;
 3721:   unsigned int i;
 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: 
 3856: #if 0
 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: }
 3880: #endif
 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: {
 4138:   struct route_node *rn;
 4139: 
 4140:   vty_out (vty, "%s                MaxAge Link States:%s%s",
 4141:            VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
 4142: 
 4143:   for (rn = route_top (ospf->maxage_lsa); rn; rn = route_next (rn))
 4144:     {
 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: 	}
 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: 
 4395: 
 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;
 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: 
 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;
 5505:   long priority;
 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: 
 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")
 5895: {
 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;
 5901: 
 5902:   VTY_GET_OSPF_AREA_ID (area_id, format, argv[0]);
 5903: 
 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);
 5910:       return CMD_WARNING;
 5911:     }
 5912:   if (memcmp (ifp->name, "VLINK", 5) == 0)
 5913:     {
 5914:       vty_out (vty, "Cannot enable OSPF on a virtual link.%s", VTY_NEWLINE);
 5915:       return CMD_WARNING;
 5916:     }
 5917:   
 5918:   SET_IF_PARAM (params, if_area);
 5919:   params->if_area = area_id;
 5920:   ospf_interface_area_set (ifp);
 5921: 
 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);
 5939:   
 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;
 5948: }
 5949: 
 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}",
 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: 
 5969:   if (argc < 4)
 5970:     return CMD_WARNING; /* should not happen */
 5971: 
 5972:   /* Get distribute source. */
 5973:   source = proto_redistnum(AFI_IP, argv[0]);
 5974:   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
 5975:     return CMD_WARNING;
 5976: 
 5977:   /* Get metric value. */
 5978:   if (argv[1] != NULL)
 5979:     if (!str2metric (argv[1], &metric))
 5980:       return CMD_WARNING;
 5981: 
 5982:   /* Get metric type. */
 5983:   if (argv[2] != NULL)
 5984:     if (!str2metric_type (argv[2], &type))
 5985:       return CMD_WARNING;
 5986: 
 5987:   if (argv[3] != NULL)
 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: 
 5995: DEFUN (no_ospf_redistribute_source,
 5996:        no_ospf_redistribute_source_cmd,
 5997:        "no redistribute " QUAGGA_REDIST_STR_OSPFD,
 5998:        NO_STR
 5999:        REDIST_STR
 6000:        QUAGGA_REDIST_HELP_STR_OSPFD)
 6001: {
 6002:   struct ospf *ospf = vty->index;
 6003:   int source;
 6004: 
 6005:   source = proto_redistnum(AFI_IP, argv[0]);
 6006:   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
 6007:     return CMD_WARNING;
 6008: 
 6009:   ospf_routemap_unset (ospf, source);
 6010:   return ospf_redistribute_unset (ospf, source);
 6011: }
 6012: 
 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)
 6020: {
 6021:   struct ospf *ospf = vty->index;
 6022:   int source;
 6023: 
 6024:   /* Get distribute source. */
 6025:   source = proto_redistnum(AFI_IP, argv[1]);
 6026:   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
 6027:     return CMD_WARNING;
 6028: 
 6029:   return ospf_distribute_list_out_set (ospf, source, argv[0]);
 6030: }
 6031: 
 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)
 6040: {
 6041:   struct ospf *ospf = vty->index;
 6042:   int source;
 6043: 
 6044:   source = proto_redistnum(AFI_IP, argv[1]);
 6045:   if (source < 0 || source == ZEBRA_ROUTE_OSPF)
 6046:     return CMD_WARNING;
 6047: 
 6048:   return ospf_distribute_list_out_unset (ospf, source, argv[0]);
 6049: }
 6050: 
 6051: /* Default information originate. */
 6052: DEFUN (ospf_default_information_originate,
 6053:        ospf_default_information_originate_cmd,
 6054:        "default-information originate "
 6055:          "{always|metric <0-16777214>|metric-type (1|2)|route-map WORD}",
 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;
 6068:   int default_originate = DEFAULT_ORIGINATE_ZEBRA;
 6069:   int type = -1;
 6070:   int metric = -1;
 6071: 
 6072:   if (argc < 4)
 6073:     return CMD_WARNING; /* this should not happen */
 6074: 
 6075:   /* Check whether "always" was specified */
 6076:   if (argv[0] != NULL)
 6077:     default_originate = DEFAULT_ORIGINATE_ALWAYS;
 6078: 
 6079:   /* Get metric value. */
 6080:   if (argv[1] != NULL)
 6081:     if (!str2metric (argv[1], &metric))
 6082:       return CMD_WARNING;
 6083: 
 6084:   /* Get metric type. */
 6085:   if (argv[2] != NULL)
 6086:     if (!str2metric_type (argv[2], &type))
 6087:       return CMD_WARNING;
 6088: 
 6089:   if (argv[3] != NULL)
 6090:     ospf_routemap_set (ospf, DEFAULT_ROUTE, argv[3]);
 6091:   else
 6092:     ospf_routemap_unset (ospf, DEFAULT_ROUTE);
 6093: 
 6094:   return ospf_redistribute_default_set (ospf, default_originate,
 6095: 					type, metric);
 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,
 6190:        "no distance ospf {intra-area|inter-area|external}",
 6191:        NO_STR
 6192:        "Define an administrative distance\n"
 6193:        "OSPF Administrative distance\n"
 6194:        "OSPF Distance\n"
 6195:        "Intra-area routes\n"
 6196:        "Inter-area routes\n"
 6197:        "External routes\n")
 6198: {
 6199:   struct ospf *ospf = vty->index;
 6200: 
 6201:   if (argc < 3)
 6202:     return CMD_WARNING;
 6203: 
 6204:   if (argv[0] != NULL)
 6205:     ospf->distance_intra = 0;
 6206: 
 6207:   if (argv[1] != NULL)
 6208:     ospf->distance_inter = 0;
 6209: 
 6210:   if (argv[2] != NULL)
 6211:     ospf->distance_external = 0;
 6212: 
 6213:   if (argv[0] || argv[1] || argv[2])
 6214:     return CMD_SUCCESS;
 6215: 
 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;
 6220: 
 6221:   return CMD_SUCCESS;
 6222: }
 6223: 
 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>}",
 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: 
 6239:   if (argc < 3) /* should not happen */
 6240:     return CMD_WARNING;
 6241: 
 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:     }
 6248: 
 6249:   if (argv[0] != NULL)
 6250:     ospf->distance_intra = atoi(argv[0]);
 6251: 
 6252:   if (argv[1] != NULL)
 6253:     ospf->distance_inter = atoi(argv[1]);
 6254: 
 6255:   if (argv[2] != NULL)
 6256:     ospf->distance_external = atoi(argv[2]);
 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")
 6419: 
 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:     }
 6438: 
 6439:   /* Allows for areas configured later to get the property */
 6440:   ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_SET;
 6441: 
 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:     }
 6469:   ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
 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: }
 6588: 
 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: 
 6807: 
 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: 
 6836: 
 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: 
 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: 
 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: 
 7277: 
 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++)
 7285:     if (type != zclient->redist_default &&
 7286:         vrf_bitmap_check (zclient->redist[type], VRF_DEFAULT))
 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: 
 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: 
 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: 
 7577: 
 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: 
 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: 
 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);
 7717:   install_element (OSPF_NODE, &ospf_distance_ospf_cmd);
 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: 
 7733: 
 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:   
 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: 
 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>