Merge pull request #1991 from chiragshah6/ospfv3_dev

ospf6d: fix loop in ABRs
This commit is contained in:
Russ White 2018-03-30 09:23:42 -04:00 committed by GitHub
commit 9e1d8e8067
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 7 deletions

View File

@ -695,6 +695,7 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa)
int is_debug = 0; int is_debug = 0;
struct ospf6_inter_prefix_lsa *prefix_lsa = NULL; struct ospf6_inter_prefix_lsa *prefix_lsa = NULL;
struct ospf6_inter_router_lsa *router_lsa = NULL; struct ospf6_inter_router_lsa *router_lsa = NULL;
struct ospf6_path *path;
memset(&prefix, 0, sizeof(prefix)); memset(&prefix, 0, sizeof(prefix));
@ -900,6 +901,9 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa)
ospf6_route_copy_nexthops(route, abr_entry); ospf6_route_copy_nexthops(route, abr_entry);
path = ospf6_path_dup(&route->path);
ospf6_copy_nexthops(path->nh_list, abr_entry->nh_list);
listnode_add_sort(route->paths, path);
/* (7) If the routes are identical, copy the next hops over to existing /* (7) If the routes are identical, copy the next hops over to existing
route. ospf6's route table implementation will otherwise string both route. ospf6's route table implementation will otherwise string both

View File

@ -1326,6 +1326,7 @@ void ospf6_intra_prefix_lsa_add(struct ospf6_lsa *lsa)
char buf[PREFIX2STR_BUFFER]; char buf[PREFIX2STR_BUFFER];
struct interface *ifp; struct interface *ifp;
int direct_connect = 0; int direct_connect = 0;
struct ospf6_path *path;
if (OSPF6_LSA_IS_MAXAGE(lsa)) if (OSPF6_LSA_IS_MAXAGE(lsa))
return; return;
@ -1417,9 +1418,14 @@ void ospf6_intra_prefix_lsa_add(struct ospf6_lsa *lsa)
ospf6_route_copy_nexthops(route, ls_entry); ospf6_route_copy_nexthops(route, ls_entry);
} }
path = ospf6_path_dup(&route->path);
ospf6_copy_nexthops(path->nh_list, route->path.nh_list);
listnode_add_sort(route->paths, path);
if (IS_OSPF6_DEBUG_EXAMIN(INTRA_PREFIX)) { if (IS_OSPF6_DEBUG_EXAMIN(INTRA_PREFIX)) {
prefix2str(&route->prefix, buf, sizeof(buf)); prefix2str(&route->prefix, buf, sizeof(buf));
zlog_debug(" route %s add with nh count %u", buf, zlog_debug(" route %s add with cost %u nh count %u",
buf, route->path.cost,
listcount(route->nh_list)); listcount(route->nh_list));
} }
@ -1735,9 +1741,6 @@ void ospf6_intra_brouter_calculation(struct ospf6_area *oa)
&& CHECK_FLAG(brouter->flag, OSPF6_ROUTE_ADD)) { && CHECK_FLAG(brouter->flag, OSPF6_ROUTE_ADD)) {
UNSET_FLAG(brouter->flag, OSPF6_ROUTE_REMOVE); UNSET_FLAG(brouter->flag, OSPF6_ROUTE_REMOVE);
UNSET_FLAG(brouter->flag, OSPF6_ROUTE_ADD); UNSET_FLAG(brouter->flag, OSPF6_ROUTE_ADD);
zlog_debug("%s: EVENT unset REOUTE_REMOVE and ROUTE_ADD brouter %s",
__PRETTY_FUNCTION__, brouter_name);
ospf6_brouter_debug_print(brouter);
} }
if (CHECK_FLAG(brouter->flag, OSPF6_ROUTE_REMOVE)) { if (CHECK_FLAG(brouter->flag, OSPF6_ROUTE_REMOVE)) {

View File

@ -460,9 +460,6 @@ int ospf6_route_cmp(struct ospf6_route *ra, struct ospf6_route *rb)
if (ra->type != rb->type) if (ra->type != rb->type)
return (ra->type - rb->type); return (ra->type - rb->type);
if (ra->path.area_id != rb->path.area_id)
return (ntohl(ra->path.area_id) - ntohl(rb->path.area_id));
if (ra->path.type != rb->path.type) if (ra->path.type != rb->path.type)
return (ra->path.type - rb->path.type); return (ra->path.type - rb->path.type);
@ -476,6 +473,9 @@ int ospf6_route_cmp(struct ospf6_route *ra, struct ospf6_route *rb)
return (ra->path.cost - rb->path.cost); return (ra->path.cost - rb->path.cost);
} }
if (ra->path.area_id != rb->path.area_id)
return (ntohl(ra->path.area_id) - ntohl(rb->path.area_id));
return 0; return 0;
} }