]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: add affinity-map configuration hooks
authorLouis Scalbert <louis.scalbert@6wind.com>
Thu, 10 Nov 2022 15:36:08 +0000 (16:36 +0100)
committerLouis Scalbert <louis.scalbert@6wind.com>
Tue, 18 Apr 2023 09:33:15 +0000 (11:33 +0200)
Add affinity-map hooks to check the utilization of affinity-map in
flex-algo contexts before its deletion and to update local TLVs when the
affinity-map bit-position is updated.

Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
isisd/isis_affinitymap.c [new file with mode: 0644]
isisd/isis_affinitymap.h [new file with mode: 0644]
isisd/isis_main.c
isisd/subdir.am

diff --git a/isisd/isis_affinitymap.c b/isisd/isis_affinitymap.c
new file mode 100644 (file)
index 0000000..e681e82
--- /dev/null
@@ -0,0 +1,91 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* IS-IS  affinity-map
+ * Copyright 2023 6WIND S.A.
+ */
+
+#include <zebra.h>
+#include "lib/if.h"
+#include "lib/vrf.h"
+#include "isisd/isisd.h"
+#include "isisd/isis_affinitymap.h"
+
+#ifndef FABRICD
+
+static bool isis_affinity_map_check_use(const char *affmap_name)
+{
+       struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
+       struct isis_area *area;
+       struct listnode *area_node, *fa_node;
+       struct flex_algo *fa;
+       struct affinity_map *map;
+       uint16_t pos;
+
+       map = affinity_map_get(affmap_name);
+       pos = map->bit_position;
+
+       for (ALL_LIST_ELEMENTS_RO(isis->area_list, area_node, area)) {
+               for (ALL_LIST_ELEMENTS_RO(area->flex_algos->flex_algos, fa_node,
+                                         fa)) {
+                       if (admin_group_get(&fa->admin_group_exclude_any,
+                                           pos) ||
+                           admin_group_get(&fa->admin_group_include_any,
+                                           pos) ||
+                           admin_group_get(&fa->admin_group_include_all, pos))
+                               return true;
+               }
+       }
+       return false;
+}
+
+static void isis_affinity_map_update(const char *affmap_name, uint16_t old_pos,
+                                    uint16_t new_pos)
+{
+       struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
+       struct listnode *area_node, *fa_node;
+       struct isis_area *area;
+       struct flex_algo *fa;
+       bool changed;
+
+       for (ALL_LIST_ELEMENTS_RO(isis->area_list, area_node, area)) {
+               changed = false;
+               for (ALL_LIST_ELEMENTS_RO(area->flex_algos->flex_algos, fa_node,
+                                         fa)) {
+                       if (admin_group_get(&fa->admin_group_exclude_any,
+                                           old_pos)) {
+                               admin_group_unset(&fa->admin_group_exclude_any,
+                                                 old_pos);
+                               admin_group_set(&fa->admin_group_exclude_any,
+                                               new_pos);
+                               changed = true;
+                       }
+                       if (admin_group_get(&fa->admin_group_include_any,
+                                           old_pos)) {
+                               admin_group_unset(&fa->admin_group_include_any,
+                                                 old_pos);
+                               admin_group_set(&fa->admin_group_include_any,
+                                               new_pos);
+                               changed = true;
+                       }
+                       if (admin_group_get(&fa->admin_group_include_all,
+                                           old_pos)) {
+                               admin_group_unset(&fa->admin_group_include_all,
+                                                 old_pos);
+                               admin_group_set(&fa->admin_group_include_all,
+                                               new_pos);
+                               changed = true;
+                       }
+               }
+               if (changed)
+                       lsp_regenerate_schedule(area, area->is_type, 0);
+       }
+}
+
+void isis_affinity_map_init(void)
+{
+       affinity_map_init();
+
+       affinity_map_set_check_use_hook(isis_affinity_map_check_use);
+       affinity_map_set_update_hook(isis_affinity_map_update);
+}
+
+#endif /* ifndef FABRICD */
diff --git a/isisd/isis_affinitymap.h b/isisd/isis_affinitymap.h
new file mode 100644 (file)
index 0000000..c432e99
--- /dev/null
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* IS-IS  affinity-map header
+ * Copyright 2023 6WIND S.A.
+ */
+
+#ifndef __ISIS_AFFINITYMAP_H__
+#define __ISIS_AFFINITYMAP_H__
+
+#include "lib/affinitymap.h"
+
+#ifndef FABRICD
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void isis_affinity_map_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ifndef FABRICD */
+
+#endif /* __ISIS_AFFINITYMAP_H__ */
index 2f4e4e0bd6c5b2014c859681166aa7b09a890eb5..8e40882e54c8dbb224d34baf5fa8d94e7baa5a5c 100644 (file)
@@ -29,6 +29,7 @@
 #include "routemap.h"
 #include "affinitymap.h"
 
+#include "isisd/isis_affinitymap.h"
 #include "isisd/isis_constants.h"
 #include "isisd/isis_common.h"
 #include "isisd/isis_flags.h"
@@ -290,7 +291,9 @@ int main(int argc, char **argv, char **envp)
        lsp_init();
        mt_init();
 
-       affinity_map_init();
+#ifndef FABRICD
+       isis_affinity_map_init();
+#endif /* ifndef FABRICD */
 
        isis_zebra_init(master, instance);
        isis_bfd_init(master);
index 49e252c852451cd4aed69f27b5105c35ebdc384a..6bd2477b198b2363d5e0ba32a37e8728d18f66ca 100644 (file)
@@ -19,6 +19,7 @@ vtysh_daemons += fabricd
 endif
 
 noinst_HEADERS += \
+       isisd/isis_affinitymap.h \
        isisd/isis_adjacency.h \
        isisd/isis_bfd.h \
        isisd/isis_circuit.h \
@@ -56,6 +57,7 @@ noinst_HEADERS += \
        # end
 
 LIBISIS_SOURCES = \
+       isisd/isis_affinitymap.c \
        isisd/isis_adjacency.c \
        isisd/isis_bfd.c \
        isisd/isis_circuit.c \