diff options
Diffstat (limited to 'isisd')
| -rw-r--r-- | isisd/ChangeLog | 12 | ||||
| -rw-r--r-- | isisd/isis_lsp.c | 221 | ||||
| -rw-r--r-- | isisd/isis_lsp.h | 2 | ||||
| -rw-r--r-- | isisd/isisd.c | 115 | ||||
| -rw-r--r-- | isisd/isisd.h | 8 | 
5 files changed, 216 insertions, 142 deletions
| diff --git a/isisd/ChangeLog b/isisd/ChangeLog index d9e65bbd..c245d096 100644 --- a/isisd/ChangeLog +++ b/isisd/ChangeLog @@ -1,3 +1,15 @@ +2005-09-19 Hasso Tepper <hasso at quagga.net> + +	* isis_lsp.h: Added backpointer to the area from LSP. For now it's used +	  only in generated topology LSPs. +	* isisd.[ch]: Cleanup CLI commands related to topology generation and +	  added command to specify base fo dynamic hostname for topology LSPs. +	* isis_lsp.c: Rewrite almost all code related to generation topology +	  LSPs (top_lsp_refresh(), generate_topology_lsps() and +	  build_topology_lsp_data() functions). Topology is connected to own +	  LSP now (lsp_build_nonpseudo). Commented out lsppdu_realloc +	  functions, it's not used any more hopefully. +  2005-09-18 Hasso Tepper <hasso at quagga.net>  	* isis_lsp.c (lsp_update): Fix previous commit - manipulate the right diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index a294bc8f..26c46a2f 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -914,6 +914,7 @@ lsp_print_all (struct vty *vty, dict_t * lspdb, char detail, char dynhost)    return lsp_count;  } +#if 0  /* this function reallocate memory to an lsp pdu, with an additional   * size of memory, it scans the lsp and moves all pointers the   * way they should */ @@ -939,6 +940,7 @@ lsppdu_realloc (struct isis_lsp * lsp, int memorytype, int size)    return STREAM_DATA (lsp->pdu) + (lsp->lsp_header->pdu_len - size);  #endif /* LSP_MEMORY_PREASSIGN */  } +#endif  #if 0				/* Saving the old one just in case :) */  /* @@ -1356,6 +1358,28 @@ lsp_build_nonpseudo (struct isis_lsp *lsp, struct isis_area *area)        add_tlv (IPV4_ADDR, IPV4_MAX_BYTELEN, (u_char *) &routerid->s_addr,  	       lsp->pdu);      } + +#ifdef TOPOLOGY_GENERATE +  /* If topology exists (and we create topology for level 1 only), create +   * (hardcoded) link to topology. */ +  if (area->topology && level == 1) +    { +      if (tlv_data.is_neighs == NULL) +        tlv_data.is_neighs = list_new (); +      is_neigh = XMALLOC (MTYPE_ISIS_TLV, sizeof (struct is_neigh)); +      memset (is_neigh, 0, sizeof (struct is_neigh)); + +      memcpy (&is_neigh->neigh_id, area->topology_baseis, ISIS_SYS_ID_LEN); +      is_neigh->neigh_id[ISIS_SYS_ID_LEN - 1] = (1 & 0xFF); +      is_neigh->neigh_id[ISIS_SYS_ID_LEN - 2] = ((1 >> 8) & 0xFF); +      is_neigh->metrics.metric_default = 0x01; +      is_neigh->metrics.metric_delay = METRICS_UNSUPPORTED; +      is_neigh->metrics.metric_expense = METRICS_UNSUPPORTED; +      is_neigh->metrics.metric_error = METRICS_UNSUPPORTED; +      listnode_add (tlv_data.is_neighs, is_neigh); +    } +#endif /* TOPOLOGY_GENERATE */ +    /*     * Then build lists of tlvs related to circuits     */ @@ -2156,7 +2180,10 @@ lsp_tick (struct thread *thread)  			      lsp->level,  			      rawlspid_print (lsp->lsp_header->lsp_id),  			      ntohl (lsp->lsp_header->seq_num)); - +#ifdef TOPOLOGY_GENERATE +		  if (lsp->from_topology) +		    THREAD_TIMER_OFF (lsp->t_lsp_top_ref); +#endif /* TOPOLOGY_GENERATE */  		  lsp_destroy (lsp);  		  dict_delete (area->lspdb[level], dnode);  		} @@ -2266,15 +2293,14 @@ static int  top_lsp_refresh (struct thread *thread)  {    struct isis_lsp *lsp; +  unsigned long ref_time;    lsp = THREAD_ARG (thread);    assert (lsp);    lsp->t_lsp_top_ref = NULL; -  lsp->lsp_header->rem_lifetime = -    htons (isis_jitter (MAX_AGE, MAX_AGE_JITTER)); -  lsp->lsp_header->seq_num = htonl (ntohl (lsp->lsp_header->seq_num) + 1); +  lsp_seqnum_update (lsp);    ISIS_FLAGS_SET_ALL (lsp->SRMflags);    if (isis->debugs & DEBUG_UPDATE_PACKETS) @@ -2282,12 +2308,14 @@ top_lsp_refresh (struct thread *thread)        zlog_debug ("ISIS-Upd (): refreshing Topology L1 %s",  		  rawlspid_print (lsp->lsp_header->lsp_id));      } +  lsp->lsp_header->rem_lifetime = +    htons (isis_jitter (lsp->area->max_lsp_lifetime[0], MAX_AGE_JITTER)); + +  ref_time = lsp->area->lsp_refresh[0] > MAX_LSP_GEN_INTERVAL ? +    MAX_LSP_GEN_INTERVAL : lsp->area->lsp_refresh[0]; -  /* time to calculate our checksum */ -  iso_csum_create (STREAM_DATA (lsp->pdu) + 12, -		   ntohs (lsp->lsp_header->pdu_len) - 12, 12);    THREAD_TIMER_ON (master, lsp->t_lsp_top_ref, top_lsp_refresh, lsp, -		   isis_jitter (MAX_LSP_GEN_INTERVAL, MAX_LSP_GEN_JITTER)); +		   isis_jitter (ref_time, MAX_LSP_GEN_JITTER));    return ISIS_OK;  } @@ -2300,6 +2328,7 @@ generate_topology_lsps (struct isis_area *area)    struct arc *arc;    u_char lspid[ISIS_SYS_ID_LEN + 2];    struct isis_lsp *lsp; +  unsigned long ref_time;    /* first we find the maximal node */    for (ALL_LIST_ELEMENTS_RO (area->topology, node, arc)) @@ -2319,21 +2348,24 @@ generate_topology_lsps (struct isis_area *area)        lspid[ISIS_SYS_ID_LEN - 2] = ((i >> 8) & 0xFF);        lsp = lsp_new (lspid, isis_jitter (area->max_lsp_lifetime[0], -					 MAX_AGE_JITTER), 1, IS_LEVEL_1, 0, -		     1); +		     MAX_AGE_JITTER), 1, IS_LEVEL_1, 0, 1); +      if (!lsp) +	return;        lsp->from_topology = 1; -      /* creating data based on topology */ +      lsp->area = area; + +      /* Creating LSP data based on topology info. */        build_topology_lsp_data (lsp, area, i); -      /* time to calculate our checksum */ -      iso_csum_create (STREAM_DATA (lsp->pdu) + 12, -		       ntohs (lsp->lsp_header->pdu_len) - 12, 12); -      THREAD_TIMER_ON (master, lsp->t_lsp_top_ref, top_lsp_refresh, lsp, -		       isis_jitter (MAX_LSP_GEN_INTERVAL, -				    MAX_LSP_GEN_JITTER)); +      /* Checksum is also calculated here. */ +      lsp_seqnum_update (lsp); +      ref_time = area->lsp_refresh[0] > MAX_LSP_GEN_INTERVAL ? +	MAX_LSP_GEN_INTERVAL : area->lsp_refresh[0]; + +      THREAD_TIMER_ON (master, lsp->t_lsp_top_ref, top_lsp_refresh, lsp, +		       isis_jitter (ref_time, MAX_LSP_GEN_JITTER));        ISIS_FLAGS_SET_ALL (lsp->SRMflags);        lsp_insert (lsp, area->lspdb[0]); -      }  } @@ -2364,100 +2396,99 @@ build_topology_lsp_data (struct isis_lsp *lsp, struct isis_area *area,  {    struct listnode *node, *nnode;    struct arc *arc; -  u_char *tlv_ptr;    struct is_neigh *is_neigh; -  int to_lsp = 0;    char buff[200]; +  struct tlvs tlv_data; +  struct isis_lsp *lsp0 = lsp; -  /* add our nlpids */ -  /* the 2 is for the TL plus 1 for the nlpid */ -  tlv_ptr = lsppdu_realloc (lsp, MTYPE_ISIS_TLV, 3); -  *tlv_ptr = PROTOCOLS_SUPPORTED;	/* Type */ -  *(tlv_ptr + 1) = 1;		/* one protocol */ -  *(tlv_ptr + 2) = NLPID_IP; -  lsp->tlv_data.nlpids = (struct nlpids *) (tlv_ptr + 1); +  /* Add area addresses. FIXME: Is it needed at all? */ +  if (lsp->tlv_data.area_addrs == NULL) +    lsp->tlv_data.area_addrs = list_new (); +  list_add_list (lsp->tlv_data.area_addrs, area->area_addrs); -  /* first, lets add the tops */ -  /* the 2 is for the TL plus 1 for the virtual field */ -  tlv_ptr = lsppdu_realloc (lsp, MTYPE_ISIS_TLV, 3); -  *tlv_ptr = IS_NEIGHBOURS;	/* Type */ -  *(tlv_ptr + 1) = 1;		/* this is the virtual char len */ -  *(tlv_ptr + 2) = 0;		/* virtual is zero */ -  lsp->tlv_data.is_neighs = list_new ();	/* new list of is_neighbours */ +  if (lsp->tlv_data.nlpids == NULL) +    lsp->tlv_data.nlpids = XMALLOC (MTYPE_ISIS_TLV, sizeof (struct nlpids)); +  lsp->tlv_data.nlpids->count = 1; +  lsp->tlv_data.nlpids->nlpids[0] = NLPID_IP; + +  if (area->dynhostname) +    { +      lsp->tlv_data.hostname = XMALLOC (MTYPE_ISIS_TLV, +					sizeof (struct hostname)); +      memset (buff, 0x00, 200); +      sprintf (buff, "%s%d", area->topology_basedynh ? area->topology_basedynh : +	       "feedme", lsp_top_num); +      memcpy (lsp->tlv_data.hostname->name, buff, strlen (buff)); +      lsp->tlv_data.hostname->namelen = strlen (buff); +    } -  /* add reachability for this IS for simulated 1 */ +  if (lsp->tlv_data.nlpids) +    tlv_add_nlpid (lsp->tlv_data.nlpids, lsp->pdu); +  if (lsp->tlv_data.hostname) +    tlv_add_dynamic_hostname (lsp->tlv_data.hostname, lsp->pdu); +  if (lsp->tlv_data.area_addrs && listcount (lsp->tlv_data.area_addrs) > 0) +    tlv_add_area_addrs (lsp->tlv_data.area_addrs, lsp->pdu); + +  memset (&tlv_data, 0, sizeof (struct tlvs)); +  if (tlv_data.is_neighs == NULL) +    tlv_data.is_neighs = list_new (); + +  /* Add reachability for this IS for simulated 1. */    if (lsp_top_num == 1)      { -      /* assign space for the is_neigh at the pdu end */ -      is_neigh = (struct is_neigh *) lsppdu_realloc (lsp, MTYPE_ISIS_TLV, -						     sizeof (struct -							     is_neigh)); -      /* add this node to our list */ -      listnode_add (lsp->tlv_data.is_neighs, is_neigh); +      is_neigh = XMALLOC (MTYPE_ISIS_TLV, sizeof (struct is_neigh)); +      memset (is_neigh, 0, sizeof (struct is_neigh)); +        memcpy (&is_neigh->neigh_id, isis->sysid, ISIS_SYS_ID_LEN);        LSP_PSEUDO_ID (is_neigh->neigh_id) = 0x00; -      is_neigh->metrics.metric_default = 0x00;	/* no special reason */ +      /* Metric MUST NOT be 0, unless it's not alias TLV. */ +      is_neigh->metrics.metric_default = 0x01;        is_neigh->metrics.metric_delay = METRICS_UNSUPPORTED;        is_neigh->metrics.metric_expense = METRICS_UNSUPPORTED;        is_neigh->metrics.metric_error = METRICS_UNSUPPORTED; -      /* don't forget the length */ -      *(tlv_ptr + 1) += IS_NEIGHBOURS_LEN;	/* the -1 is the virtual */ -      /* no need to check for fragging here, it is a lonely is_reach */ +      listnode_add (tlv_data.is_neighs, is_neigh);      } -  /* addding is reachabilities */ +  /* Add IS reachabilities. */    for (ALL_LIST_ELEMENTS (area->topology, node, nnode, arc)) -  { -    if ((arc->from_node == lsp_top_num) || (arc->to_node == lsp_top_num)) -      { -	if (arc->to_node == lsp_top_num) -	  to_lsp = arc->from_node; -	if (arc->from_node == lsp_top_num) -	  to_lsp = arc->to_node; - -	/* if the length here is about to cross the FF limit, we reTLV */ -	if (*(tlv_ptr + 1) >= (0xFF - IS_NEIGHBOURS_LEN)) -	  { -	    /* retlv */ -	    /* the 2 is for the TL plus 1 for the virtual field */ -	    tlv_ptr = lsppdu_realloc (lsp, MTYPE_ISIS_TLV, 3); -	    *tlv_ptr = IS_NEIGHBOURS;	/* Type */ -	    *(tlv_ptr + 1) = 1;	/* this is the virtual char len */ -	    *(tlv_ptr + 2) = 0;	/* virtual is zero */ -	  } -	/* doing this here assures us that we won't add an "empty" tlv */ -	/* assign space for the is_neigh at the pdu end */ -	is_neigh = (struct is_neigh *) lsppdu_realloc (lsp, MTYPE_ISIS_TLV, -						       sizeof (struct -							       is_neigh)); -	/* add this node to our list */ -	listnode_add (lsp->tlv_data.is_neighs, is_neigh); -	memcpy (&is_neigh->neigh_id, area->topology_baseis, ISIS_SYS_ID_LEN); -	LSP_PSEUDO_ID (is_neigh->neigh_id) = 0x00; -	is_neigh->neigh_id[ISIS_SYS_ID_LEN - 1] = (to_lsp & 0xFF); -	is_neigh->neigh_id[ISIS_SYS_ID_LEN - 2] = ((to_lsp >> 8) & 0xFF); -	is_neigh->metrics.metric_default = arc->distance; -	is_neigh->metrics.metric_delay = METRICS_UNSUPPORTED; -	is_neigh->metrics.metric_expense = METRICS_UNSUPPORTED; -	is_neigh->metrics.metric_error = METRICS_UNSUPPORTED; -	/* don't forget the length */ -	*(tlv_ptr + 1) += IS_NEIGHBOURS_LEN;	/* the -1 is the virtual */ -      } -  } +    { +      int to_lsp = 0; +       +      if ((lsp_top_num != arc->from_node) && (lsp_top_num != arc->to_node)) +	continue; -  /* adding dynamic hostname if needed */ -  if (area->dynhostname) +      if (lsp_top_num == arc->from_node) +	to_lsp = arc->to_node; +      else +	to_lsp = arc->from_node; + +      is_neigh = XMALLOC (MTYPE_ISIS_TLV, sizeof (struct is_neigh)); +      memset (is_neigh, 0, sizeof (struct is_neigh)); + +      memcpy (&is_neigh->neigh_id, area->topology_baseis, ISIS_SYS_ID_LEN); +      is_neigh->neigh_id[ISIS_SYS_ID_LEN - 1] = (to_lsp & 0xFF); +      is_neigh->neigh_id[ISIS_SYS_ID_LEN - 2] = ((to_lsp >> 8) & 0xFF); +      is_neigh->metrics.metric_default = arc->distance; +      is_neigh->metrics.metric_delay = METRICS_UNSUPPORTED; +      is_neigh->metrics.metric_expense = METRICS_UNSUPPORTED; +      is_neigh->metrics.metric_error = METRICS_UNSUPPORTED; +      listnode_add (tlv_data.is_neighs, is_neigh); +    } + +  while (tlv_data.is_neighs && listcount (tlv_data.is_neighs))      { -      memset (buff, 0x00, 200); -      sprintf (buff, "feedme%d", lsp_top_num); -      /* the 2 is for the TL */ -      tlv_ptr = lsppdu_realloc (lsp, MTYPE_ISIS_TLV, 2); -      *tlv_ptr = DYNAMIC_HOSTNAME;	/* Type */ -      *(tlv_ptr + 1) = strlen (buff);	/* Length */ -      /* the -1 is to fit the length in the struct */ -      lsp->tlv_data.hostname = (struct hostname *) -	(lsppdu_realloc (lsp, MTYPE_ISIS_TLV, strlen (buff)) - 1); -      memcpy (lsp->tlv_data.hostname->name, buff, strlen (buff)); +      if (lsp->tlv_data.is_neighs == NULL) +	lsp->tlv_data.is_neighs = list_new (); +      lsp_tlv_fit (lsp, &tlv_data.is_neighs, +		   &lsp->tlv_data.is_neighs, +		   IS_NEIGHBOURS_LEN, area->lsp_frag_threshold, +		   tlv_add_is_neighs); +      if (tlv_data.is_neighs && listcount (tlv_data.is_neighs)) +        lsp = lsp_next_frag (LSP_FRAGMENT (lsp->lsp_header->lsp_id) + 1, +			     lsp0, area, IS_LEVEL_1);      } + +  free_tlvs (&tlv_data); +  return;  }  #endif /* TOPOLOGY_GENERATE */ diff --git a/isisd/isis_lsp.h b/isisd/isis_lsp.h index fb6f1d82..adbde78e 100644 --- a/isisd/isis_lsp.h +++ b/isisd/isis_lsp.h @@ -59,6 +59,8 @@ struct isis_lsp    /* used for 60 second counting when rem_lifetime is zero */    int age_out;    struct isis_adjacency *adj; +  /* FIXME: For now only topology LSP's use this. Is it helpful for others? */ +  struct isis_area *area;    struct tlvs tlv_data;		/* Simplifies TLV access */  }; diff --git a/isisd/isisd.c b/isisd/isisd.c index a8d6950a..1f0167bb 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -20,7 +20,6 @@   * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.   */ -#include <string.h>  #include <zebra.h>  #include "thread.h" @@ -856,7 +855,7 @@ DEFUN (debug_isis_events,         "debug isis events",         DEBUG_STR         "IS-IS information\n" -       "IS-IS  Events\n") +       "IS-IS Events\n")  {    isis->debugs |= DEBUG_EVENTS;    print_debug (vty, DEBUG_EVENTS, 1); @@ -1555,9 +1554,9 @@ DEFUN (topology_generate_grid,         topology_generate_grid_cmd,         "topology generate grid <1-100> <1-100> <1-65000> [param] [param] "         "[param]", -       "Topology for IS-IS\n" -       "Topology for IS-IS\n" -       "Topology grid for IS-IS\n" +       "Topology generation for IS-IS\n" +       "Topology generation\n" +       "Grid topology\n"         "X parameter of the grid\n"         "Y parameter of the grid\n"         "Random seed\n" @@ -1580,6 +1579,9 @@ DEFUN (topology_generate_grid,        gen_spgrid_topology (vty, area->topology);        remove_topology_lsps (area);        generate_topology_lsps (area); +      /* Regenerate L1 LSP to get two way connection to the generated +       * topology. */ +      lsp_regenerate_schedule (area);      }    return CMD_SUCCESS; @@ -1587,41 +1589,39 @@ DEFUN (topology_generate_grid,  DEFUN (show_isis_generated_topology,         show_isis_generated_topology_cmd, -       "show isis generated-topology", +       "show isis generated-topologies",         SHOW_STR -       "clns network information\n" -       "CLNS neighbor adjacencies\n") +       "CLNS network information\n" +       "Show generated topologies\n")  {    struct isis_area *area;    struct listnode *node;    struct listnode *node2;    struct arc *arc; +    for (ALL_LIST_ELEMENTS_RO (isis->area_list, node, area)) -  { -    if (area->topology) -      { -	vty_out (vty, "Topology for isis area:%s%s", area->area_tag, -		 VTY_NEWLINE); -	for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc)) -	{ -	  vty_out (vty, "a  %ld   %ld   %ld%s", arc->from_node, arc->to_node, -		   arc->distance, VTY_NEWLINE); -	} -      } -  } +    { +      if (!area->topology) +	continue; + +      vty_out (vty, "Topology for isis area: %s%s", area->area_tag, +	       VTY_NEWLINE); +      vty_out (vty, "From node     To node     Distance%s", VTY_NEWLINE); + +      for (ALL_LIST_ELEMENTS_RO (area->topology, node2, arc)) +	vty_out (vty, "%9ld %11ld %12ld%s", arc->from_node, arc->to_node, +		 arc->distance, VTY_NEWLINE); +    }    return CMD_SUCCESS;  } -/* - * 'topology base-is' command - */ +/* Base IS for topology generation. */  DEFUN (topology_baseis,         topology_baseis_cmd,         "topology base-is WORD", -       "Topology for IS-IS\n" -       "Topology for IS-IS\n" -       "A Network IS Base for this topology" -       "XX.XXXX.XXXX.XX Network entity title (NET)\n") +       "Topology generation for IS-IS\n" +       "A Network IS Base for this topology\n" +       "XXXX.XXXX.XXXX Network entity title (NET)\n")  {    struct isis_area *area;    u_char buff[ISIS_SYS_ID_LEN]; @@ -1630,22 +1630,18 @@ DEFUN (topology_baseis,    assert (area);    if (sysid2buff (buff, argv[0])) -    { -      sysid2buff (area->topology_baseis, argv[0]); -    } +    sysid2buff (area->topology_baseis, argv[0]);    return CMD_SUCCESS;  } -/* - * 'no net' command - */  DEFUN (no_topology_baseis,         no_topology_baseis_cmd,         "no topology base-is WORD",         NO_STR -       "A Network Entity Title for this process (OSI only)" -       "XX.XXXX. ... .XXX.XX  Network entity title (NET)\n") +       "Topology generation for IS-IS\n" +       "A Network IS Base for this topology\n" +       "XXXX.XXXX.XXXX Network entity title (NET)\n")  {    struct isis_area *area; @@ -1656,6 +1652,29 @@ DEFUN (no_topology_baseis,    return CMD_SUCCESS;  } +ALIAS (no_topology_baseis, +       no_topology_baseis_noid_cmd, +       "no topology base-is", +       NO_STR +       "Topology generation for IS-IS\n" +       "A Network IS Base for this topology\n") + +DEFUN (topology_basedynh, +       topology_basedynh_cmd, +       "topology base-dynh WORD", +       "Topology generation for IS-IS\n" +       "Dynamic hostname base for this topology\n" +       "Dynamic hostname base\n") +{ +  struct isis_area *area; + +  area = vty->index; +  assert (area); + +  /* I hope that it's enough. */ +  area->topology_basedynh = strndup (argv[0], 16);  +  return CMD_SUCCESS; +}  #endif /* TOPOLOGY_GENERATE */  DEFUN (lsp_lifetime, @@ -1968,23 +1987,29 @@ isis_config_write (struct vty *vty)  	    vty_out(vty, "%s", VTY_NEWLINE);  	    write++;  	  } -#ifdef TOPOLOGY_GENERATE -	/* seems we save the whole command line here */ -	if (area->top_params) -	  { -	    vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE); -	    write++; -	  } +#ifdef TOPOLOGY_GENERATE  	if (memcmp (area->topology_baseis, DEFAULT_TOPOLOGY_BASEIS,  		    ISIS_SYS_ID_LEN))  	  { -	    vty_out (vty, " topology base_is %s%s", +	    vty_out (vty, " topology base-is %s%s",  		     sysid_print (area->topology_baseis), VTY_NEWLINE);  	    write++;  	  } - +	if (area->topology_basedynh) +	  { +	    vty_out (vty, " topology base-dynh %s%s", +		     area->topology_basedynh, VTY_NEWLINE); +	    write++; +	  } +	/* We save the whole command line here. */ +	if (strlen(area->top_params)) +	  { +	    vty_out (vty, " %s%s", area->top_params, VTY_NEWLINE); +	    write++; +	  }  #endif /* TOPOLOGY_GENERATE */ +        }      } @@ -2127,7 +2152,9 @@ isis_init ()  #ifdef TOPOLOGY_GENERATE    install_element (ISIS_NODE, &topology_generate_grid_cmd);    install_element (ISIS_NODE, &topology_baseis_cmd); +  install_element (ISIS_NODE, &topology_basedynh_cmd);    install_element (ISIS_NODE, &no_topology_baseis_cmd); +  install_element (ISIS_NODE, &no_topology_baseis_noid_cmd);    install_element (VIEW_NODE, &show_isis_generated_topology_cmd);    install_element (ENABLE_NODE, &show_isis_generated_topology_cmd);  #endif /* TOPOLOGY_GENERATE */ diff --git a/isisd/isisd.h b/isisd/isisd.h index 7a9f7644..e66f60e7 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -123,11 +123,13 @@ struct isis_area  #endif				/* HAVE_IPV6 */    /* Counters */    u_int32_t circuit_state_changes; +  #ifdef TOPOLOGY_GENERATE    struct list *topology; -  char topology_baseis[ISIS_SYS_ID_LEN];	/* is for the first is emulated  */ -  char top_params[200];		/* FIXME: what is reasonable?    */ -#endif				/* TOPOLOGY_GENERATE */ +  char topology_baseis[ISIS_SYS_ID_LEN];  /* IS for the first IS emulated. */ +  char *topology_basedynh;                /* Dynamic hostname base. */ +  char top_params[200];                   /* FIXME: what is reasonable? */ +#endif /* TOPOLOGY_GENERATE */  };  void isis_init (void); | 
