On Sat, Aug 13, 2022 at 09:58:16PM +0300, Vitaliy Makkoveev wrote:
> I propose to commit pru_*() hunks first.
OK bluhm@
> Index: sys/kern/sys_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/sys_socket.c,v
> retrieving revision 1.51
> diff -u -p -r1.51 sys_socket.c
> --- sys/kern/sys_socket.c 20 Jun 2022 01:39:44 -0000 1.51
> +++ sys/kern/sys_socket.c 13 Aug 2022 18:26:39 -0000
> @@ -138,8 +138,7 @@ soo_ioctl(struct file *fp, u_long cmd, c
> if (IOCGROUP(cmd) == 'r')
> return (EOPNOTSUPP);
> KERNEL_LOCK();
> - error = ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
> - (struct mbuf *)cmd, (struct mbuf *)data, NULL, p));
> + error = pru_control(so, cmd, data, NULL, p);
> KERNEL_UNLOCK();
> break;
> }
> @@ -161,8 +160,7 @@ soo_stat(struct file *fp, struct stat *u
> ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
> ub->st_uid = so->so_euid;
> ub->st_gid = so->so_egid;
> - (void) ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
> - (struct mbuf *)ub, NULL, NULL, p));
> + (void)pru_sense(so, ub);
> sounlock(so);
> return (0);
> }
> Index: sys/kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.280
> diff -u -p -r1.280 uipc_socket.c
> --- sys/kern/uipc_socket.c 25 Jul 2022 07:28:22 -0000 1.280
> +++ sys/kern/uipc_socket.c 13 Aug 2022 18:26:39 -0000
> @@ -195,7 +195,7 @@ socreate(int dom, struct socket **aso, i
> so->so_rcv.sb_timeo_nsecs = INFSLP;
>
> solock(so);
> - error = (*prp->pr_attach)(so, proto);
> + error = pru_attach(so, proto);
> if (error) {
> so->so_state |= SS_NOFDREF;
> /* sofree() calls sounlock(). */
> @@ -210,12 +210,8 @@ socreate(int dom, struct socket **aso, i
> int
> sobind(struct socket *so, struct mbuf *nam, struct proc *p)
> {
> - int error;
> -
> soassertlocked(so);
> -
> - error = (*so->so_proto->pr_usrreq)(so, PRU_BIND, NULL, nam, NULL, p);
> - return (error);
> + return pru_bind(so, nam, p);
> }
>
> int
> @@ -231,8 +227,7 @@ solisten(struct socket *so, int backlog)
> if (isspliced(so) || issplicedback(so))
> return (EOPNOTSUPP);
> #endif /* SOCKET_SPLICE */
> - error = (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, NULL, NULL, NULL,
> - curproc);
> + error = pru_listen(so);
> if (error)
> return (error);
> if (TAILQ_FIRST(&so->so_q) == NULL)
> @@ -392,8 +387,7 @@ soclose(struct socket *so, int flags)
> drop:
> if (so->so_pcb) {
> int error2;
> - KASSERT(so->so_proto->pr_detach);
> - error2 = (*so->so_proto->pr_detach)(so);
> + error2 = pru_detach(so);
> if (error == 0)
> error = error2;
> }
> @@ -444,8 +438,7 @@ soabort(struct socket *so)
> {
> soassertlocked(so);
>
> - return (*so->so_proto->pr_usrreq)(so, PRU_ABORT, NULL, NULL, NULL,
> - curproc);
> + return pru_abort(so);
> }
>
> int
> @@ -460,8 +453,7 @@ soaccept(struct socket *so, struct mbuf
> so->so_state &= ~SS_NOFDREF;
> if ((so->so_state & SS_ISDISCONNECTED) == 0 ||
> (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)
> - error = (*so->so_proto->pr_usrreq)(so, PRU_ACCEPT, NULL,
> - nam, NULL, curproc);
> + error = pru_accept(so, nam);
> else
> error = ECONNABORTED;
> return (error);
> @@ -487,8 +479,7 @@ soconnect(struct socket *so, struct mbuf
> (error = sodisconnect(so))))
> error = EISCONN;
> else
> - error = (*so->so_proto->pr_usrreq)(so, PRU_CONNECT,
> - NULL, nam, NULL, curproc);
> + error = pru_connect(so, nam);
> return (error);
> }
>
> @@ -502,8 +493,7 @@ soconnect2(struct socket *so1, struct so
> else
> solock(so1);
>
> - error = (*so1->so_proto->pr_usrreq)(so1, PRU_CONNECT2, NULL,
> - (struct mbuf *)so2, NULL, curproc);
> + error = pru_connect2(so1, so2);
>
> if (persocket)
> sounlock(so2);
> @@ -522,8 +512,7 @@ sodisconnect(struct socket *so)
> return (ENOTCONN);
> if (so->so_state & SS_ISDISCONNECTING)
> return (EALREADY);
> - error = (*so->so_proto->pr_usrreq)(so, PRU_DISCONNECT, NULL, NULL,
> - NULL, curproc);
> + error = pru_disconnect(so);
> return (error);
> }
>
> @@ -654,9 +643,10 @@ restart:
> so->so_state &= ~SS_ISSENDING;
> if (top && so->so_options & SO_ZEROIZE)
> top->m_flags |= M_ZEROIZE;
> - error = (*so->so_proto->pr_usrreq)(so,
> - (flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND,
> - top, addr, control, curproc);
> + if (flags & MSG_OOB)
> + error = pru_sendoob(so, top, addr, control);
> + else
> + error = pru_send(so, top, addr, control);
> clen = 0;
> control = NULL;
> top = NULL;
> @@ -819,8 +809,7 @@ soreceive(struct socket *so, struct mbuf
> if (flags & MSG_OOB) {
> m = m_get(M_WAIT, MT_DATA);
> solock(so);
> - error = (*pr->pr_usrreq)(so, PRU_RCVOOB, m,
> - (struct mbuf *)(long)(flags & MSG_PEEK), NULL, curproc);
> + error = pru_rcvoob(so, m, flags & MSG_PEEK);
> sounlock(so);
> if (error)
> goto bad;
> @@ -1170,8 +1159,7 @@ dontblock:
> SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");
> SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
> if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
> - (*pr->pr_usrreq)(so, PRU_RCVD, NULL,
> - (struct mbuf *)(long)flags, NULL, curproc);
> + pru_rcvd(so, flags);
> }
> if (orig_resid == uio->uio_resid && orig_resid &&
> (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {
> @@ -1193,7 +1181,6 @@ release:
> int
> soshutdown(struct socket *so, int how)
> {
> - const struct protosw *pr = so->so_proto;
> int error = 0;
>
> solock(so);
> @@ -1205,8 +1192,7 @@ soshutdown(struct socket *so, int how)
> sorflush(so);
> /* FALLTHROUGH */
> case SHUT_WR:
> - error = (*pr->pr_usrreq)(so, PRU_SHUTDOWN, NULL, NULL, NULL,
> - curproc);
> + error = pru_shutdown(so);
> break;
> default:
> error = EINVAL;
> @@ -1538,8 +1524,7 @@ somove(struct socket *so, int wait)
> if (m == NULL) {
> sbdroprecord(so, &so->so_rcv);
> if (so->so_proto->pr_flags & PR_WANTRCVD && so->so_pcb)
> - (so->so_proto->pr_usrreq)(so, PRU_RCVD, NULL,
> - NULL, NULL, NULL);
> + pru_rcvd(so, 0);
> goto nextpkt;
> }
>
> @@ -1645,8 +1630,7 @@ somove(struct socket *so, int wait)
>
> /* Send window update to source peer as receive buffer has changed. */
> if (so->so_proto->pr_flags & PR_WANTRCVD && so->so_pcb)
> - (so->so_proto->pr_usrreq)(so, PRU_RCVD, NULL,
> - NULL, NULL, NULL);
> + pru_rcvd(so, 0);
>
> /* Receive buffer did shrink by len bytes, adjust oob. */
> state = so->so_state;
> @@ -1674,8 +1658,7 @@ somove(struct socket *so, int wait)
> } else if (oobmark) {
> o = m_split(m, oobmark, wait);
> if (o) {
> - error = (*sosp->so_proto->pr_usrreq)(sosp,
> - PRU_SEND, m, NULL, NULL, NULL);
> + error = pru_send(sosp, m, NULL, NULL);
> if (error) {
> if (sosp->so_state & SS_CANTSENDMORE)
> error = EPIPE;
> @@ -1692,8 +1675,7 @@ somove(struct socket *so, int wait)
> if (o) {
> o->m_len = 1;
> *mtod(o, caddr_t) = *mtod(m, caddr_t);
> - error = (*sosp->so_proto->pr_usrreq)(sosp, PRU_SENDOOB,
> - o, NULL, NULL, NULL);
> + error = pru_sendoob(sosp, o, NULL, NULL);
> if (error) {
> if (sosp->so_state & SS_CANTSENDMORE)
> error = EPIPE;
> @@ -1714,8 +1696,7 @@ somove(struct socket *so, int wait)
> /* Append all remaining data to drain socket. */
> if (so->so_rcv.sb_cc == 0 || maxreached)
> sosp->so_state &= ~SS_ISSENDING;
> - error = (*sosp->so_proto->pr_usrreq)(sosp, PRU_SEND, m, NULL, NULL,
> - NULL);
> + error = pru_send(sosp, m, NULL, NULL);
> if (error) {
> if (sosp->so_state & SS_CANTSENDMORE)
> error = EPIPE;
> Index: sys/kern/uipc_socket2.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
> retrieving revision 1.126
> diff -u -p -r1.126 uipc_socket2.c
> --- sys/kern/uipc_socket2.c 25 Jul 2022 07:28:22 -0000 1.126
> +++ sys/kern/uipc_socket2.c 13 Aug 2022 18:26:39 -0000
> @@ -238,7 +238,7 @@ sonewconn(struct socket *head, int conns
> sounlock(head);
> }
>
> - error = (*so->so_proto->pr_attach)(so, 0);
> + error = pru_attach(so, 0);
>
> if (persocket) {
> sounlock(so);
> Index: sys/kern/uipc_syscalls.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
> retrieving revision 1.199
> diff -u -p -r1.199 uipc_syscalls.c
> --- sys/kern/uipc_syscalls.c 18 Jul 2022 04:42:37 -0000 1.199
> +++ sys/kern/uipc_syscalls.c 13 Aug 2022 18:26:40 -0000
> @@ -1100,7 +1100,7 @@ sys_getsockname(struct proc *p, void *v,
> }
> m = m_getclr(M_WAIT, MT_SONAME);
> solock(so);
> - error = (*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, NULL, m, NULL, p);
> + error = pru_sockaddr(so, m);
> sounlock(so);
> if (error)
> goto bad;
> @@ -1147,7 +1147,7 @@ sys_getpeername(struct proc *p, void *v,
> goto bad;
> m = m_getclr(M_WAIT, MT_SONAME);
> solock(so);
> - error = (*so->so_proto->pr_usrreq)(so, PRU_PEERADDR, NULL, m, NULL, p);
> + error = pru_peeraddr(so, m);
> sounlock(so);
> if (error)
> goto bad;
> Index: sys/net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.662
> diff -u -p -r1.662 if.c
> --- sys/net/if.c 6 Aug 2022 15:57:58 -0000 1.662
> +++ sys/net/if.c 13 Aug 2022 18:26:40 -0000
> @@ -2360,9 +2360,7 @@ forceup:
> break;
> /* FALLTHROUGH */
> default:
> - error = ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
> - (struct mbuf *) cmd, (struct mbuf *) data,
> - (struct mbuf *) ifp, p));
> + error = pru_control(so, cmd, data, ifp, p);
> if (error != EOPNOTSUPP)
> break;
> switch (cmd) {
> Index: sys/nfs/nfs_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/nfs/nfs_socket.c,v
> retrieving revision 1.142
> diff -u -p -r1.142 nfs_socket.c
> --- sys/nfs/nfs_socket.c 6 Jun 2022 14:45:41 -0000 1.142
> +++ sys/nfs/nfs_socket.c 13 Aug 2022 18:26:40 -0000
> @@ -1177,11 +1177,9 @@ nfs_timer(void *arg)
> nmp->nm_sent < nmp->nm_cwnd) &&
> (m = m_copym(rep->r_mreq, 0, M_COPYALL, M_DONTWAIT))){
> if ((nmp->nm_flag & NFSMNT_NOCONN) == 0)
> - error = (*so->so_proto->pr_usrreq)(so, PRU_SEND,
> - m, NULL, NULL, curproc);
> + error = pru_send(so, m, NULL, NULL);
> else
> - error = (*so->so_proto->pr_usrreq)(so, PRU_SEND,
> - m, nmp->nm_nam, NULL, curproc);
> + error = pru_send(so, m, nmp->nm_nam, NULL);
> if (error) {
> if (NFSIGNORE_SOERROR(nmp->nm_soflags, error))
> so->so_error = 0;
> Index: sys/sys/protosw.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/protosw.h,v
> retrieving revision 1.35
> diff -u -p -r1.35 protosw.h
> --- sys/sys/protosw.h 25 Feb 2022 23:51:04 -0000 1.35
> +++ sys/sys/protosw.h 13 Aug 2022 18:26:40 -0000
> @@ -227,6 +227,11 @@ char *prcorequests[] = {
> #endif
>
> #ifdef _KERNEL
> +
> +#include <sys/socketvar.h>
> +#include <sys/systm.h>
> +
> +struct ifnet;
> struct sockaddr;
> const struct protosw *pffindproto(int, int, int);
> const struct protosw *pffindtype(int, int);
> @@ -239,5 +244,133 @@ extern const struct protosw inetsw[];
> extern u_char ip6_protox[];
> extern const struct protosw inet6sw[];
> #endif /* INET6 */
> +
> +static inline int
> +pru_attach(struct socket *so, int proto)
> +{
> + return (*so->so_proto->pr_attach)(so, proto);
> +}
> +
> +static inline int
> +pru_detach(struct socket *so)
> +{
> + return (*so->so_proto->pr_detach)(so);
> +}
> +
> +static inline int
> +pru_bind(struct socket *so, struct mbuf *nam, struct proc *p)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_BIND, NULL, nam, NULL, p);
> +}
> +
> +static inline int
> +pru_listen(struct socket *so)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_LISTEN, NULL, NULL, NULL, curproc);
> +}
> +
> +static inline int
> +pru_connect(struct socket *so, struct mbuf *nam)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_CONNECT, NULL, nam, NULL, curproc);
> +}
> +
> +static inline int
> +pru_accept(struct socket *so, struct mbuf *nam)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_ACCEPT, NULL, nam, NULL, curproc);
> +}
> +
> +static inline int
> +pru_disconnect(struct socket *so)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_DISCONNECT, NULL, NULL, NULL, curproc);
> +}
> +
> +static inline int
> +pru_shutdown(struct socket *so)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_SHUTDOWN, NULL, NULL, NULL, curproc);
> +}
> +
> +static inline int
> +pru_rcvd(struct socket *so, int flags)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_RCVD, NULL, (struct mbuf *)(long)flags, NULL, curproc);
> +}
> +
> +static inline int
> +pru_send(struct socket *so, struct mbuf *top, struct mbuf *addr,
> + struct mbuf *control)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_SEND, top, addr, control, curproc);
> +}
> +
> +static inline int
> +pru_abort(struct socket *so)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_ABORT, NULL, NULL, NULL, curproc);
> +}
> +
> +static inline int
> +pru_control(struct socket *so, u_long cmd, caddr_t data,
> + struct ifnet *ifp, struct proc *p)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_CONTROL, (struct mbuf *)cmd, (struct mbuf *)data,
> + (struct mbuf *)ifp, p);
> +}
> +
> +static inline int
> +pru_sense(struct socket *so, struct stat *ub)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_SENSE, (struct mbuf *)ub, NULL, NULL, curproc);
> +}
> +
> +static inline int
> +pru_rcvoob(struct socket *so, struct mbuf *m, int flags)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_RCVOOB, m, (struct mbuf *)(long)flags, NULL, curproc);
> +}
> +
> +static inline int
> +pru_sendoob(struct socket *so, struct mbuf *top, struct mbuf *addr,
> + struct mbuf *control)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_SENDOOB, top, addr, control, curproc);
> +}
> +
> +static inline int
> +pru_sockaddr(struct socket *so, struct mbuf *addr)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_SOCKADDR, NULL, addr, NULL, curproc);
> +}
> +
> +static inline int
> +pru_peeraddr(struct socket *so, struct mbuf *addr)
> +{
> + return (*so->so_proto->pr_usrreq)(so,
> + PRU_PEERADDR, NULL, addr, NULL, curproc);
> +}
> +
> +static inline int
> +pru_connect2(struct socket *so1, struct socket *so2)
> +{
> + return (*so1->so_proto->pr_usrreq)(so1,
> + PRU_CONNECT2, NULL, (struct mbuf *)so2, NULL, curproc);
> +}
>
> #endif
> Index: sys/sys/socketvar.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/socketvar.h,v
> retrieving revision 1.106
> diff -u -p -r1.106 socketvar.h
> --- sys/sys/socketvar.h 15 Jul 2022 17:20:24 -0000 1.106
> +++ sys/sys/socketvar.h 13 Aug 2022 18:26:40 -0000
> @@ -32,6 +32,9 @@
> * @(#)socketvar.h 8.1 (Berkeley) 6/2/93
> */
>
> +#ifndef _SYS_SOCKETVAR_H_
> +#define _SYS_SOCKETVAR_H_
> +
> #include <sys/selinfo.h> /* for struct selinfo */
> #include <sys/queue.h>
> #include <sys/sigio.h> /* for struct sigio_ref
> */
> @@ -370,3 +373,5 @@ void sbcheck(struct socket *, struct soc
> #endif /* SOCKBUF_DEBUG */
>
> #endif /* _KERNEL */
> +
> +#endif /* _SYS_SOCKETVAR_H_ */