diff options
Diffstat (limited to 'isisd/isis_dynhn.c')
-rw-r--r-- | isisd/isis_dynhn.c | 31 |
1 files changed, 28 insertions, 3 deletions
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); |