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

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

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