diff options
32 files changed, 114 insertions, 183 deletions
diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index be9084b..4afe8c5 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -1335,10 +1335,10 @@ pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, return EOPNOTSUPP; } -int +void pru_detach_notsupp(struct socket *so) { - return EOPNOTSUPP; + } int diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 35bb147..dadb06d 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -387,13 +387,18 @@ solisten_proto(so, backlog) /* * Attempt to free a socket. This should really be sotryfree(). * - * We free the socket if the protocol is no longer interested in the socket, - * there's no file descriptor reference, and the refcount is 0. While the - * calling macro sotryfree() tests the refcount, sofree() has to test it - * again as it's possible to race with an accept()ing thread if the socket is - * in an listen queue of a listen socket, as being in the listen queue - * doesn't elevate the reference count. sofree() acquires the accept mutex - * early for this test in order to avoid that race. + * sofree() will succeed if: + * + * - There are no outstanding file descriptor references or related consumers + * (so_count == 0). + * + * - The socket has been closed by user space, if ever open (SS_NOFDREF). + * + * - The protocol does not have an outstanding strong reference on the socket + * (SS_PROTOREF). + * + * Otherwise, it will quietly abort so that a future call to sofree(), when + * conditions are right, can succeed. */ void sofree(so) @@ -404,8 +409,8 @@ sofree(so) ACCEPT_LOCK_ASSERT(); SOCK_LOCK_ASSERT(so); - if (so->so_pcb != NULL || (so->so_state & SS_NOFDREF) == 0 || - so->so_count != 0 || (so->so_state & SS_PROTOREF)) { + if ((so->so_state & SS_NOFDREF) == 0 || so->so_count != 0 || + (so->so_state & SS_PROTOREF)) { SOCK_UNLOCK(so); ACCEPT_UNLOCK(); return; @@ -447,6 +452,7 @@ sofree(so) so->so_qstate & SQ_COMP, so->so_qstate & SQ_INCOMP)); SOCK_UNLOCK(so); ACCEPT_UNLOCK(); + SOCKBUF_LOCK(&so->so_snd); so->so_snd.sb_flags |= SB_NOINTR; (void)sblock(&so->so_snd, M_WAITOK); @@ -507,8 +513,6 @@ soclose(so) } ACCEPT_UNLOCK(); } - if (so->so_pcb == NULL) - goto discard; if (so->so_state & SS_ISCONNECTED) { if ((so->so_state & SS_ISDISCONNECTING) == 0) { error = sodisconnect(so); @@ -527,13 +531,9 @@ soclose(so) } } } + drop: - if (so->so_pcb != NULL) { - int error2 = (*so->so_proto->pr_usrreqs->pru_detach)(so); - if (error == 0) - error = error2; - } -discard: + (*so->so_proto->pr_usrreqs->pru_detach)(so); ACCEPT_LOCK(); SOCK_LOCK(so); KASSERT((so->so_state & SS_NOFDREF) == 0, ("soclose: NOFDREF")); @@ -1602,7 +1602,7 @@ dontblock: * Notify the protocol that some data has been * drained before blocking. */ - if (pr->pr_flags & PR_WANTRCVD && so->so_pcb != NULL) { + if (pr->pr_flags & PR_WANTRCVD) { SOCKBUF_UNLOCK(&so->so_rcv); (*pr->pr_usrreqs->pru_rcvd)(so, flags); SOCKBUF_LOCK(&so->so_rcv); @@ -1646,7 +1646,7 @@ dontblock: * ACK will be generated on return to TCP. */ if (!(flags & MSG_SOCALLBCK) && - (pr->pr_flags & PR_WANTRCVD) && so->so_pcb) { + (pr->pr_flags & PR_WANTRCVD)) { SOCKBUF_UNLOCK(&so->so_rcv); (*pr->pr_usrreqs->pru_rcvd)(so, flags); SOCKBUF_LOCK(&so->so_rcv); diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index be9084b..4afe8c5 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -1335,10 +1335,10 @@ pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, return EOPNOTSUPP; } -int +void pru_detach_notsupp(struct socket *so) { - return EOPNOTSUPP; + } int diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index f304311..956013a 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -228,7 +228,7 @@ uipc_connect2(struct socket *so1, struct socket *so2) /* control is EOPNOTSUPP */ -static int +static void uipc_detach(struct socket *so) { struct unpcb *unp; @@ -238,7 +238,6 @@ uipc_detach(struct socket *so) UNP_LOCK(); unp_detach(unp); UNP_UNLOCK_ASSERT(); - return (0); } static int diff --git a/sys/net/raw_cb.c b/sys/net/raw_cb.c index 31566d1..f45be72 100644 --- a/sys/net/raw_cb.c +++ b/sys/net/raw_cb.c @@ -98,10 +98,9 @@ raw_detach(rp) { struct socket *so = rp->rcb_socket; - ACCEPT_LOCK(); - SOCK_LOCK(so); - so->so_pcb = 0; - sotryfree(so); + KASSERT(so->so_pcb == rp, ("raw_detach: so_pcb != rp")); + + so->so_pcb = NULL; mtx_lock(&rawcb_mtx); LIST_REMOVE(rp, list); mtx_unlock(&rawcb_mtx); diff --git a/sys/net/raw_usrreq.c b/sys/net/raw_usrreq.c index c6f1a7d..300dd91 100644 --- a/sys/net/raw_usrreq.c +++ b/sys/net/raw_usrreq.c @@ -178,16 +178,15 @@ raw_uconnect(struct socket *so, struct sockaddr *nam, struct thread *td) /* pru_connect2 is EOPNOTSUPP */ /* pru_control is EOPNOTSUPP */ -static int +static void raw_udetach(struct socket *so) { struct rawcb *rp = sotorawcb(so); if (rp == 0) - return EINVAL; + return; raw_detach(rp); - return 0; } static int diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index ad64ef0..701662d 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -152,8 +152,8 @@ rts_attach(struct socket *so, int proto, struct thread *td) struct rawcb *rp; int s, error; - if (sotorawcb(so) != NULL) - return EISCONN; /* XXX panic? */ + KASSERT(so->so_pcb == NULL, ("rts_attach: so_pcb != NULL")); + /* XXX */ MALLOC(rp, struct rawcb *, sizeof *rp, M_PCB, M_WAITOK | M_ZERO); if (rp == NULL) @@ -214,32 +214,28 @@ rts_connect(struct socket *so, struct sockaddr *nam, struct thread *td) /* pru_connect2 is EOPNOTSUPP */ /* pru_control is EOPNOTSUPP */ -static int +static void rts_detach(struct socket *so) { struct rawcb *rp = sotorawcb(so); - int s, error; - s = splnet(); - if (rp != NULL) { - RTSOCK_LOCK(); - switch(rp->rcb_proto.sp_protocol) { - case AF_INET: - route_cb.ip_count--; - break; - case AF_INET6: - route_cb.ip6_count--; - break; - case AF_IPX: - route_cb.ipx_count--; - break; - } - route_cb.any_count--; - RTSOCK_UNLOCK(); + KASSERT(rp != NULL, ("rts_detach: rp == NULL")); + + RTSOCK_LOCK(); + switch(rp->rcb_proto.sp_protocol) { + case AF_INET: + route_cb.ip_count--; + break; + case AF_INET6: + route_cb.ip6_count--; + break; + case AF_IPX: + route_cb.ipx_count--; + break; } - error = raw_usrreqs.pru_detach(so); - splx(s); - return error; + route_cb.any_count--; + RTSOCK_UNLOCK(); + raw_usrreqs.pru_detach(so); } static int diff --git a/sys/netatalk/ddp_usrreq.c b/sys/netatalk/ddp_usrreq.c index a652ca2..00815c8 100644 --- a/sys/netatalk/ddp_usrreq.c +++ b/sys/netatalk/ddp_usrreq.c @@ -72,7 +72,7 @@ ddp_attach(struct socket *so, int proto, struct thread *td) return (error); } -static int +static void ddp_detach(struct socket *so) { struct ddpcb *ddp; @@ -84,7 +84,6 @@ ddp_detach(struct socket *so) DDP_LOCK(ddp); at_pcbdetach(so, ddp); DDP_LIST_XUNLOCK(); - return (0); } static int diff --git a/sys/netatm/atm_aal5.c b/sys/netatm/atm_aal5.c index 2a5e1e3..f21ad798 100644 --- a/sys/netatm/atm_aal5.c +++ b/sys/netatm/atm_aal5.c @@ -66,7 +66,7 @@ u_long atm_aal5_recvspace = 64 * 1024; /* XXX */ * Local functions */ static int atm_aal5_attach(struct socket *, int, struct thread *td); -static int atm_aal5_detach(struct socket *); +static void atm_aal5_detach(struct socket *); static int atm_aal5_bind(struct socket *, struct sockaddr *, struct thread *td); static int atm_aal5_listen(struct socket *, int backlog, @@ -290,15 +290,15 @@ out: * errno error processing request - reason indicated * */ -static int +static void atm_aal5_detach(so) struct socket *so; { - ATM_INTRO("detach"); + ATM_INTRO_NOERR("detach"); - err = atm_sock_detach(so); + atm_sock_detach(so); - ATM_OUTRO(); + ATM_OUTRO_NOERR(); } diff --git a/sys/netatm/atm_socket.c b/sys/netatm/atm_socket.c index 2cdab95..d2aecf1 100644 --- a/sys/netatm/atm_socket.c +++ b/sys/netatm/atm_socket.c @@ -146,12 +146,8 @@ atm_sock_attach(so, send, recv) * Arguments: * so pointer to socket * - * Returns: - * 0 detach successful - * errno detach failed - reason indicated - * */ -int +void atm_sock_detach(so) struct socket *so; { @@ -160,8 +156,7 @@ atm_sock_detach(so) /* * Make sure we're still attached */ - if (atp == NULL) - return (ENOTCONN); + KASSERT(atp != NULL, ("atm_sock_detach: atp == NULL")); /* * Terminate any (possibly pending) connection @@ -170,17 +165,9 @@ atm_sock_detach(so) (void) atm_sock_disconnect(so); } - /* - * Break links and free control blocks - */ - ACCEPT_LOCK(); - SOCK_LOCK(so); so->so_pcb = NULL; - sotryfree(so); uma_zfree(atm_pcb_zone, atp); - - return (0); } diff --git a/sys/netatm/atm_usrreq.c b/sys/netatm/atm_usrreq.c index db5a2ab..8facb95 100644 --- a/sys/netatm/atm_usrreq.c +++ b/sys/netatm/atm_usrreq.c @@ -70,7 +70,7 @@ struct pr_usrreqs atm_dgram_usrreqs = { .pru_attach = atm_dgram_attach, .pru_bind = atm_proto_notsupp2, .pru_control = atm_dgram_control, - .pru_detach = atm_proto_notsupp1, + .pru_detach = atm_proto_notsupp5, .pru_disconnect = atm_proto_notsupp1, .pru_peeraddr = atm_proto_notsupp3, .pru_send = atm_proto_notsupp4, diff --git a/sys/netatm/atm_var.h b/sys/netatm/atm_var.h index 23e43192..788acc9 100644 --- a/sys/netatm/atm_var.h +++ b/sys/netatm/atm_var.h @@ -151,7 +151,7 @@ int atm_create_stack(Atm_connvc *, struct stack_list *, /* atm_socket.c */ void atm_sock_init(void); int atm_sock_attach(struct socket *, u_long, u_long); -int atm_sock_detach(struct socket *); +void atm_sock_detach(struct socket *); int atm_sock_bind(struct socket *, struct sockaddr *); int atm_sock_listen(struct socket *, Atm_endpoint *, int); int atm_sock_connect(struct socket *, struct sockaddr *, diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h index cd7c849..0f28377 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h @@ -75,7 +75,7 @@ int ng_btsocket_hci_raw_connect (struct socket *, struct sockaddr *, int ng_btsocket_hci_raw_control (struct socket *, u_long, caddr_t, struct ifnet *, struct thread *); int ng_btsocket_hci_raw_ctloutput (struct socket *, struct sockopt *); -int ng_btsocket_hci_raw_detach (struct socket *); +void ng_btsocket_hci_raw_detach (struct socket *); int ng_btsocket_hci_raw_disconnect (struct socket *); int ng_btsocket_hci_raw_peeraddr (struct socket *, struct sockaddr **); int ng_btsocket_hci_raw_send (struct socket *, int, struct mbuf *, diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h index 2c6171a..a8523ab 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h @@ -100,7 +100,7 @@ int ng_btsocket_l2cap_raw_connect (struct socket *, struct sockaddr *, struct thread *); int ng_btsocket_l2cap_raw_control (struct socket *, u_long, caddr_t, struct ifnet *, struct thread *); -int ng_btsocket_l2cap_raw_detach (struct socket *); +void ng_btsocket_l2cap_raw_detach (struct socket *); int ng_btsocket_l2cap_raw_disconnect (struct socket *); int ng_btsocket_l2cap_raw_peeraddr (struct socket *, struct sockaddr **); int ng_btsocket_l2cap_raw_send (struct socket *, int, struct mbuf *, @@ -193,7 +193,7 @@ int ng_btsocket_l2cap_connect (struct socket *, struct sockaddr *, int ng_btsocket_l2cap_control (struct socket *, u_long, caddr_t, struct ifnet *, struct thread *); int ng_btsocket_l2cap_ctloutput (struct socket *, struct sockopt *); -int ng_btsocket_l2cap_detach (struct socket *); +void ng_btsocket_l2cap_detach (struct socket *); int ng_btsocket_l2cap_disconnect (struct socket *); int ng_btsocket_l2cap_listen (struct socket *, int, struct thread *); int ng_btsocket_l2cap_peeraddr (struct socket *, struct sockaddr **); diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h index 4b92cf8..1939964 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h @@ -324,7 +324,7 @@ int ng_btsocket_rfcomm_connect (struct socket *, struct sockaddr *, int ng_btsocket_rfcomm_control (struct socket *, u_long, caddr_t, struct ifnet *, struct thread *); int ng_btsocket_rfcomm_ctloutput (struct socket *, struct sockopt *); -int ng_btsocket_rfcomm_detach (struct socket *); +void ng_btsocket_rfcomm_detach (struct socket *); int ng_btsocket_rfcomm_disconnect (struct socket *); int ng_btsocket_rfcomm_listen (struct socket *, int, struct thread *); int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr **); diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c index d89bdaf..04bf426 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c @@ -1399,15 +1399,15 @@ ng_btsocket_hci_raw_ctloutput(struct socket *so, struct sockopt *sopt) * Detach raw HCI socket */ -int +void ng_btsocket_hci_raw_detach(struct socket *so) { ng_btsocket_hci_raw_pcb_p pcb = so2hci_raw_pcb(so); - if (pcb == NULL) - return (EINVAL); + KASSERT(pcb != NULL, ("ng_btsocket_hci_raw_detach: pcb == NULL")); + if (ng_btsocket_hci_raw_node == NULL) - return (EINVAL); + return; mtx_lock(&ng_btsocket_hci_raw_sockets_mtx); mtx_lock(&pcb->pcb_mtx); @@ -1422,12 +1422,7 @@ ng_btsocket_hci_raw_detach(struct socket *so) bzero(pcb, sizeof(*pcb)); FREE(pcb, M_NETGRAPH_BTSOCKET_HCI_RAW); - ACCEPT_LOCK(); - SOCK_LOCK(so); so->so_pcb = NULL; - sotryfree(so); - - return (0); } /* ng_btsocket_hci_raw_detach */ /* diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c index 09b5d76..21d3766 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c @@ -2316,15 +2316,15 @@ ng_btsocket_l2cap_ctloutput(struct socket *so, struct sockopt *sopt) * Detach and destroy socket */ -int +void ng_btsocket_l2cap_detach(struct socket *so) { ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so); - if (pcb == NULL) - return (EINVAL); + KASSERT(pcb != NULL, ("ng_btsocket_l2cap_detach: pcb == NULL")); + if (ng_btsocket_l2cap_node == NULL) - return (EINVAL); + return; mtx_lock(&ng_btsocket_l2cap_sockets_mtx); mtx_lock(&pcb->pcb_mtx); @@ -2350,12 +2350,7 @@ ng_btsocket_l2cap_detach(struct socket *so) FREE(pcb, M_NETGRAPH_BTSOCKET_L2CAP); soisdisconnected(so); - ACCEPT_LOCK(); - SOCK_LOCK(so); so->so_pcb = NULL; - sotryfree(so); - - return (0); } /* ng_btsocket_l2cap_detach */ /* diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c index 0fda1a1..85700f9 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c @@ -1094,15 +1094,14 @@ ng_btsocket_l2cap_raw_control(struct socket *so, u_long cmd, caddr_t data, * Detach and destroy socket */ -int +void ng_btsocket_l2cap_raw_detach(struct socket *so) { ng_btsocket_l2cap_raw_pcb_p pcb = so2l2cap_raw_pcb(so); - if (pcb == NULL) - return (EINVAL); + KASSERT(pcb != NULL, ("nt_btsocket_l2cap_raw_detach: pcb == NULL")); if (ng_btsocket_l2cap_raw_node == NULL) - return (EINVAL); + return; mtx_lock(&ng_btsocket_l2cap_raw_sockets_mtx); mtx_lock(&pcb->pcb_mtx); @@ -1117,12 +1116,7 @@ ng_btsocket_l2cap_raw_detach(struct socket *so) bzero(pcb, sizeof(*pcb)); FREE(pcb, M_NETGRAPH_BTSOCKET_L2CAP_RAW); - ACCEPT_LOCK(); - SOCK_LOCK(so); so->so_pcb = NULL; - sotryfree(so); - - return (0); } /* ng_btsocket_l2cap_raw_detach */ /* diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c index c921067..982705f 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c @@ -674,13 +674,12 @@ ng_btsocket_rfcomm_ctloutput(struct socket *so, struct sockopt *sopt) * Detach and destroy socket */ -int +void ng_btsocket_rfcomm_detach(struct socket *so) { ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so); - if (pcb == NULL) - return (EINVAL); + KASSERT(pcb != NULL, ("ng_btsocket_rfcomm_detach: pcb == NULL")); mtx_lock(&pcb->pcb_mtx); @@ -726,12 +725,7 @@ ng_btsocket_rfcomm_detach(struct socket *so) FREE(pcb, M_NETGRAPH_BTSOCKET_RFCOMM); soisdisconnected(so); - ACCEPT_LOCK(); - SOCK_LOCK(so); so->so_pcb = NULL; - sotryfree(so); - - return (0); } /* ng_btsocket_rfcomm_detach */ /* diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c index 5ad1bd6..5641effd 100644 --- a/sys/netgraph/ng_socket.c +++ b/sys/netgraph/ng_socket.c @@ -185,15 +185,13 @@ ngc_attach(struct socket *so, int proto, struct thread *td) return (ng_attach_cntl(so)); } -static int +static void ngc_detach(struct socket *so) { struct ngpcb *const pcbp = sotongpcb(so); - if (pcbp == NULL) - return (EINVAL); + KASSERT(pcbp != NULL, ("ngc_detach: pcbp == NULL")); ng_detach_common(pcbp, NG_CONTROL); - return (0); } static int @@ -395,15 +393,13 @@ ngd_attach(struct socket *so, int proto, struct thread *td) return (ng_attach_data(so)); } -static int +static void ngd_detach(struct socket *so) { struct ngpcb *const pcbp = sotongpcb(so); - if (pcbp == NULL) - return (EINVAL); + KASSERT(pcbp == NULL, ("ngd_detach: pcbp == NULL")); ng_detach_common(pcbp, NG_DATA); - return (0); } static int diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index b3b1a7c..bb31630 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -424,7 +424,7 @@ div_attach(struct socket *so, int proto, struct thread *td) return 0; } -static int +static void div_detach(struct socket *so) { struct inpcb *inp; @@ -433,12 +433,11 @@ div_detach(struct socket *so) inp = sotoinpcb(so); if (inp == 0) { INP_INFO_WUNLOCK(&divcbinfo); - return EINVAL; + return; } INP_LOCK(inp); in_pcbdetach(inp); INP_INFO_WUNLOCK(&divcbinfo); - return 0; } static int diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index b39e693..b6cf708 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -635,7 +635,7 @@ rip_pcbdetach(struct socket *so, struct inpcb *inp) in_pcbdetach(inp); } -static int +static void rip_detach(struct socket *so) { struct inpcb *inp; @@ -645,12 +645,11 @@ rip_detach(struct socket *so) if (inp == 0) { /* XXX counter, printf */ INP_INFO_WUNLOCK(&ripcbinfo); - return EINVAL; + return; } INP_LOCK(inp); rip_pcbdetach(so, inp); INP_INFO_WUNLOCK(&ripcbinfo); - return 0; } static void diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index ff4bd47..902cab6 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -148,10 +148,9 @@ out: * which may finish later; embryonic TCB's can just * be discarded here. */ -static int +static void tcp_usr_detach(struct socket *so) { - int error = 0; struct inpcb *inp; struct tcpcb *tp; TCPDEBUG0; @@ -160,7 +159,7 @@ tcp_usr_detach(struct socket *so) inp = sotoinpcb(so); if (inp == NULL) { INP_INFO_WUNLOCK(&tcbinfo); - return error; + return; } INP_LOCK(inp); tp = intotcpcb(inp); @@ -171,7 +170,6 @@ tcp_usr_detach(struct socket *so) if (tp) INP_UNLOCK(inp); INP_INFO_WUNLOCK(&tcbinfo); - return error; } #define INI_NOLOCK 0 diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 69ba6fe..23d4301 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -125,7 +125,7 @@ SYSCTL_STRUCT(_net_inet_udp, UDPCTL_STATS, stats, CTLFLAG_RW, static void udp_append(struct inpcb *last, struct ip *ip, struct mbuf *n, int off, struct sockaddr_in *udp_in); -static int udp_detach(struct socket *so); +static void udp_detach(struct socket *so); static int udp_output(struct inpcb *, struct mbuf *, struct sockaddr *, struct mbuf *, struct thread *); @@ -1027,7 +1027,7 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) return error; } -static int +static void udp_detach(struct socket *so) { struct inpcb *inp; @@ -1036,12 +1036,10 @@ udp_detach(struct socket *so) inp = sotoinpcb(so); if (inp == 0) { INP_INFO_WUNLOCK(&udbinfo); - return EINVAL; } INP_LOCK(inp); in_pcbdetach(inp); INP_INFO_WUNLOCK(&udbinfo); - return 0; } static int diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 8973fdc..5b6daac 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -591,7 +591,7 @@ rip6_attach(struct socket *so, int proto, struct thread *td) return 0; } -static int +static void rip6_detach(struct socket *so) { struct inpcb *inp; @@ -612,7 +612,6 @@ rip6_detach(struct socket *so) INP_LOCK(inp); in6_pcbdetach(inp); INP_INFO_WUNLOCK(&ripcbinfo); - return 0; } static void diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index f58019e..19b894f 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -117,7 +117,7 @@ */ extern struct protosw inetsw[]; -static int udp6_detach __P((struct socket *so)); +static void udp6_detach __P((struct socket *so)); int udp6_input(mp, offp, proto) @@ -665,7 +665,7 @@ out: return error; } -static int +static void udp6_detach(struct socket *so) { struct inpcb *inp; @@ -675,14 +675,13 @@ udp6_detach(struct socket *so) inp = sotoinpcb(so); if (inp == 0) { INP_INFO_WUNLOCK(&udbinfo); - return EINVAL; + return; } INP_LOCK(inp); s = splnet(); in6_pcbdetach(inp); splx(s); INP_INFO_WUNLOCK(&udbinfo); - return 0; } static int diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c index 4c84ed9c..9d87b1f 100644 --- a/sys/netipsec/keysock.c +++ b/sys/netipsec/keysock.c @@ -456,24 +456,20 @@ key_connect(struct socket *so, struct sockaddr *nam, struct thread *td) * key_detach() * derived from net/rtsock.c:rts_detach() */ -static int +static void key_detach(struct socket *so) { struct keycb *kp = (struct keycb *)sotorawcb(so); int s, error; - s = splnet(); - if (kp != 0) { - if (kp->kp_raw.rcb_proto.sp_protocol - == PF_KEY) /* XXX: AF_KEY */ - key_cb.key_count--; - key_cb.any_count--; + KASSERT(kp != NULL, ("key_detach: kp == NULL")); + if (kp->kp_raw.rcb_proto.sp_protocol + == PF_KEY) /* XXX: AF_KEY */ + key_cb.key_count--; + key_cb.any_count--; - key_freereg(so); - } - error = raw_usrreqs.pru_detach(so); - splx(s); - return error; + key_freereg(so); + raw_usrreqs.pru_detach(so); } /* diff --git a/sys/netipx/ipx_usrreq.c b/sys/netipx/ipx_usrreq.c index b98d5a1..2125d04 100644 --- a/sys/netipx/ipx_usrreq.c +++ b/sys/netipx/ipx_usrreq.c @@ -80,7 +80,7 @@ static int ipx_attach(struct socket *so, int proto, struct thread *td); static int ipx_bind(struct socket *so, struct sockaddr *nam, struct thread *td); static int ipx_connect(struct socket *so, struct sockaddr *nam, struct thread *td); -static int ipx_detach(struct socket *so); +static void ipx_detach(struct socket *so); static int ipx_disconnect(struct socket *so); static int ipx_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, @@ -505,7 +505,7 @@ out: return (error); } -static int +static void ipx_detach(so) struct socket *so; { @@ -517,7 +517,6 @@ ipx_detach(so) ipx_pcbdetach(ipxp); ipx_pcbfree(ipxp); IPX_LIST_UNLOCK(); - return (0); } static int diff --git a/sys/netipx/spx_usrreq.c b/sys/netipx/spx_usrreq.c index 637ea19..d9a5639 100644 --- a/sys/netipx/spx_usrreq.c +++ b/sys/netipx/spx_usrreq.c @@ -103,7 +103,7 @@ static int spx_attach(struct socket *so, int proto, struct thread *td); static int spx_bind(struct socket *so, struct sockaddr *nam, struct thread *td); static int spx_connect(struct socket *so, struct sockaddr *nam, struct thread *td); -static int spx_detach(struct socket *so); +static void spx_detach(struct socket *so); static void spx_pcbdetach(struct ipxpcb *ipxp); static int spx_usr_disconnect(struct socket *so); static int spx_listen(struct socket *so, int backlog, struct thread *td); @@ -1512,7 +1512,7 @@ spx_connect_end: return (error); } -static int +static void spx_detach(struct socket *so) { struct ipxpcb *ipxp; @@ -1534,7 +1534,6 @@ spx_detach(struct socket *so) ipx_pcbdetach(ipxp); ipx_pcbfree(ipxp); IPX_LIST_UNLOCK(); - return (0); } /* diff --git a/sys/netkey/keysock.c b/sys/netkey/keysock.c index 7b57488..7eb7e0b 100644 --- a/sys/netkey/keysock.c +++ b/sys/netkey/keysock.c @@ -366,24 +366,17 @@ key_connect(struct socket *so, struct sockaddr *nam, struct thread *p) * key_detach() * derived from net/rtsock.c:rts_detach() */ -static int +static void key_detach(struct socket *so) { struct keycb *kp = (struct keycb *)sotorawcb(so); - int s, error; - - s = splnet(); - if (kp != 0) { - if (kp->kp_raw.rcb_proto.sp_protocol - == PF_KEY) /* XXX: AF_KEY */ - key_cb.key_count--; - key_cb.any_count--; - key_freereg(so); - } - error = raw_usrreqs.pru_detach(so); - splx(s); - return error; + KASSERT(kp != NULL, ("key_detach: kp == NULL")); + if (kp->kp_raw.rcb_proto.sp_protocol == PF_KEY) /* XXX: AF_KEY */ + key_cb.key_count--; + key_cb.any_count--; + key_freereg(so); + raw_usrreqs.pru_detach(so); } /* diff --git a/sys/netnatm/natm.c b/sys/netnatm/natm.c index 6b3b202..8b87694 100644 --- a/sys/netnatm/natm.c +++ b/sys/netnatm/natm.c @@ -74,7 +74,7 @@ struct mtx natm_mtx; * user requests */ static int natm_usr_attach(struct socket *, int, d_thread_t *); -static int natm_usr_detach(struct socket *); +static void natm_usr_detach(struct socket *); static int natm_usr_connect(struct socket *, struct sockaddr *, d_thread_t *); static int natm_usr_disconnect(struct socket *); static int natm_usr_shutdown(struct socket *); @@ -111,7 +111,7 @@ out: return (error); } -static int +static void natm_usr_detach(struct socket *so) { struct natmpcb *npcb; @@ -122,7 +122,6 @@ natm_usr_detach(struct socket *so) npcb_free(npcb, NPCB_DESTROY); /* drain */ so->so_pcb = NULL; NATM_UNLOCK(); - return (0); } static int diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h index 5f39c69..760aa7e 100644 --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -206,7 +206,7 @@ struct pr_usrreqs { int (*pru_connect2)(struct socket *so1, struct socket *so2); int (*pru_control)(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td); - int (*pru_detach)(struct socket *so); + void (*pru_detach)(struct socket *so); int (*pru_disconnect)(struct socket *so); int (*pru_listen)(struct socket *so, int backlog, struct thread *td); @@ -256,7 +256,7 @@ int pru_connect_notsupp(struct socket *so, struct sockaddr *nam, int pru_connect2_notsupp(struct socket *so1, struct socket *so2); int pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td); -int pru_detach_notsupp(struct socket *so); +void pru_detach_notsupp(struct socket *so); int pru_disconnect_notsupp(struct socket *so); int pru_listen_notsupp(struct socket *so, int backlog, struct thread *td); int pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam); |