]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospfd: enhance TI-LFA memory management
authorGalaxyGorilla <sascha@netdef.org>
Wed, 18 Nov 2020 13:18:21 +0000 (13:18 +0000)
committerGalaxyGorilla <sascha@netdef.org>
Tue, 19 Jan 2021 15:32:13 +0000 (15:32 +0000)
Signed-off-by: GalaxyGorilla <sascha@netdef.org>
ospfd/ospf_route.c
ospfd/ospf_ti_lfa.c

index 8079eeefe9c17becf9884da6491b6915069f0c17..7cfcaf14be610b6cd5aba63c7e1f43f44f99cdac 100644 (file)
@@ -71,15 +71,31 @@ struct ospf_path *ospf_path_new(void)
 static struct ospf_path *ospf_path_dup(struct ospf_path *path)
 {
        struct ospf_path *new;
+       int memsize;
 
        new = ospf_path_new();
        memcpy(new, path, sizeof(struct ospf_path));
 
+       /* optional TI-LFA backup paths */
+       if (path->srni.backup_label_stack) {
+               memsize = sizeof(struct mpls_label_stack)
+                         + (sizeof(mpls_label_t)
+                            * path->srni.backup_label_stack->num_labels);
+               new->srni.backup_label_stack =
+                       XCALLOC(MTYPE_OSPF_PATH, memsize);
+               memcpy(new->srni.backup_label_stack,
+                      path->srni.backup_label_stack, memsize);
+       }
+
        return new;
 }
 
 void ospf_path_free(struct ospf_path *op)
 {
+       /* optional TI-LFA backup paths */
+       if (op->srni.backup_label_stack)
+               XFREE(MTYPE_OSPF_PATH, op->srni.backup_label_stack);
+
        XFREE(MTYPE_OSPF_PATH, op);
 }
 
index 0830b82f6acf2d577b4d63ff7871c953160e5f78..838b2378d26e2bda51dceefef36bb905ab3a82f3 100644 (file)
@@ -634,8 +634,28 @@ void ospf_ti_lfa_insert_backup_paths(struct ospf_area *area,
                                continue;
                        }
 
-                       path->srni.backup_label_stack = q_space->label_stack;
-                       path->srni.backup_nexthop = q_space->nexthop;
+                       /* If there's a backup label stack, insert it*/
+                       if (q_space->label_stack) {
+                               /* Init the backup path data in path */
+                               path->srni.backup_label_stack = XCALLOC(
+                                       MTYPE_OSPF_PATH,
+                                       sizeof(struct mpls_label_stack)
+                                               + sizeof(mpls_label_t)
+                                                         * q_space->label_stack
+                                                                   ->num_labels);
+
+                               /* Copy over the label stack */
+                               path->srni.backup_label_stack->num_labels =
+                                       q_space->label_stack->num_labels;
+                               memcpy(path->srni.backup_label_stack->label,
+                                      q_space->label_stack->label,
+                                      sizeof(mpls_label_t)
+                                              * q_space->label_stack
+                                                        ->num_labels);
+
+                               /* Set the backup nexthop too */
+                               path->srni.backup_nexthop = q_space->nexthop;
+                       }
 
                        if (path->srni.backup_label_stack) {
                                mpls_label2str(q_space->label_stack->num_labels,
@@ -665,13 +685,10 @@ void ospf_ti_lfa_free_p_spaces(struct ospf_area *area)
                while ((q_space = q_spaces_pop(p_space->q_spaces))) {
                        ospf_spf_cleanup(q_space->root, q_space->vertex_list);
 
-                       /*
-                        * TODO: label stack is used for route installation
-                        * XFREE(MTYPE_OSPF_Q_SPACE, q_space->label_stack);
-                        */
-
+                       XFREE(MTYPE_OSPF_Q_SPACE, q_space->label_stack);
                        XFREE(MTYPE_OSPF_Q_SPACE, q_space);
                }
+
                ospf_spf_cleanup(p_space->root, p_space->vertex_list);
                ospf_spf_cleanup(p_space->pc_spf, p_space->pc_vertex_list);
                XFREE(MTYPE_OSPF_P_SPACE, p_space->protected_resource);