linux/tools/testing/selftests/net
Richard Gobert 0e4d354762 net-next: Fix IP_UNICAST_IF option behavior for connected sockets
The IP_UNICAST_IF socket option is used to set the outgoing interface
for outbound packets.

The IP_UNICAST_IF socket option was added as it was needed by the
Wine project, since no other existing option (SO_BINDTODEVICE socket
option, IP_PKTINFO socket option or the bind function) provided the
needed characteristics needed by the IP_UNICAST_IF socket option. [1]
The IP_UNICAST_IF socket option works well for unconnected sockets,
that is, the interface specified by the IP_UNICAST_IF socket option
is taken into consideration in the route lookup process when a packet
is being sent. However, for connected sockets, the outbound interface
is chosen when connecting the socket, and in the route lookup process
which is done when a packet is being sent, the interface specified by
the IP_UNICAST_IF socket option is being ignored.

This inconsistent behavior was reported and discussed in an issue
opened on systemd's GitHub project [2]. Also, a bug report was
submitted in the kernel's bugzilla [3].

To understand the problem in more detail, we can look at what happens
for UDP packets over IPv4 (The same analysis was done separately in
the referenced systemd issue).
When a UDP packet is sent the udp_sendmsg function gets called and
the following happens:

1. The oif member of the struct ipcm_cookie ipc (which stores the
output interface of the packet) is initialized by the ipcm_init_sk
function to inet->sk.sk_bound_dev_if (the device set by the
SO_BINDTODEVICE socket option).

2. If the IP_PKTINFO socket option was set, the oif member gets
overridden by the call to the ip_cmsg_send function.

3. If no output interface was selected yet, the interface specified
by the IP_UNICAST_IF socket option is used.

4. If the socket is connected and no destination address is
specified in the send function, the struct ipcm_cookie ipc is not
taken into consideration and the cached route, that was calculated in
the connect function is being used.

Thus, for a connected socket, the IP_UNICAST_IF sockopt isn't taken
into consideration.

This patch corrects the behavior of the IP_UNICAST_IF socket option
for connect()ed sockets by taking into consideration the
IP_UNICAST_IF sockopt when connecting the socket.

In order to avoid reconnecting the socket, this option is still
ignored when applied on an already connected socket until connect()
is called again by the Richard Gobert.

Change the __ip4_datagram_connect function, which is called during
socket connection, to take into consideration the interface set by
the IP_UNICAST_IF socket option, in a similar way to what is done in
the udp_sendmsg function.

[1] https://lore.kernel.org/netdev/1328685717.4736.4.camel@edumazet-laptop/T/
[2] https://github.com/systemd/systemd/issues/11935#issuecomment-618691018
[3] https://bugzilla.kernel.org/show_bug.cgi?id=210255

Signed-off-by: Richard Gobert <richardbgobert@gmail.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://lore.kernel.org/r/20220829111554.GA1771@debian
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2022-08-31 19:51:06 -07:00
..
af_unix selftests: net: af_unix: Fix a build error of unix_connect.c. 2022-07-20 21:02:15 -07:00
bpf selftests net: fix kselftest net fatal error 2022-06-29 20:15:57 -07:00
forwarding selftests: forwarding: Fix failing tests with old libnet 2022-08-10 22:36:14 -07:00
mptcp selftests: mptcp: make sendfile selftest work 2022-08-05 08:51:29 +01:00
.gitignore selftests/net: Add sk_bind_sendto_listen and sk_connect_zero_addr 2022-08-24 19:30:09 -07:00
altnames.sh selftest: net: fix typo in altname test 2021-09-12 10:48:26 +01:00
amt.sh selftests: set amt.sh executable 2022-01-05 10:27:19 -08:00
arp_ndisc_evict_nocarrier.sh selftests: net: add arp_ndisc_evict_nocarrier 2021-11-01 19:57:15 -07:00
arp_ndisc_untracked_subnets.sh selftests: net: arp_ndisc_untracked_subnets: test for arp_accept and accept_untracked_na 2022-07-15 18:55:50 -07:00
bareudp.sh selftests: set conf.all.rp_filter=0 in bareudp.sh 2020-11-12 16:14:38 -08:00
bind_bhash.c selftests/net: Add test for timing a bind request to a port with a populated bhash entry 2022-08-24 19:30:09 -07:00
bind_bhash.sh selftests/net: Add test for timing a bind request to a port with a populated bhash entry 2022-08-24 19:30:09 -07:00
cmsg_ipv6.sh selftests: net: basic test for IPV6_2292* 2022-02-17 14:22:09 +00:00
cmsg_sender.c net/cmsg_sender: Remove a semicolon 2022-07-01 13:52:28 +01:00
cmsg_so_mark.sh selftests: net: cmsg_so_mark: test with SO_MARK set by setsockopt 2022-02-10 15:04:51 +00:00
cmsg_time.sh selftests: net: test standard socket cmsgs across UDP and ICMP sockets 2022-02-10 15:04:52 +00:00
config Revert "selftests: net: Add tls config dependency for tls selftests" 2022-03-28 16:15:54 -07:00
devlink_port_split.py selftests: net: devlink_port_split: check devlink returned an element before dereferencing it 2021-06-28 16:14:38 -07:00
drop_monitor_tests.sh selftests: net: Add drop monitor test 2020-09-30 18:01:26 -07:00
fcnal-test.sh net-next: Fix IP_UNICAST_IF option behavior for connected sockets 2022-08-31 19:51:06 -07:00
fib_nexthop_multiprefix.sh
fib_nexthop_nongw.sh selftests/net: test nexthop without gw 2022-07-14 14:41:19 +02:00
fib_nexthops.sh selftests: fib_nexthops: Make ping timeout configurable 2022-05-20 17:21:37 -07:00
fib_rule_tests.sh selftests: net: fib_rule_tests: fix support for running individual tests 2022-07-01 13:37:13 +01:00
fib_tests.sh selftests: fib_test: Add a test case for IPv4 broadcast neighbours 2022-02-21 11:44:30 +00:00
fib-onlink-tests.sh
fin_ack_lat.c
fin_ack_lat.sh
gre_gso.sh selftests: net: switch to socat in the GSO GRE test 2021-11-12 19:59:01 -08:00
gro.c Networking changes for 5.17. 2022-01-10 19:06:09 -08:00
gro.sh selftests/net: allow GRO coalesce test on veth 2021-08-26 12:03:49 +01:00
hwtstamp_config.c
icmp_redirect.sh selftests: icmp_redirect: pass xfail=0 to log_test() 2021-12-12 12:56:41 +00:00
icmp.sh selftests/net: Add icmp.sh for testing ICMP dummy address responses 2021-06-18 12:13:24 -07:00
in_netns.sh
io_uring_zerocopy_tx.c selftests/io_uring: test zerocopy send 2022-07-24 18:41:07 -06:00
io_uring_zerocopy_tx.sh selftests/io_uring: test zerocopy send 2022-07-24 18:41:07 -06:00
ioam6_parser.c selftests: net: ioam: expect support for Queue depth data 2022-01-21 19:26:39 -08:00
ioam6.sh selftests: net: fix IOAM test skip return code 2022-08-02 09:51:31 +02:00
ip6_gre_headroom.sh
ip_defrag.c
ip_defrag.sh
ipsec.c selftests/net: remove ARRAY_SIZE define from individual tests 2021-12-10 17:50:57 -07:00
ipv6_flowlabel_mgr.c
ipv6_flowlabel.c ping: support ipv6 ping socket flow labels 2022-07-22 12:40:27 +01:00
ipv6_flowlabel.sh ping: support ipv6 ping socket flow labels 2022-07-22 12:40:27 +01:00
l2_tos_ttl_inherit.sh selftests/net: test l2 tunnel TOS/TTL inheriting 2022-08-19 16:48:41 -07:00
l2tp.sh
Makefile selftests/net: fix reinitialization of TEST_PROGS in net self tests. 2022-08-25 13:19:57 -07:00
msg_zerocopy.c
msg_zerocopy.sh
ndisc_unsolicited_na_test.sh net/ipv6: Expand and rename accept_unsolicited_na to accept_untracked_na 2022-05-31 11:36:57 +02:00
netdevice.sh
nettest.c net-next: Fix IP_UNICAST_IF option behavior for connected sockets 2022-08-31 19:51:06 -07:00
pmtu.sh selftest: net: Test IPv4 PMTU exceptions with DSCP and ECN 2022-03-18 14:06:45 -07:00
psock_fanout.c selftests: net: fix array_size.cocci warning 2022-03-17 15:21:16 +01:00
psock_lib.h
psock_snd.c selftests/net: enable lo.accept_local in psock_snd test 2022-05-25 21:58:35 -07:00
psock_snd.sh selftests/net: remove min gso test in packet_snd 2021-08-02 10:34:04 +01:00
psock_tpacket.c
reuseaddr_conflict.c
reuseaddr_ports_exhausted.c selftests/net: fix warnings on reuseaddr_ports_exhausted 2021-03-16 15:01:21 -07:00
reuseaddr_ports_exhausted.sh
reuseport_addr_any.c
reuseport_addr_any.sh
reuseport_bpf_cpu.c
reuseport_bpf_numa.c selftests: net: fix array_size.cocci warning 2022-03-07 12:23:27 +00:00
reuseport_bpf.c selftests/net: remove ARRAY_SIZE define from individual tests 2021-12-10 17:50:57 -07:00
reuseport_dualstack.c
route_localnet.sh
rtnetlink.sh selftests: rtnetlink: Use more sensible tos values 2022-02-03 19:11:21 -08:00
run_afpackettests selftests/net: Use kselftest skip code for skipped tests 2021-08-24 16:49:09 -07:00
run_netsocktests
rxtimestamp.c selftests/net: remove ARRAY_SIZE define from individual tests 2021-12-10 17:50:57 -07:00
rxtimestamp.sh
settings kselftests/net: adapt the timeout to the largest runtime 2022-01-13 12:53:22 +00:00
setup_loopback.sh selftests/net: allow GRO coalesce test on veth 2021-08-26 12:03:49 +01:00
setup_veth.sh selftests/net: allow GRO coalesce test on veth 2021-08-26 12:03:49 +01:00
sk_bind_sendto_listen.c selftests/net: Add sk_bind_sendto_listen and sk_connect_zero_addr 2022-08-24 19:30:09 -07:00
sk_connect_zero_addr.c selftests/net: Add sk_bind_sendto_listen and sk_connect_zero_addr 2022-08-24 19:30:09 -07:00
so_netns_cookie.c tools/testing: add a selftest for SO_NETNS_COOKIE 2021-06-24 11:13:05 -07:00
so_txtime.c selftests/net: so_txtime: usage(): fix documentation of default clock 2022-05-03 13:18:26 +02:00
so_txtime.sh selftests/net: so_txtime multi-host support 2021-03-31 17:48:21 -07:00
socket.c selftests/net: remove ARRAY_SIZE define from individual tests 2021-12-10 17:50:57 -07:00
srv6_end_dt4_l3vpn_test.sh selftests/net: Use kselftest skip code for skipped tests 2021-08-24 16:49:09 -07:00
srv6_end_dt6_l3vpn_test.sh selftests/net: Use kselftest skip code for skipped tests 2021-08-24 16:49:09 -07:00
srv6_end_dt46_l3vpn_test.sh selftests/net: Use kselftest skip code for skipped tests 2021-08-24 16:49:09 -07:00
srv6_hencap_red_l3vpn_test.sh selftests: seg6: add selftest for SRv6 H.Encaps.Red behavior 2022-07-29 12:14:03 +01:00
srv6_hl2encap_red_l2vpn_test.sh selftests: seg6: add selftest for SRv6 H.L2Encaps.Red behavior 2022-07-29 12:14:03 +01:00
stress_reuseport_listen.c net: selftests: Stress reuseport listen 2022-05-12 16:52:18 -07:00
stress_reuseport_listen.sh net: selftests: Stress reuseport listen 2022-05-12 16:52:18 -07:00
tap.c selftests: add few test cases for tap driver 2022-08-05 08:59:15 +01:00
tcp_fastopen_backup_key.c selftests/net: remove ARRAY_SIZE define from individual tests 2021-12-10 17:50:57 -07:00
tcp_fastopen_backup_key.sh
tcp_inq.c
tcp_mmap.c
test_blackhole_dev.sh
test_bpf.sh
test_vxlan_fdb_changelink.sh
test_vxlan_under_vrf.sh selftests: test_vxlan_under_vrf: Fix broken test case 2022-03-25 17:00:11 -07:00
test_vxlan_vnifiltering.sh selftests: add new tests for vxlan vnifiltering 2022-03-01 08:38:02 +00:00
timestamping.c selftests/net: timestamping: Fix bind_phc check 2022-01-31 11:44:04 +00:00
tls.c selftests: tls: handful of memrnd() and length checks 2022-07-28 21:49:59 -07:00
toeplitz_client.sh selftests/net: toeplitz test 2021-08-05 13:14:09 +01:00
toeplitz.c selftests: net: fix array_size.cocci warning 2022-03-17 15:21:16 +01:00
toeplitz.sh selftests/net: toeplitz test 2021-08-05 13:14:09 +01:00
traceroute.sh
tun.c selftest: tun: add test for NAPI dismantle 2022-06-30 11:34:10 -07:00
txring_overwrite.c
txtimestamp.c selftests: net: change fprintf format specifiers 2022-03-21 16:37:54 -07:00
txtimestamp.sh
udpgro_bench.sh selftests/net: fix section name when using xdp_dummy.o 2022-07-01 20:16:02 -07:00
udpgro_frglist.sh selftests/net: fix section name when using xdp_dummy.o 2022-07-01 20:16:02 -07:00
udpgro_fwd.sh selftests/net: fix section name when using xdp_dummy.o 2022-07-01 20:16:02 -07:00
udpgro.sh selftests/net: fix section name when using xdp_dummy.o 2022-07-01 20:16:02 -07:00
udpgso_bench_rx.c selftests/net: udpgso_bench_rx: fix port argument 2021-11-11 12:24:26 +00:00
udpgso_bench_tx.c selftests/net: udpgso_bench_tx: fix dst ip argument 2021-12-29 17:29:50 -08:00
udpgso_bench.sh selftests/net: pass ipv6_args to udpgso_bench's IPv6 TCP test 2022-06-23 21:19:03 -07:00
udpgso.c selftests: Calculate udpgso segment count without header adjustment 2021-12-23 19:20:06 -08:00
udpgso.sh
unicast_extensions.sh selftests/net: Use kselftest skip code for skipped tests 2021-08-24 16:49:09 -07:00
veth.sh selftests/net: fix section name when using xdp_dummy.o 2022-07-01 20:16:02 -07:00
vrf_route_leaking.sh selftests: Add VRF route leaking tests 2020-10-14 17:14:28 -07:00
vrf_strict_mode_test.sh selftests: net: vrf_strict_mode_test: add support to select a test to run 2022-05-02 10:48:29 +02:00
vrf-xfrm-tests.sh
xfrm_policy.sh xfrm: Fix wraparound in xfrm_policy_addr_delta() 2021-01-04 10:35:09 +01:00