isis_flags.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * IS-IS Rout(e)ing protocol - isis_flags.c
  3. * Routines for manipulation of SSN and SRM flags
  4. *
  5. * Copyright (C) 2001,2002 Sampo Saaristo
  6. * Tampere University of Technology
  7. * Institute of Communications Engineering
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms of the GNU General Public Licenseas published by the Free
  11. * Software Foundation; either version 2 of the License, or (at your option)
  12. * any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,but WITHOUT
  15. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  16. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  17. * more details.
  18. *
  19. * You should have received a copy of the GNU General Public License along
  20. * with this program; if not, write to the Free Software Foundation, Inc.,
  21. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22. */
  23. #include <zebra.h>
  24. #include "log.h"
  25. #include "linklist.h"
  26. #include "isisd/isis_constants.h"
  27. #include "isisd/isis_common.h"
  28. #include "isisd/isis_flags.h"
  29. void
  30. flags_initialize (struct flags *flags)
  31. {
  32. flags->maxindex = 0;
  33. flags->free_idcs = NULL;
  34. }
  35. long int
  36. flags_get_index (struct flags *flags)
  37. {
  38. struct listnode *node;
  39. long int index;
  40. if (flags->free_idcs == NULL || flags->free_idcs->count == 0)
  41. {
  42. index = flags->maxindex++;
  43. }
  44. else
  45. {
  46. node = listhead (flags->free_idcs);
  47. index = (long int) listgetdata (node);
  48. listnode_delete (flags->free_idcs, (void *) index);
  49. index--;
  50. }
  51. return index;
  52. }
  53. void
  54. flags_free_index (struct flags *flags, long int index)
  55. {
  56. if (index + 1 == flags->maxindex)
  57. {
  58. flags->maxindex--;
  59. return;
  60. }
  61. if (flags->free_idcs == NULL)
  62. {
  63. flags->free_idcs = list_new ();
  64. }
  65. listnode_add (flags->free_idcs, (void *) (index + 1));
  66. return;
  67. }
  68. int
  69. flags_any_set (u_int32_t * flags)
  70. {
  71. u_int32_t zero[ISIS_MAX_CIRCUITS];
  72. memset (zero, 0x00, ISIS_MAX_CIRCUITS * 4);
  73. return bcmp (flags, zero, ISIS_MAX_CIRCUITS * 4);
  74. }