At some point after b5d2d75e079a ("net/ipv6: Do not allow device only routes via the multipath API"), the IPv6 stack was updated such that device-only multipath routes can be installed and work correctly, but still weren't allowed in the code. This change removes the has_gateway check from rtm_to_fib6_multipath_config() and the fib_nh_gw_family check from rt6_qualify_for_ecmp(), allowing device-only multipath routes to be installed again. Signed-off-by: azey --- I tested this on a VM with two wireguard interfaces, and it seems to work as expected. It also causes fe80::/64 and ff00::/8 to be installed as multipath routes if there are multiple interfaces, but from my (somewhat limited) testing that doesn't cause any issues. I'm also not completely sure whether there are any other places in the code that assume multipath nexthops must have a gateway addr, but I didn't immediately find any. PS: This is my very first contribution to the kernel (and indeed first time sending a patch via mail), so sorry in advance if I messed anything up. --- include/net/ip6_route.h | 3 +-- net/ipv6/route.c | 6 ------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 7c5512baa4b2..07e131f9fcf5 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -73,8 +73,7 @@ static inline bool rt6_need_strict(const struct in6_addr *daddr) static inline bool rt6_qualify_for_ecmp(const struct fib6_info *f6i) { /* the RTF_ADDRCONF flag filters out RA's */ - return !(f6i->fib6_flags & RTF_ADDRCONF) && !f6i->nh && - f6i->fib6_nh->fib_nh_gw_family; + return !(f6i->fib6_flags & RTF_ADDRCONF) && !f6i->nh; } void ip6_route_input(struct sk_buff *skb); diff --git a/net/ipv6/route.c b/net/ipv6/route.c index aee6a10b112a..40763b90e22c 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -5138,12 +5138,6 @@ static int rtm_to_fib6_multipath_config(struct fib6_config *cfg, } } - if (newroute && (cfg->fc_nh_id || !has_gateway)) { - NL_SET_ERR_MSG(extack, - "Device only routes can not be added for IPv6 using the multipath API."); - return -EINVAL; - } - rtnh = rtnh_next(rtnh, &remaining); } while (rtnh_ok(rtnh, remaining)); -- 2.51.0