summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_route.c
diff options
context:
space:
mode:
authorChirag Shah <chirag@cumulusnetworks.com>2018-02-14 19:02:11 -0800
committerChirag Shah <chirag@cumulusnetworks.com>2018-03-01 07:47:17 -0800
commit07b37f93a7e5670b7a25e66a29a7363640005027 (patch)
tree235e6233ac91b5357e3e5bc0450c840f9abe355f /ospf6d/ospf6_route.c
parentc98f4d81aa5d4113ceea58ce6db4bebab5c99735 (diff)
ospf6d: ECMP for external routes
The route being added check its origin matches, with any of the existing path (list of paths). Remove the existing path, add if its cost is eqaual or less than any of the existing path. For a given route and of existing path cost is lower (better) than one being added, discard new route update. The existing path cost is higher (lower) than one being added, ospf6_route_add replaces existing with new route info. Compare cost between delete request and with existing route. Ticket:CM-16139 Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
Diffstat (limited to 'ospf6d/ospf6_route.c')
-rw-r--r--ospf6d/ospf6_route.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
index 19eb9a3fe6..ef0a093d13 100644
--- a/ospf6d/ospf6_route.c
+++ b/ospf6d/ospf6_route.c
@@ -469,6 +469,8 @@ int ospf6_route_cmp(struct ospf6_route *ra, struct ospf6_route *rb)
if (ra->path.type == OSPF6_PATH_TYPE_EXTERNAL2) {
if (ra->path.u.cost_e2 != rb->path.u.cost_e2)
return (ra->path.u.cost_e2 - rb->path.u.cost_e2);
+ else
+ return (ra->path.cost - rb->path.cost);
} else {
if (ra->path.cost != rb->path.cost)
return (ra->path.cost - rb->path.cost);
@@ -627,10 +629,10 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
if (ospf6_route_is_identical(old, route)) {
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
zlog_debug(
- "%s %p: route add %p: needless update of %p",
+ "%s %p: route add %p: needless update of %p old cost %u",
ospf6_route_table_name(table),
(void *)table, (void *)route,
- (void *)old);
+ (void *)old, old->path.cost);
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
zlog_debug("%s: route add: needless update",
ospf6_route_table_name(table));
@@ -645,9 +647,10 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
}
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
- zlog_debug("%s %p: route add %p: update of %p",
+ zlog_debug("%s %p: route add %p cost %u: update of %p old cost %u",
ospf6_route_table_name(table), (void *)table,
- (void *)route, (void *)old);
+ (void *)route, route->path.cost, (void *)old,
+ old->path.cost);
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
zlog_debug("%s: route add: update",
ospf6_route_table_name(table));
@@ -686,13 +689,14 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
if (prev || next) {
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
zlog_debug(
- "%s %p: route add %p: another path: prev %p, next %p node refcount %u",
+ "%s %p: route add %p cost %u: another path: prev %p, next %p node ref %u",
ospf6_route_table_name(table), (void *)table,
- (void *)route, (void *)prev, (void *)next,
- node->lock);
+ (void *)route, route->path.cost, (void *)prev,
+ (void *)next, node->lock);
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
- zlog_debug("%s: route add: another path found",
- ospf6_route_table_name(table));
+ zlog_debug("%s: route add cost %u: another path found",
+ ospf6_route_table_name(table),
+ route->path.cost);
if (prev == NULL)
prev = next->prev;
@@ -814,9 +818,9 @@ void ospf6_route_remove(struct ospf6_route *route,
prefix2str(&route->prefix, buf, sizeof(buf));
if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
- zlog_debug("%s %p: route remove %p: %s refcount %u",
+ zlog_debug("%s %p: route remove %p: %s cost %u refcount %u",
ospf6_route_table_name(table), (void *)table,
- (void *)route, buf, route->lock);
+ (void *)route, buf, route->path.cost, route->lock);
else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
zlog_debug("%s: route remove: %s",
ospf6_route_table_name(table), buf);