diff options
author | Don Slice <dslice@cumulusnetworks.com> | 2020-04-02 19:50:53 +0200 |
---|---|---|
committer | Don Slice <dslice@cumulusnetworks.com> | 2020-04-09 20:46:45 +0200 |
commit | 14ff96e67da11e624ddaac1e159dd4b0602a538a (patch) | |
tree | 400ea68d5acae735585fad7e67162ba048bcb531 /ospf6d/ospf6_abr.c | |
parent | Merge pull request #6124 from kuldeepkash/bgp_basic_functionality (diff) | |
download | frr-14ff96e67da11e624ddaac1e159dd4b0602a538a.tar.xz frr-14ff96e67da11e624ddaac1e159dd4b0602a538a.zip |
ospf6d: stop looping thru same Inter-Area Router LSAs
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>
Diffstat (limited to 'ospf6d/ospf6_abr.c')
-rw-r--r-- | ospf6d/ospf6_abr.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/ospf6d/ospf6_abr.c b/ospf6d/ospf6_abr.c index 972144611..1f6cc9d52 100644 --- a/ospf6d/ospf6_abr.c +++ b/ospf6d/ospf6_abr.c @@ -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) |