Module Name: src Committed By: rtr Date: Thu Jul 31 03:39:36 UTC 2014
Modified Files: src/sys/dev/bluetooth: bthidev.c btmagic.c btsco.c src/sys/kern: uipc_socket.c uipc_socket2.c uipc_usrreq.c src/sys/net: link_proto.c raw_usrreq.c rtsock.c src/sys/netatalk: ddp_usrreq.c src/sys/netbt: hci_socket.c l2cap.h l2cap_socket.c l2cap_upper.c rfcomm.h rfcomm_session.c rfcomm_socket.c rfcomm_upper.c sco.h sco_socket.c sco_upper.c src/sys/netinet: raw_ip.c tcp_usrreq.c tcp_var.h udp_usrreq.c src/sys/netinet6: raw_ip6.c udp6_usrreq.c src/sys/netipsec: keysock.c src/sys/netmpls: mpls_proto.c src/sys/netnatm: natm.c src/sys/rump/net/lib/libsockin: sockin.c src/sys/sys: protosw.h un.h Log Message: split PRU_DISCONNECT, PRU_SHUTDOWN and PRU_ABORT function out of pr_generic() usrreq switches and put into separate functions xxx_disconnect(struct socket *) xxx_shutdown(struct socket *) xxx_abort(struct socket *) - always KASSERT(solocked(so)) even if not implemented - replace calls to pr_generic() with req = PRU_{DISCONNECT,SHUTDOWN,ABORT} with calls to pr_{disconnect,shutdown,abort}() respectively rename existing internal functions used to implement above functionality to permit use of the names for xxx_{disconnect,shutdown,abort}(). - {l2cap,sco,rfcomm}_disconnect() -> {l2cap,sco,rfcomm}_disconnect_pcb() - {unp,rip,tcp}_disconnect() -> {unp,rip,tcp}_disconnect1() - unp_shutdown() -> unp_shutdown1() patch reviewed by rmind To generate a diff of this commit: cvs rdiff -u -r1.27 -r1.28 src/sys/dev/bluetooth/bthidev.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/bluetooth/btmagic.c cvs rdiff -u -r1.31 -r1.32 src/sys/dev/bluetooth/btsco.c cvs rdiff -u -r1.228 -r1.229 src/sys/kern/uipc_socket.c cvs rdiff -u -r1.119 -r1.120 src/sys/kern/uipc_socket2.c cvs rdiff -u -r1.162 -r1.163 src/sys/kern/uipc_usrreq.c cvs rdiff -u -r1.18 -r1.19 src/sys/net/link_proto.c cvs rdiff -u -r1.46 -r1.47 src/sys/net/raw_usrreq.c cvs rdiff -u -r1.158 -r1.159 src/sys/net/rtsock.c cvs rdiff -u -r1.56 -r1.57 src/sys/netatalk/ddp_usrreq.c cvs rdiff -u -r1.35 -r1.36 src/sys/netbt/hci_socket.c cvs rdiff -u -r1.16 -r1.17 src/sys/netbt/l2cap.h src/sys/netbt/l2cap_upper.c cvs rdiff -u -r1.26 -r1.27 src/sys/netbt/l2cap_socket.c cvs rdiff -u -r1.15 -r1.16 src/sys/netbt/rfcomm.h cvs rdiff -u -r1.21 -r1.22 src/sys/netbt/rfcomm_session.c cvs rdiff -u -r1.27 -r1.28 src/sys/netbt/rfcomm_socket.c cvs rdiff -u -r1.18 -r1.19 src/sys/netbt/rfcomm_upper.c cvs rdiff -u -r1.9 -r1.10 src/sys/netbt/sco.h cvs rdiff -u -r1.28 -r1.29 src/sys/netbt/sco_socket.c cvs rdiff -u -r1.14 -r1.15 src/sys/netbt/sco_upper.c cvs rdiff -u -r1.138 -r1.139 src/sys/netinet/raw_ip.c cvs rdiff -u -r1.193 -r1.194 src/sys/netinet/tcp_usrreq.c cvs rdiff -u -r1.174 -r1.175 src/sys/netinet/tcp_var.h cvs rdiff -u -r1.211 -r1.212 src/sys/netinet/udp_usrreq.c cvs rdiff -u -r1.131 -r1.132 src/sys/netinet6/raw_ip6.c cvs rdiff -u -r1.110 -r1.111 src/sys/netinet6/udp6_usrreq.c cvs rdiff -u -r1.38 -r1.39 src/sys/netipsec/keysock.c cvs rdiff -u -r1.18 -r1.19 src/sys/netmpls/mpls_proto.c cvs rdiff -u -r1.40 -r1.41 src/sys/netnatm/natm.c cvs rdiff -u -r1.53 -r1.54 src/sys/rump/net/lib/libsockin/sockin.c cvs rdiff -u -r1.55 -r1.56 src/sys/sys/protosw.h cvs rdiff -u -r1.50 -r1.51 src/sys/sys/un.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/bluetooth/bthidev.c diff -u src/sys/dev/bluetooth/bthidev.c:1.27 src/sys/dev/bluetooth/bthidev.c:1.28 --- src/sys/dev/bluetooth/bthidev.c:1.27 Wed Jul 30 10:04:25 2014 +++ src/sys/dev/bluetooth/bthidev.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: bthidev.c,v 1.27 2014/07/30 10:04:25 rtr Exp $ */ +/* $NetBSD: bthidev.c,v 1.28 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.27 2014/07/30 10:04:25 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.28 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/condvar.h> @@ -370,14 +370,14 @@ bthidev_detach(device_t self, int flags) /* close interrupt channel */ if (sc->sc_int != NULL) { - l2cap_disconnect(sc->sc_int, 0); + l2cap_disconnect_pcb(sc->sc_int, 0); l2cap_detach_pcb(&sc->sc_int); sc->sc_int = NULL; } /* close control channel */ if (sc->sc_ctl != NULL) { - l2cap_disconnect(sc->sc_ctl, 0); + l2cap_disconnect_pcb(sc->sc_ctl, 0); l2cap_detach_pcb(&sc->sc_ctl); sc->sc_ctl = NULL; } @@ -450,12 +450,12 @@ bthidev_timeout(void *arg) switch (sc->sc_state) { case BTHID_CLOSED: if (sc->sc_int != NULL) { - l2cap_disconnect(sc->sc_int, 0); + l2cap_disconnect_pcb(sc->sc_int, 0); break; } if (sc->sc_ctl != NULL) { - l2cap_disconnect(sc->sc_ctl, 0); + l2cap_disconnect_pcb(sc->sc_ctl, 0); break; } @@ -678,14 +678,14 @@ bthidev_process_one(struct bthidev_softc mutex_enter(bt_lock); /* close interrupt channel */ if (sc->sc_int != NULL) { - l2cap_disconnect(sc->sc_int, 0); + l2cap_disconnect_pcb(sc->sc_int, 0); l2cap_detach_pcb(&sc->sc_int); sc->sc_int = NULL; } /* close control channel */ if (sc->sc_ctl != NULL) { - l2cap_disconnect(sc->sc_ctl, 0); + l2cap_disconnect_pcb(sc->sc_ctl, 0); l2cap_detach_pcb(&sc->sc_ctl); sc->sc_ctl = NULL; } @@ -939,10 +939,10 @@ bthidev_linkmode(void *arg, int new) return; if (sc->sc_int != NULL) - l2cap_disconnect(sc->sc_int, 0); + l2cap_disconnect_pcb(sc->sc_int, 0); if (sc->sc_ctl != NULL) - l2cap_disconnect(sc->sc_ctl, 0); + l2cap_disconnect_pcb(sc->sc_ctl, 0); } /* Index: src/sys/dev/bluetooth/btmagic.c diff -u src/sys/dev/bluetooth/btmagic.c:1.9 src/sys/dev/bluetooth/btmagic.c:1.10 --- src/sys/dev/bluetooth/btmagic.c:1.9 Wed Jul 30 10:04:25 2014 +++ src/sys/dev/bluetooth/btmagic.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: btmagic.c,v 1.9 2014/07/30 10:04:25 rtr Exp $ */ +/* $NetBSD: btmagic.c,v 1.10 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -85,7 +85,7 @@ *****************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: btmagic.c,v 1.9 2014/07/30 10:04:25 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: btmagic.c,v 1.10 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -413,14 +413,14 @@ btmagic_detach(device_t self, int flags) /* close interrupt channel */ if (sc->sc_int != NULL) { - l2cap_disconnect(sc->sc_int, 0); + l2cap_disconnect_pcb(sc->sc_int, 0); l2cap_detach_pcb(&sc->sc_int); sc->sc_int = NULL; } /* close control channel */ if (sc->sc_ctl != NULL) { - l2cap_disconnect(sc->sc_ctl, 0); + l2cap_disconnect_pcb(sc->sc_ctl, 0); l2cap_detach_pcb(&sc->sc_ctl); sc->sc_ctl = NULL; } @@ -670,12 +670,12 @@ btmagic_timeout(void *arg) switch (sc->sc_state) { case BTMAGIC_CLOSED: if (sc->sc_int != NULL) { - l2cap_disconnect(sc->sc_int, 0); + l2cap_disconnect_pcb(sc->sc_int, 0); break; } if (sc->sc_ctl != NULL) { - l2cap_disconnect(sc->sc_ctl, 0); + l2cap_disconnect_pcb(sc->sc_ctl, 0); break; } break; @@ -1005,10 +1005,10 @@ btmagic_linkmode(void *arg, int new) return; if (sc->sc_int != NULL) - l2cap_disconnect(sc->sc_int, 0); + l2cap_disconnect_pcb(sc->sc_int, 0); if (sc->sc_ctl != NULL) - l2cap_disconnect(sc->sc_ctl, 0); + l2cap_disconnect_pcb(sc->sc_ctl, 0); } /* Index: src/sys/dev/bluetooth/btsco.c diff -u src/sys/dev/bluetooth/btsco.c:1.31 src/sys/dev/bluetooth/btsco.c:1.32 --- src/sys/dev/bluetooth/btsco.c:1.31 Wed Jul 30 10:04:25 2014 +++ src/sys/dev/bluetooth/btsco.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: btsco.c,v 1.31 2014/07/30 10:04:25 rtr Exp $ */ +/* $NetBSD: btsco.c,v 1.32 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.31 2014/07/30 10:04:25 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.32 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/audioio.h> @@ -359,7 +359,7 @@ btsco_detach(device_t self, int flags) mutex_enter(bt_lock); if (sc->sc_sco != NULL) { DPRINTF("sc_sco=%p\n", sc->sc_sco); - sco_disconnect(sc->sc_sco, 0); + sco_disconnect_pcb(sc->sc_sco, 0); sco_detach_pcb(&sc->sc_sco); sc->sc_sco = NULL; } @@ -672,7 +672,7 @@ btsco_close(void *hdl) KASSERT(mutex_owned(bt_lock)); if (sc->sc_sco != NULL) { - sco_disconnect(sc->sc_sco, 0); + sco_disconnect_pcb(sc->sc_sco, 0); sco_detach_pcb(&sc->sc_sco); } Index: src/sys/kern/uipc_socket.c diff -u src/sys/kern/uipc_socket.c:1.228 src/sys/kern/uipc_socket.c:1.229 --- src/sys/kern/uipc_socket.c:1.228 Wed Jul 30 10:04:26 2014 +++ src/sys/kern/uipc_socket.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.228 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.229 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.228 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.229 2014/07/31 03:39:35 rtr Exp $"); #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" @@ -853,8 +853,7 @@ sodisconnect(struct socket *so) } else if (so->so_state & SS_ISDISCONNECTING) { error = EALREADY; } else { - error = (*so->so_proto->pr_usrreqs->pr_generic)(so, - PRU_DISCONNECT, NULL, NULL, NULL, NULL); + error = (*so->so_proto->pr_usrreqs->pr_disconnect)(so); } return (error); } @@ -1611,8 +1610,7 @@ soshutdown(struct socket *so, int how) error = 0; } if (how == SHUT_WR || how == SHUT_RDWR) - error = (*pr->pr_usrreqs->pr_generic)(so, - PRU_SHUTDOWN, NULL, NULL, NULL, NULL); + error = (*pr->pr_usrreqs->pr_shutdown)(so); return error; } Index: src/sys/kern/uipc_socket2.c diff -u src/sys/kern/uipc_socket2.c:1.119 src/sys/kern/uipc_socket2.c:1.120 --- src/sys/kern/uipc_socket2.c:1.119 Mon May 19 02:51:24 2014 +++ src/sys/kern/uipc_socket2.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket2.c,v 1.119 2014/05/19 02:51:24 rmind Exp $ */ +/* $NetBSD: uipc_socket2.c,v 1.120 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.119 2014/05/19 02:51:24 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.120 2014/07/31 03:39:35 rtr Exp $"); #include "opt_mbuftrace.h" #include "opt_sb_max.h" @@ -437,7 +437,7 @@ soqremque(struct socket *so, int q) * socantsendmore: indicates that no more data will be sent on the * socket; it would normally be applied to a socket when the user * informs the system that no more data is to be sent, by the protocol - * code (in case PRU_SHUTDOWN). + * code (in case pr_shutdown()). */ void socantsendmore(struct socket *so) Index: src/sys/kern/uipc_usrreq.c diff -u src/sys/kern/uipc_usrreq.c:1.162 src/sys/kern/uipc_usrreq.c:1.163 --- src/sys/kern/uipc_usrreq.c:1.162 Wed Jul 30 10:04:26 2014 +++ src/sys/kern/uipc_usrreq.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_usrreq.c,v 1.162 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: uipc_usrreq.c,v 1.163 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc. @@ -96,7 +96,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.162 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.163 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -399,6 +399,9 @@ unp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -420,15 +423,6 @@ unp_usrreq(struct socket *so, int req, s error = unp_connect2(so, (struct socket *)nam, PRU_CONNECT2); break; - case PRU_DISCONNECT: - unp_disconnect(unp); - break; - - case PRU_SHUTDOWN: - socantsendmore(so); - unp_shutdown(unp); - break; - case PRU_RCVD: switch (so->so_type) { @@ -513,7 +507,7 @@ unp_usrreq(struct socket *so, int req, s KASSERT(l != NULL); error = unp_output(m, control, unp, l); if (nam) - unp_disconnect(unp); + unp_disconnect1(unp); break; } @@ -578,13 +572,6 @@ unp_usrreq(struct socket *so, int req, s } break; - case PRU_ABORT: - (void)unp_drop(unp, ECONNABORTED); - KASSERT(so->so_head == NULL); - KASSERT(so->so_pcb != NULL); - unp_detach(so); - break; - default: panic("piusrreq"); } @@ -757,7 +744,7 @@ unp_detach(struct socket *so) unp->unp_vnode = NULL; } if (unp->unp_conn) - unp_disconnect(unp); + unp_disconnect1(unp); while (unp->unp_refs) { KASSERT(solocked2(so, unp->unp_refs->unp_socket)); if (unp_drop(unp->unp_refs, ECONNRESET)) { @@ -1039,6 +1026,40 @@ unp_listen(struct socket *so) return 0; } +static int +unp_disconnect(struct socket *so) +{ + KASSERT(solocked(so)); + KASSERT(sotounpcb(so) != NULL); + + unp_disconnect1(sotounpcb(so)); + return 0; +} + +static int +unp_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + KASSERT(sotounpcb(so) != NULL); + + socantsendmore(so); + unp_shutdown1(sotounpcb(so)); + return 0; +} + +static int +unp_abort(struct socket *so) +{ + KASSERT(solocked(so)); + KASSERT(sotounpcb(so) != NULL); + + (void)unp_drop(sotounpcb(so), ECONNABORTED); + KASSERT(so->so_head == NULL); + KASSERT(so->so_pcb != NULL); + unp_detach(so); + return 0; +} + int unp_connect(struct socket *so, struct mbuf *nam) { @@ -1206,7 +1227,7 @@ unp_connect2(struct socket *so, struct s } void -unp_disconnect(struct unpcb *unp) +unp_disconnect1(struct unpcb *unp) { struct unpcb *unp2 = unp->unp_conn; struct socket *so; @@ -1224,7 +1245,7 @@ unp_disconnect(struct unpcb *unp) for (;;) { KASSERT(solocked2(so, unp2->unp_socket)); if (unp2 == 0) - panic("unp_disconnect"); + panic("unp_disconnect1"); if (unp2->unp_nextref == unp) break; unp2 = unp2->unp_nextref; @@ -1246,7 +1267,7 @@ unp_disconnect(struct unpcb *unp) } void -unp_shutdown(struct unpcb *unp) +unp_shutdown1(struct unpcb *unp) { struct socket *so; @@ -1269,7 +1290,7 @@ unp_drop(struct unpcb *unp, int errno) KASSERT(solocked(so)); so->so_error = errno; - unp_disconnect(unp); + unp_disconnect1(unp); if (so->so_head) { so->so_pcb = NULL; /* sofree() drops the socket lock */ @@ -1879,6 +1900,9 @@ const struct pr_usrreqs unp_usrreqs = { .pr_bind = unp_bind, .pr_listen = unp_listen, .pr_connect = unp_connect, + .pr_disconnect = unp_disconnect, + .pr_shutdown = unp_shutdown, + .pr_abort = unp_abort, .pr_ioctl = unp_ioctl, .pr_stat = unp_stat, .pr_peeraddr = unp_peeraddr, Index: src/sys/net/link_proto.c diff -u src/sys/net/link_proto.c:1.18 src/sys/net/link_proto.c:1.19 --- src/sys/net/link_proto.c:1.18 Thu Jul 24 15:12:03 2014 +++ src/sys/net/link_proto.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: link_proto.c,v 1.18 2014/07/24 15:12:03 rtr Exp $ */ +/* $NetBSD: link_proto.c,v 1.19 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.18 2014/07/24 15:12:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.19 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/socket.h> @@ -53,6 +53,9 @@ static void link_detach(struct socket *) static int link_accept(struct socket *, struct mbuf *); static int link_bind(struct socket *, struct mbuf *); static int link_listen(struct socket *); +static int link_disconnect(struct socket *); +static int link_shutdown(struct socket *); +static int link_abort(struct socket *); static int link_ioctl(struct socket *, u_long, void *, struct ifnet *); static int link_stat(struct socket *, struct stat *); static int link_peeraddr(struct socket *, struct mbuf *); @@ -73,6 +76,9 @@ static const struct pr_usrreqs link_usrr .pr_accept = link_accept, .pr_bind = link_bind, .pr_listen = link_listen, + .pr_disconnect = link_disconnect, + .pr_shutdown = link_shutdown, + .pr_abort = link_abort, .pr_ioctl = link_ioctl, .pr_stat = link_stat, .pr_peeraddr = link_peeraddr, @@ -269,6 +275,30 @@ link_listen(struct socket *so) } static int +link_disconnect(struct socket *so) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int +link_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int +link_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int link_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return link_control(so, cmd, nam, ifp); @@ -307,6 +337,9 @@ link_usrreq(struct socket *so, int req, KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); Index: src/sys/net/raw_usrreq.c diff -u src/sys/net/raw_usrreq.c:1.46 src/sys/net/raw_usrreq.c:1.47 --- src/sys/net/raw_usrreq.c:1.46 Wed Jul 30 10:04:26 2014 +++ src/sys/net/raw_usrreq.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_usrreq.c,v 1.46 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: raw_usrreq.c,v 1.47 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.46 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.47 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/mbuf.h> @@ -166,6 +166,9 @@ raw_usrreq(struct socket *so, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -193,18 +196,6 @@ raw_usrreq(struct socket *so, int req, s error = EOPNOTSUPP; break; - case PRU_DISCONNECT: - soisdisconnected(so); - raw_disconnect(rp); - break; - - /* - * Mark the connection as being incapable of further input. - */ - case PRU_SHUTDOWN: - socantsendmore(so); - break; - case PRU_RCVD: error = EOPNOTSUPP; break; Index: src/sys/net/rtsock.c diff -u src/sys/net/rtsock.c:1.158 src/sys/net/rtsock.c:1.159 --- src/sys/net/rtsock.c:1.158 Wed Jul 30 10:04:26 2014 +++ src/sys/net/rtsock.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rtsock.c,v 1.158 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: rtsock.c,v 1.159 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.158 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.159 2014/07/31 03:39:35 rtr Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -258,6 +258,49 @@ COMPATNAME(route_connect)(struct socket } static int +COMPATNAME(route_disconnect)(struct socket *so) +{ + struct rawcb *rp = sotorawcb(so); + int s; + + KASSERT(solocked(so)); + KASSERT(rp != NULL); + + s = splsoftnet(); + soisdisconnected(so); + raw_disconnect(rp); + splx(s); + + return 0; +} + +static int +COMPATNAME(route_shutdown)(struct socket *so) +{ + int s; + + KASSERT(solocked(so)); + + /* + * Mark the connection as being incapable of further input. + */ + s = splsoftnet(); + socantsendmore(so); + splx(s); + return 0; +} + +static int +COMPATNAME(route_abort)(struct socket *so) +{ + KASSERT(solocked(so)); + + panic("route_abort"); + + return EOPNOTSUPP; +} + +static int COMPATNAME(route_ioctl)(struct socket *so, u_long cmd, void *nam, struct ifnet * ifp) { @@ -336,6 +379,9 @@ COMPATNAME(route_usrreq)(struct socket * KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -1442,6 +1488,9 @@ static const struct pr_usrreqs route_usr .pr_bind = COMPATNAME(route_bind_wrapper), .pr_listen = COMPATNAME(route_listen_wrapper), .pr_connect = COMPATNAME(route_connect_wrapper), + .pr_disconnect = COMPATNAME(route_disconnect_wrapper), + .pr_shutdown = COMPATNAME(route_shutdown_wrapper), + .pr_abort = COMPATNAME(route_abort_wrapper), .pr_ioctl = COMPATNAME(route_ioctl_wrapper), .pr_stat = COMPATNAME(route_stat_wrapper), .pr_peeraddr = COMPATNAME(route_peeraddr_wrapper), Index: src/sys/netatalk/ddp_usrreq.c diff -u src/sys/netatalk/ddp_usrreq.c:1.56 src/sys/netatalk/ddp_usrreq.c:1.57 --- src/sys/netatalk/ddp_usrreq.c:1.56 Wed Jul 30 10:04:26 2014 +++ src/sys/netatalk/ddp_usrreq.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_usrreq.c,v 1.56 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: ddp_usrreq.c,v 1.57 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.56 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.57 2014/07/31 03:39:35 rtr Exp $"); #include "opt_mbuftrace.h" @@ -88,6 +88,9 @@ ddp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -112,19 +115,6 @@ ddp_usrreq(struct socket *so, int req, s goto release; } switch (req) { - case PRU_DISCONNECT: - if (ddp->ddp_fsat.sat_addr.s_node == ATADDR_ANYNODE) { - error = ENOTCONN; - break; - } - at_pcbdisconnect(ddp); - soisdisconnected(so); - break; - - case PRU_SHUTDOWN: - socantsendmore(so); - break; - case PRU_SEND:{ int s = 0; @@ -155,11 +145,6 @@ ddp_usrreq(struct socket *so, int req, s } break; - case PRU_ABORT: - soisdisconnected(so); - ddp_detach(so); - break; - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -503,6 +488,41 @@ ddp_connect(struct socket *so, struct mb } static int +ddp_disconnect(struct socket *so) +{ + struct ddpcb *ddp = sotoddpcb(so); + + KASSERT(solocked(so)); + KASSERT(ddp != NULL); + + if (ddp->ddp_fsat.sat_addr.s_node == ATADDR_ANYNODE) + return ENOTCONN; + + at_pcbdisconnect(ddp); + soisdisconnected(so); + return 0; +} + +static int +ddp_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + socantsendmore(so); + return 0; +} + +static int +ddp_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + soisdisconnected(so); + ddp_detach(so); + return 0; +} + +static int ddp_ioctl(struct socket *so, u_long cmd, void *addr, struct ifnet *ifp) { return at_control(cmd, addr, ifp); @@ -632,6 +652,9 @@ PR_WRAP_USRREQS(ddp) #define ddp_bind ddp_bind_wrapper #define ddp_listen ddp_listen_wrapper #define ddp_connect ddp_connect_wrapper +#define ddp_disconnect ddp_disconnect_wrapper +#define ddp_shutdown ddp_shutdown_wrapper +#define ddp_abort ddp_abort_wrapper #define ddp_ioctl ddp_ioctl_wrapper #define ddp_stat ddp_stat_wrapper #define ddp_peeraddr ddp_peeraddr_wrapper @@ -647,6 +670,9 @@ const struct pr_usrreqs ddp_usrreqs = { .pr_bind = ddp_bind, .pr_listen = ddp_listen, .pr_connect = ddp_connect, + .pr_disconnect = ddp_disconnect, + .pr_shutdown = ddp_shutdown, + .pr_abort = ddp_abort, .pr_ioctl = ddp_ioctl, .pr_stat = ddp_stat, .pr_peeraddr = ddp_peeraddr, Index: src/sys/netbt/hci_socket.c diff -u src/sys/netbt/hci_socket.c:1.35 src/sys/netbt/hci_socket.c:1.36 --- src/sys/netbt/hci_socket.c:1.35 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/hci_socket.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: hci_socket.c,v 1.35 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: hci_socket.c,v 1.36 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.35 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.36 2014/07/31 03:39:35 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -552,6 +552,45 @@ hci_connect(struct socket *so, struct mb } static int +hci_disconnect(struct socket *so) +{ + struct hci_pcb *pcb = so->so_pcb; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + + bdaddr_copy(&pcb->hp_raddr, BDADDR_ANY); + + /* XXX we cannot call soisdisconnected() here, as it sets + * SS_CANTRCVMORE and SS_CANTSENDMORE. The problem being, + * that soisconnected() does not clear these and if you + * try to reconnect this socket (which is permitted) you + * get a broken pipe when you try to write any data. + */ + so->so_state &= ~SS_ISCONNECTED; + return 0; +} + +static int +hci_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + socantsendmore(so); + return 0; +} + +static int +hci_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + soisdisconnected(so); + hci_detach(so); + return 0; +} + +static int hci_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { int err; @@ -653,6 +692,9 @@ hci_usrreq(struct socket *up, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -672,27 +714,6 @@ hci_usrreq(struct socket *up, int req, s } switch(req) { - case PRU_DISCONNECT: - bdaddr_copy(&pcb->hp_raddr, BDADDR_ANY); - - /* XXX we cannot call soisdisconnected() here, as it sets - * SS_CANTRCVMORE and SS_CANTSENDMORE. The problem being, - * that soisconnected() does not clear these and if you - * try to reconnect this socket (which is permitted) you - * get a broken pipe when you try to write any data. - */ - up->so_state &= ~SS_ISCONNECTED; - break; - - case PRU_ABORT: - soisdisconnected(up); - hci_detach(up); - return 0; - - case PRU_SHUTDOWN: - socantsendmore(up); - break; - case PRU_SEND: sa = NULL; if (nam) { @@ -951,6 +972,9 @@ PR_WRAP_USRREQS(hci) #define hci_bind hci_bind_wrapper #define hci_listen hci_listen_wrapper #define hci_connect hci_connect_wrapper +#define hci_disconnect hci_disconnect_wrapper +#define hci_shutdown hci_shutdown_wrapper +#define hci_abort hci_abort_wrapper #define hci_ioctl hci_ioctl_wrapper #define hci_stat hci_stat_wrapper #define hci_peeraddr hci_peeraddr_wrapper @@ -966,6 +990,9 @@ const struct pr_usrreqs hci_usrreqs = { .pr_bind = hci_bind, .pr_listen = hci_listen, .pr_connect = hci_connect, + .pr_disconnect = hci_disconnect, + .pr_shutdown = hci_shutdown, + .pr_abort = hci_abort, .pr_ioctl = hci_ioctl, .pr_stat = hci_stat, .pr_peeraddr = hci_peeraddr, Index: src/sys/netbt/l2cap.h diff -u src/sys/netbt/l2cap.h:1.16 src/sys/netbt/l2cap.h:1.17 --- src/sys/netbt/l2cap.h:1.16 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/l2cap.h Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap.h,v 1.16 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: l2cap.h,v 1.17 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -54,7 +54,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: l2cap.h,v 1.16 2014/07/30 10:04:26 rtr Exp $ + * $Id: l2cap.h,v 1.17 2014/07/31 03:39:35 rtr Exp $ * $FreeBSD: src/sys/netgraph/bluetooth/include/l2cap.h,v 1.4 2005/08/31 18:13:23 emax Exp $ */ @@ -466,7 +466,7 @@ int l2cap_bind_pcb(struct l2cap_channel int l2cap_sockaddr_pcb(struct l2cap_channel *, struct sockaddr_bt *); int l2cap_connect_pcb(struct l2cap_channel *, struct sockaddr_bt *); int l2cap_peeraddr_pcb(struct l2cap_channel *, struct sockaddr_bt *); -int l2cap_disconnect(struct l2cap_channel *, int); +int l2cap_disconnect_pcb(struct l2cap_channel *, int); void l2cap_detach_pcb(struct l2cap_channel **); int l2cap_listen_pcb(struct l2cap_channel *); int l2cap_send(struct l2cap_channel *, struct mbuf *); Index: src/sys/netbt/l2cap_upper.c diff -u src/sys/netbt/l2cap_upper.c:1.16 src/sys/netbt/l2cap_upper.c:1.17 --- src/sys/netbt/l2cap_upper.c:1.16 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/l2cap_upper.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap_upper.c,v 1.16 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: l2cap_upper.c,v 1.17 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.16 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.17 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -222,7 +222,7 @@ l2cap_peeraddr_pcb(struct l2cap_channel } /* - * l2cap_disconnect(l2cap_channel, linger) + * l2cap_disconnect_pcb(l2cap_channel, linger) * * Initiate L2CAP disconnection. This corresponds to * "Close Channel Request" in the L2CAP specification @@ -235,7 +235,7 @@ l2cap_peeraddr_pcb(struct l2cap_channel * the queue. */ int -l2cap_disconnect(struct l2cap_channel *chan, int linger) +l2cap_disconnect_pcb(struct l2cap_channel *chan, int linger) { int err = 0; Index: src/sys/netbt/l2cap_socket.c diff -u src/sys/netbt/l2cap_socket.c:1.26 src/sys/netbt/l2cap_socket.c:1.27 --- src/sys/netbt/l2cap_socket.c:1.26 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/l2cap_socket.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap_socket.c,v 1.26 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: l2cap_socket.c,v 1.27 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.26 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.27 2014/07/31 03:39:35 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -192,6 +192,45 @@ l2cap_connect(struct socket *so, struct } static int +l2cap_disconnect(struct socket *so) +{ + struct l2cap_channel *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + soisdisconnecting(so); + return l2cap_disconnect_pcb(pcb, so->so_linger); +} + +static int +l2cap_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + socantsendmore(so); + return 0; +} + +static int +l2cap_abort(struct socket *so) +{ + struct l2cap_channel *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + l2cap_disconnect_pcb(pcb, 0); + soisdisconnected(so); + l2cap_detach(so); + return 0; +} + +static int l2cap_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EPASSTHROUGH; @@ -286,6 +325,9 @@ l2cap_usrreq(struct socket *up, int req, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -304,20 +346,6 @@ l2cap_usrreq(struct socket *up, int req, } switch(req) { - case PRU_DISCONNECT: - soisdisconnecting(up); - return l2cap_disconnect(pcb, up->so_linger); - - case PRU_ABORT: - l2cap_disconnect(pcb, 0); - soisdisconnected(up); - l2cap_detach(up); - return 0; - - case PRU_SHUTDOWN: - socantsendmore(up); - break; - case PRU_SEND: KASSERT(m != NULL); if (m->m_pkthdr.len == 0) @@ -482,7 +510,7 @@ l2cap_linkmode(void *arg, int new) if (((mode & L2CAP_LM_AUTH) && !(new & L2CAP_LM_AUTH)) || ((mode & L2CAP_LM_ENCRYPT) && !(new & L2CAP_LM_ENCRYPT)) || ((mode & L2CAP_LM_SECURE) && !(new & L2CAP_LM_SECURE))) - l2cap_disconnect(so->so_pcb, 0); + l2cap_disconnect_pcb(so->so_pcb, 0); } static void @@ -511,6 +539,9 @@ PR_WRAP_USRREQS(l2cap) #define l2cap_bind l2cap_bind_wrapper #define l2cap_listen l2cap_listen_wrapper #define l2cap_connect l2cap_connect_wrapper +#define l2cap_disconnect l2cap_disconnect_wrapper +#define l2cap_shutdown l2cap_shutdown_wrapper +#define l2cap_abort l2cap_abort_wrapper #define l2cap_ioctl l2cap_ioctl_wrapper #define l2cap_stat l2cap_stat_wrapper #define l2cap_peeraddr l2cap_peeraddr_wrapper @@ -526,6 +557,9 @@ const struct pr_usrreqs l2cap_usrreqs = .pr_bind = l2cap_bind, .pr_listen = l2cap_listen, .pr_connect = l2cap_connect, + .pr_disconnect = l2cap_disconnect, + .pr_shutdown = l2cap_shutdown, + .pr_abort = l2cap_abort, .pr_ioctl = l2cap_ioctl, .pr_stat = l2cap_stat, .pr_peeraddr = l2cap_peeraddr, Index: src/sys/netbt/rfcomm.h diff -u src/sys/netbt/rfcomm.h:1.15 src/sys/netbt/rfcomm.h:1.16 --- src/sys/netbt/rfcomm.h:1.15 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/rfcomm.h Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm.h,v 1.15 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: rfcomm.h,v 1.16 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -55,7 +55,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: rfcomm.h,v 1.15 2014/07/30 10:04:26 rtr Exp $ + * $Id: rfcomm.h,v 1.16 2014/07/31 03:39:35 rtr Exp $ * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $ */ @@ -412,7 +412,7 @@ int rfcomm_bind_pcb(struct rfcomm_dlc *, int rfcomm_sockaddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *); int rfcomm_connect_pcb(struct rfcomm_dlc *, struct sockaddr_bt *); int rfcomm_peeraddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *); -int rfcomm_disconnect(struct rfcomm_dlc *, int); +int rfcomm_disconnect_pcb(struct rfcomm_dlc *, int); void rfcomm_detach_pcb(struct rfcomm_dlc **); int rfcomm_listen_pcb(struct rfcomm_dlc *); int rfcomm_send(struct rfcomm_dlc *, struct mbuf *); Index: src/sys/netbt/rfcomm_session.c diff -u src/sys/netbt/rfcomm_session.c:1.21 src/sys/netbt/rfcomm_session.c:1.22 --- src/sys/netbt/rfcomm_session.c:1.21 Thu Jul 24 15:12:03 2014 +++ src/sys/netbt/rfcomm_session.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_session.c,v 1.21 2014/07/24 15:12:03 rtr Exp $ */ +/* $NetBSD: rfcomm_session.c,v 1.22 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.21 2014/07/24 15:12:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.22 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -499,7 +499,7 @@ rfcomm_session_complete(void *arg, int c */ if (rs->rs_state == RFCOMM_SESSION_CLOSED) { if (SIMPLEQ_EMPTY(&rs->rs_credits)) - l2cap_disconnect(rs->rs_l2cap, 0); + l2cap_disconnect_pcb(rs->rs_l2cap, 0); } } @@ -853,7 +853,7 @@ rfcomm_session_recv_ua(struct rfcomm_ses case RFCOMM_SESSION_WAIT_DISCONNECT: /* We sent DISC */ callout_stop(&rs->rs_timeout); rs->rs_state = RFCOMM_SESSION_CLOSED; - l2cap_disconnect(rs->rs_l2cap, 0); + l2cap_disconnect_pcb(rs->rs_l2cap, 0); break; default: Index: src/sys/netbt/rfcomm_socket.c diff -u src/sys/netbt/rfcomm_socket.c:1.27 src/sys/netbt/rfcomm_socket.c:1.28 --- src/sys/netbt/rfcomm_socket.c:1.27 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/rfcomm_socket.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_socket.c,v 1.27 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: rfcomm_socket.c,v 1.28 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.27 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.28 2014/07/31 03:39:35 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -200,6 +200,45 @@ rfcomm_connect(struct socket *so, struct } static int +rfcomm_disconnect(struct socket *so) +{ + struct rfcomm_dlc *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + soisdisconnecting(so); + return rfcomm_disconnect_pcb(pcb, so->so_linger); +} + +static int +rfcomm_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + socantsendmore(so); + return 0; +} + +static int +rfcomm_abort(struct socket *so) +{ + struct rfcomm_dlc *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + rfcomm_disconnect_pcb(pcb, 0); + soisdisconnected(so); + rfcomm_detach(so); + return 0; +} + +static int rfcomm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EPASSTHROUGH; @@ -294,6 +333,9 @@ rfcomm_usrreq(struct socket *up, int req KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -311,20 +353,6 @@ rfcomm_usrreq(struct socket *up, int req } switch(req) { - case PRU_DISCONNECT: - soisdisconnecting(up); - return rfcomm_disconnect(pcb, up->so_linger); - - case PRU_ABORT: - rfcomm_disconnect(pcb, 0); - soisdisconnected(up); - rfcomm_detach(up); - return 0; - - case PRU_SHUTDOWN: - socantsendmore(up); - break; - case PRU_SEND: KASSERT(m != NULL); @@ -488,7 +516,7 @@ rfcomm_linkmode(void *arg, int new) if (((mode & RFCOMM_LM_AUTH) && !(new & RFCOMM_LM_AUTH)) || ((mode & RFCOMM_LM_ENCRYPT) && !(new & RFCOMM_LM_ENCRYPT)) || ((mode & RFCOMM_LM_SECURE) && !(new & RFCOMM_LM_SECURE))) - rfcomm_disconnect(so->so_pcb, 0); + rfcomm_disconnect_pcb(so->so_pcb, 0); } /* @@ -522,6 +550,9 @@ PR_WRAP_USRREQS(rfcomm) #define rfcomm_bind rfcomm_bind_wrapper #define rfcomm_listen rfcomm_listen_wrapper #define rfcomm_connect rfcomm_connect_wrapper +#define rfcomm_disconnect rfcomm_disconnect_wrapper +#define rfcomm_shutdown rfcomm_shutdown_wrapper +#define rfcomm_abort rfcomm_abort_wrapper #define rfcomm_ioctl rfcomm_ioctl_wrapper #define rfcomm_stat rfcomm_stat_wrapper #define rfcomm_peeraddr rfcomm_peeraddr_wrapper @@ -537,6 +568,9 @@ const struct pr_usrreqs rfcomm_usrreqs = .pr_bind = rfcomm_bind, .pr_listen = rfcomm_listen, .pr_connect = rfcomm_connect, + .pr_disconnect = rfcomm_disconnect, + .pr_shutdown = rfcomm_shutdown, + .pr_abort = rfcomm_abort, .pr_ioctl = rfcomm_ioctl, .pr_stat = rfcomm_stat, .pr_peeraddr = rfcomm_peeraddr, Index: src/sys/netbt/rfcomm_upper.c diff -u src/sys/netbt/rfcomm_upper.c:1.18 src/sys/netbt/rfcomm_upper.c:1.19 --- src/sys/netbt/rfcomm_upper.c:1.18 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/rfcomm_upper.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_upper.c,v 1.18 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: rfcomm_upper.c,v 1.19 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.18 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.19 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -213,12 +213,12 @@ rfcomm_peeraddr_pcb(struct rfcomm_dlc *d } /* - * rfcomm_disconnect(dlc, linger) + * rfcomm_disconnect_pcb(dlc, linger) * * disconnect RFCOMM DLC */ int -rfcomm_disconnect(struct rfcomm_dlc *dlc, int linger) +rfcomm_disconnect_pcb(struct rfcomm_dlc *dlc, int linger) { struct rfcomm_session *rs = dlc->rd_session; int err = 0; Index: src/sys/netbt/sco.h diff -u src/sys/netbt/sco.h:1.9 src/sys/netbt/sco.h:1.10 --- src/sys/netbt/sco.h:1.9 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/sco.h Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sco.h,v 1.9 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: sco.h,v 1.10 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -73,7 +73,7 @@ int sco_bind_pcb(struct sco_pcb *, struc int sco_sockaddr_pcb(struct sco_pcb *, struct sockaddr_bt *); int sco_connect_pcb(struct sco_pcb *, struct sockaddr_bt *); int sco_peeraddr_pcb(struct sco_pcb *, struct sockaddr_bt *); -int sco_disconnect(struct sco_pcb *, int); +int sco_disconnect_pcb(struct sco_pcb *, int); void sco_detach_pcb(struct sco_pcb **); int sco_listen_pcb(struct sco_pcb *); int sco_send(struct sco_pcb *, struct mbuf *); Index: src/sys/netbt/sco_socket.c diff -u src/sys/netbt/sco_socket.c:1.28 src/sys/netbt/sco_socket.c:1.29 --- src/sys/netbt/sco_socket.c:1.28 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/sco_socket.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sco_socket.c,v 1.28 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: sco_socket.c,v 1.29 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.28 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.29 2014/07/31 03:39:35 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -183,6 +183,45 @@ sco_connect(struct socket *so, struct mb } static int +sco_disconnect(struct socket *so) +{ + struct sco_pcb *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + soisdisconnecting(so); + return sco_disconnect_pcb(pcb, so->so_linger); +} + +static int +sco_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + socantsendmore(so); + return 0; +} + +static int +sco_abort(struct socket *so) +{ + struct sco_pcb *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + sco_disconnect_pcb(pcb, 0); + soisdisconnected(so); + sco_detach(so); + return 0; +} + +static int sco_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EOPNOTSUPP; @@ -273,6 +312,9 @@ sco_usrreq(struct socket *up, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -292,20 +334,6 @@ sco_usrreq(struct socket *up, int req, s } switch(req) { - case PRU_DISCONNECT: - soisdisconnecting(up); - return sco_disconnect(pcb, up->so_linger); - - case PRU_ABORT: - sco_disconnect(pcb, 0); - soisdisconnected(up); - sco_detach(up); - return 0; - - case PRU_SHUTDOWN: - socantsendmore(up); - break; - case PRU_SEND: KASSERT(m != NULL); if (m->m_pkthdr.len == 0) @@ -478,6 +506,9 @@ PR_WRAP_USRREQS(sco) #define sco_bind sco_bind_wrapper #define sco_listen sco_listen_wrapper #define sco_connect sco_connect_wrapper +#define sco_disconnect sco_disconnect_wrapper +#define sco_shutdown sco_shutdown_wrapper +#define sco_abort sco_abort_wrapper #define sco_ioctl sco_ioctl_wrapper #define sco_stat sco_stat_wrapper #define sco_peeraddr sco_peeraddr_wrapper @@ -493,6 +524,9 @@ const struct pr_usrreqs sco_usrreqs = { .pr_bind = sco_bind, .pr_listen = sco_listen, .pr_connect = sco_connect, + .pr_disconnect = sco_disconnect, + .pr_shutdown = sco_shutdown, + .pr_abort = sco_abort, .pr_ioctl = sco_ioctl, .pr_stat = sco_stat, .pr_peeraddr = sco_peeraddr, Index: src/sys/netbt/sco_upper.c diff -u src/sys/netbt/sco_upper.c:1.14 src/sys/netbt/sco_upper.c:1.15 --- src/sys/netbt/sco_upper.c:1.14 Wed Jul 30 10:04:26 2014 +++ src/sys/netbt/sco_upper.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sco_upper.c,v 1.14 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: sco_upper.c,v 1.15 2014/07/31 03:39:35 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.14 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.15 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -193,12 +193,12 @@ sco_peeraddr_pcb(struct sco_pcb *pcb, st } /* - * sco_disconnect(pcb, linger) + * sco_disconnect_pcb(pcb, linger) * * Initiate disconnection of connected SCO pcb */ int -sco_disconnect(struct sco_pcb *pcb, int linger) +sco_disconnect_pcb(struct sco_pcb *pcb, int linger) { hci_discon_cp cp; struct hci_link *sco; @@ -236,7 +236,7 @@ sco_detach_pcb(struct sco_pcb **handle) *handle = NULL; if (pcb->sp_link != NULL) { - sco_disconnect(pcb, 0); + sco_disconnect_pcb(pcb, 0); pcb->sp_link = NULL; } Index: src/sys/netinet/raw_ip.c diff -u src/sys/netinet/raw_ip.c:1.138 src/sys/netinet/raw_ip.c:1.139 --- src/sys/netinet/raw_ip.c:1.138 Thu Jul 31 02:21:51 2014 +++ src/sys/netinet/raw_ip.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.138 2014/07/31 02:21:51 ozaki-r Exp $ */ +/* $NetBSD: raw_ip.c,v 1.139 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.138 2014/07/31 02:21:51 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.139 2014/07/31 03:39:35 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -113,7 +113,7 @@ struct inpcbtable rawcbtable; int rip_pcbnotify(struct inpcbtable *, struct in_addr, struct in_addr, int, int, void (*)(struct inpcb *, int)); int rip_connect_pcb(struct inpcb *, struct mbuf *); -void rip_disconnect(struct inpcb *); +static void rip_disconnect1(struct inpcb *); static void sysctl_net_inet_raw_setup(struct sysctllog **); @@ -495,8 +495,8 @@ rip_connect_pcb(struct inpcb *inp, struc return (0); } -void -rip_disconnect(struct inpcb *inp) +static void +rip_disconnect1(struct inpcb *inp) { inp->inp_faddr = zeroin_addr; @@ -623,6 +623,40 @@ rip_connect(struct socket *so, struct mb return error; } +static int +rip_disconnect(struct socket *so) +{ + struct inpcb *inp = sotoinpcb(so); + + KASSERT(solocked(so)); + KASSERT(inp != NULL); + + soisdisconnected(so); + rip_disconnect1(inp); + return 0; +} + +static int +rip_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + /* + * Mark the connection as being incapable of further input. + */ + socantsendmore(so); + return 0; +} + +static int +rip_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + panic("rip_abort"); + + return EOPNOTSUPP; +} static int rip_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) @@ -693,6 +727,9 @@ rip_usrreq(struct socket *so, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -726,18 +763,6 @@ rip_usrreq(struct socket *so, int req, s error = EOPNOTSUPP; break; - case PRU_DISCONNECT: - soisdisconnected(so); - rip_disconnect(inp); - break; - - /* - * Mark the connection as being incapable of further input. - */ - case PRU_SHUTDOWN: - socantsendmore(so); - break; - case PRU_RCVD: error = EOPNOTSUPP; break; @@ -773,7 +798,7 @@ rip_usrreq(struct socket *so, int req, s } error = rip_output(m, inp); if (nam) - rip_disconnect(inp); + rip_disconnect1(inp); } break; @@ -792,6 +817,9 @@ PR_WRAP_USRREQS(rip) #define rip_bind rip_bind_wrapper #define rip_listen rip_listen_wrapper #define rip_connect rip_connect_wrapper +#define rip_disconnect rip_disconnect_wrapper +#define rip_shutdown rip_shutdown_wrapper +#define rip_abort rip_abort_wrapper #define rip_ioctl rip_ioctl_wrapper #define rip_stat rip_stat_wrapper #define rip_peeraddr rip_peeraddr_wrapper @@ -807,6 +835,9 @@ const struct pr_usrreqs rip_usrreqs = { .pr_bind = rip_bind, .pr_listen = rip_listen, .pr_connect = rip_connect, + .pr_disconnect = rip_disconnect, + .pr_shutdown = rip_shutdown, + .pr_abort = rip_abort, .pr_ioctl = rip_ioctl, .pr_stat = rip_stat, .pr_peeraddr = rip_peeraddr, Index: src/sys/netinet/tcp_usrreq.c diff -u src/sys/netinet/tcp_usrreq.c:1.193 src/sys/netinet/tcp_usrreq.c:1.194 --- src/sys/netinet/tcp_usrreq.c:1.193 Wed Jul 30 10:04:26 2014 +++ src/sys/netinet/tcp_usrreq.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.193 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.194 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.193 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.194 2014/07/31 03:39:35 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -234,6 +234,9 @@ tcp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -294,31 +297,6 @@ tcp_usrreq(struct socket *so, int req, s break; /* - * Initiate disconnect from peer. - * If connection never passed embryonic stage, just drop; - * else if don't need to let data drain, then can just drop anyways, - * else have to begin TCP shutdown process: mark socket disconnecting, - * drain unread data, state switch to reflect user close, and - * send segment (e.g. FIN) to peer. Socket will be really disconnected - * when peer sends FIN and acks ours. - * - * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB. - */ - case PRU_DISCONNECT: - tp = tcp_disconnect(tp); - break; - - /* - * Mark the connection as being incapable of further output. - */ - case PRU_SHUTDOWN: - socantsendmore(so); - tp = tcp_usrclosed(tp); - if (tp) - error = tcp_output(tp); - break; - - /* * After a receive, possibly send window update to peer. */ case PRU_RCVD: @@ -348,13 +326,6 @@ tcp_usrreq(struct socket *so, int req, s error = tcp_output(tp); break; - /* - * Abort the TCP. - */ - case PRU_ABORT: - tp = tcp_drop(tp, ECONNABORTED); - break; - default: panic("tcp_usrreq"); } @@ -722,7 +693,7 @@ tcp_detach(struct socket *so) return; s = splsoftnet(); - (void)tcp_disconnect(tp); + (void)tcp_disconnect1(tp); splx(s); } @@ -944,6 +915,100 @@ release: } static int +tcp_disconnect(struct socket *so) +{ + struct inpcb *inp = NULL; + struct in6pcb *in6p = NULL; + struct tcpcb *tp = NULL; + int s; + int error = 0; + int ostate = 0; + + KASSERT(solocked(so)); + + if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) + return error; + + ostate = tcp_debug_capture(tp, PRU_DISCONNECT); + + /* + * Initiate disconnect from peer. + * If connection never passed embryonic stage, just drop; + * else if don't need to let data drain, then can just drop anyways, + * else have to begin TCP shutdown process: mark socket disconnecting, + * drain unread data, state switch to reflect user close, and + * send segment (e.g. FIN) to peer. Socket will be really disconnected + * when peer sends FIN and acks ours. + * + * SHOULD IMPLEMENT LATER PRU_CONNECT VIA REALLOC TCPCB. + */ + s = splsoftnet(); + tp = tcp_disconnect1(tp); + tcp_debug_trace(so, tp, ostate, PRU_DISCONNECT); + splx(s); + + return error; +} + +static int +tcp_shutdown(struct socket *so) +{ + struct inpcb *inp = NULL; + struct in6pcb *in6p = NULL; + struct tcpcb *tp = NULL; + int s; + int error = 0; + int ostate = 0; + + KASSERT(solocked(so)); + + if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) + return error; + + ostate = tcp_debug_capture(tp, PRU_SHUTDOWN); + /* + * Mark the connection as being incapable of further output. + */ + s = splsoftnet(); + socantsendmore(so); + tp = tcp_usrclosed(tp); + if (tp) + error = tcp_output(tp); + tcp_debug_trace(so, tp, ostate, PRU_SHUTDOWN); + splx(s); + + return error; +} + +static int +tcp_abort(struct socket *so) +{ + struct inpcb *inp = NULL; + struct in6pcb *in6p = NULL; + struct tcpcb *tp = NULL; + int s; + int error = 0; + int ostate = 0; + + KASSERT(solocked(so)); + + if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) + return error; + + ostate = tcp_debug_capture(tp, PRU_ABORT); + + /* + * Abort the TCP. + */ + s = splsoftnet(); + tp = tcp_drop(tp, ECONNABORTED); + tcp_debug_trace(so, tp, ostate, PRU_ABORT); + splx(s); + + return error; +} + +static int tcp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { switch (so->so_proto->pr_domain->dom_family) { @@ -1104,7 +1169,7 @@ tcp_sendoob(struct socket *so, struct mb * send segment to peer (with FIN). */ struct tcpcb * -tcp_disconnect(struct tcpcb *tp) +tcp_disconnect1(struct tcpcb *tp) { struct socket *so; @@ -2335,6 +2400,9 @@ PR_WRAP_USRREQS(tcp) #define tcp_bind tcp_bind_wrapper #define tcp_listen tcp_listen_wrapper #define tcp_connect tcp_connect_wrapper +#define tcp_disconnect tcp_disconnect_wrapper +#define tcp_shutdown tcp_shutdown_wrapper +#define tcp_abort tcp_abort_wrapper #define tcp_ioctl tcp_ioctl_wrapper #define tcp_stat tcp_stat_wrapper #define tcp_peeraddr tcp_peeraddr_wrapper @@ -2350,6 +2418,9 @@ const struct pr_usrreqs tcp_usrreqs = { .pr_bind = tcp_bind, .pr_listen = tcp_listen, .pr_connect = tcp_connect, + .pr_disconnect = tcp_disconnect, + .pr_shutdown = tcp_shutdown, + .pr_abort = tcp_abort, .pr_ioctl = tcp_ioctl, .pr_stat = tcp_stat, .pr_peeraddr = tcp_peeraddr, Index: src/sys/netinet/tcp_var.h diff -u src/sys/netinet/tcp_var.h:1.174 src/sys/netinet/tcp_var.h:1.175 --- src/sys/netinet/tcp_var.h:1.174 Mon May 19 02:51:25 2014 +++ src/sys/netinet/tcp_var.h Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_var.h,v 1.174 2014/05/19 02:51:25 rmind Exp $ */ +/* $NetBSD: tcp_var.h,v 1.175 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -901,7 +901,7 @@ void *tcp6_ctlinput(int, const struct s void *tcp_ctlinput(int, const struct sockaddr *, void *); int tcp_ctloutput(int, struct socket *, struct sockopt *); struct tcpcb * - tcp_disconnect(struct tcpcb *); + tcp_disconnect1(struct tcpcb *); struct tcpcb * tcp_drop(struct tcpcb *, int); #ifdef TCP_SIGNATURE Index: src/sys/netinet/udp_usrreq.c diff -u src/sys/netinet/udp_usrreq.c:1.211 src/sys/netinet/udp_usrreq.c:1.212 --- src/sys/netinet/udp_usrreq.c:1.211 Wed Jul 30 10:04:26 2014 +++ src/sys/netinet/udp_usrreq.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.211 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.212 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.211 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.212 2014/07/31 03:39:35 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -950,6 +950,50 @@ udp_connect(struct socket *so, struct mb } static int +udp_disconnect(struct socket *so) +{ + struct inpcb *inp = sotoinpcb(so); + int s; + + KASSERT(solocked(so)); + KASSERT(inp != NULL); + + s = splsoftnet(); + /*soisdisconnected(so);*/ + so->so_state &= ~SS_ISCONNECTED; /* XXX */ + in_pcbdisconnect(inp); + inp->inp_laddr = zeroin_addr; /* XXX */ + in_pcbstate(inp, INP_BOUND); /* XXX */ + splx(s); + + return 0; +} + +static int +udp_shutdown(struct socket *so) +{ + int s; + + KASSERT(solocked(so)); + + s = splsoftnet(); + socantsendmore(so); + splx(s); + + return 0; +} + +static int +udp_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + panic("udp_abort"); + + return EOPNOTSUPP; +} + +static int udp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return in_control(so, cmd, nam, ifp); @@ -1018,6 +1062,9 @@ udp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -1054,18 +1101,6 @@ udp_usrreq(struct socket *so, int req, s error = EOPNOTSUPP; break; - case PRU_DISCONNECT: - /*soisdisconnected(so);*/ - so->so_state &= ~SS_ISCONNECTED; /* XXX */ - in_pcbdisconnect(inp); - inp->inp_laddr = zeroin_addr; /* XXX */ - in_pcbstate(inp, INP_BOUND); /* XXX */ - break; - - case PRU_SHUTDOWN: - socantsendmore(so); - break; - case PRU_RCVD: error = EOPNOTSUPP; break; @@ -1341,6 +1376,9 @@ PR_WRAP_USRREQS(udp) #define udp_bind udp_bind_wrapper #define udp_listen udp_listen_wrapper #define udp_connect udp_connect_wrapper +#define udp_disconnect udp_disconnect_wrapper +#define udp_shutdown udp_shutdown_wrapper +#define udp_abort udp_abort_wrapper #define udp_ioctl udp_ioctl_wrapper #define udp_stat udp_stat_wrapper #define udp_peeraddr udp_peeraddr_wrapper @@ -1356,6 +1394,9 @@ const struct pr_usrreqs udp_usrreqs = { .pr_bind = udp_bind, .pr_listen = udp_listen, .pr_connect = udp_connect, + .pr_disconnect = udp_disconnect, + .pr_shutdown = udp_shutdown, + .pr_abort = udp_abort, .pr_ioctl = udp_ioctl, .pr_stat = udp_stat, .pr_peeraddr = udp_peeraddr, Index: src/sys/netinet6/raw_ip6.c diff -u src/sys/netinet6/raw_ip6.c:1.131 src/sys/netinet6/raw_ip6.c:1.132 --- src/sys/netinet6/raw_ip6.c:1.131 Thu Jul 31 02:21:51 2014 +++ src/sys/netinet6/raw_ip6.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip6.c,v 1.131 2014/07/31 02:21:51 ozaki-r Exp $ */ +/* $NetBSD: raw_ip6.c,v 1.132 2014/07/31 03:39:35 rtr Exp $ */ /* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.131 2014/07/31 02:21:51 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.132 2014/07/31 03:39:35 rtr Exp $"); #include "opt_ipsec.h" @@ -755,6 +755,44 @@ rip6_connect(struct socket *so, struct m } static int +rip6_disconnect(struct socket *so) +{ + struct in6pcb *in6p = sotoin6pcb(so); + + KASSERT(solocked(so)); + KASSERT(in6p != NULL); + + if ((so->so_state & SS_ISCONNECTED) == 0) + return ENOTCONN; + + in6p->in6p_faddr = in6addr_any; + so->so_state &= ~SS_ISCONNECTED; /* XXX */ + return 0; +} + +static int +rip6_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + /* + * Mark the connection as being incapable of futther input. + */ + socantsendmore(so); + return 0; +} + +static int +rip6_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + soisdisconnected(so); + rip6_detach(so); + return 0; +} + +static int rip6_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return in6_control(so, cmd, nam, ifp); @@ -821,6 +859,9 @@ rip6_usrreq(struct socket *so, int req, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -838,31 +879,11 @@ rip6_usrreq(struct socket *so, int req, } switch (req) { - case PRU_DISCONNECT: - if ((so->so_state & SS_ISCONNECTED) == 0) { - error = ENOTCONN; - break; - } - in6p->in6p_faddr = in6addr_any; - so->so_state &= ~SS_ISCONNECTED; /* XXX */ - break; - - case PRU_ABORT: - soisdisconnected(so); - rip6_detach(so); - break; - case PRU_CONNECT2: error = EOPNOTSUPP; break; /* - * Mark the connection as being incapable of futther input. - */ - case PRU_SHUTDOWN: - socantsendmore(so); - break; - /* * Ship a packet out. The appropriate raw output * routine handles any messaging necessary. */ @@ -964,6 +985,9 @@ PR_WRAP_USRREQS(rip6) #define rip6_bind rip6_bind_wrapper #define rip6_listen rip6_listen_wrapper #define rip6_connect rip6_connect_wrapper +#define rip6_disconnect rip6_disconnect_wrapper +#define rip6_shutdown rip6_shutdown_wrapper +#define rip6_abort rip6_abort_wrapper #define rip6_ioctl rip6_ioctl_wrapper #define rip6_stat rip6_stat_wrapper #define rip6_peeraddr rip6_peeraddr_wrapper @@ -979,6 +1003,9 @@ const struct pr_usrreqs rip6_usrreqs = { .pr_bind = rip6_bind, .pr_listen = rip6_listen, .pr_connect = rip6_connect, + .pr_disconnect = rip6_disconnect, + .pr_shutdown = rip6_shutdown, + .pr_abort = rip6_abort, .pr_ioctl = rip6_ioctl, .pr_stat = rip6_stat, .pr_peeraddr = rip6_peeraddr, Index: src/sys/netinet6/udp6_usrreq.c diff -u src/sys/netinet6/udp6_usrreq.c:1.110 src/sys/netinet6/udp6_usrreq.c:1.111 --- src/sys/netinet6/udp6_usrreq.c:1.110 Wed Jul 30 10:04:26 2014 +++ src/sys/netinet6/udp6_usrreq.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: udp6_usrreq.c,v 1.110 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: udp6_usrreq.c,v 1.111 2014/07/31 03:39:35 rtr Exp $ */ /* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.110 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.111 2014/07/31 03:39:35 rtr Exp $"); #include "opt_inet.h" #include "opt_inet_csum.h" @@ -731,6 +731,56 @@ udp6_connect(struct socket *so, struct m } static int +udp6_disconnect(struct socket *so) +{ + struct in6pcb *in6p = sotoin6pcb(so); + int s; + + KASSERT(solocked(so)); + KASSERT(in6p != NULL); + + if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) + return ENOTCONN; + + s = splsoftnet(); + in6_pcbdisconnect(in6p); + memset((void *)&in6p->in6p_laddr, 0, sizeof(in6p->in6p_laddr)); + splx(s); + + so->so_state &= ~SS_ISCONNECTED; /* XXX */ + in6_pcbstate(in6p, IN6P_BOUND); /* XXX */ + return 0; +} + +static int +udp6_shutdown(struct socket *so) +{ + int s; + + s = splsoftnet(); + socantsendmore(so); + splx(s); + + return 0; +} + +static int +udp6_abort(struct socket *so) +{ + int s; + + KASSERT(solocked(so)); + KASSERT(sotoin6pcb(so) != NULL); + + s = splsoftnet(); + soisdisconnected(so); + in6_pcbdetach(sotoin6pcb(so)); + splx(s); + + return 0; +} + +static int udp6_ioctl(struct socket *so, u_long cmd, void *addr6, struct ifnet *ifp) { /* @@ -811,6 +861,9 @@ udp6_usrreq(struct socket *so, int req, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -832,35 +885,12 @@ udp6_usrreq(struct socket *so, int req, } switch (req) { - - case PRU_DISCONNECT: - if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) { - error = ENOTCONN; - break; - } - s = splsoftnet(); - in6_pcbdisconnect(in6p); - memset((void *)&in6p->in6p_laddr, 0, sizeof(in6p->in6p_laddr)); - splx(s); - so->so_state &= ~SS_ISCONNECTED; /* XXX */ - in6_pcbstate(in6p, IN6P_BOUND); /* XXX */ - break; - - case PRU_SHUTDOWN: - socantsendmore(so); - break; - case PRU_SEND: s = splsoftnet(); error = udp6_output(in6p, m, addr6, control, l); splx(s); return error; - case PRU_ABORT: - soisdisconnected(so); - in6_pcbdetach(in6p); - break; - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -959,6 +989,9 @@ PR_WRAP_USRREQS(udp6) #define udp6_bind udp6_bind_wrapper #define udp6_listen udp6_listen_wrapper #define udp6_connect udp6_connect_wrapper +#define udp6_disconnect udp6_disconnect_wrapper +#define udp6_shutdown udp6_shutdown_wrapper +#define udp6_abort udp6_abort_wrapper #define udp6_ioctl udp6_ioctl_wrapper #define udp6_stat udp6_stat_wrapper #define udp6_peeraddr udp6_peeraddr_wrapper @@ -974,6 +1007,9 @@ const struct pr_usrreqs udp6_usrreqs = { .pr_bind = udp6_bind, .pr_listen = udp6_listen, .pr_connect = udp6_connect, + .pr_disconnect = udp6_disconnect, + .pr_shutdown = udp6_shutdown, + .pr_abort = udp6_abort, .pr_ioctl = udp6_ioctl, .pr_stat = udp6_stat, .pr_peeraddr = udp6_peeraddr, Index: src/sys/netipsec/keysock.c diff -u src/sys/netipsec/keysock.c:1.38 src/sys/netipsec/keysock.c:1.39 --- src/sys/netipsec/keysock.c:1.38 Wed Jul 30 10:04:26 2014 +++ src/sys/netipsec/keysock.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: keysock.c,v 1.38 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: keysock.c,v 1.39 2014/07/31 03:39:35 rtr Exp $ */ /* $FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.38 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.39 2014/07/31 03:39:35 rtr Exp $"); #include "opt_ipsec.h" @@ -490,7 +490,7 @@ key_accept(struct socket *so, struct mbu KASSERT(solocked(so)); panic("key_accept"); - /* NOT REACHED */ + return EOPNOTSUPP; } @@ -519,6 +519,50 @@ key_connect(struct socket *so, struct mb } static int +key_disconnect(struct socket *so) +{ + struct rawcb *rp = sotorawcb(so); + int s; + + KASSERT(solocked(so)); + KASSERT(rp != NULL); + + s = splsoftnet(); + soisdisconnected(so); + raw_disconnect(rp); + splx(s); + + return 0; +} + +static int +key_shutdown(struct socket *so) +{ + int s; + + KASSERT(solocked(so)); + + /* + * Mark the connection as being incapable of further input. + */ + s = splsoftnet(); + socantsendmore(so); + splx(s); + + return 0; +} + +static int +key_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + panic("key_abort"); + + return EOPNOTSUPP; +} + +static int key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EOPNOTSUPP; @@ -599,6 +643,9 @@ key_usrreq(struct socket *so, int req,st KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -627,6 +674,9 @@ PR_WRAP_USRREQS(key) #define key_bind key_bind_wrapper #define key_listen key_listen_wrapper #define key_connect key_connect_wrapper +#define key_disconnect key_disconnect_wrapper +#define key_shutdown key_shutdown_wrapper +#define key_abort key_abort_wrapper #define key_ioctl key_ioctl_wrapper #define key_stat key_stat_wrapper #define key_peeraddr key_peeraddr_wrapper @@ -642,6 +692,9 @@ const struct pr_usrreqs key_usrreqs = { .pr_bind = key_bind, .pr_listen = key_listen, .pr_connect = key_connect, + .pr_disconnect = key_disconnect, + .pr_shutdown = key_shutdown, + .pr_abort = key_abort, .pr_ioctl = key_ioctl, .pr_stat = key_stat, .pr_peeraddr = key_peeraddr, Index: src/sys/netmpls/mpls_proto.c diff -u src/sys/netmpls/mpls_proto.c:1.18 src/sys/netmpls/mpls_proto.c:1.19 --- src/sys/netmpls/mpls_proto.c:1.18 Wed Jul 30 10:04:26 2014 +++ src/sys/netmpls/mpls_proto.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_proto.c,v 1.18 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: mpls_proto.c,v 1.19 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.18 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.19 2014/07/31 03:39:35 rtr Exp $"); #include "opt_inet.h" #include "opt_mbuftrace.h" @@ -127,6 +127,30 @@ mpls_connect(struct socket *so, struct m } static int +mpls_disconnect(struct socket *so) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int +mpls_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int +mpls_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int mpls_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EOPNOTSUPP; @@ -267,6 +291,9 @@ PR_WRAP_USRREQS(mpls) #define mpls_bind mpls_bind_wrapper #define mpls_listen mpls_listen_wrapper #define mpls_connect mpls_connect_wrapper +#define mpls_disconnect mpls_disconnect_wrapper +#define mpls_shutdown mpls_shutdown_wrapper +#define mpls_abort mpls_abort_wrapper #define mpls_ioctl mpls_ioctl_wrapper #define mpls_stat mpls_stat_wrapper #define mpls_peeraddr mpls_peeraddr_wrapper @@ -282,6 +309,9 @@ static const struct pr_usrreqs mpls_usrr .pr_bind = mpls_bind, .pr_listen = mpls_listen, .pr_connect = mpls_connect, + .pr_disconnect = mpls_disconnect, + .pr_shutdown = mpls_shutdown, + .pr_abort = mpls_abort, .pr_ioctl = mpls_ioctl, .pr_stat = mpls_stat, .pr_peeraddr = mpls_peeraddr, Index: src/sys/netnatm/natm.c diff -u src/sys/netnatm/natm.c:1.40 src/sys/netnatm/natm.c:1.41 --- src/sys/netnatm/natm.c:1.40 Wed Jul 30 10:04:26 2014 +++ src/sys/netnatm/natm.c Thu Jul 31 03:39:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: natm.c,v 1.40 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: natm.c,v 1.41 2014/07/31 03:39:35 rtr Exp $ */ /* * Copyright (c) 1996 Charles D. Cranor and Washington University. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.40 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.41 2014/07/31 03:39:35 rtr Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -189,6 +189,58 @@ natm_connect(struct socket *so, struct m return error; } +static int +natm_disconnect(struct socket *so) +{ + struct natmpcb *npcb = (struct natmpcb *)so->so_pcb; + + KASSERT(solocked(so)); + KASSERT(npcb != NULL); + + if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) { + printf("natm: disconnected check\n"); + return EIO; + } + ifp = npcb->npcb_ifp; + + /* + * disable rx + */ + ATM_PH_FLAGS(&api.aph) = ATM_PH_AAL5; + ATM_PH_VPI(&api.aph) = npcb->npcb_vpi; + ATM_PH_SETVCI(&api.aph, npcb->npcb_vci); + api.rxhand = npcb; + + s2 = splnet(); + ifp->if_ioctl(ifp, SIOCATMDIS, &api); + splx(s); + + npcb_free(npcb, NPCB_REMOVE); + soisdisconnected(so); + return 0; +} + +static int +natm_shutdown(struct socket *so) +{ + int s; + + KASSERT(solocked(so)); + + s = splsoftnet(); + socantsendmore(so); + splx(s); + + return 0; +} + +static int +natm_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} static int natm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) @@ -304,6 +356,9 @@ natm_usrreq(struct socket *so, int req, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -321,36 +376,6 @@ natm_usrreq(struct socket *so, int req, } switch (req) { - case PRU_DISCONNECT: /* disconnect from peer */ - - if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) { - printf("natm: disconnected check\n"); - error = EIO; - break; - } - ifp = npcb->npcb_ifp; - - /* - * disable rx - */ - - ATM_PH_FLAGS(&api.aph) = ATM_PH_AAL5; - ATM_PH_VPI(&api.aph) = npcb->npcb_vpi; - ATM_PH_SETVCI(&api.aph, npcb->npcb_vci); - api.rxhand = npcb; - s2 = splnet(); - ifp->if_ioctl(ifp, SIOCATMDIS, &api); - splx(s); - - npcb_free(npcb, NPCB_REMOVE); - soisdisconnected(so); - - break; - - case PRU_SHUTDOWN: /* won't send any more data */ - socantsendmore(so); - break; - case PRU_SEND: /* send this data */ if (control && control->m_len) { m_freem(control); @@ -378,8 +403,6 @@ natm_usrreq(struct socket *so, int req, break; case PRU_CONNECT2: /* connect two sockets */ - case PRU_ABORT: /* abort (fast DISCONNECT, DETATCH) */ - /* (only happens if LISTEN socket) */ case PRU_RCVD: /* have taken data; more room now */ case PRU_FASTTIMO: /* 200ms timeout */ case PRU_SLOWTIMO: /* 500ms timeout */ @@ -484,6 +507,9 @@ PR_WRAP_USRREQS(natm) #define natm_bind natm_bind_wrapper #define natm_listen natm_listen_wrapper #define natm_connect natm_connect_wrapper +#define natm_disconnect natm_disconnect_wrapper +#define natm_shutdown natm_shutdown_wrapper +#define natm_abort natm_abort_wrapper #define natm_ioctl natm_ioctl_wrapper #define natm_stat natm_stat_wrapper #define natm_peeraddr natm_peeraddr_wrapper @@ -499,6 +525,9 @@ const struct pr_usrreqs natm_usrreqs = { .pr_bind = natm_bind, .pr_listen = natm_listen, .pr_connect = natm_connect, + .pr_disconnect = natm_disconnect, + .pr_shutdown = natm_shutdown, + .pr_abort = natm_abort, .pr_ioctl = natm_ioctl, .pr_stat = natm_stat, .pr_peeraddr = natm_peeraddr, Index: src/sys/rump/net/lib/libsockin/sockin.c diff -u src/sys/rump/net/lib/libsockin/sockin.c:1.53 src/sys/rump/net/lib/libsockin/sockin.c:1.54 --- src/sys/rump/net/lib/libsockin/sockin.c:1.53 Wed Jul 30 10:04:26 2014 +++ src/sys/rump/net/lib/libsockin/sockin.c Thu Jul 31 03:39:36 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sockin.c,v 1.53 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: sockin.c,v 1.54 2014/07/31 03:39:36 rtr Exp $ */ /* * Copyright (c) 2008, 2009 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.53 2014/07/30 10:04:26 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.54 2014/07/31 03:39:36 rtr Exp $"); #include <sys/param.h> #include <sys/condvar.h> @@ -72,6 +72,9 @@ static int sockin_accept(struct socket * static int sockin_bind(struct socket *, struct mbuf *); static int sockin_listen(struct socket *); static int sockin_connect(struct socket *, struct mbuf *); +static int sockin_disconnect(struct socket *); +static int sockin_shutdown(struct socket *); +static int sockin_abort(struct socket *); static int sockin_ioctl(struct socket *, u_long, void *, struct ifnet *); static int sockin_stat(struct socket *, struct stat *); static int sockin_peeraddr(struct socket *, struct mbuf *); @@ -89,6 +92,9 @@ static const struct pr_usrreqs sockin_us .pr_bind = sockin_bind, .pr_listen = sockin_listen, .pr_connect = sockin_connect, + .pr_disconnect = sockin_disconnect, + .pr_shutdown = sockin_shutdown, + .pr_abort = sockin_abort, .pr_ioctl = sockin_ioctl, .pr_stat = sockin_stat, .pr_peeraddr = sockin_peeraddr, @@ -513,6 +519,30 @@ sockin_connect(struct socket *so, struct return error; } +static int +sockin_disconnect(struct socket *so) +{ + KASSERT(solocked(so)); + + panic("sockin_disconnect: IMPLEMENT ME, disconnect not supported"); +} + +static int +sockin_shutdown(struct socket *so) +{ + KASSERT(solocked(so)); + + removesock(so); + return 0; +} + +static int +sockin_abort(struct socket *so) +{ + KASSERT(solocked(so)); + + panic("sockin_abort: IMPLEMENT ME, abort not supported"); +} static int sockin_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) @@ -561,12 +591,16 @@ sockin_sockaddr(struct socket *so, struc static int sockin_recvoob(struct socket *so, struct mbuf *m, int flags) { + KASSERT(solocked(so)); + panic("sockin_recvoob: IMPLEMENT ME, recvoob not supported"); } static int sockin_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) { + KASSERT(solocked(so)); + panic("sockin_sendoob: IMPLEMENT ME, sendoob not supported"); } @@ -580,6 +614,9 @@ sockin_usrreq(struct socket *so, int req KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_DISCONNECT); + KASSERT(req != PRU_SHUTDOWN); + KASSERT(req != PRU_ABORT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -644,10 +681,6 @@ sockin_usrreq(struct socket *so, int req } break; - case PRU_SHUTDOWN: - removesock(so); - break; - default: panic("sockin_usrreq: IMPLEMENT ME, req %d not supported", req); } Index: src/sys/sys/protosw.h diff -u src/sys/sys/protosw.h:1.55 src/sys/sys/protosw.h:1.56 --- src/sys/sys/protosw.h:1.55 Wed Jul 30 10:04:26 2014 +++ src/sys/sys/protosw.h Thu Jul 31 03:39:36 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: protosw.h,v 1.55 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: protosw.h,v 1.56 2014/07/31 03:39:36 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -242,6 +242,9 @@ struct pr_usrreqs { int (*pr_bind)(struct socket *, struct mbuf *); int (*pr_listen)(struct socket *); int (*pr_connect)(struct socket *, struct mbuf *); + int (*pr_disconnect)(struct socket *); + int (*pr_shutdown)(struct socket *); + int (*pr_abort)(struct socket *); int (*pr_ioctl)(struct socket *, u_long, void *, struct ifnet *); int (*pr_stat)(struct socket *, struct stat *); int (*pr_peeraddr)(struct socket *, struct mbuf *); @@ -336,6 +339,33 @@ name##_listen_wrapper(struct socket *a) return rv; \ } \ static int \ +name##_disconnect_wrapper(struct socket *a) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_disconnect(a); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ +name##_shutdown_wrapper(struct socket *a) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_shutdown(a); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ +name##_abort_wrapper(struct socket *a) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_abort(a); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ name##_ioctl_wrapper(struct socket *a, u_long b, \ void *c, struct ifnet *d) \ { \ Index: src/sys/sys/un.h diff -u src/sys/sys/un.h:1.50 src/sys/sys/un.h:1.51 --- src/sys/sys/un.h:1.50 Wed Jul 30 10:04:26 2014 +++ src/sys/sys/un.h Thu Jul 31 03:39:36 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: un.h,v 1.50 2014/07/30 10:04:26 rtr Exp $ */ +/* $NetBSD: un.h,v 1.51 2014/07/31 03:39:36 rtr Exp $ */ /* * Copyright (c) 1982, 1986, 1993 @@ -88,9 +88,9 @@ int unp_bind (struct socket *, struct mb int unp_connect (struct socket *, struct mbuf *); int unp_connect2 (struct socket *, struct socket *, int); void unp_discard (struct file *); -void unp_disconnect (struct unpcb *); +void unp_disconnect1 (struct unpcb *); bool unp_drop (struct unpcb *, int); -void unp_shutdown (struct unpcb *); +void unp_shutdown1 (struct unpcb *); int unp_externalize (struct mbuf *, struct lwp *, int); int unp_internalize (struct mbuf **); void unp_dispose (struct mbuf *);