* [PATCH net v2 1/2] ip: fix dflt addr selection for connected nexthop
[not found] <9fb5e3df069db50396799a250c4db761b1505dd3.camel@redhat.com>
@ 2022-07-12 9:55 ` Nicolas Dichtel
2022-07-12 9:55 ` [PATCH net v2 2/2] selftests/net: test nexthop without gw Nicolas Dichtel
0 siblings, 1 reply; 7+ messages in thread
From: Nicolas Dichtel @ 2022-07-12 9:55 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni, Eric Dumazet,
David Ahern
Cc: netdev, linux-kselftest, Nicolas Dichtel, stable, Edwin Brossette
When a nexthop is added, without a gw address, the default scope was set
to 'host'. Thus, when a source address is selected, 127.0.0.1 may be chosen
but rejected when the route is used.
When using a route without a nexthop id, the scope can be configured in the
route, thus the problem doesn't exist.
To explain more deeply: when a user creates a nexthop, it cannot specify
the scope. To create it, the function nh_create_ipv4() calls fib_check_nh()
with scope set to 0. fib_check_nh() calls fib_check_nh_nongw() wich was
setting scope to 'host'. Then, nh_create_ipv4() calls
fib_info_update_nhc_saddr() with scope set to 'host'. The src addr is
chosen before the route is inserted.
When a 'standard' route (ie without a reference to a nexthop) is added,
fib_create_info() calls fib_info_update_nhc_saddr() with the scope set by
the user. iproute2 set the scope to 'link' by default.
Here is a way to reproduce the problem:
ip netns add foo
ip -n foo link set lo up
ip netns add bar
ip -n bar link set lo up
sleep 1
ip -n foo link add name eth0 type dummy
ip -n foo link set eth0 up
ip -n foo address add 192.168.0.1/24 dev eth0
ip -n foo link add name veth0 type veth peer name veth1 netns bar
ip -n foo link set veth0 up
ip -n bar link set veth1 up
ip -n bar address add 192.168.1.1/32 dev veth1
ip -n bar route add default dev veth1
ip -n foo nexthop add id 1 dev veth0
ip -n foo route add 192.168.1.1 nhid 1
Try to get/use the route:
> $ ip -n foo route get 192.168.1.1
> RTNETLINK answers: Invalid argument
> $ ip netns exec foo ping -c1 192.168.1.1
> ping: connect: Invalid argument
Try without nexthop group (iproute2 sets scope to 'link' by dflt):
ip -n foo route del 192.168.1.1
ip -n foo route add 192.168.1.1 dev veth0
Try to get/use the route:
> $ ip -n foo route get 192.168.1.1
> 192.168.1.1 dev veth0 src 192.168.0.1 uid 0
> cache
> $ ip netns exec foo ping -c1 192.168.1.1
> PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
> 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.039 ms
>
> --- 192.168.1.1 ping statistics ---
> 1 packets transmitted, 1 received, 0% packet loss, time 0ms
> rtt min/avg/max/mdev = 0.039/0.039/0.039/0.000 ms
CC: stable@vger.kernel.org
Fixes: 597cfe4fc339 ("nexthop: Add support for IPv4 nexthops")
Reported-by: Edwin Brossette <edwin.brossette@6wind.com>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
---
v1 -> v2:
- remove useless arp off / fixed mac settings in the description
net/ipv4/fib_semantics.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index a57ba23571c9..20177ecf5bdd 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -1230,7 +1230,7 @@ static int fib_check_nh_nongw(struct net *net, struct fib_nh *nh,
nh->fib_nh_dev = in_dev->dev;
dev_hold_track(nh->fib_nh_dev, &nh->fib_nh_dev_tracker, GFP_ATOMIC);
- nh->fib_nh_scope = RT_SCOPE_HOST;
+ nh->fib_nh_scope = RT_SCOPE_LINK;
if (!netif_carrier_ok(nh->fib_nh_dev))
nh->fib_nh_flags |= RTNH_F_LINKDOWN;
err = 0;
--
2.33.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net v2 2/2] selftests/net: test nexthop without gw
2022-07-12 9:55 ` [PATCH net v2 1/2] ip: fix dflt addr selection for connected nexthop Nicolas Dichtel
@ 2022-07-12 9:55 ` Nicolas Dichtel
2022-07-12 10:14 ` Greg KH
0 siblings, 1 reply; 7+ messages in thread
From: Nicolas Dichtel @ 2022-07-12 9:55 UTC (permalink / raw)
To: David S . Miller, Jakub Kicinski, Paolo Abeni, Eric Dumazet,
David Ahern
Cc: netdev, linux-kselftest, Nicolas Dichtel
This test implement the scenario described in the previous patch.
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
---
v1 -> v2:
- add linux-kselftest@vger.kernel.org
- clean trailing whitespaces
- add a 'trap' on exit
- remove useless sleep
- remove useless arp off / fixed mac settings
tools/testing/selftests/net/Makefile | 2 +-
.../selftests/net/fib_nexthop_nongw.sh | 119 ++++++++++++++++++
2 files changed, 120 insertions(+), 1 deletion(-)
create mode 100755 tools/testing/selftests/net/fib_nexthop_nongw.sh
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
index ddad703ace34..db05b3764b77 100644
--- a/tools/testing/selftests/net/Makefile
+++ b/tools/testing/selftests/net/Makefile
@@ -11,7 +11,7 @@ TEST_PROGS += udpgso_bench.sh fib_rule_tests.sh msg_zerocopy.sh psock_snd.sh
TEST_PROGS += udpgro_bench.sh udpgro.sh test_vxlan_under_vrf.sh reuseport_addr_any.sh
TEST_PROGS += test_vxlan_fdb_changelink.sh so_txtime.sh ipv6_flowlabel.sh
TEST_PROGS += tcp_fastopen_backup_key.sh fcnal-test.sh l2tp.sh traceroute.sh
-TEST_PROGS += fin_ack_lat.sh fib_nexthop_multiprefix.sh fib_nexthops.sh
+TEST_PROGS += fin_ack_lat.sh fib_nexthop_multiprefix.sh fib_nexthops.sh fib_nexthop_nongw.sh
TEST_PROGS += altnames.sh icmp.sh icmp_redirect.sh ip6_gre_headroom.sh
TEST_PROGS += route_localnet.sh
TEST_PROGS += reuseaddr_ports_exhausted.sh
diff --git a/tools/testing/selftests/net/fib_nexthop_nongw.sh b/tools/testing/selftests/net/fib_nexthop_nongw.sh
new file mode 100755
index 000000000000..b7b928b38ce4
--- /dev/null
+++ b/tools/testing/selftests/net/fib_nexthop_nongw.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# ns: h1 | ns: h2
+# 192.168.0.1/24 |
+# eth0 |
+# | 192.168.1.1/32
+# veth0 <---|---> veth1
+# Validate source address selection for route without gateway
+
+PAUSE_ON_FAIL=no
+VERBOSE=0
+ret=0
+
+################################################################################
+# helpers
+
+log_test()
+{
+ local rc=$1
+ local expected=$2
+ local msg="$3"
+
+ if [ ${rc} -eq ${expected} ]; then
+ printf "TEST: %-60s [ OK ]\n" "${msg}"
+ nsuccess=$((nsuccess+1))
+ else
+ ret=1
+ nfail=$((nfail+1))
+ printf "TEST: %-60s [FAIL]\n" "${msg}"
+ if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
+ echo
+ echo "hit enter to continue, 'q' to quit"
+ read a
+ [ "$a" = "q" ] && exit 1
+ fi
+ fi
+
+ [ "$VERBOSE" = "1" ] && echo
+}
+
+run_cmd()
+{
+ local cmd="$*"
+ local out
+ local rc
+
+ if [ "$VERBOSE" = "1" ]; then
+ echo "COMMAND: $cmd"
+ fi
+
+ out=$(eval $cmd 2>&1)
+ rc=$?
+ if [ "$VERBOSE" = "1" -a -n "$out" ]; then
+ echo "$out"
+ fi
+
+ [ "$VERBOSE" = "1" ] && echo
+
+ return $rc
+}
+
+################################################################################
+# config
+setup()
+{
+ ip netns add h1
+ ip -n h1 link set lo up
+ ip netns add h2
+ ip -n h2 link set lo up
+
+ # Add a fake eth0 to support an ip address
+ ip -n h1 link add name eth0 type dummy
+ ip -n h1 link set eth0 up
+ ip -n h1 address add 192.168.0.1/24 dev eth0
+
+ # Configure veths (same @mac, arp off)
+ ip -n h1 link add name veth0 type veth peer name veth1 netns h2
+ ip -n h1 link set veth0 up
+
+ ip -n h2 link set veth1 up
+
+ # Configure @IP in the peer netns
+ ip -n h2 address add 192.168.1.1/32 dev veth1
+ ip -n h2 route add default dev veth1
+
+ # Add a nexthop without @gw and use it in a route
+ ip -n h1 nexthop add id 1 dev veth0
+ ip -n h1 route add 192.168.1.1 nhid 1
+}
+
+cleanup()
+{
+ ip netns del h1 2>/dev/null
+ ip netns del h2 2>/dev/null
+}
+
+trap cleanup EXIT
+
+################################################################################
+# main
+
+while getopts :pv o
+do
+ case $o in
+ p) PAUSE_ON_FAIL=yes;;
+ v) VERBOSE=1;;
+ esac
+done
+
+cleanup
+setup
+
+run_cmd ip -netns h1 route get 192.168.1.1
+log_test $? 0 "nexthop: get route with nexthop without gw"
+run_cmd ip netns exec h1 ping -c1 192.168.1.1
+log_test $? 0 "nexthop: ping through nexthop without gw"
+
+exit $ret
--
2.33.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net v2 2/2] selftests/net: test nexthop without gw
2022-07-12 9:55 ` [PATCH net v2 2/2] selftests/net: test nexthop without gw Nicolas Dichtel
@ 2022-07-12 10:14 ` Greg KH
2022-07-13 0:25 ` Jakub Kicinski
2022-07-13 7:35 ` Nicolas Dichtel
0 siblings, 2 replies; 7+ messages in thread
From: Greg KH @ 2022-07-12 10:14 UTC (permalink / raw)
To: Nicolas Dichtel
Cc: David S . Miller, Jakub Kicinski, Paolo Abeni, Eric Dumazet,
David Ahern, netdev, linux-kselftest
On Tue, Jul 12, 2022 at 11:55:45AM +0200, Nicolas Dichtel wrote:
> This test implement the scenario described in the previous patch.
"previous patch" does not work well when things are committed to the
kernel tree. Please be descriptive.
thanks,
greg k-h
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net v2 2/2] selftests/net: test nexthop without gw
2022-07-12 10:14 ` Greg KH
@ 2022-07-13 0:25 ` Jakub Kicinski
2022-07-13 7:36 ` Nicolas Dichtel
2022-07-13 7:35 ` Nicolas Dichtel
1 sibling, 1 reply; 7+ messages in thread
From: Jakub Kicinski @ 2022-07-13 0:25 UTC (permalink / raw)
To: Nicolas Dichtel
Cc: Greg KH, David S . Miller, Paolo Abeni, Eric Dumazet, David Ahern,
netdev, linux-kselftest
On Tue, 12 Jul 2022 12:14:17 +0200 Greg KH wrote:
> On Tue, Jul 12, 2022 at 11:55:45AM +0200, Nicolas Dichtel wrote:
> > This test implement the scenario described in the previous patch.
>
> "previous patch" does not work well when things are committed to the
> kernel tree. Please be descriptive.
And please don't resend your patches in reply to the previous version.
Add a lore link to the previous version in the commit message if you
want. In-reply-to breaks the review ordering for us :/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net v2 2/2] selftests/net: test nexthop without gw
2022-07-12 10:14 ` Greg KH
2022-07-13 0:25 ` Jakub Kicinski
@ 2022-07-13 7:35 ` Nicolas Dichtel
1 sibling, 0 replies; 7+ messages in thread
From: Nicolas Dichtel @ 2022-07-13 7:35 UTC (permalink / raw)
To: Greg KH
Cc: David S . Miller, Jakub Kicinski, Paolo Abeni, Eric Dumazet,
David Ahern, netdev, linux-kselftest
Le 12/07/2022 à 12:14, Greg KH a écrit :
> On Tue, Jul 12, 2022 at 11:55:45AM +0200, Nicolas Dichtel wrote:
>> This test implement the scenario described in the previous patch.
>
> "previous patch" does not work well when things are committed to the
> kernel tree. Please be descriptive.
Ok, no problem.
Note that patches order of a series is preserved, in network tree at least. And
because I don't have a sha1 right now, it seemed to me the best way to uniquely
identify a commit ;-)
Regards,
Nicolas
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net v2 2/2] selftests/net: test nexthop without gw
2022-07-13 0:25 ` Jakub Kicinski
@ 2022-07-13 7:36 ` Nicolas Dichtel
2022-07-13 18:13 ` Jakub Kicinski
0 siblings, 1 reply; 7+ messages in thread
From: Nicolas Dichtel @ 2022-07-13 7:36 UTC (permalink / raw)
To: Jakub Kicinski
Cc: Greg KH, David S . Miller, Paolo Abeni, Eric Dumazet, David Ahern,
netdev, linux-kselftest
Le 13/07/2022 à 02:25, Jakub Kicinski a écrit :
> On Tue, 12 Jul 2022 12:14:17 +0200 Greg KH wrote:
>> On Tue, Jul 12, 2022 at 11:55:45AM +0200, Nicolas Dichtel wrote:
>>> This test implement the scenario described in the previous patch.
>>
>> "previous patch" does not work well when things are committed to the
>> kernel tree. Please be descriptive.
>
> And please don't resend your patches in reply to the previous version.
> Add a lore link to the previous version in the commit message if you
> want. In-reply-to breaks the review ordering for us :/
Oh ok, I didn't know that.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net v2 2/2] selftests/net: test nexthop without gw
2022-07-13 7:36 ` Nicolas Dichtel
@ 2022-07-13 18:13 ` Jakub Kicinski
0 siblings, 0 replies; 7+ messages in thread
From: Jakub Kicinski @ 2022-07-13 18:13 UTC (permalink / raw)
To: Nicolas Dichtel
Cc: Greg KH, David S . Miller, Paolo Abeni, Eric Dumazet, David Ahern,
netdev, linux-kselftest
On Wed, 13 Jul 2022 09:36:37 +0200 Nicolas Dichtel wrote:
> > And please don't resend your patches in reply to the previous version.
> > Add a lore link to the previous version in the commit message if you
> > want. In-reply-to breaks the review ordering for us :/
> Oh ok, I didn't know that.
Yeah, I haven't documented it because it's a bit of an oddity
and frankly a shortcoming of the tooling on my side. But IDK
how to "detach" the threads in a way that'd allow me to keep
a queue sorted by posting data :(
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-07-13 18:13 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <9fb5e3df069db50396799a250c4db761b1505dd3.camel@redhat.com>
2022-07-12 9:55 ` [PATCH net v2 1/2] ip: fix dflt addr selection for connected nexthop Nicolas Dichtel
2022-07-12 9:55 ` [PATCH net v2 2/2] selftests/net: test nexthop without gw Nicolas Dichtel
2022-07-12 10:14 ` Greg KH
2022-07-13 0:25 ` Jakub Kicinski
2022-07-13 7:36 ` Nicolas Dichtel
2022-07-13 18:13 ` Jakub Kicinski
2022-07-13 7:35 ` Nicolas Dichtel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox