diff options
-rw-r--r-- | isisd/ChangeLog | 6 | ||||
-rw-r--r-- | isisd/isis_dynhn.c | 31 | ||||
-rw-r--r-- | isisd/isis_lsp.c | 4 | ||||
-rw-r--r-- | isisd/isisd.h | 1 |
4 files changed, 39 insertions, 3 deletions
diff --git a/isisd/ChangeLog b/isisd/ChangeLog index 3abe3ae7..f69364c4 100644 --- a/isisd/ChangeLog +++ b/isisd/ChangeLog @@ -1,5 +1,11 @@ 2005-09-28 Hasso Tepper <hasso at quagga.net> + * isis_dynh.c, isisd.h: Implement dynamic hostname cache cleanup. + * isis_lsp.c: Refresh dynamic hostname in the cache while refreshing + topology LSP. + +2005-09-28 Hasso Tepper <hasso at quagga.net> + * isis_lsp.c: Make topology generator generate TE TLVs if necessary. Also take care of inserting dynamic hostname of topology TLVs into cache. diff --git a/isisd/isis_dynhn.c b/isisd/isis_dynhn.c index 68257ddc..13acae71 100644 --- a/isisd/isis_dynhn.c +++ b/isisd/isis_dynhn.c @@ -30,6 +30,7 @@ #include "stream.h" #include "command.h" #include "if.h" +#include "thread.h" #include "isisd/dict.h" #include "isisd/isis_constants.h" @@ -42,18 +43,42 @@ #include "isisd/isis_constants.h" extern struct isis *isis; +extern struct thread_master *master; extern struct host host; struct list *dyn_cache = NULL; +static int dyn_cache_cleanup (struct thread *); void dyn_cache_init (void) { dyn_cache = list_new (); - + THREAD_TIMER_ON (master, isis->t_dync_clean, dyn_cache_cleanup, NULL, 120); return; } +static int +dyn_cache_cleanup (struct thread *thread) +{ + struct listnode *node, *nnode; + struct isis_dynhn *dyn; + time_t now = time (NULL); + + isis->t_dync_clean = NULL; + + for (ALL_LIST_ELEMENTS (dyn_cache, node, nnode, dyn)) + { + if ((now - dyn->refresh) < (MAX_AGE + 120)) + continue; + + list_delete_node (dyn_cache, node); + XFREE (MTYPE_ISIS_DYNHN, dyn); + } + + THREAD_TIMER_ON (master, isis->t_dync_clean, dyn_cache_cleanup, NULL, 120); + return ISIS_OK; +} + struct isis_dynhn * dynhn_find_by_id (u_char * id) { @@ -80,13 +105,13 @@ isis_dynhn_insert (u_char * id, struct hostname *hostname, int level) dyn->refresh = time (NULL); return; } - dyn = XMALLOC (MTYPE_ISIS_DYNHN, sizeof (struct isis_dynhn)); + dyn = XCALLOC (MTYPE_ISIS_DYNHN, sizeof (struct isis_dynhn)); if (!dyn) { zlog_warn ("isis_dynhn_insert(): out of memory!"); return; } - memset (dyn, 0, sizeof (struct isis_dynhn)); + /* we also copy the length */ memcpy (&dyn->name, hostname, hostname->namelen + 1); memcpy (dyn->id, id, ISIS_SYS_ID_LEN); diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index c0574adb..f4a42a60 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -2154,6 +2154,10 @@ top_lsp_refresh (struct thread *thread) zlog_debug ("ISIS-Upd (): refreshing Topology L1 %s", rawlspid_print (lsp->lsp_header->lsp_id)); } + /* Refresh dynamic hostname in the cache. */ + isis_dynhn_insert (lsp->lsp_header->lsp_id, lsp->tlv_data.hostname, + IS_LEVEL_1); + lsp->lsp_header->rem_lifetime = htons (isis_jitter (lsp->area->max_lsp_lifetime[0], MAX_AGE_JITTER)); diff --git a/isisd/isisd.h b/isisd/isisd.h index 4e716405..2277f27c 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -50,6 +50,7 @@ struct isis struct area_addr *man_area_addrs; /* manualAreaAddresses */ u_int32_t debugs; /* bitmap for debug */ time_t uptime; /* when did we start */ + struct thread *t_dync_clean; /* dynamic hostname cache cleanup thread */ /* Redistributed external information. */ struct route_table *external_info[ZEBRA_ROUTE_MAX + 1]; |