On 8/29/22 4:01 AM, Nicolas Dichtel wrote: > __mkroute_input() uses fib_validate_source() to trigger an icmp redirect. > My understanding is that fib_validate_source() is used to know if the src > address and the gateway address are on the same link. For that, > fib_validate_source() returns 1 (same link) or 0 (not the same network). > __mkroute_input() is the only user of these positive values, all other > callers only look if the returned value is negative. > > Since the below patch, fib_validate_source() didn't return anymore 1 when > both addresses are on the same network, because the route lookup returns > RT_SCOPE_LINK instead of RT_SCOPE_HOST. But this is, in fact, right. > Let's adapat the test to return 1 again when both addresses are on the same > link. > > CC: stable@xxxxxxxxxxxxxxx > Fixes: 747c14307214 ("ip: fix dflt addr selection for connected nexthop") > Reported-by: kernel test robot <yujie.liu@xxxxxxxxx> > Reported-by: Heng Qi <hengqi@xxxxxxxxxxxxxxxxx> > Signed-off-by: Nicolas Dichtel <nicolas.dichtel@xxxxxxxxx> > --- > > This code exists since more than two decades: > https://git.kernel.org/pub/scm/linux/kernel/git/davem/netdev-vger-cvs.git/commit/?id=0c2c94df8133f > > Please, feel free to comment if my analysis seems wrong. > > Regards, > Nicolas > > net/ipv4/fib_frontend.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c > index f361d3d56be2..943edf4ad4db 100644 > --- a/net/ipv4/fib_frontend.c > +++ b/net/ipv4/fib_frontend.c > @@ -389,7 +389,7 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst, > dev_match = dev_match || (res.type == RTN_LOCAL && > dev == net->loopback_dev); > if (dev_match) { > - ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_HOST; > + ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_LINK; > return ret; > } > if (no_addr) > @@ -401,7 +401,7 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst, > ret = 0; > if (fib_lookup(net, &fl4, &res, FIB_LOOKUP_IGNORE_LINKSTATE) == 0) { > if (res.type == RTN_UNICAST) > - ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_HOST; > + ret = FIB_RES_NHC(res)->nhc_scope >= RT_SCOPE_LINK; > } > return ret; > Looks ok to me. Reviewed-by: David Ahern <dsahern@xxxxxxxxxx>