On Sat, Sep 03, 2022 at 03:56:38AM +0300, Vitaliy Makkoveev wrote: > Or may be better to check `pr_type' with the ability of splicing?
I don't think that makes sense. Reasonable splicing does not depend on the type of socket, not on the protocol family, but on the protocol. That is the reason I used the usrreq pointer before. As it involves sending packets, I suggested pru_send now. You can splice tcp to tcp, and udp to udp. You cannot splice udp to rip although both use pr_type SOCK_RAW. I am not convinced that introducing sepecial IPv6 functions pointers was a good idea. That means a lot of code duplication. Whatever. With the current feature set your diff is equivalent to any other solution discussed. I have not implemented splicing for rip or rip6 yet. Regress is broken, fix it somehow and quickly. OK bluhm@ > 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 3 Sep 2022 00:53:39 -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_flags & PR_SPLICE) == 0 || > + (sosp->so_proto->pr_type != so->so_proto->pr_type)) { > error = EPROTONOSUPPORT; > goto frele; > }