diff options
author | Louis Scalbert <louis.scalbert@6wind.com> | 2023-04-28 11:20:26 +0200 |
---|---|---|
committer | Louis Scalbert <louis.scalbert@6wind.com> | 2023-04-28 11:53:18 +0200 |
commit | 3f55b8c6210f8794e6b375660b4b0929e3e199a8 (patch) | |
tree | 02b2cb09307376858b3f8bcf53cc5249e4c91e03 /lib | |
parent | Merge pull request #13386 from donaldsharp/bgp_received_routes (diff) | |
download | frr-3f55b8c6210f8794e6b375660b4b0929e3e199a8.tar.xz frr-3f55b8c6210f8794e6b375660b4b0929e3e199a8.zip |
isisd: fix disabled flex-algo on race condition
A particular flex-algo algorithm may remain in disabled state after
configuring it if its flex-algo definition is being spread in the area.
It happens sometimes that, in isis_sr_flex_algo_topo1 topotest, r3
flex-algo 203 is disabled on test8. It depends on the following
sequence on r3:
1. a LSP containing the flex-algo 203 definition is received from
either r1 or r2 (or both).
2. the local LSP is rebuilt by lsp_build() because of the flex-algo 203
configuration
3. isis_run_spf() recomputes the algo 203 SPF tree
A 1. 2. 3. sequence results in a working test whereas 2. 1. 3. is not
working. The second case issue is because of an inconsistent flex-algo
definition state between the following:
- in lsp_build(), isis_flex_algo_elected_supported_local_fad() returns
false because no flex-algo definition is known.
- in isis_run_spf(), isis_flex_algo_elected_supported() returns true
because a flex-algo definition is found.
Set a flex-algo state lsp_build() depending on flex-algo definition
existence that is used later in isis_run_spf().
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/flex_algo.c | 21 | ||||
-rw-r--r-- | lib/flex_algo.h | 9 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/flex_algo.c b/lib/flex_algo.c index bafbf8b77..34708898b 100644 --- a/lib/flex_algo.c +++ b/lib/flex_algo.c @@ -140,3 +140,24 @@ char *flex_algo_metric_type_print(char *type_str, size_t sz, } return type_str; } + +bool flex_algo_get_state(struct flex_algos *flex_algos, uint8_t algorithm) +{ + struct flex_algo *fa = flex_algo_lookup(flex_algos, algorithm); + + if (!fa) + return false; + + return fa->state; +} + +void flex_algo_set_state(struct flex_algos *flex_algos, uint8_t algorithm, + bool state) +{ + struct flex_algo *fa = flex_algo_lookup(flex_algos, algorithm); + + if (!fa) + return; + + fa->state = state; +} diff --git a/lib/flex_algo.h b/lib/flex_algo.h index e012f4686..81a0af85b 100644 --- a/lib/flex_algo.h +++ b/lib/flex_algo.h @@ -83,6 +83,11 @@ struct flex_algo { #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 @@ -118,4 +123,8 @@ 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 */ |