Annotation of embedaddon/quagga/isisd/isis_dynhn.c, revision 1.1
1.1 ! misho 1: /*
! 2: * IS-IS Rout(e)ing protocol - isis_dynhn.c
! 3: * Dynamic hostname cache
! 4: * Copyright (C) 2001,2002 Sampo Saaristo
! 5: * Tampere University of Technology
! 6: * Institute of Communications Engineering
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify it
! 9: * under the terms of the GNU General Public Licenseas published by the Free
! 10: * Software Foundation; either version 2 of the License, or (at your option)
! 11: * any later version.
! 12: *
! 13: * This program is distributed in the hope that it will be useful,but WITHOUT
! 14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
! 15: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
! 16: * more details.
! 17: *
! 18: * You should have received a copy of the GNU General Public License along
! 19: * with this program; if not, write to the Free Software Foundation, Inc.,
! 20: * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
! 21: */
! 22:
! 23: #include <zebra.h>
! 24:
! 25: #include "vty.h"
! 26: #include "linklist.h"
! 27: #include "memory.h"
! 28: #include "log.h"
! 29: #include "stream.h"
! 30: #include "command.h"
! 31: #include "if.h"
! 32: #include "thread.h"
! 33:
! 34: #include "isisd/dict.h"
! 35: #include "isisd/isis_constants.h"
! 36: #include "isisd/isis_common.h"
! 37: #include "isisd/isis_flags.h"
! 38: #include "isisd/isis_circuit.h"
! 39: #include "isisd/isisd.h"
! 40: #include "isisd/isis_dynhn.h"
! 41: #include "isisd/isis_misc.h"
! 42: #include "isisd/isis_constants.h"
! 43:
! 44: extern struct isis *isis;
! 45: extern struct thread_master *master;
! 46: extern struct host host;
! 47:
! 48: struct list *dyn_cache = NULL;
! 49: static int dyn_cache_cleanup (struct thread *);
! 50:
! 51: void
! 52: dyn_cache_init (void)
! 53: {
! 54: dyn_cache = list_new ();
! 55: THREAD_TIMER_ON (master, isis->t_dync_clean, dyn_cache_cleanup, NULL, 120);
! 56: return;
! 57: }
! 58:
! 59: static int
! 60: dyn_cache_cleanup (struct thread *thread)
! 61: {
! 62: struct listnode *node, *nnode;
! 63: struct isis_dynhn *dyn;
! 64: time_t now = time (NULL);
! 65:
! 66: isis->t_dync_clean = NULL;
! 67:
! 68: for (ALL_LIST_ELEMENTS (dyn_cache, node, nnode, dyn))
! 69: {
! 70: if ((now - dyn->refresh) < (MAX_AGE + 120))
! 71: continue;
! 72:
! 73: list_delete_node (dyn_cache, node);
! 74: XFREE (MTYPE_ISIS_DYNHN, dyn);
! 75: }
! 76:
! 77: THREAD_TIMER_ON (master, isis->t_dync_clean, dyn_cache_cleanup, NULL, 120);
! 78: return ISIS_OK;
! 79: }
! 80:
! 81: struct isis_dynhn *
! 82: dynhn_find_by_id (u_char * id)
! 83: {
! 84: struct listnode *node = NULL;
! 85: struct isis_dynhn *dyn = NULL;
! 86:
! 87: for (ALL_LIST_ELEMENTS_RO (dyn_cache, node, dyn))
! 88: if (memcmp (dyn->id, id, ISIS_SYS_ID_LEN) == 0)
! 89: return dyn;
! 90:
! 91: return NULL;
! 92: }
! 93:
! 94: void
! 95: isis_dynhn_insert (u_char * id, struct hostname *hostname, int level)
! 96: {
! 97: struct isis_dynhn *dyn;
! 98:
! 99: dyn = dynhn_find_by_id (id);
! 100: if (dyn)
! 101: {
! 102: memcpy (&dyn->name, hostname, hostname->namelen + 1);
! 103: memcpy (dyn->id, id, ISIS_SYS_ID_LEN);
! 104: dyn->refresh = time (NULL);
! 105: return;
! 106: }
! 107: dyn = XCALLOC (MTYPE_ISIS_DYNHN, sizeof (struct isis_dynhn));
! 108: if (!dyn)
! 109: {
! 110: zlog_warn ("isis_dynhn_insert(): out of memory!");
! 111: return;
! 112: }
! 113:
! 114: /* we also copy the length */
! 115: memcpy (&dyn->name, hostname, hostname->namelen + 1);
! 116: memcpy (dyn->id, id, ISIS_SYS_ID_LEN);
! 117: dyn->refresh = time (NULL);
! 118: dyn->level = level;
! 119:
! 120: listnode_add (dyn_cache, dyn);
! 121:
! 122: return;
! 123: }
! 124:
! 125: /*
! 126: * Level System ID Dynamic Hostname (notag)
! 127: * 2 0000.0000.0001 foo-gw
! 128: * 2 0000.0000.0002 bar-gw
! 129: * * 0000.0000.0004 this-gw
! 130: */
! 131: void
! 132: dynhn_print_all (struct vty *vty)
! 133: {
! 134: struct listnode *node;
! 135: struct isis_dynhn *dyn;
! 136:
! 137: vty_out (vty, "Level System ID Dynamic Hostname%s", VTY_NEWLINE);
! 138: for (ALL_LIST_ELEMENTS_RO (dyn_cache, node, dyn))
! 139: {
! 140: vty_out (vty, "%-7d", dyn->level);
! 141: vty_out (vty, "%-15s%-15s%s", sysid_print (dyn->id), dyn->name.name,
! 142: VTY_NEWLINE);
! 143: }
! 144:
! 145: vty_out (vty, " * %s %s%s", sysid_print (isis->sysid), unix_hostname (),
! 146: VTY_NEWLINE);
! 147: return;
! 148: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>