opnsense-src/sys/netinet
Gleb Smirnoff 69c05f4287 udp: make sendto(2) on unconnected UDP socket use public inpcb KPIs
UDP allows to sendto(2) on unconnected socket.  The original BSD devise
was that such action would create a temporary (for the duration of the
syscall) connection between our inpcb and remote addr:port specified in
sockaddr 'to' of the syscall.  This devise was broken in 2002 in
90162a4e87.  For more motivation on the removal of the temporary
connection see email [1].

Since the removal of the true temporary connection the sendto(2) on
unconnected socket has the following side effects:

1) After first sendto(2) the "unconnected" socket will receive datagrams
   destined to the selected port.
2) All subsequent sendto(2) calls will use the same source port.

Effectively, such sendto(2) acts like a bind(2) to INADDR_ANY:0.  Indeed,
if you do this:

	s1 = socket(PF_INET, SOCK_DGRAM, 0);
	s2 = socket(PF_INET, SOCK_DGRAM, 0);
	sendto(s1, ..., &somedestination, ...);
	bind(s2, &{ .sin_addr = INADDR_ANY, sin_port = 0 });

And then look into kgdb at resulting inpcbs, you would find them equal in
all means modulo bound to different anonymous ports.

What is even more interesting is that Linux kernel had picked up same
behavior, including that "unconnected" socket will receive datagrams.  So
it seems that such behavior is now an undocumented standard, thus I
covered it in recently added tests/sys/netinet/udp_bindings.

Now, with the above knowledge at hand, why are we using
in_pcbconnect_setup() and in_pcbinshash(), which are supposed to be
private to in_pcb.c, to achieve the binding?  Let's use public KPI
in_pcbbind() on the first sendto(2) and use in_pcbladdr() on all
sendto(2)s.  Apart from finally hiding these two should be private
functions, we no longer acquire global INP_HASH_WLOCK() for every
sendto(2) on unconnected socket as well as remove a couple workarounds.

[1] https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210141935.aa83883

Reviewed by:		markj
Differential Revision:	https://reviews.freebsd.org/D49043
2025-02-21 18:11:17 -08:00
..
cc cc_cubic: remove redundant code 2025-02-20 11:00:41 -05:00
khelp sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
libalias man: Remove references to classful networks 2025-02-04 22:27:21 +01:00
netdump netdump: Check the return value of ifunit_ref() 2023-10-02 08:09:26 -04:00
tcp_stacks TCP BBR: remove dead code 2025-01-09 06:27:05 +01:00
accf_data.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
accf_dns.c sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
accf_http.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
accf_tls.c accf_tls: accept filter that waits for TLS handshake header 2024-04-24 17:53:10 -07:00
dccp.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
icmp6.h icmp6: Fix ICMP6 message type counters 2025-01-23 19:03:25 +00:00
icmp_var.h netinet: add a probe point for IP, IP6, ICMP, ICMP6, UDP and TCP stats counters 2024-04-08 17:29:59 +02:00
if_ether.c netinet: enter epoch in garp_rexmit() 2025-01-20 14:28:39 +01:00
if_ether.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
igmp.c netinet*: Add assertions for some places that don't support M_EXTPG mbufs 2024-10-31 16:32:32 -04:00
igmp.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
igmp_var.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
in.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
in.h netinet: enforce broadcast mode for all-ones and all-zeroes destinations 2025-02-21 18:11:00 -08:00
in_cksum.c sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
in_debug.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
in_fib.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
in_fib.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
in_fib_algo.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
in_fib_dxr.c fib_dxr: code hygiene, prune old code, no functional changes 2024-05-17 18:57:25 +02:00
in_gif.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
in_jail.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
in_kdtrace.c netinet: default mib counter probe points off 2024-11-20 09:52:48 +01:00
in_kdtrace.h netinet: default mib counter probe points off 2024-11-20 09:52:48 +01:00
in_mcast.c netinet: Remove stale references to Giant from comments 2024-01-27 13:51:13 -05:00
in_pcb.c inpcb: add const qualifiers on functions that select address/port 2025-02-17 15:28:52 -08:00
in_pcb.h inpcb: add const qualifiers on functions that select address/port 2025-02-17 15:28:52 -08:00
in_pcb_var.h inpcb: add const qualifiers on functions that select address/port 2025-02-17 15:28:52 -08:00
in_prot.c Fix 'security.bsd.see_jail_proc' by using cr_bsd_visible() 2023-09-28 11:59:08 -03:00
in_proto.c sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
in_rmx.c netinet: rename in_broadcast() to in_ifnet_broadcast() 2025-02-21 18:10:53 -08:00
in_rss.c sys: Remove $FreeBSD$: two-line .c pattern 2023-08-16 11:54:30 -06:00
in_rss.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
in_systm.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
in_var.h in: add in_mask2len() 2024-12-17 11:07:12 +01:00
ip.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
ip6.h netinet: Define IPv6 ECN mask 2024-01-03 12:56:28 -05:00
ip_carp.c netlink: refactor KPI for generic Netlink modules 2025-02-05 10:09:06 -08:00
ip_carp.h carp: support VRRPv3 2024-05-08 13:19:03 +02:00
ip_carp_nl.h carp: support VRRPv3 2024-05-08 13:19:03 +02:00
ip_divert.c netinet: rename in_broadcast() to in_ifnet_broadcast() 2025-02-21 18:10:53 -08:00
ip_divert.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
ip_dummynet.h dummynet: add simple gilbert-elliott channel model 2023-12-17 13:20:45 +01:00
ip_ecn.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
ip_ecn.h sys: Remove $FreeBSD$: one-line .c comment pattern 2023-08-16 11:54:24 -06:00
ip_encap.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
ip_encap.h sys: Remove $FreeBSD$: one-line .c comment pattern 2023-08-16 11:54:24 -06:00
ip_fastfwd.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
ip_fw.h ipfw: Fix a typo in a source code comment 2024-05-12 10:53:40 +02:00
ip_gre.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
ip_icmp.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
ip_icmp.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
ip_id.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
ip_input.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
ip_mroute.c mroute: fix a sysctl vs teardown race 2025-02-10 14:45:36 +00:00
ip_mroute.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
ip_options.c netinet*: Add assertions for some places that don't support M_EXTPG mbufs 2024-10-31 16:32:32 -04:00
ip_options.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
ip_output.c netinet: enforce broadcast mode for all-ones and all-zeroes destinations 2025-02-21 18:11:00 -08:00
ip_reass.c vnet: (read) lock the vnet list while iterating it 2023-12-07 13:34:47 +01:00
ip_var.h netinet: add a probe point for IP, IP6, ICMP, ICMP6, UDP and TCP stats counters 2024-04-08 17:29:59 +02:00
pim.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
pim_var.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
raw_ip.c rawip: Add a bind_all_fibs sysctl 2025-02-06 14:16:36 +00:00
sctp.h sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
sctp_asconf.c sctp: improve debug output 2024-10-24 13:19:14 +02:00
sctp_asconf.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_auth.c sctp: cleanup locking for notifications 2023-09-08 16:20:51 +02:00
sctp_auth.h sctp: cleanup SCTP AUTH related notification 2023-09-08 13:13:43 +02:00
sctp_bsd_addr.c sctp: improve handling of address changes 2024-11-03 10:20:08 +01:00
sctp_bsd_addr.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_cc_functions.c sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_constants.h sctp: make sure all SCTP RESET notifications use sctp_ulp_notify() 2023-09-08 14:19:56 +02:00
sctp_crc32.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
sctp_crc32.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_header.h sctp: store heartbeat creation time as time_t 2024-05-10 20:40:15 +02:00
sctp_indata.c sctp: improve input validation for data chunks 2024-08-03 13:27:18 +02:00
sctp_indata.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_input.c sctp: store cookie secret change time as time_t 2024-05-10 20:14:16 +02:00
sctp_input.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_kdtrace.c sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
sctp_kdtrace.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_lock_bsd.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_module.c sys: Remove $FreeBSD$: one-line .c pattern 2023-08-16 11:54:36 -06:00
sctp_os.h sockets: don't malloc/free sockaddr memory on getpeername/getsockname 2023-11-30 08:31:10 -08:00
sctp_os_bsd.h netinet: rename in_broadcast() to in_ifnet_broadcast() 2025-02-21 18:10:53 -08:00
sctp_output.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
sctp_output.h sctp: improve sending of packets containing an INIT ACK chunk 2024-02-24 19:16:36 +01:00
sctp_pcb.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
sctp_pcb.h sctp: improve handling of address changes 2024-11-03 10:20:08 +01:00
sctp_peeloff.c sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_peeloff.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_ss_functions.c sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_structs.h sctp: cleanup handling of graceful shutdown of the peer 2023-08-19 12:35:49 +02:00
sctp_syscalls.c sctp: propagate cap rights on sctp_peeloff 2024-10-08 20:36:50 -04:00
sctp_sysctl.c sctp: fix format of sysctl variables 2024-08-22 09:07:27 +02:00
sctp_sysctl.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_timer.c sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
sctp_timer.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_uio.h sctp: cleanup cdefs.h include 2023-08-18 15:25:34 +02:00
sctp_usrreq.c sctp: don't specify pr_poll = sopoll_generic 2025-02-02 22:38:18 -08:00
sctp_var.h sockets: make pr_shutdown fully protocol specific method 2024-01-16 10:30:37 -08:00
sctputil.c netinet: use in_broadcast() inline 2025-02-21 18:11:06 -08:00
sctputil.h sctp: make sure all SCTP RESET notifications use sctp_ulp_notify() 2023-09-08 14:19:56 +02:00
siftr.c siftr: remove pointless assertion 2024-11-14 11:39:12 -08:00
tcp.h tcp: add TH_AE capabilities to ppp and pf 2024-11-29 10:04:31 +01:00
tcp_accounting.h Move access to tcp's t_logstate into inline functions and provide new tracepoint and bbpoint capabilities. 2023-03-16 11:43:16 -04:00
tcp_ecn.c tcp: commonize check for more data to send, style changes 2024-01-26 01:20:35 +01:00
tcp_ecn.h tcp: AccECN access ACE field by shifting bits 2024-01-26 00:16:22 +01:00
tcp_fastopen.c tcp_fastopen: Fix a typo in a source code comment 2024-01-22 21:49:47 +01:00
tcp_fastopen.h sockets: remove unused KPIs to manipulate sockets 2024-03-18 08:50:30 -07:00
tcp_fsm.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
tcp_hostcache.c tcp: use const argument in the TCP hostcache KPI 2024-11-20 16:30:42 -08:00
tcp_hpts.c tcp_hpts: refactor the per tcpcb call to either input/output method 2024-12-16 06:52:06 -08:00
tcp_hpts.h HTPS has actually three states not two so the macro needs to account for that. 2024-03-01 15:21:15 -05:00
tcp_input.c netinet: rename in_broadcast() to in_ifnet_broadcast() 2025-02-21 18:10:53 -08:00
tcp_log_buf.c tcp bblog: use correct length 2024-03-27 14:31:48 +01:00
tcp_log_buf.h tcp: whitespace cleanup in enum tcp_log_events 2024-08-25 22:05:41 +02:00
tcp_lro.c tcp: make tcp_lro_flush() static 2024-09-05 17:44:33 +02:00
tcp_lro.h tcp: make tcp_lro_flush() static 2024-09-05 17:44:33 +02:00
tcp_lro_hpts.c tcp: define tcp_lro_log() only when TCP_BLACKBOX is defined 2024-11-17 19:21:01 +01:00
tcp_offload.c tcp_fill_info(): Change lock assertion on INPCB to locked only 2023-08-22 20:33:49 +02:00
tcp_offload.h sockets: remove unused KPIs to manipulate sockets 2024-03-18 08:50:30 -07:00
tcp_output.c tcp: don't send beyond receivers advertised window 2025-01-13 10:13:54 -08:00
tcp_pcap.c sys: Style fix for M_EXT | M_EXTPG 2023-12-28 11:17:59 -08:00
tcp_pcap.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00
tcp_ratelimit.c tcp_ratelimit: provide an api for drivers to release ratesets at detach 2024-08-05 12:51:35 -04:00
tcp_ratelimit.h tcp_ratelimit: provide an api for drivers to release ratesets at detach 2024-08-05 12:51:35 -04:00
tcp_reass.c tcp: change SOCKBUF_* macros to SOCK_[RECV|SEND]BUF_* macros 2024-11-14 02:08:12 +01:00
tcp_sack.c tcp: properly reset sackhint values when SACK recovery is done 2025-01-13 10:13:45 -08:00
tcp_seq.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
tcp_stats.c sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
tcp_subr.c tcp: remove so != NULL check 2024-11-20 16:37:18 -08:00
tcp_syncache.c inpcb: gc unused argument of in_pcbconnect() 2024-11-14 11:39:13 -08:00
tcp_syncache.h tcp: remove TCP_OFFLOAD_DISABLE 2024-09-15 11:44:49 +02:00
tcp_timer.c tcp: fix the initial CWND when a SYN retransmission happened 2024-11-05 09:52:42 +01:00
tcp_timer.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
tcp_timewait.c tcp: improve consistency 2024-04-06 10:02:06 +02:00
tcp_usrreq.c tcp: Add a sysctl to modify listening socket FIB inheritance 2025-02-06 14:14:49 +00:00
tcp_var.h tcp: Add a sysctl to modify listening socket FIB inheritance 2025-02-06 14:14:49 +00:00
tcpip.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
toecore.c tcp_fill_info(): Change lock assertion on INPCB to locked only 2023-08-22 20:33:49 +02:00
toecore.h inpcb: remove unused KPIs to manipulate inpcbs 2024-03-18 08:49:39 -07:00
udp.h sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
udp_usrreq.c udp: make sendto(2) on unconnected UDP socket use public inpcb KPIs 2025-02-21 18:11:17 -08:00
udp_var.h udp: Add a sysctl to modify listening socket FIB inheritance 2025-02-06 14:15:41 +00:00
udplite.h sys: Remove $FreeBSD$: two-line .h pattern 2023-08-16 11:54:11 -06:00