summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmanuele Di Pascale <emanuele@voltanet.io>2021-03-17 13:24:19 +0100
committerEmanuele Di Pascale <emanuele@voltanet.io>2021-03-19 10:37:58 +0100
commitd2232b3e210fbc5faad95d09ddaf11cb5e88bc94 (patch)
treeb2f6969255050b5e827fba39269bd10500f2dd53
parent44544f191cffd8817f3bc945daec499191cffa01 (diff)
isisd: avoid lsp_sched loop when unstable
no point in scheduling an LSP refresh immediately if we know it is going to be postponed again due to the network still being in its instability grace period Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
-rw-r--r--isisd/isis_lsp.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c
index 06a5a69e3f..d610495de6 100644
--- a/isisd/isis_lsp.c
+++ b/isisd/isis_lsp.c
@@ -1561,18 +1561,28 @@ int _lsp_regenerate_schedule(struct isis_area *area, int level,
/*
* Schedule LSP refresh ASAP
*/
- timeout = 0;
-
if (area->bfd_signalled_down) {
sched_debug(
"ISIS (%s): Scheduling immediately due to BDF 'down' message.",
area->area_tag);
area->bfd_signalled_down = false;
area->bfd_force_spf_refresh = true;
+ timeout = 0;
} else {
- sched_debug(
- "ISIS (%s): Last generation was more than lsp_gen_interval ago. Scheduling for execution now.",
- area->area_tag);
+ int64_t time_since_last = monotime_since(
+ &area->last_lsp_refresh_event[lvl - 1],
+ NULL);
+ timeout = time_since_last < 100000L
+ ? (100000L - time_since_last)/1000
+ : 0;
+ if (timeout > 0)
+ sched_debug(
+ "ISIS (%s): Last generation was more than lsp_gen_interval ago. Scheduling for execution in %ld ms due to the instability timer.",
+ area->area_tag, timeout);
+ else
+ sched_debug(
+ "ISIS (%s): Last generation was more than lsp_gen_interval ago. Scheduling for execution now.",
+ area->area_tag);
}
}