ping
> On 17 Sep 2022, at 22:44, Vitaliy Makkoveev <[email protected]> wrote:
>
> We have no interest on pru_abort() return value. Also we call it only
> through soabort() which is dummy pru_abort() wrapper and has no return
> value.
>
> Also only the connection oriented sockets need to implement
> (*pru_abort)() handler. Such sockets are tcp(4) and unix(4) sockets, so
> we could remove existing code for all others. Also the route domain and
> key management sockets have the wrong handlers because they don't
> destroy passed socket, but only disconnect it.
>
> We call soabort()/pru_abort() only to destroy the sockets linked to
> the `so_q' and `so_q1' of listening socket. Such sockets are not yet
> exported to the userland and have no associated file descriptor.
>
> We have two cases when we destroy them. The first case is the soclose()
> when we destroy the listening socket. The second one is the
> syn_cache_get() when we destroy newly created socket in the error path
> of incoming connection.
>
> Also, I like to have the diagnostic block within pru_rcvd() and
> pru_abort() wrappers. The requests handlers are optional, but they have
> no "pru_ != NULL" check, so something like below could be reasonable
>
> pru_abort(struct socket *so)
> {
> #ifdef DIAGNOSTIC
> if (so->so_proto->pr_usrreqs->pru_abort == NULL)
> panic("Inappropriate %s call for socket of proto %d type %d",
> __func__, so->so_proto->pr_protocol,
> so->so_proto->pr_type);
> #endif
>
> (*so->so_proto->pr_usrreqs->pru_abort)(so);
> }
>
>
> Index: sys/kern/uipc_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v
> retrieving revision 1.188
> diff -u -p -r1.188 uipc_usrreq.c
> --- sys/kern/uipc_usrreq.c 17 Sep 2022 12:40:52 -0000 1.188
> +++ sys/kern/uipc_usrreq.c 17 Sep 2022 19:06:09 -0000
> @@ -501,15 +501,13 @@ out:
> return (error);
> }
>
> -int
> +void
> uipc_abort(struct socket *so)
> {
> struct unpcb *unp = sotounpcb(so);
>
> unp_detach(unp);
> sofree(so, 0);
> -
> - return (0);
> }
>
> int
> Index: sys/net/pfkeyv2.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pfkeyv2.c,v
> retrieving revision 1.252
> diff -u -p -r1.252 pfkeyv2.c
> --- sys/net/pfkeyv2.c 3 Sep 2022 22:43:38 -0000 1.252
> +++ sys/net/pfkeyv2.c 17 Sep 2022 19:06:10 -0000
> @@ -175,7 +175,6 @@ int pfkeyv2_disconnect(struct socket *);
> int pfkeyv2_shutdown(struct socket *);
> int pfkeyv2_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int pfkeyv2_abort(struct socket *);
> int pfkeyv2_sockaddr(struct socket *, struct mbuf *);
> int pfkeyv2_peeraddr(struct socket *, struct mbuf *);
> int pfkeyv2_output(struct mbuf *, struct socket *);
> @@ -209,7 +208,6 @@ const struct pr_usrreqs pfkeyv2_usrreqs
> .pru_disconnect = pfkeyv2_disconnect,
> .pru_shutdown = pfkeyv2_shutdown,
> .pru_send = pfkeyv2_send,
> - .pru_abort = pfkeyv2_abort,
> .pru_sockaddr = pfkeyv2_sockaddr,
> .pru_peeraddr = pfkeyv2_peeraddr,
> };
> @@ -380,13 +378,6 @@ out:
> m_freem(m);
>
> return (error);
> -}
> -
> -int
> -pfkeyv2_abort(struct socket *so)
> -{
> - soisdisconnected(so);
> - return (0);
> }
>
> int
> Index: sys/net/rtsock.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtsock.c,v
> retrieving revision 1.356
> diff -u -p -r1.356 rtsock.c
> --- sys/net/rtsock.c 13 Sep 2022 09:05:47 -0000 1.356
> +++ sys/net/rtsock.c 17 Sep 2022 19:06:10 -0000
> @@ -118,7 +118,6 @@ int route_shutdown(struct socket *);
> void route_rcvd(struct socket *);
> int route_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int route_abort(struct socket *);
> int route_sockaddr(struct socket *, struct mbuf *);
> int route_peeraddr(struct socket *, struct mbuf *);
> void route_input(struct mbuf *m0, struct socket *, sa_family_t);
> @@ -345,13 +344,6 @@ out:
> }
>
> int
> -route_abort(struct socket *so)
> -{
> - soisdisconnected(so);
> - return (0);
> -}
> -
> -int
> route_sockaddr(struct socket *so, struct mbuf *nam)
> {
> return (EINVAL);
> @@ -2406,7 +2398,6 @@ const struct pr_usrreqs route_usrreqs =
> .pru_shutdown = route_shutdown,
> .pru_rcvd = route_rcvd,
> .pru_send = route_send,
> - .pru_abort = route_abort,
> .pru_sockaddr = route_sockaddr,
> .pru_peeraddr = route_peeraddr,
> };
> Index: sys/netinet/ip_divert.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.c,v
> retrieving revision 1.87
> diff -u -p -r1.87 ip_divert.c
> --- sys/netinet/ip_divert.c 5 Sep 2022 14:56:09 -0000 1.87
> +++ sys/netinet/ip_divert.c 17 Sep 2022 19:06:10 -0000
> @@ -70,7 +70,6 @@ const struct pr_usrreqs divert_usrreqs =
> .pru_bind = divert_bind,
> .pru_shutdown = divert_shutdown,
> .pru_send = divert_send,
> - .pru_abort = divert_abort,
> .pru_control = in_control,
> .pru_sockaddr = in_sockaddr,
> .pru_peeraddr = in_peeraddr,
> @@ -333,19 +332,6 @@ divert_send(struct socket *so, struct mb
>
> soassertlocked(so);
> return (divert_output(inp, m, addr, control));
> -}
> -
> -int
> -divert_abort(struct socket *so)
> -{
> - struct inpcb *inp = sotoinpcb(so);
> -
> - soassertlocked(so);
> -
> - soisdisconnected(so);
> - in_pcbdetach(inp);
> -
> - return (0);
> }
>
> int
> Index: sys/netinet/ip_divert.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_divert.h,v
> retrieving revision 1.22
> diff -u -p -r1.22 ip_divert.h
> --- sys/netinet/ip_divert.h 5 Sep 2022 14:56:09 -0000 1.22
> +++ sys/netinet/ip_divert.h 17 Sep 2022 19:06:10 -0000
> @@ -78,6 +78,5 @@ int divert_bind(struct socket *, struct
> int divert_shutdown(struct socket *);
> int divert_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int divert_abort(struct socket *);
> #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.84
> diff -u -p -r1.84 ip_gre.c
> --- sys/netinet/ip_gre.c 3 Sep 2022 22:43:38 -0000 1.84
> +++ sys/netinet/ip_gre.c 17 Sep 2022 19:06:10 -0000
> @@ -71,7 +71,6 @@ const struct pr_usrreqs gre_usrreqs = {
> .pru_disconnect = rip_disconnect,
> .pru_shutdown = rip_shutdown,
> .pru_send = gre_send,
> - .pru_abort = rip_abort,
> .pru_control = in_control,
> .pru_sockaddr = in_sockaddr,
> .pru_peeraddr = in_peeraddr,
> Index: sys/netinet/ip_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_var.h,v
> retrieving revision 1.105
> diff -u -p -r1.105 ip_var.h
> --- sys/netinet/ip_var.h 13 Sep 2022 09:05:02 -0000 1.105
> +++ sys/netinet/ip_var.h 17 Sep 2022 19:06:10 -0000
> @@ -266,7 +266,6 @@ int rip_disconnect(struct socket *);
> int rip_shutdown(struct socket *);
> int rip_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int rip_abort(struct socket *);
> #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.148
> diff -u -p -r1.148 raw_ip.c
> --- sys/netinet/raw_ip.c 13 Sep 2022 09:05:02 -0000 1.148
> +++ sys/netinet/raw_ip.c 17 Sep 2022 19:06:10 -0000
> @@ -113,7 +113,6 @@ const struct pr_usrreqs rip_usrreqs = {
> .pru_disconnect = rip_disconnect,
> .pru_shutdown = rip_shutdown,
> .pru_send = rip_send,
> - .pru_abort = rip_abort,
> .pru_control = in_control,
> .pru_sockaddr = in_sockaddr,
> .pru_peeraddr = in_peeraddr,
> @@ -643,21 +642,4 @@ out:
> m_freem(m);
>
> return (error);
> -}
> -
> -int
> -rip_abort(struct socket *so)
> -{
> - struct inpcb *inp = sotoinpcb(so);
> -
> - soassertlocked(so);
> -
> - soisdisconnected(so);
> -#ifdef MROUTING
> - if (so == ip_mrouter[inp->inp_rtableid])
> - ip_mrouter_done(so);
> -#endif
> - in_pcbdetach(inp);
> -
> - return (0);
> }
> Index: sys/netinet/tcp_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
> retrieving revision 1.208
> diff -u -p -r1.208 tcp_usrreq.c
> --- sys/netinet/tcp_usrreq.c 13 Sep 2022 09:05:47 -0000 1.208
> +++ sys/netinet/tcp_usrreq.c 17 Sep 2022 19:06:10 -0000
> @@ -865,18 +865,17 @@ out:
> /*
> * Abort the TCP.
> */
> -int
> +void
> tcp_abort(struct socket *so)
> {
> struct inpcb *inp;
> struct tcpcb *tp, *otp = NULL;
> - int error;
> short ostate;
>
> soassertlocked(so);
>
> - if ((error = tcp_sogetpcb(so, &inp, &tp)))
> - return (error);
> + if (tcp_sogetpcb(so, &inp, &tp))
> + return;
>
> if (so->so_options & SO_DEBUG) {
> otp = tp;
> @@ -887,7 +886,6 @@ tcp_abort(struct socket *so)
>
> if (otp)
> tcp_trace(TA_USER, ostate, tp, otp, NULL, PRU_ABORT, 0);
> - return (0);
> }
>
> int
> Index: sys/netinet/tcp_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_var.h,v
> retrieving revision 1.158
> diff -u -p -r1.158 tcp_var.h
> --- sys/netinet/tcp_var.h 13 Sep 2022 09:05:47 -0000 1.158
> +++ sys/netinet/tcp_var.h 17 Sep 2022 19:06:10 -0000
> @@ -728,7 +728,7 @@ int tcp_shutdown(struct socket *);
> void tcp_rcvd(struct socket *);
> int tcp_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int tcp_abort(struct socket *);
> +void tcp_abort(struct socket *);
> int tcp_sockaddr(struct socket *, struct mbuf *);
> int tcp_peeraddr(struct socket *, struct mbuf *);
> int tcp_sense(struct socket *, struct stat *);
> Index: sys/netinet/udp_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/udp_usrreq.c,v
> retrieving revision 1.302
> diff -u -p -r1.302 udp_usrreq.c
> --- sys/netinet/udp_usrreq.c 5 Sep 2022 14:56:09 -0000 1.302
> +++ sys/netinet/udp_usrreq.c 17 Sep 2022 19:06:10 -0000
> @@ -132,7 +132,6 @@ const struct pr_usrreqs udp_usrreqs = {
> .pru_disconnect = udp_disconnect,
> .pru_shutdown = udp_shutdown,
> .pru_send = udp_send,
> - .pru_abort = udp_abort,
> .pru_control = in_control,
> .pru_sockaddr = in_sockaddr,
> .pru_peeraddr = in_peeraddr,
> @@ -149,7 +148,6 @@ const struct pr_usrreqs udp6_usrreqs = {
> .pru_disconnect = udp_disconnect,
> .pru_shutdown = udp_shutdown,
> .pru_send = udp_send,
> - .pru_abort = udp_abort,
> .pru_control = in6_control,
> .pru_sockaddr = in6_sockaddr,
> .pru_peeraddr = in6_peeraddr,
> @@ -1258,19 +1256,6 @@ udp_send(struct socket *so, struct mbuf
> error = udp_output(inp, m, addr, control);
>
> return (error);
> -}
> -
> -int
> -udp_abort(struct socket *so)
> -{
> - struct inpcb *inp = sotoinpcb(so);
> -
> - soassertlocked(so);
> -
> - soisdisconnected(so);
> - in_pcbdetach(inp);
> -
> - return (0);
> }
>
> /*
> Index: sys/netinet/udp_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/udp_var.h,v
> retrieving revision 1.47
> diff -u -p -r1.47 udp_var.h
> --- sys/netinet/udp_var.h 5 Sep 2022 14:56:09 -0000 1.47
> +++ sys/netinet/udp_var.h 17 Sep 2022 19:06:10 -0000
> @@ -153,6 +153,5 @@ int udp_disconnect(struct socket *);
> int udp_shutdown(struct socket *);
> int udp_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int udp_abort(struct socket *);
> #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.86
> diff -u -p -r1.86 ip6_divert.c
> --- sys/netinet6/ip6_divert.c 5 Sep 2022 14:56:09 -0000 1.86
> +++ sys/netinet6/ip6_divert.c 17 Sep 2022 19:06:10 -0000
> @@ -71,7 +71,6 @@ const struct pr_usrreqs divert6_usrreqs
> .pru_bind = divert6_bind,
> .pru_shutdown = divert6_shutdown,
> .pru_send = divert6_send,
> - .pru_abort = divert6_abort,
> .pru_control = in6_control,
> .pru_sockaddr = in6_sockaddr,
> .pru_peeraddr = in6_peeraddr,
> @@ -341,18 +340,6 @@ divert6_send(struct socket *so, struct m
>
> soassertlocked(so);
> return (divert6_output(inp, m, addr, control));
> -}
> -
> -int
> -divert6_abort(struct socket *so)
> -{
> - struct inpcb *inp = sotoinpcb(so);
> -
> - soassertlocked(so);
> - soisdisconnected(so);
> - in_pcbdetach(inp);
> -
> - return (0);
> }
>
> int
> Index: sys/netinet6/ip6_divert.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_divert.h,v
> retrieving revision 1.20
> diff -u -p -r1.20 ip6_divert.h
> --- sys/netinet6/ip6_divert.h 5 Sep 2022 14:56:09 -0000 1.20
> +++ sys/netinet6/ip6_divert.h 17 Sep 2022 19:06:10 -0000
> @@ -78,7 +78,6 @@ int divert6_bind(struct socket *, struc
> int divert6_shutdown(struct socket *);
> int divert6_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int divert6_abort(struct socket *);
> #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.103
> diff -u -p -r1.103 ip6_var.h
> --- sys/netinet6/ip6_var.h 13 Sep 2022 09:05:02 -0000 1.103
> +++ sys/netinet6/ip6_var.h 17 Sep 2022 19:06:10 -0000
> @@ -361,7 +361,6 @@ int rip6_disconnect(struct socket *);
> int rip6_shutdown(struct socket *);
> int rip6_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int rip6_abort(struct socket *);
> 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.169
> diff -u -p -r1.169 raw_ip6.c
> --- sys/netinet6/raw_ip6.c 13 Sep 2022 09:05:02 -0000 1.169
> +++ sys/netinet6/raw_ip6.c 17 Sep 2022 19:06:10 -0000
> @@ -115,7 +115,6 @@ const struct pr_usrreqs rip6_usrreqs = {
> .pru_disconnect = rip6_disconnect,
> .pru_shutdown = rip6_shutdown,
> .pru_send = rip6_send,
> - .pru_abort = rip6_abort,
> .pru_control = in6_control,
> .pru_sockaddr = in6_sockaddr,
> .pru_peeraddr = in6_peeraddr,
> @@ -777,26 +776,6 @@ out:
> m_freem(m);
>
> return (error);
> -}
> -
> -int
> -rip6_abort(struct socket *so)
> -{
> - struct inpcb *in6p = sotoinpcb(so);
> -
> - soassertlocked(so);
> -
> - soisdisconnected(so);
> -#ifdef MROUTING
> - if (so == ip6_mrouter[in6p->inp_rtableid])
> - ip6_mrouter_done(so);
> -#endif
> - free(in6p->inp_icmp6filt, M_PCB, sizeof(struct icmp6_filter));
> - in6p->inp_icmp6filt = NULL;
> -
> - in_pcbdetach(in6p);
> -
> - return (0);
> }
>
> int
> Index: sys/sys/protosw.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/protosw.h,v
> retrieving revision 1.56
> diff -u -p -r1.56 protosw.h
> --- sys/sys/protosw.h 13 Sep 2022 09:05:47 -0000 1.56
> +++ sys/sys/protosw.h 17 Sep 2022 19:06:10 -0000
> @@ -75,7 +75,7 @@ struct pr_usrreqs {
> void (*pru_rcvd)(struct socket *);
> int (*pru_send)(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> - int (*pru_abort)(struct socket *);
> + void (*pru_abort)(struct socket *);
> int (*pru_control)(struct socket *, u_long, caddr_t,
> struct ifnet *);
> int (*pru_sense)(struct socket *, struct stat *);
> @@ -349,10 +349,10 @@ pru_send(struct socket *so, struct mbuf
> return (*so->so_proto->pr_usrreqs->pru_send)(so, top, addr, control);
> }
>
> -static inline int
> +static inline void
> pru_abort(struct socket *so)
> {
> - return (*so->so_proto->pr_usrreqs->pru_abort)(so);
> + (*so->so_proto->pr_usrreqs->pru_abort)(so);
> }
>
> static inline int
> Index: sys/sys/unpcb.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/unpcb.h,v
> retrieving revision 1.41
> diff -u -p -r1.41 unpcb.h
> --- sys/sys/unpcb.h 13 Sep 2022 09:05:47 -0000 1.41
> +++ sys/sys/unpcb.h 17 Sep 2022 19:06:10 -0000
> @@ -123,7 +123,7 @@ int uipc_shutdown(struct socket *);
> void uipc_rcvd(struct socket *);
> int uipc_send(struct socket *, struct mbuf *, struct mbuf *,
> struct mbuf *);
> -int uipc_abort(struct socket *);
> +void uipc_abort(struct socket *);
> int uipc_sense(struct socket *, struct stat *);
> int uipc_sockaddr(struct socket *, struct mbuf *);
> int uipc_peeraddr(struct socket *, struct mbuf *);
>