On Sat, Aug 20, 2022 at 05:56:51PM +0300, Vitaliy Makkoveev wrote: > We have 15 PRU_ requests to split. Is the one request per diff fine?
Yes. OK bluhm@ > Index: sys/kern/uipc_usrreq.c > =================================================================== > RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v > retrieving revision 1.168 > diff -u -p -r1.168 uipc_usrreq.c > --- sys/kern/uipc_usrreq.c 15 Aug 2022 09:11:38 -0000 1.168 > +++ sys/kern/uipc_usrreq.c 20 Aug 2022 14:42:47 -0000 > @@ -130,6 +130,7 @@ const struct pr_usrreqs uipc_usrreqs = { > .pru_usrreq = uipc_usrreq, > .pru_attach = uipc_attach, > .pru_detach = uipc_detach, > + .pru_bind = uipc_bind, > }; > > void > @@ -222,10 +223,6 @@ uipc_usrreq(struct socket *so, int req, > > switch (req) { > > - case PRU_BIND: > - error = unp_bind(unp, nam, p); > - break; > - > case PRU_LISTEN: > if (unp->unp_vnode == NULL) > error = EINVAL; > @@ -535,6 +532,14 @@ uipc_detach(struct socket *so) > unp_detach(unp); > > return (0); > +} > + > +int > +uipc_bind(struct socket *so, struct mbuf *nam, struct proc *p) > +{ > + struct unpcb *unp = sotounpcb(so); > + > + return unp_bind(unp, nam, p); > } > > int > Index: sys/net/pfkeyv2.c > =================================================================== > RCS file: /cvs/src/sys/net/pfkeyv2.c,v > retrieving revision 1.235 > diff -u -p -r1.235 pfkeyv2.c > --- sys/net/pfkeyv2.c 15 Aug 2022 09:11:38 -0000 1.235 > +++ sys/net/pfkeyv2.c 20 Aug 2022 14:42:47 -0000 > @@ -358,7 +358,6 @@ pfkeyv2_usrreq(struct socket *so, int re > switch (req) { > /* no connect, bind, accept. Socket is connected from the start */ > case PRU_CONNECT: > - case PRU_BIND: > case PRU_CONNECT2: > case PRU_LISTEN: > case PRU_ACCEPT: > Index: sys/net/rtsock.c > =================================================================== > RCS file: /cvs/src/sys/net/rtsock.c,v > retrieving revision 1.335 > diff -u -p -r1.335 rtsock.c > --- sys/net/rtsock.c 15 Aug 2022 09:11:38 -0000 1.335 > +++ sys/net/rtsock.c 20 Aug 2022 14:42:47 -0000 > @@ -234,7 +234,6 @@ route_usrreq(struct socket *so, int req, > switch (req) { > /* no connect, bind, accept. Socket is connected from the start */ > case PRU_CONNECT: > - case PRU_BIND: > case PRU_CONNECT2: > case PRU_LISTEN: > case PRU_ACCEPT: > Index: sys/netinet/ip_divert.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_divert.c,v > retrieving revision 1.69 > diff -u -p -r1.69 ip_divert.c > --- sys/netinet/ip_divert.c 15 Aug 2022 09:11:39 -0000 1.69 > +++ sys/netinet/ip_divert.c 20 Aug 2022 14:42:47 -0000 > @@ -66,6 +66,7 @@ const struct pr_usrreqs divert_usrreqs = > .pru_usrreq = divert_usrreq, > .pru_attach = divert_attach, > .pru_detach = divert_detach, > + .pru_bind = divert_bind, > }; > > int divbhashsize = DIVERTHASHSIZE; > @@ -274,10 +275,6 @@ divert_usrreq(struct socket *so, int req > } > switch (req) { > > - case PRU_BIND: > - error = in_pcbbind(inp, addr, p); > - break; > - > case PRU_SHUTDOWN: > socantsendmore(so); > break; > @@ -362,6 +359,15 @@ divert_detach(struct socket *so) > > in_pcbdetach(inp); > return (0); > +} > + > +int > +divert_bind(struct socket *so, struct mbuf *addr, struct proc *p) > +{ > + struct inpcb *inp = sotoinpcb(so); > + > + soassertlocked(so); > + return in_pcbbind(inp, addr, p); > } > > int > Index: sys/netinet/ip_divert.h > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_divert.h,v > retrieving revision 1.16 > diff -u -p -r1.16 ip_divert.h > --- sys/netinet/ip_divert.h 15 Aug 2022 09:11:39 -0000 1.16 > +++ sys/netinet/ip_divert.h 20 Aug 2022 14:42:47 -0000 > @@ -74,5 +74,6 @@ int divert_usrreq(struct socket *, > int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *); > int divert_attach(struct socket *, int); > int divert_detach(struct socket *); > +int divert_bind(struct socket *, struct mbuf *, struct proc *); > #endif /* _KERNEL */ > #endif /* _IP_DIVERT_H_ */ > Index: sys/netinet/ip_gre.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_gre.c,v > retrieving revision 1.75 > diff -u -p -r1.75 ip_gre.c > --- sys/netinet/ip_gre.c 15 Aug 2022 09:11:39 -0000 1.75 > +++ sys/netinet/ip_gre.c 20 Aug 2022 14:42:47 -0000 > @@ -65,6 +65,7 @@ const struct pr_usrreqs gre_usrreqs = { > .pru_usrreq = gre_usrreq, > .pru_attach = rip_attach, > .pru_detach = rip_detach, > + .pru_bind = rip_bind, > }; > > int > Index: sys/netinet/ip_var.h > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_var.h,v > retrieving revision 1.97 > diff -u -p -r1.97 ip_var.h > --- sys/netinet/ip_var.h 15 Aug 2022 09:11:39 -0000 1.97 > +++ sys/netinet/ip_var.h 20 Aug 2022 14:42:47 -0000 > @@ -260,6 +260,7 @@ int rip_usrreq(struct socket *, > int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *); > int rip_attach(struct socket *, int); > int rip_detach(struct socket *); > +int rip_bind(struct socket *so, struct mbuf *, struct proc *); > #ifdef MROUTING > extern struct socket *ip_mrouter[]; /* multicast routing daemon */ > #endif > Index: sys/netinet/raw_ip.c > =================================================================== > RCS file: /cvs/src/sys/netinet/raw_ip.c,v > retrieving revision 1.130 > diff -u -p -r1.130 raw_ip.c > --- sys/netinet/raw_ip.c 15 Aug 2022 09:11:39 -0000 1.130 > +++ sys/netinet/raw_ip.c 20 Aug 2022 14:42:47 -0000 > @@ -107,6 +107,7 @@ const struct pr_usrreqs rip_usrreqs = { > .pru_usrreq = rip_usrreq, > .pru_attach = rip_attach, > .pru_detach = rip_detach, > + .pru_bind = rip_bind, > }; > > /* > @@ -485,23 +486,6 @@ rip_usrreq(struct socket *so, int req, s > in_pcbdetach(inp); > break; > > - case PRU_BIND: > - { > - struct sockaddr_in *addr; > - > - if ((error = in_nam2sin(nam, &addr))) > - break; > - if (!((so->so_options & SO_BINDANY) || > - addr->sin_addr.s_addr == INADDR_ANY || > - addr->sin_addr.s_addr == INADDR_BROADCAST || > - in_broadcast(addr->sin_addr, inp->inp_rtableid) || > - ifa_ifwithaddr(sintosa(addr), inp->inp_rtableid))) { > - error = EADDRNOTAVAIL; > - break; > - } > - inp->inp_laddr = addr->sin_addr; > - break; > - } > case PRU_CONNECT: > { > struct sockaddr_in *addr; > @@ -635,5 +619,29 @@ rip_detach(struct socket *so) > #endif > in_pcbdetach(inp); > > + return (0); > +} > + > +int > +rip_bind(struct socket *so, struct mbuf *nam, struct proc *p) > +{ > + struct inpcb *inp = sotoinpcb(so); > + struct sockaddr_in *addr; > + int error; > + > + soassertlocked(so); > + > + if ((error = in_nam2sin(nam, &addr))) > + return (error); > + > + if (!((so->so_options & SO_BINDANY) || > + addr->sin_addr.s_addr == INADDR_ANY || > + addr->sin_addr.s_addr == INADDR_BROADCAST || > + in_broadcast(addr->sin_addr, inp->inp_rtableid) || > + ifa_ifwithaddr(sintosa(addr), inp->inp_rtableid))) > + return (EADDRNOTAVAIL); > + > + inp->inp_laddr = addr->sin_addr; > + > return (0); > } > Index: sys/netinet/tcp_usrreq.c > =================================================================== > RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v > retrieving revision 1.188 > diff -u -p -r1.188 tcp_usrreq.c > --- sys/netinet/tcp_usrreq.c 15 Aug 2022 14:44:18 -0000 1.188 > +++ sys/netinet/tcp_usrreq.c 20 Aug 2022 14:42:47 -0000 > @@ -115,6 +115,7 @@ const struct pr_usrreqs tcp_usrreqs = { > .pru_usrreq = tcp_usrreq, > .pru_attach = tcp_attach, > .pru_detach = tcp_detach, > + .pru_bind = tcp_bind, > }; > > static int pr_slowhz = PR_SLOWHZ; > @@ -212,13 +213,6 @@ tcp_usrreq(struct socket *so, int req, s > switch (req) { > > /* > - * Give the socket an address. > - */ > - case PRU_BIND: > - error = in_pcbbind(inp, nam, p); > - break; > - > - /* > * Prepare to accept connections. > */ > case PRU_LISTEN: > @@ -777,6 +771,32 @@ tcp_detach(struct socket *so) > > if (otp) > tcp_trace(TA_USER, ostate, tp, otp, NULL, PRU_DETACH, 0); > + return (error); > +} > + > +/* > + * Give the socket an address. > + */ > +int > +tcp_bind(struct socket *so, struct mbuf *nam, struct proc *p) > +{ > + struct inpcb *inp; > + struct tcpcb *tp; > + int error; > + short ostate; > + > + soassertlocked(so); > + > + if ((error = tcp_sogetpcb(so, &inp, &tp))) > + return (error); > + > + if (so->so_options & SO_DEBUG) > + ostate = tp->t_state; > + > + error = in_pcbbind(inp, nam, p); > + > + if (so->so_options & SO_DEBUG) > + tcp_trace(TA_USER, ostate, tp, tp, NULL, PRU_BIND, 0); > return (error); > } > > Index: sys/netinet/tcp_var.h > =================================================================== > RCS file: /cvs/src/sys/netinet/tcp_var.h,v > retrieving revision 1.141 > diff -u -p -r1.141 tcp_var.h > --- sys/netinet/tcp_var.h 15 Aug 2022 09:11:39 -0000 1.141 > +++ sys/netinet/tcp_var.h 20 Aug 2022 14:42:47 -0000 > @@ -714,6 +714,7 @@ int tcp_usrreq(struct socket *, > int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *); > int tcp_attach(struct socket *, int); > int tcp_detach(struct socket *); > +int tcp_bind(struct socket *, struct mbuf *, struct proc *); > void tcp_xmit_timer(struct tcpcb *, int); > void tcpdropoldhalfopen(struct tcpcb *, u_int16_t); > void tcp_sack_option(struct tcpcb *,struct tcphdr *,u_char *,int); > Index: sys/netinet/udp_usrreq.c > =================================================================== > RCS file: /cvs/src/sys/netinet/udp_usrreq.c,v > retrieving revision 1.282 > diff -u -p -r1.282 udp_usrreq.c > --- sys/netinet/udp_usrreq.c 15 Aug 2022 09:11:39 -0000 1.282 > +++ sys/netinet/udp_usrreq.c 20 Aug 2022 14:42:47 -0000 > @@ -126,6 +126,7 @@ const struct pr_usrreqs udp_usrreqs = { > .pru_usrreq = udp_usrreq, > .pru_attach = udp_attach, > .pru_detach = udp_detach, > + .pru_bind = udp_bind, > }; > > const struct sysctl_bounded_args udpctl_vars[] = { > @@ -1074,10 +1075,6 @@ udp_usrreq(struct socket *so, int req, s > */ > switch (req) { > > - case PRU_BIND: > - error = in_pcbbind(inp, addr, p); > - break; > - > case PRU_LISTEN: > error = EOPNOTSUPP; > break; > @@ -1273,6 +1270,15 @@ udp_detach(struct socket *so) > > in_pcbdetach(inp); > return (0); > +} > + > +int > +udp_bind(struct socket *so, struct mbuf *addr, struct proc *p) > +{ > + struct inpcb *inp = sotoinpcb(so); > + > + soassertlocked(so); > + return in_pcbbind(inp, addr, p); > } > > /* > Index: sys/netinet/udp_var.h > =================================================================== > RCS file: /cvs/src/sys/netinet/udp_var.h,v > retrieving revision 1.38 > diff -u -p -r1.38 udp_var.h > --- sys/netinet/udp_var.h 15 Aug 2022 09:11:39 -0000 1.38 > +++ sys/netinet/udp_var.h 20 Aug 2022 14:42:47 -0000 > @@ -143,5 +143,6 @@ int udp_usrreq(struct socket *, > int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *); > int udp_attach(struct socket *, int); > int udp_detach(struct socket *); > +int udp_bind(struct socket *, struct mbuf *, struct proc *); > #endif /* _KERNEL */ > #endif /* _NETINET_UDP_VAR_H_ */ > Index: sys/netinet6/ip6_divert.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/ip6_divert.c,v > retrieving revision 1.68 > diff -u -p -r1.68 ip6_divert.c > --- sys/netinet6/ip6_divert.c 15 Aug 2022 09:11:39 -0000 1.68 > +++ sys/netinet6/ip6_divert.c 20 Aug 2022 14:42:47 -0000 > @@ -67,6 +67,7 @@ const struct pr_usrreqs divert6_usrreqs > .pru_usrreq = divert6_usrreq, > .pru_attach = divert6_attach, > .pru_detach = divert6_detach, > + .pru_bind = divert6_bind, > }; > > int divb6hashsize = DIVERTHASHSIZE; > @@ -280,10 +281,6 @@ divert6_usrreq(struct socket *so, int re > } > switch (req) { > > - case PRU_BIND: > - error = in_pcbbind(inp, addr, p); > - break; > - > case PRU_SHUTDOWN: > socantsendmore(so); > break; > @@ -369,6 +366,15 @@ divert6_detach(struct socket *so) > in_pcbdetach(inp); > > return (0); > +} > + > +int > +divert6_bind(struct socket *so, struct mbuf *addr, struct proc *p) > +{ > + struct inpcb *inp = sotoinpcb(so); > + > + soassertlocked(so); > + return in_pcbbind(inp, addr, p); > } > > int > Index: sys/netinet6/ip6_divert.h > =================================================================== > RCS file: /cvs/src/sys/netinet6/ip6_divert.h,v > retrieving revision 1.14 > diff -u -p -r1.14 ip6_divert.h > --- sys/netinet6/ip6_divert.h 15 Aug 2022 09:11:39 -0000 1.14 > +++ sys/netinet6/ip6_divert.h 20 Aug 2022 14:42:47 -0000 > @@ -74,6 +74,7 @@ int divert6_usrreq(struct socket *, > int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *); > int divert6_attach(struct socket *, int); > int divert6_detach(struct socket *); > +int divert6_bind(struct socket *, struct mbuf *, struct proc *); > #endif /* _KERNEL */ > > #endif /* _IP6_DIVERT_H_ */ > Index: sys/netinet6/ip6_var.h > =================================================================== > RCS file: /cvs/src/sys/netinet6/ip6_var.h,v > retrieving revision 1.95 > diff -u -p -r1.95 ip6_var.h > --- sys/netinet6/ip6_var.h 15 Aug 2022 09:11:39 -0000 1.95 > +++ sys/netinet6/ip6_var.h 20 Aug 2022 14:42:47 -0000 > @@ -355,6 +355,7 @@ int rip6_usrreq(struct socket *, > int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *); > int rip6_attach(struct socket *, int); > int rip6_detach(struct socket *); > +int rip6_bind(struct socket *, struct mbuf *, struct proc *); > int rip6_sysctl(int *, u_int, void *, size_t *, void *, size_t); > > int dest6_input(struct mbuf **, int *, int, int); > Index: sys/netinet6/raw_ip6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v > retrieving revision 1.150 > diff -u -p -r1.150 raw_ip6.c > --- sys/netinet6/raw_ip6.c 15 Aug 2022 09:11:39 -0000 1.150 > +++ sys/netinet6/raw_ip6.c 20 Aug 2022 14:42:48 -0000 > @@ -109,6 +109,7 @@ const struct pr_usrreqs rip6_usrreqs = { > .pru_usrreq = rip6_usrreq, > .pru_attach = rip6_attach, > .pru_detach = rip6_detach, > + .pru_bind = rip6_bind, > }; > > /* > @@ -604,25 +605,6 @@ rip6_usrreq(struct socket *so, int req, > in_pcbdetach(in6p); > break; > > - case PRU_BIND: > - { > - struct sockaddr_in6 *addr; > - > - if ((error = in6_nam2sin6(nam, &addr))) > - break; > - /* > - * Make sure to not enter in_pcblookup_local(), local ports > - * are non-sensical for raw sockets. > - */ > - addr->sin6_port = 0; > - > - if ((error = in6_pcbaddrisavail(in6p, addr, 0, p))) > - break; > - > - in6p->inp_laddr6 = addr->sin6_addr; > - break; > - } > - > case PRU_CONNECT: > { > struct sockaddr_in6 *addr; > @@ -772,6 +754,31 @@ rip6_detach(struct socket *so) > > in_pcbdetach(in6p); > > + return (0); > +} > + > +int > +rip6_bind(struct socket *so, struct mbuf *nam, struct proc *p) > +{ > + struct inpcb *in6p = sotoinpcb(so); > + struct sockaddr_in6 *addr; > + int error; > + > + soassertlocked(so); > + > + if ((error = in6_nam2sin6(nam, &addr))) > + return (error); > + > + /* > + * Make sure to not enter in_pcblookup_local(), local ports > + * are non-sensical for raw sockets. > + */ > + addr->sin6_port = 0; > + > + if ((error = in6_pcbaddrisavail(in6p, addr, 0, p))) > + return (error); > + > + in6p->inp_laddr6 = addr->sin6_addr; > return (0); > } > > Index: sys/sys/protosw.h > =================================================================== > RCS file: /cvs/src/sys/sys/protosw.h,v > retrieving revision 1.37 > diff -u -p -r1.37 protosw.h > --- sys/sys/protosw.h 15 Aug 2022 09:11:39 -0000 1.37 > +++ sys/sys/protosw.h 20 Aug 2022 14:42:48 -0000 > @@ -66,6 +66,7 @@ struct pr_usrreqs { > > int (*pru_attach)(struct socket *, int); > int (*pru_detach)(struct socket *); > + int (*pru_bind)(struct socket *, struct mbuf *, struct proc *); > }; > > struct protosw { > @@ -264,8 +265,9 @@ pru_detach(struct socket *so) > static inline int > pru_bind(struct socket *so, struct mbuf *nam, struct proc *p) > { > - return (*so->so_proto->pr_usrreqs->pru_usrreq)(so, > - PRU_BIND, NULL, nam, NULL, p); > + if (so->so_proto->pr_usrreqs->pru_bind) > + return (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, p); > + return (EOPNOTSUPP); > } > > static inline int > Index: sys/sys/unpcb.h > =================================================================== > RCS file: /cvs/src/sys/sys/unpcb.h,v > retrieving revision 1.27 > diff -u -p -r1.27 unpcb.h > --- sys/sys/unpcb.h 15 Aug 2022 09:11:39 -0000 1.27 > +++ sys/sys/unpcb.h 20 Aug 2022 14:42:48 -0000 > @@ -113,6 +113,7 @@ int uipc_usrreq(struct socket *, int , s > struct mbuf *, struct mbuf *, struct proc *); > int uipc_attach(struct socket *, int); > int uipc_detach(struct socket *); > +int uipc_bind(struct socket *, struct mbuf *, struct proc *); > > void unp_init(void); > int unp_bind(struct unpcb *, struct mbuf *, struct proc *);