summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/ChangeLog6
-rw-r--r--isisd/isis_dynhn.c31
-rw-r--r--isisd/isis_lsp.c4
-rw-r--r--isisd/isisd.h1
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];