]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospf6d: stop looping thru same Inter-Area Router LSAs
authorDon Slice <dslice@cumulusnetworks.com>
Thu, 2 Apr 2020 17:50:53 +0000 (17:50 +0000)
committerDon Slice <dslice@cumulusnetworks.com>
Thu, 9 Apr 2020 18:46:45 +0000 (18:46 +0000)
Processing loop uncovered when there are multiple ABRs also
acting as ASBRs into the same area in ospf6.  The problem
was that when looking thru the list of Inter-area router
entries, if the current entry being processed matched, it
still merged next-hops and re-initiated the process.  In
this fix, if the route/path matches and the next-hops also
match, there is no need to re-initiate the examine process.

Ticket: CM-28900
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
ospf6d/ospf6_abr.c

index 9721446112408857413514019f778751787f5131..1f6cc9d52777e1da76fc4c154ef9d603afaefea8 100644 (file)
@@ -1200,9 +1200,23 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa)
                                        listcount(old_route->nh_list));
                        }
                } else {
-                       /* adv. router exists in the list, update the nhs */
-                       list_delete_all_node(o_path->nh_list);
-                       ospf6_copy_nexthops(o_path->nh_list, route->nh_list);
+                       struct ospf6_route *tmp_route = ospf6_route_create();
+
+                       ospf6_copy_nexthops(tmp_route->nh_list,
+                                           o_path->nh_list);
+
+                       if (ospf6_route_cmp_nexthops(tmp_route, route) != 0) {
+                               /* adv. router exists in the list, update nhs */
+                               list_delete_all_node(o_path->nh_list);
+                               ospf6_copy_nexthops(o_path->nh_list,
+                                                   route->nh_list);
+                               ospf6_route_delete(tmp_route);
+                       } else {
+                               /* adv. router has no change in nhs */
+                               old_entry_updated = false;
+                               ospf6_route_delete(tmp_route);
+                               continue;
+                       }
                }
 
                if (is_debug)