mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 18:01:54 +00:00
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:
commit
4fa0162568
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user