if ((area->is_type & level) == 0)
return ISIS_ERROR;
+ if (monotime_since(&area->last_lsp_refresh_event[level - 1], NULL) < 50000L) {
+ sched_debug("ISIS (%s): Still unstable, postpone LSP L%d refresh",
+ area->area_tag, level);
+ _lsp_regenerate_schedule(area, level, 0, false,
+ __func__, __FILE__, __LINE__);
+ return 0;
+ }
+
sched_debug(
"ISIS (%s): LSP L%d refresh timer expired. Refreshing LSP...",
area->area_tag, level);
}
int _lsp_regenerate_schedule(struct isis_area *area, int level,
- int all_pseudo, const char *func,
- const char *file, int line)
+ int all_pseudo, bool postpone,
+ const char *func, const char *file,
+ int line)
{
struct isis_lsp *lsp;
uint8_t id[ISIS_SYS_ID_LEN + 2];
if (!((level & lvl) && (area->is_type & lvl)))
continue;
+ if (postpone) {
+ monotime(&area->last_lsp_refresh_event[lvl - 1]);
+ }
+
sched_debug(
"ISIS (%s): Checking whether L%d needs to be scheduled",
area->area_tag, lvl);
int lsp_generate(struct isis_area *area, int level);
#define lsp_regenerate_schedule(area, level, all_pseudo) \
- _lsp_regenerate_schedule((area), (level), (all_pseudo), \
+ _lsp_regenerate_schedule((area), (level), (all_pseudo), true, \
__func__, __FILE__, __LINE__)
int _lsp_regenerate_schedule(struct isis_area *area, int level,
- int all_pseudo, const char *func,
- const char *file, int line);
+ int all_pseudo, bool postpone,
+ const char *func, const char *file, int line);
int lsp_generate_pseudo(struct isis_circuit *circuit, int level);
int lsp_regenerate_schedule_pseudo(struct isis_circuit *circuit, int level);
struct flags flags;
struct thread *t_tick; /* LSP walker */
struct thread *t_lsp_refresh[ISIS_LEVELS];
+ struct timeval last_lsp_refresh_event[ISIS_LEVELS];
/* t_lsp_refresh is used in two ways:
* a) regular refresh of LSPs
* b) (possibly throttled) updates to LSPs