Commit 35f1b4e9 authored by Michal Kubeček's avatar Michal Kubeček Committed by David S. Miller

ipv6: do not delete previously existing ECMP routes if add fails

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: 51ebd318 ("ipv6: add support of equal cost multipath (ECMP)")
Signed-off-by: default avatarMichal Kubecek <mkubecek@suse.cz>
Acked-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 892bd629
...@@ -2504,9 +2504,9 @@ static int ip6_route_multipath(struct fib6_config *cfg, int add) ...@@ -2504,9 +2504,9 @@ static int ip6_route_multipath(struct fib6_config *cfg, int add)
int attrlen; int attrlen;
int err = 0, last_err = 0; int err = 0, last_err = 0;
remaining = cfg->fc_mp_len;
beginning: beginning:
rtnh = (struct rtnexthop *)cfg->fc_mp; rtnh = (struct rtnexthop *)cfg->fc_mp;
remaining = cfg->fc_mp_len;
/* Parse a Multipath Entry */ /* Parse a Multipath Entry */
while (rtnh_ok(rtnh, remaining)) { while (rtnh_ok(rtnh, remaining)) {
...@@ -2536,6 +2536,7 @@ static int ip6_route_multipath(struct fib6_config *cfg, int add) ...@@ -2536,6 +2536,7 @@ static int ip6_route_multipath(struct fib6_config *cfg, int add)
* next hops that have been already added. * next hops that have been already added.
*/ */
add = 0; add = 0;
remaining = cfg->fc_mp_len - remaining;
goto beginning; goto beginning;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment