On Sat, Sep 03, 2022 at 12:35:41AM +0200, Alexander Bluhm wrote: > This broke socket splicing between inet and inet6 sockets. > sosplice() has this check: > > if (sosp->so_proto->pr_usrreqs != so->so_proto->pr_usrreqs) { > error = EPROTONOSUPPORT; > goto frele; > } > > That does not work anymore after splitting {tcp,udp}6_usrreqs. > > bluhm > > On Fri, Sep 02, 2022 at 07:12:32AM -0600, Vitaliy Makkoveev wrote: > > CVSROOT: /cvs > > Module name: src > > Changes by: m...@cvs.openbsd.org 2022/09/02 07:12:32 > > > > Modified files: > > sys/kern : sys_socket.c uipc_usrreq.c > > sys/net : if.c pfkeyv2.c rtsock.c > > sys/netinet : ip_divert.c ip_gre.c raw_ip.c tcp_usrreq.c > > tcp_var.h udp_usrreq.c udp_var.h > > sys/netinet6 : in6_proto.c ip6_divert.c raw_ip6.c > > sys/sys : protosw.h > > > > Log message: > > Move PRU_CONTROL request to (*pru_control)(). > > > > The 'proc *' arg is not used for PRU_CONTROL request, so remove it from > > pru_control() wrapper. > > > > Split out {tcp,udp}6_usrreqs from {tcp,udp}_usrreqs and use them for > > inet6 case. > > > > ok guenther@ bluhm@
IIRC it's assumed that inet tcp/udp socket on port N and inet6 tcp/udp socket on the same port N are different sockets, because the protocols are different. So the ability of splicing inet and inet6 sockets looks strange for me. Also I wonder, is this really used? This diff should restore existing behaviour. The `pru_attach' handler is the same for inet and inet6 cases. Index: sys/kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.286 diff -u -p -r1.286 uipc_socket.c --- sys/kern/uipc_socket.c 28 Aug 2022 18:43:12 -0000 1.286 +++ sys/kern/uipc_socket.c 2 Sep 2022 23:10:20 -0000 @@ -1293,7 +1293,8 @@ sosplice(struct socket *so, int fd, off_ if ((error = getsock(curproc, fd, &fp)) != 0) return (error); sosp = fp->f_data; - if (sosp->so_proto->pr_usrreqs != so->so_proto->pr_usrreqs) { + if (sosp->so_proto->pr_usrreqs->pru_attach != + so->so_proto->pr_usrreqs->pru_attach) { error = EPROTONOSUPPORT; goto frele; }