summaryrefslogtreecommitdiffstats
path: root/isisd/isis_bfd.c
diff options
context:
space:
mode:
authorGalaxyGorilla <sascha@netdef.org>2020-05-19 13:52:04 +0200
committerGalaxyGorilla <sascha@netdef.org>2020-07-03 10:46:17 +0200
commit690497fb1071f9959ed39362027f2c5e79124061 (patch)
treefc19a546a2ca9ae7d562a921122f848305beb65e /isisd/isis_bfd.c
parenttests: Introduce BFD IS-IS topotests (diff)
downloadfrr-690497fb1071f9959ed39362027f2c5e79124061.tar.xz
frr-690497fb1071f9959ed39362027f2c5e79124061.zip
isisd: Fast RIB recovery from BFD recognized link failures
Unfortunately as the topotests show a fast recovery after failure detection due to BFD is currently not possible because of the following issue: There are multiple scheduling mechanisms within isisd to prevent overload situations. Regarding our problem these two are important: * scheduler for regenerating ISIS Link State PDUs scheduler for managing * consecutive SPF calculations In fact both schedulers are coupled, the first one triggers the second one, which again is triggered by isis_adj_state_change (which again is triggered by a BFD 'down' message). The re-calculation of SPF paths finally triggers updates in zebra for the RIB. Both schedulers work as a throttle, e.g. they allow the regeneration of Link State PDUs or a re-calculation for SPF paths only once within a certain time interval which is configurable (and by default different!). This means that a request can go through the first scheduler but might still be 'stuck' at the second one for a while. Or a request can be 'stuck' at the first scheduler even though the second one is ready. This also explains the 'random' behaviour one can observe testing since a 'fast' recovery is only possible if both schedulers are ready to process this request. Note that the solution in this commit is 'thread safe' in the sense that both schedulers use the same thread master such that the introduced flags are only used exactly one time (and one after another) for a 'fast' execution. Further there are some irritating comments and logs which I partially removed. They seems to be not valid anymore due to changes in thread management (or they were never valid in the first place). Signed-off-by: GalaxyGorilla <sascha@netdef.org>
Diffstat (limited to 'isisd/isis_bfd.c')
-rw-r--r--isisd/isis_bfd.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/isisd/isis_bfd.c b/isisd/isis_bfd.c
index 9f8424fcd..69c971ee2 100644
--- a/isisd/isis_bfd.c
+++ b/isisd/isis_bfd.c
@@ -138,6 +138,8 @@ static void bfd_adj_event(struct isis_adjacency *adj, struct prefix *dst,
return;
}
+ adj->circuit->area->bfd_signalled_down = true;
+
isis_adj_state_change(&adj, ISIS_ADJ_DOWN, "bfd session went down");
}