Skip to content

Commit

Permalink
ipv6: do not delete previously existing ECMP routes if add fails
Browse files Browse the repository at this point in the history
If adding a nexthop of an IPv6 multipath route fails, comment in
ip6_route_multipath() says we are going to delete all nexthops already
added. However, current implementation deletes even the routes it
hasn't even tried to add yet. For example, running

  ip route add 1234:5678::/64 \
      nexthop via fe80::aa dev dummy1 \
      nexthop via fe80::bb dev dummy1 \
      nexthop via fe80::cc dev dummy1

twice results in removing all routes first command added.

Limit the second (delete) run to nexthops that succeeded in the first
(add) run.

Fixes: 51ebd31 ("ipv6: add support of equal cost multipath (ECMP)")
Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
mkubecek authored and davem330 committed May 20, 2015
1 parent 892bd62 commit 35f1b4e
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion net/ipv6/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -2504,9 +2504,9 @@ static int ip6_route_multipath(struct fib6_config *cfg, int add)
int attrlen;
int err = 0, last_err = 0;

remaining = cfg->fc_mp_len;
beginning:
rtnh = (struct rtnexthop *)cfg->fc_mp;
remaining = cfg->fc_mp_len;

/* Parse a Multipath Entry */
while (rtnh_ok(rtnh, remaining)) {
Expand Down Expand Up @@ -2536,6 +2536,7 @@ static int ip6_route_multipath(struct fib6_config *cfg, int add)
* next hops that have been already added.
*/
add = 0;
remaining = cfg->fc_mp_len - remaining;
goto beginning;
}
}
Expand Down

0 comments on commit 35f1b4e

Please sign in to comment.