Inline ip6_route_get_saddr()'s functionality in rt6_fill_node(), to prepare for replacing the former with a dst based function. NB: the l3mdev handling introduced by 252442f2ae31 "ipv6: fix source address selection with route leak" is dropped here - the l3mdev ifindex was a constant 0 on this call site, so that code was in fact dead. Signed-off-by: David Lamparter --- net/ipv6/route.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 3fbe0885c21c..a2362913ebed 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -5821,9 +5821,19 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb, if (nla_put_u32(skb, RTA_IIF, iif)) goto nla_put_failure; } else if (dest) { - struct in6_addr saddr_buf; - if (ip6_route_get_saddr(net, rt, dest, 0, 0, &saddr_buf) == 0 && - nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf)) + struct in6_addr saddr_buf, *saddr = NULL; + + if (rt->fib6_prefsrc.plen) { + saddr = &rt->fib6_prefsrc.addr; + } else { + struct net_device *dev = fib6_info_nh_dev(rt); + + if (ipv6_dev_get_saddr(net, dev, dest, 0, + &saddr_buf) == 0) + saddr = &saddr_buf; + } + + if (saddr && nla_put_in6_addr(skb, RTA_PREFSRC, saddr)) goto nla_put_failure; } -- 2.47.2