summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_route.c
diff options
context:
space:
mode:
authorChirag Shah <chirag@cumulusnetworks.com>2018-04-23 15:21:33 -0700
committerChirag Shah <chirag@cumulusnetworks.com>2018-05-01 16:29:21 -0700
commit6942698da457dd8da4b5d16ecdf7bb24d1d80096 (patch)
tree4e2d113b8d901e1d4abd23f150203633e1787e49 /ospf6d/ospf6_route.c
parent4fb6f519289a3e8bf7f72f86fe5cde6f5a3034b6 (diff)
ospf6d: fix intra prefix ecmp
When there are multiple advertisers/paths to reach Intra-Prefix route, if any path is removed, re-added back, it does add to the same route node. ospf6 intra prefix, first stored in oa->route_table then as part of add cb, it would add to ospf6->route_table which adds to FIB. When copying a route with its paths & NHs from oa->table to ospf6->table the path origin should not be modified otherwise ospf6->table would not find existing node rather it appends new node. Use spf_table to fetch nexthops for a given advertisers/path, to form effective nexthop list for a route. Ticket:CM-16139 Testing Done: R2 ---- R3 | | R1 ---- R4 Inject Intra Ara Prefix LSA from R1 & R3, validate R2 and R4 having two origination point/paths to reach for a route. Trigger link flap, frr restart or remove/readd R3's INP one of the injection point. Remove link between R4 to R1 and validate R3 carrying single path to reach prefix. Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
Diffstat (limited to 'ospf6d/ospf6_route.c')
-rw-r--r--ospf6d/ospf6_route.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
index 8be00d9b41..39272b3701 100644
--- a/ospf6d/ospf6_route.c
+++ b/ospf6d/ospf6_route.c
@@ -611,9 +611,10 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
prefix2str(&route->prefix, buf, sizeof(buf));
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
- zlog_debug("%s %p: route add %p: %s",
+ zlog_debug("%s %p: route add %p: %s paths %u nh %u",
ospf6_route_table_name(table), (void *)table,
- (void *)route, buf);
+ (void *)route, buf, listcount(route->paths),
+ listcount(route->nh_list));
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
zlog_debug("%s: route add: %s", ospf6_route_table_name(table),
buf);
@@ -664,11 +665,13 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
zlog_debug(
- "%s %p: route add %p cost %u nh %u: update of %p old cost %u nh %u",
+ "%s %p: route add %p cost %u paths %u nh %u: update of %p cost %u paths %u nh %u",
ospf6_route_table_name(table), (void *)table,
(void *)route, route->path.cost,
+ listcount(route->paths),
listcount(route->nh_list), (void *)old,
- old->path.cost, listcount(old->nh_list));
+ old->path.cost, listcount(old->paths),
+ listcount(old->nh_list));
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
zlog_debug("%s: route add: update",
ospf6_route_table_name(table));