Merge pull request #12819 from isabelladeleon12/isis_load_config_before_lsp_gen

isisd: Delay lsp generation to after config processing is complete
This commit is contained in:
Russ White 2023-02-28 08:38:44 -05:00 committed by GitHub
commit 4fa0162568
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 56 additions and 0 deletions

View File

@ -1364,6 +1364,10 @@ int lsp_generate(struct isis_area *area, int level)
if ((area == NULL) || (area->is_type & level) != level)
return ISIS_ERROR;
/* Check if config is still being processed */
if (thread_is_scheduled(t_isis_cfg))
return ISIS_OK;
memset(&lspid, 0, ISIS_SYS_ID_LEN + 2);
memcpy(&lspid, area->isis->sysid, ISIS_SYS_ID_LEN);

View File

@ -168,6 +168,40 @@ static const struct frr_yang_module_info *const isisd_yang_modules[] = {
};
/* clang-format on */
static void isis_config_finish(struct thread *t)
{
struct listnode *node, *inode;
struct isis *isis;
struct isis_area *area;
for (ALL_LIST_ELEMENTS_RO(im->isis, inode, isis)) {
for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
config_end_lsp_generate(area);
}
}
static void isis_config_start(void)
{
/* Max wait time for config to load before generating lsp */
#define ISIS_PRE_CONFIG_MAX_WAIT_SECONDS 600
THREAD_OFF(t_isis_cfg);
thread_add_timer(im->master, isis_config_finish, NULL,
ISIS_PRE_CONFIG_MAX_WAIT_SECONDS, &t_isis_cfg);
}
static void isis_config_end(void)
{
/* If ISIS config processing thread isn't running, then
* we can return and rely it's properly handled.
*/
if (!thread_is_scheduled(t_isis_cfg))
return;
THREAD_OFF(t_isis_cfg);
isis_config_finish(t_isis_cfg);
}
#ifdef FABRICD
FRR_DAEMON_INFO(fabricd, OPEN_FABRIC, .vty_port = FABRICD_VTY_PORT,
@ -231,6 +265,7 @@ int main(int argc, char **argv, char **envp)
/*
* initializations
*/
cmd_init_config_callbacks(isis_config_start, isis_config_end);
isis_error_init();
access_list_init();
access_list_add_hook(isis_filter_update);

View File

@ -87,6 +87,9 @@ static struct isis_master isis_master;
/* ISIS process wide configuration pointer to export. */
struct isis_master *im;
/* ISIS config processing thread */
struct thread *t_isis_cfg;
#ifndef FABRICD
DEFINE_HOOK(isis_hook_db_overload, (const struct isis_area *area), (area));
#endif /* ifndef FABRICD */
@ -3234,6 +3237,16 @@ void isis_area_overload_on_startup_set(struct isis_area *area,
}
}
void config_end_lsp_generate(struct isis_area *area)
{
if (listcount(area->area_addrs) > 0) {
if (CHECK_FLAG(area->is_type, IS_LEVEL_1))
lsp_generate(area, IS_LEVEL_1);
if (CHECK_FLAG(area->is_type, IS_LEVEL_2))
lsp_generate(area, IS_LEVEL_2);
}
}
/*
* Returns the path of the file (non-volatile memory) that contains restart
* information.

View File

@ -99,6 +99,8 @@ struct isis {
extern struct isis_master *im;
extern struct thread *t_isis_cfg;
enum spf_tree_id {
SPFTREE_IPV4 = 0,
SPFTREE_IPV6,
@ -314,6 +316,8 @@ char *isis_restart_filepath(void);
void isis_restart_write_overload_time(struct isis_area *isis_area,
uint32_t overload_time);
uint32_t isis_restart_read_overload_time(struct isis_area *isis_area);
void config_end_lsp_generate(struct isis_area *area);
/* YANG paths */
#define ISIS_INSTANCE "/frr-isisd:isis/instance"
#define ISIS_SR "/frr-isisd:isis/instance/segment-routing"