Skip to content

Commit

Permalink
ipv6: Teach tree walker to skip multipath routes
Browse files Browse the repository at this point in the history
As explained in previous patch, fib6_ifdown() needs to consider the
state of all the sibling routes when a multipath route is traversed.

This is done by evaluating all the siblings when the first sibling in a
multipath route is traversed. If the multipath route does not need to be
flushed (e.g., not all siblings are dead), then we should just skip the
multipath route as our work is done.

Have the tree walker jump to the last sibling when it is determined that
the multipath route needs to be skipped.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ido Schimmel authored and David S. Miller committed Jan 8, 2018
1 parent a2c554d commit b5cb5a7
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions net/ipv6/ip6_fib.c
Original file line number Diff line number Diff line change
@@ -1887,7 +1887,7 @@ static int fib6_clean_node(struct fib6_walker *w)

for_each_fib6_walker_rt(w) {
res = c->func(rt, c->arg);
if (res < 0) {
if (res == -1) {
w->leaf = rt;
res = fib6_del(rt, &info);
if (res) {
@@ -1900,6 +1900,12 @@ static int fib6_clean_node(struct fib6_walker *w)
continue;
}
return 0;
} else if (res == -2) {
if (WARN_ON(!rt->rt6i_nsiblings))
continue;
rt = list_last_entry(&rt->rt6i_siblings,
struct rt6_info, rt6i_siblings);
continue;
}
WARN_ON(res != 0);
}
@@ -1911,7 +1917,8 @@ static int fib6_clean_node(struct fib6_walker *w)
* Convenient frontend to tree walker.
*
* func is called on each route.
* It may return -1 -> delete this route.
* It may return -2 -> skip multipath route.
* -1 -> delete this route.
* 0 -> continue walking
*/

0 comments on commit b5cb5a7

Please sign in to comment.