Module Name:    src
Committed By:   rtr
Date:           Wed Jul  9 14:41:43 UTC 2014

Modified Files:
        src/sys/kern: uipc_socket.c uipc_usrreq.c
        src/sys/net: if_mpls.c raw_usrreq.c rtsock.c
        src/sys/netatalk: ddp_usrreq.c
        src/sys/netbt: hci_socket.c l2cap_socket.c rfcomm_socket.c sco_socket.c
        src/sys/netinet: raw_ip.c tcp_usrreq.c 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

Log Message:
* split PRU_ACCEPT function out of pr_generic() usrreq switches and put
  into a separate function xxx_accept(struct socket *, struct mbuf *)

note: future cleanup will take place to remove struct mbuf parameter
type and replace it with a more appropriate type.

patch reviewed by rmind


To generate a diff of this commit:
cvs rdiff -u -r1.224 -r1.225 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.158 -r1.159 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.14 -r1.15 src/sys/net/if_mpls.c
cvs rdiff -u -r1.42 -r1.43 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.154 -r1.155 src/sys/net/rtsock.c
cvs rdiff -u -r1.52 -r1.53 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.31 -r1.32 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.22 -r1.23 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.23 -r1.24 src/sys/netbt/rfcomm_socket.c
cvs rdiff -u -r1.24 -r1.25 src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.132 -r1.133 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.185 -r1.186 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.207 -r1.208 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.126 -r1.127 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.106 -r1.107 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.34 -r1.35 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.14 -r1.15 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.36 -r1.37 src/sys/netnatm/natm.c
cvs rdiff -u -r1.47 -r1.48 src/sys/rump/net/lib/libsockin/sockin.c
cvs rdiff -u -r1.51 -r1.52 src/sys/sys/protosw.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/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.224 src/sys/kern/uipc_socket.c:1.225
--- src/sys/kern/uipc_socket.c:1.224	Mon May 19 02:51:24 2014
+++ src/sys/kern/uipc_socket.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.224 2014/05/19 02:51:24 rmind Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.225 2014/07/09 14:41:42 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.224 2014/05/19 02:51:24 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.225 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_sock_counters.h"
@@ -802,8 +802,7 @@ soaccept(struct socket *so, struct mbuf 
 	so->so_state &= ~SS_NOFDREF;
 	if ((so->so_state & SS_ISDISCONNECTED) == 0 ||
 	    (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)
-		error = (*so->so_proto->pr_usrreqs->pr_generic)(so,
-		    PRU_ACCEPT, NULL, nam, NULL, NULL);
+		error = (*so->so_proto->pr_usrreqs->pr_accept)(so, nam);
 	else
 		error = ECONNABORTED;
 

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.158 src/sys/kern/uipc_usrreq.c:1.159
--- src/sys/kern/uipc_usrreq.c:1.158	Wed Jul  9 04:54:03 2014
+++ src/sys/kern/uipc_usrreq.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.158 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.159 2014/07/09 14:41:42 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.158 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.159 2014/07/09 14:41:42 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -376,6 +376,7 @@ unp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -419,56 +420,6 @@ unp_usrreq(struct socket *so, int req, s
 		unp_disconnect(unp);
 		break;
 
-	case PRU_ACCEPT:
-		KASSERT(so->so_lock == uipc_lock);
-		/*
-		 * Mark the initiating STREAM socket as connected *ONLY*
-		 * after it's been accepted.  This prevents a client from
-		 * overrunning a server and receiving ECONNREFUSED.
-		 */
-		if (unp->unp_conn == NULL) {
-			/*
-			 * This will use the empty socket and will not
-			 * allocate.
-			 */
-			unp_setaddr(so, nam, true);
-			break;
-		}
-		so2 = unp->unp_conn->unp_socket;
-		if (so2->so_state & SS_ISCONNECTING) {
-			KASSERT(solocked2(so, so->so_head));
-			KASSERT(solocked2(so2, so->so_head));
-			soisconnected(so2);
-		}
-		/*
-		 * If the connection is fully established, break the
-		 * association with uipc_lock and give the connected
-		 * pair a separate lock to share.
-		 * There is a race here: sotounpcb(so2)->unp_streamlock
-		 * is not locked, so when changing so2->so_lock
-		 * another thread can grab it while so->so_lock is still
-		 * pointing to the (locked) uipc_lock.
-		 * this should be harmless, except that this makes
-		 * solocked2() and solocked() unreliable.
-		 * Another problem is that unp_setaddr() expects the
-		 * the socket locked. Grabing sotounpcb(so2)->unp_streamlock
-		 * fixes both issues.
-		 */
-		mutex_enter(sotounpcb(so2)->unp_streamlock);
-		unp_setpeerlocks(so2, so);
-		/*
-		 * Only now return peer's address, as we may need to
-		 * block in order to allocate memory.
-		 *
-		 * XXX Minor race: connection can be broken while
-		 * lock is dropped in unp_setaddr().  We will return
-		 * error == 0 and sun_noname as the peer address.
-		 */
-		unp_setaddr(so, nam, true);
-		/* so_lock now points to unp_streamlock */
-		mutex_exit(so2->so_lock);
-		break;
-
 	case PRU_SHUTDOWN:
 		socantsendmore(so);
 		unp_shutdown(unp);
@@ -837,6 +788,69 @@ unp_detach(struct socket *so)
 }
 
 static int
+unp_accept(struct socket *so, struct mbuf *nam)
+{
+	struct unpcb *unp = sotounpcb(so);
+	struct socket *so2;
+
+	KASSERT(solocked(so));
+	KASSERT(nam != NULL);
+
+	/* XXX code review required to determine if unp can ever be NULL */
+	if (unp == NULL)
+		return EINVAL;
+
+	KASSERT(so->so_lock == uipc_lock);
+	/*
+	 * Mark the initiating STREAM socket as connected *ONLY*
+	 * after it's been accepted.  This prevents a client from
+	 * overrunning a server and receiving ECONNREFUSED.
+	 */
+	if (unp->unp_conn == NULL) {
+		/*
+		 * This will use the empty socket and will not
+		 * allocate.
+		 */
+		unp_setaddr(so, nam, true);
+		return 0;
+	}
+	so2 = unp->unp_conn->unp_socket;
+	if (so2->so_state & SS_ISCONNECTING) {
+		KASSERT(solocked2(so, so->so_head));
+		KASSERT(solocked2(so2, so->so_head));
+		soisconnected(so2);
+	}
+	/*
+	 * If the connection is fully established, break the
+	 * association with uipc_lock and give the connected
+	 * pair a separate lock to share.
+	 * There is a race here: sotounpcb(so2)->unp_streamlock
+	 * is not locked, so when changing so2->so_lock
+	 * another thread can grab it while so->so_lock is still
+	 * pointing to the (locked) uipc_lock.
+	 * this should be harmless, except that this makes
+	 * solocked2() and solocked() unreliable.
+	 * Another problem is that unp_setaddr() expects the
+	 * the socket locked. Grabing sotounpcb(so2)->unp_streamlock
+	 * fixes both issues.
+	 */
+	mutex_enter(sotounpcb(so2)->unp_streamlock);
+	unp_setpeerlocks(so2, so);
+	/*
+	 * Only now return peer's address, as we may need to
+	 * block in order to allocate memory.
+	 *
+	 * XXX Minor race: connection can be broken while
+	 * lock is dropped in unp_setaddr().  We will return
+	 * error == 0 and sun_noname as the peer address.
+	 */
+	unp_setaddr(so, nam, true);
+	/* so_lock now points to unp_streamlock */
+	mutex_exit(so2->so_lock);
+	return 0;
+}
+
+static int
 unp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -1843,6 +1857,7 @@ unp_discard_later(file_t *fp)
 const struct pr_usrreqs unp_usrreqs = {
 	.pr_attach	= unp_attach,
 	.pr_detach	= unp_detach,
+	.pr_accept	= unp_accept,
 	.pr_ioctl	= unp_ioctl,
 	.pr_stat	= unp_stat,
 	.pr_peeraddr	= unp_peeraddr,

Index: src/sys/net/if_mpls.c
diff -u src/sys/net/if_mpls.c:1.14 src/sys/net/if_mpls.c:1.15
--- src/sys/net/if_mpls.c:1.14	Fri Jun  6 01:02:47 2014
+++ src/sys/net/if_mpls.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mpls.c,v 1.14 2014/06/06 01:02:47 rmind Exp $ */
+/*	$NetBSD: if_mpls.c,v 1.15 2014/07/09 14:41:42 rtr Exp $ */
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.14 2014/06/06 01:02:47 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.15 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_mpls.h"
@@ -104,7 +104,7 @@ static struct mbuf *mpls_label_inet6(str
 static struct mbuf *mpls_prepend_shim(struct mbuf *, union mpls_shim *);
 
 extern int mpls_defttl, mpls_mapttl_inet, mpls_mapttl_inet6, mpls_icmp_respond,
-	mpls_forwarding, mpls_accept, mpls_mapprec_inet, mpls_mapclass_inet6,
+	mpls_forwarding, mpls_frame_accept, mpls_mapprec_inet, mpls_mapclass_inet6,
 	mpls_rfc4182;
 
 /* ARGSUSED */
@@ -329,7 +329,7 @@ mpls_lse(struct mbuf *m)
 
 	/* Check if we're accepting MPLS Frames */
 	error = EINVAL;
-	if (!mpls_accept)
+	if (!mpls_frame_accept)
 		goto done;
 
 	/* TTL decrement */

Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.42 src/sys/net/raw_usrreq.c:1.43
--- src/sys/net/raw_usrreq.c:1.42	Wed Jul  9 04:54:03 2014
+++ src/sys/net/raw_usrreq.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_usrreq.c,v 1.42 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: raw_usrreq.c,v 1.43 2014/07/09 14:41:42 rtr Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.42 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.43 2014/07/09 14:41:42 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -162,6 +162,7 @@ raw_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.154 src/sys/net/rtsock.c:1.155
--- src/sys/net/rtsock.c:1.154	Wed Jul  9 04:54:03 2014
+++ src/sys/net/rtsock.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.154 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.155 2014/07/09 14:41:42 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.154 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.155 2014/07/09 14:41:42 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -224,6 +224,16 @@ COMPATNAME(route_detach)(struct socket *
 }
 
 static int
+COMPATNAME(route_accept)(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	panic("route_accept");
+	/* NOT REACHED */
+	return EOPNOTSUPP;
+}
+
+static int
 COMPATNAME(route_ioctl)(struct socket *so, u_long cmd, void *nam,
     struct ifnet * ifp)
 {
@@ -278,6 +288,7 @@ COMPATNAME(route_usrreq)(struct socket *
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -1378,6 +1389,7 @@ PR_WRAP_USRREQS(compat_50_route);
 static const struct pr_usrreqs route_usrreqs = {
 	.pr_attach	= COMPATNAME(route_attach_wrapper),
 	.pr_detach	= COMPATNAME(route_detach_wrapper),
+	.pr_accept	= COMPATNAME(route_accept_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.52 src/sys/netatalk/ddp_usrreq.c:1.53
--- src/sys/netatalk/ddp_usrreq.c:1.52	Wed Jul  9 04:54:03 2014
+++ src/sys/netatalk/ddp_usrreq.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ddp_usrreq.c,v 1.52 2014/07/09 04:54:03 rtr Exp $	 */
+/*	$NetBSD: ddp_usrreq.c,v 1.53 2014/07/09 14:41:42 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.52 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.53 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -84,6 +84,7 @@ ddp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -170,7 +171,6 @@ ddp_usrreq(struct socket *so, int req, s
 
 	case PRU_LISTEN:
 	case PRU_CONNECT2:
-	case PRU_ACCEPT:
 	case PRU_SENDOOB:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -471,6 +471,14 @@ ddp_detach(struct socket *so)
 }
 
 static int
+ddp_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 ddp_ioctl(struct socket *so, u_long cmd, void *addr, struct ifnet *ifp)
 {
 	return at_control(cmd, addr, ifp);
@@ -577,6 +585,7 @@ ddp_init(void)
 PR_WRAP_USRREQS(ddp)
 #define	ddp_attach	ddp_attach_wrapper
 #define	ddp_detach	ddp_detach_wrapper
+#define	ddp_accept	ddp_accept_wrapper
 #define	ddp_ioctl	ddp_ioctl_wrapper
 #define	ddp_stat	ddp_stat_wrapper
 #define	ddp_peeraddr	ddp_peeraddr_wrapper
@@ -586,6 +595,7 @@ PR_WRAP_USRREQS(ddp)
 const struct pr_usrreqs ddp_usrreqs = {
 	.pr_attach	= ddp_attach,
 	.pr_detach	= ddp_detach,
+	.pr_accept	= ddp_accept,
 	.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.31 src/sys/netbt/hci_socket.c:1.32
--- src/sys/netbt/hci_socket.c:1.31	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/hci_socket.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_socket.c,v 1.31 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: hci_socket.c,v 1.32 2014/07/09 14:41:42 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.31 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.32 2014/07/09 14:41:42 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -484,6 +484,14 @@ hci_detach(struct socket *so)
 }
 
 static int
+hci_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 hci_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	int err;
@@ -560,6 +568,7 @@ hci_usrreq(struct socket *up, int req, s
 	DPRINTFN(2, "%s\n", prurequests[req]);
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -659,7 +668,6 @@ hci_usrreq(struct socket *up, int req, s
 	case PRU_RCVOOB:
 		return EOPNOTSUPP;	/* (no release) */
 
-	case PRU_ACCEPT:
 	case PRU_CONNECT2:
 	case PRU_LISTEN:
 	case PRU_SENDOOB:
@@ -892,6 +900,7 @@ PR_WRAP_USRREQS(hci)
 
 #define	hci_attach		hci_attach_wrapper
 #define	hci_detach		hci_detach_wrapper
+#define	hci_accept		hci_accept_wrapper
 #define	hci_ioctl		hci_ioctl_wrapper
 #define	hci_stat		hci_stat_wrapper
 #define	hci_peeraddr		hci_peeraddr_wrapper
@@ -901,6 +910,7 @@ PR_WRAP_USRREQS(hci)
 const struct pr_usrreqs hci_usrreqs = {
 	.pr_attach	= hci_attach,
 	.pr_detach	= hci_detach,
+	.pr_accept	= hci_accept,
 	.pr_ioctl	= hci_ioctl,
 	.pr_stat	= hci_stat,
 	.pr_peeraddr	= hci_peeraddr,

Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.22 src/sys/netbt/l2cap_socket.c:1.23
--- src/sys/netbt/l2cap_socket.c:1.22	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/l2cap_socket.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_socket.c,v 1.22 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: l2cap_socket.c,v 1.23 2014/07/09 14:41:42 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.22 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.23 2014/07/09 14:41:42 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -117,6 +117,23 @@ l2cap_detach(struct socket *so)
 }
 
 static int
+l2cap_accept(struct socket *so, struct mbuf *nam)
+{
+	struct l2cap_channel *pcb = so->so_pcb;
+	struct sockaddr_bt *sa;
+
+	KASSERT(solocked(so));
+	KASSERT(nam != NULL);
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	sa = mtod(nam, struct sockaddr_bt *);
+	nam->m_len = sizeof(struct sockaddr_bt);
+	return l2cap_peeraddr_pcb(pcb, sa);
+}
+
+static int
 l2cap_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EPASSTHROUGH;
@@ -187,6 +204,7 @@ l2cap_usrreq(struct socket *up, int req,
 	DPRINTFN(2, "%s\n", prurequests[req]);
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -271,12 +289,6 @@ l2cap_usrreq(struct socket *up, int req,
 	case PRU_LISTEN:
 		return l2cap_listen(pcb);
 
-	case PRU_ACCEPT:
-		KASSERT(nam != NULL);
-		sa = mtod(nam, struct sockaddr_bt *);
-		nam->m_len = sizeof(struct sockaddr_bt);
-		return l2cap_peeraddr_pcb(pcb, sa);
-
 	case PRU_CONNECT2:
 	case PRU_SENDOOB:
 	case PRU_FASTTIMO:
@@ -442,6 +454,7 @@ PR_WRAP_USRREQS(l2cap)
 
 #define	l2cap_attach		l2cap_attach_wrapper
 #define	l2cap_detach		l2cap_detach_wrapper
+#define	l2cap_accept		l2cap_accept_wrapper
 #define	l2cap_ioctl		l2cap_ioctl_wrapper
 #define	l2cap_stat		l2cap_stat_wrapper
 #define	l2cap_peeraddr		l2cap_peeraddr_wrapper
@@ -451,6 +464,7 @@ PR_WRAP_USRREQS(l2cap)
 const struct pr_usrreqs l2cap_usrreqs = {
 	.pr_attach	= l2cap_attach,
 	.pr_detach	= l2cap_detach,
+	.pr_accept	= l2cap_accept,
 	.pr_ioctl	= l2cap_ioctl,
 	.pr_stat	= l2cap_stat,
 	.pr_peeraddr	= l2cap_peeraddr,

Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.23 src/sys/netbt/rfcomm_socket.c:1.24
--- src/sys/netbt/rfcomm_socket.c:1.23	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/rfcomm_socket.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_socket.c,v 1.23 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: rfcomm_socket.c,v 1.24 2014/07/09 14:41:42 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.23 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.24 2014/07/09 14:41:42 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -125,6 +125,23 @@ rfcomm_detach(struct socket *so)
 }
 
 static int
+rfcomm_accept(struct socket *so, struct mbuf *nam)
+{
+	struct rfcomm_dlc *pcb = so->so_pcb;
+	struct sockaddr_bt *sa;
+
+	KASSERT(solocked(so));
+	KASSERT(nam != NULL);
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	sa = mtod(nam, struct sockaddr_bt *);
+	nam->m_len = sizeof(struct sockaddr_bt);
+	return rfcomm_peeraddr_pcb(pcb, sa);
+}
+
+static int
 rfcomm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EPASSTHROUGH;
@@ -195,6 +212,7 @@ rfcomm_usrreq(struct socket *up, int req
 	DPRINTFN(2, "%s\n", prurequests[req]);
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -272,12 +290,6 @@ rfcomm_usrreq(struct socket *up, int req
 	case PRU_LISTEN:
 		return rfcomm_listen(pcb);
 
-	case PRU_ACCEPT:
-		KASSERT(nam != NULL);
-		sa = mtod(nam, struct sockaddr_bt *);
-		nam->m_len = sizeof(struct sockaddr_bt);
-		return rfcomm_peeraddr_pcb(pcb, sa);
-
 	case PRU_CONNECT2:
 	case PRU_SENDOOB:
 	case PRU_FASTTIMO:
@@ -455,6 +467,7 @@ PR_WRAP_USRREQS(rfcomm)
 
 #define	rfcomm_attach		rfcomm_attach_wrapper
 #define	rfcomm_detach		rfcomm_detach_wrapper
+#define	rfcomm_accept		rfcomm_accept_wrapper
 #define	rfcomm_ioctl		rfcomm_ioctl_wrapper
 #define	rfcomm_stat		rfcomm_stat_wrapper
 #define	rfcomm_peeraddr		rfcomm_peeraddr_wrapper
@@ -464,6 +477,7 @@ PR_WRAP_USRREQS(rfcomm)
 const struct pr_usrreqs rfcomm_usrreqs = {
 	.pr_attach	= rfcomm_attach,
 	.pr_detach	= rfcomm_detach,
+	.pr_accept	= rfcomm_accept,
 	.pr_ioctl	= rfcomm_ioctl,
 	.pr_stat	= rfcomm_stat,
 	.pr_peeraddr	= rfcomm_peeraddr,

Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.24 src/sys/netbt/sco_socket.c:1.25
--- src/sys/netbt/sco_socket.c:1.24	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/sco_socket.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_socket.c,v 1.24 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: sco_socket.c,v 1.25 2014/07/09 14:41:42 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.24 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.25 2014/07/09 14:41:42 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -108,6 +108,23 @@ sco_detach(struct socket *so)
 }
 
 static int
+sco_accept(struct socket *so, struct mbuf *nam)
+{
+	struct sco_pcb *pcb = so->so_pcb;
+	struct sockaddr_bt *sa;
+
+	KASSERT(solocked(so));
+	KASSERT(nam != NULL);
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	sa = mtod(nam, struct sockaddr_bt *);
+	nam->m_len = sizeof(struct sockaddr_bt);
+	return sco_peeraddr_pcb(pcb, sa);
+}
+
+static int
 sco_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -174,6 +191,7 @@ sco_usrreq(struct socket *up, int req, s
 	DPRINTFN(2, "%s\n", prurequests[req]);
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -259,12 +277,6 @@ sco_usrreq(struct socket *up, int req, s
 	case PRU_LISTEN:
 		return sco_listen(pcb);
 
-	case PRU_ACCEPT:
-		KASSERT(nam != NULL);
-		sa = mtod(nam, struct sockaddr_bt *);
-		nam->m_len = sizeof(struct sockaddr_bt);
-		return sco_peeraddr_pcb(pcb, sa);
-
 	case PRU_CONNECT2:
 	case PRU_SENDOOB:
 	case PRU_FASTTIMO:
@@ -409,6 +421,7 @@ PR_WRAP_USRREQS(sco)
 
 #define	sco_attach		sco_attach_wrapper
 #define	sco_detach		sco_detach_wrapper
+#define	sco_accept		sco_accept_wrapper
 #define	sco_ioctl		sco_ioctl_wrapper
 #define	sco_stat		sco_stat_wrapper
 #define	sco_peeraddr		sco_peeraddr_wrapper
@@ -418,6 +431,7 @@ PR_WRAP_USRREQS(sco)
 const struct pr_usrreqs sco_usrreqs = {
 	.pr_attach	= sco_attach,
 	.pr_detach	= sco_detach,
+	.pr_accept	= sco_accept,
 	.pr_ioctl	= sco_ioctl,
 	.pr_stat	= sco_stat,
 	.pr_peeraddr	= sco_peeraddr,

Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.132 src/sys/netinet/raw_ip.c:1.133
--- src/sys/netinet/raw_ip.c:1.132	Wed Jul  9 04:54:04 2014
+++ src/sys/netinet/raw_ip.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip.c,v 1.132 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: raw_ip.c,v 1.133 2014/07/09 14:41:42 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.132 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.133 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -567,6 +567,16 @@ rip_detach(struct socket *so)
 }
 
 static int
+rip_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	panic("rip_accept");
+	/* NOT REACHED */
+	return EOPNOTSUPP;
+}
+
+static int
 rip_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return in_control(so, cmd, nam, ifp);
@@ -612,6 +622,7 @@ rip_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -730,6 +741,7 @@ rip_usrreq(struct socket *so, int req, s
 PR_WRAP_USRREQS(rip)
 #define	rip_attach	rip_attach_wrapper
 #define	rip_detach	rip_detach_wrapper
+#define	rip_accept	rip_accept_wrapper
 #define	rip_ioctl	rip_ioctl_wrapper
 #define	rip_stat	rip_stat_wrapper
 #define	rip_peeraddr	rip_peeraddr_wrapper
@@ -739,6 +751,7 @@ PR_WRAP_USRREQS(rip)
 const struct pr_usrreqs rip_usrreqs = {
 	.pr_attach	= rip_attach,
 	.pr_detach	= rip_detach,
+	.pr_accept	= rip_accept,
 	.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.185 src/sys/netinet/tcp_usrreq.c:1.186
--- src/sys/netinet/tcp_usrreq.c:1.185	Wed Jul  9 04:54:04 2014
+++ src/sys/netinet/tcp_usrreq.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.185 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.186 2014/07/09 14:41:42 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.185 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.186 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -198,6 +198,7 @@ tcp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -425,22 +426,6 @@ tcp_usrreq(struct socket *so, int req, s
 		break;
 
 	/*
-	 * Accept a connection.  Essentially all the work is
-	 * done at higher levels; just return the address
-	 * of the peer, storing through addr.
-	 */
-	case PRU_ACCEPT:
-#ifdef INET
-		if (inp)
-			in_setpeeraddr(inp, nam);
-#endif
-#ifdef INET6
-		if (in6p)
-			in6_setpeeraddr(in6p, nam);
-#endif
-		break;
-
-	/*
 	 * Mark the connection as being incapable of further output.
 	 */
 	case PRU_SHUTDOWN:
@@ -924,6 +909,80 @@ tcp_detach(struct socket *so)
 }
 
 static int
+tcp_accept(struct socket *so, struct mbuf *nam)
+{
+	struct inpcb *inp = NULL;
+#ifdef INET6
+	struct in6pcb *in6p = NULL;
+#endif
+	struct tcpcb *tp = NULL;
+	int ostate = 0;
+
+	KASSERT(solocked(so));
+
+	switch (so->so_proto->pr_domain->dom_family) {
+#ifdef INET
+	case PF_INET:
+		inp = sotoinpcb(so);
+		break;
+#endif
+#ifdef INET6
+	case PF_INET6:
+		in6p = sotoin6pcb(so);
+		break;
+#endif
+	default:
+		return EAFNOSUPPORT;
+	}
+
+	/*
+	 * When a TCP is attached to a socket, then there will be
+	 * a (struct inpcb) pointed at by the socket, and this
+	 * structure will point at a subsidary (struct tcpcb).
+	 */
+	if (inp == NULL
+#ifdef INET6
+	    && in6p == NULL
+#endif
+	    )
+	{
+		return EINVAL;
+	}
+#ifdef INET
+	if (inp) {
+		tp = intotcpcb(inp);
+		/* WHAT IF TP IS 0? */
+		ostate = tcp_debug_capture(tp, PRU_ACCEPT);
+	}
+#endif
+#ifdef INET6
+	if (in6p) {
+		tp = in6totcpcb(in6p);
+		/* WHAT IF TP IS 0? */
+		ostate = tcp_debug_capture(tp, PRU_ACCEPT);
+	}
+#endif
+
+	/*
+	 * Accept a connection.  Essentially all the work is
+	 * done at higher levels; just return the address
+	 * of the peer, storing through addr.
+	 */
+#ifdef INET
+	if (inp)
+		in_setpeeraddr(inp, nam);
+#endif
+#ifdef INET6
+	if (in6p)
+		in6_setpeeraddr(in6p, nam);
+#endif
+
+	tcp_debug_trace(so, tp, ostate, PRU_ACCEPT);
+
+	return 0;
+}
+
+static int
 tcp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	switch (so->so_proto->pr_domain->dom_family) {
@@ -2289,6 +2348,7 @@ tcp_usrreq_init(void)
 PR_WRAP_USRREQS(tcp)
 #define	tcp_attach	tcp_attach_wrapper
 #define	tcp_detach	tcp_detach_wrapper
+#define	tcp_accept	tcp_accept_wrapper
 #define	tcp_ioctl	tcp_ioctl_wrapper
 #define	tcp_stat	tcp_stat_wrapper
 #define	tcp_peeraddr	tcp_peeraddr_wrapper
@@ -2298,6 +2358,7 @@ PR_WRAP_USRREQS(tcp)
 const struct pr_usrreqs tcp_usrreqs = {
 	.pr_attach	= tcp_attach,
 	.pr_detach	= tcp_detach,
+	.pr_accept	= tcp_accept,
 	.pr_ioctl	= tcp_ioctl,
 	.pr_stat	= tcp_stat,
 	.pr_peeraddr	= tcp_peeraddr,

Index: src/sys/netinet/udp_usrreq.c
diff -u src/sys/netinet/udp_usrreq.c:1.207 src/sys/netinet/udp_usrreq.c:1.208
--- src/sys/netinet/udp_usrreq.c:1.207	Wed Jul  9 04:54:04 2014
+++ src/sys/netinet/udp_usrreq.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.207 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.208 2014/07/09 14:41:42 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.207 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.208 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -895,6 +895,16 @@ udp_detach(struct socket *so)
 }
 
 static int
+udp_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	panic("udp_accept");
+	/* NOT REACHED */
+	return EOPNOTSUPP;
+}
+
+static int
 udp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return in_control(so, cmd, nam, ifp);
@@ -940,6 +950,7 @@ udp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -1282,6 +1293,7 @@ udp4_espinudp(struct mbuf **mp, int off,
 PR_WRAP_USRREQS(udp)
 #define	udp_attach	udp_attach_wrapper
 #define	udp_detach	udp_detach_wrapper
+#define	udp_accept	udp_accept_wrapper
 #define	udp_ioctl	udp_ioctl_wrapper
 #define	udp_stat	udp_stat_wrapper
 #define	udp_peeraddr	udp_peeraddr_wrapper
@@ -1291,6 +1303,7 @@ PR_WRAP_USRREQS(udp)
 const struct pr_usrreqs udp_usrreqs = {
 	.pr_attach	= udp_attach,
 	.pr_detach	= udp_detach,
+	.pr_accept	= udp_accept,
 	.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.126 src/sys/netinet6/raw_ip6.c:1.127
--- src/sys/netinet6/raw_ip6.c:1.126	Wed Jul  9 04:54:04 2014
+++ src/sys/netinet6/raw_ip6.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.126 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.127 2014/07/09 14:41:42 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.126 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.127 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -645,6 +645,14 @@ rip6_detach(struct socket *so)
 }
 
 static int
+rip6_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 rip6_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return in6_control(so, cmd, nam, ifp);
@@ -688,6 +696,7 @@ rip6_usrreq(struct socket *so, int req, 
 	struct in6pcb *in6p = sotoin6pcb(so);
 	int error = 0;
 
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -866,7 +875,6 @@ rip6_usrreq(struct socket *so, int req, 
 	case PRU_RCVOOB:
 	case PRU_RCVD:
 	case PRU_LISTEN:
-	case PRU_ACCEPT:
 	case PRU_SENDOOB:
 		error = EOPNOTSUPP;
 		break;
@@ -921,6 +929,7 @@ sysctl_net_inet6_raw6_setup(struct sysct
 PR_WRAP_USRREQS(rip6)
 #define	rip6_attach		rip6_attach_wrapper
 #define	rip6_detach		rip6_detach_wrapper
+#define	rip6_accept		rip6_accept_wrapper
 #define	rip6_ioctl		rip6_ioctl_wrapper
 #define	rip6_stat		rip6_stat_wrapper
 #define	rip6_peeraddr		rip6_peeraddr_wrapper
@@ -930,6 +939,7 @@ PR_WRAP_USRREQS(rip6)
 const struct pr_usrreqs rip6_usrreqs = {
 	.pr_attach	= rip6_attach,
 	.pr_detach	= rip6_detach,
+	.pr_accept	= rip6_accept,
 	.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.106 src/sys/netinet6/udp6_usrreq.c:1.107
--- src/sys/netinet6/udp6_usrreq.c:1.106	Wed Jul  9 04:54:04 2014
+++ src/sys/netinet6/udp6_usrreq.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp6_usrreq.c,v 1.106 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: udp6_usrreq.c,v 1.107 2014/07/09 14:41:42 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.106 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.107 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_csum.h"
@@ -678,6 +678,14 @@ udp6_detach(struct socket *so)
 }
 
 static int
+udp6_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 udp6_ioctl(struct socket *so, u_long cmd, void *addr6, struct ifnet *ifp)
 {
 	/*
@@ -733,6 +741,7 @@ udp6_usrreq(struct socket *so, int req, 
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -801,7 +810,6 @@ udp6_usrreq(struct socket *so, int req, 
 
 	case PRU_LISTEN:
 	case PRU_CONNECT2:
-	case PRU_ACCEPT:
 	case PRU_SENDOOB:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -897,6 +905,7 @@ udp6_statinc(u_int stat)
 PR_WRAP_USRREQS(udp6)
 #define	udp6_attach	udp6_attach_wrapper
 #define	udp6_detach	udp6_detach_wrapper
+#define	udp6_accept	udp6_accept_wrapper
 #define	udp6_ioctl	udp6_ioctl_wrapper
 #define	udp6_stat	udp6_stat_wrapper
 #define	udp6_peeraddr	udp6_peeraddr_wrapper
@@ -906,6 +915,7 @@ PR_WRAP_USRREQS(udp6)
 const struct pr_usrreqs udp6_usrreqs = {
 	.pr_attach	= udp6_attach,
 	.pr_detach	= udp6_detach,
+	.pr_accept	= udp6_accept,
 	.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.34 src/sys/netipsec/keysock.c:1.35
--- src/sys/netipsec/keysock.c:1.34	Wed Jul  9 04:54:04 2014
+++ src/sys/netipsec/keysock.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.34 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: keysock.c,v 1.35 2014/07/09 14:41:42 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.34 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.35 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -485,6 +485,16 @@ key_detach(struct socket *so)
 }
 
 static int
+key_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	panic("key_accept");
+	/* NOT REACHED */
+	return EOPNOTSUPP;
+}
+
+static int
 key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -542,6 +552,7 @@ key_usrreq(struct socket *so, int req,st
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -564,6 +575,7 @@ DOMAIN_DEFINE(keydomain);
 PR_WRAP_USRREQS(key)
 #define	key_attach	key_attach_wrapper
 #define	key_detach	key_detach_wrapper
+#define	key_accept	key_accept_wrapper
 #define	key_ioctl	key_ioctl_wrapper
 #define	key_stat	key_stat_wrapper
 #define	key_peeraddr	key_peeraddr_wrapper
@@ -573,6 +585,7 @@ PR_WRAP_USRREQS(key)
 const struct pr_usrreqs key_usrreqs = {
 	.pr_attach	= key_attach,
 	.pr_detach	= key_detach,
+	.pr_accept	= key_accept,
 	.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.14 src/sys/netmpls/mpls_proto.c:1.15
--- src/sys/netmpls/mpls_proto.c:1.14	Wed Jul  9 04:54:04 2014
+++ src/sys/netmpls/mpls_proto.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_proto.c,v 1.14 2014/07/09 04:54:04 rtr Exp $ */
+/*	$NetBSD: mpls_proto.c,v 1.15 2014/07/09 14:41:42 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.14 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.15 2014/07/09 14:41:42 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_mbuftrace.h"
@@ -61,7 +61,7 @@ int mpls_mapttl_inet = 1;
 int mpls_mapttl_inet6 = 1;
 int mpls_icmp_respond = 0;
 int mpls_forwarding = 0;
-int mpls_accept = 0;
+int mpls_frame_accept = 0;
 int mpls_mapprec_inet = 1;
 int mpls_mapclass_inet6 = 1;
 int mpls_rfc4182 = 1;
@@ -95,6 +95,14 @@ mpls_detach(struct socket *so)
 }
 
 static int
+mpls_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 mpls_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -160,7 +168,7 @@ sysctl_net_mpls_setup(struct sysctllog *
 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
 		       CTLTYPE_INT, "accept",
 		       SYSCTL_DESCR("Accept MPLS Frames"),
-		       NULL, 0, &mpls_accept, 0,
+		       NULL, 0, &mpls_frame_accept, 0,
 		       CTL_NET, PF_MPLS, CTL_CREATE, CTL_EOL);
 	sysctl_createv(clog, 0, NULL, NULL,
 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
@@ -215,6 +223,7 @@ DOMAIN_DEFINE(mplsdomain);
 PR_WRAP_USRREQS(mpls)
 #define	mpls_attach	mpls_attach_wrapper
 #define	mpls_detach	mpls_detach_wrapper
+#define	mpls_accept	mpls_accept_wrapper
 #define	mpls_ioctl	mpls_ioctl_wrapper
 #define	mpls_stat	mpls_stat_wrapper
 #define	mpls_peeraddr	mpls_peeraddr_wrapper
@@ -224,6 +233,7 @@ PR_WRAP_USRREQS(mpls)
 static const struct pr_usrreqs mpls_usrreqs = {
 	.pr_attach	= mpls_attach,
 	.pr_detach	= mpls_detach,
+	.pr_accept	= mpls_accept,
 	.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.36 src/sys/netnatm/natm.c:1.37
--- src/sys/netnatm/natm.c:1.36	Wed Jul  9 04:54:04 2014
+++ src/sys/netnatm/natm.c	Wed Jul  9 14:41:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: natm.c,v 1.36 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: natm.c,v 1.37 2014/07/09 14:41:42 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.36 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.37 2014/07/09 14:41:42 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -98,6 +98,14 @@ natm_detach(struct socket *so)
 }
 
 static int
+natm_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERt(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 natm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
   int error = 0, s;
@@ -191,6 +199,7 @@ natm_usrreq(struct socket *so, int req, 
 
   KASSERT(req != PRU_ATTACH);
   KASSERT(req != PRU_DETACH);
+  KASSERT(req != PRU_ACCEPT);
   KASSERT(req != PRU_CONTROL);
   KASSERT(req != PRU_SENSE);
   KASSERT(req != PRU_PEERADDR);
@@ -333,7 +342,6 @@ natm_usrreq(struct socket *so, int req, 
 
     case PRU_BIND:			/* bind socket to address */
     case PRU_LISTEN:			/* listen for connection */
-    case PRU_ACCEPT:			/* accept connection from peer */
     case PRU_CONNECT2:			/* connect two sockets */
     case PRU_ABORT:			/* abort (fast DISCONNECT, DETATCH) */
 					/* (only happens if LISTEN socket) */
@@ -439,6 +447,7 @@ m->m_pkthdr.rcvif = NULL;	/* null it out
 PR_WRAP_USRREQS(natm)
 #define	natm_attach	natm_attach_wrapper
 #define	natm_detach	natm_detach_wrapper
+#define	natm_accept	natm_accept_wrapper
 #define	natm_ioctl	natm_ioctl_wrapper
 #define	natm_stat	natm_stat_wrapper
 #define	natm_peeraddr	natm_peeraddr_wrapper
@@ -448,6 +457,7 @@ PR_WRAP_USRREQS(natm)
 const struct pr_usrreqs natm_usrreqs = {
 	.pr_attach	= natm_attach,
 	.pr_detach	= natm_detach,
+	.pr_accept	= natm_accept,
 	.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.47 src/sys/rump/net/lib/libsockin/sockin.c:1.48
--- src/sys/rump/net/lib/libsockin/sockin.c:1.47	Wed Jul  9 04:54:04 2014
+++ src/sys/rump/net/lib/libsockin/sockin.c	Wed Jul  9 14:41:43 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sockin.c,v 1.47 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: sockin.c,v 1.48 2014/07/09 14:41:43 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.47 2014/07/09 04:54:04 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.48 2014/07/09 14:41:43 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -68,6 +68,7 @@ static int	sockin_do_init(void);
 static void	sockin_init(void);
 static int	sockin_attach(struct socket *, int);
 static void	sockin_detach(struct socket *);
+static int	sockin_accept(struct socket *, struct mbuf *);
 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 *);
@@ -79,6 +80,7 @@ static int	sockin_ctloutput(int op, stru
 static const struct pr_usrreqs sockin_usrreqs = {
 	.pr_attach = sockin_attach,
 	.pr_detach = sockin_detach,
+	.pr_accept = sockin_accept,
 	.pr_ioctl = sockin_ioctl,
 	.pr_stat = sockin_stat,
 	.pr_peeraddr = sockin_peeraddr,
@@ -458,6 +460,15 @@ sockin_detach(struct socket *so)
 }
 
 static int
+sockin_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	/* we do all the work in the worker thread */
+	return 0;
+}
+
+static int
 sockin_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return ENOTTY;
@@ -507,16 +518,13 @@ sockin_usrreq(struct socket *so, int req
 {
 	int error = 0;
 
+	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
 
 	switch (req) {
-	case PRU_ACCEPT:
-		/* we do all the work in the worker thread */
-		break;
-
 	case PRU_BIND:
 		error = rumpcomp_sockin_bind(SO2S(so),
 		    mtod(nam, const struct sockaddr *),

Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.51 src/sys/sys/protosw.h:1.52
--- src/sys/sys/protosw.h:1.51	Wed Jul  9 04:54:04 2014
+++ src/sys/sys/protosw.h	Wed Jul  9 14:41:43 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: protosw.h,v 1.51 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: protosw.h,v 1.52 2014/07/09 14:41:43 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -238,6 +238,7 @@ static const char * const prcorequests[]
 struct pr_usrreqs {
 	int	(*pr_attach)(struct socket *, int);
 	void	(*pr_detach)(struct socket *);
+	int	(*pr_accept)(struct socket *, struct mbuf *);
 	int	(*pr_ioctl)(struct socket *, u_long, void *, struct ifnet *);
 	int	(*pr_stat)(struct socket *, struct stat *);
 	int	(*pr_peeraddr)(struct socket *, struct mbuf *);
@@ -294,6 +295,15 @@ name##_detach_wrapper(struct socket *a)	
 	KERNEL_UNLOCK_ONE(NULL);			\
 }							\
 static int						\
+name##_accept_wrapper(struct socket *a, struct mbuf *b)	\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_accept(a, b);			\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_ioctl_wrapper(struct socket *a, u_long b,	\
     void *c, struct ifnet *d)				\
 {							\

Reply via email to