File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / isisd / isisd.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jul 21 23:54:39 2013 UTC (11 years ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, HEAD
0.99.22

    1: /*
    2:  * IS-IS Rout(e)ing protocol - isisd.c
    3:  *
    4:  * Copyright (C) 2001,2002   Sampo Saaristo
    5:  *                           Tampere University of Technology      
    6:  *                           Institute of Communications Engineering
    7:  *
    8:  * This program is free software; you can redistribute it and/or modify it 
    9:  * under the terms of the GNU General Public Licenseas published by the Free 
   10:  * Software Foundation; either version 2 of the License, or (at your option) 
   11:  * any later version.
   12:  *
   13:  * This program is distributed in the hope that it will be useful,but WITHOUT 
   14:  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
   15:  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
   16:  * more details.
   17: 
   18:  * You should have received a copy of the GNU General Public License along 
   19:  * with this program; if not, write to the Free Software Foundation, Inc., 
   20:  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
   21:  */
   22: 
   23: #include <zebra.h>
   24: 
   25: #include "thread.h"
   26: #include "vty.h"
   27: #include "command.h"
   28: #include "log.h"
   29: #include "memory.h"
   30: #include "time.h"
   31: #include "linklist.h"
   32: #include "if.h"
   33: #include "hash.h"
   34: #include "stream.h"
   35: #include "prefix.h"
   36: #include "table.h"
   37: 
   38: #include "isisd/dict.h"
   39: #include "isisd/include-netbsd/iso.h"
   40: #include "isisd/isis_constants.h"
   41: #include "isisd/isis_common.h"
   42: #include "isisd/isis_flags.h"
   43: #include "isisd/isis_circuit.h"
   44: #include "isisd/isis_csm.h"
   45: #include "isisd/isisd.h"
   46: #include "isisd/isis_dynhn.h"
   47: #include "isisd/isis_adjacency.h"
   48: #include "isisd/isis_pdu.h"
   49: #include "isisd/isis_misc.h"
   50: #include "isisd/isis_constants.h"
   51: #include "isisd/isis_tlv.h"
   52: #include "isisd/isis_lsp.h"
   53: #include "isisd/isis_spf.h"
   54: #include "isisd/isis_route.h"
   55: #include "isisd/isis_zebra.h"
   56: #include "isisd/isis_events.h"
   57: 
   58: #ifdef TOPOLOGY_GENERATE
   59: #include "spgrid.h"
   60: u_char DEFAULT_TOPOLOGY_BASEIS[6] = { 0xFE, 0xED, 0xFE, 0xED, 0x00, 0x00 };
   61: #endif /* TOPOLOGY_GENERATE */
   62: 
   63: struct isis *isis = NULL;
   64: 
   65: /*
   66:  * Prototypes.
   67:  */
   68: int isis_area_get(struct vty *, const char *);
   69: int isis_area_destroy(struct vty *, const char *);
   70: int area_net_title(struct vty *, const char *);
   71: int area_clear_net_title(struct vty *, const char *);
   72: int show_isis_interface_common(struct vty *, const char *ifname, char);
   73: int show_isis_neighbor_common(struct vty *, const char *id, char);
   74: int clear_isis_neighbor_common(struct vty *, const char *id);
   75: int isis_config_write(struct vty *);
   76: 
   77: 
   78: 
   79: void
   80: isis_new (unsigned long process_id)
   81: {
   82:   isis = XCALLOC (MTYPE_ISIS, sizeof (struct isis));
   83:   /*
   84:    * Default values
   85:    */
   86:   isis->max_area_addrs = 3;
   87:   isis->process_id = process_id;
   88:   isis->router_id = 0;
   89:   isis->area_list = list_new ();
   90:   isis->init_circ_list = list_new ();
   91:   isis->uptime = time (NULL);
   92:   isis->nexthops = list_new ();
   93: #ifdef HAVE_IPV6
   94:   isis->nexthops6 = list_new ();
   95: #endif /* HAVE_IPV6 */
   96:   dyn_cache_init ();
   97:   /*
   98:    * uncomment the next line for full debugs
   99:    */
  100:   /* isis->debugs = 0xFFFF; */
  101: }
  102: 
  103: struct isis_area *
  104: isis_area_create (const char *area_tag)
  105: {
  106:   struct isis_area *area;
  107: 
  108:   area = XCALLOC (MTYPE_ISIS_AREA, sizeof (struct isis_area));
  109: 
  110:   /*
  111:    * The first instance is level-1-2 rest are level-1, unless otherwise
  112:    * configured
  113:    */
  114:   if (listcount (isis->area_list) > 0)
  115:     area->is_type = IS_LEVEL_1;
  116:   else
  117:     area->is_type = IS_LEVEL_1_AND_2;
  118: 
  119:   /*
  120:    * intialize the databases
  121:    */
  122:   if (area->is_type & IS_LEVEL_1)
  123:     {
  124:       area->lspdb[0] = lsp_db_init ();
  125:       area->route_table[0] = route_table_init ();
  126: #ifdef HAVE_IPV6
  127:       area->route_table6[0] = route_table_init ();
  128: #endif /* HAVE_IPV6 */
  129:     }
  130:   if (area->is_type & IS_LEVEL_2)
  131:     {
  132:       area->lspdb[1] = lsp_db_init ();
  133:       area->route_table[1] = route_table_init ();
  134: #ifdef HAVE_IPV6
  135:       area->route_table6[1] = route_table_init ();
  136: #endif /* HAVE_IPV6 */
  137:     }
  138: 
  139:   spftree_area_init (area);
  140: 
  141:   area->circuit_list = list_new ();
  142:   area->area_addrs = list_new ();
  143:   THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1);
  144:   flags_initialize (&area->flags);
  145: 
  146:   /*
  147:    * Default values
  148:    */
  149:   area->max_lsp_lifetime[0] = DEFAULT_LSP_LIFETIME;	/* 1200 */
  150:   area->max_lsp_lifetime[1] = DEFAULT_LSP_LIFETIME;	/* 1200 */
  151:   area->lsp_refresh[0] = DEFAULT_MAX_LSP_GEN_INTERVAL;	/* 900 */
  152:   area->lsp_refresh[1] = DEFAULT_MAX_LSP_GEN_INTERVAL;	/* 900 */
  153:   area->lsp_gen_interval[0] = DEFAULT_MIN_LSP_GEN_INTERVAL;
  154:   area->lsp_gen_interval[1] = DEFAULT_MIN_LSP_GEN_INTERVAL;
  155:   area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
  156:   area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
  157:   area->dynhostname = 1;
  158:   area->oldmetric = 0;
  159:   area->newmetric = 1;
  160:   area->lsp_frag_threshold = 90;
  161: #ifdef TOPOLOGY_GENERATE
  162:   memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
  163: #endif /* TOPOLOGY_GENERATE */
  164: 
  165:   /* FIXME: Think of a better way... */
  166:   area->min_bcast_mtu = 1497;
  167: 
  168:   area->area_tag = strdup (area_tag);
  169:   listnode_add (isis->area_list, area);
  170:   area->isis = isis;
  171: 
  172:   return area;
  173: }
  174: 
  175: struct isis_area *
  176: isis_area_lookup (const char *area_tag)
  177: {
  178:   struct isis_area *area;
  179:   struct listnode *node;
  180: 
  181:   for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
  182:     if ((area->area_tag == NULL && area_tag == NULL) ||
  183: 	(area->area_tag && area_tag
  184: 	 && strcmp (area->area_tag, area_tag) == 0))
  185:     return area;
  186: 
  187:   return NULL;
  188: }
  189: 
  190: int
  191: isis_area_get (struct vty *vty, const char *area_tag)
  192: {
  193:   struct isis_area *area;
  194: 
  195:   area = isis_area_lookup (area_tag);
  196: 
  197:   if (area)
  198:     {
  199:       vty->node = ISIS_NODE;
  200:       vty->index = area;
  201:       return CMD_SUCCESS;
  202:     }
  203: 
  204:   area = isis_area_create (area_tag);
  205: 
  206:   if (isis->debugs & DEBUG_EVENTS)
  207:     zlog_debug ("New IS-IS area instance %s", area->area_tag);
  208: 
  209:   vty->node = ISIS_NODE;
  210:   vty->index = area;
  211: 
  212:   return CMD_SUCCESS;
  213: }
  214: 
  215: int
  216: isis_area_destroy (struct vty *vty, const char *area_tag)
  217: {
  218:   struct isis_area *area;
  219:   struct listnode *node, *nnode;
  220:   struct isis_circuit *circuit;
  221:   struct area_addr *addr;
  222: 
  223:   area = isis_area_lookup (area_tag);
  224: 
  225:   if (area == NULL)
  226:     {
  227:       vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
  228:       return CMD_ERR_NO_MATCH;
  229:     }
  230: 
  231:   if (area->circuit_list)
  232:     {
  233:       for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
  234:         {
  235:           circuit->ip_router = 0;
  236: #ifdef HAVE_IPV6
  237:           circuit->ipv6_router = 0;
  238: #endif
  239:           isis_csm_state_change (ISIS_DISABLE, circuit, area);
  240:         }
  241:       list_delete (area->circuit_list);
  242:       area->circuit_list = NULL;
  243:     }
  244: 
  245:   if (area->lspdb[0] != NULL)
  246:     {
  247:       lsp_db_destroy (area->lspdb[0]);
  248:       area->lspdb[0] = NULL;
  249:     }
  250:   if (area->lspdb[1] != NULL)
  251:     {
  252:       lsp_db_destroy (area->lspdb[1]);
  253:       area->lspdb[1] = NULL;
  254:     }
  255: 
  256:   spftree_area_del (area);
  257: 
  258:   /* invalidate and validate would delete all routes from zebra */
  259:   isis_route_invalidate (area);
  260:   isis_route_validate (area);
  261: 
  262:   if (area->route_table[0])
  263:     {
  264:       route_table_finish (area->route_table[0]);
  265:       area->route_table[0] = NULL;
  266:     }
  267:   if (area->route_table[1])
  268:     {
  269:       route_table_finish (area->route_table[1]);
  270:       area->route_table[1] = NULL;
  271:     }
  272: #ifdef HAVE_IPV6
  273:   if (area->route_table6[0])
  274:     {
  275:       route_table_finish (area->route_table6[0]);
  276:       area->route_table6[0] = NULL;
  277:     }
  278:   if (area->route_table6[1])
  279:     {
  280:       route_table_finish (area->route_table6[1]);
  281:       area->route_table6[1] = NULL;
  282:     }
  283: #endif /* HAVE_IPV6 */
  284: 
  285:   for (ALL_LIST_ELEMENTS (area->area_addrs, node, nnode, addr))
  286:     {
  287:       list_delete_node (area->area_addrs, node);
  288:       XFREE (MTYPE_ISIS_AREA_ADDR, addr);
  289:     }
  290:   area->area_addrs = NULL;
  291: 
  292:   THREAD_TIMER_OFF (area->t_tick);
  293:   THREAD_TIMER_OFF (area->t_lsp_refresh[0]);
  294:   THREAD_TIMER_OFF (area->t_lsp_refresh[1]);
  295: 
  296:   thread_cancel_event (master, area);
  297: 
  298:   listnode_delete (isis->area_list, area);
  299: 
  300:   free (area->area_tag);
  301: 
  302:   XFREE (MTYPE_ISIS_AREA, area);
  303: 
  304:   if (listcount (isis->area_list) == 0)
  305:     {
  306:       memset (isis->sysid, 0, ISIS_SYS_ID_LEN);
  307:       isis->sysid_set = 0;
  308:     }
  309: 
  310:   return CMD_SUCCESS;
  311: }
  312: 
  313: int
  314: area_net_title (struct vty *vty, const char *net_title)
  315: {
  316:   struct isis_area *area;
  317:   struct area_addr *addr;
  318:   struct area_addr *addrp;
  319:   struct listnode *node;
  320: 
  321:   u_char buff[255];
  322:   area = vty->index;
  323: 
  324:   if (!area)
  325:     {
  326:       vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
  327:       return CMD_ERR_NO_MATCH;
  328:     }
  329: 
  330:   /* We check that we are not over the maximal number of addresses */
  331:   if (listcount (area->area_addrs) >= isis->max_area_addrs)
  332:     {
  333:       vty_out (vty, "Maximum of area addresses (%d) already reached %s",
  334: 	       isis->max_area_addrs, VTY_NEWLINE);
  335:       return CMD_ERR_NOTHING_TODO;
  336:     }
  337: 
  338:   addr = XMALLOC (MTYPE_ISIS_AREA_ADDR, sizeof (struct area_addr));
  339:   addr->addr_len = dotformat2buff (buff, net_title);
  340:   memcpy (addr->area_addr, buff, addr->addr_len);
  341: #ifdef EXTREME_DEBUG
  342:   zlog_debug ("added area address %s for area %s (address length %d)",
  343: 	     net_title, area->area_tag, addr->addr_len);
  344: #endif /* EXTREME_DEBUG */
  345:   if (addr->addr_len < 8 || addr->addr_len > 20)
  346:     {
  347:       vty_out (vty, "area address must be at least 8..20 octets long (%d)%s",
  348:                addr->addr_len, VTY_NEWLINE);
  349:       XFREE (MTYPE_ISIS_AREA_ADDR, addr);
  350:       return CMD_ERR_AMBIGUOUS;
  351:     }
  352: 
  353:   if (addr->area_addr[addr->addr_len-1] != 0)
  354:     {
  355:       vty_out (vty, "nsel byte (last byte) in area address must be 0%s",
  356:                VTY_NEWLINE);
  357:       XFREE (MTYPE_ISIS_AREA_ADDR, addr);
  358:       return CMD_ERR_AMBIGUOUS;
  359:     }
  360: 
  361:   if (isis->sysid_set == 0)
  362:     {
  363:       /*
  364:        * First area address - get the SystemID for this router
  365:        */
  366:       memcpy (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN);
  367:       isis->sysid_set = 1;
  368:       if (isis->debugs & DEBUG_EVENTS)
  369: 	zlog_debug ("Router has SystemID %s", sysid_print (isis->sysid));
  370:     }
  371:   else
  372:     {
  373:       /*
  374:        * Check that the SystemID portions match
  375:        */
  376:       if (memcmp (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN))
  377: 	{
  378: 	  vty_out (vty,
  379: 		   "System ID must not change when defining additional area"
  380: 		   " addresses%s", VTY_NEWLINE);
  381: 	  XFREE (MTYPE_ISIS_AREA_ADDR, addr);
  382: 	  return CMD_ERR_AMBIGUOUS;
  383: 	}
  384: 
  385:       /* now we see that we don't already have this address */
  386:       for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
  387: 	{
  388: 	  if ((addrp->addr_len + ISIS_SYS_ID_LEN + ISIS_NSEL_LEN) != (addr->addr_len))
  389: 	    continue;
  390: 	  if (!memcmp (addrp->area_addr, addr->area_addr, addr->addr_len))
  391: 	    {
  392: 	      XFREE (MTYPE_ISIS_AREA_ADDR, addr);
  393: 	      return CMD_SUCCESS;	/* silent fail */
  394: 	    }
  395: 	}
  396:     }
  397: 
  398:   /*
  399:    * Forget the systemID part of the address
  400:    */
  401:   addr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN);
  402:   listnode_add (area->area_addrs, addr);
  403: 
  404:   /* only now we can safely generate our LSPs for this area */
  405:   if (listcount (area->area_addrs) > 0)
  406:     {
  407:       if (area->is_type & IS_LEVEL_1)
  408:         lsp_generate (area, IS_LEVEL_1);
  409:       if (area->is_type & IS_LEVEL_2)
  410:         lsp_generate (area, IS_LEVEL_2);
  411:     }
  412: 
  413:   return CMD_SUCCESS;
  414: }
  415: 
  416: int
  417: area_clear_net_title (struct vty *vty, const char *net_title)
  418: {
  419:   struct isis_area *area;
  420:   struct area_addr addr, *addrp = NULL;
  421:   struct listnode *node;
  422:   u_char buff[255];
  423: 
  424:   area = vty->index;
  425:   if (!area)
  426:     {
  427:       vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
  428:       return CMD_ERR_NO_MATCH;
  429:     }
  430: 
  431:   addr.addr_len = dotformat2buff (buff, net_title);
  432:   if (addr.addr_len < 8 || addr.addr_len > 20)
  433:     {
  434:       vty_out (vty, "Unsupported area address length %d, should be 8...20 %s",
  435: 	       addr.addr_len, VTY_NEWLINE);
  436:       return CMD_ERR_AMBIGUOUS;
  437:     }
  438: 
  439:   memcpy (addr.area_addr, buff, (int) addr.addr_len);
  440: 
  441:   for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp))
  442:     if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len &&
  443: 	!memcmp (addrp->area_addr, addr.area_addr, addr.addr_len))
  444:     break;
  445: 
  446:   if (!addrp)
  447:     {
  448:       vty_out (vty, "No area address %s for area %s %s", net_title,
  449: 	       area->area_tag, VTY_NEWLINE);
  450:       return CMD_ERR_NO_MATCH;
  451:     }
  452: 
  453:   listnode_delete (area->area_addrs, addrp);
  454:   XFREE (MTYPE_ISIS_AREA_ADDR, addrp);
  455: 
  456:   /*
  457:    * Last area address - reset the SystemID for this router
  458:    */
  459:   if (listcount (area->area_addrs) == 0)
  460:     {
  461:       memset (isis->sysid, 0, ISIS_SYS_ID_LEN);
  462:       isis->sysid_set = 0;
  463:       if (isis->debugs & DEBUG_EVENTS)
  464:         zlog_debug ("Router has no SystemID");
  465:     }
  466: 
  467:   return CMD_SUCCESS;
  468: }
  469: 
  470: /*
  471:  * 'show isis interface' command
  472:  */
  473: 
  474: int
  475: show_isis_interface_common (struct vty *vty, const char *ifname, char detail)
  476: {
  477:   struct listnode *anode, *cnode;
  478:   struct isis_area *area;
  479:   struct isis_circuit *circuit;
  480: 
  481:   if (!isis)
  482:     {
  483:       vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
  484:       return CMD_SUCCESS;
  485:     }
  486: 
  487:   for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
  488:     {
  489:       vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
  490: 
  491:       if (detail == ISIS_UI_LEVEL_BRIEF)
  492:         vty_out (vty, "  Interface   CircId   State    Type     Level%s",
  493:                  VTY_NEWLINE);
  494: 
  495:       for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
  496:         if (!ifname)
  497:           isis_circuit_print_vty (circuit, vty, detail);
  498:         else if (strcmp(circuit->interface->name, ifname) == 0)
  499:           isis_circuit_print_vty (circuit, vty, detail);
  500:     }
  501: 
  502:   return CMD_SUCCESS;
  503: }
  504: 
  505: DEFUN (show_isis_interface,
  506:        show_isis_interface_cmd,
  507:        "show isis interface",
  508:        SHOW_STR
  509:        "ISIS network information\n"
  510:        "ISIS interface\n")
  511: {
  512:   return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
  513: }
  514: 
  515: DEFUN (show_isis_interface_detail,
  516:        show_isis_interface_detail_cmd,
  517:        "show isis interface detail",
  518:        SHOW_STR
  519:        "ISIS network information\n"
  520:        "ISIS interface\n"
  521:        "show detailed information\n")
  522: {
  523:   return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
  524: }
  525: 
  526: DEFUN (show_isis_interface_arg,
  527:        show_isis_interface_arg_cmd,
  528:        "show isis interface WORD",
  529:        SHOW_STR
  530:        "ISIS network information\n"
  531:        "ISIS interface\n"
  532:        "ISIS interface name\n")
  533: {
  534:   return show_isis_interface_common (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
  535: }
  536: 
  537: /*
  538:  * 'show isis neighbor' command
  539:  */
  540: 
  541: int
  542: show_isis_neighbor_common (struct vty *vty, const char *id, char detail)
  543: {
  544:   struct listnode *anode, *cnode, *node;
  545:   struct isis_area *area;
  546:   struct isis_circuit *circuit;
  547:   struct list *adjdb;
  548:   struct isis_adjacency *adj;
  549:   struct isis_dynhn *dynhn;
  550:   u_char sysid[ISIS_SYS_ID_LEN];
  551:   int i;
  552: 
  553:   if (!isis)
  554:     {
  555:       vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
  556:       return CMD_SUCCESS;
  557:     }
  558: 
  559:   memset (sysid, 0, ISIS_SYS_ID_LEN);
  560:   if (id)
  561:     {
  562:       if (sysid2buff (sysid, id) == 0)
  563:         {
  564:           dynhn = dynhn_find_by_name (id);
  565:           if (dynhn == NULL)
  566:             {
  567:               vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE);
  568:               return CMD_SUCCESS;
  569:             }
  570:           memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN);
  571:         }
  572:     }
  573: 
  574:   for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
  575:     {
  576:       vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE);
  577: 
  578:       if (detail == ISIS_UI_LEVEL_BRIEF)
  579:         vty_out (vty, "  System Id           Interface   L  State"
  580:                       "        Holdtime SNPA%s", VTY_NEWLINE);
  581: 
  582:       for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit))
  583:         {
  584:           if (circuit->circ_type == CIRCUIT_T_BROADCAST)
  585:             {
  586:               for (i = 0; i < 2; i++)
  587:                 {
  588:                   adjdb = circuit->u.bc.adjdb[i];
  589:                   if (adjdb && adjdb->count)
  590:                     {
  591:                       for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
  592:                         if (!id || !memcmp (adj->sysid, sysid,
  593:                                             ISIS_SYS_ID_LEN))
  594:                           isis_adj_print_vty (adj, vty, detail);
  595:                     }
  596:                 }
  597:             }
  598:           else if (circuit->circ_type == CIRCUIT_T_P2P &&
  599:                    circuit->u.p2p.neighbor)
  600:             {
  601:               adj = circuit->u.p2p.neighbor;
  602:               if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
  603:                 isis_adj_print_vty (adj, vty, detail);
  604:             }
  605:         }
  606:     }
  607: 
  608:   return CMD_SUCCESS;
  609: }
  610: 
  611: /*
  612:  * 'clear isis neighbor' command
  613:  */
  614: int
  615: clear_isis_neighbor_common (struct vty *vty, const char *id)
  616: {
  617:   struct listnode *anode, *cnode, *cnextnode, *node, *nnode;
  618:   struct isis_area *area;
  619:   struct isis_circuit *circuit;
  620:   struct list *adjdb;
  621:   struct isis_adjacency *adj;
  622:   struct isis_dynhn *dynhn;
  623:   u_char sysid[ISIS_SYS_ID_LEN];
  624:   int i;
  625: 
  626:   if (!isis)
  627:     {
  628:       vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE);
  629:       return CMD_SUCCESS;
  630:     }
  631: 
  632:   memset (sysid, 0, ISIS_SYS_ID_LEN);
  633:   if (id)
  634:     {
  635:       if (sysid2buff (sysid, id) == 0)
  636:         {
  637:           dynhn = dynhn_find_by_name (id);
  638:           if (dynhn == NULL)
  639:             {
  640:               vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE);
  641:               return CMD_SUCCESS;
  642:             }
  643:           memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN);
  644:         }
  645:     }
  646: 
  647:   for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area))
  648:     {
  649:       for (ALL_LIST_ELEMENTS (area->circuit_list, cnode, cnextnode, circuit))
  650:         {
  651:           if (circuit->circ_type == CIRCUIT_T_BROADCAST)
  652:             {
  653:               for (i = 0; i < 2; i++)
  654:                 {
  655:                   adjdb = circuit->u.bc.adjdb[i];
  656:                   if (adjdb && adjdb->count)
  657:                     {
  658:                       for (ALL_LIST_ELEMENTS (adjdb, node, nnode, adj))
  659:                         if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
  660:                           isis_adj_state_change (adj, ISIS_ADJ_DOWN,
  661:                                                  "clear user request");
  662:                     }
  663:                 }
  664:             }
  665:           else if (circuit->circ_type == CIRCUIT_T_P2P &&
  666:                    circuit->u.p2p.neighbor)
  667:             {
  668:               adj = circuit->u.p2p.neighbor;
  669:               if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN))
  670:                 isis_adj_state_change (adj, ISIS_ADJ_DOWN,
  671:                                        "clear user request");
  672:             }
  673:         }
  674:     }
  675: 
  676:   return CMD_SUCCESS;
  677: }
  678: 
  679: DEFUN (show_isis_neighbor,
  680:        show_isis_neighbor_cmd,
  681:        "show isis neighbor",
  682:        SHOW_STR
  683:        "ISIS network information\n"
  684:        "ISIS neighbor adjacencies\n")
  685: {
  686:   return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_BRIEF);
  687: }
  688: 
  689: DEFUN (show_isis_neighbor_detail,
  690:        show_isis_neighbor_detail_cmd,
  691:        "show isis neighbor detail",
  692:        SHOW_STR
  693:        "ISIS network information\n"
  694:        "ISIS neighbor adjacencies\n"
  695:        "show detailed information\n")
  696: {
  697:   return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_DETAIL);
  698: }
  699: 
  700: DEFUN (show_isis_neighbor_arg,
  701:        show_isis_neighbor_arg_cmd,
  702:        "show isis neighbor WORD",
  703:        SHOW_STR
  704:        "ISIS network information\n"
  705:        "ISIS neighbor adjacencies\n"
  706:        "System id\n")
  707: {
  708:   return show_isis_neighbor_common (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
  709: }
  710: 
  711: DEFUN (clear_isis_neighbor,
  712:        clear_isis_neighbor_cmd,
  713:        "clear isis neighbor",
  714:        CLEAR_STR
  715:        "Reset ISIS network information\n"
  716:        "Reset ISIS neighbor adjacencies\n")
  717: {
  718:   return clear_isis_neighbor_common (vty, NULL);
  719: }
  720: 
  721: DEFUN (clear_isis_neighbor_arg,
  722:        clear_isis_neighbor_arg_cmd,
  723:        "clear isis neighbor WORD",
  724:        CLEAR_STR
  725:        "ISIS network information\n"
  726:        "ISIS neighbor adjacencies\n"
  727:        "System id\n")
  728: {
  729:   return clear_isis_neighbor_common (vty, argv[0]);
  730: }
  731: 
  732: /*
  733:  * 'isis debug', 'show debugging'
  734:  */
  735: void
  736: print_debug (struct vty *vty, int flags, int onoff)
  737: {
  738:   char onoffs[4];
  739:   if (onoff)
  740:     strcpy (onoffs, "on");
  741:   else
  742:     strcpy (onoffs, "off");
  743: 
  744:   if (flags & DEBUG_ADJ_PACKETS)
  745:     vty_out (vty, "IS-IS Adjacency related packets debugging is %s%s", onoffs,
  746: 	     VTY_NEWLINE);
  747:   if (flags & DEBUG_CHECKSUM_ERRORS)
  748:     vty_out (vty, "IS-IS checksum errors debugging is %s%s", onoffs,
  749: 	     VTY_NEWLINE);
  750:   if (flags & DEBUG_LOCAL_UPDATES)
  751:     vty_out (vty, "IS-IS local updates debugging is %s%s", onoffs,
  752: 	     VTY_NEWLINE);
  753:   if (flags & DEBUG_PROTOCOL_ERRORS)
  754:     vty_out (vty, "IS-IS protocol errors debugging is %s%s", onoffs,
  755: 	     VTY_NEWLINE);
  756:   if (flags & DEBUG_SNP_PACKETS)
  757:     vty_out (vty, "IS-IS CSNP/PSNP packets debugging is %s%s", onoffs,
  758: 	     VTY_NEWLINE);
  759:   if (flags & DEBUG_SPF_EVENTS)
  760:     vty_out (vty, "IS-IS SPF events debugging is %s%s", onoffs, VTY_NEWLINE);
  761:   if (flags & DEBUG_SPF_STATS)
  762:     vty_out (vty, "IS-IS SPF Timing and Statistics Data debugging is %s%s",
  763: 	     onoffs, VTY_NEWLINE);
  764:   if (flags & DEBUG_SPF_TRIGGERS)
  765:     vty_out (vty, "IS-IS SPF triggering events debugging is %s%s", onoffs,
  766: 	     VTY_NEWLINE);
  767:   if (flags & DEBUG_UPDATE_PACKETS)
  768:     vty_out (vty, "IS-IS Update related packet debugging is %s%s", onoffs,
  769: 	     VTY_NEWLINE);
  770:   if (flags & DEBUG_RTE_EVENTS)
  771:     vty_out (vty, "IS-IS Route related debuggin is %s%s", onoffs,
  772: 	     VTY_NEWLINE);
  773:   if (flags & DEBUG_EVENTS)
  774:     vty_out (vty, "IS-IS Event debugging is %s%s", onoffs, VTY_NEWLINE);
  775:   if (flags & DEBUG_PACKET_DUMP)
  776:     vty_out (vty, "IS-IS Packet dump debugging is %s%s", onoffs, VTY_NEWLINE);
  777: }
  778: 
  779: DEFUN (show_debugging,
  780:        show_debugging_cmd,
  781:        "show debugging",
  782:        SHOW_STR
  783:        "State of each debugging option\n")
  784: {
  785:   vty_out (vty, "IS-IS:%s", VTY_NEWLINE);
  786:   print_debug (vty, isis->debugs, 1);
  787:   return CMD_SUCCESS;
  788: }
  789: 
  790: /* Debug node. */
  791: static struct cmd_node debug_node = {
  792:   DEBUG_NODE,
  793:   "",
  794:   1
  795: };
  796: 
  797: static int
  798: config_write_debug (struct vty *vty)
  799: {
  800:   int write = 0;
  801:   int flags = isis->debugs;
  802: 
  803:   if (flags & DEBUG_ADJ_PACKETS)
  804:     {
  805:       vty_out (vty, "debug isis adj-packets%s", VTY_NEWLINE);
  806:       write++;
  807:     }
  808:   if (flags & DEBUG_CHECKSUM_ERRORS)
  809:     {
  810:       vty_out (vty, "debug isis checksum-errors%s", VTY_NEWLINE);
  811:       write++;
  812:     }
  813:   if (flags & DEBUG_LOCAL_UPDATES)
  814:     {
  815:       vty_out (vty, "debug isis local-updates%s", VTY_NEWLINE);
  816:       write++;
  817:     }
  818:   if (flags & DEBUG_PROTOCOL_ERRORS)
  819:     {
  820:       vty_out (vty, "debug isis protocol-errors%s", VTY_NEWLINE);
  821:       write++;
  822:     }
  823:   if (flags & DEBUG_SNP_PACKETS)
  824:     {
  825:       vty_out (vty, "debug isis snp-packets%s", VTY_NEWLINE);
  826:       write++;
  827:     }
  828:   if (flags & DEBUG_SPF_EVENTS)
  829:     {
  830:       vty_out (vty, "debug isis spf-events%s", VTY_NEWLINE);
  831:       write++;
  832:     }
  833:   if (flags & DEBUG_SPF_STATS)
  834:     {
  835:       vty_out (vty, "debug isis spf-statistics%s", VTY_NEWLINE);
  836:       write++;
  837:     }
  838:   if (flags & DEBUG_SPF_TRIGGERS)
  839:     {
  840:       vty_out (vty, "debug isis spf-triggers%s", VTY_NEWLINE);
  841:       write++;
  842:     }
  843:   if (flags & DEBUG_UPDATE_PACKETS)
  844:     {
  845:       vty_out (vty, "debug isis update-packets%s", VTY_NEWLINE);
  846:       write++;
  847:     }
  848:   if (flags & DEBUG_RTE_EVENTS)
  849:     {
  850:       vty_out (vty, "debug isis route-events%s", VTY_NEWLINE);
  851:       write++;
  852:     }
  853:   if (flags & DEBUG_EVENTS)
  854:     {
  855:       vty_out (vty, "debug isis events%s", VTY_NEWLINE);
  856:       write++;
  857:     }
  858:   if (flags & DEBUG_PACKET_DUMP)
  859:     {
  860:       vty_out (vty, "debug isis packet-dump%s", VTY_NEWLINE);
  861:       write++;
  862:     }
  863: 
  864:   return write;
  865: }
  866: 
  867: DEFUN (debug_isis_adj,
  868:        debug_isis_adj_cmd,
  869:        "debug isis adj-packets",
  870:        DEBUG_STR
  871:        "IS-IS information\n"
  872:        "IS-IS Adjacency related packets\n")
  873: {
  874:   isis->debugs |= DEBUG_ADJ_PACKETS;
  875:   print_debug (vty, DEBUG_ADJ_PACKETS, 1);
  876: 
  877:   return CMD_SUCCESS;
  878: }
  879: 
  880: DEFUN (no_debug_isis_adj,
  881:        no_debug_isis_adj_cmd,
  882:        "no debug isis adj-packets",
  883:        UNDEBUG_STR
  884:        "IS-IS information\n"
  885:        "IS-IS Adjacency related packets\n")
  886: {
  887:   isis->debugs &= ~DEBUG_ADJ_PACKETS;
  888:   print_debug (vty, DEBUG_ADJ_PACKETS, 0);
  889: 
  890:   return CMD_SUCCESS;
  891: }
  892: 
  893: DEFUN (debug_isis_csum,
  894:        debug_isis_csum_cmd,
  895:        "debug isis checksum-errors",
  896:        DEBUG_STR
  897:        "IS-IS information\n"
  898:        "IS-IS LSP checksum errors\n")
  899: {
  900:   isis->debugs |= DEBUG_CHECKSUM_ERRORS;
  901:   print_debug (vty, DEBUG_CHECKSUM_ERRORS, 1);
  902: 
  903:   return CMD_SUCCESS;
  904: }
  905: 
  906: DEFUN (no_debug_isis_csum,
  907:        no_debug_isis_csum_cmd,
  908:        "no debug isis checksum-errors",
  909:        UNDEBUG_STR
  910:        "IS-IS information\n"
  911:        "IS-IS LSP checksum errors\n")
  912: {
  913:   isis->debugs &= ~DEBUG_CHECKSUM_ERRORS;
  914:   print_debug (vty, DEBUG_CHECKSUM_ERRORS, 0);
  915: 
  916:   return CMD_SUCCESS;
  917: }
  918: 
  919: DEFUN (debug_isis_lupd,
  920:        debug_isis_lupd_cmd,
  921:        "debug isis local-updates",
  922:        DEBUG_STR
  923:        "IS-IS information\n"
  924:        "IS-IS local update packets\n")
  925: {
  926:   isis->debugs |= DEBUG_LOCAL_UPDATES;
  927:   print_debug (vty, DEBUG_LOCAL_UPDATES, 1);
  928: 
  929:   return CMD_SUCCESS;
  930: }
  931: 
  932: DEFUN (no_debug_isis_lupd,
  933:        no_debug_isis_lupd_cmd,
  934:        "no debug isis local-updates",
  935:        UNDEBUG_STR
  936:        "IS-IS information\n"
  937:        "IS-IS local update packets\n")
  938: {
  939:   isis->debugs &= ~DEBUG_LOCAL_UPDATES;
  940:   print_debug (vty, DEBUG_LOCAL_UPDATES, 0);
  941: 
  942:   return CMD_SUCCESS;
  943: }
  944: 
  945: DEFUN (debug_isis_err,
  946:        debug_isis_err_cmd,
  947:        "debug isis protocol-errors",
  948:        DEBUG_STR
  949:        "IS-IS information\n"
  950:        "IS-IS LSP protocol errors\n")
  951: {
  952:   isis->debugs |= DEBUG_PROTOCOL_ERRORS;
  953:   print_debug (vty, DEBUG_PROTOCOL_ERRORS, 1);
  954: 
  955:   return CMD_SUCCESS;
  956: }
  957: 
  958: DEFUN (no_debug_isis_err,
  959:        no_debug_isis_err_cmd,
  960:        "no debug isis protocol-errors",
  961:        UNDEBUG_STR
  962:        "IS-IS information\n"
  963:        "IS-IS LSP protocol errors\n")
  964: {
  965:   isis->debugs &= ~DEBUG_PROTOCOL_ERRORS;
  966:   print_debug (vty, DEBUG_PROTOCOL_ERRORS, 0);
  967: 
  968:   return CMD_SUCCESS;
  969: }
  970: 
  971: DEFUN (debug_isis_snp,
  972:        debug_isis_snp_cmd,
  973:        "debug isis snp-packets",
  974:        DEBUG_STR
  975:        "IS-IS information\n"
  976:        "IS-IS CSNP/PSNP packets\n")
  977: {
  978:   isis->debugs |= DEBUG_SNP_PACKETS;
  979:   print_debug (vty, DEBUG_SNP_PACKETS, 1);
  980: 
  981:   return CMD_SUCCESS;
  982: }
  983: 
  984: DEFUN (no_debug_isis_snp,
  985:        no_debug_isis_snp_cmd,
  986:        "no debug isis snp-packets",
  987:        UNDEBUG_STR
  988:        "IS-IS information\n"
  989:        "IS-IS CSNP/PSNP packets\n")
  990: {
  991:   isis->debugs &= ~DEBUG_SNP_PACKETS;
  992:   print_debug (vty, DEBUG_SNP_PACKETS, 0);
  993: 
  994:   return CMD_SUCCESS;
  995: }
  996: 
  997: DEFUN (debug_isis_upd,
  998:        debug_isis_upd_cmd,
  999:        "debug isis update-packets",
 1000:        DEBUG_STR
 1001:        "IS-IS information\n"
 1002:        "IS-IS Update related packets\n")
 1003: {
 1004:   isis->debugs |= DEBUG_UPDATE_PACKETS;
 1005:   print_debug (vty, DEBUG_UPDATE_PACKETS, 1);
 1006: 
 1007:   return CMD_SUCCESS;
 1008: }
 1009: 
 1010: DEFUN (no_debug_isis_upd,
 1011:        no_debug_isis_upd_cmd,
 1012:        "no debug isis update-packets",
 1013:        UNDEBUG_STR
 1014:        "IS-IS information\n"
 1015:        "IS-IS Update related packets\n")
 1016: {
 1017:   isis->debugs &= ~DEBUG_UPDATE_PACKETS;
 1018:   print_debug (vty, DEBUG_UPDATE_PACKETS, 0);
 1019: 
 1020:   return CMD_SUCCESS;
 1021: }
 1022: 
 1023: DEFUN (debug_isis_spfevents,
 1024:        debug_isis_spfevents_cmd,
 1025:        "debug isis spf-events",
 1026:        DEBUG_STR
 1027:        "IS-IS information\n"
 1028:        "IS-IS Shortest Path First Events\n")
 1029: {
 1030:   isis->debugs |= DEBUG_SPF_EVENTS;
 1031:   print_debug (vty, DEBUG_SPF_EVENTS, 1);
 1032: 
 1033:   return CMD_SUCCESS;
 1034: }
 1035: 
 1036: DEFUN (no_debug_isis_spfevents,
 1037:        no_debug_isis_spfevents_cmd,
 1038:        "no debug isis spf-events",
 1039:        UNDEBUG_STR
 1040:        "IS-IS information\n"
 1041:        "IS-IS Shortest Path First Events\n")
 1042: {
 1043:   isis->debugs &= ~DEBUG_SPF_EVENTS;
 1044:   print_debug (vty, DEBUG_SPF_EVENTS, 0);
 1045: 
 1046:   return CMD_SUCCESS;
 1047: }
 1048: 
 1049: DEFUN (debug_isis_spfstats,
 1050:        debug_isis_spfstats_cmd,
 1051:        "debug isis spf-statistics ",
 1052:        DEBUG_STR
 1053:        "IS-IS information\n"
 1054:        "IS-IS SPF Timing and Statistic Data\n")
 1055: {
 1056:   isis->debugs |= DEBUG_SPF_STATS;
 1057:   print_debug (vty, DEBUG_SPF_STATS, 1);
 1058: 
 1059:   return CMD_SUCCESS;
 1060: }
 1061: 
 1062: DEFUN (no_debug_isis_spfstats,
 1063:        no_debug_isis_spfstats_cmd,
 1064:        "no debug isis spf-statistics",
 1065:        UNDEBUG_STR
 1066:        "IS-IS information\n"
 1067:        "IS-IS SPF Timing and Statistic Data\n")
 1068: {
 1069:   isis->debugs &= ~DEBUG_SPF_STATS;
 1070:   print_debug (vty, DEBUG_SPF_STATS, 0);
 1071: 
 1072:   return CMD_SUCCESS;
 1073: }
 1074: 
 1075: DEFUN (debug_isis_spftrigg,
 1076:        debug_isis_spftrigg_cmd,
 1077:        "debug isis spf-triggers",
 1078:        DEBUG_STR
 1079:        "IS-IS information\n"
 1080:        "IS-IS SPF triggering events\n")
 1081: {
 1082:   isis->debugs |= DEBUG_SPF_TRIGGERS;
 1083:   print_debug (vty, DEBUG_SPF_TRIGGERS, 1);
 1084: 
 1085:   return CMD_SUCCESS;
 1086: }
 1087: 
 1088: DEFUN (no_debug_isis_spftrigg,
 1089:        no_debug_isis_spftrigg_cmd,
 1090:        "no debug isis spf-triggers",
 1091:        UNDEBUG_STR
 1092:        "IS-IS information\n"
 1093:        "IS-IS SPF triggering events\n")
 1094: {
 1095:   isis->debugs &= ~DEBUG_SPF_TRIGGERS;
 1096:   print_debug (vty, DEBUG_SPF_TRIGGERS, 0);
 1097: 
 1098:   return CMD_SUCCESS;
 1099: }
 1100: 
 1101: DEFUN (debug_isis_rtevents,
 1102:        debug_isis_rtevents_cmd,
 1103:        "debug isis route-events",
 1104:        DEBUG_STR
 1105:        "IS-IS information\n"
 1106:        "IS-IS Route related events\n")
 1107: {
 1108:   isis->debugs |= DEBUG_RTE_EVENTS;
 1109:   print_debug (vty, DEBUG_RTE_EVENTS, 1);
 1110: 
 1111:   return CMD_SUCCESS;
 1112: }
 1113: 
 1114: DEFUN (no_debug_isis_rtevents,
 1115:        no_debug_isis_rtevents_cmd,
 1116:        "no debug isis route-events",
 1117:        UNDEBUG_STR
 1118:        "IS-IS information\n"
 1119:        "IS-IS Route related events\n")
 1120: {
 1121:   isis->debugs &= ~DEBUG_RTE_EVENTS;
 1122:   print_debug (vty, DEBUG_RTE_EVENTS, 0);
 1123: 
 1124:   return CMD_SUCCESS;
 1125: }
 1126: 
 1127: DEFUN (debug_isis_events,
 1128:        debug_isis_events_cmd,
 1129:        "debug isis events",
 1130:        DEBUG_STR
 1131:        "IS-IS information\n"
 1132:        "IS-IS Events\n")
 1133: {
 1134:   isis->debugs |= DEBUG_EVENTS;
 1135:   print_debug (vty, DEBUG_EVENTS, 1);
 1136: 
 1137:   return CMD_SUCCESS;
 1138: }
 1139: 
 1140: DEFUN (no_debug_isis_events,
 1141:        no_debug_isis_events_cmd,
 1142:        "no debug isis events",
 1143:        UNDEBUG_STR
 1144:        "IS-IS information\n"
 1145:        "IS-IS Events\n")
 1146: {
 1147:   isis->debugs &= ~DEBUG_EVENTS;
 1148:   print_debug (vty, DEBUG_EVENTS, 0);
 1149: 
 1150:   return CMD_SUCCESS;
 1151: }
 1152: 
 1153: DEFUN (debug_isis_packet_dump,
 1154:        debug_isis_packet_dump_cmd,
 1155:        "debug isis packet-dump",
 1156:        DEBUG_STR
 1157:        "IS-IS information\n"
 1158:        "IS-IS packet dump\n")
 1159: {
 1160:   isis->debugs |= DEBUG_PACKET_DUMP;
 1161:   print_debug (vty, DEBUG_PACKET_DUMP, 1);
 1162: 
 1163:   return CMD_SUCCESS;
 1164: }
 1165: 
 1166: DEFUN (no_debug_isis_packet_dump,
 1167:        no_debug_isis_packet_dump_cmd,
 1168:        "no debug isis packet-dump",
 1169:        UNDEBUG_STR
 1170:        "IS-IS information\n"
 1171:        "IS-IS packet dump\n")
 1172: {
 1173:   isis->debugs &= ~DEBUG_PACKET_DUMP;
 1174:   print_debug (vty, DEBUG_PACKET_DUMP, 0);
 1175: 
 1176:   return CMD_SUCCESS;
 1177: }
 1178: 
 1179: DEFUN (show_hostname,
 1180:        show_hostname_cmd,
 1181:        "show isis hostname",
 1182:        SHOW_STR
 1183:        "IS-IS information\n"
 1184:        "IS-IS Dynamic hostname mapping\n")
 1185: {
 1186:   dynhn_print_all (vty);
 1187: 
 1188:   return CMD_SUCCESS;
 1189: }
 1190: 
 1191: static void
 1192: vty_out_timestr(struct vty *vty, time_t uptime)
 1193: {
 1194:   struct tm *tm;
 1195:   time_t difftime = time (NULL);
 1196:   difftime -= uptime;
 1197:   tm = gmtime (&difftime);
 1198: 
 1199: #define ONE_DAY_SECOND 60*60*24
 1200: #define ONE_WEEK_SECOND 60*60*24*7
 1201:   if (difftime < ONE_DAY_SECOND)
 1202:     vty_out (vty,  "%02d:%02d:%02d", 
 1203:         tm->tm_hour, tm->tm_min, tm->tm_sec);
 1204:   else if (difftime < ONE_WEEK_SECOND)
 1205:     vty_out (vty, "%dd%02dh%02dm", 
 1206:         tm->tm_yday, tm->tm_hour, tm->tm_min);
 1207:   else
 1208:     vty_out (vty, "%02dw%dd%02dh", 
 1209:         tm->tm_yday/7,
 1210:         tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
 1211:   vty_out (vty, " ago");
 1212: }
 1213: 
 1214: DEFUN (show_isis_summary,
 1215:        show_isis_summary_cmd,
 1216:        "show isis summary",
 1217:        SHOW_STR "IS-IS information\n" "IS-IS summary\n")
 1218: {
 1219:   struct listnode *node, *node2;
 1220:   struct isis_area *area;
 1221:   struct isis_spftree *spftree;
 1222:   int level;
 1223: 
 1224:   if (isis == NULL)
 1225:   {
 1226:     vty_out (vty, "ISIS is not running%s", VTY_NEWLINE);
 1227:     return CMD_SUCCESS;
 1228:   }
 1229: 
 1230:   vty_out (vty, "Process Id      : %ld%s", isis->process_id,
 1231:       VTY_NEWLINE);
 1232:   if (isis->sysid_set)
 1233:     vty_out (vty, "System Id       : %s%s", sysid_print (isis->sysid),
 1234:         VTY_NEWLINE);
 1235: 
 1236:   vty_out (vty, "Up time         : ");
 1237:   vty_out_timestr(vty, isis->uptime);
 1238:   vty_out (vty, "%s", VTY_NEWLINE);
 1239: 
 1240:   if (isis->area_list)
 1241:     vty_out (vty, "Number of areas : %d%s", isis->area_list->count,
 1242:         VTY_NEWLINE);
 1243: 
 1244:   for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
 1245:   {
 1246:     vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
 1247:         VTY_NEWLINE);
 1248: 
 1249:     if (listcount (area->area_addrs) > 0)
 1250:     {
 1251:       struct area_addr *area_addr;
 1252:       for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
 1253:       {
 1254:         vty_out (vty, "  Net: %s%s",
 1255:             isonet_print (area_addr->area_addr,
 1256:               area_addr->addr_len + ISIS_SYS_ID_LEN +
 1257:               1), VTY_NEWLINE);
 1258:       }
 1259:     }
 1260: 
 1261:     for (level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++)
 1262:     {
 1263:       if ((area->is_type & level) == 0)
 1264:         continue;
 1265: 
 1266:       vty_out (vty, "  Level-%d:%s", level, VTY_NEWLINE);
 1267:       spftree = area->spftree[level - 1];
 1268:       if (spftree->pending)
 1269:         vty_out (vty, "    IPv4 SPF: (pending)%s", VTY_NEWLINE);
 1270:       else
 1271:         vty_out (vty, "    IPv4 SPF:%s", VTY_NEWLINE);
 1272: 
 1273:       vty_out (vty, "      minimum interval  : %d%s",
 1274:           area->min_spf_interval[level - 1], VTY_NEWLINE);
 1275: 
 1276:       vty_out (vty, "      last run elapsed  : ");
 1277:       vty_out_timestr(vty, spftree->last_run_timestamp);
 1278:       vty_out (vty, "%s", VTY_NEWLINE);
 1279: 
 1280:       vty_out (vty, "      last run duration : %u usec%s",
 1281:                (u_int32_t)spftree->last_run_duration, VTY_NEWLINE);
 1282: 
 1283:       vty_out (vty, "      run count         : %d%s",
 1284:           spftree->runcount, VTY_NEWLINE);
 1285: 
 1286: #ifdef HAVE_IPV6
 1287:       spftree = area->spftree6[level - 1];
 1288:       if (spftree->pending)
 1289:         vty_out (vty, "    IPv6 SPF: (pending)%s", VTY_NEWLINE);
 1290:       else
 1291:         vty_out (vty, "    IPv6 SPF:%s", VTY_NEWLINE);
 1292: 
 1293:       vty_out (vty, "      minimum interval  : %d%s",
 1294:           area->min_spf_interval[level - 1], VTY_NEWLINE);
 1295: 
 1296:       vty_out (vty, "      last run elapsed  : ");
 1297:       vty_out_timestr(vty, spftree->last_run_timestamp);
 1298:       vty_out (vty, "%s", VTY_NEWLINE);
 1299: 
 1300:       vty_out (vty, "      last run duration : %u msec%s",
 1301:                spftree->last_run_duration, VTY_NEWLINE);
 1302: 
 1303:       vty_out (vty, "      run count         : %d%s",
 1304:           spftree->runcount, VTY_NEWLINE);
 1305: #endif
 1306:     }
 1307:   }
 1308:   vty_out (vty, "%s", VTY_NEWLINE);
 1309: 
 1310:   return CMD_SUCCESS;
 1311: }
 1312: 
 1313: /*
 1314:  * This function supports following display options:
 1315:  * [ show isis database [detail] ]
 1316:  * [ show isis database <sysid> [detail] ]
 1317:  * [ show isis database <hostname> [detail] ]
 1318:  * [ show isis database <sysid>.<pseudo-id> [detail] ]
 1319:  * [ show isis database <hostname>.<pseudo-id> [detail] ]
 1320:  * [ show isis database <sysid>.<pseudo-id>-<fragment-number> [detail] ]
 1321:  * [ show isis database <hostname>.<pseudo-id>-<fragment-number> [detail] ]
 1322:  * [ show isis database detail <sysid> ]
 1323:  * [ show isis database detail <hostname> ]
 1324:  * [ show isis database detail <sysid>.<pseudo-id> ]
 1325:  * [ show isis database detail <hostname>.<pseudo-id> ]
 1326:  * [ show isis database detail <sysid>.<pseudo-id>-<fragment-number> ]
 1327:  * [ show isis database detail <hostname>.<pseudo-id>-<fragment-number> ]
 1328:  */
 1329: static int
 1330: show_isis_database (struct vty *vty, const char *argv, int ui_level)
 1331: {
 1332:   struct listnode *node;
 1333:   struct isis_area *area;
 1334:   struct isis_lsp *lsp;
 1335:   struct isis_dynhn *dynhn;
 1336:   const char *pos = argv;
 1337:   u_char lspid[ISIS_SYS_ID_LEN+2];
 1338:   char sysid[255];
 1339:   u_char number[3];
 1340:   int level, lsp_count;
 1341: 
 1342:   if (isis->area_list->count == 0)
 1343:     return CMD_SUCCESS;
 1344: 
 1345:   memset (&lspid, 0, ISIS_SYS_ID_LEN);
 1346:   memset (&sysid, 0, 255);
 1347: 
 1348:   /*
 1349:    * extract fragment and pseudo id from the string argv
 1350:    * in the forms:
 1351:    * (a) <systemid/hostname>.<pseudo-id>-<framenent> or
 1352:    * (b) <systemid/hostname>.<pseudo-id> or
 1353:    * (c) <systemid/hostname> or
 1354:    * Where systemid is in the form:
 1355:    * xxxx.xxxx.xxxx
 1356:    */
 1357:   if (argv)
 1358:      strncpy (sysid, argv, 254);
 1359:   if (argv && strlen (argv) > 3)
 1360:     {
 1361:       pos = argv + strlen (argv) - 3;
 1362:       if (strncmp (pos, "-", 1) == 0)
 1363:       {
 1364:         memcpy (number, ++pos, 2);
 1365:         lspid[ISIS_SYS_ID_LEN+1] = (u_char) strtol ((char *)number, NULL, 16);
 1366:         pos -= 4;
 1367:         if (strncmp (pos, ".", 1) != 0)
 1368:           return CMD_ERR_AMBIGUOUS;
 1369:       }
 1370:       if (strncmp (pos, ".", 1) == 0)
 1371:       {
 1372:         memcpy (number, ++pos, 2);
 1373:         lspid[ISIS_SYS_ID_LEN] = (u_char) strtol ((char *)number, NULL, 16);
 1374:         sysid[pos - argv - 1] = '\0';
 1375:       }
 1376:     }
 1377: 
 1378:   for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
 1379:     {
 1380:       vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null",
 1381:                VTY_NEWLINE);
 1382: 
 1383:       for (level = 0; level < ISIS_LEVELS; level++)
 1384:         {
 1385:           if (area->lspdb[level] && dict_count (area->lspdb[level]) > 0)
 1386:             {
 1387:               lsp = NULL;
 1388:               if (argv != NULL)
 1389:                 {
 1390:                   /*
 1391:                    * Try to find the lsp-id if the argv string is in
 1392:                    * the form hostname.<pseudo-id>-<fragment>
 1393:                    */
 1394:                   if (sysid2buff (lspid, sysid))
 1395:                     {
 1396:                       lsp = lsp_search (lspid, area->lspdb[level]);
 1397:                     }
 1398:                   else if ((dynhn = dynhn_find_by_name (sysid)))
 1399:                     {
 1400:                       memcpy (lspid, dynhn->id, ISIS_SYS_ID_LEN);
 1401:                       lsp = lsp_search (lspid, area->lspdb[level]);
 1402:                     }
 1403:                   else if (strncmp(unix_hostname (), sysid, 15) == 0)
 1404:                     {
 1405:                       memcpy (lspid, isis->sysid, ISIS_SYS_ID_LEN);
 1406:                       lsp = lsp_search (lspid, area->lspdb[level]);
 1407:                     }
 1408:                 }
 1409: 
 1410:               if (lsp != NULL || argv == NULL)
 1411:                 {
 1412:                   vty_out (vty, "IS-IS Level-%d link-state database:%s",
 1413:                            level + 1, VTY_NEWLINE);
 1414: 
 1415:                   /* print the title in all cases */
 1416:                   vty_out (vty, "LSP ID                  PduLen  "
 1417:                            "SeqNumber   Chksum  Holdtime  ATT/P/OL%s",
 1418:                            VTY_NEWLINE);
 1419:                 }
 1420: 
 1421:               if (lsp)
 1422:                 {
 1423:                   if (ui_level == ISIS_UI_LEVEL_DETAIL)
 1424:                     lsp_print_detail (lsp, vty, area->dynhostname);
 1425:                   else
 1426:                     lsp_print (lsp, vty, area->dynhostname);
 1427:                 }
 1428:               else if (argv == NULL)
 1429:                 {
 1430:                   lsp_count = lsp_print_all (vty, area->lspdb[level],
 1431:                                              ui_level,
 1432:                                              area->dynhostname);
 1433: 
 1434:                   vty_out (vty, "    %u LSPs%s%s",
 1435:                            lsp_count, VTY_NEWLINE, VTY_NEWLINE);
 1436:                 }
 1437:             }
 1438:         }
 1439:     }
 1440: 
 1441:   return CMD_SUCCESS;
 1442: }
 1443: 
 1444: DEFUN (show_database_brief,
 1445:        show_database_cmd,
 1446:        "show isis database",
 1447:        SHOW_STR
 1448:        "IS-IS information\n"
 1449:        "IS-IS link state database\n")
 1450: {
 1451:   return show_isis_database (vty, NULL, ISIS_UI_LEVEL_BRIEF);
 1452: }
 1453: 
 1454: DEFUN (show_database_lsp_brief,
 1455:        show_database_arg_cmd,
 1456:        "show isis database WORD",
 1457:        SHOW_STR
 1458:        "IS-IS information\n"
 1459:        "IS-IS link state database\n"
 1460:        "LSP ID\n")
 1461: {
 1462:   return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_BRIEF);
 1463: }
 1464: 
 1465: DEFUN (show_database_lsp_detail,
 1466:        show_database_arg_detail_cmd,
 1467:        "show isis database WORD detail",
 1468:        SHOW_STR
 1469:        "IS-IS information\n"
 1470:        "IS-IS link state database\n"
 1471:        "LSP ID\n"
 1472:        "Detailed information\n")
 1473: {
 1474:   return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
 1475: }
 1476: 
 1477: DEFUN (show_database_detail,
 1478:        show_database_detail_cmd,
 1479:        "show isis database detail",
 1480:        SHOW_STR
 1481:        "IS-IS information\n"
 1482:        "IS-IS link state database\n")
 1483: {
 1484:   return show_isis_database (vty, NULL, ISIS_UI_LEVEL_DETAIL);
 1485: }
 1486: 
 1487: DEFUN (show_database_detail_lsp,
 1488:        show_database_detail_arg_cmd,
 1489:        "show isis database detail WORD",
 1490:        SHOW_STR
 1491:        "IS-IS information\n"
 1492:        "IS-IS link state database\n"
 1493:        "Detailed information\n"
 1494:        "LSP ID\n")
 1495: {
 1496:   return show_isis_database (vty, argv[0], ISIS_UI_LEVEL_DETAIL);
 1497: }
 1498: 
 1499: /* 
 1500:  * 'router isis' command 
 1501:  */
 1502: DEFUN (router_isis,
 1503:        router_isis_cmd,
 1504:        "router isis WORD",
 1505:        ROUTER_STR
 1506:        "ISO IS-IS\n"
 1507:        "ISO Routing area tag")
 1508: {
 1509:   return isis_area_get (vty, argv[0]);
 1510: }
 1511: 
 1512: /* 
 1513:  *'no router isis' command 
 1514:  */
 1515: DEFUN (no_router_isis,
 1516:        no_router_isis_cmd,
 1517:        "no router isis WORD",
 1518:        "no\n" ROUTER_STR "ISO IS-IS\n" "ISO Routing area tag")
 1519: {
 1520:   return isis_area_destroy (vty, argv[0]);
 1521: }
 1522: 
 1523: /*
 1524:  * 'net' command
 1525:  */
 1526: DEFUN (net,
 1527:        net_cmd,
 1528:        "net WORD",
 1529:        "A Network Entity Title for this process (OSI only)\n"
 1530:        "XX.XXXX. ... .XXX.XX  Network entity title (NET)\n")
 1531: {
 1532:   return area_net_title (vty, argv[0]);
 1533: }
 1534: 
 1535: /*
 1536:  * 'no net' command
 1537:  */
 1538: DEFUN (no_net,
 1539:        no_net_cmd,
 1540:        "no net WORD",
 1541:        NO_STR
 1542:        "A Network Entity Title for this process (OSI only)\n"
 1543:        "XX.XXXX. ... .XXX.XX  Network entity title (NET)\n")
 1544: {
 1545:   return area_clear_net_title (vty, argv[0]);
 1546: }
 1547: 
 1548: DEFUN (area_passwd_md5,
 1549:        area_passwd_md5_cmd,
 1550:        "area-password md5 WORD",
 1551:        "Configure the authentication password for an area\n"
 1552:        "Authentication type\n"
 1553:        "Area password\n")
 1554: {
 1555:   struct isis_area *area;
 1556:   int len;
 1557: 
 1558:   area = vty->index;
 1559: 
 1560:   if (!area)
 1561:     {
 1562:       vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
 1563:       return CMD_ERR_NO_MATCH;
 1564:     }
 1565: 
 1566:   len = strlen (argv[0]);
 1567:   if (len > 254)
 1568:     {
 1569:       vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
 1570:       return CMD_ERR_AMBIGUOUS;
 1571:     }
 1572: 
 1573:   area->area_passwd.len = (u_char) len;
 1574:   area->area_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
 1575:   strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
 1576: 
 1577:   if (argc > 1)
 1578:     {
 1579:       SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
 1580:       if (strncmp(argv[1], "v", 1) == 0)
 1581: 	SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
 1582:       else
 1583: 	UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
 1584:     }
 1585:   else
 1586:     {
 1587:       UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
 1588:       UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
 1589:     }
 1590:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 1591: 
 1592:   return CMD_SUCCESS;
 1593: }
 1594: 
 1595: ALIAS (area_passwd_md5,
 1596:        area_passwd_md5_snpauth_cmd,
 1597:        "area-password md5 WORD authenticate snp (send-only|validate)",
 1598:        "Configure the authentication password for an area\n"
 1599:        "Authentication type\n"
 1600:        "Area password\n"
 1601:        "Authentication\n"
 1602:        "SNP PDUs\n"
 1603:        "Send but do not check PDUs on receiving\n"
 1604:        "Send and check PDUs on receiving\n");
 1605: 
 1606: DEFUN (area_passwd_clear,
 1607:        area_passwd_clear_cmd,
 1608:        "area-password clear WORD",
 1609:        "Configure the authentication password for an area\n"
 1610:        "Authentication type\n"
 1611:        "Area password\n")
 1612: {
 1613:   struct isis_area *area;
 1614:   int len;
 1615: 
 1616:   area = vty->index;
 1617: 
 1618:   if (!area)
 1619:     {
 1620:       vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
 1621:       return CMD_ERR_NO_MATCH;
 1622:     }
 1623: 
 1624:   len = strlen (argv[0]);
 1625:   if (len > 254)
 1626:     {
 1627:       vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
 1628:       return CMD_ERR_AMBIGUOUS;
 1629:     }
 1630: 
 1631:   area->area_passwd.len = (u_char) len;
 1632:   area->area_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
 1633:   strncpy ((char *)area->area_passwd.passwd, argv[0], 255);
 1634: 
 1635:   if (argc > 1)
 1636:     {
 1637:       SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
 1638:       if (strncmp(argv[1], "v", 1) == 0)
 1639: 	SET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
 1640:       else
 1641: 	UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
 1642:     }
 1643:   else
 1644:     {
 1645:       UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND);
 1646:       UNSET_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV);
 1647:     }
 1648:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 1649: 
 1650:   return CMD_SUCCESS;
 1651: }
 1652: 
 1653: ALIAS (area_passwd_clear,
 1654:        area_passwd_clear_snpauth_cmd,
 1655:        "area-password clear WORD authenticate snp (send-only|validate)",
 1656:        "Configure the authentication password for an area\n"
 1657:        "Authentication type\n"
 1658:        "Area password\n"
 1659:        "Authentication\n"
 1660:        "SNP PDUs\n"
 1661:        "Send but do not check PDUs on receiving\n"
 1662:        "Send and check PDUs on receiving\n");
 1663: 
 1664: DEFUN (no_area_passwd,
 1665:        no_area_passwd_cmd,
 1666:        "no area-password",
 1667:        NO_STR
 1668:        "Configure the authentication password for an area\n")
 1669: {
 1670:   struct isis_area *area;
 1671: 
 1672:   area = vty->index;
 1673: 
 1674:   if (!area)
 1675:     {
 1676:       vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
 1677:       return CMD_ERR_NO_MATCH;
 1678:     }
 1679: 
 1680:   memset (&area->area_passwd, 0, sizeof (struct isis_passwd));
 1681:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 1682: 
 1683:   return CMD_SUCCESS;
 1684: }
 1685: 
 1686: DEFUN (domain_passwd_md5,
 1687:        domain_passwd_md5_cmd,
 1688:        "domain-password md5 WORD",
 1689:        "Set the authentication password for a routing domain\n"
 1690:        "Authentication type\n"
 1691:        "Routing domain password\n")
 1692: {
 1693:   struct isis_area *area;
 1694:   int len;
 1695: 
 1696:   area = vty->index;
 1697: 
 1698:   if (!area)
 1699:     {
 1700:       vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
 1701:       return CMD_ERR_NO_MATCH;
 1702:     }
 1703: 
 1704:   len = strlen (argv[0]);
 1705:   if (len > 254)
 1706:     {
 1707:       vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
 1708:       return CMD_ERR_AMBIGUOUS;
 1709:     }
 1710: 
 1711:   area->domain_passwd.len = (u_char) len;
 1712:   area->domain_passwd.type = ISIS_PASSWD_TYPE_HMAC_MD5;
 1713:   strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
 1714: 
 1715:   if (argc > 1)
 1716:     {
 1717:       SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
 1718:       if (strncmp(argv[1], "v", 1) == 0)
 1719: 	SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
 1720:       else
 1721: 	UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
 1722:     }
 1723:   else
 1724:     {
 1725:       UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
 1726:       UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
 1727:     }
 1728:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 1729: 
 1730:   return CMD_SUCCESS;
 1731: }
 1732: 
 1733: ALIAS (domain_passwd_md5,
 1734:        domain_passwd_md5_snpauth_cmd,
 1735:        "domain-password md5 WORD authenticate snp (send-only|validate)",
 1736:        "Set the authentication password for a routing domain\n"
 1737:        "Authentication type\n"
 1738:        "Routing domain password\n"
 1739:        "Authentication\n"
 1740:        "SNP PDUs\n"
 1741:        "Send but do not check PDUs on receiving\n"
 1742:        "Send and check PDUs on receiving\n");
 1743: 
 1744: DEFUN (domain_passwd_clear,
 1745:        domain_passwd_clear_cmd,
 1746:        "domain-password clear WORD",
 1747:        "Set the authentication password for a routing domain\n"
 1748:        "Authentication type\n"
 1749:        "Routing domain password\n")
 1750: {
 1751:   struct isis_area *area;
 1752:   int len;
 1753: 
 1754:   area = vty->index;
 1755: 
 1756:   if (!area)
 1757:     {
 1758:       vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
 1759:       return CMD_ERR_NO_MATCH;
 1760:     }
 1761: 
 1762:   len = strlen (argv[0]);
 1763:   if (len > 254)
 1764:     {
 1765:       vty_out (vty, "Too long area password (>254)%s", VTY_NEWLINE);
 1766:       return CMD_ERR_AMBIGUOUS;
 1767:     }
 1768: 
 1769:   area->domain_passwd.len = (u_char) len;
 1770:   area->domain_passwd.type = ISIS_PASSWD_TYPE_CLEARTXT;
 1771:   strncpy ((char *)area->domain_passwd.passwd, argv[0], 255);
 1772: 
 1773:   if (argc > 1)
 1774:     {
 1775:       SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
 1776:       if (strncmp(argv[1], "v", 1) == 0)
 1777: 	SET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
 1778:       else
 1779: 	UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
 1780:     }
 1781:   else
 1782:     {
 1783:       UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND);
 1784:       UNSET_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV);
 1785:     }
 1786:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 1787: 
 1788:   return CMD_SUCCESS;
 1789: }
 1790: 
 1791: ALIAS (domain_passwd_clear,
 1792:        domain_passwd_clear_snpauth_cmd,
 1793:        "domain-password clear WORD authenticate snp (send-only|validate)",
 1794:        "Set the authentication password for a routing domain\n"
 1795:        "Authentication type\n"
 1796:        "Routing domain password\n"
 1797:        "Authentication\n"
 1798:        "SNP PDUs\n"
 1799:        "Send but do not check PDUs on receiving\n"
 1800:        "Send and check PDUs on receiving\n");
 1801: 
 1802: DEFUN (no_domain_passwd,
 1803:        no_domain_passwd_cmd,
 1804:        "no domain-password",
 1805:        NO_STR
 1806:        "Set the authentication password for a routing domain\n")
 1807: {
 1808:   struct isis_area *area;
 1809: 
 1810:   area = vty->index;
 1811: 
 1812:   if (!area)
 1813:     {
 1814:       vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
 1815:       return CMD_ERR_NO_MATCH;
 1816:     }
 1817: 
 1818:   memset (&area->domain_passwd, 0, sizeof (struct isis_passwd));
 1819:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 1820: 
 1821:   return CMD_SUCCESS;
 1822: }
 1823: 
 1824: DEFUN (is_type,
 1825:        is_type_cmd,
 1826:        "is-type (level-1|level-1-2|level-2-only)",
 1827:        "IS Level for this routing process (OSI only)\n"
 1828:        "Act as a station router only\n"
 1829:        "Act as both a station router and an area router\n"
 1830:        "Act as an area router only\n")
 1831: {
 1832:   struct isis_area *area;
 1833:   int type;
 1834: 
 1835:   area = vty->index;
 1836: 
 1837:   if (!area)
 1838:     {
 1839:       vty_out (vty, "Can't find IS-IS instance%s", VTY_NEWLINE);
 1840:       return CMD_ERR_NO_MATCH;
 1841:     }
 1842: 
 1843:   type = string2circuit_t (argv[0]);
 1844:   if (!type)
 1845:     {
 1846:       vty_out (vty, "Unknown IS level %s", VTY_NEWLINE);
 1847:       return CMD_SUCCESS;
 1848:     }
 1849: 
 1850:   isis_event_system_type_change (area, type);
 1851: 
 1852:   return CMD_SUCCESS;
 1853: }
 1854: 
 1855: DEFUN (no_is_type,
 1856:        no_is_type_cmd,
 1857:        "no is-type (level-1|level-1-2|level-2-only)",
 1858:        NO_STR
 1859:        "IS Level for this routing process (OSI only)\n"
 1860:        "Act as a station router only\n"
 1861:        "Act as both a station router and an area router\n"
 1862:        "Act as an area router only\n")
 1863: {
 1864:   struct isis_area *area;
 1865:   int type;
 1866: 
 1867:   area = vty->index;
 1868:   assert (area);
 1869: 
 1870:   /*
 1871:    * Put the is-type back to defaults:
 1872:    * - level-1-2 on first area
 1873:    * - level-1 for the rest
 1874:    */
 1875:   if (listgetdata (listhead (isis->area_list)) == area)
 1876:     type = IS_LEVEL_1_AND_2;
 1877:   else
 1878:     type = IS_LEVEL_1;
 1879: 
 1880:   isis_event_system_type_change (area, type);
 1881: 
 1882:   return CMD_SUCCESS;
 1883: }
 1884: 
 1885: static int
 1886: set_lsp_gen_interval (struct vty *vty, struct isis_area *area,
 1887:                       uint16_t interval, int level)
 1888: {
 1889:   int lvl;
 1890: 
 1891:   for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
 1892:     {
 1893:       if (!(lvl & level))
 1894:         continue;
 1895: 
 1896:       if (interval >= area->lsp_refresh[lvl-1])
 1897:         {
 1898:           vty_out (vty, "LSP gen interval %us must be less than "
 1899:                    "the LSP refresh interval %us%s",
 1900:                    interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
 1901:           return CMD_ERR_AMBIGUOUS;
 1902:         }
 1903:     }
 1904: 
 1905:   for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
 1906:     {
 1907:       if (!(lvl & level))
 1908:         continue;
 1909:       area->lsp_gen_interval[lvl-1] = interval;
 1910:     }
 1911: 
 1912:   return CMD_SUCCESS;
 1913: }
 1914: 
 1915: DEFUN (lsp_gen_interval,
 1916:        lsp_gen_interval_cmd,
 1917:        "lsp-gen-interval <1-120>",
 1918:        "Minimum interval between regenerating same LSP\n"
 1919:        "Minimum interval in seconds\n")
 1920: {
 1921:   struct isis_area *area;
 1922:   uint16_t interval;
 1923:   int level;
 1924: 
 1925:   area = vty->index;
 1926:   interval = atoi (argv[0]);
 1927:   level = IS_LEVEL_1 | IS_LEVEL_2;
 1928:   return set_lsp_gen_interval (vty, area, interval, level);
 1929: }
 1930: 
 1931: DEFUN (no_lsp_gen_interval,
 1932:        no_lsp_gen_interval_cmd,
 1933:        "no lsp-gen-interval",
 1934:        NO_STR
 1935:        "Minimum interval between regenerating same LSP\n")
 1936: {
 1937:   struct isis_area *area;
 1938:   uint16_t interval;
 1939:   int level;
 1940: 
 1941:   area = vty->index;
 1942:   interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
 1943:   level = IS_LEVEL_1 | IS_LEVEL_2;
 1944:   return set_lsp_gen_interval (vty, area, interval, level);
 1945: }
 1946: 
 1947: ALIAS (no_lsp_gen_interval,
 1948:        no_lsp_gen_interval_arg_cmd,
 1949:        "no lsp-gen-interval <1-120>",
 1950:        NO_STR
 1951:        "Minimum interval between regenerating same LSP\n"
 1952:        "Minimum interval in seconds\n")
 1953: 
 1954: DEFUN (lsp_gen_interval_l1,
 1955:        lsp_gen_interval_l1_cmd,
 1956:        "lsp-gen-interval level-1 <1-120>",
 1957:        "Minimum interval between regenerating same LSP\n"
 1958:        "Set interval for level 1 only\n"
 1959:        "Minimum interval in seconds\n")
 1960: {
 1961:   struct isis_area *area;
 1962:   uint16_t interval;
 1963:   int level;
 1964: 
 1965:   area = vty->index;
 1966:   interval = atoi (argv[0]);
 1967:   level = IS_LEVEL_1;
 1968:   return set_lsp_gen_interval (vty, area, interval, level);
 1969: }
 1970: 
 1971: DEFUN (no_lsp_gen_interval_l1,
 1972:        no_lsp_gen_interval_l1_cmd,
 1973:        "no lsp-gen-interval level-1",
 1974:        NO_STR
 1975:        "Minimum interval between regenerating same LSP\n"
 1976:        "Set interval for level 1 only\n")
 1977: {
 1978:   struct isis_area *area;
 1979:   uint16_t interval;
 1980:   int level;
 1981: 
 1982:   area = vty->index;
 1983:   interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
 1984:   level = IS_LEVEL_1;
 1985:   return set_lsp_gen_interval (vty, area, interval, level);
 1986: }
 1987: 
 1988: ALIAS (no_lsp_gen_interval_l1,
 1989:        no_lsp_gen_interval_l1_arg_cmd,
 1990:        "no lsp-gen-interval level-1 <1-120>",
 1991:        NO_STR
 1992:        "Minimum interval between regenerating same LSP\n"
 1993:        "Set interval for level 1 only\n"
 1994:        "Minimum interval in seconds\n")
 1995: 
 1996: DEFUN (lsp_gen_interval_l2,
 1997:        lsp_gen_interval_l2_cmd,
 1998:        "lsp-gen-interval level-2 <1-120>",
 1999:        "Minimum interval between regenerating same LSP\n"
 2000:        "Set interval for level 2 only\n"
 2001:        "Minimum interval in seconds\n")
 2002: {
 2003:   struct isis_area *area;
 2004:   uint16_t interval;
 2005:   int level;
 2006: 
 2007:   area = vty->index;
 2008:   interval = atoi (argv[0]);
 2009:   level = IS_LEVEL_2;
 2010:   return set_lsp_gen_interval (vty, area, interval, level);
 2011: }
 2012: 
 2013: DEFUN (no_lsp_gen_interval_l2,
 2014:        no_lsp_gen_interval_l2_cmd,
 2015:        "no lsp-gen-interval level-2",
 2016:        NO_STR
 2017:        "Minimum interval between regenerating same LSP\n"
 2018:        "Set interval for level 2 only\n")
 2019: {
 2020:   struct isis_area *area;
 2021:   uint16_t interval;
 2022:   int level;
 2023: 
 2024:   area = vty->index;
 2025:   interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
 2026:   level = IS_LEVEL_2;
 2027:   return set_lsp_gen_interval (vty, area, interval, level);
 2028: }
 2029: 
 2030: ALIAS (no_lsp_gen_interval_l2,
 2031:        no_lsp_gen_interval_l2_arg_cmd,
 2032:        "no lsp-gen-interval level-2 <1-120>",
 2033:        NO_STR
 2034:        "Minimum interval between regenerating same LSP\n"
 2035:        "Set interval for level 2 only\n"
 2036:        "Minimum interval in seconds\n")
 2037: 
 2038: static int
 2039: validate_metric_style_narrow (struct vty *vty, struct isis_area *area)
 2040: {
 2041:   struct isis_circuit *circuit;
 2042:   struct listnode *node;
 2043:   
 2044:   if (! vty)
 2045:     return CMD_ERR_AMBIGUOUS;
 2046: 
 2047:   if (! area)
 2048:     {
 2049:       vty_out (vty, "ISIS area is invalid%s", VTY_NEWLINE);
 2050:       return CMD_ERR_AMBIGUOUS;
 2051:     }
 2052: 
 2053:   for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
 2054:     {
 2055:       if ((area->is_type & IS_LEVEL_1) &&
 2056:           (circuit->is_type & IS_LEVEL_1) &&
 2057:           (circuit->te_metric[0] > MAX_NARROW_LINK_METRIC))
 2058:         {
 2059:           vty_out (vty, "ISIS circuit %s metric is invalid%s",
 2060:                    circuit->interface->name, VTY_NEWLINE);
 2061:           return CMD_ERR_AMBIGUOUS;
 2062:         }
 2063:       if ((area->is_type & IS_LEVEL_2) &&
 2064:           (circuit->is_type & IS_LEVEL_2) &&
 2065:           (circuit->te_metric[1] > MAX_NARROW_LINK_METRIC))
 2066:         {
 2067:           vty_out (vty, "ISIS circuit %s metric is invalid%s",
 2068:                    circuit->interface->name, VTY_NEWLINE);
 2069:           return CMD_ERR_AMBIGUOUS;
 2070:         }
 2071:     }
 2072: 
 2073:   return CMD_SUCCESS;
 2074: }
 2075: 
 2076: DEFUN (metric_style,
 2077:        metric_style_cmd,
 2078:        "metric-style (narrow|transition|wide)",
 2079:        "Use old-style (ISO 10589) or new-style packet formats\n"
 2080:        "Use old style of TLVs with narrow metric\n"
 2081:        "Send and accept both styles of TLVs during transition\n"
 2082:        "Use new style of TLVs to carry wider metric\n")
 2083: {
 2084:   struct isis_area *area;
 2085:   int ret;
 2086: 
 2087:   area = vty->index;
 2088:   assert (area);
 2089: 
 2090:   if (strncmp (argv[0], "w", 1) == 0)
 2091:     {
 2092:       area->newmetric = 1;
 2093:       area->oldmetric = 0;
 2094:     }
 2095:   else
 2096:     {
 2097:       ret = validate_metric_style_narrow (vty, area);
 2098:       if (ret != CMD_SUCCESS)
 2099:         return ret;
 2100: 
 2101:       if (strncmp (argv[0], "t", 1) == 0)
 2102: 	{
 2103: 	  area->newmetric = 1;
 2104: 	  area->oldmetric = 1;
 2105: 	}
 2106:       else if (strncmp (argv[0], "n", 1) == 0)
 2107: 	{
 2108: 	  area->newmetric = 0;
 2109: 	  area->oldmetric = 1;
 2110: 	}
 2111:     }
 2112: 
 2113:   return CMD_SUCCESS;
 2114: }
 2115: 
 2116: DEFUN (no_metric_style,
 2117:        no_metric_style_cmd,
 2118:        "no metric-style",
 2119:        NO_STR
 2120:        "Use old-style (ISO 10589) or new-style packet formats\n")
 2121: {
 2122:   struct isis_area *area;
 2123:   int ret;
 2124: 
 2125:   area = vty->index;
 2126:   assert (area);
 2127: 
 2128:   ret = validate_metric_style_narrow (vty, area);
 2129:   if (ret != CMD_SUCCESS)
 2130:     return ret;
 2131: 
 2132:   /* Default is narrow metric. */
 2133:   area->newmetric = 0;
 2134:   area->oldmetric = 1;
 2135: 
 2136:   return CMD_SUCCESS;
 2137: }
 2138: 
 2139: DEFUN (set_overload_bit,
 2140:        set_overload_bit_cmd,
 2141:        "set-overload-bit",
 2142:        "Set overload bit to avoid any transit traffic\n"
 2143:        "Set overload bit\n")
 2144: {
 2145:   struct isis_area *area;
 2146: 
 2147:   area = vty->index;
 2148:   assert (area);
 2149: 
 2150:   area->overload_bit = LSPBIT_OL;
 2151:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 2152: 
 2153:   return CMD_SUCCESS;
 2154: }
 2155: 
 2156: DEFUN (no_set_overload_bit,
 2157:        no_set_overload_bit_cmd,
 2158:        "no set-overload-bit",
 2159:        "Reset overload bit to accept transit traffic\n"
 2160:        "Reset overload bit\n")
 2161: {
 2162:   struct isis_area *area;
 2163: 
 2164:   area = vty->index;
 2165:   assert (area);
 2166: 
 2167:   area->overload_bit = 0;
 2168:   lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 2169: 
 2170:   return CMD_SUCCESS;
 2171: }
 2172: 
 2173: DEFUN (dynamic_hostname,
 2174:        dynamic_hostname_cmd,
 2175:        "hostname dynamic",
 2176:        "Dynamic hostname for IS-IS\n"
 2177:        "Dynamic hostname\n")
 2178: {
 2179:   struct isis_area *area;
 2180: 
 2181:   area = vty->index;
 2182:   assert (area);
 2183: 
 2184:   if (!area->dynhostname)
 2185:    {
 2186:      area->dynhostname = 1;
 2187:      lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
 2188:    }
 2189: 
 2190:   return CMD_SUCCESS;
 2191: }
 2192: 
 2193: DEFUN (no_dynamic_hostname,
 2194:        no_dynamic_hostname_cmd,
 2195:        "no hostname dynamic",
 2196:        NO_STR
 2197:        "Dynamic hostname for IS-IS\n"
 2198:        "Dynamic hostname\n")
 2199: {
 2200:   struct isis_area *area;
 2201: 
 2202:   area = vty->index;
 2203:   assert (area);
 2204: 
 2205:   if (area->dynhostname)
 2206:     {
 2207:       area->dynhostname = 0;
 2208:       lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 0);
 2209:     }
 2210: 
 2211:   return CMD_SUCCESS;
 2212: }
 2213: 
 2214: DEFUN (spf_interval,
 2215:        spf_interval_cmd,
 2216:        "spf-interval <1-120>",
 2217:        "Minimum interval between SPF calculations\n"
 2218:        "Minimum interval between consecutive SPFs in seconds\n")
 2219: {
 2220:   struct isis_area *area;
 2221:   u_int16_t interval;
 2222: 
 2223:   area = vty->index;
 2224:   interval = atoi (argv[0]);
 2225:   area->min_spf_interval[0] = interval;
 2226:   area->min_spf_interval[1] = interval;
 2227: 
 2228:   return CMD_SUCCESS;
 2229: }
 2230: 
 2231: DEFUN (no_spf_interval,
 2232:        no_spf_interval_cmd,
 2233:        "no spf-interval",
 2234:        NO_STR
 2235:        "Minimum interval between SPF calculations\n")
 2236: {
 2237:   struct isis_area *area;
 2238: 
 2239:   area = vty->index;
 2240: 
 2241:   area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
 2242:   area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
 2243: 
 2244:   return CMD_SUCCESS;
 2245: }
 2246: 
 2247: ALIAS (no_spf_interval,
 2248:        no_spf_interval_arg_cmd,
 2249:        "no spf-interval <1-120>",
 2250:        NO_STR
 2251:        "Minimum interval between SPF calculations\n"
 2252:        "Minimum interval between consecutive SPFs in seconds\n")
 2253: 
 2254: DEFUN (spf_interval_l1,
 2255:        spf_interval_l1_cmd,
 2256:        "spf-interval level-1 <1-120>",
 2257:        "Minimum interval between SPF calculations\n"
 2258:        "Set interval for level 1 only\n"
 2259:        "Minimum interval between consecutive SPFs in seconds\n")
 2260: {
 2261:   struct isis_area *area;
 2262:   u_int16_t interval;
 2263: 
 2264:   area = vty->index;
 2265:   interval = atoi (argv[0]);
 2266:   area->min_spf_interval[0] = interval;
 2267: 
 2268:   return CMD_SUCCESS;
 2269: }
 2270: 
 2271: DEFUN (no_spf_interval_l1,
 2272:        no_spf_interval_l1_cmd,
 2273:        "no spf-interval level-1",
 2274:        NO_STR
 2275:        "Minimum interval between SPF calculations\n"
 2276:        "Set interval for level 1 only\n")
 2277: {
 2278:   struct isis_area *area;
 2279: 
 2280:   area = vty->index;
 2281: 
 2282:   area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
 2283: 
 2284:   return CMD_SUCCESS;
 2285: }
 2286: 
 2287: ALIAS (no_spf_interval,
 2288:        no_spf_interval_l1_arg_cmd,
 2289:        "no spf-interval level-1 <1-120>",
 2290:        NO_STR
 2291:        "Minimum interval between SPF calculations\n"
 2292:        "Set interval for level 1 only\n"
 2293:        "Minimum interval between consecutive SPFs in seconds\n")
 2294: 
 2295: DEFUN (spf_interval_l2,
 2296:        spf_interval_l2_cmd,
 2297:        "spf-interval level-2 <1-120>",
 2298:        "Minimum interval between SPF calculations\n"
 2299:        "Set interval for level 2 only\n"
 2300:        "Minimum interval between consecutive SPFs in seconds\n")
 2301: {
 2302:   struct isis_area *area;
 2303:   u_int16_t interval;
 2304: 
 2305:   area = vty->index;
 2306:   interval = atoi (argv[0]);
 2307:   area->min_spf_interval[1] = interval;
 2308: 
 2309:   return CMD_SUCCESS;
 2310: }
 2311: 
 2312: DEFUN (no_spf_interval_l2,
 2313:        no_spf_interval_l2_cmd,
 2314:        "no spf-interval level-2",
 2315:        NO_STR
 2316:        "Minimum interval between SPF calculations\n"
 2317:        "Set interval for level 2 only\n")
 2318: {
 2319:   struct isis_area *area;
 2320: 
 2321:   area = vty->index;
 2322: 
 2323:   area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
 2324: 
 2325:   return CMD_SUCCESS;
 2326: }
 2327: 
 2328: ALIAS (no_spf_interval,
 2329:        no_spf_interval_l2_arg_cmd,
 2330:        "no spf-interval level-2 <1-120>",
 2331:        NO_STR
 2332:        "Minimum interval between SPF calculations\n"
 2333:        "Set interval for level 2 only\n"
 2334:        "Minimum interval between consecutive SPFs in seconds\n")
 2335: 
 2336: static int
 2337: set_lsp_max_lifetime (struct vty *vty, struct isis_area *area,
 2338:                       uint16_t interval, int level)
 2339: {
 2340:   int lvl;
 2341:   int set_refresh_interval[ISIS_LEVELS] = {0, 0};
 2342:   uint16_t refresh_interval;
 2343: 
 2344:   refresh_interval = interval - 300;
 2345: 
 2346:   for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
 2347:     {
 2348:       if (!(lvl & level))
 2349:         continue;
 2350:       if (refresh_interval < area->lsp_refresh[lvl-1])
 2351:         {
 2352:           vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
 2353:                    "the configured LSP refresh interval %us%s",
 2354:                    lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
 2355:           vty_out (vty, "Automatically reducing level %d LSP refresh interval "
 2356:                    "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
 2357:           set_refresh_interval[lvl-1] = 1;
 2358: 
 2359:           if (refresh_interval <= area->lsp_gen_interval[lvl-1])
 2360:             {
 2361:               vty_out (vty, "LSP refresh interval %us must be greater than "
 2362:                        "the configured LSP gen interval %us%s",
 2363:                        refresh_interval, area->lsp_gen_interval[lvl-1],
 2364:                        VTY_NEWLINE);
 2365:               return CMD_ERR_AMBIGUOUS;
 2366:             }
 2367:         }
 2368:     }
 2369: 
 2370:   for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
 2371:     {
 2372:       if (!(lvl & level))
 2373:         continue;
 2374:       area->max_lsp_lifetime[lvl-1] = interval;
 2375:       /* Automatically reducing lsp_refresh_interval to interval - 300 */
 2376:       if (set_refresh_interval[lvl-1])
 2377:         area->lsp_refresh[lvl-1] = refresh_interval;
 2378:     }
 2379: 
 2380:   lsp_regenerate_schedule (area, level, 1);
 2381: 
 2382:   return CMD_SUCCESS;
 2383: }
 2384: 
 2385: DEFUN (max_lsp_lifetime,
 2386:        max_lsp_lifetime_cmd,
 2387:        "max-lsp-lifetime <350-65535>",
 2388:        "Maximum LSP lifetime\n"
 2389:        "LSP lifetime in seconds\n")
 2390: {
 2391:   struct isis_area *area;
 2392:   uint16_t interval;
 2393:   int level;
 2394: 
 2395:   area = vty->index;
 2396:   interval = atoi (argv[0]);
 2397:   level = IS_LEVEL_1 | IS_LEVEL_2;
 2398:   return set_lsp_max_lifetime (vty, area, interval, level);
 2399: }
 2400: 
 2401: DEFUN (no_max_lsp_lifetime,
 2402:        no_max_lsp_lifetime_cmd,
 2403:        "no max-lsp-lifetime",
 2404:        NO_STR
 2405:        "LSP lifetime in seconds\n")
 2406: {
 2407:   struct isis_area *area;
 2408:   uint16_t interval;
 2409:   int level;
 2410: 
 2411:   area = vty->index;
 2412:   interval = DEFAULT_LSP_LIFETIME;
 2413:   level = IS_LEVEL_1 | IS_LEVEL_2;
 2414:   return set_lsp_max_lifetime (vty, area, interval, level);
 2415: }
 2416: 
 2417: ALIAS (no_max_lsp_lifetime,
 2418:        no_max_lsp_lifetime_arg_cmd,
 2419:        "no max-lsp-lifetime <350-65535>",
 2420:        NO_STR
 2421:        "Maximum LSP lifetime\n"
 2422:        "LSP lifetime in seconds\n")
 2423: 
 2424: DEFUN (max_lsp_lifetime_l1,
 2425:        max_lsp_lifetime_l1_cmd,
 2426:        "max-lsp-lifetime level-1 <350-65535>",
 2427:        "Maximum LSP lifetime for Level 1 only\n"
 2428:        "LSP lifetime for Level 1 only in seconds\n")
 2429: {
 2430:   struct isis_area *area;
 2431:   uint16_t interval;
 2432:   int level;
 2433: 
 2434:   area = vty->index;
 2435:   interval = atoi (argv[0]);
 2436:   level = IS_LEVEL_1;
 2437:   return set_lsp_max_lifetime (vty, area, interval, level);
 2438: }
 2439: 
 2440: DEFUN (no_max_lsp_lifetime_l1,
 2441:        no_max_lsp_lifetime_l1_cmd,
 2442:        "no max-lsp-lifetime level-1",
 2443:        NO_STR
 2444:        "LSP lifetime for Level 1 only in seconds\n")
 2445: {
 2446:   struct isis_area *area;
 2447:   uint16_t interval;
 2448:   int level;
 2449: 
 2450:   area = vty->index;
 2451:   interval = DEFAULT_LSP_LIFETIME;
 2452:   level = IS_LEVEL_1;
 2453:   return set_lsp_max_lifetime (vty, area, interval, level);
 2454: }
 2455: 
 2456: ALIAS (no_max_lsp_lifetime_l1,
 2457:        no_max_lsp_lifetime_l1_arg_cmd,
 2458:        "no max-lsp-lifetime level-1 <350-65535>",
 2459:        NO_STR
 2460:        "Maximum LSP lifetime for Level 1 only\n"
 2461:        "LSP lifetime for Level 1 only in seconds\n")
 2462: 
 2463: DEFUN (max_lsp_lifetime_l2,
 2464:        max_lsp_lifetime_l2_cmd,
 2465:        "max-lsp-lifetime level-2 <350-65535>",
 2466:        "Maximum LSP lifetime for Level 2 only\n"
 2467:        "LSP lifetime for Level 2 only in seconds\n")
 2468: {
 2469:   struct isis_area *area;
 2470:   uint16_t interval;
 2471:   int level;
 2472: 
 2473:   area = vty->index;
 2474:   interval = atoi (argv[0]);
 2475:   level = IS_LEVEL_2;
 2476:   return set_lsp_max_lifetime (vty, area, interval, level);
 2477: }
 2478: 
 2479: DEFUN (no_max_lsp_lifetime_l2,
 2480:        no_max_lsp_lifetime_l2_cmd,
 2481:        "no max-lsp-lifetime level-2",
 2482:        NO_STR
 2483:        "LSP lifetime for Level 2 only in seconds\n")
 2484: {
 2485:   struct isis_area *area;
 2486:   uint16_t interval;
 2487:   int level;
 2488: 
 2489:   area = vty->index;
 2490:   interval = DEFAULT_LSP_LIFETIME;
 2491:   level = IS_LEVEL_2;
 2492:   return set_lsp_max_lifetime (vty, area, interval, level);
 2493: }
 2494: 
 2495: ALIAS (no_max_lsp_lifetime_l2,
 2496:        no_max_lsp_lifetime_l2_arg_cmd,
 2497:        "no max-lsp-lifetime level-2 <350-65535>",
 2498:        NO_STR
 2499:        "Maximum LSP lifetime for Level 2 only\n"
 2500:        "LSP lifetime for Level 2 only in seconds\n")
 2501: 
 2502: static int
 2503: set_lsp_refresh_interval (struct vty *vty, struct isis_area *area,
 2504:                           uint16_t interval, int level)
 2505: {
 2506:   int lvl;
 2507: 
 2508:   for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
 2509:     {
 2510:       if (!(lvl & level))
 2511:         continue;
 2512:       if (interval <= area->lsp_gen_interval[lvl-1])
 2513:         {
 2514:           vty_out (vty, "LSP refresh interval %us must be greater than "
 2515:                    "the configured LSP gen interval %us%s",
 2516:                    interval, area->lsp_gen_interval[lvl-1],
 2517:                    VTY_NEWLINE);
 2518:           return CMD_ERR_AMBIGUOUS;
 2519:         }
 2520:       if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
 2521:         {
 2522:           vty_out (vty, "LSP refresh interval %us must be less than "
 2523:                    "the configured LSP lifetime %us less 300%s",
 2524:                    interval, area->max_lsp_lifetime[lvl-1],
 2525:                    VTY_NEWLINE);
 2526:           return CMD_ERR_AMBIGUOUS;
 2527:         }
 2528:     }
 2529: 
 2530:   for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
 2531:     {
 2532:       if (!(lvl & level))
 2533:         continue;
 2534:       area->lsp_refresh[lvl-1] = interval;
 2535:     }
 2536:   lsp_regenerate_schedule (area, level, 1);
 2537: 
 2538:   return CMD_SUCCESS;
 2539: }
 2540: 
 2541: DEFUN (lsp_refresh_interval,
 2542:        lsp_refresh_interval_cmd,
 2543:        "lsp-refresh-interval <1-65235>",
 2544:        "LSP refresh interval\n"
 2545:        "LSP refresh interval in seconds\n")
 2546: {
 2547:   struct isis_area *area;
 2548:   uint16_t interval;
 2549:   int level;
 2550: 
 2551:   area = vty->index;
 2552:   interval = atoi (argv[0]);
 2553:   level = IS_LEVEL_1 | IS_LEVEL_2;
 2554:   return set_lsp_refresh_interval (vty, area, interval, level);
 2555: }
 2556: 
 2557: DEFUN (no_lsp_refresh_interval,
 2558:        no_lsp_refresh_interval_cmd,
 2559:        "no lsp-refresh-interval",
 2560:        NO_STR
 2561:        "LSP refresh interval in seconds\n")
 2562: {
 2563:   struct isis_area *area;
 2564:   uint16_t interval;
 2565:   int level;
 2566: 
 2567:   area = vty->index;
 2568:   interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
 2569:   level = IS_LEVEL_1 | IS_LEVEL_2;
 2570:   return set_lsp_refresh_interval (vty, area, interval, level);
 2571: }
 2572: 
 2573: ALIAS (no_lsp_refresh_interval,
 2574:        no_lsp_refresh_interval_arg_cmd,
 2575:        "no lsp-refresh-interval <1-65235>",
 2576:        NO_STR
 2577:        "LSP refresh interval\n"
 2578:        "LSP refresh interval in seconds\n")
 2579: 
 2580: DEFUN (lsp_refresh_interval_l1,
 2581:        lsp_refresh_interval_l1_cmd,
 2582:        "lsp-refresh-interval level-1 <1-65235>",
 2583:        "LSP refresh interval for Level 1 only\n"
 2584:        "LSP refresh interval for Level 1 only in seconds\n")
 2585: {
 2586:   struct isis_area *area;
 2587:   uint16_t interval;
 2588:   int level;
 2589: 
 2590:   area = vty->index;
 2591:   interval = atoi (argv[0]);
 2592:   level = IS_LEVEL_1;
 2593:   return set_lsp_refresh_interval (vty, area, interval, level);
 2594: }
 2595: 
 2596: DEFUN (no_lsp_refresh_interval_l1,
 2597:        no_lsp_refresh_interval_l1_cmd,
 2598:        "no lsp-refresh-interval level-1",
 2599:        NO_STR
 2600:        "LSP refresh interval for Level 1 only in seconds\n")
 2601: {
 2602:   struct isis_area *area;
 2603:   uint16_t interval;
 2604:   int level;
 2605: 
 2606:   area = vty->index;
 2607:   interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
 2608:   level = IS_LEVEL_1;
 2609:   return set_lsp_refresh_interval (vty, area, interval, level);
 2610: }
 2611: 
 2612: ALIAS (no_lsp_refresh_interval_l1,
 2613:        no_lsp_refresh_interval_l1_arg_cmd,
 2614:        "no lsp-refresh-interval level-1 <1-65235>",
 2615:        NO_STR
 2616:        "LSP refresh interval for Level 1 only\n"
 2617:        "LSP refresh interval for Level 1 only in seconds\n")
 2618: 
 2619: DEFUN (lsp_refresh_interval_l2,
 2620:        lsp_refresh_interval_l2_cmd,
 2621:        "lsp-refresh-interval level-2 <1-65235>",
 2622:        "LSP refresh interval for Level 2 only\n"
 2623:        "LSP refresh interval for Level 2 only in seconds\n")
 2624: {
 2625:   struct isis_area *area;
 2626:   uint16_t interval;
 2627:   int level;
 2628: 
 2629:   area = vty->index;
 2630:   interval = atoi (argv[0]);
 2631:   level = IS_LEVEL_2;
 2632:   return set_lsp_refresh_interval (vty, area, interval, level);
 2633: }
 2634: 
 2635: DEFUN (no_lsp_refresh_interval_l2,
 2636:        no_lsp_refresh_interval_l2_cmd,
 2637:        "no lsp-refresh-interval level-2",
 2638:        NO_STR
 2639:        "LSP refresh interval for Level 2 only in seconds\n")
 2640: {
 2641:   struct isis_area *area;
 2642:   uint16_t interval;
 2643:   int level;
 2644: 
 2645:   area = vty->index;
 2646:   interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
 2647:   level = IS_LEVEL_2;
 2648:   return set_lsp_refresh_interval (vty, area, interval, level);
 2649: }
 2650: 
 2651: ALIAS (no_lsp_refresh_interval_l2,
 2652:        no_lsp_refresh_interval_l2_arg_cmd,
 2653:        "no lsp-refresh-interval level-2 <1-65235>",
 2654:        NO_STR
 2655:        "LSP refresh interval for Level 2 only\n"
 2656:        "LSP refresh interval for Level 2 only in seconds\n")
 2657: 
 2658: DEFUN (log_adj_changes,
 2659:        log_adj_changes_cmd,
 2660:        "log-adjacency-changes",
 2661:        "Log changes in adjacency state\n")
 2662: {
 2663:   struct isis_area *area;
 2664: 
 2665:   area = vty->index;
 2666:   assert (area);
 2667: 
 2668:   area->log_adj_changes = 1;
 2669: 
 2670:   return CMD_SUCCESS;
 2671: }
 2672: 
 2673: DEFUN (no_log_adj_changes,
 2674:        no_log_adj_changes_cmd,
 2675:        "no log-adjacency-changes",
 2676:        "Stop logging changes in adjacency state\n")
 2677: {
 2678:   struct isis_area *area;
 2679: 
 2680:   area = vty->index;
 2681:   assert (area);
 2682: 
 2683:   area->log_adj_changes = 0;
 2684: 
 2685:   return CMD_SUCCESS;
 2686: }
 2687: 
 2688: #ifdef TOPOLOGY_GENERATE
 2689: 
 2690: DEFUN (topology_generate_grid,
 2691:        topology_generate_grid_cmd,
 2692:        "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "
 2693:        "[param]",
 2694:        "Topology generation for IS-IS\n"
 2695:        "Topology generation\n"
 2696:        "Grid topology\n"
 2697:        "X parameter of the grid\n"
 2698:        "Y parameter of the grid\n"
 2699:        "Random seed\n"
 2700:        "Optional param 1\n"
 2701:        "Optional param 2\n"
 2702:        "Optional param 3\n"
 2703:        "Topology\n")
 2704: {
 2705:   struct isis_area *area;
 2706: 
 2707:   area = vty->index;
 2708:   assert (area);
 2709: 
 2710:   if (!spgrid_check_params (vty, argc, argv))
 2711:     {
 2712:       if (area->topology)
 2713: 	list_delete (area->topology);
 2714:       area->topology = list_new ();
 2715:       memcpy (area->top_params, vty->buf, 200);
 2716:       gen_spgrid_topology (vty, area->topology);
 2717:       remove_topology_lsps (area);
 2718:       generate_topology_lsps (area);
 2719:       /* Regenerate L1 LSP to get two way connection to the generated
 2720:        * topology. */
 2721:       lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1);
 2722:     }
 2723: 
 2724:   return CMD_SUCCESS;
 2725: }
 2726: 
 2727: DEFUN (show_isis_generated_topology,
 2728:        show_isis_generated_topology_cmd,
 2729:        "show isis generated-topologies",
 2730:        SHOW_STR
 2731:        "ISIS network information\n"
 2732:        "Show generated topologies\n")
 2733: {
 2734:   struct isis_area *area;
 2735:   struct listnode *node;
 2736:   struct listnode *node2;
 2737:   struct arc *arc;
 2738: 
 2739:   for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
 2740:     {
 2741:       if (!area->topology)
 2742: 	continue;
 2743: 
 2744:       vty_out (vty, "Topology for isis area: %s%s", area->area_tag,
 2745: 	       VTY_NEWLINE);
 2746:       vty_out (vty, "From node     To node     Distance%s", VTY_NEWLINE);
 2747: 
 2748:       for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc))
 2749: 	vty_out (vty, "%9ld %11ld %12ld%s", arc->from_node, arc->to_node,
 2750: 		 arc->distance, VTY_NEWLINE);
 2751:     }
 2752:   return CMD_SUCCESS;
 2753: }
 2754: 
 2755: /* Base IS for topology generation. */
 2756: DEFUN (topology_baseis,
 2757:        topology_baseis_cmd,
 2758:        "topology base-is WORD",
 2759:        "Topology generation for IS-IS\n"
 2760:        "A Network IS Base for this topology\n"
 2761:        "XXXX.XXXX.XXXX Network entity title (NET)\n")
 2762: {
 2763:   struct isis_area *area;
 2764:   u_char buff[ISIS_SYS_ID_LEN];
 2765: 
 2766:   area = vty->index;
 2767:   assert (area);
 2768: 
 2769:   if (sysid2buff (buff, argv[0]))
 2770:     sysid2buff (area->topology_baseis, argv[0]);
 2771: 
 2772:   return CMD_SUCCESS;
 2773: }
 2774: 
 2775: DEFUN (no_topology_baseis,
 2776:        no_topology_baseis_cmd,
 2777:        "no topology base-is WORD",
 2778:        NO_STR
 2779:        "Topology generation for IS-IS\n"
 2780:        "A Network IS Base for this topology\n"
 2781:        "XXXX.XXXX.XXXX Network entity title (NET)\n")
 2782: {
 2783:   struct isis_area *area;
 2784: 
 2785:   area = vty->index;
 2786:   assert (area);
 2787: 
 2788:   memcpy (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS, ISIS_SYS_ID_LEN);
 2789:   return CMD_SUCCESS;
 2790: }
 2791: 
 2792: ALIAS (no_topology_baseis,
 2793:        no_topology_baseis_noid_cmd,
 2794:        "no topology base-is",
 2795:        NO_STR
 2796:        "Topology generation for IS-IS\n"
 2797:        "A Network IS Base for this topology\n")
 2798: 
 2799: DEFUN (topology_basedynh,
 2800:        topology_basedynh_cmd,
 2801:        "topology base-dynh WORD",
 2802:        "Topology generation for IS-IS\n"
 2803:        "Dynamic hostname base for this topology\n"
 2804:        "Dynamic hostname base\n")
 2805: {
 2806:   struct isis_area *area;
 2807: 
 2808:   area = vty->index;
 2809:   assert (area);
 2810: 
 2811:   /* I hope that it's enough. */
 2812:   area->topology_basedynh = strndup (argv[0], 16); 
 2813:   return CMD_SUCCESS;
 2814: }
 2815: 
 2816: #endif /* TOPOLOGY_GENERATE */
 2817: 
 2818: /* IS-IS configuration write function */
 2819: int
 2820: isis_config_write (struct vty *vty)
 2821: {
 2822:   int write = 0;
 2823: 
 2824:   if (isis != NULL)
 2825:     {
 2826:       struct isis_area *area;
 2827:       struct listnode *node, *node2;
 2828: 
 2829:       for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area))
 2830:       {
 2831: 	/* ISIS - Area name */
 2832: 	vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE);
 2833: 	write++;
 2834: 	/* ISIS - Net */
 2835: 	if (listcount (area->area_addrs) > 0)
 2836: 	  {
 2837: 	    struct area_addr *area_addr;
 2838: 	    for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr))
 2839: 	      {
 2840: 		vty_out (vty, " net %s%s",
 2841: 			 isonet_print (area_addr->area_addr,
 2842: 				       area_addr->addr_len + ISIS_SYS_ID_LEN +
 2843: 				       1), VTY_NEWLINE);
 2844: 		write++;
 2845: 	      }
 2846: 	  }
 2847: 	/* ISIS - Dynamic hostname - Defaults to true so only display if
 2848: 	 * false. */
 2849: 	if (!area->dynhostname)
 2850: 	  {
 2851: 	    vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE);
 2852: 	    write++;
 2853: 	  }
 2854: 	/* ISIS - Metric-Style - when true displays wide */
 2855: 	if (area->newmetric)
 2856: 	  {
 2857: 	    if (!area->oldmetric)
 2858: 	      vty_out (vty, " metric-style wide%s", VTY_NEWLINE);
 2859: 	    else
 2860: 	      vty_out (vty, " metric-style transition%s", VTY_NEWLINE);
 2861: 	    write++;
 2862: 	  }
 2863: 	else
 2864: 	  {
 2865: 	    vty_out (vty, " metric-style narrow%s", VTY_NEWLINE);
 2866: 	    write++;
 2867: 	  }
 2868: 	/* ISIS - overload-bit */
 2869: 	if (area->overload_bit)
 2870: 	  {
 2871: 	    vty_out (vty, " set-overload-bit%s", VTY_NEWLINE);
 2872: 	    write++;
 2873: 	  }
 2874: 	/* ISIS - Area is-type (level-1-2 is default) */
 2875: 	if (area->is_type == IS_LEVEL_1)
 2876: 	  {
 2877: 	    vty_out (vty, " is-type level-1%s", VTY_NEWLINE);
 2878: 	    write++;
 2879: 	  }
 2880: 	else if (area->is_type == IS_LEVEL_2)
 2881: 	  {
 2882: 	    vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE);
 2883: 	    write++;
 2884: 	  }
 2885: 	/* ISIS - Lsp generation interval */
 2886: 	if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1])
 2887: 	  {
 2888: 	    if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
 2889: 	      {
 2890: 		vty_out (vty, " lsp-gen-interval %d%s",
 2891: 			 area->lsp_gen_interval[0], VTY_NEWLINE);
 2892: 		write++;
 2893: 	      }
 2894: 	  }
 2895: 	else
 2896: 	  {
 2897: 	    if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL)
 2898: 	      {
 2899: 		vty_out (vty, " lsp-gen-interval level-1 %d%s",
 2900: 			 area->lsp_gen_interval[0], VTY_NEWLINE);
 2901: 		write++;
 2902: 	      }
 2903: 	    if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL)
 2904: 	      {
 2905: 		vty_out (vty, " lsp-gen-interval level-2 %d%s",
 2906: 			 area->lsp_gen_interval[1], VTY_NEWLINE);
 2907: 		write++;
 2908: 	      }
 2909: 	  }
 2910: 	/* ISIS - LSP lifetime */
 2911: 	if (area->max_lsp_lifetime[0] == area->max_lsp_lifetime[1])
 2912: 	  {
 2913: 	    if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
 2914: 	      {
 2915: 		vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0],
 2916: 			 VTY_NEWLINE);
 2917: 		write++;
 2918: 	      }
 2919: 	  }
 2920: 	else
 2921: 	  {
 2922: 	    if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME)
 2923: 	      {
 2924: 		vty_out (vty, " max-lsp-lifetime level-1 %u%s",
 2925: 			 area->max_lsp_lifetime[0], VTY_NEWLINE);
 2926: 		write++;
 2927: 	      }
 2928: 	    if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME)
 2929: 	      {
 2930: 		vty_out (vty, " max-lsp-lifetime level-2 %u%s",
 2931: 			 area->max_lsp_lifetime[1], VTY_NEWLINE);
 2932: 		write++;
 2933: 	      }
 2934: 	  }
 2935: 	/* ISIS - LSP refresh interval */
 2936: 	if (area->lsp_refresh[0] == area->lsp_refresh[1])
 2937: 	  {
 2938: 	    if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
 2939: 	      {
 2940: 		vty_out (vty, " lsp-refresh-interval %u%s", area->lsp_refresh[0],
 2941: 			 VTY_NEWLINE);
 2942: 		write++;
 2943: 	      }
 2944: 	  }
 2945: 	else
 2946: 	  {
 2947: 	    if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL)
 2948: 	      {
 2949: 		vty_out (vty, " lsp-refresh-interval level-1 %u%s",
 2950: 			 area->lsp_refresh[0], VTY_NEWLINE);
 2951: 		write++;
 2952: 	      }
 2953: 	    if (area->lsp_refresh[1] != DEFAULT_MAX_LSP_GEN_INTERVAL)
 2954: 	      {
 2955: 		vty_out (vty, " lsp-refresh-interval level-2 %u%s",
 2956: 			 area->lsp_refresh[1], VTY_NEWLINE);
 2957: 		write++;
 2958: 	      }
 2959: 	  }
 2960: 	/* Minimum SPF interval. */
 2961: 	if (area->min_spf_interval[0] == area->min_spf_interval[1])
 2962: 	  {
 2963: 	    if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
 2964: 	      {
 2965: 		vty_out (vty, " spf-interval %d%s",
 2966: 			 area->min_spf_interval[0], VTY_NEWLINE);
 2967: 		write++;
 2968: 	      }
 2969: 	  }
 2970: 	else
 2971: 	  {
 2972: 	    if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL)
 2973: 	      {
 2974: 		vty_out (vty, " spf-interval level-1 %d%s",
 2975: 			 area->min_spf_interval[0], VTY_NEWLINE);
 2976: 		write++;
 2977: 	      }
 2978: 	    if (area->min_spf_interval[1] != MINIMUM_SPF_INTERVAL)
 2979: 	      {
 2980: 		vty_out (vty, " spf-interval level-2 %d%s",
 2981: 			 area->min_spf_interval[1], VTY_NEWLINE);
 2982: 		write++;
 2983: 	      }
 2984: 	  }
 2985: 	/* Authentication passwords. */
 2986: 	if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
 2987: 	  {
 2988: 	    vty_out(vty, " area-password md5 %s", area->area_passwd.passwd);
 2989: 	    if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
 2990: 	      {
 2991: 		vty_out(vty, " authenticate snp ");
 2992: 		if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
 2993: 		  vty_out(vty, "validate");
 2994: 		else
 2995: 		  vty_out(vty, "send-only");
 2996: 	      }
 2997: 	    vty_out(vty, "%s", VTY_NEWLINE);
 2998: 	    write++; 
 2999: 	  }
 3000:         else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
 3001:           {
 3002: 	    vty_out(vty, " area-password clear %s", area->area_passwd.passwd);
 3003: 	    if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND))
 3004: 	      {
 3005: 		vty_out(vty, " authenticate snp ");
 3006: 		if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV))
 3007: 		  vty_out(vty, "validate");
 3008: 		else
 3009: 		  vty_out(vty, "send-only");
 3010: 	      }
 3011: 	    vty_out(vty, "%s", VTY_NEWLINE);
 3012: 	    write++; 
 3013:           }
 3014: 	if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5)
 3015: 	  {
 3016:             vty_out(vty, " domain-password md5 %s",
 3017:                     area->domain_passwd.passwd);
 3018: 	    if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
 3019: 	      {
 3020: 		vty_out(vty, " authenticate snp ");
 3021: 		if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
 3022: 		  vty_out(vty, "validate");
 3023: 		else
 3024: 		  vty_out(vty, "send-only");
 3025: 	      }
 3026: 	    vty_out(vty, "%s", VTY_NEWLINE);
 3027: 	    write++;
 3028: 	  }
 3029:         else if (area->domain_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT)
 3030: 	  {
 3031: 	    vty_out(vty, " domain-password clear %s",
 3032:                     area->domain_passwd.passwd); 
 3033: 	    if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND))
 3034: 	      {
 3035: 		vty_out(vty, " authenticate snp ");
 3036: 		if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV))
 3037: 		  vty_out(vty, "validate");
 3038: 		else
 3039: 		  vty_out(vty, "send-only");
 3040: 	      }
 3041: 	    vty_out(vty, "%s", VTY_NEWLINE);
 3042: 	    write++;
 3043: 	  }
 3044: 
 3045: 	if (area->log_adj_changes)
 3046: 	  {
 3047: 	    vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE);
 3048: 	    write++;
 3049: 	  }
 3050: 
 3051: #ifdef TOPOLOGY_GENERATE
 3052: 	if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,
 3053: 		    ISIS_SYS_ID_LEN))
 3054: 	  {
 3055: 	    vty_out (vty, " topology base-is %s%s",
 3056: 		     sysid_print ((u_char *)area->topology_baseis), VTY_NEWLINE);
 3057: 	    write++;
 3058: 	  }
 3059: 	if (area->topology_basedynh)
 3060: 	  {
 3061: 	    vty_out (vty, " topology base-dynh %s%s",
 3062: 		     area->topology_basedynh, VTY_NEWLINE);
 3063: 	    write++;
 3064: 	  }
 3065: 	/* We save the whole command line here. */
 3066: 	if (strlen(area->top_params))
 3067: 	  {
 3068: 	    vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE);
 3069: 	    write++;
 3070: 	  }
 3071: #endif /* TOPOLOGY_GENERATE */
 3072: 
 3073:       }
 3074:     }
 3075: 
 3076:   return write;
 3077: }
 3078: 
 3079: struct cmd_node isis_node = {
 3080:   ISIS_NODE,
 3081:   "%s(config-router)# ",
 3082:   1
 3083: };
 3084: 
 3085: void
 3086: isis_init ()
 3087: {
 3088:   /* Install IS-IS top node */
 3089:   install_node (&isis_node, isis_config_write);
 3090: 
 3091:   install_element (VIEW_NODE, &show_isis_summary_cmd);
 3092: 
 3093:   install_element (VIEW_NODE, &show_isis_interface_cmd);
 3094:   install_element (VIEW_NODE, &show_isis_interface_detail_cmd);
 3095:   install_element (VIEW_NODE, &show_isis_interface_arg_cmd);
 3096: 
 3097:   install_element (VIEW_NODE, &show_isis_neighbor_cmd);
 3098:   install_element (VIEW_NODE, &show_isis_neighbor_detail_cmd);
 3099:   install_element (VIEW_NODE, &show_isis_neighbor_arg_cmd);
 3100:   install_element (VIEW_NODE, &clear_isis_neighbor_cmd);
 3101:   install_element (VIEW_NODE, &clear_isis_neighbor_arg_cmd);
 3102: 
 3103:   install_element (VIEW_NODE, &show_hostname_cmd);
 3104:   install_element (VIEW_NODE, &show_database_cmd);
 3105:   install_element (VIEW_NODE, &show_database_arg_cmd);
 3106:   install_element (VIEW_NODE, &show_database_arg_detail_cmd);
 3107:   install_element (VIEW_NODE, &show_database_detail_cmd);
 3108:   install_element (VIEW_NODE, &show_database_detail_arg_cmd);
 3109: 
 3110:   install_element (ENABLE_NODE, &show_isis_summary_cmd);
 3111: 
 3112:   install_element (ENABLE_NODE, &show_isis_interface_cmd);
 3113:   install_element (ENABLE_NODE, &show_isis_interface_detail_cmd);
 3114:   install_element (ENABLE_NODE, &show_isis_interface_arg_cmd);
 3115: 
 3116:   install_element (ENABLE_NODE, &show_isis_neighbor_cmd);
 3117:   install_element (ENABLE_NODE, &show_isis_neighbor_detail_cmd);
 3118:   install_element (ENABLE_NODE, &show_isis_neighbor_arg_cmd);
 3119:   install_element (ENABLE_NODE, &clear_isis_neighbor_cmd);
 3120:   install_element (ENABLE_NODE, &clear_isis_neighbor_arg_cmd);
 3121: 
 3122:   install_element (ENABLE_NODE, &show_hostname_cmd);
 3123:   install_element (ENABLE_NODE, &show_database_cmd);
 3124:   install_element (ENABLE_NODE, &show_database_arg_cmd);
 3125:   install_element (ENABLE_NODE, &show_database_arg_detail_cmd);
 3126:   install_element (ENABLE_NODE, &show_database_detail_cmd);
 3127:   install_element (ENABLE_NODE, &show_database_detail_arg_cmd);
 3128:   install_element (ENABLE_NODE, &show_debugging_cmd);
 3129: 
 3130:   install_node (&debug_node, config_write_debug);
 3131: 
 3132:   install_element (ENABLE_NODE, &debug_isis_adj_cmd);
 3133:   install_element (ENABLE_NODE, &no_debug_isis_adj_cmd);
 3134:   install_element (ENABLE_NODE, &debug_isis_csum_cmd);
 3135:   install_element (ENABLE_NODE, &no_debug_isis_csum_cmd);
 3136:   install_element (ENABLE_NODE, &debug_isis_lupd_cmd);
 3137:   install_element (ENABLE_NODE, &no_debug_isis_lupd_cmd);
 3138:   install_element (ENABLE_NODE, &debug_isis_err_cmd);
 3139:   install_element (ENABLE_NODE, &no_debug_isis_err_cmd);
 3140:   install_element (ENABLE_NODE, &debug_isis_snp_cmd);
 3141:   install_element (ENABLE_NODE, &no_debug_isis_snp_cmd);
 3142:   install_element (ENABLE_NODE, &debug_isis_upd_cmd);
 3143:   install_element (ENABLE_NODE, &no_debug_isis_upd_cmd);
 3144:   install_element (ENABLE_NODE, &debug_isis_spfevents_cmd);
 3145:   install_element (ENABLE_NODE, &no_debug_isis_spfevents_cmd);
 3146:   install_element (ENABLE_NODE, &debug_isis_spfstats_cmd);
 3147:   install_element (ENABLE_NODE, &no_debug_isis_spfstats_cmd);
 3148:   install_element (ENABLE_NODE, &debug_isis_spftrigg_cmd);
 3149:   install_element (ENABLE_NODE, &no_debug_isis_spftrigg_cmd);
 3150:   install_element (ENABLE_NODE, &debug_isis_rtevents_cmd);
 3151:   install_element (ENABLE_NODE, &no_debug_isis_rtevents_cmd);
 3152:   install_element (ENABLE_NODE, &debug_isis_events_cmd);
 3153:   install_element (ENABLE_NODE, &no_debug_isis_events_cmd);
 3154:   install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd);
 3155:   install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd);
 3156: 
 3157:   install_element (CONFIG_NODE, &debug_isis_adj_cmd);
 3158:   install_element (CONFIG_NODE, &no_debug_isis_adj_cmd);
 3159:   install_element (CONFIG_NODE, &debug_isis_csum_cmd);
 3160:   install_element (CONFIG_NODE, &no_debug_isis_csum_cmd);
 3161:   install_element (CONFIG_NODE, &debug_isis_lupd_cmd);
 3162:   install_element (CONFIG_NODE, &no_debug_isis_lupd_cmd);
 3163:   install_element (CONFIG_NODE, &debug_isis_err_cmd);
 3164:   install_element (CONFIG_NODE, &no_debug_isis_err_cmd);
 3165:   install_element (CONFIG_NODE, &debug_isis_snp_cmd);
 3166:   install_element (CONFIG_NODE, &no_debug_isis_snp_cmd);
 3167:   install_element (CONFIG_NODE, &debug_isis_upd_cmd);
 3168:   install_element (CONFIG_NODE, &no_debug_isis_upd_cmd);
 3169:   install_element (CONFIG_NODE, &debug_isis_spfevents_cmd);
 3170:   install_element (CONFIG_NODE, &no_debug_isis_spfevents_cmd);
 3171:   install_element (CONFIG_NODE, &debug_isis_spfstats_cmd);
 3172:   install_element (CONFIG_NODE, &no_debug_isis_spfstats_cmd);
 3173:   install_element (CONFIG_NODE, &debug_isis_spftrigg_cmd);
 3174:   install_element (CONFIG_NODE, &no_debug_isis_spftrigg_cmd);
 3175:   install_element (CONFIG_NODE, &debug_isis_rtevents_cmd);
 3176:   install_element (CONFIG_NODE, &no_debug_isis_rtevents_cmd);
 3177:   install_element (CONFIG_NODE, &debug_isis_events_cmd);
 3178:   install_element (CONFIG_NODE, &no_debug_isis_events_cmd);
 3179:   install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd);
 3180:   install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd);
 3181: 
 3182:   install_element (CONFIG_NODE, &router_isis_cmd);
 3183:   install_element (CONFIG_NODE, &no_router_isis_cmd);
 3184: 
 3185:   install_default (ISIS_NODE);
 3186: 
 3187:   install_element (ISIS_NODE, &net_cmd);
 3188:   install_element (ISIS_NODE, &no_net_cmd);
 3189: 
 3190:   install_element (ISIS_NODE, &is_type_cmd);
 3191:   install_element (ISIS_NODE, &no_is_type_cmd);
 3192: 
 3193:   install_element (ISIS_NODE, &area_passwd_md5_cmd);
 3194:   install_element (ISIS_NODE, &area_passwd_md5_snpauth_cmd);
 3195:   install_element (ISIS_NODE, &area_passwd_clear_cmd);
 3196:   install_element (ISIS_NODE, &area_passwd_clear_snpauth_cmd);
 3197:   install_element (ISIS_NODE, &no_area_passwd_cmd);
 3198: 
 3199:   install_element (ISIS_NODE, &domain_passwd_md5_cmd);
 3200:   install_element (ISIS_NODE, &domain_passwd_md5_snpauth_cmd);
 3201:   install_element (ISIS_NODE, &domain_passwd_clear_cmd);
 3202:   install_element (ISIS_NODE, &domain_passwd_clear_snpauth_cmd);
 3203:   install_element (ISIS_NODE, &no_domain_passwd_cmd);
 3204: 
 3205:   install_element (ISIS_NODE, &lsp_gen_interval_cmd);
 3206:   install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
 3207:   install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
 3208:   install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
 3209:   install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
 3210:   install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
 3211:   install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
 3212:   install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
 3213:   install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
 3214: 
 3215:   install_element (ISIS_NODE, &spf_interval_cmd);
 3216:   install_element (ISIS_NODE, &no_spf_interval_cmd);
 3217:   install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
 3218:   install_element (ISIS_NODE, &spf_interval_l1_cmd);
 3219:   install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
 3220:   install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
 3221:   install_element (ISIS_NODE, &spf_interval_l2_cmd);
 3222:   install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
 3223:   install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
 3224: 
 3225:   install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
 3226:   install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
 3227:   install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
 3228:   install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
 3229:   install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
 3230:   install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
 3231:   install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
 3232:   install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
 3233:   install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
 3234: 
 3235:   install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
 3236:   install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
 3237:   install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
 3238:   install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
 3239:   install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
 3240:   install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
 3241:   install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
 3242:   install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
 3243:   install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
 3244: 
 3245:   install_element (ISIS_NODE, &set_overload_bit_cmd);
 3246:   install_element (ISIS_NODE, &no_set_overload_bit_cmd);
 3247: 
 3248:   install_element (ISIS_NODE, &dynamic_hostname_cmd);
 3249:   install_element (ISIS_NODE, &no_dynamic_hostname_cmd);
 3250: 
 3251:   install_element (ISIS_NODE, &metric_style_cmd);
 3252:   install_element (ISIS_NODE, &no_metric_style_cmd);
 3253: 
 3254:   install_element (ISIS_NODE, &log_adj_changes_cmd);
 3255:   install_element (ISIS_NODE, &no_log_adj_changes_cmd);
 3256: 
 3257: #ifdef TOPOLOGY_GENERATE
 3258:   install_element (ISIS_NODE, &topology_generate_grid_cmd);
 3259:   install_element (ISIS_NODE, &topology_baseis_cmd);
 3260:   install_element (ISIS_NODE, &topology_basedynh_cmd);
 3261:   install_element (ISIS_NODE, &no_topology_baseis_cmd);
 3262:   install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);
 3263:   install_element (VIEW_NODE, &show_isis_generated_topology_cmd);
 3264:   install_element (ENABLE_NODE, &show_isis_generated_topology_cmd);
 3265: #endif /* TOPOLOGY_GENERATE */
 3266: }

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