Yes, splitting {tcp,udp}_usrreqs and {tcp,udp}6_usrreqs is clearly the Right Thing. ok guenther@
Unrelated to this specific callback, but I think you should consider splitting out uipc_dgram_usrreqs out from uipc_usrreqs, as the SOCK_DGRAM case differs from the other two for multiple callbacks. Philip On Thu, Sep 1, 2022 at 10:54 AM Vitaliy Makkoveev <m...@openbsd.org> wrote: > The 'proc *' is not used for PRU_CONTROL request, so remove it from > pru_control() wrapper. > > I want to use existing in{6,}_control for tcp(4) and udp(4) sockets, so > for inet6 case I introduced `tcp6_usrreqs' and `udp6_usrreqs' > structures. I also want to use them for the following PRU_SOCKADDR and > PRU_PEERADDR. > > Since the PRU_SOCKADDR and PRU_PEERADDR are the last ones, I want to > move the corresponding (*pru_)() handlers and kill (*pru_usrreq)() with > single diff. Is it ok to review? > > Index: sys/sys/protosw.h > =================================================================== > RCS file: /cvs/src/sys/sys/protosw.h,v > retrieving revision 1.51 > diff -u -p -r1.51 protosw.h > --- sys/sys/protosw.h 1 Sep 2022 18:21:23 -0000 1.51 > +++ sys/sys/protosw.h 1 Sep 2022 19:35:08 -0000 > @@ -59,6 +59,7 @@ struct socket; > struct domain; > struct proc; > struct stat; > +struct ifnet; > > struct pr_usrreqs { > /* user request: see list below */ > @@ -77,6 +78,8 @@ struct pr_usrreqs { > int (*pru_send)(struct socket *, struct mbuf *, struct mbuf *, > struct mbuf *); > int (*pru_abort)(struct socket *); > + int (*pru_control)(struct socket *, u_long, caddr_t, > + struct ifnet *); > int (*pru_sense)(struct socket *, struct stat *); > int (*pru_rcvoob)(struct socket *, struct mbuf *, int); > int (*pru_sendoob)(struct socket *, struct mbuf *, struct mbuf > *, > @@ -343,12 +346,12 @@ pru_abort(struct socket *so) > } > > static inline int > -pru_control(struct socket *so, u_long cmd, caddr_t data, > - struct ifnet *ifp, struct proc *p) > +pru_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet > *ifp) > { > - return (*so->so_proto->pr_usrreqs->pru_usrreq)(so, > - PRU_CONTROL, (struct mbuf *)cmd, (struct mbuf *)data, > - (struct mbuf *)ifp, p); > + if (so->so_proto->pr_usrreqs->pru_control) > + return (*so->so_proto->pr_usrreqs->pru_control)(so, > + cmd, data, ifp); > + return (EOPNOTSUPP); > } > > static inline int > Index: sys/kern/sys_socket.c > =================================================================== > RCS file: /cvs/src/sys/kern/sys_socket.c,v > retrieving revision 1.53 > diff -u -p -r1.53 sys_socket.c > --- sys/kern/sys_socket.c 14 Aug 2022 01:58:28 -0000 1.53 > +++ sys/kern/sys_socket.c 1 Sep 2022 19:35:07 -0000 > @@ -137,7 +137,7 @@ soo_ioctl(struct file *fp, u_long cmd, c > if (IOCGROUP(cmd) == 'r') > return (EOPNOTSUPP); > KERNEL_LOCK(); > - error = pru_control(so, cmd, data, NULL, p); > + error = pru_control(so, cmd, data, NULL); > KERNEL_UNLOCK(); > break; > } > Index: sys/kern/uipc_usrreq.c > =================================================================== > RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v > retrieving revision 1.182 > diff -u -p -r1.182 uipc_usrreq.c > --- sys/kern/uipc_usrreq.c 1 Sep 2022 18:21:22 -0000 1.182 > +++ sys/kern/uipc_usrreq.c 1 Sep 2022 19:35:07 -0000 > @@ -219,8 +219,6 @@ uipc_usrreq(struct socket *so, int req, > struct socket *so2; > int error = 0; > > - if (req == PRU_CONTROL) > - return (EOPNOTSUPP); > if (req != PRU_SEND && control && control->m_len) { > error = EOPNOTSUPP; > goto release; > Index: sys/net/if.c > =================================================================== > RCS file: /cvs/src/sys/net/if.c,v > retrieving revision 1.663 > diff -u -p -r1.663 if.c > --- sys/net/if.c 13 Aug 2022 21:01:46 -0000 1.663 > +++ sys/net/if.c 1 Sep 2022 19:35:07 -0000 > @@ -2360,7 +2360,7 @@ forceup: > break; > /* FALLTHROUGH */ > default: > - error = pru_control(so, cmd, data, ifp, p); > + error = pru_control(so, cmd, data, ifp); > if (error != EOPNOTSUPP) > break; > switch (cmd) { > Index: sys/net/pfkeyv2.c > =================================================================== > RCS file: /cvs/src/sys/net/pfkeyv2.c,v > retrieving revision 1.249 > diff -u -p -r1.249 pfkeyv2.c > --- sys/net/pfkeyv2.c 1 Sep 2022 18:21:23 -0000 1.249 > +++ sys/net/pfkeyv2.c 1 Sep 2022 19:35:07 -0000 > @@ -395,9 +395,6 @@ pfkeyv2_usrreq(struct socket *so, int re > struct pkpcb *kp; > int error = 0; > > - if (req == PRU_CONTROL) > - return (EOPNOTSUPP); > - > soassertlocked(so); > > if (control && control->m_len) { > Index: sys/net/rtsock.c > =================================================================== > RCS file: /cvs/src/sys/net/rtsock.c,v > retrieving revision 1.350 > diff -u -p -r1.350 rtsock.c > --- sys/net/rtsock.c 1 Sep 2022 18:21:23 -0000 1.350 > +++ sys/net/rtsock.c 1 Sep 2022 19:35:07 -0000 > @@ -220,9 +220,6 @@ route_usrreq(struct socket *so, int req, > struct rtpcb *rop; > int error = 0; > > - if (req == PRU_CONTROL) > - return (EOPNOTSUPP); > - > soassertlocked(so); > > if (control && control->m_len) { > Index: sys/netinet/ip_divert.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_divert.c,v > retrieving revision 1.83 > diff -u -p -r1.83 ip_divert.c > --- sys/netinet/ip_divert.c 1 Sep 2022 18:21:23 -0000 1.83 > +++ sys/netinet/ip_divert.c 1 Sep 2022 19:35:08 -0000 > @@ -70,6 +70,7 @@ const struct pr_usrreqs divert_usrreqs = > .pru_shutdown = divert_shutdown, > .pru_send = divert_send, > .pru_abort = divert_abort, > + .pru_control = in_control, > }; > > int divbhashsize = DIVERTHASHSIZE; > @@ -257,11 +258,6 @@ divert_usrreq(struct socket *so, int req > { > struct inpcb *inp = sotoinpcb(so); > int error = 0; > - > - if (req == PRU_CONTROL) { > - return (in_control(so, (u_long)m, (caddr_t)addr, > - (struct ifnet *)control)); > - } > > soassertlocked(so); > > Index: sys/netinet/ip_gre.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_gre.c,v > retrieving revision 1.81 > diff -u -p -r1.81 ip_gre.c > --- sys/netinet/ip_gre.c 28 Aug 2022 18:44:16 -0000 1.81 > +++ sys/netinet/ip_gre.c 1 Sep 2022 19:35:08 -0000 > @@ -49,6 +49,7 @@ > #include <sys/sysctl.h> > > #include <net/if.h> > +#include <net/if_var.h> > #include <net/route.h> > > #include <netinet/in.h> > @@ -56,6 +57,7 @@ > #include <netinet/ip_gre.h> > #include <netinet/ip_var.h> > #include <netinet/in_pcb.h> > +#include <netinet/in_var.h> > > #ifdef PIPEX > #include <net/pipex.h> > @@ -71,6 +73,7 @@ const struct pr_usrreqs gre_usrreqs = { > .pru_shutdown = rip_shutdown, > .pru_send = gre_send, > .pru_abort = rip_abort, > + .pru_control = in_control, > }; > > int > Index: sys/netinet/raw_ip.c > =================================================================== > RCS file: /cvs/src/sys/netinet/raw_ip.c,v > retrieving revision 1.144 > diff -u -p -r1.144 raw_ip.c > --- sys/netinet/raw_ip.c 1 Sep 2022 18:21:23 -0000 1.144 > +++ sys/netinet/raw_ip.c 1 Sep 2022 19:35:08 -0000 > @@ -113,6 +113,7 @@ const struct pr_usrreqs rip_usrreqs = { > .pru_shutdown = rip_shutdown, > .pru_send = rip_send, > .pru_abort = rip_abort, > + .pru_control = in_control, > }; > > /* > @@ -463,10 +464,6 @@ rip_usrreq(struct socket *so, int req, s > { > struct inpcb *inp; > int error = 0; > - > - if (req == PRU_CONTROL) > - return (in_control(so, (u_long)m, (caddr_t)nam, > - (struct ifnet *)control)); > > soassertlocked(so); > > Index: sys/netinet/tcp_usrreq.c > =================================================================== > RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v > retrieving revision 1.203 > diff -u -p -r1.203 tcp_usrreq.c > --- sys/netinet/tcp_usrreq.c 1 Sep 2022 18:21:23 -0000 1.203 > +++ sys/netinet/tcp_usrreq.c 1 Sep 2022 19:35:08 -0000 > @@ -127,8 +127,30 @@ const struct pr_usrreqs tcp_usrreqs = { > .pru_sense = tcp_sense, > .pru_rcvoob = tcp_rcvoob, > .pru_sendoob = tcp_sendoob, > + .pru_control = in_control, > }; > > +#ifdef INET6 > +const struct pr_usrreqs tcp6_usrreqs = { > + .pru_usrreq = tcp_usrreq, > + .pru_attach = tcp_attach, > + .pru_detach = tcp_detach, > + .pru_bind = tcp_bind, > + .pru_listen = tcp_listen, > + .pru_connect = tcp_connect, > + .pru_accept = tcp_accept, > + .pru_disconnect = tcp_disconnect, > + .pru_shutdown = tcp_shutdown, > + .pru_rcvd = tcp_rcvd, > + .pru_send = tcp_send, > + .pru_abort = tcp_abort, > + .pru_sense = tcp_sense, > + .pru_rcvoob = tcp_rcvoob, > + .pru_sendoob = tcp_sendoob, > + .pru_control = in6_control, > +}; > +#endif > + > static int pr_slowhz = PR_SLOWHZ; > const struct sysctl_bounded_args tcpctl_vars[] = { > { TCPCTL_SLOWHZ, &pr_slowhz, SYSCTL_INT_READONLY }, > @@ -194,17 +216,6 @@ tcp_usrreq(struct socket *so, int req, s > struct tcpcb *otp = NULL, *tp; > int error = 0; > short ostate; > - > - if (req == PRU_CONTROL) { > -#ifdef INET6 > - if (sotopf(so) == PF_INET6) > - return in6_control(so, (u_long)m, (caddr_t)nam, > - (struct ifnet *)control); > - else > -#endif /* INET6 */ > - return (in_control(so, (u_long)m, (caddr_t)nam, > - (struct ifnet *)control)); > - } > > soassertlocked(so); > > Index: sys/netinet/tcp_var.h > =================================================================== > RCS file: /cvs/src/sys/netinet/tcp_var.h,v > retrieving revision 1.153 > diff -u -p -r1.153 tcp_var.h > --- sys/netinet/tcp_var.h 31 Aug 2022 21:23:02 -0000 1.153 > +++ sys/netinet/tcp_var.h 1 Sep 2022 19:35:08 -0000 > @@ -639,6 +639,11 @@ tcpstat_pkt(enum tcpstat_counters pcount > } > > extern const struct pr_usrreqs tcp_usrreqs; > + > +#ifdef INET6 > +extern const struct pr_usrreqs tcp6_usrreqs; > +#endif > + > 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.298 > diff -u -p -r1.298 udp_usrreq.c > --- sys/netinet/udp_usrreq.c 1 Sep 2022 18:21:23 -0000 1.298 > +++ sys/netinet/udp_usrreq.c 1 Sep 2022 19:35:08 -0000 > @@ -132,7 +132,23 @@ const struct pr_usrreqs udp_usrreqs = { > .pru_shutdown = udp_shutdown, > .pru_send = udp_send, > .pru_abort = udp_abort, > + .pru_control = in_control, > }; > + > +#ifdef INET6 > +const struct pr_usrreqs udp6_usrreqs = { > + .pru_usrreq = udp_usrreq, > + .pru_attach = udp_attach, > + .pru_detach = udp_detach, > + .pru_bind = udp_bind, > + .pru_connect = udp_connect, > + .pru_disconnect = udp_disconnect, > + .pru_shutdown = udp_shutdown, > + .pru_send = udp_send, > + .pru_abort = udp_abort, > + .pru_control = in6_control, > +}; > +#endif > > const struct sysctl_bounded_args udpctl_vars[] = { > { UDPCTL_CHECKSUM, &udpcksum, 0, 1 }, > Index: sys/netinet/udp_var.h > =================================================================== > RCS file: /cvs/src/sys/netinet/udp_var.h,v > retrieving revision 1.44 > diff -u -p -r1.44 udp_var.h > --- sys/netinet/udp_var.h 28 Aug 2022 18:44:16 -0000 1.44 > +++ sys/netinet/udp_var.h 1 Sep 2022 19:35:08 -0000 > @@ -129,6 +129,10 @@ extern struct udpstat udpstat; > extern const struct pr_usrreqs udp_usrreqs; > > #ifdef INET6 > +extern const struct pr_usrreqs udp6_usrreqs; > +#endif > + > +#ifdef INET6 > void udp6_ctlinput(int, struct sockaddr *, u_int, void *); > #endif /* INET6 */ > void udp_ctlinput(int, struct sockaddr *, u_int, void *); > Index: sys/netinet6/in6_proto.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/in6_proto.c,v > retrieving revision 1.110 > diff -u -p -r1.110 in6_proto.c > --- sys/netinet6/in6_proto.c 15 Aug 2022 09:11:39 -0000 1.110 > +++ sys/netinet6/in6_proto.c 1 Sep 2022 19:35:08 -0000 > @@ -140,7 +140,7 @@ const struct protosw inet6sw[] = { > .pr_input = udp_input, > .pr_ctlinput = udp6_ctlinput, > .pr_ctloutput = ip6_ctloutput, > - .pr_usrreqs = &udp_usrreqs, > + .pr_usrreqs = &udp6_usrreqs, > .pr_sysctl = udp_sysctl > }, > { > @@ -151,7 +151,7 @@ const struct protosw inet6sw[] = { > .pr_input = tcp_input, > .pr_ctlinput = tcp6_ctlinput, > .pr_ctloutput = tcp_ctloutput, > - .pr_usrreqs = &tcp_usrreqs, > + .pr_usrreqs = &tcp6_usrreqs, > .pr_sysctl = tcp_sysctl > }, > { > Index: sys/netinet6/ip6_divert.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/ip6_divert.c,v > retrieving revision 1.82 > diff -u -p -r1.82 ip6_divert.c > --- sys/netinet6/ip6_divert.c 1 Sep 2022 18:21:23 -0000 1.82 > +++ sys/netinet6/ip6_divert.c 1 Sep 2022 19:35:08 -0000 > @@ -71,6 +71,7 @@ const struct pr_usrreqs divert6_usrreqs > .pru_shutdown = divert6_shutdown, > .pru_send = divert6_send, > .pru_abort = divert6_abort, > + .pru_control = in6_control, > }; > > int divb6hashsize = DIVERTHASHSIZE; > @@ -263,11 +264,6 @@ divert6_usrreq(struct socket *so, int re > { > struct inpcb *inp = sotoinpcb(so); > int error = 0; > - > - if (req == PRU_CONTROL) { > - return (in6_control(so, (u_long)m, (caddr_t)addr, > - (struct ifnet *)control)); > - } > > soassertlocked(so); > > Index: sys/netinet6/raw_ip6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v > retrieving revision 1.165 > diff -u -p -r1.165 raw_ip6.c > --- sys/netinet6/raw_ip6.c 1 Sep 2022 18:21:23 -0000 1.165 > +++ sys/netinet6/raw_ip6.c 1 Sep 2022 19:35:08 -0000 > @@ -115,6 +115,7 @@ const struct pr_usrreqs rip6_usrreqs = { > .pru_shutdown = rip6_shutdown, > .pru_send = rip6_send, > .pru_abort = rip6_abort, > + .pru_control = in6_control, > }; > > /* > @@ -579,10 +580,6 @@ rip6_usrreq(struct socket *so, int req, > { > struct inpcb *in6p; > int error = 0; > - > - if (req == PRU_CONTROL) > - return (in6_control(so, (u_long)m, (caddr_t)nam, > - (struct ifnet *)control)); > > soassertlocked(so); > > >