diff options
author | jardin <jardin> | 2003-12-23 09:09:43 +0100 |
---|---|---|
committer | jardin <jardin> | 2003-12-23 09:09:43 +0100 |
commit | eb5d44eb8dcf25a1b328e57d1eabb1f89e3bc59b (patch) | |
tree | 2973e8563fcbd4a8cf901d211ff4f8de00c36381 /isisd/isis_dynhn.c | |
parent | Reorder free(f); unlink(f); to unlink before freeing. (diff) | |
download | frr-eb5d44eb8dcf25a1b328e57d1eabb1f89e3bc59b.tar.xz frr-eb5d44eb8dcf25a1b328e57d1eabb1f89e3bc59b.zip |
Initial revision
Diffstat (limited to 'isisd/isis_dynhn.c')
-rw-r--r-- | isisd/isis_dynhn.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/isisd/isis_dynhn.c b/isisd/isis_dynhn.c new file mode 100644 index 000000000..9e151d0ab --- /dev/null +++ b/isisd/isis_dynhn.c @@ -0,0 +1,124 @@ +/* + * IS-IS Rout(e)ing protocol - isis_dynhn.c + * Dynamic hostname cache + * Copyright (C) 2001,2002 Sampo Saaristo + * Tampere University of Technology + * Institute of Communications Engineering + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public Licenseas published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful,but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include <time.h> +#include <zebra.h> +#include <net/ethernet.h> + +#include "vty.h" +#include "linklist.h" +#include "memory.h" +#include "log.h" +#include "stream.h" +#include "command.h" +#include "if.h" + +#include "isisd/dict.h" +#include "isisd/isis_constants.h" +#include "isisd/isis_common.h" +#include "isisd/isis_flags.h" +#include "isisd/isis_circuit.h" +#include "isisd/isisd.h" +#include "isisd/isis_dynhn.h" +#include "isisd/isis_misc.h" +#include "isisd/isis_constants.h" + +extern struct isis *isis; +extern struct host host; + +struct list *dyn_cache = NULL; + +void +dyn_cache_init (void) +{ + dyn_cache = list_new (); + + return; +} + +struct isis_dynhn *dynhn_find_by_id (u_char * id) +{ + struct listnode *node = NULL; + struct isis_dynhn *dyn = NULL; + + for (node = listhead (dyn_cache); node; nextnode (node)) { + dyn = getdata (node); + if (memcmp (dyn->id, id, ISIS_SYS_ID_LEN) == 0) + return dyn; + } + + return NULL; +} + +void +isis_dynhn_insert (u_char *id, struct hostname *hostname, int level) +{ + struct isis_dynhn *dyn; + + dyn = dynhn_find_by_id (id); + if (dyn) { + memcpy (&dyn->name, hostname, hostname->namelen + 1); + memcpy (dyn->id, id, ISIS_SYS_ID_LEN); + dyn->refresh = time (NULL); + return; + } + dyn = XMALLOC (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); + dyn->refresh = time (NULL); + dyn->level = level; + + listnode_add (dyn_cache, dyn); + + return; +} + +/* + * Level System ID Dynamic Hostname (notag) + * 2 0000.0000.0001 foo-gw + * 2 0000.0000.0002 bar-gw + * * 0000.0000.0004 this-gw + */ +void dynhn_print_all (struct vty *vty) +{ + struct listnode *node; + struct isis_dynhn *dyn; + + vty_out (vty, "Level System ID Dynamic Hostname%s", VTY_NEWLINE); + for (node = listhead (dyn_cache); node; nextnode (node)) { + dyn = getdata (node); + vty_out (vty, "%-7d", dyn->level); + vty_out (vty, "%-15s%-15s%s", sysid_print (dyn->id), dyn->name.name, + VTY_NEWLINE); + } + + vty_out (vty, " * %s %s%s", sysid_print (isis->sysid), host.name, + VTY_NEWLINE); + return; +} + |