summaryrefslogtreecommitdiffstats
path: root/lib/flex_algo.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/flex_algo.h')
-rw-r--r--lib/flex_algo.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/flex_algo.h b/lib/flex_algo.h
new file mode 100644
index 0000000..e617e7c
--- /dev/null
+++ b/lib/flex_algo.h
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*********************************************************************
+ * Copyright 2022 Hiroki Shirokura, LINE Corporation
+ * Copyright 2022 Masakazu Asama
+ * Copyright 2022 6WIND S.A.
+ *
+ * flex_algo.h: Flexible Algorithm library
+ *
+ * Authors
+ * -------
+ * Hiroki Shirokura
+ * Masakazu Asama
+ * Louis Scalbert
+ */
+
+#ifndef _FRR_FLEX_ALGO_H
+#define _FRR_FLEX_ALGO_H
+
+#include "admin_group.h"
+#include "linklist.h"
+#include "prefix.h"
+#include "segment_routing.h"
+
+#define FLEX_ALGO_PRIO_DEFAULT 128
+
+#define CALC_TYPE_SPF 0
+
+/* flex-algo definition flags */
+
+/* M-flag (aka. prefix-metric)
+ * Flex-Algorithm specific prefix and ASBR metric MUST be used
+ */
+#define FAD_FLAG_M 0x80
+
+/*
+ * Metric Type values from RFC9350 section 5.1
+ */
+enum flex_algo_metric_type {
+ MT_IGP = 0,
+ MT_MIN_UNI_LINK_DELAY = 1,
+ MT_TE_DEFAULT = 2,
+};
+
+
+/* Flex-Algo data about a given algorithm.
+ * It includes the definition and some local data.
+ */
+struct flex_algo {
+ /* Flex-Algo definition */
+ uint8_t algorithm;
+ enum flex_algo_metric_type metric_type;
+ uint8_t calc_type;
+ uint8_t priority;
+ uint8_t flags;
+
+ /* extended admin-groups */
+ struct admin_group admin_group_exclude_any;
+ struct admin_group admin_group_include_any;
+ struct admin_group admin_group_include_all;
+
+ /* Exclude SRLG Sub-TLV is not yet supported by IS-IS
+ * True if a Exclude SRLG Sub-TLV has been found
+ */
+ bool exclude_srlg;
+
+ /* True if an unsupported sub-TLV other Exclude SRLG
+ * has been received.
+ * A router that receives an unsupported definition
+ * that is elected must not participate in the algorithm.
+ * This boolean prevents future sub-TLV from being considered
+ * as supported.
+ */
+ bool unsupported_subtlv;
+
+ /* Flex-Algo local data */
+
+ /* True if the local definition must be advertised */
+ bool advertise_definition;
+
+ /* which dataplane must be used for the algorithm */
+#define FLEX_ALGO_SR_MPLS 0x01
+#define FLEX_ALGO_SRV6 0x02
+#define FLEX_ALGO_IP 0x04
+ uint8_t dataplanes;
+
+ /* True if the Algorithm is locally enabled (ie. a definition has been
+ * found and is supported).
+ */
+ bool state;
+
+ /*
+ * This property can be freely extended among different routing
+ * protocols. Since Flex-Algo is an IGP protocol agnostic, both IS-IS
+ * and OSPF can implement Flex-Algo. The struct flex_algo thus provides
+ * the general data structure of Flex-Algo, and the value of extending
+ * it with the IGP protocol is provided by this property.
+ */
+ void *data;
+};
+
+typedef void *(*flex_algo_allocator_t)(void *);
+typedef void (*flex_algo_releaser_t)(void *);
+
+struct flex_algos {
+ flex_algo_allocator_t allocator;
+ flex_algo_releaser_t releaser;
+ struct list *flex_algos;
+};
+
+/*
+ * Flex-Algo Utilities
+ */
+struct flex_algos *flex_algos_alloc(flex_algo_allocator_t allocator,
+ flex_algo_releaser_t releaser);
+void flex_algos_free(struct flex_algos *flex_algos);
+struct flex_algo *flex_algo_alloc(struct flex_algos *flex_algos,
+ uint8_t algorithm, void *arg);
+struct flex_algo *flex_algo_lookup(struct flex_algos *flex_algos,
+ uint8_t algorithm);
+void flex_algos_free(struct flex_algos *flex_algos);
+bool flex_algo_definition_cmp(struct flex_algo *fa1, struct flex_algo *fa2);
+void flex_algo_delete(struct flex_algos *flex_algos, uint8_t algorithm);
+bool flex_algo_id_valid(uint16_t algorithm);
+char *flex_algo_metric_type_print(char *type_str, size_t sz,
+ enum flex_algo_metric_type metric_type);
+
+bool flex_algo_get_state(struct flex_algos *flex_algos, uint8_t algorithm);
+
+void flex_algo_set_state(struct flex_algos *flex_algos, uint8_t algorithm,
+ bool state);
+#endif /* _FRR_FLEX_ALGO_H */