diff options
Diffstat (limited to 'isisd/isisd.c')
| -rw-r--r-- | isisd/isisd.c | 3183 | 
1 files changed, 1578 insertions, 1605 deletions
diff --git a/isisd/isisd.c b/isisd/isisd.c index f226c4a1f3..0ae97fee87 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -2,21 +2,21 @@   * IS-IS Rout(e)ing protocol - isisd.c   *   * Copyright (C) 2001,2002   Sampo Saaristo - *                           Tampere University of Technology       + *                           Tampere University of Technology   *                           Institute of Communications Engineering   * - * This program is free software; you can redistribute it and/or modify it  - * under the terms of the GNU General Public Licenseas published by the Free  - * Software Foundation; either version 2 of the License, or (at your option)  + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public Licenseas published by the Free + * Software Foundation; either version 2 of the License, or (at your option)   * any later version.   * - * This program is distributed in the hope that it will be useful,but WITHOUT  - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  + * This program is distributed in the hope that it will be useful,but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for   * more details. - * You should have received a copy of the GNU General Public License along  - * with this program; if not, write to the Free Software Foundation, Inc.,  + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc.,   * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.   */ @@ -75,414 +75,387 @@ int clear_isis_neighbor_common(struct vty *, const char *id);  int isis_config_write(struct vty *); +void isis_new(unsigned long process_id) +{ +	isis = XCALLOC(MTYPE_ISIS, sizeof(struct isis)); +	/* +	 * Default values +	 */ +	isis->max_area_addrs = 3; +	isis->process_id = process_id; +	isis->router_id = 0; +	isis->area_list = list_new(); +	isis->init_circ_list = list_new(); +	isis->uptime = time(NULL); +	isis->nexthops = list_new(); +	isis->nexthops6 = list_new(); +	dyn_cache_init(); +	/* +	 * uncomment the next line for full debugs +	 */ +	/* isis->debugs = 0xFFFF; */ +	isisMplsTE.status = disable; /* Only support TE metric */ +	QOBJ_REG(isis, isis); +} + +struct isis_area *isis_area_create(const char *area_tag) +{ +	struct isis_area *area; + +	area = XCALLOC(MTYPE_ISIS_AREA, sizeof(struct isis_area)); + +	/* +	 * The first instance is level-1-2 rest are level-1, unless otherwise +	 * configured +	 */ +	if (listcount(isis->area_list) > 0) +		area->is_type = IS_LEVEL_1; +	else +		area->is_type = IS_LEVEL_1_AND_2; + +	/* +	 * intialize the databases +	 */ +	if (area->is_type & IS_LEVEL_1) { +		area->lspdb[0] = lsp_db_init(); +		area->route_table[0] = route_table_init(); +		area->route_table6[0] = route_table_init(); +	} +	if (area->is_type & IS_LEVEL_2) { +		area->lspdb[1] = lsp_db_init(); +		area->route_table[1] = route_table_init(); +		area->route_table6[1] = route_table_init(); +	} + +	spftree_area_init(area); + +	area->circuit_list = list_new(); +	area->area_addrs = list_new(); +	THREAD_TIMER_ON(master, area->t_tick, lsp_tick, area, 1); +	flags_initialize(&area->flags); + +	/* +	 * Default values +	 */ +	area->max_lsp_lifetime[0] = DEFAULT_LSP_LIFETIME;    /* 1200 */ +	area->max_lsp_lifetime[1] = DEFAULT_LSP_LIFETIME;    /* 1200 */ +	area->lsp_refresh[0] = DEFAULT_MAX_LSP_GEN_INTERVAL; /* 900 */ +	area->lsp_refresh[1] = DEFAULT_MAX_LSP_GEN_INTERVAL; /* 900 */ +	area->lsp_gen_interval[0] = DEFAULT_MIN_LSP_GEN_INTERVAL; +	area->lsp_gen_interval[1] = DEFAULT_MIN_LSP_GEN_INTERVAL; +	area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL; +	area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL; +	area->dynhostname = 1; +	area->oldmetric = 0; +	area->newmetric = 1; +	area->lsp_frag_threshold = 90; +	area->lsp_mtu = DEFAULT_LSP_MTU; + +	area->area_tag = strdup(area_tag); +	listnode_add(isis->area_list, area); +	area->isis = isis; + +	QOBJ_REG(area, isis_area); + +	return area; +} + +struct isis_area *isis_area_lookup(const char *area_tag) +{ +	struct isis_area *area; +	struct listnode *node; + +	for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) +		if ((area->area_tag == NULL && area_tag == NULL) +		    || (area->area_tag && area_tag +			&& strcmp(area->area_tag, area_tag) == 0)) +			return area; -void -isis_new (unsigned long process_id) -{ -  isis = XCALLOC (MTYPE_ISIS, sizeof (struct isis)); -  /* -   * Default values -   */ -  isis->max_area_addrs = 3; -  isis->process_id = process_id; -  isis->router_id = 0; -  isis->area_list = list_new (); -  isis->init_circ_list = list_new (); -  isis->uptime = time (NULL); -  isis->nexthops = list_new (); -  isis->nexthops6 = list_new (); -  dyn_cache_init (); -  /* -   * uncomment the next line for full debugs -   */ -  /* isis->debugs = 0xFFFF; */ -  isisMplsTE.status = disable;            /* Only support TE metric */ -  QOBJ_REG (isis, isis); -} - -struct isis_area * -isis_area_create (const char *area_tag) +	return NULL; +} + +int isis_area_get(struct vty *vty, const char *area_tag)  { -  struct isis_area *area; - -  area = XCALLOC (MTYPE_ISIS_AREA, sizeof (struct isis_area)); +	struct isis_area *area; -  /* -   * The first instance is level-1-2 rest are level-1, unless otherwise -   * configured -   */ -  if (listcount (isis->area_list) > 0) -    area->is_type = IS_LEVEL_1; -  else -    area->is_type = IS_LEVEL_1_AND_2; +	area = isis_area_lookup(area_tag); + +	if (area) { +		VTY_PUSH_CONTEXT(ISIS_NODE, area); +		return CMD_SUCCESS; +	} -  /* -   * intialize the databases -   */ -  if (area->is_type & IS_LEVEL_1) -    { -      area->lspdb[0] = lsp_db_init (); -      area->route_table[0] = route_table_init (); -      area->route_table6[0] = route_table_init (); -    } -  if (area->is_type & IS_LEVEL_2) -    { -      area->lspdb[1] = lsp_db_init (); -      area->route_table[1] = route_table_init (); -      area->route_table6[1] = route_table_init (); -    } - -  spftree_area_init (area); - -  area->circuit_list = list_new (); -  area->area_addrs = list_new (); -  THREAD_TIMER_ON (master, area->t_tick, lsp_tick, area, 1); -  flags_initialize (&area->flags); - -  /* -   * Default values -   */ -  area->max_lsp_lifetime[0] = DEFAULT_LSP_LIFETIME;	/* 1200 */ -  area->max_lsp_lifetime[1] = DEFAULT_LSP_LIFETIME;	/* 1200 */ -  area->lsp_refresh[0] = DEFAULT_MAX_LSP_GEN_INTERVAL;	/* 900 */ -  area->lsp_refresh[1] = DEFAULT_MAX_LSP_GEN_INTERVAL;	/* 900 */ -  area->lsp_gen_interval[0] = DEFAULT_MIN_LSP_GEN_INTERVAL; -  area->lsp_gen_interval[1] = DEFAULT_MIN_LSP_GEN_INTERVAL; -  area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL; -  area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL; -  area->dynhostname = 1; -  area->oldmetric = 0; -  area->newmetric = 1; -  area->lsp_frag_threshold = 90; -  area->lsp_mtu = DEFAULT_LSP_MTU; - -  area->area_tag = strdup (area_tag); -  listnode_add (isis->area_list, area); -  area->isis = isis; - -  QOBJ_REG (area, isis_area); - -  return area; -} - -struct isis_area * -isis_area_lookup (const char *area_tag) -{ -  struct isis_area *area; -  struct listnode *node; - -  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area)) -    if ((area->area_tag == NULL && area_tag == NULL) || -	(area->area_tag && area_tag -	 && strcmp (area->area_tag, area_tag) == 0)) -    return area; - -  return NULL; -} - -int -isis_area_get (struct vty *vty, const char *area_tag) -{ -  struct isis_area *area; - -  area = isis_area_lookup (area_tag); - -  if (area) -    { -      VTY_PUSH_CONTEXT (ISIS_NODE, area); -      return CMD_SUCCESS; -    } - -  area = isis_area_create (area_tag); - -  if (isis->debugs & DEBUG_EVENTS) -    zlog_debug ("New IS-IS area instance %s", area->area_tag); - -  VTY_PUSH_CONTEXT (ISIS_NODE, area); - -  return CMD_SUCCESS; -} - -int -isis_area_destroy (struct vty *vty, const char *area_tag) -{ -  struct isis_area *area; -  struct listnode *node, *nnode; -  struct isis_circuit *circuit; -  struct area_addr *addr; - -  area = isis_area_lookup (area_tag); - -  if (area == NULL) -    { -      vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE); -      return CMD_ERR_NO_MATCH; -    } - -  QOBJ_UNREG (area); - -  if (area->circuit_list) -    { -      for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit)) -        { -          circuit->ip_router = 0; -          circuit->ipv6_router = 0; -          isis_csm_state_change (ISIS_DISABLE, circuit, area); -        } -      list_delete (area->circuit_list); -      area->circuit_list = NULL; -    } - -  if (area->lspdb[0] != NULL) -    { -      lsp_db_destroy (area->lspdb[0]); -      area->lspdb[0] = NULL; -    } -  if (area->lspdb[1] != NULL) -    { -      lsp_db_destroy (area->lspdb[1]); -      area->lspdb[1] = NULL; -    } - -  spftree_area_del (area); +	area = isis_area_create(area_tag); -  THREAD_TIMER_OFF(area->spf_timer[0]); -  THREAD_TIMER_OFF(area->spf_timer[1]); +	if (isis->debugs & DEBUG_EVENTS) +		zlog_debug("New IS-IS area instance %s", area->area_tag); + +	VTY_PUSH_CONTEXT(ISIS_NODE, area); + +	return CMD_SUCCESS; +} -  spf_backoff_free(area->spf_delay_ietf[0]); -  spf_backoff_free(area->spf_delay_ietf[1]); +int isis_area_destroy(struct vty *vty, const char *area_tag) +{ +	struct isis_area *area; +	struct listnode *node, *nnode; +	struct isis_circuit *circuit; +	struct area_addr *addr; + +	area = isis_area_lookup(area_tag); + +	if (area == NULL) { +		vty_out(vty, "Can't find ISIS instance %s", VTY_NEWLINE); +		return CMD_ERR_NO_MATCH; +	} + +	QOBJ_UNREG(area); + +	if (area->circuit_list) { +		for (ALL_LIST_ELEMENTS(area->circuit_list, node, nnode, +				       circuit)) { +			circuit->ip_router = 0; +			circuit->ipv6_router = 0; +			isis_csm_state_change(ISIS_DISABLE, circuit, area); +		} +		list_delete(area->circuit_list); +		area->circuit_list = NULL; +	} -  /* invalidate and validate would delete all routes from zebra */ -  isis_route_invalidate (area); -  isis_route_validate (area); +	if (area->lspdb[0] != NULL) { +		lsp_db_destroy(area->lspdb[0]); +		area->lspdb[0] = NULL; +	} +	if (area->lspdb[1] != NULL) { +		lsp_db_destroy(area->lspdb[1]); +		area->lspdb[1] = NULL; +	} + +	spftree_area_del(area); + +	THREAD_TIMER_OFF(area->spf_timer[0]); +	THREAD_TIMER_OFF(area->spf_timer[1]); + +	spf_backoff_free(area->spf_delay_ietf[0]); +	spf_backoff_free(area->spf_delay_ietf[1]); + +	/* invalidate and validate would delete all routes from zebra */ +	isis_route_invalidate(area); +	isis_route_validate(area); + +	if (area->route_table[0]) { +		route_table_finish(area->route_table[0]); +		area->route_table[0] = NULL; +	} +	if (area->route_table[1]) { +		route_table_finish(area->route_table[1]); +		area->route_table[1] = NULL; +	} +	if (area->route_table6[0]) { +		route_table_finish(area->route_table6[0]); +		area->route_table6[0] = NULL; +	} +	if (area->route_table6[1]) { +		route_table_finish(area->route_table6[1]); +		area->route_table6[1] = NULL; +	} + +	isis_redist_area_finish(area); + +	for (ALL_LIST_ELEMENTS(area->area_addrs, node, nnode, addr)) { +		list_delete_node(area->area_addrs, node); +		XFREE(MTYPE_ISIS_AREA_ADDR, addr); +	} +	area->area_addrs = NULL; + +	THREAD_TIMER_OFF(area->t_tick); +	THREAD_TIMER_OFF(area->t_lsp_refresh[0]); +	THREAD_TIMER_OFF(area->t_lsp_refresh[1]); + +	thread_cancel_event(master, area); + +	listnode_delete(isis->area_list, area); + +	free(area->area_tag); + +	XFREE(MTYPE_ISIS_AREA, area); + +	if (listcount(isis->area_list) == 0) { +		memset(isis->sysid, 0, ISIS_SYS_ID_LEN); +		isis->sysid_set = 0; +	} + +	return CMD_SUCCESS; +} + +int area_net_title(struct vty *vty, const char *net_title) +{ +	VTY_DECLVAR_CONTEXT(isis_area, area); +	struct area_addr *addr; +	struct area_addr *addrp; +	struct listnode *node; -  if (area->route_table[0]) -    { -      route_table_finish (area->route_table[0]); -      area->route_table[0] = NULL; -    } -  if (area->route_table[1]) -    { -      route_table_finish (area->route_table[1]); -      area->route_table[1] = NULL; -    } -  if (area->route_table6[0]) -    { -      route_table_finish (area->route_table6[0]); -      area->route_table6[0] = NULL; -    } -  if (area->route_table6[1]) -    { -      route_table_finish (area->route_table6[1]); -      area->route_table6[1] = NULL; -    } +	u_char buff[255]; -  isis_redist_area_finish(area); +	/* We check that we are not over the maximal number of addresses */ +	if (listcount(area->area_addrs) >= isis->max_area_addrs) { +		vty_out(vty, +			"Maximum of area addresses (%d) already reached %s", +			isis->max_area_addrs, VTY_NEWLINE); +		return CMD_ERR_NOTHING_TODO; +	} -  for (ALL_LIST_ELEMENTS (area->area_addrs, node, nnode, addr)) -    { -      list_delete_node (area->area_addrs, node); -      XFREE (MTYPE_ISIS_AREA_ADDR, addr); -    } -  area->area_addrs = NULL; - -  THREAD_TIMER_OFF (area->t_tick); -  THREAD_TIMER_OFF (area->t_lsp_refresh[0]); -  THREAD_TIMER_OFF (area->t_lsp_refresh[1]); - -  thread_cancel_event (master, area); - -  listnode_delete (isis->area_list, area); - -  free (area->area_tag); - -  XFREE (MTYPE_ISIS_AREA, area); - -  if (listcount (isis->area_list) == 0) -    { -      memset (isis->sysid, 0, ISIS_SYS_ID_LEN); -      isis->sysid_set = 0; -    } - -  return CMD_SUCCESS; -} - -int -area_net_title (struct vty *vty, const char *net_title) -{ -  VTY_DECLVAR_CONTEXT (isis_area, area); -  struct area_addr *addr; -  struct area_addr *addrp; -  struct listnode *node; - -  u_char buff[255]; - -  /* We check that we are not over the maximal number of addresses */ -  if (listcount (area->area_addrs) >= isis->max_area_addrs) -    { -      vty_out (vty, "Maximum of area addresses (%d) already reached %s", -	       isis->max_area_addrs, VTY_NEWLINE); -      return CMD_ERR_NOTHING_TODO; -    } - -  addr = XMALLOC (MTYPE_ISIS_AREA_ADDR, sizeof (struct area_addr)); -  addr->addr_len = dotformat2buff (buff, net_title); -  memcpy (addr->area_addr, buff, addr->addr_len); +	addr = XMALLOC(MTYPE_ISIS_AREA_ADDR, sizeof(struct area_addr)); +	addr->addr_len = dotformat2buff(buff, net_title); +	memcpy(addr->area_addr, buff, addr->addr_len);  #ifdef EXTREME_DEBUG -  zlog_debug ("added area address %s for area %s (address length %d)", -	     net_title, area->area_tag, addr->addr_len); +	zlog_debug("added area address %s for area %s (address length %d)", +		   net_title, area->area_tag, addr->addr_len);  #endif /* EXTREME_DEBUG */ -  if (addr->addr_len < 8 || addr->addr_len > 20) -    { -      vty_out (vty, "area address must be at least 8..20 octets long (%d)%s", -               addr->addr_len, VTY_NEWLINE); -      XFREE (MTYPE_ISIS_AREA_ADDR, addr); -      return CMD_ERR_AMBIGUOUS; -    } - -  if (addr->area_addr[addr->addr_len-1] != 0) -    { -      vty_out (vty, "nsel byte (last byte) in area address must be 0%s", -               VTY_NEWLINE); -      XFREE (MTYPE_ISIS_AREA_ADDR, addr); -      return CMD_ERR_AMBIGUOUS; -    } - -  if (isis->sysid_set == 0) -    { -      /* -       * First area address - get the SystemID for this router -       */ -      memcpy (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN); -      isis->sysid_set = 1; -      if (isis->debugs & DEBUG_EVENTS) -	zlog_debug ("Router has SystemID %s", sysid_print (isis->sysid)); -    } -  else -    { -      /* -       * Check that the SystemID portions match -       */ -      if (memcmp (isis->sysid, GETSYSID (addr), ISIS_SYS_ID_LEN)) -	{ -	  vty_out (vty, -		   "System ID must not change when defining additional area" -		   " addresses%s", VTY_NEWLINE); -	  XFREE (MTYPE_ISIS_AREA_ADDR, addr); -	  return CMD_ERR_AMBIGUOUS; -	} - -      /* now we see that we don't already have this address */ -      for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp)) -	{ -	  if ((addrp->addr_len + ISIS_SYS_ID_LEN + ISIS_NSEL_LEN) != (addr->addr_len)) -	    continue; -	  if (!memcmp (addrp->area_addr, addr->area_addr, addr->addr_len)) -	    { -	      XFREE (MTYPE_ISIS_AREA_ADDR, addr); -	      return CMD_SUCCESS;	/* silent fail */ -	    } -	} -    } - -  /* -   * Forget the systemID part of the address -   */ -  addr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN); -  listnode_add (area->area_addrs, addr); - -  /* only now we can safely generate our LSPs for this area */ -  if (listcount (area->area_addrs) > 0) -    { -      if (area->is_type & IS_LEVEL_1) -        lsp_generate (area, IS_LEVEL_1); -      if (area->is_type & IS_LEVEL_2) -        lsp_generate (area, IS_LEVEL_2); -    } - -  return CMD_SUCCESS; -} - -int -area_clear_net_title (struct vty *vty, const char *net_title) -{ -  VTY_DECLVAR_CONTEXT (isis_area, area); -  struct area_addr addr, *addrp = NULL; -  struct listnode *node; -  u_char buff[255]; - -  addr.addr_len = dotformat2buff (buff, net_title); -  if (addr.addr_len < 8 || addr.addr_len > 20) -    { -      vty_out (vty, "Unsupported area address length %d, should be 8...20 %s", -	       addr.addr_len, VTY_NEWLINE); -      return CMD_ERR_AMBIGUOUS; -    } - -  memcpy (addr.area_addr, buff, (int) addr.addr_len); - -  for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node, addrp)) -    if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len && -	!memcmp (addrp->area_addr, addr.area_addr, addr.addr_len)) -    break; - -  if (!addrp) -    { -      vty_out (vty, "No area address %s for area %s %s", net_title, -	       area->area_tag, VTY_NEWLINE); -      return CMD_ERR_NO_MATCH; -    } - -  listnode_delete (area->area_addrs, addrp); -  XFREE (MTYPE_ISIS_AREA_ADDR, addrp); - -  /* -   * Last area address - reset the SystemID for this router -   */ -  if (listcount (area->area_addrs) == 0) -    { -      memset (isis->sysid, 0, ISIS_SYS_ID_LEN); -      isis->sysid_set = 0; -      if (isis->debugs & DEBUG_EVENTS) -        zlog_debug ("Router has no SystemID"); -    } - -  return CMD_SUCCESS; +	if (addr->addr_len < 8 || addr->addr_len > 20) { +		vty_out(vty, +			"area address must be at least 8..20 octets long (%d)%s", +			addr->addr_len, VTY_NEWLINE); +		XFREE(MTYPE_ISIS_AREA_ADDR, addr); +		return CMD_ERR_AMBIGUOUS; +	} + +	if (addr->area_addr[addr->addr_len - 1] != 0) { +		vty_out(vty, +			"nsel byte (last byte) in area address must be 0%s", +			VTY_NEWLINE); +		XFREE(MTYPE_ISIS_AREA_ADDR, addr); +		return CMD_ERR_AMBIGUOUS; +	} + +	if (isis->sysid_set == 0) { +		/* +		 * First area address - get the SystemID for this router +		 */ +		memcpy(isis->sysid, GETSYSID(addr), ISIS_SYS_ID_LEN); +		isis->sysid_set = 1; +		if (isis->debugs & DEBUG_EVENTS) +			zlog_debug("Router has SystemID %s", +				   sysid_print(isis->sysid)); +	} else { +		/* +		 * Check that the SystemID portions match +		 */ +		if (memcmp(isis->sysid, GETSYSID(addr), ISIS_SYS_ID_LEN)) { +			vty_out(vty, +				"System ID must not change when defining additional area" +				" addresses%s", +				VTY_NEWLINE); +			XFREE(MTYPE_ISIS_AREA_ADDR, addr); +			return CMD_ERR_AMBIGUOUS; +		} + +		/* now we see that we don't already have this address */ +		for (ALL_LIST_ELEMENTS_RO(area->area_addrs, node, addrp)) { +			if ((addrp->addr_len + ISIS_SYS_ID_LEN + ISIS_NSEL_LEN) +			    != (addr->addr_len)) +				continue; +			if (!memcmp(addrp->area_addr, addr->area_addr, +				    addr->addr_len)) { +				XFREE(MTYPE_ISIS_AREA_ADDR, addr); +				return CMD_SUCCESS; /* silent fail */ +			} +		} +	} + +	/* +	 * Forget the systemID part of the address +	 */ +	addr->addr_len -= (ISIS_SYS_ID_LEN + ISIS_NSEL_LEN); +	listnode_add(area->area_addrs, addr); + +	/* only now we can safely generate our LSPs for this area */ +	if (listcount(area->area_addrs) > 0) { +		if (area->is_type & IS_LEVEL_1) +			lsp_generate(area, IS_LEVEL_1); +		if (area->is_type & IS_LEVEL_2) +			lsp_generate(area, IS_LEVEL_2); +	} + +	return CMD_SUCCESS; +} + +int area_clear_net_title(struct vty *vty, const char *net_title) +{ +	VTY_DECLVAR_CONTEXT(isis_area, area); +	struct area_addr addr, *addrp = NULL; +	struct listnode *node; +	u_char buff[255]; + +	addr.addr_len = dotformat2buff(buff, net_title); +	if (addr.addr_len < 8 || addr.addr_len > 20) { +		vty_out(vty, +			"Unsupported area address length %d, should be 8...20 %s", +			addr.addr_len, VTY_NEWLINE); +		return CMD_ERR_AMBIGUOUS; +	} + +	memcpy(addr.area_addr, buff, (int)addr.addr_len); + +	for (ALL_LIST_ELEMENTS_RO(area->area_addrs, node, addrp)) +		if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len +		    && !memcmp(addrp->area_addr, addr.area_addr, addr.addr_len)) +			break; + +	if (!addrp) { +		vty_out(vty, "No area address %s for area %s %s", net_title, +			area->area_tag, VTY_NEWLINE); +		return CMD_ERR_NO_MATCH; +	} + +	listnode_delete(area->area_addrs, addrp); +	XFREE(MTYPE_ISIS_AREA_ADDR, addrp); + +	/* +	 * Last area address - reset the SystemID for this router +	 */ +	if (listcount(area->area_addrs) == 0) { +		memset(isis->sysid, 0, ISIS_SYS_ID_LEN); +		isis->sysid_set = 0; +		if (isis->debugs & DEBUG_EVENTS) +			zlog_debug("Router has no SystemID"); +	} + +	return CMD_SUCCESS;  }  /*   * 'show isis interface' command   */ -int -show_isis_interface_common (struct vty *vty, const char *ifname, char detail) +int show_isis_interface_common(struct vty *vty, const char *ifname, char detail)  { -  struct listnode *anode, *cnode; -  struct isis_area *area; -  struct isis_circuit *circuit; +	struct listnode *anode, *cnode; +	struct isis_area *area; +	struct isis_circuit *circuit; -  if (!isis) -    { -      vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE); -      return CMD_SUCCESS; -    } +	if (!isis) { +		vty_out(vty, "IS-IS Routing Process not enabled%s", +			VTY_NEWLINE); +		return CMD_SUCCESS; +	} -  for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area)) -    { -      vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE); +	for (ALL_LIST_ELEMENTS_RO(isis->area_list, anode, area)) { +		vty_out(vty, "Area %s:%s", area->area_tag, VTY_NEWLINE); -      if (detail == ISIS_UI_LEVEL_BRIEF) -        vty_out (vty, "  Interface   CircId   State    Type     Level%s", -                 VTY_NEWLINE); +		if (detail == ISIS_UI_LEVEL_BRIEF) +			vty_out(vty, +				"  Interface   CircId   State    Type     Level%s", +				VTY_NEWLINE); -      for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit)) -        if (!ifname) -          isis_circuit_print_vty (circuit, vty, detail); -        else if (strcmp(circuit->interface->name, ifname) == 0) -          isis_circuit_print_vty (circuit, vty, detail); -    } +		for (ALL_LIST_ELEMENTS_RO(area->circuit_list, cnode, circuit)) +			if (!ifname) +				isis_circuit_print_vty(circuit, vty, detail); +			else if (strcmp(circuit->interface->name, ifname) == 0) +				isis_circuit_print_vty(circuit, vty, detail); +	} -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (show_isis_interface, @@ -492,7 +465,7 @@ DEFUN (show_isis_interface,         "ISIS network information\n"         "ISIS interface\n")  { -  return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_BRIEF); +	return show_isis_interface_common(vty, NULL, ISIS_UI_LEVEL_BRIEF);  }  DEFUN (show_isis_interface_detail, @@ -503,7 +476,7 @@ DEFUN (show_isis_interface_detail,         "ISIS interface\n"         "show detailed information\n")  { -  return show_isis_interface_common (vty, NULL, ISIS_UI_LEVEL_DETAIL); +	return show_isis_interface_common(vty, NULL, ISIS_UI_LEVEL_DETAIL);  }  DEFUN (show_isis_interface_arg, @@ -514,150 +487,152 @@ DEFUN (show_isis_interface_arg,         "ISIS interface\n"         "ISIS interface name\n")  { -  int idx_word = 3; -  return show_isis_interface_common (vty, argv[idx_word]->arg, ISIS_UI_LEVEL_DETAIL); +	int idx_word = 3; +	return show_isis_interface_common(vty, argv[idx_word]->arg, +					  ISIS_UI_LEVEL_DETAIL);  }  /*   * 'show isis neighbor' command   */ -int -show_isis_neighbor_common (struct vty *vty, const char *id, char detail) -{ -  struct listnode *anode, *cnode, *node; -  struct isis_area *area; -  struct isis_circuit *circuit; -  struct list *adjdb; -  struct isis_adjacency *adj; -  struct isis_dynhn *dynhn; -  u_char sysid[ISIS_SYS_ID_LEN]; -  int i; - -  if (!isis) -    { -      vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE); -      return CMD_SUCCESS; -    } - -  memset (sysid, 0, ISIS_SYS_ID_LEN); -  if (id) -    { -      if (sysid2buff (sysid, id) == 0) -        { -          dynhn = dynhn_find_by_name (id); -          if (dynhn == NULL) -            { -              vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE); -              return CMD_SUCCESS; -            } -          memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN); -        } -    } - -  for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area)) -    { -      vty_out (vty, "Area %s:%s", area->area_tag, VTY_NEWLINE); - -      if (detail == ISIS_UI_LEVEL_BRIEF) -        vty_out (vty, "  System Id           Interface   L  State" -                      "        Holdtime SNPA%s", VTY_NEWLINE); - -      for (ALL_LIST_ELEMENTS_RO (area->circuit_list, cnode, circuit)) -        { -          if (circuit->circ_type == CIRCUIT_T_BROADCAST) -            { -              for (i = 0; i < 2; i++) -                { -                  adjdb = circuit->u.bc.adjdb[i]; -                  if (adjdb && adjdb->count) -                    { -                      for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj)) -                        if (!id || !memcmp (adj->sysid, sysid, -                                            ISIS_SYS_ID_LEN)) -                          isis_adj_print_vty (adj, vty, detail); -                    } -                } -            } -          else if (circuit->circ_type == CIRCUIT_T_P2P && -                   circuit->u.p2p.neighbor) -            { -              adj = circuit->u.p2p.neighbor; -              if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN)) -                isis_adj_print_vty (adj, vty, detail); -            } -        } -    } - -  return CMD_SUCCESS; +int show_isis_neighbor_common(struct vty *vty, const char *id, char detail) +{ +	struct listnode *anode, *cnode, *node; +	struct isis_area *area; +	struct isis_circuit *circuit; +	struct list *adjdb; +	struct isis_adjacency *adj; +	struct isis_dynhn *dynhn; +	u_char sysid[ISIS_SYS_ID_LEN]; +	int i; + +	if (!isis) { +		vty_out(vty, "IS-IS Routing Process not enabled%s", +			VTY_NEWLINE); +		return CMD_SUCCESS; +	} + +	memset(sysid, 0, ISIS_SYS_ID_LEN); +	if (id) { +		if (sysid2buff(sysid, id) == 0) { +			dynhn = dynhn_find_by_name(id); +			if (dynhn == NULL) { +				vty_out(vty, "Invalid system id %s%s", id, +					VTY_NEWLINE); +				return CMD_SUCCESS; +			} +			memcpy(sysid, dynhn->id, ISIS_SYS_ID_LEN); +		} +	} + +	for (ALL_LIST_ELEMENTS_RO(isis->area_list, anode, area)) { +		vty_out(vty, "Area %s:%s", area->area_tag, VTY_NEWLINE); + +		if (detail == ISIS_UI_LEVEL_BRIEF) +			vty_out(vty, +				"  System Id           Interface   L  State" +				"        Holdtime SNPA%s", +				VTY_NEWLINE); + +		for (ALL_LIST_ELEMENTS_RO(area->circuit_list, cnode, circuit)) { +			if (circuit->circ_type == CIRCUIT_T_BROADCAST) { +				for (i = 0; i < 2; i++) { +					adjdb = circuit->u.bc.adjdb[i]; +					if (adjdb && adjdb->count) { +						for (ALL_LIST_ELEMENTS_RO( +							     adjdb, node, adj)) +							if (!id +							    || !memcmp(adj->sysid, +								       sysid, +								       ISIS_SYS_ID_LEN)) +								isis_adj_print_vty( +									adj, +									vty, +									detail); +					} +				} +			} else if (circuit->circ_type == CIRCUIT_T_P2P +				   && circuit->u.p2p.neighbor) { +				adj = circuit->u.p2p.neighbor; +				if (!id +				    || !memcmp(adj->sysid, sysid, +					       ISIS_SYS_ID_LEN)) +					isis_adj_print_vty(adj, vty, detail); +			} +		} +	} + +	return CMD_SUCCESS;  }  /*   * 'clear isis neighbor' command   */ -int -clear_isis_neighbor_common (struct vty *vty, const char *id) -{ -  struct listnode *anode, *cnode, *cnextnode, *node, *nnode; -  struct isis_area *area; -  struct isis_circuit *circuit; -  struct list *adjdb; -  struct isis_adjacency *adj; -  struct isis_dynhn *dynhn; -  u_char sysid[ISIS_SYS_ID_LEN]; -  int i; - -  if (!isis) -    { -      vty_out (vty, "IS-IS Routing Process not enabled%s", VTY_NEWLINE); -      return CMD_SUCCESS; -    } - -  memset (sysid, 0, ISIS_SYS_ID_LEN); -  if (id) -    { -      if (sysid2buff (sysid, id) == 0) -        { -          dynhn = dynhn_find_by_name (id); -          if (dynhn == NULL) -            { -              vty_out (vty, "Invalid system id %s%s", id, VTY_NEWLINE); -              return CMD_SUCCESS; -            } -          memcpy (sysid, dynhn->id, ISIS_SYS_ID_LEN); -        } -    } - -  for (ALL_LIST_ELEMENTS_RO (isis->area_list, anode, area)) -    { -      for (ALL_LIST_ELEMENTS (area->circuit_list, cnode, cnextnode, circuit)) -        { -          if (circuit->circ_type == CIRCUIT_T_BROADCAST) -            { -              for (i = 0; i < 2; i++) -                { -                  adjdb = circuit->u.bc.adjdb[i]; -                  if (adjdb && adjdb->count) -                    { -                      for (ALL_LIST_ELEMENTS (adjdb, node, nnode, adj)) -                        if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN)) -                          isis_adj_state_change (adj, ISIS_ADJ_DOWN, -                                                 "clear user request"); -                    } -                } -            } -          else if (circuit->circ_type == CIRCUIT_T_P2P && -                   circuit->u.p2p.neighbor) -            { -              adj = circuit->u.p2p.neighbor; -              if (!id || !memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN)) -                isis_adj_state_change (adj, ISIS_ADJ_DOWN, -                                       "clear user request"); -            } -        } -    } - -  return CMD_SUCCESS; +int clear_isis_neighbor_common(struct vty *vty, const char *id) +{ +	struct listnode *anode, *cnode, *cnextnode, *node, *nnode; +	struct isis_area *area; +	struct isis_circuit *circuit; +	struct list *adjdb; +	struct isis_adjacency *adj; +	struct isis_dynhn *dynhn; +	u_char sysid[ISIS_SYS_ID_LEN]; +	int i; + +	if (!isis) { +		vty_out(vty, "IS-IS Routing Process not enabled%s", +			VTY_NEWLINE); +		return CMD_SUCCESS; +	} + +	memset(sysid, 0, ISIS_SYS_ID_LEN); +	if (id) { +		if (sysid2buff(sysid, id) == 0) { +			dynhn = dynhn_find_by_name(id); +			if (dynhn == NULL) { +				vty_out(vty, "Invalid system id %s%s", id, +					VTY_NEWLINE); +				return CMD_SUCCESS; +			} +			memcpy(sysid, dynhn->id, ISIS_SYS_ID_LEN); +		} +	} + +	for (ALL_LIST_ELEMENTS_RO(isis->area_list, anode, area)) { +		for (ALL_LIST_ELEMENTS(area->circuit_list, cnode, cnextnode, +				       circuit)) { +			if (circuit->circ_type == CIRCUIT_T_BROADCAST) { +				for (i = 0; i < 2; i++) { +					adjdb = circuit->u.bc.adjdb[i]; +					if (adjdb && adjdb->count) { +						for (ALL_LIST_ELEMENTS( +							     adjdb, node, nnode, +							     adj)) +							if (!id +							    || !memcmp(adj->sysid, +								       sysid, +								       ISIS_SYS_ID_LEN)) +								isis_adj_state_change( +									adj, +									ISIS_ADJ_DOWN, +									"clear user request"); +					} +				} +			} else if (circuit->circ_type == CIRCUIT_T_P2P +				   && circuit->u.p2p.neighbor) { +				adj = circuit->u.p2p.neighbor; +				if (!id +				    || !memcmp(adj->sysid, sysid, +					       ISIS_SYS_ID_LEN)) +					isis_adj_state_change( +						adj, ISIS_ADJ_DOWN, +						"clear user request"); +			} +		} +	} + +	return CMD_SUCCESS;  }  DEFUN (show_isis_neighbor, @@ -667,7 +642,7 @@ DEFUN (show_isis_neighbor,         "ISIS network information\n"         "ISIS neighbor adjacencies\n")  { -  return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_BRIEF); +	return show_isis_neighbor_common(vty, NULL, ISIS_UI_LEVEL_BRIEF);  }  DEFUN (show_isis_neighbor_detail, @@ -678,7 +653,7 @@ DEFUN (show_isis_neighbor_detail,         "ISIS neighbor adjacencies\n"         "show detailed information\n")  { -  return show_isis_neighbor_common (vty, NULL, ISIS_UI_LEVEL_DETAIL); +	return show_isis_neighbor_common(vty, NULL, ISIS_UI_LEVEL_DETAIL);  }  DEFUN (show_isis_neighbor_arg, @@ -689,8 +664,9 @@ DEFUN (show_isis_neighbor_arg,         "ISIS neighbor adjacencies\n"         "System id\n")  { -  int idx_word = 3; -  return show_isis_neighbor_common (vty, argv[idx_word]->arg, ISIS_UI_LEVEL_DETAIL); +	int idx_word = 3; +	return show_isis_neighbor_common(vty, argv[idx_word]->arg, +					 ISIS_UI_LEVEL_DETAIL);  }  DEFUN (clear_isis_neighbor, @@ -700,7 +676,7 @@ DEFUN (clear_isis_neighbor,         "Reset ISIS network information\n"         "Reset ISIS neighbor adjacencies\n")  { -  return clear_isis_neighbor_common (vty, NULL); +	return clear_isis_neighbor_common(vty, NULL);  }  DEFUN (clear_isis_neighbor_arg, @@ -711,59 +687,65 @@ DEFUN (clear_isis_neighbor_arg,         "ISIS neighbor adjacencies\n"         "System id\n")  { -  int idx_word = 3; -  return clear_isis_neighbor_common (vty, argv[idx_word]->arg); +	int idx_word = 3; +	return clear_isis_neighbor_common(vty, argv[idx_word]->arg);  }  /*   * 'isis debug', 'show debugging'   */ -void -print_debug (struct vty *vty, int flags, int onoff) -{ -  char onoffs[4]; -  if (onoff) -    strcpy (onoffs, "on"); -  else -    strcpy (onoffs, "off"); - -  if (flags & DEBUG_ADJ_PACKETS) -    vty_out (vty, "IS-IS Adjacency related packets debugging is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_CHECKSUM_ERRORS) -    vty_out (vty, "IS-IS checksum errors debugging is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_LOCAL_UPDATES) -    vty_out (vty, "IS-IS local updates debugging is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_PROTOCOL_ERRORS) -    vty_out (vty, "IS-IS protocol errors debugging is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_SNP_PACKETS) -    vty_out (vty, "IS-IS CSNP/PSNP packets debugging is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_SPF_EVENTS) -    vty_out (vty, "IS-IS SPF events debugging is %s%s", onoffs, VTY_NEWLINE); -  if (flags & DEBUG_SPF_STATS) -    vty_out (vty, "IS-IS SPF Timing and Statistics Data debugging is %s%s", -	     onoffs, VTY_NEWLINE); -  if (flags & DEBUG_SPF_TRIGGERS) -    vty_out (vty, "IS-IS SPF triggering events debugging is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_UPDATE_PACKETS) -    vty_out (vty, "IS-IS Update related packet debugging is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_RTE_EVENTS) -    vty_out (vty, "IS-IS Route related debuggin is %s%s", onoffs, -	     VTY_NEWLINE); -  if (flags & DEBUG_EVENTS) -    vty_out (vty, "IS-IS Event debugging is %s%s", onoffs, VTY_NEWLINE); -  if (flags & DEBUG_PACKET_DUMP) -    vty_out (vty, "IS-IS Packet dump debugging is %s%s", onoffs, VTY_NEWLINE); -  if (flags & DEBUG_LSP_GEN) -    vty_out (vty, "IS-IS LSP generation debugging is %s%s", onoffs, VTY_NEWLINE); -  if (flags & DEBUG_LSP_SCHED) -    vty_out (vty, "IS-IS LSP scheduling debugging is %s%s", onoffs, VTY_NEWLINE); +void print_debug(struct vty *vty, int flags, int onoff) +{ +	char onoffs[4]; +	if (onoff) +		strcpy(onoffs, "on"); +	else +		strcpy(onoffs, "off"); + +	if (flags & DEBUG_ADJ_PACKETS) +		vty_out(vty, +			"IS-IS Adjacency related packets debugging is %s%s", +			onoffs, VTY_NEWLINE); +	if (flags & DEBUG_CHECKSUM_ERRORS) +		vty_out(vty, "IS-IS checksum errors debugging is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_LOCAL_UPDATES) +		vty_out(vty, "IS-IS local updates debugging is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_PROTOCOL_ERRORS) +		vty_out(vty, "IS-IS protocol errors debugging is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_SNP_PACKETS) +		vty_out(vty, "IS-IS CSNP/PSNP packets debugging is %s%s", +			onoffs, VTY_NEWLINE); +	if (flags & DEBUG_SPF_EVENTS) +		vty_out(vty, "IS-IS SPF events debugging is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_SPF_STATS) +		vty_out(vty, +			"IS-IS SPF Timing and Statistics Data debugging is %s%s", +			onoffs, VTY_NEWLINE); +	if (flags & DEBUG_SPF_TRIGGERS) +		vty_out(vty, "IS-IS SPF triggering events debugging is %s%s", +			onoffs, VTY_NEWLINE); +	if (flags & DEBUG_UPDATE_PACKETS) +		vty_out(vty, "IS-IS Update related packet debugging is %s%s", +			onoffs, VTY_NEWLINE); +	if (flags & DEBUG_RTE_EVENTS) +		vty_out(vty, "IS-IS Route related debuggin is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_EVENTS) +		vty_out(vty, "IS-IS Event debugging is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_PACKET_DUMP) +		vty_out(vty, "IS-IS Packet dump debugging is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_LSP_GEN) +		vty_out(vty, "IS-IS LSP generation debugging is %s%s", onoffs, +			VTY_NEWLINE); +	if (flags & DEBUG_LSP_SCHED) +		vty_out(vty, "IS-IS LSP scheduling debugging is %s%s", onoffs, +			VTY_NEWLINE);  }  DEFUN (show_debugging, @@ -773,99 +755,80 @@ DEFUN (show_debugging,         "State of each debugging option\n"         ISIS_STR)  { -  if (isis->debugs) { -      vty_out (vty, "IS-IS:%s", VTY_NEWLINE); -      print_debug (vty, isis->debugs, 1); -  } -  return CMD_SUCCESS; +	if (isis->debugs) { +		vty_out(vty, "IS-IS:%s", VTY_NEWLINE); +		print_debug(vty, isis->debugs, 1); +	} +	return CMD_SUCCESS;  }  /* Debug node. */ -static struct cmd_node debug_node = { -  DEBUG_NODE, -  "", -  1 -}; - -static int -config_write_debug (struct vty *vty) -{ -  int write = 0; -  int flags = isis->debugs; - -  if (flags & DEBUG_ADJ_PACKETS) -    { -      vty_out (vty, "debug isis adj-packets%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_CHECKSUM_ERRORS) -    { -      vty_out (vty, "debug isis checksum-errors%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_LOCAL_UPDATES) -    { -      vty_out (vty, "debug isis local-updates%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_PROTOCOL_ERRORS) -    { -      vty_out (vty, "debug isis protocol-errors%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_SNP_PACKETS) -    { -      vty_out (vty, "debug isis snp-packets%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_SPF_EVENTS) -    { -      vty_out (vty, "debug isis spf-events%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_SPF_STATS) -    { -      vty_out (vty, "debug isis spf-statistics%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_SPF_TRIGGERS) -    { -      vty_out (vty, "debug isis spf-triggers%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_UPDATE_PACKETS) -    { -      vty_out (vty, "debug isis update-packets%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_RTE_EVENTS) -    { -      vty_out (vty, "debug isis route-events%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_EVENTS) -    { -      vty_out (vty, "debug isis events%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_PACKET_DUMP) -    { -      vty_out (vty, "debug isis packet-dump%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_LSP_GEN) -    { -      vty_out (vty, "debug isis lsp-gen%s", VTY_NEWLINE); -      write++; -    } -  if (flags & DEBUG_LSP_SCHED) -    { -      vty_out (vty, "debug isis lsp-sched%s", VTY_NEWLINE); -      write++; -    } -  write += spf_backoff_write_config(vty); - -  return write; +static struct cmd_node debug_node = {DEBUG_NODE, "", 1}; + +static int config_write_debug(struct vty *vty) +{ +	int write = 0; +	int flags = isis->debugs; + +	if (flags & DEBUG_ADJ_PACKETS) { +		vty_out(vty, "debug isis adj-packets%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_CHECKSUM_ERRORS) { +		vty_out(vty, "debug isis checksum-errors%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_LOCAL_UPDATES) { +		vty_out(vty, "debug isis local-updates%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_PROTOCOL_ERRORS) { +		vty_out(vty, "debug isis protocol-errors%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_SNP_PACKETS) { +		vty_out(vty, "debug isis snp-packets%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_SPF_EVENTS) { +		vty_out(vty, "debug isis spf-events%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_SPF_STATS) { +		vty_out(vty, "debug isis spf-statistics%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_SPF_TRIGGERS) { +		vty_out(vty, "debug isis spf-triggers%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_UPDATE_PACKETS) { +		vty_out(vty, "debug isis update-packets%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_RTE_EVENTS) { +		vty_out(vty, "debug isis route-events%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_EVENTS) { +		vty_out(vty, "debug isis events%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_PACKET_DUMP) { +		vty_out(vty, "debug isis packet-dump%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_LSP_GEN) { +		vty_out(vty, "debug isis lsp-gen%s", VTY_NEWLINE); +		write++; +	} +	if (flags & DEBUG_LSP_SCHED) { +		vty_out(vty, "debug isis lsp-sched%s", VTY_NEWLINE); +		write++; +	} +	write += spf_backoff_write_config(vty); + +	return write;  }  DEFUN (debug_isis_adj, @@ -875,10 +838,10 @@ DEFUN (debug_isis_adj,         "IS-IS information\n"         "IS-IS Adjacency related packets\n")  { -  isis->debugs |= DEBUG_ADJ_PACKETS; -  print_debug (vty, DEBUG_ADJ_PACKETS, 1); +	isis->debugs |= DEBUG_ADJ_PACKETS; +	print_debug(vty, DEBUG_ADJ_PACKETS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_adj, @@ -889,10 +852,10 @@ DEFUN (no_debug_isis_adj,         "IS-IS information\n"         "IS-IS Adjacency related packets\n")  { -  isis->debugs &= ~DEBUG_ADJ_PACKETS; -  print_debug (vty, DEBUG_ADJ_PACKETS, 0); +	isis->debugs &= ~DEBUG_ADJ_PACKETS; +	print_debug(vty, DEBUG_ADJ_PACKETS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_csum, @@ -902,10 +865,10 @@ DEFUN (debug_isis_csum,         "IS-IS information\n"         "IS-IS LSP checksum errors\n")  { -  isis->debugs |= DEBUG_CHECKSUM_ERRORS; -  print_debug (vty, DEBUG_CHECKSUM_ERRORS, 1); +	isis->debugs |= DEBUG_CHECKSUM_ERRORS; +	print_debug(vty, DEBUG_CHECKSUM_ERRORS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_csum, @@ -916,10 +879,10 @@ DEFUN (no_debug_isis_csum,         "IS-IS information\n"         "IS-IS LSP checksum errors\n")  { -  isis->debugs &= ~DEBUG_CHECKSUM_ERRORS; -  print_debug (vty, DEBUG_CHECKSUM_ERRORS, 0); +	isis->debugs &= ~DEBUG_CHECKSUM_ERRORS; +	print_debug(vty, DEBUG_CHECKSUM_ERRORS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_lupd, @@ -929,10 +892,10 @@ DEFUN (debug_isis_lupd,         "IS-IS information\n"         "IS-IS local update packets\n")  { -  isis->debugs |= DEBUG_LOCAL_UPDATES; -  print_debug (vty, DEBUG_LOCAL_UPDATES, 1); +	isis->debugs |= DEBUG_LOCAL_UPDATES; +	print_debug(vty, DEBUG_LOCAL_UPDATES, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_lupd, @@ -943,10 +906,10 @@ DEFUN (no_debug_isis_lupd,         "IS-IS information\n"         "IS-IS local update packets\n")  { -  isis->debugs &= ~DEBUG_LOCAL_UPDATES; -  print_debug (vty, DEBUG_LOCAL_UPDATES, 0); +	isis->debugs &= ~DEBUG_LOCAL_UPDATES; +	print_debug(vty, DEBUG_LOCAL_UPDATES, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_err, @@ -956,10 +919,10 @@ DEFUN (debug_isis_err,         "IS-IS information\n"         "IS-IS LSP protocol errors\n")  { -  isis->debugs |= DEBUG_PROTOCOL_ERRORS; -  print_debug (vty, DEBUG_PROTOCOL_ERRORS, 1); +	isis->debugs |= DEBUG_PROTOCOL_ERRORS; +	print_debug(vty, DEBUG_PROTOCOL_ERRORS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_err, @@ -970,10 +933,10 @@ DEFUN (no_debug_isis_err,         "IS-IS information\n"         "IS-IS LSP protocol errors\n")  { -  isis->debugs &= ~DEBUG_PROTOCOL_ERRORS; -  print_debug (vty, DEBUG_PROTOCOL_ERRORS, 0); +	isis->debugs &= ~DEBUG_PROTOCOL_ERRORS; +	print_debug(vty, DEBUG_PROTOCOL_ERRORS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_snp, @@ -983,10 +946,10 @@ DEFUN (debug_isis_snp,         "IS-IS information\n"         "IS-IS CSNP/PSNP packets\n")  { -  isis->debugs |= DEBUG_SNP_PACKETS; -  print_debug (vty, DEBUG_SNP_PACKETS, 1); +	isis->debugs |= DEBUG_SNP_PACKETS; +	print_debug(vty, DEBUG_SNP_PACKETS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_snp, @@ -997,10 +960,10 @@ DEFUN (no_debug_isis_snp,         "IS-IS information\n"         "IS-IS CSNP/PSNP packets\n")  { -  isis->debugs &= ~DEBUG_SNP_PACKETS; -  print_debug (vty, DEBUG_SNP_PACKETS, 0); +	isis->debugs &= ~DEBUG_SNP_PACKETS; +	print_debug(vty, DEBUG_SNP_PACKETS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_upd, @@ -1010,10 +973,10 @@ DEFUN (debug_isis_upd,         "IS-IS information\n"         "IS-IS Update related packets\n")  { -  isis->debugs |= DEBUG_UPDATE_PACKETS; -  print_debug (vty, DEBUG_UPDATE_PACKETS, 1); +	isis->debugs |= DEBUG_UPDATE_PACKETS; +	print_debug(vty, DEBUG_UPDATE_PACKETS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_upd, @@ -1024,10 +987,10 @@ DEFUN (no_debug_isis_upd,         "IS-IS information\n"         "IS-IS Update related packets\n")  { -  isis->debugs &= ~DEBUG_UPDATE_PACKETS; -  print_debug (vty, DEBUG_UPDATE_PACKETS, 0); +	isis->debugs &= ~DEBUG_UPDATE_PACKETS; +	print_debug(vty, DEBUG_UPDATE_PACKETS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_spfevents, @@ -1037,10 +1000,10 @@ DEFUN (debug_isis_spfevents,         "IS-IS information\n"         "IS-IS Shortest Path First Events\n")  { -  isis->debugs |= DEBUG_SPF_EVENTS; -  print_debug (vty, DEBUG_SPF_EVENTS, 1); +	isis->debugs |= DEBUG_SPF_EVENTS; +	print_debug(vty, DEBUG_SPF_EVENTS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_spfevents, @@ -1051,10 +1014,10 @@ DEFUN (no_debug_isis_spfevents,         "IS-IS information\n"         "IS-IS Shortest Path First Events\n")  { -  isis->debugs &= ~DEBUG_SPF_EVENTS; -  print_debug (vty, DEBUG_SPF_EVENTS, 0); +	isis->debugs &= ~DEBUG_SPF_EVENTS; +	print_debug(vty, DEBUG_SPF_EVENTS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_spfstats, @@ -1064,10 +1027,10 @@ DEFUN (debug_isis_spfstats,         "IS-IS information\n"         "IS-IS SPF Timing and Statistic Data\n")  { -  isis->debugs |= DEBUG_SPF_STATS; -  print_debug (vty, DEBUG_SPF_STATS, 1); +	isis->debugs |= DEBUG_SPF_STATS; +	print_debug(vty, DEBUG_SPF_STATS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_spfstats, @@ -1078,10 +1041,10 @@ DEFUN (no_debug_isis_spfstats,         "IS-IS information\n"         "IS-IS SPF Timing and Statistic Data\n")  { -  isis->debugs &= ~DEBUG_SPF_STATS; -  print_debug (vty, DEBUG_SPF_STATS, 0); +	isis->debugs &= ~DEBUG_SPF_STATS; +	print_debug(vty, DEBUG_SPF_STATS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_spftrigg, @@ -1091,10 +1054,10 @@ DEFUN (debug_isis_spftrigg,         "IS-IS information\n"         "IS-IS SPF triggering events\n")  { -  isis->debugs |= DEBUG_SPF_TRIGGERS; -  print_debug (vty, DEBUG_SPF_TRIGGERS, 1); +	isis->debugs |= DEBUG_SPF_TRIGGERS; +	print_debug(vty, DEBUG_SPF_TRIGGERS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_spftrigg, @@ -1105,10 +1068,10 @@ DEFUN (no_debug_isis_spftrigg,         "IS-IS information\n"         "IS-IS SPF triggering events\n")  { -  isis->debugs &= ~DEBUG_SPF_TRIGGERS; -  print_debug (vty, DEBUG_SPF_TRIGGERS, 0); +	isis->debugs &= ~DEBUG_SPF_TRIGGERS; +	print_debug(vty, DEBUG_SPF_TRIGGERS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_rtevents, @@ -1118,10 +1081,10 @@ DEFUN (debug_isis_rtevents,         "IS-IS information\n"         "IS-IS Route related events\n")  { -  isis->debugs |= DEBUG_RTE_EVENTS; -  print_debug (vty, DEBUG_RTE_EVENTS, 1); +	isis->debugs |= DEBUG_RTE_EVENTS; +	print_debug(vty, DEBUG_RTE_EVENTS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_rtevents, @@ -1132,10 +1095,10 @@ DEFUN (no_debug_isis_rtevents,         "IS-IS information\n"         "IS-IS Route related events\n")  { -  isis->debugs &= ~DEBUG_RTE_EVENTS; -  print_debug (vty, DEBUG_RTE_EVENTS, 0); +	isis->debugs &= ~DEBUG_RTE_EVENTS; +	print_debug(vty, DEBUG_RTE_EVENTS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_events, @@ -1145,10 +1108,10 @@ DEFUN (debug_isis_events,         "IS-IS information\n"         "IS-IS Events\n")  { -  isis->debugs |= DEBUG_EVENTS; -  print_debug (vty, DEBUG_EVENTS, 1); +	isis->debugs |= DEBUG_EVENTS; +	print_debug(vty, DEBUG_EVENTS, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_events, @@ -1159,10 +1122,10 @@ DEFUN (no_debug_isis_events,         "IS-IS information\n"         "IS-IS Events\n")  { -  isis->debugs &= ~DEBUG_EVENTS; -  print_debug (vty, DEBUG_EVENTS, 0); +	isis->debugs &= ~DEBUG_EVENTS; +	print_debug(vty, DEBUG_EVENTS, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_packet_dump, @@ -1172,10 +1135,10 @@ DEFUN (debug_isis_packet_dump,         "IS-IS information\n"         "IS-IS packet dump\n")  { -  isis->debugs |= DEBUG_PACKET_DUMP; -  print_debug (vty, DEBUG_PACKET_DUMP, 1); +	isis->debugs |= DEBUG_PACKET_DUMP; +	print_debug(vty, DEBUG_PACKET_DUMP, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_packet_dump, @@ -1186,10 +1149,10 @@ DEFUN (no_debug_isis_packet_dump,         "IS-IS information\n"         "IS-IS packet dump\n")  { -  isis->debugs &= ~DEBUG_PACKET_DUMP; -  print_debug (vty, DEBUG_PACKET_DUMP, 0); +	isis->debugs &= ~DEBUG_PACKET_DUMP; +	print_debug(vty, DEBUG_PACKET_DUMP, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_lsp_gen, @@ -1199,10 +1162,10 @@ DEFUN (debug_isis_lsp_gen,         "IS-IS information\n"         "IS-IS generation of own LSPs\n")  { -  isis->debugs |= DEBUG_LSP_GEN; -  print_debug (vty, DEBUG_LSP_GEN, 1); +	isis->debugs |= DEBUG_LSP_GEN; +	print_debug(vty, DEBUG_LSP_GEN, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_lsp_gen, @@ -1213,10 +1176,10 @@ DEFUN (no_debug_isis_lsp_gen,         "IS-IS information\n"         "IS-IS generation of own LSPs\n")  { -  isis->debugs &= ~DEBUG_LSP_GEN; -  print_debug (vty, DEBUG_LSP_GEN, 0); +	isis->debugs &= ~DEBUG_LSP_GEN; +	print_debug(vty, DEBUG_LSP_GEN, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (debug_isis_lsp_sched, @@ -1226,10 +1189,10 @@ DEFUN (debug_isis_lsp_sched,         "IS-IS information\n"         "IS-IS scheduling of LSP generation\n")  { -  isis->debugs |= DEBUG_LSP_SCHED; -  print_debug (vty, DEBUG_LSP_SCHED, 1); +	isis->debugs |= DEBUG_LSP_SCHED; +	print_debug(vty, DEBUG_LSP_SCHED, 1); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_debug_isis_lsp_sched, @@ -1240,10 +1203,10 @@ DEFUN (no_debug_isis_lsp_sched,         "IS-IS information\n"         "IS-IS scheduling of LSP generation\n")  { -  isis->debugs &= ~DEBUG_LSP_SCHED; -  print_debug (vty, DEBUG_LSP_SCHED, 0); +	isis->debugs &= ~DEBUG_LSP_SCHED; +	print_debug(vty, DEBUG_LSP_SCHED, 0); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (show_hostname, @@ -1253,32 +1216,30 @@ DEFUN (show_hostname,         "IS-IS information\n"         "IS-IS Dynamic hostname mapping\n")  { -  dynhn_print_all (vty); +	dynhn_print_all(vty); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  } -static void -vty_out_timestr(struct vty *vty, time_t uptime) +static void vty_out_timestr(struct vty *vty, time_t uptime)  { -  struct tm *tm; -  time_t difftime = time (NULL); -  difftime -= uptime; -  tm = gmtime (&difftime); +	struct tm *tm; +	time_t difftime = time(NULL); +	difftime -= uptime; +	tm = gmtime(&difftime);  #define ONE_DAY_SECOND 60*60*24  #define ONE_WEEK_SECOND 60*60*24*7 -  if (difftime < ONE_DAY_SECOND) -    vty_out (vty,  "%02d:%02d:%02d",  -        tm->tm_hour, tm->tm_min, tm->tm_sec); -  else if (difftime < ONE_WEEK_SECOND) -    vty_out (vty, "%dd%02dh%02dm",  -        tm->tm_yday, tm->tm_hour, tm->tm_min); -  else -    vty_out (vty, "%02dw%dd%02dh",  -        tm->tm_yday/7, -        tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour); -  vty_out (vty, " ago"); +	if (difftime < ONE_DAY_SECOND) +		vty_out(vty, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, +			tm->tm_sec); +	else if (difftime < ONE_WEEK_SECOND) +		vty_out(vty, "%dd%02dh%02dm", tm->tm_yday, tm->tm_hour, +			tm->tm_min); +	else +		vty_out(vty, "%02dw%dd%02dh", tm->tm_yday / 7, +			tm->tm_yday - ((tm->tm_yday / 7) * 7), tm->tm_hour); +	vty_out(vty, " ago");  }  DEFUN (show_isis_spf_ietf, @@ -1288,48 +1249,49 @@ DEFUN (show_isis_spf_ietf,         "IS-IS information\n"         "IS-IS SPF delay IETF information\n")  { -  if (!isis) -    { -      vty_out (vty, "ISIS is not running%s", VTY_NEWLINE); -      return CMD_SUCCESS; -    } - -  struct listnode *node; -  struct isis_area *area; - -  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area)) -    { -      vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null", -               VTY_NEWLINE); - -      for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) -        { -          if ((area->is_type & level) == 0) -            continue; - -          vty_out (vty, "  Level-%d:%s", level, VTY_NEWLINE); -          vty_out (vty, "    SPF delay status: "); -          if (area->spf_timer[level -1]) -            { -              struct timeval remain = thread_timer_remain(area->spf_timer[level - 1]); -              vty_out(vty, "Pending, due in %ld msec%s", -                      remain.tv_sec * 1000 + remain.tv_usec / 1000, -                      VTY_NEWLINE); -            } -          else -            { -              vty_out(vty, "Not scheduled%s", VTY_NEWLINE); -            } - -          if (area->spf_delay_ietf[level - 1]) { -            vty_out(vty,  "    Using draft-ietf-rtgwg-backoff-algo-04%s", VTY_NEWLINE); -            spf_backoff_show(area->spf_delay_ietf[level - 1], vty, "    "); -          } else { -            vty_out(vty,  "    Using legacy backoff algo%s", VTY_NEWLINE); -          } -        } -    } -  return CMD_SUCCESS; +	if (!isis) { +		vty_out(vty, "ISIS is not running%s", VTY_NEWLINE); +		return CMD_SUCCESS; +	} + +	struct listnode *node; +	struct isis_area *area; + +	for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) { +		vty_out(vty, "Area %s:%s", +			area->area_tag ? area->area_tag : "null", VTY_NEWLINE); + +		for (int level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { +			if ((area->is_type & level) == 0) +				continue; + +			vty_out(vty, "  Level-%d:%s", level, VTY_NEWLINE); +			vty_out(vty, "    SPF delay status: "); +			if (area->spf_timer[level - 1]) { +				struct timeval remain = thread_timer_remain( +					area->spf_timer[level - 1]); +				vty_out(vty, "Pending, due in %ld msec%s", +					remain.tv_sec * 1000 +						+ remain.tv_usec / 1000, +					VTY_NEWLINE); +			} else { +				vty_out(vty, "Not scheduled%s", VTY_NEWLINE); +			} + +			if (area->spf_delay_ietf[level - 1]) { +				vty_out(vty, +					"    Using draft-ietf-rtgwg-backoff-algo-04%s", +					VTY_NEWLINE); +				spf_backoff_show( +					area->spf_delay_ietf[level - 1], vty, +					"    "); +			} else { +				vty_out(vty, "    Using legacy backoff algo%s", +					VTY_NEWLINE); +			} +		} +	} +	return CMD_SUCCESS;  }  DEFUN (show_isis_summary, @@ -1337,94 +1299,97 @@ DEFUN (show_isis_summary,         "show isis summary",         SHOW_STR "IS-IS information\n" "IS-IS summary\n")  { -  struct listnode *node, *node2; -  struct isis_area *area; -  struct isis_spftree *spftree; -  int level; - -  if (isis == NULL) -  { -    vty_out (vty, "ISIS is not running%s", VTY_NEWLINE); -    return CMD_SUCCESS; -  } - -  vty_out (vty, "Process Id      : %ld%s", isis->process_id, -      VTY_NEWLINE); -  if (isis->sysid_set) -    vty_out (vty, "System Id       : %s%s", sysid_print (isis->sysid), -        VTY_NEWLINE); - -  vty_out (vty, "Up time         : "); -  vty_out_timestr(vty, isis->uptime); -  vty_out (vty, "%s", VTY_NEWLINE); - -  if (isis->area_list) -    vty_out (vty, "Number of areas : %d%s", isis->area_list->count, -        VTY_NEWLINE); - -  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area)) -  { -    vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null", -        VTY_NEWLINE); - -    if (listcount (area->area_addrs) > 0) -    { -      struct area_addr *area_addr; -      for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr)) -      { -        vty_out (vty, "  Net: %s%s", -            isonet_print (area_addr->area_addr, -              area_addr->addr_len + ISIS_SYS_ID_LEN + -              1), VTY_NEWLINE); -      } -    } - -    for (level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) -    { -      if ((area->is_type & level) == 0) -        continue; - -      vty_out (vty, "  Level-%d:%s", level, VTY_NEWLINE); -      spftree = area->spftree[level - 1]; -      if (area->spf_timer[level - 1]) -        vty_out (vty, "    SPF: (pending)%s", VTY_NEWLINE); -      else -        vty_out (vty, "    SPF:%s", VTY_NEWLINE); - -      vty_out (vty, "      minimum interval  : %d", -          area->min_spf_interval[level - 1]); -      if (area->spf_delay_ietf[level - 1]) -         vty_out (vty, " (not used, IETF SPF delay activated)"); -      vty_out (vty, VTY_NEWLINE); - -      vty_out (vty, "    IPv4 route computation:%s", VTY_NEWLINE); -      vty_out (vty, "      last run elapsed  : "); -      vty_out_timestr(vty, spftree->last_run_timestamp); -      vty_out (vty, "%s", VTY_NEWLINE); - -      vty_out (vty, "      last run duration : %u usec%s", -               (u_int32_t)spftree->last_run_duration, VTY_NEWLINE); - -      vty_out (vty, "      run count         : %d%s", -          spftree->runcount, VTY_NEWLINE); - -      spftree = area->spftree6[level - 1]; -      vty_out (vty, "    IPv6 route computation:%s", VTY_NEWLINE); - -      vty_out (vty, "      last run elapsed  : "); -      vty_out_timestr(vty, spftree->last_run_timestamp); -      vty_out (vty, "%s", VTY_NEWLINE); - -      vty_out (vty, "      last run duration : %llu msec%s", -               (unsigned long long)spftree->last_run_duration, VTY_NEWLINE); - -      vty_out (vty, "      run count         : %d%s", -          spftree->runcount, VTY_NEWLINE); -    } -  } -  vty_out (vty, "%s", VTY_NEWLINE); - -  return CMD_SUCCESS; +	struct listnode *node, *node2; +	struct isis_area *area; +	struct isis_spftree *spftree; +	int level; + +	if (isis == NULL) { +		vty_out(vty, "ISIS is not running%s", VTY_NEWLINE); +		return CMD_SUCCESS; +	} + +	vty_out(vty, "Process Id      : %ld%s", isis->process_id, VTY_NEWLINE); +	if (isis->sysid_set) +		vty_out(vty, "System Id       : %s%s", sysid_print(isis->sysid), +			VTY_NEWLINE); + +	vty_out(vty, "Up time         : "); +	vty_out_timestr(vty, isis->uptime); +	vty_out(vty, "%s", VTY_NEWLINE); + +	if (isis->area_list) +		vty_out(vty, "Number of areas : %d%s", isis->area_list->count, +			VTY_NEWLINE); + +	for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) { +		vty_out(vty, "Area %s:%s", +			area->area_tag ? area->area_tag : "null", VTY_NEWLINE); + +		if (listcount(area->area_addrs) > 0) { +			struct area_addr *area_addr; +			for (ALL_LIST_ELEMENTS_RO(area->area_addrs, node2, +						  area_addr)) { +				vty_out(vty, "  Net: %s%s", +					isonet_print(area_addr->area_addr, +						     area_addr->addr_len +							     + ISIS_SYS_ID_LEN +							     + 1), +					VTY_NEWLINE); +			} +		} + +		for (level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) { +			if ((area->is_type & level) == 0) +				continue; + +			vty_out(vty, "  Level-%d:%s", level, VTY_NEWLINE); +			spftree = area->spftree[level - 1]; +			if (area->spf_timer[level - 1]) +				vty_out(vty, "    SPF: (pending)%s", +					VTY_NEWLINE); +			else +				vty_out(vty, "    SPF:%s", VTY_NEWLINE); + +			vty_out(vty, "      minimum interval  : %d", +				area->min_spf_interval[level - 1]); +			if (area->spf_delay_ietf[level - 1]) +				vty_out(vty, +					" (not used, IETF SPF delay activated)"); +			vty_out(vty, VTY_NEWLINE); + +			vty_out(vty, "    IPv4 route computation:%s", +				VTY_NEWLINE); +			vty_out(vty, "      last run elapsed  : "); +			vty_out_timestr(vty, spftree->last_run_timestamp); +			vty_out(vty, "%s", VTY_NEWLINE); + +			vty_out(vty, "      last run duration : %u usec%s", +				(u_int32_t)spftree->last_run_duration, +				VTY_NEWLINE); + +			vty_out(vty, "      run count         : %d%s", +				spftree->runcount, VTY_NEWLINE); + +			spftree = area->spftree6[level - 1]; +			vty_out(vty, "    IPv6 route computation:%s", +				VTY_NEWLINE); + +			vty_out(vty, "      last run elapsed  : "); +			vty_out_timestr(vty, spftree->last_run_timestamp); +			vty_out(vty, "%s", VTY_NEWLINE); + +			vty_out(vty, "      last run duration : %llu msec%s", +				(unsigned long long)spftree->last_run_duration, +				VTY_NEWLINE); + +			vty_out(vty, "      run count         : %d%s", +				spftree->runcount, VTY_NEWLINE); +		} +	} +	vty_out(vty, "%s", VTY_NEWLINE); + +	return CMD_SUCCESS;  }  /* @@ -1443,119 +1408,124 @@ DEFUN (show_isis_summary,   * [ show isis database detail <sysid>.<pseudo-id>-<fragment-number> ]   * [ show isis database detail <hostname>.<pseudo-id>-<fragment-number> ]   */ -static int -show_isis_database (struct vty *vty, const char *argv, int ui_level) -{ -  struct listnode *node; -  struct isis_area *area; -  struct isis_lsp *lsp; -  struct isis_dynhn *dynhn; -  const char *pos = argv; -  u_char lspid[ISIS_SYS_ID_LEN+2]; -  char sysid[255]; -  u_char number[3]; -  int level, lsp_count; - -  if (isis->area_list->count == 0) -    return CMD_SUCCESS; - -  memset (&lspid, 0, ISIS_SYS_ID_LEN); -  memset (&sysid, 0, 255); - -  /* -   * extract fragment and pseudo id from the string argv -   * in the forms: -   * (a) <systemid/hostname>.<pseudo-id>-<framenent> or -   * (b) <systemid/hostname>.<pseudo-id> or -   * (c) <systemid/hostname> or -   * Where systemid is in the form: -   * xxxx.xxxx.xxxx -   */ -  if (argv) -     strncpy (sysid, argv, 254); -  if (argv && strlen (argv) > 3) -    { -      pos = argv + strlen (argv) - 3; -      if (strncmp (pos, "-", 1) == 0) -      { -        memcpy (number, ++pos, 2); -        lspid[ISIS_SYS_ID_LEN+1] = (u_char) strtol ((char *)number, NULL, 16); -        pos -= 4; -        if (strncmp (pos, ".", 1) != 0) -          return CMD_ERR_AMBIGUOUS; -      } -      if (strncmp (pos, ".", 1) == 0) -      { -        memcpy (number, ++pos, 2); -        lspid[ISIS_SYS_ID_LEN] = (u_char) strtol ((char *)number, NULL, 16); -        sysid[pos - argv - 1] = '\0'; -      } -    } - -  for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area)) -    { -      vty_out (vty, "Area %s:%s", area->area_tag ? area->area_tag : "null", -               VTY_NEWLINE); - -      for (level = 0; level < ISIS_LEVELS; level++) -        { -          if (area->lspdb[level] && dict_count (area->lspdb[level]) > 0) -            { -              lsp = NULL; -              if (argv != NULL) -                { -                  /* -                   * Try to find the lsp-id if the argv string is in -                   * the form hostname.<pseudo-id>-<fragment> -                   */ -                  if (sysid2buff (lspid, sysid)) -                    { -                      lsp = lsp_search (lspid, area->lspdb[level]); -                    } -                  else if ((dynhn = dynhn_find_by_name (sysid))) -                    { -                      memcpy (lspid, dynhn->id, ISIS_SYS_ID_LEN); -                      lsp = lsp_search (lspid, area->lspdb[level]); -                    } -                  else if (strncmp(unix_hostname (), sysid, 15) == 0) -                    { -                      memcpy (lspid, isis->sysid, ISIS_SYS_ID_LEN); -                      lsp = lsp_search (lspid, area->lspdb[level]); -                    } -                } - -              if (lsp != NULL || argv == NULL) -                { -                  vty_out (vty, "IS-IS Level-%d link-state database:%s", -                           level + 1, VTY_NEWLINE); - -                  /* print the title in all cases */ -                  vty_out (vty, "LSP ID                  PduLen  " -                           "SeqNumber   Chksum  Holdtime  ATT/P/OL%s", -                           VTY_NEWLINE); -                } - -              if (lsp) -                { -                  if (ui_level == ISIS_UI_LEVEL_DETAIL) -                    lsp_print_detail (lsp, vty, area->dynhostname); -                  else -                    lsp_print (lsp, vty, area->dynhostname); -                } -              else if (argv == NULL) -                { -                  lsp_count = lsp_print_all (vty, area->lspdb[level], -                                             ui_level, -                                             area->dynhostname); - -                  vty_out (vty, "    %u LSPs%s%s", -                           lsp_count, VTY_NEWLINE, VTY_NEWLINE); -                } -            } -        } -    } - -  return CMD_SUCCESS; +static int show_isis_database(struct vty *vty, const char *argv, int ui_level) +{ +	struct listnode *node; +	struct isis_area *area; +	struct isis_lsp *lsp; +	struct isis_dynhn *dynhn; +	const char *pos = argv; +	u_char lspid[ISIS_SYS_ID_LEN + 2]; +	char sysid[255]; +	u_char number[3]; +	int level, lsp_count; + +	if (isis->area_list->count == 0) +		return CMD_SUCCESS; + +	memset(&lspid, 0, ISIS_SYS_ID_LEN); +	memset(&sysid, 0, 255); + +	/* +	 * extract fragment and pseudo id from the string argv +	 * in the forms: +	 * (a) <systemid/hostname>.<pseudo-id>-<framenent> or +	 * (b) <systemid/hostname>.<pseudo-id> or +	 * (c) <systemid/hostname> or +	 * Where systemid is in the form: +	 * xxxx.xxxx.xxxx +	 */ +	if (argv) +		strncpy(sysid, argv, 254); +	if (argv && strlen(argv) > 3) { +		pos = argv + strlen(argv) - 3; +		if (strncmp(pos, "-", 1) == 0) { +			memcpy(number, ++pos, 2); +			lspid[ISIS_SYS_ID_LEN + 1] = +				(u_char)strtol((char *)number, NULL, 16); +			pos -= 4; +			if (strncmp(pos, ".", 1) != 0) +				return CMD_ERR_AMBIGUOUS; +		} +		if (strncmp(pos, ".", 1) == 0) { +			memcpy(number, ++pos, 2); +			lspid[ISIS_SYS_ID_LEN] = +				(u_char)strtol((char *)number, NULL, 16); +			sysid[pos - argv - 1] = '\0'; +		} +	} + +	for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) { +		vty_out(vty, "Area %s:%s", +			area->area_tag ? area->area_tag : "null", VTY_NEWLINE); + +		for (level = 0; level < ISIS_LEVELS; level++) { +			if (area->lspdb[level] +			    && dict_count(area->lspdb[level]) > 0) { +				lsp = NULL; +				if (argv != NULL) { +					/* +					 * Try to find the lsp-id if the argv +					 * string is in +					 * the form +					 * hostname.<pseudo-id>-<fragment> +					 */ +					if (sysid2buff(lspid, sysid)) { +						lsp = lsp_search( +							lspid, +							area->lspdb[level]); +					} else if ((dynhn = dynhn_find_by_name( +							    sysid))) { +						memcpy(lspid, dynhn->id, +						       ISIS_SYS_ID_LEN); +						lsp = lsp_search( +							lspid, +							area->lspdb[level]); +					} else if (strncmp(unix_hostname(), +							   sysid, 15) +						   == 0) { +						memcpy(lspid, isis->sysid, +						       ISIS_SYS_ID_LEN); +						lsp = lsp_search( +							lspid, +							area->lspdb[level]); +					} +				} + +				if (lsp != NULL || argv == NULL) { +					vty_out(vty, +						"IS-IS Level-%d link-state database:%s", +						level + 1, VTY_NEWLINE); + +					/* print the title in all cases */ +					vty_out(vty, +						"LSP ID                  PduLen  " +						"SeqNumber   Chksum  Holdtime  ATT/P/OL%s", +						VTY_NEWLINE); +				} + +				if (lsp) { +					if (ui_level == ISIS_UI_LEVEL_DETAIL) +						lsp_print_detail( +							lsp, vty, +							area->dynhostname); +					else +						lsp_print(lsp, vty, +							  area->dynhostname); +				} else if (argv == NULL) { +					lsp_count = lsp_print_all( +						vty, area->lspdb[level], +						ui_level, area->dynhostname); + +					vty_out(vty, "    %u LSPs%s%s", +						lsp_count, VTY_NEWLINE, +						VTY_NEWLINE); +				} +			} +		} +	} + +	return CMD_SUCCESS;  }  DEFUN (show_database, @@ -1567,14 +1537,16 @@ DEFUN (show_database,         "Detailed information\n"         "LSP ID\n")  { -  int idx = 0; -  int uilevel = argv_find (argv, argc, "detail", &idx) ? ISIS_UI_LEVEL_DETAIL : ISIS_UI_LEVEL_BRIEF; -  char *id = argv_find (argv, argc, "WORD", &idx) ? argv[idx]->arg : NULL; -  return show_isis_database (vty, id, uilevel); +	int idx = 0; +	int uilevel = argv_find(argv, argc, "detail", &idx) +			      ? ISIS_UI_LEVEL_DETAIL +			      : ISIS_UI_LEVEL_BRIEF; +	char *id = argv_find(argv, argc, "WORD", &idx) ? argv[idx]->arg : NULL; +	return show_isis_database(vty, id, uilevel);  } -/*  - * 'router isis' command  +/* + * 'router isis' command   */  DEFUN_NOSH (router_isis,         router_isis_cmd, @@ -1583,20 +1555,20 @@ DEFUN_NOSH (router_isis,         "ISO IS-IS\n"         "ISO Routing area tag")  { -  int idx_word = 2; -  return isis_area_get (vty, argv[idx_word]->arg); +	int idx_word = 2; +	return isis_area_get(vty, argv[idx_word]->arg);  } -/*  - *'no router isis' command  +/* + *'no router isis' command   */  DEFUN (no_router_isis,         no_router_isis_cmd,         "no router isis WORD",         "no\n" ROUTER_STR "ISO IS-IS\n" "ISO Routing area tag")  { -  int idx_word = 3; -  return isis_area_destroy (vty, argv[idx_word]->arg); +	int idx_word = 3; +	return isis_area_destroy(vty, argv[idx_word]->arg);  }  /* @@ -1608,8 +1580,8 @@ DEFUN (net,         "A Network Entity Title for this process (OSI only)\n"         "XX.XXXX. ... .XXX.XX  Network entity title (NET)\n")  { -  int idx_word = 1; -  return area_net_title (vty, argv[idx_word]->arg); +	int idx_word = 1; +	return area_net_title(vty, argv[idx_word]->arg);  }  /* @@ -1622,250 +1594,232 @@ DEFUN (no_net,         "A Network Entity Title for this process (OSI only)\n"         "XX.XXXX. ... .XXX.XX  Network entity title (NET)\n")  { -  int idx_word = 2; -  return area_clear_net_title (vty, argv[idx_word]->arg); +	int idx_word = 2; +	return area_clear_net_title(vty, argv[idx_word]->arg);  }  void isis_area_lsp_mtu_set(struct isis_area *area, unsigned int lsp_mtu)  { -  area->lsp_mtu = lsp_mtu; -  lsp_regenerate_schedule(area, IS_LEVEL_1_AND_2, 1); +	area->lsp_mtu = lsp_mtu; +	lsp_regenerate_schedule(area, IS_LEVEL_1_AND_2, 1);  } -static int -isis_area_passwd_set(struct isis_area *area, int level, u_char passwd_type, -		     const char *passwd, u_char snp_auth) +static int isis_area_passwd_set(struct isis_area *area, int level, +				u_char passwd_type, const char *passwd, +				u_char snp_auth)  { -  struct isis_passwd *dest; -  struct isis_passwd modified; -  int len; +	struct isis_passwd *dest; +	struct isis_passwd modified; +	int len; + +	assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2)); +	dest = (level == IS_LEVEL_1) ? &area->area_passwd +				     : &area->domain_passwd; +	memset(&modified, 0, sizeof(modified)); + +	if (passwd_type != ISIS_PASSWD_TYPE_UNUSED) { +		if (!passwd) +			return -1; -  assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2)); -  dest = (level == IS_LEVEL_1) ? &area->area_passwd : &area->domain_passwd; -  memset(&modified, 0, sizeof(modified)); +		len = strlen(passwd); +		if (len > 254) +			return -1; -  if (passwd_type != ISIS_PASSWD_TYPE_UNUSED) -    { -      if (!passwd) -        return -1; +		modified.len = len; +		strncpy((char *)modified.passwd, passwd, 255); +		modified.type = passwd_type; +		modified.snp_auth = snp_auth; +	} -      len = strlen(passwd); -      if (len > 254) -        return -1; +	if (memcmp(&modified, dest, sizeof(modified))) { +		memcpy(dest, &modified, sizeof(modified)); +		lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); +	} -      modified.len = len; -      strncpy((char*)modified.passwd, passwd, 255); -      modified.type = passwd_type; -      modified.snp_auth = snp_auth; -    } - -  if (memcmp(&modified, dest, sizeof(modified))) -    { -      memcpy(dest, &modified, sizeof(modified)); -      lsp_regenerate_schedule(area, IS_LEVEL_1|IS_LEVEL_2, 1); -    } - -  return 0; -} - -int -isis_area_passwd_unset (struct isis_area *area, int level) -{ -  return isis_area_passwd_set (area, level, ISIS_PASSWD_TYPE_UNUSED, NULL, 0); -} - -int -isis_area_passwd_cleartext_set (struct isis_area *area, int level, -                                const char *passwd, u_char snp_auth) -{ -  return isis_area_passwd_set (area, level, ISIS_PASSWD_TYPE_CLEARTXT, -                               passwd, snp_auth); -} - -int -isis_area_passwd_hmac_md5_set (struct isis_area *area, int level, -                               const char *passwd, u_char snp_auth) -{ -  return isis_area_passwd_set (area, level, ISIS_PASSWD_TYPE_HMAC_MD5, -                               passwd, snp_auth); -} - -static void -area_resign_level (struct isis_area *area, int level) -{ -  if (area->lspdb[level - 1]) -    { -      lsp_db_destroy (area->lspdb[level - 1]); -      area->lspdb[level - 1] = NULL; -    } -  if (area->spftree[level - 1]) -    { -      isis_spftree_del (area->spftree[level - 1]); -      area->spftree[level - 1] = NULL; -    } -  if (area->spftree6[level - 1]) -    { -      isis_spftree_del (area->spftree6[level - 1]); -      area->spftree6[level - 1] = NULL; -    } -  THREAD_TIMER_OFF(area->spf_timer[level - 1]); -  if (area->route_table[level - 1]) -    { -      route_table_finish (area->route_table[level - 1]); -      area->route_table[level - 1] = NULL; -    } -  if (area->route_table6[level - 1]) -    { -      route_table_finish (area->route_table6[level - 1]); -      area->route_table6[level - 1] = NULL; -    } - -  sched_debug("ISIS (%s): Resigned from L%d - canceling LSP regeneration timer.", -              area->area_tag, level); -  THREAD_TIMER_OFF (area->t_lsp_refresh[level - 1]); -  area->lsp_regenerate_pending[level - 1] = 0; -} - -void -isis_area_is_type_set(struct isis_area *area, int is_type) -{ -  struct listnode *node; -  struct isis_circuit *circuit; - -  if (isis->debugs & DEBUG_EVENTS) -    zlog_debug ("ISIS-Evt (%s) system type change %s -> %s", area->area_tag, -	       circuit_t2string (area->is_type), circuit_t2string (is_type)); - -  if (area->is_type == is_type) -    return;			/* No change */ - -  switch (area->is_type) -  { -    case IS_LEVEL_1: -      if (is_type == IS_LEVEL_2) -        area_resign_level (area, IS_LEVEL_1); - -      if (area->lspdb[1] == NULL) -        area->lspdb[1] = lsp_db_init (); -      if (area->route_table[1] == NULL) -        area->route_table[1] = route_table_init (); -      if (area->route_table6[1] == NULL) -        area->route_table6[1] = route_table_init (); -      break; - -    case IS_LEVEL_1_AND_2: -      if (is_type == IS_LEVEL_1) -        area_resign_level (area, IS_LEVEL_2); -      else -        area_resign_level (area, IS_LEVEL_1); -      break; - -    case IS_LEVEL_2: -      if (is_type == IS_LEVEL_1) -        area_resign_level (area, IS_LEVEL_2); - -      if (area->lspdb[0] == NULL) -        area->lspdb[0] = lsp_db_init (); -      if (area->route_table[0] == NULL) -        area->route_table[0] = route_table_init (); -      if (area->route_table6[0] == NULL) -        area->route_table6[0] = route_table_init (); -      break; - -    default: -      break; -  } - -  area->is_type = is_type; - -  /* override circuit's is_type */ -  if (area->is_type != IS_LEVEL_1_AND_2) -  { -    for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit)) -      isis_circuit_is_type_set (circuit, is_type); -  } - -  spftree_area_init (area); - -  if (listcount (area->area_addrs) > 0) -    { -      if (is_type & IS_LEVEL_1) -        lsp_generate (area, IS_LEVEL_1); -      if (is_type & IS_LEVEL_2) -        lsp_generate (area, IS_LEVEL_2); -    } -  lsp_regenerate_schedule (area, IS_LEVEL_1 | IS_LEVEL_2, 1); - -  return; +	return 0; +} + +int isis_area_passwd_unset(struct isis_area *area, int level) +{ +	return isis_area_passwd_set(area, level, ISIS_PASSWD_TYPE_UNUSED, NULL, +				    0); +} + +int isis_area_passwd_cleartext_set(struct isis_area *area, int level, +				   const char *passwd, u_char snp_auth) +{ +	return isis_area_passwd_set(area, level, ISIS_PASSWD_TYPE_CLEARTXT, +				    passwd, snp_auth); +} + +int isis_area_passwd_hmac_md5_set(struct isis_area *area, int level, +				  const char *passwd, u_char snp_auth) +{ +	return isis_area_passwd_set(area, level, ISIS_PASSWD_TYPE_HMAC_MD5, +				    passwd, snp_auth); +} + +static void area_resign_level(struct isis_area *area, int level) +{ +	if (area->lspdb[level - 1]) { +		lsp_db_destroy(area->lspdb[level - 1]); +		area->lspdb[level - 1] = NULL; +	} +	if (area->spftree[level - 1]) { +		isis_spftree_del(area->spftree[level - 1]); +		area->spftree[level - 1] = NULL; +	} +	if (area->spftree6[level - 1]) { +		isis_spftree_del(area->spftree6[level - 1]); +		area->spftree6[level - 1] = NULL; +	} +	THREAD_TIMER_OFF(area->spf_timer[level - 1]); +	if (area->route_table[level - 1]) { +		route_table_finish(area->route_table[level - 1]); +		area->route_table[level - 1] = NULL; +	} +	if (area->route_table6[level - 1]) { +		route_table_finish(area->route_table6[level - 1]); +		area->route_table6[level - 1] = NULL; +	} + +	sched_debug( +		"ISIS (%s): Resigned from L%d - canceling LSP regeneration timer.", +		area->area_tag, level); +	THREAD_TIMER_OFF(area->t_lsp_refresh[level - 1]); +	area->lsp_regenerate_pending[level - 1] = 0; +} + +void isis_area_is_type_set(struct isis_area *area, int is_type) +{ +	struct listnode *node; +	struct isis_circuit *circuit; + +	if (isis->debugs & DEBUG_EVENTS) +		zlog_debug("ISIS-Evt (%s) system type change %s -> %s", +			   area->area_tag, circuit_t2string(area->is_type), +			   circuit_t2string(is_type)); + +	if (area->is_type == is_type) +		return; /* No change */ + +	switch (area->is_type) { +	case IS_LEVEL_1: +		if (is_type == IS_LEVEL_2) +			area_resign_level(area, IS_LEVEL_1); + +		if (area->lspdb[1] == NULL) +			area->lspdb[1] = lsp_db_init(); +		if (area->route_table[1] == NULL) +			area->route_table[1] = route_table_init(); +		if (area->route_table6[1] == NULL) +			area->route_table6[1] = route_table_init(); +		break; + +	case IS_LEVEL_1_AND_2: +		if (is_type == IS_LEVEL_1) +			area_resign_level(area, IS_LEVEL_2); +		else +			area_resign_level(area, IS_LEVEL_1); +		break; + +	case IS_LEVEL_2: +		if (is_type == IS_LEVEL_1) +			area_resign_level(area, IS_LEVEL_2); + +		if (area->lspdb[0] == NULL) +			area->lspdb[0] = lsp_db_init(); +		if (area->route_table[0] == NULL) +			area->route_table[0] = route_table_init(); +		if (area->route_table6[0] == NULL) +			area->route_table6[0] = route_table_init(); +		break; + +	default: +		break; +	} + +	area->is_type = is_type; + +	/* override circuit's is_type */ +	if (area->is_type != IS_LEVEL_1_AND_2) { +		for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) +			isis_circuit_is_type_set(circuit, is_type); +	} + +	spftree_area_init(area); + +	if (listcount(area->area_addrs) > 0) { +		if (is_type & IS_LEVEL_1) +			lsp_generate(area, IS_LEVEL_1); +		if (is_type & IS_LEVEL_2) +			lsp_generate(area, IS_LEVEL_2); +	} +	lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); + +	return;  }  void isis_area_metricstyle_set(struct isis_area *area, bool old_metric,  			       bool new_metric)  { -  if (area->oldmetric != old_metric -      || area->newmetric != new_metric) -    { -      area->oldmetric = old_metric; -      area->newmetric = new_metric; -      lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); -    } +	if (area->oldmetric != old_metric || area->newmetric != new_metric) { +		area->oldmetric = old_metric; +		area->newmetric = new_metric; +		lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); +	}  }  void isis_area_overload_bit_set(struct isis_area *area, bool overload_bit)  { -  char new_overload_bit = overload_bit ? LSPBIT_OL : 0; +	char new_overload_bit = overload_bit ? LSPBIT_OL : 0; -  if (new_overload_bit != area->overload_bit) -    { -      area->overload_bit = new_overload_bit; -      lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); -    } +	if (new_overload_bit != area->overload_bit) { +		area->overload_bit = new_overload_bit; +		lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); +	}  }  void isis_area_attached_bit_set(struct isis_area *area, bool attached_bit)  { -  char new_attached_bit = attached_bit ? LSPBIT_ATT : 0; +	char new_attached_bit = attached_bit ? LSPBIT_ATT : 0; -  if (new_attached_bit != area->attached_bit) -    { -      area->attached_bit = new_attached_bit; -      lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); -    } +	if (new_attached_bit != area->attached_bit) { +		area->attached_bit = new_attached_bit; +		lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 1); +	}  }  void isis_area_dynhostname_set(struct isis_area *area, bool dynhostname)  { -  if (area->dynhostname != dynhostname) -    { -      area->dynhostname = dynhostname; -      lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0); -    } +	if (area->dynhostname != dynhostname) { +		area->dynhostname = dynhostname; +		lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0); +	}  } -void -isis_area_max_lsp_lifetime_set(struct isis_area *area, int level, -			       uint16_t max_lsp_lifetime) +void isis_area_max_lsp_lifetime_set(struct isis_area *area, int level, +				    uint16_t max_lsp_lifetime)  { -  assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2)); +	assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2)); -  if (area->max_lsp_lifetime[level-1] == max_lsp_lifetime) -    return; +	if (area->max_lsp_lifetime[level - 1] == max_lsp_lifetime) +		return; -  area->max_lsp_lifetime[level-1] = max_lsp_lifetime; -  lsp_regenerate_schedule(area, level, 1); +	area->max_lsp_lifetime[level - 1] = max_lsp_lifetime; +	lsp_regenerate_schedule(area, level, 1);  } -void -isis_area_lsp_refresh_set(struct isis_area *area, int level, -			  uint16_t lsp_refresh) +void isis_area_lsp_refresh_set(struct isis_area *area, int level, +			       uint16_t lsp_refresh)  { -  assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2)); +	assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2)); -  if (area->lsp_refresh[level-1] == lsp_refresh) -    return; +	if (area->lsp_refresh[level - 1] == lsp_refresh) +		return; -  area->lsp_refresh[level-1] = lsp_refresh; -  lsp_regenerate_schedule(area, level, 1); +	area->lsp_refresh[level - 1] = lsp_refresh; +	lsp_regenerate_schedule(area, level, 1);  }  DEFUN (log_adj_changes, @@ -1873,11 +1827,11 @@ DEFUN (log_adj_changes,         "log-adjacency-changes",         "Log changes in adjacency state\n")  { -  VTY_DECLVAR_CONTEXT (isis_area, area); +	VTY_DECLVAR_CONTEXT(isis_area, area); -  area->log_adj_changes = 1; +	area->log_adj_changes = 1; -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  DEFUN (no_log_adj_changes, @@ -1886,376 +1840,395 @@ DEFUN (no_log_adj_changes,         NO_STR         "Stop logging changes in adjacency state\n")  { -  VTY_DECLVAR_CONTEXT (isis_area, area); +	VTY_DECLVAR_CONTEXT(isis_area, area); -  area->log_adj_changes = 0; +	area->log_adj_changes = 0; -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  /* IS-IS configuration write function */ -int -isis_config_write (struct vty *vty) -{ -  int write = 0; - -  if (isis != NULL) -    { -      struct isis_area *area; -      struct listnode *node, *node2; - -      for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area)) -      { -	/* ISIS - Area name */ -	vty_out (vty, "router isis %s%s", area->area_tag, VTY_NEWLINE); -	write++; -	/* ISIS - Net */ -	if (listcount (area->area_addrs) > 0) -	  { -	    struct area_addr *area_addr; -	    for (ALL_LIST_ELEMENTS_RO (area->area_addrs, node2, area_addr)) -	      { -		vty_out (vty, " net %s%s", -			 isonet_print (area_addr->area_addr, -				       area_addr->addr_len + ISIS_SYS_ID_LEN + -				       1), VTY_NEWLINE); -		write++; -	      } -	  } -	/* ISIS - Dynamic hostname - Defaults to true so only display if -	 * false. */ -	if (!area->dynhostname) -	  { -	    vty_out (vty, " no hostname dynamic%s", VTY_NEWLINE); -	    write++; -	  } -	/* ISIS - Metric-Style - when true displays wide */ -	if (area->newmetric) -	  { -	    if (!area->oldmetric) -	      vty_out (vty, " metric-style wide%s", VTY_NEWLINE); -	    else -	      vty_out (vty, " metric-style transition%s", VTY_NEWLINE); -	    write++; -	  } -	else -	  { -	    vty_out (vty, " metric-style narrow%s", VTY_NEWLINE); -	    write++; -	  } -	/* ISIS - overload-bit */ -	if (area->overload_bit) -	  { -	    vty_out (vty, " set-overload-bit%s", VTY_NEWLINE); -	    write++; -	  } -	/* ISIS - Area is-type (level-1-2 is default) */ -	if (area->is_type == IS_LEVEL_1) -	  { -	    vty_out (vty, " is-type level-1%s", VTY_NEWLINE); -	    write++; -	  } -	else if (area->is_type == IS_LEVEL_2) -	  { -	    vty_out (vty, " is-type level-2-only%s", VTY_NEWLINE); -	    write++; -	  } -	write += isis_redist_config_write(vty, area, AF_INET); -	write += isis_redist_config_write(vty, area, AF_INET6); -	/* ISIS - Lsp generation interval */ -	if (area->lsp_gen_interval[0] == area->lsp_gen_interval[1]) -	  { -	    if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL) -	      { -		vty_out (vty, " lsp-gen-interval %d%s", -			 area->lsp_gen_interval[0], VTY_NEWLINE); -		write++; -	      } -	  } -	else -	  { -	    if (area->lsp_gen_interval[0] != DEFAULT_MIN_LSP_GEN_INTERVAL) -	      { -		vty_out (vty, " lsp-gen-interval level-1 %d%s", -			 area->lsp_gen_interval[0], VTY_NEWLINE); -		write++; -	      } -	    if (area->lsp_gen_interval[1] != DEFAULT_MIN_LSP_GEN_INTERVAL) -	      { -		vty_out (vty, " lsp-gen-interval level-2 %d%s", -			 area->lsp_gen_interval[1], VTY_NEWLINE); -		write++; -	      } -	  } -	/* ISIS - LSP lifetime */ -	if (area->max_lsp_lifetime[0] == area->max_lsp_lifetime[1]) -	  { -	    if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME) -	      { -		vty_out (vty, " max-lsp-lifetime %u%s", area->max_lsp_lifetime[0], -			 VTY_NEWLINE); -		write++; -	      } -	  } -	else -	  { -	    if (area->max_lsp_lifetime[0] != DEFAULT_LSP_LIFETIME) -	      { -		vty_out (vty, " max-lsp-lifetime level-1 %u%s", -			 area->max_lsp_lifetime[0], VTY_NEWLINE); -		write++; -	      } -	    if (area->max_lsp_lifetime[1] != DEFAULT_LSP_LIFETIME) -	      { -		vty_out (vty, " max-lsp-lifetime level-2 %u%s", -			 area->max_lsp_lifetime[1], VTY_NEWLINE); -		write++; -	      } -	  } -	/* ISIS - LSP refresh interval */ -	if (area->lsp_refresh[0] == area->lsp_refresh[1]) -	  { -	    if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL) -	      { -		vty_out (vty, " lsp-refresh-interval %u%s", area->lsp_refresh[0], -			 VTY_NEWLINE); -		write++; -	      } -	  } -	else -	  { -	    if (area->lsp_refresh[0] != DEFAULT_MAX_LSP_GEN_INTERVAL) -	      { -		vty_out (vty, " lsp-refresh-interval level-1 %u%s", -			 area->lsp_refresh[0], VTY_NEWLINE); -		write++; -	      } -	    if (area->lsp_refresh[1] != DEFAULT_MAX_LSP_GEN_INTERVAL) -	      { -		vty_out (vty, " lsp-refresh-interval level-2 %u%s", -			 area->lsp_refresh[1], VTY_NEWLINE); -		write++; -	      } -	  } -	if (area->lsp_mtu != DEFAULT_LSP_MTU) -	  { -	    vty_out(vty, " lsp-mtu %u%s", area->lsp_mtu, VTY_NEWLINE); -	    write++; -	  } - -	/* Minimum SPF interval. */ -	if (area->min_spf_interval[0] == area->min_spf_interval[1]) -	  { -	    if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL) -	      { -		vty_out (vty, " spf-interval %d%s", -			 area->min_spf_interval[0], VTY_NEWLINE); -		write++; -	      } -	  } -	else -	  { -	    if (area->min_spf_interval[0] != MINIMUM_SPF_INTERVAL) -	      { -		vty_out (vty, " spf-interval level-1 %d%s", -			 area->min_spf_interval[0], VTY_NEWLINE); -		write++; -	      } -	    if (area->min_spf_interval[1] != MINIMUM_SPF_INTERVAL) -	      { -		vty_out (vty, " spf-interval level-2 %d%s", -			 area->min_spf_interval[1], VTY_NEWLINE); -		write++; -	      } -	  } - -	/* IETF SPF interval */ -	if (area->spf_delay_ietf[0]) -	  { -	    vty_out (vty, " spf-delay-ietf init-delay %ld short-delay %ld long-delay %ld holddown %ld time-to-learn %ld%s", -	             spf_backoff_init_delay(area->spf_delay_ietf[0]), -	             spf_backoff_short_delay(area->spf_delay_ietf[0]), -	             spf_backoff_long_delay(area->spf_delay_ietf[0]), -	             spf_backoff_holddown(area->spf_delay_ietf[0]), -	             spf_backoff_timetolearn(area->spf_delay_ietf[0]), -	             VTY_NEWLINE); -	    write++; -	  } - -	/* Authentication passwords. */ -	if (area->area_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5) -	  { -	    vty_out(vty, " area-password md5 %s", area->area_passwd.passwd); -	    if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND)) -	      { -		vty_out(vty, " authenticate snp "); -		if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV)) -		  vty_out(vty, "validate"); -		else -		  vty_out(vty, "send-only"); -	      } -	    vty_out(vty, "%s", VTY_NEWLINE); -	    write++;  -	  } -        else if (area->area_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT) -          { -	    vty_out(vty, " area-password clear %s", area->area_passwd.passwd); -	    if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_SEND)) -	      { -		vty_out(vty, " authenticate snp "); -		if (CHECK_FLAG(area->area_passwd.snp_auth, SNP_AUTH_RECV)) -		  vty_out(vty, "validate"); -		else -		  vty_out(vty, "send-only"); -	      } -	    vty_out(vty, "%s", VTY_NEWLINE); -	    write++;  -          } -	if (area->domain_passwd.type == ISIS_PASSWD_TYPE_HMAC_MD5) -	  { -            vty_out(vty, " domain-password md5 %s", -                    area->domain_passwd.passwd); -	    if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND)) -	      { -		vty_out(vty, " authenticate snp "); -		if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV)) -		  vty_out(vty, "validate"); -		else -		  vty_out(vty, "send-only"); -	      } -	    vty_out(vty, "%s", VTY_NEWLINE); -	    write++; -	  } -        else if (area->domain_passwd.type == ISIS_PASSWD_TYPE_CLEARTXT) -	  { -	    vty_out(vty, " domain-password clear %s", -                    area->domain_passwd.passwd);  -	    if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_SEND)) -	      { -		vty_out(vty, " authenticate snp "); -		if (CHECK_FLAG(area->domain_passwd.snp_auth, SNP_AUTH_RECV)) -		  vty_out(vty, "validate"); -		else -		  vty_out(vty, "send-only"); -	      } -	    vty_out(vty, "%s", VTY_NEWLINE); -	    write++; -	  } - -	if (area->log_adj_changes) -	  { -	    vty_out (vty, " log-adjacency-changes%s", VTY_NEWLINE); -	    write++; -	  } - -      } -    isis_mpls_te_config_write_router(vty); -    } - -  return write; -} - -struct cmd_node isis_node = { -  ISIS_NODE, -  "%s(config-router)# ", -  1 -}; - -void -isis_init () -{ -  /* Install IS-IS top node */ -  install_node (&isis_node, isis_config_write); - -  install_element (VIEW_NODE, &show_isis_summary_cmd); - -  install_element (VIEW_NODE, &show_isis_spf_ietf_cmd); - -  install_element (VIEW_NODE, &show_isis_interface_cmd); -  install_element (VIEW_NODE, &show_isis_interface_detail_cmd); -  install_element (VIEW_NODE, &show_isis_interface_arg_cmd); - -  install_element (VIEW_NODE, &show_isis_neighbor_cmd); -  install_element (VIEW_NODE, &show_isis_neighbor_detail_cmd); -  install_element (VIEW_NODE, &show_isis_neighbor_arg_cmd); -  install_element (VIEW_NODE, &clear_isis_neighbor_cmd); -  install_element (VIEW_NODE, &clear_isis_neighbor_arg_cmd); - -  install_element (VIEW_NODE, &show_hostname_cmd); -  install_element (VIEW_NODE, &show_database_cmd); - -  install_element (ENABLE_NODE, &show_debugging_isis_cmd); - -  install_node (&debug_node, config_write_debug); - -  install_element (ENABLE_NODE, &debug_isis_adj_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_adj_cmd); -  install_element (ENABLE_NODE, &debug_isis_csum_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_csum_cmd); -  install_element (ENABLE_NODE, &debug_isis_lupd_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_lupd_cmd); -  install_element (ENABLE_NODE, &debug_isis_err_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_err_cmd); -  install_element (ENABLE_NODE, &debug_isis_snp_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_snp_cmd); -  install_element (ENABLE_NODE, &debug_isis_upd_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_upd_cmd); -  install_element (ENABLE_NODE, &debug_isis_spfevents_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_spfevents_cmd); -  install_element (ENABLE_NODE, &debug_isis_spfstats_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_spfstats_cmd); -  install_element (ENABLE_NODE, &debug_isis_spftrigg_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_spftrigg_cmd); -  install_element (ENABLE_NODE, &debug_isis_rtevents_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_rtevents_cmd); -  install_element (ENABLE_NODE, &debug_isis_events_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_events_cmd); -  install_element (ENABLE_NODE, &debug_isis_packet_dump_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_packet_dump_cmd); -  install_element (ENABLE_NODE, &debug_isis_lsp_gen_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_lsp_gen_cmd); -  install_element (ENABLE_NODE, &debug_isis_lsp_sched_cmd); -  install_element (ENABLE_NODE, &no_debug_isis_lsp_sched_cmd); - -  install_element (CONFIG_NODE, &debug_isis_adj_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_adj_cmd); -  install_element (CONFIG_NODE, &debug_isis_csum_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_csum_cmd); -  install_element (CONFIG_NODE, &debug_isis_lupd_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_lupd_cmd); -  install_element (CONFIG_NODE, &debug_isis_err_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_err_cmd); -  install_element (CONFIG_NODE, &debug_isis_snp_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_snp_cmd); -  install_element (CONFIG_NODE, &debug_isis_upd_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_upd_cmd); -  install_element (CONFIG_NODE, &debug_isis_spfevents_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_spfevents_cmd); -  install_element (CONFIG_NODE, &debug_isis_spfstats_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_spfstats_cmd); -  install_element (CONFIG_NODE, &debug_isis_spftrigg_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_spftrigg_cmd); -  install_element (CONFIG_NODE, &debug_isis_rtevents_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_rtevents_cmd); -  install_element (CONFIG_NODE, &debug_isis_events_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_events_cmd); -  install_element (CONFIG_NODE, &debug_isis_packet_dump_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_packet_dump_cmd); -  install_element (CONFIG_NODE, &debug_isis_lsp_gen_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_lsp_gen_cmd); -  install_element (CONFIG_NODE, &debug_isis_lsp_sched_cmd); -  install_element (CONFIG_NODE, &no_debug_isis_lsp_sched_cmd); - -  install_element (CONFIG_NODE, &router_isis_cmd); -  install_element (CONFIG_NODE, &no_router_isis_cmd); - -  install_default (ISIS_NODE); - -  install_element (ISIS_NODE, &net_cmd); -  install_element (ISIS_NODE, &no_net_cmd); - -  install_element (ISIS_NODE, &log_adj_changes_cmd); -  install_element (ISIS_NODE, &no_log_adj_changes_cmd); - -  spf_backoff_cmd_init(); +int isis_config_write(struct vty *vty) +{ +	int write = 0; + +	if (isis != NULL) { +		struct isis_area *area; +		struct listnode *node, *node2; + +		for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area)) { +			/* ISIS - Area name */ +			vty_out(vty, "router isis %s%s", area->area_tag, +				VTY_NEWLINE); +			write++; +			/* ISIS - Net */ +			if (listcount(area->area_addrs) > 0) { +				struct area_addr *area_addr; +				for (ALL_LIST_ELEMENTS_RO(area->area_addrs, +							  node2, area_addr)) { +					vty_out(vty, " net %s%s", +						isonet_print( +							area_addr->area_addr, +							area_addr->addr_len +								+ ISIS_SYS_ID_LEN +								+ 1), +						VTY_NEWLINE); +					write++; +				} +			} +			/* ISIS - Dynamic hostname - Defaults to true so only +			 * display if +			 * false. */ +			if (!area->dynhostname) { +				vty_out(vty, " no hostname dynamic%s", +					VTY_NEWLINE); +				write++; +			} +			/* ISIS - Metric-Style - when true displays wide */ +			if (area->newmetric) { +				if (!area->oldmetric) +					vty_out(vty, " metric-style wide%s", +						VTY_NEWLINE); +				else +					vty_out(vty, +						" metric-style transition%s", +						VTY_NEWLINE); +				write++; +			} else { +				vty_out(vty, " metric-style narrow%s", +					VTY_NEWLINE); +				write++; +			} +			/* ISIS - overload-bit */ +			if (area->overload_bit) { +				vty_out(vty, " set-overload-bit%s", +					VTY_NEWLINE); +				write++; +			} +			/* ISIS - Area is-type (level-1-2 is default) */ +			if (area->is_type == IS_LEVEL_1) { +				vty_out(vty, " is-type level-1%s", VTY_NEWLINE); +				write++; +			} else if (area->is_type == IS_LEVEL_2) { +				vty_out(vty, " is-type level-2-only%s", +					VTY_NEWLINE); +				write++; +			} +			write += isis_redist_config_write(vty, area, AF_INET); +			write += isis_redist_config_write(vty, area, AF_INET6); +			/* ISIS - Lsp generation interval */ +			if (area->lsp_gen_interval[0] +			    == area->lsp_gen_interval[1]) { +				if (area->lsp_gen_interval[0] +				    != DEFAULT_MIN_LSP_GEN_INTERVAL) { +					vty_out(vty, " lsp-gen-interval %d%s", +						area->lsp_gen_interval[0], +						VTY_NEWLINE); +					write++; +				} +			} else { +				if (area->lsp_gen_interval[0] +				    != DEFAULT_MIN_LSP_GEN_INTERVAL) { +					vty_out(vty, +						" lsp-gen-interval level-1 %d%s", +						area->lsp_gen_interval[0], +						VTY_NEWLINE); +					write++; +				} +				if (area->lsp_gen_interval[1] +				    != DEFAULT_MIN_LSP_GEN_INTERVAL) { +					vty_out(vty, +						" lsp-gen-interval level-2 %d%s", +						area->lsp_gen_interval[1], +						VTY_NEWLINE); +					write++; +				} +			} +			/* ISIS - LSP lifetime */ +			if (area->max_lsp_lifetime[0] +			    == area->max_lsp_lifetime[1]) { +				if (area->max_lsp_lifetime[0] +				    != DEFAULT_LSP_LIFETIME) { +					vty_out(vty, " max-lsp-lifetime %u%s", +						area->max_lsp_lifetime[0], +						VTY_NEWLINE); +					write++; +				} +			} else { +				if (area->max_lsp_lifetime[0] +				    != DEFAULT_LSP_LIFETIME) { +					vty_out(vty, +						" max-lsp-lifetime level-1 %u%s", +						area->max_lsp_lifetime[0], +						VTY_NEWLINE); +					write++; +				} +				if (area->max_lsp_lifetime[1] +				    != DEFAULT_LSP_LIFETIME) { +					vty_out(vty, +						" max-lsp-lifetime level-2 %u%s", +						area->max_lsp_lifetime[1], +						VTY_NEWLINE); +					write++; +				} +			} +			/* ISIS - LSP refresh interval */ +			if (area->lsp_refresh[0] == area->lsp_refresh[1]) { +				if (area->lsp_refresh[0] +				    != DEFAULT_MAX_LSP_GEN_INTERVAL) { +					vty_out(vty, +						" lsp-refresh-interval %u%s", +						area->lsp_refresh[0], +						VTY_NEWLINE); +					write++; +				} +			} else { +				if (area->lsp_refresh[0] +				    != DEFAULT_MAX_LSP_GEN_INTERVAL) { +					vty_out(vty, +						" lsp-refresh-interval level-1 %u%s", +						area->lsp_refresh[0], +						VTY_NEWLINE); +					write++; +				} +				if (area->lsp_refresh[1] +				    != DEFAULT_MAX_LSP_GEN_INTERVAL) { +					vty_out(vty, +						" lsp-refresh-interval level-2 %u%s", +						area->lsp_refresh[1], +						VTY_NEWLINE); +					write++; +				} +			} +			if (area->lsp_mtu != DEFAULT_LSP_MTU) { +				vty_out(vty, " lsp-mtu %u%s", area->lsp_mtu, +					VTY_NEWLINE); +				write++; +			} + +			/* Minimum SPF interval. */ +			if (area->min_spf_interval[0] +			    == area->min_spf_interval[1]) { +				if (area->min_spf_interval[0] +				    != MINIMUM_SPF_INTERVAL) { +					vty_out(vty, " spf-interval %d%s", +						area->min_spf_interval[0], +						VTY_NEWLINE); +					write++; +				} +			} else { +				if (area->min_spf_interval[0] +				    != MINIMUM_SPF_INTERVAL) { +					vty_out(vty, +						" spf-interval level-1 %d%s", +						area->min_spf_interval[0], +						VTY_NEWLINE); +					write++; +				} +				if (area->min_spf_interval[1] +				    != MINIMUM_SPF_INTERVAL) { +					vty_out(vty, +						" spf-interval level-2 %d%s", +						area->min_spf_interval[1], +						VTY_NEWLINE); +					write++; +				} +			} + +			/* IETF SPF interval */ +			if (area->spf_delay_ietf[0]) { +				vty_out(vty, +					" spf-delay-ietf init-delay %ld short-delay %ld long-delay %ld holddown %ld time-to-learn %ld%s", +					spf_backoff_init_delay( +						area->spf_delay_ietf[0]), +					spf_backoff_short_delay( +						area->spf_delay_ietf[0]), +					spf_backoff_long_delay( +						area->spf_delay_ietf[0]), +					spf_backoff_holddown( +						area->spf_delay_ietf[0]), +					spf_backoff_timetolearn( +						area->spf_delay_ietf[0]), +					VTY_NEWLINE); +				write++; +			} + +			/* Authentication passwords. */ +			if (area->area_passwd.type +			    == ISIS_PASSWD_TYPE_HMAC_MD5) { +				vty_out(vty, " area-password md5 %s", +					area->area_passwd.passwd); +				if (CHECK_FLAG(area->area_passwd.snp_auth, +					       SNP_AUTH_SEND)) { +					vty_out(vty, " authenticate snp "); +					if (CHECK_FLAG( +						    area->area_passwd.snp_auth, +						    SNP_AUTH_RECV)) +						vty_out(vty, "validate"); +					else +						vty_out(vty, "send-only"); +				} +				vty_out(vty, "%s", VTY_NEWLINE); +				write++; +			} else if (area->area_passwd.type +				   == ISIS_PASSWD_TYPE_CLEARTXT) { +				vty_out(vty, " area-password clear %s", +					area->area_passwd.passwd); +				if (CHECK_FLAG(area->area_passwd.snp_auth, +					       SNP_AUTH_SEND)) { +					vty_out(vty, " authenticate snp "); +					if (CHECK_FLAG( +						    area->area_passwd.snp_auth, +						    SNP_AUTH_RECV)) +						vty_out(vty, "validate"); +					else +						vty_out(vty, "send-only"); +				} +				vty_out(vty, "%s", VTY_NEWLINE); +				write++; +			} +			if (area->domain_passwd.type +			    == ISIS_PASSWD_TYPE_HMAC_MD5) { +				vty_out(vty, " domain-password md5 %s", +					area->domain_passwd.passwd); +				if (CHECK_FLAG(area->domain_passwd.snp_auth, +					       SNP_AUTH_SEND)) { +					vty_out(vty, " authenticate snp "); +					if (CHECK_FLAG(area->domain_passwd +							       .snp_auth, +						       SNP_AUTH_RECV)) +						vty_out(vty, "validate"); +					else +						vty_out(vty, "send-only"); +				} +				vty_out(vty, "%s", VTY_NEWLINE); +				write++; +			} else if (area->domain_passwd.type +				   == ISIS_PASSWD_TYPE_CLEARTXT) { +				vty_out(vty, " domain-password clear %s", +					area->domain_passwd.passwd); +				if (CHECK_FLAG(area->domain_passwd.snp_auth, +					       SNP_AUTH_SEND)) { +					vty_out(vty, " authenticate snp "); +					if (CHECK_FLAG(area->domain_passwd +							       .snp_auth, +						       SNP_AUTH_RECV)) +						vty_out(vty, "validate"); +					else +						vty_out(vty, "send-only"); +				} +				vty_out(vty, "%s", VTY_NEWLINE); +				write++; +			} + +			if (area->log_adj_changes) { +				vty_out(vty, " log-adjacency-changes%s", +					VTY_NEWLINE); +				write++; +			} +		} +		isis_mpls_te_config_write_router(vty); +	} + +	return write; +} + +struct cmd_node isis_node = {ISIS_NODE, "%s(config-router)# ", 1}; + +void isis_init() +{ +	/* Install IS-IS top node */ +	install_node(&isis_node, isis_config_write); + +	install_element(VIEW_NODE, &show_isis_summary_cmd); + +	install_element(VIEW_NODE, &show_isis_spf_ietf_cmd); + +	install_element(VIEW_NODE, &show_isis_interface_cmd); +	install_element(VIEW_NODE, &show_isis_interface_detail_cmd); +	install_element(VIEW_NODE, &show_isis_interface_arg_cmd); + +	install_element(VIEW_NODE, &show_isis_neighbor_cmd); +	install_element(VIEW_NODE, &show_isis_neighbor_detail_cmd); +	install_element(VIEW_NODE, &show_isis_neighbor_arg_cmd); +	install_element(VIEW_NODE, &clear_isis_neighbor_cmd); +	install_element(VIEW_NODE, &clear_isis_neighbor_arg_cmd); + +	install_element(VIEW_NODE, &show_hostname_cmd); +	install_element(VIEW_NODE, &show_database_cmd); + +	install_element(ENABLE_NODE, &show_debugging_isis_cmd); + +	install_node(&debug_node, config_write_debug); + +	install_element(ENABLE_NODE, &debug_isis_adj_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_adj_cmd); +	install_element(ENABLE_NODE, &debug_isis_csum_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_csum_cmd); +	install_element(ENABLE_NODE, &debug_isis_lupd_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_lupd_cmd); +	install_element(ENABLE_NODE, &debug_isis_err_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_err_cmd); +	install_element(ENABLE_NODE, &debug_isis_snp_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_snp_cmd); +	install_element(ENABLE_NODE, &debug_isis_upd_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_upd_cmd); +	install_element(ENABLE_NODE, &debug_isis_spfevents_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_spfevents_cmd); +	install_element(ENABLE_NODE, &debug_isis_spfstats_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_spfstats_cmd); +	install_element(ENABLE_NODE, &debug_isis_spftrigg_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_spftrigg_cmd); +	install_element(ENABLE_NODE, &debug_isis_rtevents_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_rtevents_cmd); +	install_element(ENABLE_NODE, &debug_isis_events_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_events_cmd); +	install_element(ENABLE_NODE, &debug_isis_packet_dump_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_packet_dump_cmd); +	install_element(ENABLE_NODE, &debug_isis_lsp_gen_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_lsp_gen_cmd); +	install_element(ENABLE_NODE, &debug_isis_lsp_sched_cmd); +	install_element(ENABLE_NODE, &no_debug_isis_lsp_sched_cmd); + +	install_element(CONFIG_NODE, &debug_isis_adj_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_adj_cmd); +	install_element(CONFIG_NODE, &debug_isis_csum_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_csum_cmd); +	install_element(CONFIG_NODE, &debug_isis_lupd_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_lupd_cmd); +	install_element(CONFIG_NODE, &debug_isis_err_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_err_cmd); +	install_element(CONFIG_NODE, &debug_isis_snp_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_snp_cmd); +	install_element(CONFIG_NODE, &debug_isis_upd_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_upd_cmd); +	install_element(CONFIG_NODE, &debug_isis_spfevents_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_spfevents_cmd); +	install_element(CONFIG_NODE, &debug_isis_spfstats_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_spfstats_cmd); +	install_element(CONFIG_NODE, &debug_isis_spftrigg_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_spftrigg_cmd); +	install_element(CONFIG_NODE, &debug_isis_rtevents_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_rtevents_cmd); +	install_element(CONFIG_NODE, &debug_isis_events_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_events_cmd); +	install_element(CONFIG_NODE, &debug_isis_packet_dump_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_packet_dump_cmd); +	install_element(CONFIG_NODE, &debug_isis_lsp_gen_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_lsp_gen_cmd); +	install_element(CONFIG_NODE, &debug_isis_lsp_sched_cmd); +	install_element(CONFIG_NODE, &no_debug_isis_lsp_sched_cmd); + +	install_element(CONFIG_NODE, &router_isis_cmd); +	install_element(CONFIG_NODE, &no_router_isis_cmd); + +	install_default(ISIS_NODE); + +	install_element(ISIS_NODE, &net_cmd); +	install_element(ISIS_NODE, &no_net_cmd); + +	install_element(ISIS_NODE, &log_adj_changes_cmd); +	install_element(ISIS_NODE, &no_log_adj_changes_cmd); + +	spf_backoff_cmd_init();  }  | 
