On 24/11/2022 23:09, Ido Schimmel wrote: > When the kernel receives a route deletion request from user space it > tries to delete a route that matches the route attributes specified in > the request. > > If only prefix information is specified in the request, the kernel > should delete the first matching FIB alias regardless of its associated > FIB info. However, an error is currently returned when the FIB info is > backed by a nexthop object: > > # ip nexthop add id 1 via 192.0.2.2 dev dummy10 > # ip route add 198.51.100.0/24 nhid 1 > # ip route del 198.51.100.0/24 > RTNETLINK answers: No such process > > Fix by matching on such a FIB info when legacy nexthop attributes are > not specified in the request. An earlier check already covers the case > where a nexthop ID is specified in the request. > > Add tests that cover these flows. Before the fix: > > # ./fib_nexthops.sh -t ipv4_fcnal > ... > TEST: Delete route when not specifying nexthop attributes [FAIL] > > Tests passed: 11 > Tests failed: 1 > > After the fix: > > # ./fib_nexthops.sh -t ipv4_fcnal > ... > TEST: Delete route when not specifying nexthop attributes [ OK ] > > Tests passed: 12 > Tests failed: 0 > > No regressions in other tests: > > # ./fib_nexthops.sh > ... > Tests passed: 228 > Tests failed: 0 > > # ./fib_tests.sh > ... > Tests passed: 186 > Tests failed: 0 > > Cc: stable@xxxxxxxxxxxxxxx > Reported-by: Jonas Gorski <jonas.gorski@xxxxxxxxx> > Tested-by: Jonas Gorski <jonas.gorski@xxxxxxxxx> > Fixes: 493ced1ac47c ("ipv4: Allow routes to use nexthop objects") > Fixes: 6bf92d70e690 ("net: ipv4: fix route with nexthop object delete warning") > Fixes: 61b91eb33a69 ("ipv4: Handle attempt to delete multipath route when fib_info contains an nh reference") > Signed-off-by: Ido Schimmel <idosch@xxxxxxxxxx> > --- > net/ipv4/fib_semantics.c | 8 +++++--- > tools/testing/selftests/net/fib_nexthops.sh | 11 +++++++++++ > 2 files changed, 16 insertions(+), 3 deletions(-) > Reviewed-by: Nikolay Aleksandrov <razor@xxxxxxxxxxxxx> > diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c > index f721c308248b..19a662003eef 100644 > --- a/net/ipv4/fib_semantics.c > +++ b/net/ipv4/fib_semantics.c > @@ -888,9 +888,11 @@ int fib_nh_match(struct net *net, struct fib_config *cfg, struct fib_info *fi, > return 1; > } > > - /* cannot match on nexthop object attributes */ > - if (fi->nh) > - return 1; > + if (fi->nh) { > + if (cfg->fc_oif || cfg->fc_gw_family || cfg->fc_mp) > + return 1; > + return 0; > + } > > if (cfg->fc_oif || cfg->fc_gw_family) { > struct fib_nh *nh; > diff --git a/tools/testing/selftests/net/fib_nexthops.sh b/tools/testing/selftests/net/fib_nexthops.sh > index ee5e98204d3d..a47b26ab48f2 100755 > --- a/tools/testing/selftests/net/fib_nexthops.sh > +++ b/tools/testing/selftests/net/fib_nexthops.sh > @@ -1228,6 +1228,17 @@ ipv4_fcnal() > run_cmd "$IP ro add 172.16.101.0/24 nhid 21" > run_cmd "$IP ro del 172.16.101.0/24 nexthop via 172.16.1.7 dev veth1 nexthop via 172.16.1.8 dev veth1" > log_test $? 2 "Delete multipath route with only nh id based entry" > + > + run_cmd "$IP nexthop add id 22 via 172.16.1.6 dev veth1" > + run_cmd "$IP ro add 172.16.102.0/24 nhid 22" > + run_cmd "$IP ro del 172.16.102.0/24 dev veth1" > + log_test $? 2 "Delete route when specifying only nexthop device" > + > + run_cmd "$IP ro del 172.16.102.0/24 via 172.16.1.6" > + log_test $? 2 "Delete route when specifying only gateway" > + > + run_cmd "$IP ro del 172.16.102.0/24" > + log_test $? 0 "Delete route when not specifying nexthop attributes" > } > > ipv4_grp_fcnal()