On Sun, Aug 14, 2022 at 01:35:18AM +0300, Vitaliy Makkoveev wrote:
> The pr_usrreqs hunks. I replaced spaces by tab within `routesw'
> structure.
OK bluhm@
> Index: sys/kern/uipc_proto.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_proto.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 uipc_proto.c
> --- sys/kern/uipc_proto.c 25 Feb 2022 23:51:03 -0000 1.22
> +++ sys/kern/uipc_proto.c 13 Aug 2022 21:59:52 -0000
> @@ -50,27 +50,21 @@ const struct protosw unixsw[] = {
> .pr_domain = &unixdomain,
> .pr_protocol = PF_UNIX,
> .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS,
> - .pr_usrreq = uipc_usrreq,
> - .pr_attach = uipc_attach,
> - .pr_detach = uipc_detach,
> + .pr_usrreqs = &uipc_usrreqs,
> },
> {
> .pr_type = SOCK_SEQPACKET,
> .pr_domain = &unixdomain,
> .pr_protocol = PF_UNIX,
> .pr_flags = PR_ATOMIC|PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS,
> - .pr_usrreq = uipc_usrreq,
> - .pr_attach = uipc_attach,
> - .pr_detach = uipc_detach,
> + .pr_usrreqs = &uipc_usrreqs,
> },
> {
> .pr_type = SOCK_DGRAM,
> .pr_domain = &unixdomain,
> .pr_protocol = PF_UNIX,
> .pr_flags = PR_ATOMIC|PR_ADDR|PR_RIGHTS,
> - .pr_usrreq = uipc_usrreq,
> - .pr_attach = uipc_attach,
> - .pr_detach = uipc_detach,
> + .pr_usrreqs = &uipc_usrreqs,
> }
> };
>
> Index: sys/kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.281
> diff -u -p -r1.281 uipc_socket.c
> --- sys/kern/uipc_socket.c 13 Aug 2022 21:01:46 -0000 1.281
> +++ sys/kern/uipc_socket.c 13 Aug 2022 21:59:52 -0000
> @@ -172,7 +172,7 @@ socreate(int dom, struct socket **aso, i
> prp = pffindproto(dom, proto, type);
> else
> prp = pffindtype(dom, type);
> - if (prp == NULL || prp->pr_attach == NULL)
> + if (prp == NULL || prp->pr_usrreqs == NULL)
> return (EPROTONOSUPPORT);
> if (prp->pr_type != type)
> return (EPROTOTYPE);
> @@ -1296,7 +1296,7 @@ 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_usrreq != so->so_proto->pr_usrreq) {
> + if (sosp->so_proto->pr_usrreqs != so->so_proto->pr_usrreqs) {
> error = EPROTONOSUPPORT;
> goto frele;
> }
> Index: sys/kern/uipc_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v
> retrieving revision 1.167
> diff -u -p -r1.167 uipc_usrreq.c
> --- sys/kern/uipc_usrreq.c 2 Jul 2022 11:49:23 -0000 1.167
> +++ sys/kern/uipc_usrreq.c 13 Aug 2022 21:59:52 -0000
> @@ -126,6 +126,12 @@ int unp_rights; /* [R] file descriptors
> int unp_defer; /* [G] number of deferred fp to close by the GC task */
> int unp_gcing; /* [G] GC task currently running */
>
> +const struct pr_usrreqs uipc_usrreqs = {
> + .pru_usrreq = uipc_usrreq,
> + .pru_attach = uipc_attach,
> + .pru_detach = uipc_detach,
> +};
> +
> void
> unp_init(void)
> {
> Index: sys/net/pfkeyv2.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pfkeyv2.c,v
> retrieving revision 1.234
> diff -u -p -r1.234 pfkeyv2.c
> --- sys/net/pfkeyv2.c 6 Jun 2022 14:45:41 -0000 1.234
> +++ sys/net/pfkeyv2.c 13 Aug 2022 21:59:52 -0000
> @@ -199,6 +199,12 @@ pfdatatopacket(void *data, int len, stru
> return (0);
> }
>
> +const struct pr_usrreqs pfkeyv2_usrreqs = {
> + .pru_usrreq = pfkeyv2_usrreq,
> + .pru_attach = pfkeyv2_attach,
> + .pru_detach = pfkeyv2_detach,
> +};
> +
> const struct protosw pfkeysw[] = {
> {
> .pr_type = SOCK_RAW,
> @@ -206,9 +212,7 @@ const struct protosw pfkeysw[] = {
> .pr_protocol = PF_KEY_V2,
> .pr_flags = PR_ATOMIC | PR_ADDR,
> .pr_output = pfkeyv2_output,
> - .pr_usrreq = pfkeyv2_usrreq,
> - .pr_attach = pfkeyv2_attach,
> - .pr_detach = pfkeyv2_detach,
> + .pr_usrreqs = &pfkeyv2_usrreqs,
> .pr_sysctl = pfkeyv2_sysctl,
> }
> };
> Index: sys/net/rtsock.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtsock.c,v
> retrieving revision 1.334
> diff -u -p -r1.334 rtsock.c
> --- sys/net/rtsock.c 28 Jun 2022 10:01:13 -0000 1.334
> +++ sys/net/rtsock.c 13 Aug 2022 21:59:52 -0000
> @@ -2401,6 +2401,12 @@ rt_setsource(unsigned int rtableid, stru
> * Definitions of protocols supported in the ROUTE domain.
> */
>
> +const struct pr_usrreqs route_usrreqs = {
> + .pru_usrreq = route_usrreq,
> + .pru_attach = route_attach,
> + .pru_detach = route_detach,
> +};
> +
> const struct protosw routesw[] = {
> {
> .pr_type = SOCK_RAW,
> @@ -2408,9 +2414,7 @@ const struct protosw routesw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR|PR_WANTRCVD,
> .pr_output = route_output,
> .pr_ctloutput = route_ctloutput,
> - .pr_usrreq = route_usrreq,
> - .pr_attach = route_attach,
> - .pr_detach = route_detach,
> + .pr_usrreqs = &route_usrreqs,
> .pr_init = route_prinit,
> .pr_sysctl = sysctl_rtable
> }
> Index: sys/netinet/in_proto.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_proto.c,v
> retrieving revision 1.98
> diff -u -p -r1.98 in_proto.c
> --- sys/netinet/in_proto.c 25 Feb 2022 23:51:03 -0000 1.98
> +++ sys/netinet/in_proto.c 13 Aug 2022 21:59:52 -0000
> @@ -189,9 +189,7 @@ const struct protosw inetsw[] = {
> .pr_input = udp_input,
> .pr_ctlinput = udp_ctlinput,
> .pr_ctloutput = ip_ctloutput,
> - .pr_usrreq = udp_usrreq,
> - .pr_attach = udp_attach,
> - .pr_detach = udp_detach,
> + .pr_usrreqs = &udp_usrreqs,
> .pr_init = udp_init,
> .pr_sysctl = udp_sysctl
> },
> @@ -203,9 +201,7 @@ const struct protosw inetsw[] = {
> .pr_input = tcp_input,
> .pr_ctlinput = tcp_ctlinput,
> .pr_ctloutput = tcp_ctloutput,
> - .pr_usrreq = tcp_usrreq,
> - .pr_attach = tcp_attach,
> - .pr_detach = tcp_detach,
> + .pr_usrreqs = &tcp_usrreqs,
> .pr_init = tcp_init,
> .pr_slowtimo = tcp_slowtimo,
> .pr_sysctl = tcp_sysctl
> @@ -217,9 +213,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = rip_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> },
> {
> .pr_type = SOCK_RAW,
> @@ -228,9 +222,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = icmp_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_init = icmp_init,
> .pr_sysctl = icmp_sysctl
> },
> @@ -245,9 +237,7 @@ const struct protosw inetsw[] = {
> .pr_input = ipip_input,
> #endif
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_sysctl = ipip_sysctl,
> .pr_init = ipip_init
> },
> @@ -263,9 +253,7 @@ const struct protosw inetsw[] = {
> .pr_input = ipip_input,
> #endif
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq, /* XXX */
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs, /* XXX */
> },
> #endif
> #if defined(MPLS) && NGIF > 0
> @@ -275,9 +263,7 @@ const struct protosw inetsw[] = {
> .pr_protocol = IPPROTO_MPLS,
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = in_gif_input,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> },
> #endif /* MPLS && GIF */
> {
> @@ -287,9 +273,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = igmp_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_init = igmp_init,
> .pr_fasttimo = igmp_fasttimo,
> .pr_slowtimo = igmp_slowtimo,
> @@ -304,9 +288,7 @@ const struct protosw inetsw[] = {
> .pr_input = ah46_input,
> .pr_ctlinput = ah4_ctlinput,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_sysctl = ah_sysctl
> },
> {
> @@ -317,9 +299,7 @@ const struct protosw inetsw[] = {
> .pr_input = esp46_input,
> .pr_ctlinput = esp4_ctlinput,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_sysctl = esp_sysctl
> },
> {
> @@ -329,9 +309,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = ipcomp46_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_sysctl = ipcomp_sysctl
> },
> #endif /* IPSEC */
> @@ -343,9 +321,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = gre_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = gre_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &gre_usrreqs,
> .pr_sysctl = gre_sysctl
> },
> #endif /* NGRE > 0 */
> @@ -357,9 +333,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = carp_proto_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_sysctl = carp_sysctl
> },
> #endif /* NCARP > 0 */
> @@ -371,9 +345,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = pfsync_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_sysctl = pfsync_sysctl
> },
> #endif /* NPFSYNC > 0 */
> @@ -384,9 +356,7 @@ const struct protosw inetsw[] = {
> .pr_protocol = IPPROTO_DIVERT,
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = divert_usrreq,
> - .pr_attach = divert_attach,
> - .pr_detach = divert_detach,
> + .pr_usrreqs = &divert_usrreqs,
> .pr_init = divert_init,
> .pr_sysctl = divert_sysctl
> },
> @@ -399,9 +369,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = ip_etherip_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_sysctl = etherip_sysctl
> },
> #endif /* NETHERIP */
> @@ -412,9 +380,7 @@ const struct protosw inetsw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = rip_input,
> .pr_ctloutput = rip_ctloutput,
> - .pr_usrreq = rip_usrreq,
> - .pr_attach = rip_attach,
> - .pr_detach = rip_detach,
> + .pr_usrreqs = &rip_usrreqs,
> .pr_init = rip_init
> }
> };
> Index: sys/netinet/ip_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.c,v
> retrieving revision 1.68
> diff -u -p -r1.68 ip_divert.c
> --- sys/netinet/ip_divert.c 9 May 2022 19:33:46 -0000 1.68
> +++ sys/netinet/ip_divert.c 13 Aug 2022 21:59:52 -0000
> @@ -62,6 +62,12 @@ const struct sysctl_bounded_args divertc
> { DIVERTCTL_SENDSPACE, &divert_sendspace, 0, INT_MAX },
> };
>
> +const struct pr_usrreqs divert_usrreqs = {
> + .pru_usrreq = divert_usrreq,
> + .pru_attach = divert_attach,
> + .pru_detach = divert_detach,
> +};
> +
> int divbhashsize = DIVERTHASHSIZE;
>
> int divert_output(struct inpcb *, struct mbuf *, struct mbuf *,
> Index: sys/netinet/ip_divert.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.h,v
> retrieving revision 1.15
> diff -u -p -r1.15 ip_divert.h
> --- sys/netinet/ip_divert.h 5 May 2022 16:44:22 -0000 1.15
> +++ sys/netinet/ip_divert.h 13 Aug 2022 21:59:52 -0000
> @@ -65,6 +65,8 @@ divstat_inc(enum divstat_counters c)
>
> extern struct inpcbtable divbtable;
>
> +extern const struct pr_usrreqs divert_usrreqs;
> +
> void divert_init(void);
> void divert_packet(struct mbuf *, int, u_int16_t);
> int divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
> Index: sys/netinet/ip_gre.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_gre.c,v
> retrieving revision 1.74
> diff -u -p -r1.74 ip_gre.c
> --- sys/netinet/ip_gre.c 26 Jun 2022 15:50:21 -0000 1.74
> +++ sys/netinet/ip_gre.c 13 Aug 2022 21:59:52 -0000
> @@ -53,12 +53,19 @@
>
> #include <netinet/in.h>
> #include <netinet/ip.h>
> +#include <netinet/ip_gre.h>
> #include <netinet/ip_var.h>
> #include <netinet/in_pcb.h>
>
> #ifdef PIPEX
> #include <net/pipex.h>
> #endif
> +
> +const struct pr_usrreqs gre_usrreqs = {
> + .pru_usrreq = gre_usrreq,
> + .pru_attach = rip_attach,
> + .pru_detach = rip_detach,
> +};
>
> int
> gre_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
> Index: sys/netinet/ip_gre.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_gre.h,v
> retrieving revision 1.16
> diff -u -p -r1.16 ip_gre.h
> --- sys/netinet/ip_gre.h 25 Feb 2022 23:51:03 -0000 1.16
> +++ sys/netinet/ip_gre.h 13 Aug 2022 21:59:52 -0000
> @@ -53,6 +53,9 @@
> }
>
> #ifdef _KERNEL
> +
> +extern const struct pr_usrreqs gre_usrreqs;
> +
> int gre_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
> struct mbuf *, struct proc *);
> #endif /* _KERNEL */
> #endif /* _NETINET_IP_GRE_H_ */
> Index: sys/netinet/ip_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_var.h,v
> retrieving revision 1.96
> diff -u -p -r1.96 ip_var.h
> --- sys/netinet/ip_var.h 12 Aug 2022 14:49:15 -0000 1.96
> +++ sys/netinet/ip_var.h 13 Aug 2022 21:59:52 -0000
> @@ -219,6 +219,8 @@ extern int ipmforwarding; /* enable mul
> extern int ipmultipath; /* enable multipath routing */
> extern int la_hold_total;
>
> +extern const struct pr_usrreqs rip_usrreqs;
> +
> extern struct rttimer_queue ip_mtudisc_timeout_q;
> extern struct pool ipqent_pool;
> struct route;
> Index: sys/netinet/raw_ip.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/raw_ip.c,v
> retrieving revision 1.129
> diff -u -p -r1.129 raw_ip.c
> --- sys/netinet/raw_ip.c 6 Aug 2022 15:57:59 -0000 1.129
> +++ sys/netinet/raw_ip.c 13 Aug 2022 21:59:52 -0000
> @@ -103,6 +103,12 @@ struct inpcbtable rawcbtable;
> * Raw interface to IP protocol.
> */
>
> +const struct pr_usrreqs rip_usrreqs = {
> + .pru_usrreq = rip_usrreq,
> + .pru_attach = rip_attach,
> + .pru_detach = rip_detach,
> +};
> +
> /*
> * Initialize raw connection block q.
> */
> Index: sys/netinet/tcp_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
> retrieving revision 1.186
> diff -u -p -r1.186 tcp_usrreq.c
> --- sys/netinet/tcp_usrreq.c 13 Aug 2022 19:13:45 -0000 1.186
> +++ sys/netinet/tcp_usrreq.c 13 Aug 2022 21:59:52 -0000
> @@ -111,6 +111,12 @@ u_int tcp_sendspace = TCP_SENDSPACE;
> u_int tcp_recvspace = TCP_RECVSPACE;
> u_int tcp_autorcvbuf_inc = 16 * 1024;
>
> +const struct pr_usrreqs tcp_usrreqs = {
> + .pru_usrreq = tcp_usrreq,
> + .pru_attach = tcp_attach,
> + .pru_detach = tcp_detach,
> +};
> +
> static int pr_slowhz = PR_SLOWHZ;
> const struct sysctl_bounded_args tcpctl_vars[] = {
> { TCPCTL_SLOWHZ, &pr_slowhz, SYSCTL_INT_READONLY },
> Index: sys/netinet/tcp_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_var.h,v
> retrieving revision 1.140
> diff -u -p -r1.140 tcp_var.h
> --- sys/netinet/tcp_var.h 11 Aug 2022 09:13:21 -0000 1.140
> +++ sys/netinet/tcp_var.h 13 Aug 2022 21:59:52 -0000
> @@ -637,6 +637,7 @@ tcpstat_pkt(enum tcpstat_counters pcount
> counters_pkt(tcpcounters, pcounter, bcounter, v);
> }
>
> +extern const struct pr_usrreqs tcp_usrreqs;
> extern struct pool tcpcb_pool;
> extern struct inpcbtable tcbtable; /* head of queue of active
> tcpcb's */
> extern u_int32_t tcp_now; /* for RFC 1323 timestamps */
> Index: sys/netinet/udp_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/udp_usrreq.c,v
> retrieving revision 1.281
> diff -u -p -r1.281 udp_usrreq.c
> --- sys/netinet/udp_usrreq.c 8 Aug 2022 12:06:30 -0000 1.281
> +++ sys/netinet/udp_usrreq.c 13 Aug 2022 21:59:52 -0000
> @@ -122,6 +122,12 @@ u_int udp_sendspace = 9216; /* really m
> u_int udp_recvspace = 40 * (1024 + sizeof(struct sockaddr_in));
> /* 40 1K datagrams */
>
> +const struct pr_usrreqs udp_usrreqs = {
> + .pru_usrreq = udp_usrreq,
> + .pru_attach = udp_attach,
> + .pru_detach = udp_detach,
> +};
> +
> const struct sysctl_bounded_args udpctl_vars[] = {
> { UDPCTL_CHECKSUM, &udpcksum, 0, 1 },
> { UDPCTL_RECVSPACE, &udp_recvspace, 0, INT_MAX },
> Index: sys/netinet/udp_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/udp_var.h,v
> retrieving revision 1.37
> diff -u -p -r1.37 udp_var.h
> --- sys/netinet/udp_var.h 25 Feb 2022 23:51:03 -0000 1.37
> +++ sys/netinet/udp_var.h 13 Aug 2022 21:59:52 -0000
> @@ -126,6 +126,8 @@ udpstat_inc(enum udpstat_counters c)
> extern struct inpcbtable udbtable;
> extern struct udpstat udpstat;
>
> +extern const struct pr_usrreqs udp_usrreqs;
> +
> #ifdef INET6
> void udp6_ctlinput(int, struct sockaddr *, u_int, void *);
> #endif /* INET6 */
> Index: sys/netinet6/in6_proto.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6_proto.c,v
> retrieving revision 1.109
> diff -u -p -r1.109 in6_proto.c
> --- sys/netinet6/in6_proto.c 25 Feb 2022 23:51:04 -0000 1.109
> +++ sys/netinet6/in6_proto.c 13 Aug 2022 21:59:52 -0000
> @@ -140,9 +140,7 @@ const struct protosw inet6sw[] = {
> .pr_input = udp_input,
> .pr_ctlinput = udp6_ctlinput,
> .pr_ctloutput = ip6_ctloutput,
> - .pr_usrreq = udp_usrreq,
> - .pr_attach = udp_attach,
> - .pr_detach = udp_detach,
> + .pr_usrreqs = &udp_usrreqs,
> .pr_sysctl = udp_sysctl
> },
> {
> @@ -153,9 +151,7 @@ const struct protosw inet6sw[] = {
> .pr_input = tcp_input,
> .pr_ctlinput = tcp6_ctlinput,
> .pr_ctloutput = tcp_ctloutput,
> - .pr_usrreq = tcp_usrreq,
> - .pr_attach = tcp_attach,
> - .pr_detach = tcp_detach,
> + .pr_usrreqs = &tcp_usrreqs,
> .pr_sysctl = tcp_sysctl
> },
> {
> @@ -166,9 +162,7 @@ const struct protosw inet6sw[] = {
> .pr_input = rip6_input,
> .pr_ctlinput = rip6_ctlinput,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> .pr_sysctl = rip6_sysctl
> },
> {
> @@ -179,9 +173,7 @@ const struct protosw inet6sw[] = {
> .pr_input = icmp6_input,
> .pr_ctlinput = rip6_ctlinput,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> .pr_init = icmp6_init,
> .pr_fasttimo = icmp6_fasttimo,
> .pr_sysctl = icmp6_sysctl
> @@ -215,9 +207,7 @@ const struct protosw inet6sw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = ah46_input,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> .pr_sysctl = ah_sysctl
> },
> {
> @@ -227,9 +217,7 @@ const struct protosw inet6sw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = esp46_input,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> .pr_sysctl = esp_sysctl
> },
> {
> @@ -239,9 +227,7 @@ const struct protosw inet6sw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = ipcomp46_input,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> .pr_sysctl = ipcomp_sysctl
> },
> #endif /* IPSEC */
> @@ -256,9 +242,7 @@ const struct protosw inet6sw[] = {
> .pr_input = ipip_input,
> #endif
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq, /* XXX */
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs, /* XXX */
> },
> {
> .pr_type = SOCK_RAW,
> @@ -271,9 +255,7 @@ const struct protosw inet6sw[] = {
> .pr_input = ipip_input,
> #endif
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq, /* XXX */
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs, /* XXX */
> },
> #if defined(MPLS) && NGIF > 0
> {
> @@ -287,9 +269,7 @@ const struct protosw inet6sw[] = {
> .pr_input = ipip_input,
> #endif
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq, /* XXX */
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs, /* XXX */
> },
> #endif /* MPLS */
> #if NCARP > 0
> @@ -300,9 +280,7 @@ const struct protosw inet6sw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = carp6_proto_input,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> .pr_sysctl = carp_sysctl
> },
> #endif /* NCARP */
> @@ -313,9 +291,7 @@ const struct protosw inet6sw[] = {
> .pr_protocol = IPPROTO_DIVERT,
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = divert6_usrreq,
> - .pr_attach = divert6_attach,
> - .pr_detach = divert6_detach,
> + .pr_usrreqs = &divert6_usrreqs,
> .pr_init = divert6_init,
> .pr_sysctl = divert6_sysctl
> },
> @@ -328,9 +304,7 @@ const struct protosw inet6sw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = ip6_etherip_input,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> },
> #endif /* NETHERIP */
> #if NGRE > 0
> @@ -341,9 +315,7 @@ const struct protosw inet6sw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = gre_input6,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> },
> #endif /* NGRE */
> {
> @@ -353,9 +325,7 @@ const struct protosw inet6sw[] = {
> .pr_flags = PR_ATOMIC|PR_ADDR,
> .pr_input = rip6_input,
> .pr_ctloutput = rip6_ctloutput,
> - .pr_usrreq = rip6_usrreq,
> - .pr_attach = rip6_attach,
> - .pr_detach = rip6_detach,
> + .pr_usrreqs = &rip6_usrreqs,
> .pr_init = rip6_init
> }
> };
> Index: sys/netinet6/ip6_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_divert.c,v
> retrieving revision 1.67
> diff -u -p -r1.67 ip6_divert.c
> --- sys/netinet6/ip6_divert.c 9 May 2022 19:33:46 -0000 1.67
> +++ sys/netinet6/ip6_divert.c 13 Aug 2022 21:59:52 -0000
> @@ -63,6 +63,12 @@ const struct sysctl_bounded_args divert6
> { DIVERT6CTL_SENDSPACE, &divert6_sendspace, 0, INT_MAX },
> };
>
> +const struct pr_usrreqs divert6_usrreqs = {
> + .pru_usrreq = divert6_usrreq,
> + .pru_attach = divert6_attach,
> + .pru_detach = divert6_detach,
> +};
> +
> int divb6hashsize = DIVERTHASHSIZE;
>
> int divert6_output(struct inpcb *, struct mbuf *, struct mbuf *,
> Index: sys/netinet6/ip6_divert.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_divert.h,v
> retrieving revision 1.13
> diff -u -p -r1.13 ip6_divert.h
> --- sys/netinet6/ip6_divert.h 5 May 2022 16:44:22 -0000 1.13
> +++ sys/netinet6/ip6_divert.h 13 Aug 2022 21:59:52 -0000
> @@ -65,6 +65,8 @@ div6stat_inc(enum div6stat_counters c)
>
> extern struct inpcbtable divb6table;
>
> +extern const struct pr_usrreqs divert6_usrreqs;
> +
> void divert6_init(void);
> void divert6_packet(struct mbuf *, int, u_int16_t);
> int divert6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
> Index: sys/netinet6/ip6_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_var.h,v
> retrieving revision 1.94
> diff -u -p -r1.94 ip6_var.h
> --- sys/netinet6/ip6_var.h 12 Aug 2022 14:49:15 -0000 1.94
> +++ sys/netinet6/ip6_var.h 13 Aug 2022 21:59:52 -0000
> @@ -300,6 +300,8 @@ extern int ip6_auto_linklocal;
> #define IP6_SOIIKEY_LEN 16
> extern uint8_t ip6_soiikey[IP6_SOIIKEY_LEN];
>
> +extern const struct pr_usrreqs rip6_usrreqs;
> +
> struct in6pcb;
> struct inpcb;
>
> Index: sys/netinet6/raw_ip6.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v
> retrieving revision 1.149
> diff -u -p -r1.149 raw_ip6.c
> --- sys/netinet6/raw_ip6.c 8 Aug 2022 12:06:31 -0000 1.149
> +++ sys/netinet6/raw_ip6.c 13 Aug 2022 21:59:52 -0000
> @@ -105,6 +105,12 @@ struct inpcbtable rawin6pcbtable;
>
> struct cpumem *rip6counters;
>
> +const struct pr_usrreqs rip6_usrreqs = {
> + .pru_usrreq = rip6_usrreq,
> + .pru_attach = rip6_attach,
> + .pru_detach = rip6_detach,
> +};
> +
> /*
> * Initialize raw connection block queue.
> */
> Index: sys/sys/protosw.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/protosw.h,v
> retrieving revision 1.36
> diff -u -p -r1.36 protosw.h
> --- sys/sys/protosw.h 13 Aug 2022 21:01:46 -0000 1.36
> +++ sys/sys/protosw.h 13 Aug 2022 21:59:52 -0000
> @@ -59,6 +59,15 @@ struct socket;
> struct domain;
> struct proc;
>
> +struct pr_usrreqs {
> + /* user request: see list below */
> + int (*pru_usrreq)(struct socket *, int, struct mbuf *,
> + struct mbuf *, struct mbuf *, struct proc *);
> +
> + int (*pru_attach)(struct socket *, int);
> + int (*pru_detach)(struct socket *);
> +};
> +
> struct protosw {
> short pr_type; /* socket type used for */
> const struct domain *pr_domain; /* domain protocol a member of */
> @@ -76,14 +85,9 @@ struct protosw {
> /* control output (from above) */
> int (*pr_ctloutput)(int, struct socket *, int, int, struct mbuf *);
>
> -/* user-protocol hook */
> - /* user request: see list below */
> - int (*pr_usrreq)(struct socket *, int, struct mbuf *,
> - struct mbuf *, struct mbuf *, struct proc *);
> -
> - int (*pr_attach)(struct socket *, int);
> - int (*pr_detach)(struct socket *);
> -
> +/* user-protocol hooks */
> + const struct pr_usrreqs *pr_usrreqs;
> +
> /* utility hooks */
> void (*pr_init)(void); /* initialization hook */
> void (*pr_fasttimo)(void); /* fast timeout (200ms) */
> @@ -248,61 +252,61 @@ extern const struct protosw inet6sw[];
> static inline int
> pru_attach(struct socket *so, int proto)
> {
> - return (*so->so_proto->pr_attach)(so, proto);
> + return (*so->so_proto->pr_usrreqs->pru_attach)(so, proto);
> }
>
> static inline int
> pru_detach(struct socket *so)
> {
> - return (*so->so_proto->pr_detach)(so);
> + return (*so->so_proto->pr_usrreqs->pru_detach)(so);
> }
>
> static inline int
> pru_bind(struct socket *so, struct mbuf *nam, struct proc *p)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_BIND, NULL, nam, NULL, p);
> }
>
> static inline int
> pru_listen(struct socket *so)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_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,
> + return (*so->so_proto->pr_usrreqs->pru_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,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_ACCEPT, NULL, nam, NULL, curproc);
> }
>
> static inline int
> pru_disconnect(struct socket *so)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_DISCONNECT, NULL, NULL, NULL, curproc);
> }
>
> static inline int
> pru_shutdown(struct socket *so)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_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,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_RCVD, NULL, (struct mbuf *)(long)flags, NULL, curproc);
> }
>
> @@ -310,14 +314,14 @@ static inline int
> pru_send(struct socket *so, struct mbuf *top, struct mbuf *addr,
> struct mbuf *control)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_SEND, top, addr, control, curproc);
> }
>
> static inline int
> pru_abort(struct socket *so)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_ABORT, NULL, NULL, NULL, curproc);
> }
>
> @@ -325,7 +329,7 @@ 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,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_CONTROL, (struct mbuf *)cmd, (struct mbuf *)data,
> (struct mbuf *)ifp, p);
> }
> @@ -333,14 +337,14 @@ pru_control(struct socket *so, u_long cm
> static inline int
> pru_sense(struct socket *so, struct stat *ub)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_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,
> + return (*so->so_proto->pr_usrreqs->pru_usrreq)(so,
> PRU_RCVOOB, m, (struct mbuf *)(long)flags, NULL, curproc);
> }
>
> @@ -348,28 +352,28 @@ static inline int
> pru_sendoob(struct socket *so, struct mbuf *top, struct mbuf *addr,
> struct mbuf *control)
> {
> - return (*so->so_proto->pr_usrreq)(so,
> + return (*so->so_proto->pr_usrreqs->pru_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,
> + return (*so->so_proto->pr_usrreqs->pru_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,
> + return (*so->so_proto->pr_usrreqs->pru_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,
> + return (*so1->so_proto->pr_usrreqs->pru_usrreq)(so1,
> PRU_CONNECT2, NULL, (struct mbuf *)so2, NULL, curproc);
> }
>
> Index: sys/sys/unpcb.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/unpcb.h,v
> retrieving revision 1.26
> diff -u -p -r1.26 unpcb.h
> --- sys/sys/unpcb.h 1 Jul 2022 09:56:17 -0000 1.26
> +++ sys/sys/unpcb.h 13 Aug 2022 21:59:52 -0000
> @@ -107,6 +107,8 @@ struct fdpass {
> int flags;
> };
>
> +extern const struct pr_usrreqs uipc_usrreqs;
> +
> int uipc_usrreq(struct socket *, int , struct mbuf *,
> struct mbuf *, struct mbuf *, struct proc *);
> int uipc_attach(struct socket *, int);