Re: [PATCH v2] net/ipv6: allow device-only routes via the multipath API
From: azey
Date: Fri Nov 28 2025 - 07:39:44 EST
On 2025-11-28 09:38:07 +0100 Nicolas Dichtel <nicolas.dichtel@xxxxxxxxx> wrote:
> With IPv6, unlike IPv4, the ECMP next hops can be added one by one. Your commit
> doesn't allow this:
>
> $ ip -6 route add 2002::/64 via fd00:125::2 dev ntfp2
> $ ip -6 route append 2002::/64 dev ntfp3
> $ ip -6 route
> 2002::/64 via fd00:125::2 dev ntfp2 metric 1024 pref medium
> 2002::/64 dev ntfp3 metric 1024 pref medium
> ...
> $ ip -6 route append 2002::/64 via fd00:175::2 dev ntfp3
> $ ip -6 route
> 2002::/64 metric 1024 pref medium
> nexthop via fd00:125::2 dev ntfp2 weight 1
> nexthop via fd00:175::2 dev ntfp3 weight 1
>
> Note that the previous route via ntfp3 has been removed.
I just tested your example in a VM with my patch, and everything works
as you described. This is due to fib6_explicit_ecmp not overriding
rt6_qualify_for_ecmp(), but rather supplementing it with || - the
intention was for default behavior to be preserved for routes that
aren't created via ip6_route_multipath_add(), and from this example it
seems to work correctly in that regard.
And for ip6_route_multipath_add() routes, as I stated earlier the
behavior should not change either (except for the gateway check,
which is the only thing this patch wants to change).
wg0 has fd00::1/64, wg1 has fd00::2/64; Exact command history:
$ ip -6 r add 2002::/64 via fd00::2 dev wg0
$ ip -6 r append 2002::/64 dev wg1
$ ip -6 r
2002::/64 via fd00::2 dev wg0 metric 1024 pref medium
2002::/64 dev wg1 metric 1024 pref medium
...
$ ip -6 r append 2002::/64 via fd01::2 dev wg1
$ ip -6 r
2002::/64 metric 1024 pref medium
nexthop via fd00::2 dev wg0 weight 1
nexthop via fd01::2 dev wg1 weight 1
...
To also test the patch's functionality:
$ ip -6 r add 2003::/64 nexthop dev wg0 nexthop dev wg1
$ ip -6 r
2002::/64 metric 1024 pref medium
nexthop via fd00::2 dev wg0 weight 1
nexthop via fd01::2 dev wg1 weight 1
2003::/64 metric 1024 pref medium
nexthop dev wg0 weight 1
nexthop dev wg1 weight 1
...
And to make sure the v1 regression isn't present:
$ ip a add fd03::1/64 dev wg0
$ ip a add fd03::2/64 dev wg1
$ ip -6 r
2002::/64 metric 1024 pref medium
nexthop via fd00::2 dev wg0 weight 1
nexthop via fd01::2 dev wg1 weight 1
2003::/64 metric 1024 pref medium
nexthop dev wg0 weight 1
nexthop dev wg1 weight 1
fd03::/64 dev wg0 proto kernel metric 256 pref medium
fd03::/64 dev wg1 proto kernel metric 256 pref medium
...