diff options
Diffstat (limited to 'isisd/isis_flags.c')
-rw-r--r-- | isisd/isis_flags.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/isisd/isis_flags.c b/isisd/isis_flags.c new file mode 100644 index 0000000..b1ece94 --- /dev/null +++ b/isisd/isis_flags.c @@ -0,0 +1,77 @@ +/* + * IS-IS Rout(e)ing protocol - isis_flags.c + * Routines for manipulation of SSN and SRM flags + * + * 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; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <zebra.h> +#include "log.h" +#include "linklist.h" + +#include "isisd/isis_constants.h" +#include "isisd/isis_common.h" +#include "isisd/isis_flags.h" + +void flags_initialize(struct flags *flags) +{ + flags->maxindex = 0; + flags->free_idcs = NULL; +} + +long int flags_get_index(struct flags *flags) +{ + struct listnode *node; + long int index; + + if (flags->free_idcs == NULL || flags->free_idcs->count == 0) { + index = flags->maxindex++; + } else { + node = listhead(flags->free_idcs); + index = (long int)listgetdata(node); + listnode_delete(flags->free_idcs, (void *)index); + index--; + } + + return index; +} + +void flags_free_index(struct flags *flags, long int index) +{ + if (index + 1 == flags->maxindex) { + flags->maxindex--; + return; + } + + if (flags->free_idcs == NULL) { + flags->free_idcs = list_new(); + } + + listnode_add(flags->free_idcs, (void *)(index + 1)); + + return; +} + +int flags_any_set(uint32_t *flags) +{ + uint32_t zero[ISIS_MAX_CIRCUITS]; + memset(zero, 0x00, ISIS_MAX_CIRCUITS * 4); + + return bcmp(flags, zero, ISIS_MAX_CIRCUITS * 4); +} |