]> git.proxmox.com Git - mirror_frr.git/commitdiff
ospfd: fix initialization when vrf doesn't exist yet
authorIgor Ryzhov <iryzhov@nfware.com>
Thu, 12 Aug 2021 12:49:54 +0000 (15:49 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Thu, 12 Aug 2021 12:49:54 +0000 (15:49 +0300)
There are a couple of things that are not initialized if the OSPF router
is created in a non-existent VRF:
- ospf_lsa_maxage_walker
- ospf_lsa_refresh_walker
- ospf_opaque_type11_lsa_init

Rearrange some code to always initialize them and make it easier to find
similar problems in the future.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
ospfd/ospfd.c

index 21fa62531187973b15274290ebca1cfa340ba538..9a421de0174dc25b08d24e1358f6f427db385a9f 100644 (file)
@@ -291,6 +291,16 @@ static int ospf_area_id_cmp(struct ospf_area *a1, struct ospf_area *a2)
        return 0;
 }
 
+static void ospf_add(struct ospf *ospf)
+{
+       listnode_add(om->ospf, ospf);
+}
+
+static void ospf_delete(struct ospf *ospf)
+{
+       listnode_delete(om->ospf, ospf);
+}
+
 struct ospf *ospf_new_alloc(unsigned short instance, const char *name)
 {
        int i;
@@ -366,6 +376,8 @@ struct ospf *ospf_new_alloc(unsigned short instance, const char *name)
        new->maxage_delay = OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT;
        new->maxage_lsa = route_table_init();
        new->t_maxage_walker = NULL;
+       thread_add_timer(master, ospf_lsa_maxage_walker, new,
+                        OSPF_LSA_MAXAGE_CHECK_INTERVAL, &new->t_maxage_walker);
 
        /* Max paths initialization */
        new->max_multipath = MULTIPATH_NUM;
@@ -376,6 +388,8 @@ struct ospf *ospf_new_alloc(unsigned short instance, const char *name)
        new->lsa_refresh_queue.index = 0;
        new->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;
        new->t_lsa_refresher = NULL;
+       thread_add_timer(master, ospf_lsa_refresh_walker, new,
+                        new->lsa_refresh_interval, &new->t_lsa_refresher);
        new->lsa_refresher_started = monotime(NULL);
 
        new->ibuf = stream_new(OSPF_MAX_PACKET_SIZE + 1);
@@ -390,6 +404,8 @@ struct ospf *ospf_new_alloc(unsigned short instance, const char *name)
 
        ospf_asbr_external_aggregator_init(new);
 
+       ospf_opaque_type11_lsa_init(new);
+
        QOBJ_REG(new, ospf);
 
        new->fd = -1;
@@ -403,23 +419,23 @@ static struct ospf *ospf_new(unsigned short instance, const char *name)
        struct ospf *new;
 
        new = ospf_new_alloc(instance, name);
+       ospf_add(new);
+
+       if (new->vrf_id == VRF_UNKNOWN)
+               return new;
 
        if ((ospf_sock_init(new)) < 0) {
-               if (new->vrf_id != VRF_UNKNOWN)
-                       flog_err(
-                               EC_LIB_SOCKET,
-                               "%s: ospf_sock_init is unable to open a socket",
-                               __func__);
+               flog_err(EC_LIB_SOCKET,
+                        "%s: ospf_sock_init is unable to open a socket",
+                        __func__);
                return new;
        }
 
-       thread_add_timer(master, ospf_lsa_maxage_walker, new,
-                        OSPF_LSA_MAXAGE_CHECK_INTERVAL, &new->t_maxage_walker);
-       thread_add_timer(master, ospf_lsa_refresh_walker, new,
-                        new->lsa_refresh_interval, &new->t_lsa_refresher);
-
        thread_add_read(master, ospf_read, new, new->fd, &new->t_read);
 
+       new->oi_running = 1;
+       ospf_router_id_update(new);
+
        /*
         * Read from non-volatile memory whether this instance is performing a
         * graceful restart or not.
@@ -455,16 +471,6 @@ static int ospf_is_ready(struct ospf *ospf)
        return 1;
 }
 
-static void ospf_add(struct ospf *ospf)
-{
-       listnode_add(om->ospf, ospf);
-}
-
-static void ospf_delete(struct ospf *ospf)
-{
-       listnode_delete(om->ospf, ospf);
-}
-
 struct ospf *ospf_lookup_by_inst_name(unsigned short instance, const char *name)
 {
        struct ospf *ospf = NULL;
@@ -483,16 +489,6 @@ struct ospf *ospf_lookup_by_inst_name(unsigned short instance, const char *name)
        return NULL;
 }
 
-static void ospf_init(struct ospf *ospf)
-{
-       ospf_opaque_type11_lsa_init(ospf);
-
-       if (ospf->vrf_id != VRF_UNKNOWN)
-               ospf->oi_running = 1;
-
-       ospf_router_id_update(ospf);
-}
-
 struct ospf *ospf_lookup(unsigned short instance, const char *name)
 {
        struct ospf *ospf;
@@ -513,12 +509,8 @@ struct ospf *ospf_get(unsigned short instance, const char *name, bool *created)
        ospf = ospf_lookup(instance, name);
 
        *created = (ospf == NULL);
-       if (ospf == NULL) {
+       if (ospf == NULL)
                ospf = ospf_new(instance, name);
-               ospf_add(ospf);
-
-               ospf_init(ospf);
-       }
 
        return ospf;
 }