diff mbox series

[net] ipv4: Fix route deletion when nexthop info is not specified

Message ID 20221124210932.2470010-1-idosch@nvidia.com (mailing list archive)
State Accepted
Commit d5082d386eee7e8ec46fa8581932c81a4961dcef
Delegated to: Netdev Maintainers
Headers show
Series [net] ipv4: Fix route deletion when nexthop info is not specified | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net
netdev/fixes_present success Fixes tag present in non-next series
netdev/subject_prefix success Link
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 23 this patch: 23
netdev/cc_maintainers fail 1 blamed authors not CCed: dsahern@kernel.org; 4 maintainers not CCed: linux-kselftest@vger.kernel.org shuah@kernel.org yoshfuji@linux-ipv6.org dsahern@kernel.org
netdev/build_clang success Errors and warnings before: 6 this patch: 6
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success net selftest script(s) already in Makefile
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 21 this patch: 21
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 31 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Ido Schimmel Nov. 24, 2022, 9:09 p.m. UTC
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@vger.kernel.org
Reported-by: Jonas Gorski <jonas.gorski@gmail.com>
Tested-by: Jonas Gorski <jonas.gorski@gmail.com>
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@nvidia.com>
---
 net/ipv4/fib_semantics.c                    |  8 +++++---
 tools/testing/selftests/net/fib_nexthops.sh | 11 +++++++++++
 2 files changed, 16 insertions(+), 3 deletions(-)

Comments

Nikolay Aleksandrov Nov. 24, 2022, 9:25 p.m. UTC | #1
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@vger.kernel.org
> Reported-by: Jonas Gorski <jonas.gorski@gmail.com>
> Tested-by: Jonas Gorski <jonas.gorski@gmail.com>
> 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@nvidia.com>
> ---
>  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@blackwall.org>

> 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()
David Ahern Nov. 25, 2022, 3:52 a.m. UTC | #2
On 11/24/22 2:09 PM, 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@vger.kernel.org
> Reported-by: Jonas Gorski <jonas.gorski@gmail.com>
> Tested-by: Jonas Gorski <jonas.gorski@gmail.com>
> 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@nvidia.com>
> ---
>  net/ipv4/fib_semantics.c                    |  8 +++++---
>  tools/testing/selftests/net/fib_nexthops.sh | 11 +++++++++++
>  2 files changed, 16 insertions(+), 3 deletions(-)
> 

Reviewed-by: David Ahern <dsahern@kernel.org>
Thorsten Leemhuis Nov. 25, 2022, 10:07 a.m. UTC | #3
Hi, this is your Linux kernel regression tracker.

On 24.11.22 22: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.
> [...]
 > Cc: stable@vger.kernel.org
> Reported-by: Jonas Gorski <jonas.gorski@gmail.com>

Many thx for taking care of this. There is one small thing to improve,
please add the following tags here:

Link:
https://lore.kernel.org/r/CAOiHx==ddZr6mvvbzgoAwwhJW76qGNVOcNsTG-6m79Ch%2B=aA5Q@mail.gmail.com/

To explain: Linus[1] and others considered proper link tags in cases
like important, as they allow anyone to look into the backstory weeks or
years from now. That why they should be placed here, as outlined by the
documentation[2]. I care personally, because these tags make my
regression tracking efforts a whole lot easier, as they allow my
tracking bot 'regzbot' to automatically connect reports with patches
posted or committed to fix tracked regressions.

Apropos regzbot, let me tell regzbot to monitor this thread:

#regzbot ^backmonitor:
https://lore.kernel.org/r/CAOiHx==ddZr6mvvbzgoAwwhJW76qGNVOcNsTG-6m79Ch%2B=aA5Q@mail.gmail.com/

Ciao, Thorsten (wearing his 'the Linux kernel's regression tracker' hat)

P.S.: As the Linux kernel's regression tracker I deal with a lot of
reports and sometimes miss something important when writing mails like
this. If that's the case here, don't hesitate to tell me in a public
reply, it's in everyone's interest to set the public record straight.

[1] for details, see:
https://lore.kernel.org/all/CAHk-=wjMmSZzMJ3Xnskdg4+GGz=5p5p+GSYyFBTh0f-DgvdBWg@mail.gmail.com/
https://lore.kernel.org/all/CAHk-=wgs38ZrfPvy=nOwVkVzjpM3VFU1zobP37Fwd_h9iAD5JQ@mail.gmail.com/
https://lore.kernel.org/all/CAHk-=wjxzafG-=J8oT30s7upn4RhBs6TX-uVFZ5rME+L5_DoJA@mail.gmail.com/

[2] see Documentation/process/submitting-patches.rst
(http://docs.kernel.org/process/submitting-patches.html) and
Documentation/process/5.Posting.rst
(https://docs.kernel.org/process/5.Posting.html)
patchwork-bot+netdevbpf@kernel.org Nov. 29, 2022, 1 a.m. UTC | #4
Hello:

This patch was applied to netdev/net.git (master)
by Jakub Kicinski <kuba@kernel.org>:

On Thu, 24 Nov 2022 23:09:32 +0200 you 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:
> 
> [...]

Here is the summary with links:
  - [net] ipv4: Fix route deletion when nexthop info is not specified
    https://git.kernel.org/netdev/net/c/d5082d386eee

You are awesome, thank you!
diff mbox series

Patch

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()