diff options
Diffstat (limited to 'isisd/isis_flags.c')
-rw-r--r-- | isisd/isis_flags.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/isisd/isis_flags.c b/isisd/isis_flags.c new file mode 100644 index 0000000..a621b4b --- /dev/null +++ b/isisd/isis_flags.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * 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 + */ + +#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); +} |