Module Name:    src
Committed By:   rtr
Date:           Sat Aug  9 05:33:01 UTC 2014

Modified Files:
        src/sys/kern: uipc_socket.c uipc_syscalls.c uipc_usrreq.c
        src/sys/miscfs/fifofs: fifo_vnops.c
        src/sys/net: if.c link_proto.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 un.h

Log Message:
split PRU_CONNECT2 & PRU_PURGEIF function out of pr_generic() usrreq
switches and put into separate functions

  - always KASSERT(solocked(so)) even if not implemented
    (for PRU_CONNECT2 only)

  - replace calls to pr_generic() with req = PRU_CONNECT2 with calls to
    pr_connect2()

  - replace calls to pr_generic() with req = PRU_PURGEIF with calls to
    pr_purgeif()

put common code from unp_connect2() (used by unp_connect() into
unp_connect1() and call out to it when needed

patch only briefly reviewed by rmind@


To generate a diff of this commit:
cvs rdiff -u -r1.233 -r1.234 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.171 -r1.172 src/sys/kern/uipc_syscalls.c
cvs rdiff -u -r1.168 -r1.169 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.76 -r1.77 src/sys/miscfs/fifofs/fifo_vnops.c
cvs rdiff -u -r1.289 -r1.290 src/sys/net/if.c
cvs rdiff -u -r1.23 -r1.24 src/sys/net/link_proto.c
cvs rdiff -u -r1.51 -r1.52 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.162 -r1.163 src/sys/net/rtsock.c
cvs rdiff -u -r1.62 -r1.63 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.39 -r1.40 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.30 -r1.31 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.32 -r1.33 src/sys/netbt/rfcomm_socket.c \
    src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.144 -r1.145 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.199 -r1.200 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.216 -r1.217 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.135 -r1.136 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.114 -r1.115 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.42 -r1.43 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.23 -r1.24 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.44 -r1.45 src/sys/netnatm/natm.c
cvs rdiff -u -r1.57 -r1.58 src/sys/rump/net/lib/libsockin/sockin.c
cvs rdiff -u -r1.59 -r1.60 src/sys/sys/protosw.h
cvs rdiff -u -r1.54 -r1.55 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/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.233 src/sys/kern/uipc_socket.c:1.234
--- src/sys/kern/uipc_socket.c:1.233	Fri Aug  8 03:05:45 2014
+++ src/sys/kern/uipc_socket.c	Sat Aug  9 05:33:00 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.233 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.234 2014/08/09 05:33:00 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.233 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.234 2014/08/09 05:33:00 rtr Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_sock_counters.h"
@@ -836,8 +836,7 @@ soconnect2(struct socket *so1, struct so
 {
 	KASSERT(solocked2(so1, so2));
 
-	return (*so1->so_proto->pr_usrreqs->pr_generic)(so1,
-	    PRU_CONNECT2, NULL, (struct mbuf *)so2, NULL, NULL);
+	return (*so1->so_proto->pr_usrreqs->pr_connect2)(so1, so2);
 }
 
 int

Index: src/sys/kern/uipc_syscalls.c
diff -u src/sys/kern/uipc_syscalls.c:1.171 src/sys/kern/uipc_syscalls.c:1.172
--- src/sys/kern/uipc_syscalls.c:1.171	Wed Jul  9 04:54:03 2014
+++ src/sys/kern/uipc_syscalls.c	Sat Aug  9 05:33:00 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_syscalls.c,v 1.171 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: uipc_syscalls.c,v 1.172 2014/08/09 05:33:00 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.171 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.172 2014/08/09 05:33:00 rtr Exp $");
 
 #include "opt_pipe.h"
 
@@ -1276,7 +1276,7 @@ pipe1(struct lwp *l, register_t *retval,
 	wf->f_data = wso;
 	retval[1] = fd;
 	solock(wso);
-	error = unp_connect2(wso, rso, PRU_CONNECT2);
+	error = unp_connect2(wso, rso);
 	sounlock(wso);
 	if (error != 0)
 		goto free4;

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.168 src/sys/kern/uipc_usrreq.c:1.169
--- src/sys/kern/uipc_usrreq.c:1.168	Fri Aug  8 03:05:45 2014
+++ src/sys/kern/uipc_usrreq.c	Sat Aug  9 05:33:00 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.168 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.169 2014/08/09 05:33:00 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.168 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.169 2014/08/09 05:33:00 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -565,8 +565,6 @@ static int
 unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
 {
-	struct unpcb *unp;
-	int error = 0;
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
@@ -574,6 +572,7 @@ unp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -585,27 +584,16 @@ unp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
 	KASSERT(solocked(so));
-	unp = sotounpcb(so);
 
-	KASSERT(!control);
-	if (unp == NULL) {
-		error = EINVAL;
-		goto release;
-	}
+	if (sotounpcb(so) == NULL)
+		return EINVAL;
 
-	switch (req) {
-	case PRU_CONNECT2:
-		error = unp_connect2(so, (struct socket *)nam, PRU_CONNECT2);
-		break;
+	panic("piusrreq");
 
-	default:
-		panic("piusrreq");
-	}
-
-release:
-	return (error);
+	return 0;
 }
 
 /*
@@ -1088,6 +1076,56 @@ unp_abort(struct socket *so)
 	return 0;
 }
 
+static int
+unp_connect1(struct socket *so, struct socket *so2)
+{
+	struct unpcb *unp = sotounpcb(so);
+	struct unpcb *unp2;
+
+	if (so2->so_type != so->so_type)
+		return EPROTOTYPE;
+
+	/*
+	 * All three sockets involved must be locked by same lock:
+	 *
+	 * local endpoint (so)
+	 * remote endpoint (so2)
+	 * queue head (so2->so_head, only if PR_CONNREQUIRED)
+	 */
+	KASSERT(solocked2(so, so2));
+	KASSERT(so->so_head == NULL);
+	if (so2->so_head != NULL) {
+		KASSERT(so2->so_lock == uipc_lock);
+		KASSERT(solocked2(so2, so2->so_head));
+	}
+
+	unp2 = sotounpcb(so2);
+	unp->unp_conn = unp2;
+	switch (so->so_type) {
+
+	case SOCK_DGRAM:
+		unp->unp_nextref = unp2->unp_refs;
+		unp2->unp_refs = unp;
+		soisconnected(so);
+		break;
+
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
+	case SOCK_STREAM:
+
+		/*
+		 * SOCK_SEQPACKET and SOCK_STREAM cases are handled by callers
+		 * which are unp_connect() or unp_connect2().
+		 */
+
+		break;
+
+	default:
+		panic("unp_connect1");
+	}
+
+	return 0;
+}
+
 int
 unp_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
 {
@@ -1182,7 +1220,38 @@ unp_connect(struct socket *so, struct mb
 		}
 		so2 = so3;
 	}
-	error = unp_connect2(so, so2, PRU_CONNECT);
+	error = unp_connect1(so, so2);
+	if (error) {
+		sounlock(so);
+		goto bad;
+	}
+	unp2 = sotounpcb(so2);
+	switch (so->so_type) {
+
+	/*
+	 * SOCK_DGRAM and default cases are handled in prior call to
+	 * unp_connect1(), do not add a default case without fixing
+	 * unp_connect1().
+	 */
+
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
+	case SOCK_STREAM:
+		unp2->unp_conn = unp;
+		if ((unp->unp_flags | unp2->unp_flags) & UNP_CONNWAIT)
+			soisconnecting(so);
+		else
+			soisconnected(so);
+		soisconnected(so2);
+		/*
+		 * If the connection is fully established, break the
+		 * association with uipc_lock and give the connected
+		 * pair a seperate lock to share.
+		 */
+		KASSERT(so2->so_head != NULL);
+		unp_setpeerlocks(so, so2);
+		break;
+
+	}
 	sounlock(so);
  bad:
 	vput(vp);
@@ -1194,64 +1263,36 @@ unp_connect(struct socket *so, struct mb
 }
 
 int
-unp_connect2(struct socket *so, struct socket *so2, int req)
+unp_connect2(struct socket *so, struct socket *so2)
 {
 	struct unpcb *unp = sotounpcb(so);
 	struct unpcb *unp2;
+	int error = 0;
 
-	if (so2->so_type != so->so_type)
-		return (EPROTOTYPE);
-
-	/*
-	 * All three sockets involved must be locked by same lock:
-	 *
-	 * local endpoint (so)
-	 * remote endpoint (so2)
-	 * queue head (so2->so_head, only if PR_CONNREQUIRED)
-	 */
 	KASSERT(solocked2(so, so2));
-	KASSERT(so->so_head == NULL);
-	if (so2->so_head != NULL) {
-		KASSERT(so2->so_lock == uipc_lock);
-		KASSERT(solocked2(so2, so2->so_head));
-	}
+
+	error = unp_connect1(so, so2);
+	if (error)
+		return error;
 
 	unp2 = sotounpcb(so2);
-	unp->unp_conn = unp2;
 	switch (so->so_type) {
 
-	case SOCK_DGRAM:
-		unp->unp_nextref = unp2->unp_refs;
-		unp2->unp_refs = unp;
-		soisconnected(so);
-		break;
+	/*
+	 * SOCK_DGRAM and default cases are handled in prior call to
+	 * unp_connect1(), do not add a default case without fixing
+	 * unp_connect1().
+	 */
 
 	case SOCK_SEQPACKET: /* FALLTHROUGH */
 	case SOCK_STREAM:
 		unp2->unp_conn = unp;
-		if (req == PRU_CONNECT &&
-		    ((unp->unp_flags | unp2->unp_flags) & UNP_CONNWAIT))
-			soisconnecting(so);
-		else
-			soisconnected(so);
+		soisconnected(so);
 		soisconnected(so2);
-		/*
-		 * If the connection is fully established, break the
-		 * association with uipc_lock and give the connected
-		 * pair a seperate lock to share.  For CONNECT2, we
-		 * require that the locks already match (the sockets
-		 * are created that way).
-		 */
-		if (req == PRU_CONNECT) {
-			KASSERT(so2->so_head != NULL);
-			unp_setpeerlocks(so, so2);
-		}
 		break;
 
-	default:
-		panic("unp_connect2");
 	}
-	return (0);
+	return error;
 }
 
 static void
@@ -1928,6 +1969,7 @@ const struct pr_usrreqs unp_usrreqs = {
 	.pr_bind	= unp_bind,
 	.pr_listen	= unp_listen,
 	.pr_connect	= unp_connect,
+	.pr_connect2	= unp_connect2,
 	.pr_disconnect	= unp_disconnect,
 	.pr_shutdown	= unp_shutdown,
 	.pr_abort	= unp_abort,

Index: src/sys/miscfs/fifofs/fifo_vnops.c
diff -u src/sys/miscfs/fifofs/fifo_vnops.c:1.76 src/sys/miscfs/fifofs/fifo_vnops.c:1.77
--- src/sys/miscfs/fifofs/fifo_vnops.c:1.76	Fri Jul 25 08:20:52 2014
+++ src/sys/miscfs/fifofs/fifo_vnops.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: fifo_vnops.c,v 1.76 2014/07/25 08:20:52 dholland Exp $	*/
+/*	$NetBSD: fifo_vnops.c,v 1.77 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.76 2014/07/25 08:20:52 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.77 2014/08/09 05:33:01 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -149,7 +149,7 @@ fifo_open(void *v)
 		}
 		fip->fi_writesock = wso;
 		solock(wso);
-		if ((error = unp_connect2(wso, rso, PRU_CONNECT2)) != 0) {
+		if ((error = unp_connect2(wso, rso)) != 0) {
 			sounlock(wso);
 			(void)soclose(wso);
 			(void)soclose(rso);

Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.289 src/sys/net/if.c:1.290
--- src/sys/net/if.c:1.289	Thu Jul 31 06:35:47 2014
+++ src/sys/net/if.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $	*/
+/*	$NetBSD: if.c,v 1.290 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.290 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_inet.h"
 
@@ -800,9 +800,7 @@ again:
 		     pr < dp->dom_protoswNPROTOSW; pr++) {
 			so.so_proto = pr;
 			if (pr->pr_usrreqs) {
-				(void) (*pr->pr_usrreqs->pr_generic)(&so,
-				    PRU_PURGEIF, NULL, NULL,
-				    (struct mbuf *) ifp, curlwp);
+				(void) (*pr->pr_usrreqs->pr_purgeif)(&so, ifp);
 				purged = 1;
 			}
 		}
@@ -852,9 +850,7 @@ again:
 		for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) {
 			so.so_proto = pr;
 			if (pr->pr_usrreqs && pr->pr_flags & PR_PURGEIF)
-				(void)(*pr->pr_usrreqs->pr_generic)(&so,
-				    PRU_PURGEIF, NULL, NULL,
-				    (struct mbuf *)ifp, curlwp);
+				(void)(*pr->pr_usrreqs->pr_purgeif)(&so, ifp);
 		}
 	}
 

Index: src/sys/net/link_proto.c
diff -u src/sys/net/link_proto.c:1.23 src/sys/net/link_proto.c:1.24
--- src/sys/net/link_proto.c:1.23	Fri Aug  8 03:05:45 2014
+++ src/sys/net/link_proto.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: link_proto.c,v 1.24 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.24 2014/08/09 05:33:01 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -54,6 +54,7 @@ static int link_accept(struct socket *, 
 static int link_bind(struct socket *, struct mbuf *, struct lwp *);
 static int link_listen(struct socket *, struct lwp *);
 static int link_connect(struct socket *, struct mbuf *, struct lwp *);
+static int link_connect2(struct socket *, struct socket *);
 static int link_disconnect(struct socket *);
 static int link_shutdown(struct socket *);
 static int link_abort(struct socket *);
@@ -66,6 +67,7 @@ static int link_recvoob(struct socket *,
 static int link_send(struct socket *, struct mbuf *, struct mbuf *,
     struct mbuf *, struct lwp *);
 static int link_sendoob(struct socket *, struct mbuf *, struct mbuf *);
+static int link_purgeif(struct socket *, struct ifnet *);
 static int link_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
     struct mbuf *, struct lwp *);
 static void link_init(void);
@@ -83,6 +85,7 @@ static const struct pr_usrreqs link_usrr
 	.pr_bind	= link_bind,
 	.pr_listen	= link_listen,
 	.pr_connect	= link_connect,
+	.pr_connect2	= link_connect2,
 	.pr_disconnect	= link_disconnect,
 	.pr_shutdown	= link_shutdown,
 	.pr_abort	= link_abort,
@@ -94,6 +97,7 @@ static const struct pr_usrreqs link_usrr
 	.pr_recvoob	= link_recvoob,
 	.pr_send	= link_send,
 	.pr_sendoob	= link_sendoob,
+	.pr_purgeif	= link_purgeif,
 	.pr_generic	= link_usrreq,
 };
 
@@ -294,6 +298,14 @@ link_connect(struct socket *so, struct m
 }
 
 static int
+link_connect2(struct socket *so, struct socket *so2)
+{
+ 	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 link_disconnect(struct socket *so)
 {
 	KASSERT(solocked(so));
@@ -381,6 +393,13 @@ link_sendoob(struct socket *so, struct m
 }
 
 static int
+link_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	return EOPNOTSUPP;
+}
+
+static int
 link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
 	struct mbuf *control, struct lwp *l)
 {
@@ -390,6 +409,7 @@ link_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -401,6 +421,7 @@ link_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
 	return EOPNOTSUPP;
 }

Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.51 src/sys/net/raw_usrreq.c:1.52
--- src/sys/net/raw_usrreq.c:1.51	Fri Aug  8 03:05:45 2014
+++ src/sys/net/raw_usrreq.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: raw_usrreq.c,v 1.52 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.52 2014/08/09 05:33:01 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -199,8 +199,6 @@ int
 raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
 {
-	struct rawcb *rp = sotorawcb(so);
-	int s, error = 0;
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
@@ -208,6 +206,7 @@ raw_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -219,33 +218,12 @@ raw_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
-	s = splsoftnet();
-	KERNEL_LOCK(1, NULL);
-
-	KASSERT(!control);
-	if (rp == NULL) {
-		error = EINVAL;
-		goto release;
-	}
-
-	switch (req) {
-	/*
-	 * If a socket isn't bound to a single address,
-	 * the raw input routine will hand it anything
-	 * within that protocol family (assuming there's
-	 * nothing else around it should go to).
-	 */
-	case PRU_CONNECT2:
-		error = EOPNOTSUPP;
-		break;
+	if (sotorawcb(so) == NULL)
+		return EINVAL;
 
-	default:
-		panic("raw_usrreq");
-	}
+	panic("raw_usrreq");
 
-release:
-	KERNEL_UNLOCK_ONE(NULL);
-	splx(s);
-	return (error);
+	return 0;
 }

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.162 src/sys/net/rtsock.c:1.163
--- src/sys/net/rtsock.c:1.162	Fri Aug  8 03:05:45 2014
+++ src/sys/net/rtsock.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.162 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.163 2014/08/09 05:33:01 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.162 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.163 2014/08/09 05:33:01 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -258,6 +258,14 @@ COMPATNAME(route_connect)(struct socket 
 }
 
 static int
+COMPATNAME(route_connect2)(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 COMPATNAME(route_disconnect)(struct socket *so)
 {
 	struct rawcb *rp = sotorawcb(so);
@@ -390,6 +398,14 @@ COMPATNAME(route_sendoob)(struct socket 
 
 	return EOPNOTSUPP;
 }
+static int
+COMPATNAME(route_purgeif)(struct socket *so, struct ifnet *ifp)
+{
+
+	panic("route_purgeif");
+
+	return EOPNOTSUPP;
+}
 
 static int
 COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m,
@@ -403,6 +419,7 @@ COMPATNAME(route_usrreq)(struct socket *
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -414,6 +431,7 @@ COMPATNAME(route_usrreq)(struct socket *
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
 	s = splsoftnet();
 	error = raw_usrreq(so, req, m, nam, control, l);
@@ -1514,6 +1532,7 @@ 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_connect2	= COMPATNAME(route_connect2_wrapper),
 	.pr_disconnect	= COMPATNAME(route_disconnect_wrapper),
 	.pr_shutdown	= COMPATNAME(route_shutdown_wrapper),
 	.pr_abort	= COMPATNAME(route_abort_wrapper),
@@ -1525,6 +1544,7 @@ static const struct pr_usrreqs route_usr
 	.pr_recvoob	= COMPATNAME(route_recvoob_wrapper),
 	.pr_send	= COMPATNAME(route_send_wrapper),
 	.pr_sendoob	= COMPATNAME(route_sendoob_wrapper),
+	.pr_purgeif	= COMPATNAME(route_purgeif_wrapper),
 	.pr_generic	= COMPATNAME(route_usrreq_wrapper),
 };
 

Index: src/sys/netatalk/ddp_usrreq.c
diff -u src/sys/netatalk/ddp_usrreq.c:1.62 src/sys/netatalk/ddp_usrreq.c:1.63
--- src/sys/netatalk/ddp_usrreq.c:1.62	Fri Aug  8 03:05:45 2014
+++ src/sys/netatalk/ddp_usrreq.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ddp_usrreq.c,v 1.62 2014/08/08 03:05:45 rtr Exp $	 */
+/*	$NetBSD: ddp_usrreq.c,v 1.63 2014/08/09 05:33:01 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.62 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.63 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -88,6 +88,7 @@ ddp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -99,15 +100,10 @@ ddp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
 	ddp = sotoddpcb(so);
 
-	if (req == PRU_PURGEIF) {
-		mutex_enter(softnet_lock);
-		at_purgeif((struct ifnet *) rights);
-		mutex_exit(softnet_lock);
-		return (0);
-	}
 	if (rights && rights->m_len) {
 		error = EINVAL;
 		goto release;
@@ -117,7 +113,6 @@ ddp_usrreq(struct socket *so, int req, s
 		goto release;
 	}
 	switch (req) {
-	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
 	case PRU_PROTORCV:
@@ -454,6 +449,14 @@ ddp_connect(struct socket *so, struct mb
 }
 
 static int
+ddp_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 ddp_disconnect(struct socket *so)
 {
 	struct ddpcb *ddp = sotoddpcb(so);
@@ -584,6 +587,17 @@ ddp_sendoob(struct socket *so, struct mb
 	return EOPNOTSUPP;
 }
 
+static int
+ddp_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	mutex_enter(softnet_lock);
+	at_purgeif(ifp);
+	mutex_exit(softnet_lock);
+
+	return 0;
+}
+
 /*
  * For the moment, this just find the pcb with the correct local address.
  * In the future, this will actually do some real searching, so we can use
@@ -661,6 +675,7 @@ PR_WRAP_USRREQS(ddp)
 #define	ddp_bind	ddp_bind_wrapper
 #define	ddp_listen	ddp_listen_wrapper
 #define	ddp_connect	ddp_connect_wrapper
+#define	ddp_connect2	ddp_connect2_wrapper
 #define	ddp_disconnect	ddp_disconnect_wrapper
 #define	ddp_shutdown	ddp_shutdown_wrapper
 #define	ddp_abort	ddp_abort_wrapper
@@ -672,6 +687,7 @@ PR_WRAP_USRREQS(ddp)
 #define	ddp_recvoob	ddp_recvoob_wrapper
 #define	ddp_send	ddp_send_wrapper
 #define	ddp_sendoob	ddp_sendoob_wrapper
+#define	ddp_purgeif	ddp_purgeif_wrapper
 #define	ddp_usrreq	ddp_usrreq_wrapper
 
 const struct pr_usrreqs ddp_usrreqs = {
@@ -681,6 +697,7 @@ const struct pr_usrreqs ddp_usrreqs = {
 	.pr_bind	= ddp_bind,
 	.pr_listen	= ddp_listen,
 	.pr_connect	= ddp_connect,
+	.pr_connect2	= ddp_connect2,
 	.pr_disconnect	= ddp_disconnect,
 	.pr_shutdown	= ddp_shutdown,
 	.pr_abort	= ddp_abort,
@@ -692,6 +709,7 @@ const struct pr_usrreqs ddp_usrreqs = {
 	.pr_recvoob	= ddp_recvoob,
 	.pr_send	= ddp_send,
 	.pr_sendoob	= ddp_sendoob,
+	.pr_purgeif	= ddp_purgeif,
 	.pr_generic	= ddp_usrreq,
 };
 

Index: src/sys/netbt/hci_socket.c
diff -u src/sys/netbt/hci_socket.c:1.39 src/sys/netbt/hci_socket.c:1.40
--- src/sys/netbt/hci_socket.c:1.39	Fri Aug  8 03:05:45 2014
+++ src/sys/netbt/hci_socket.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: hci_socket.c,v 1.40 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.40 2014/08/09 05:33:01 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -552,6 +552,14 @@ hci_connect(struct socket *so, struct mb
 }
 
 static int
+hci_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 hci_disconnect(struct socket *so)
 {
 	struct hci_pcb *pcb = so->so_pcb;
@@ -712,6 +720,13 @@ hci_sendoob(struct socket *so, struct mb
 	return EOPNOTSUPP;
 }
 
+static int
+hci_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	return EOPNOTSUPP;
+}
+
 /*
  * User Request.
  * up is socket
@@ -726,7 +741,7 @@ static int
 hci_usrreq(struct socket *up, int req, struct mbuf *m,
 		struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
 {
-	struct hci_pcb *pcb = (struct hci_pcb *)up->so_pcb;
+	struct hci_pcb *pcb = up->so_pcb;
 	int err = 0;
 
 	DPRINTFN(2, "%s\n", prurequests[req]);
@@ -736,6 +751,7 @@ hci_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -747,11 +763,7 @@ hci_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
-
-	switch(req) {
-	case PRU_PURGEIF:
-		return EOPNOTSUPP;
-	}
+	KASSERT(req != PRU_PURGEIF);
 
 	/* anything after here *requires* a pcb */
 	if (pcb == NULL) {
@@ -760,7 +772,6 @@ hci_usrreq(struct socket *up, int req, s
 	}
 
 	switch(req) {
-	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
 	case PRU_PROTORCV:
@@ -994,6 +1005,7 @@ PR_WRAP_USRREQS(hci)
 #define	hci_bind		hci_bind_wrapper
 #define	hci_listen		hci_listen_wrapper
 #define	hci_connect		hci_connect_wrapper
+#define	hci_connect2		hci_connect2_wrapper
 #define	hci_disconnect		hci_disconnect_wrapper
 #define	hci_shutdown		hci_shutdown_wrapper
 #define	hci_abort		hci_abort_wrapper
@@ -1005,6 +1017,7 @@ PR_WRAP_USRREQS(hci)
 #define	hci_recvoob		hci_recvoob_wrapper
 #define	hci_send		hci_send_wrapper
 #define	hci_sendoob		hci_sendoob_wrapper
+#define	hci_purgeif		hci_purgeif_wrapper
 #define	hci_usrreq		hci_usrreq_wrapper
 
 const struct pr_usrreqs hci_usrreqs = {
@@ -1014,6 +1027,7 @@ const struct pr_usrreqs hci_usrreqs = {
 	.pr_bind	= hci_bind,
 	.pr_listen	= hci_listen,
 	.pr_connect	= hci_connect,
+	.pr_connect2	= hci_connect2,
 	.pr_disconnect	= hci_disconnect,
 	.pr_shutdown	= hci_shutdown,
 	.pr_abort	= hci_abort,
@@ -1025,5 +1039,6 @@ const struct pr_usrreqs hci_usrreqs = {
 	.pr_recvoob	= hci_recvoob,
 	.pr_send	= hci_send,
 	.pr_sendoob	= hci_sendoob,
+	.pr_purgeif	= hci_purgeif,
 	.pr_generic	= hci_usrreq,
 };

Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.30 src/sys/netbt/l2cap_socket.c:1.31
--- src/sys/netbt/l2cap_socket.c:1.30	Fri Aug  8 03:05:45 2014
+++ src/sys/netbt/l2cap_socket.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: l2cap_socket.c,v 1.31 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.31 2014/08/09 05:33:01 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -192,6 +192,17 @@ l2cap_connect(struct socket *so, struct 
 }
 
 static int
+l2cap_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	if (so->so_pcb == NULL)
+		return EINVAL;
+
+	return EOPNOTSUPP;
+}
+
+static int
 l2cap_disconnect(struct socket *so)
 {
 	struct l2cap_channel *pcb = so->so_pcb;
@@ -346,13 +357,19 @@ l2cap_sendoob(struct socket *so, struct 
 	return EOPNOTSUPP;
 }
 
+static int
+l2cap_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	return EOPNOTSUPP;
+}
+
 /*
  * User Request.
  * up is socket
  * m is optional mbuf chain containing message
  * ctl is either
  *	optional mbuf chain containing socket options
- *	optional interface pointer PRU_PURGEIF
  * l is pointer to process requesting action (if any)
  *
  * we are responsible for disposing of m and ctl if
@@ -372,6 +389,7 @@ l2cap_usrreq(struct socket *up, int req,
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -383,11 +401,7 @@ l2cap_usrreq(struct socket *up, int req,
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
-
-	switch (req) {
-	case PRU_PURGEIF:
-		return EOPNOTSUPP;
-	}
+	KASSERT(req != PRU_PURGEIF);
 
 	if (pcb == NULL) {
 		err = EINVAL;
@@ -395,7 +409,6 @@ l2cap_usrreq(struct socket *up, int req,
 	}
 
 	switch(req) {
-	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
 	case PRU_PROTORCV:
@@ -563,6 +576,7 @@ PR_WRAP_USRREQS(l2cap)
 #define	l2cap_bind		l2cap_bind_wrapper
 #define	l2cap_listen		l2cap_listen_wrapper
 #define	l2cap_connect		l2cap_connect_wrapper
+#define	l2cap_connect2		l2cap_connect2_wrapper
 #define	l2cap_disconnect	l2cap_disconnect_wrapper
 #define	l2cap_shutdown		l2cap_shutdown_wrapper
 #define	l2cap_abort		l2cap_abort_wrapper
@@ -574,6 +588,7 @@ PR_WRAP_USRREQS(l2cap)
 #define	l2cap_recvoob		l2cap_recvoob_wrapper
 #define	l2cap_send		l2cap_send_wrapper
 #define	l2cap_sendoob		l2cap_sendoob_wrapper
+#define	l2cap_purgeif		l2cap_purgeif_wrapper
 #define	l2cap_usrreq		l2cap_usrreq_wrapper
 
 const struct pr_usrreqs l2cap_usrreqs = {
@@ -583,6 +598,7 @@ const struct pr_usrreqs l2cap_usrreqs = 
 	.pr_bind	= l2cap_bind,
 	.pr_listen	= l2cap_listen,
 	.pr_connect	= l2cap_connect,
+	.pr_connect2	= l2cap_connect2,
 	.pr_disconnect	= l2cap_disconnect,
 	.pr_shutdown	= l2cap_shutdown,
 	.pr_abort	= l2cap_abort,
@@ -594,5 +610,6 @@ const struct pr_usrreqs l2cap_usrreqs = 
 	.pr_recvoob	= l2cap_recvoob,
 	.pr_send	= l2cap_send,
 	.pr_sendoob	= l2cap_sendoob,
+	.pr_purgeif	= l2cap_purgeif,
 	.pr_generic	= l2cap_usrreq,
 };

Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.32 src/sys/netbt/rfcomm_socket.c:1.33
--- src/sys/netbt/rfcomm_socket.c:1.32	Fri Aug  8 03:05:45 2014
+++ src/sys/netbt/rfcomm_socket.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: rfcomm_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -200,6 +200,19 @@ rfcomm_connect(struct socket *so, struct
 }
 
 static int
+rfcomm_connect2(struct socket *so, struct socket *so2)
+{
+	struct rfcomm_dlc *pcb = so->so_pcb;
+
+	KASSERT(solocked(so));
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return EOPNOTSUPP;
+}
+
+static int
 rfcomm_disconnect(struct socket *so)
 {
 	struct rfcomm_dlc *pcb = so->so_pcb;
@@ -349,13 +362,19 @@ rfcomm_sendoob(struct socket *so, struct
 	return EOPNOTSUPP;
 }
 
+static int
+rfcomm_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	return EOPNOTSUPP;
+}
+
 /*
  * User Request.
  * up is socket
  * m is optional mbuf chain containing message
  * ctl is either
  *	optional mbuf chain containing socket options
- *	optional interface pointer PRU_PURGEIF
  * l is pointer to process requesting action (if any)
  *
  * we are responsible for disposing of m and ctl if
@@ -375,6 +394,7 @@ rfcomm_usrreq(struct socket *up, int req
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -386,18 +406,14 @@ rfcomm_usrreq(struct socket *up, int req
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
-	switch (req) {
-	case PRU_PURGEIF:
-		return EOPNOTSUPP;
-	}
 	if (pcb == NULL) {
 		err = EINVAL;
 		goto release;
 	}
 
 	switch(req) {
-	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
 	case PRU_PROTORCV:
@@ -577,6 +593,7 @@ PR_WRAP_USRREQS(rfcomm)
 #define	rfcomm_bind		rfcomm_bind_wrapper
 #define	rfcomm_listen		rfcomm_listen_wrapper
 #define	rfcomm_connect		rfcomm_connect_wrapper
+#define	rfcomm_connect2		rfcomm_connect2_wrapper
 #define	rfcomm_disconnect	rfcomm_disconnect_wrapper
 #define	rfcomm_shutdown		rfcomm_shutdown_wrapper
 #define	rfcomm_abort		rfcomm_abort_wrapper
@@ -588,6 +605,7 @@ PR_WRAP_USRREQS(rfcomm)
 #define	rfcomm_recvoob		rfcomm_recvoob_wrapper
 #define	rfcomm_send		rfcomm_send_wrapper
 #define	rfcomm_sendoob		rfcomm_sendoob_wrapper
+#define	rfcomm_purgeif		rfcomm_purgeif_wrapper
 #define	rfcomm_usrreq		rfcomm_usrreq_wrapper
 
 const struct pr_usrreqs rfcomm_usrreqs = {
@@ -597,6 +615,7 @@ const struct pr_usrreqs rfcomm_usrreqs =
 	.pr_bind	= rfcomm_bind,
 	.pr_listen	= rfcomm_listen,
 	.pr_connect	= rfcomm_connect,
+	.pr_connect2	= rfcomm_connect2,
 	.pr_disconnect	= rfcomm_disconnect,
 	.pr_shutdown	= rfcomm_shutdown,
 	.pr_abort	= rfcomm_abort,
@@ -608,5 +627,6 @@ const struct pr_usrreqs rfcomm_usrreqs =
 	.pr_recvoob	= rfcomm_recvoob,
 	.pr_send	= rfcomm_send,
 	.pr_sendoob	= rfcomm_sendoob,
+	.pr_purgeif	= rfcomm_purgeif,
 	.pr_generic	= rfcomm_usrreq,
 };
Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.32 src/sys/netbt/sco_socket.c:1.33
--- src/sys/netbt/sco_socket.c:1.32	Fri Aug  8 03:05:45 2014
+++ src/sys/netbt/sco_socket.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: sco_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -183,6 +183,19 @@ sco_connect(struct socket *so, struct mb
 }
 
 static int
+sco_connect2(struct socket *so, struct socket *so2)
+{
+	struct sco_pcb *pcb = so->so_pcb;
+
+	KASSERT(solocked(so));
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return EOPNOTSUPP;
+}
+
+static int
 sco_disconnect(struct socket *so)
 {
 	struct sco_pcb *pcb = so->so_pcb;
@@ -335,6 +348,13 @@ sco_sendoob(struct socket *so, struct mb
 	return EOPNOTSUPP;
 }
 
+static int
+sco_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	return EOPNOTSUPP;
+}
+
 /*
  * User Request.
  * up is socket
@@ -350,7 +370,7 @@ static int
 sco_usrreq(struct socket *up, int req, struct mbuf *m,
     struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
 {
-	struct sco_pcb *pcb = (struct sco_pcb *)up->so_pcb;
+	struct sco_pcb *pcb = up->so_pcb;
 	int err = 0;
 
 	DPRINTFN(2, "%s\n", prurequests[req]);
@@ -360,6 +380,7 @@ sco_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -371,11 +392,7 @@ sco_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
-
-	switch(req) {
-	case PRU_PURGEIF:
-		return EOPNOTSUPP;
-	}
+	KASSERT(req != PRU_PURGEIF);
 
 	/* anything after here *requires* a pcb */
 	if (pcb == NULL) {
@@ -384,7 +401,6 @@ sco_usrreq(struct socket *up, int req, s
 	}
 
 	switch(req) {
-	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
 	case PRU_PROTORCV:
@@ -531,6 +547,7 @@ PR_WRAP_USRREQS(sco)
 #define	sco_bind		sco_bind_wrapper
 #define	sco_listen		sco_listen_wrapper
 #define	sco_connect		sco_connect_wrapper
+#define	sco_connect2		sco_connect2_wrapper
 #define	sco_disconnect		sco_disconnect_wrapper
 #define	sco_shutdown		sco_shutdown_wrapper
 #define	sco_abort		sco_abort_wrapper
@@ -542,6 +559,7 @@ PR_WRAP_USRREQS(sco)
 #define	sco_recvoob		sco_recvoob_wrapper
 #define	sco_send		sco_send_wrapper
 #define	sco_sendoob		sco_sendoob_wrapper
+#define	sco_purgeif		sco_purgeif_wrapper
 #define	sco_usrreq		sco_usrreq_wrapper
 
 const struct pr_usrreqs sco_usrreqs = {
@@ -551,6 +569,7 @@ const struct pr_usrreqs sco_usrreqs = {
 	.pr_bind	= sco_bind,
 	.pr_listen	= sco_listen,
 	.pr_connect	= sco_connect,
+	.pr_connect2	= sco_connect2,
 	.pr_disconnect	= sco_disconnect,
 	.pr_shutdown	= sco_shutdown,
 	.pr_abort	= sco_abort,
@@ -562,5 +581,6 @@ const struct pr_usrreqs sco_usrreqs = {
 	.pr_recvoob	= sco_recvoob,
 	.pr_send	= sco_send,
 	.pr_sendoob	= sco_sendoob,
+	.pr_purgeif	= sco_purgeif,
 	.pr_generic	= sco_usrreq,
 };

Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.144 src/sys/netinet/raw_ip.c:1.145
--- src/sys/netinet/raw_ip.c:1.144	Fri Aug  8 03:05:45 2014
+++ src/sys/netinet/raw_ip.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip.c,v 1.144 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: raw_ip.c,v 1.145 2014/08/09 05:33:01 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.144 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.145 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -624,6 +624,14 @@ rip_connect(struct socket *so, struct mb
 }
 
 static int
+rip_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 rip_disconnect(struct socket *so)
 {
 	struct inpcb *inp = sotoinpcb(so);
@@ -790,19 +798,33 @@ rip_sendoob(struct socket *so, struct mb
 	return EOPNOTSUPP;
 }
 
+static int
+rip_purgeif(struct socket *so, struct ifnet *ifp)
+{
+	int s;
+
+	s = splsoftnet();
+	mutex_enter(softnet_lock);
+	in_pcbpurgeif0(&rawcbtable, ifp);
+	in_purgeif(ifp);
+	in_pcbpurgeif(&rawcbtable, ifp);
+	mutex_exit(softnet_lock);
+	splx(s);
+
+	return 0;
+}
+
 int
 rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
 {
-	struct inpcb *inp;
-	int s, error = 0;
-
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -814,39 +836,16 @@ rip_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
-
-	s = splsoftnet();
-	if (req == PRU_PURGEIF) {
-		mutex_enter(softnet_lock);
-		in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control);
-		in_purgeif((struct ifnet *)control);
-		in_pcbpurgeif(&rawcbtable, (struct ifnet *)control);
-		mutex_exit(softnet_lock);
-		splx(s);
-		return 0;
-	}
+	KASSERT(req != PRU_PURGEIF);
 
 	KASSERT(solocked(so));
-	inp = sotoinpcb(so);
 
-	KASSERT(!control);
-	if (inp == NULL) {
-		splx(s);
+	if (sotoinpcb(so) == NULL)
 		return EINVAL;
-	}
 
-	switch (req) {
+	panic("rip_usrreq");
 
-	case PRU_CONNECT2:
-		error = EOPNOTSUPP;
-		break;
-
-	default:
-		panic("rip_usrreq");
-	}
-	splx(s);
-
-	return error;
+	return 0;
 }
 
 PR_WRAP_USRREQS(rip)
@@ -856,6 +855,7 @@ PR_WRAP_USRREQS(rip)
 #define	rip_bind	rip_bind_wrapper
 #define	rip_listen	rip_listen_wrapper
 #define	rip_connect	rip_connect_wrapper
+#define	rip_connect2	rip_connect2_wrapper
 #define	rip_disconnect	rip_disconnect_wrapper
 #define	rip_shutdown	rip_shutdown_wrapper
 #define	rip_abort	rip_abort_wrapper
@@ -867,6 +867,7 @@ PR_WRAP_USRREQS(rip)
 #define	rip_recvoob	rip_recvoob_wrapper
 #define	rip_send	rip_send_wrapper
 #define	rip_sendoob	rip_sendoob_wrapper
+#define	rip_purgeif	rip_purgeif_wrapper
 #define	rip_usrreq	rip_usrreq_wrapper
 
 const struct pr_usrreqs rip_usrreqs = {
@@ -876,6 +877,7 @@ const struct pr_usrreqs rip_usrreqs = {
 	.pr_bind	= rip_bind,
 	.pr_listen	= rip_listen,
 	.pr_connect	= rip_connect,
+	.pr_connect2	= rip_connect2,
 	.pr_disconnect	= rip_disconnect,
 	.pr_shutdown	= rip_shutdown,
 	.pr_abort	= rip_abort,
@@ -887,6 +889,7 @@ const struct pr_usrreqs rip_usrreqs = {
 	.pr_recvoob	= rip_recvoob,
 	.pr_send	= rip_send,
 	.pr_sendoob	= rip_sendoob,
+	.pr_purgeif	= rip_purgeif,
 	.pr_generic	= rip_usrreq,
 };
 

Index: src/sys/netinet/tcp_usrreq.c
diff -u src/sys/netinet/tcp_usrreq.c:1.199 src/sys/netinet/tcp_usrreq.c:1.200
--- src/sys/netinet/tcp_usrreq.c:1.199	Fri Aug  8 03:05:45 2014
+++ src/sys/netinet/tcp_usrreq.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.199 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.200 2014/08/09 05:33:01 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.199 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.200 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -224,19 +224,13 @@ static int
 tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
 {
-	struct inpcb *inp = NULL;
-	struct in6pcb *in6p = NULL;
-	struct tcpcb *tp = NULL;
-	int s;
-	int error = 0;
-	int ostate = 0;
-
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -248,65 +242,13 @@ tcp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
-	s = splsoftnet();
-
-	if (req == PRU_PURGEIF) {
-		mutex_enter(softnet_lock);
-		switch (so->so_proto->pr_domain->dom_family) {
-#ifdef INET
-		case PF_INET:
-			in_pcbpurgeif0(&tcbtable, (struct ifnet *)control);
-			in_purgeif((struct ifnet *)control);
-			in_pcbpurgeif(&tcbtable, (struct ifnet *)control);
-			break;
-#endif
-#ifdef INET6
-		case PF_INET6:
-			in6_pcbpurgeif0(&tcbtable, (struct ifnet *)control);
-			in6_purgeif((struct ifnet *)control);
-			in6_pcbpurgeif(&tcbtable, (struct ifnet *)control);
-			break;
-#endif
-		default:
-			mutex_exit(softnet_lock);
-			splx(s);
-			return (EAFNOSUPPORT);
-		}
-		mutex_exit(softnet_lock);
-		splx(s);
-		return (0);
-	}
-
-	if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) {
-		splx(s);
-		return error;
-	}
-
-	ostate = tcp_debug_capture(tp, req);
-
-	KASSERT(!control);
-#ifdef INET6
-	/* XXX: KASSERT((inp != NULL) ^ (in6p != NULL)); */
-#endif
-
-	switch (req) {
-
-	/*
-	 * Create a TCP connection between two sockets.
-	 */
-	case PRU_CONNECT2:
-		error = EOPNOTSUPP;
-		break;
-
-	default:
-		panic("tcp_usrreq");
-	}
+	KASSERT(solocked(so));
 
-	tcp_debug_trace(so, tp, ostate, req);
-	splx(s);
+	panic("tcp_usrreq");
 
-	return error;
+	return 0;
 }
 
 static void
@@ -879,6 +821,27 @@ release:
 }
 
 static int
+tcp_connect2(struct socket *so, struct socket *so2)
+{
+	struct inpcb *inp = NULL;
+	struct in6pcb *in6p = NULL;
+	struct tcpcb *tp = NULL;
+	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_CONNECT2);
+
+	tcp_debug_trace(so, tp, ostate, PRU_CONNECT2);
+
+	return EOPNOTSUPP;
+}
+
+static int
 tcp_disconnect(struct socket *so)
 {
 	struct inpcb *inp = NULL;
@@ -1203,6 +1166,39 @@ tcp_sendoob(struct socket *so, struct mb
 	return error;
 }
 
+static int
+tcp_purgeif(struct socket *so, struct ifnet *ifp)
+{
+	int s;
+
+	s = splsoftnet();
+	mutex_enter(softnet_lock);
+	switch (so->so_proto->pr_domain->dom_family) {
+#ifdef INET
+	case PF_INET:
+		in_pcbpurgeif0(&tcbtable, ifp);
+		in_purgeif(ifp);
+		in_pcbpurgeif(&tcbtable, ifp);
+		break;
+#endif
+#ifdef INET6
+	case PF_INET6:
+		in6_pcbpurgeif0(&tcbtable, ifp);
+		in6_purgeif(ifp);
+		in6_pcbpurgeif(&tcbtable, ifp);
+		break;
+#endif
+	default:
+		mutex_exit(softnet_lock);
+		splx(s);
+		return EAFNOSUPPORT;
+	}
+	mutex_exit(softnet_lock);
+	splx(s);
+
+	return 0;
+}
+
 /*
  * Initiate (or continue) disconnect.
  * If embryonic state, just send reset (once).
@@ -2443,6 +2439,7 @@ PR_WRAP_USRREQS(tcp)
 #define	tcp_bind	tcp_bind_wrapper
 #define	tcp_listen	tcp_listen_wrapper
 #define	tcp_connect	tcp_connect_wrapper
+#define	tcp_connect2	tcp_connect2_wrapper
 #define	tcp_disconnect	tcp_disconnect_wrapper
 #define	tcp_shutdown	tcp_shutdown_wrapper
 #define	tcp_abort	tcp_abort_wrapper
@@ -2454,6 +2451,7 @@ PR_WRAP_USRREQS(tcp)
 #define	tcp_recvoob	tcp_recvoob_wrapper
 #define	tcp_send	tcp_send_wrapper
 #define	tcp_sendoob	tcp_sendoob_wrapper
+#define	tcp_purgeif	tcp_purgeif_wrapper
 #define	tcp_usrreq	tcp_usrreq_wrapper
 
 const struct pr_usrreqs tcp_usrreqs = {
@@ -2463,6 +2461,7 @@ const struct pr_usrreqs tcp_usrreqs = {
 	.pr_bind	= tcp_bind,
 	.pr_listen	= tcp_listen,
 	.pr_connect	= tcp_connect,
+	.pr_connect2	= tcp_connect2,
 	.pr_disconnect	= tcp_disconnect,
 	.pr_shutdown	= tcp_shutdown,
 	.pr_abort	= tcp_abort,
@@ -2474,5 +2473,6 @@ const struct pr_usrreqs tcp_usrreqs = {
 	.pr_recvoob	= tcp_recvoob,
 	.pr_send	= tcp_send,
 	.pr_sendoob	= tcp_sendoob,
+	.pr_purgeif	= tcp_purgeif,
 	.pr_generic	= tcp_usrreq,
 };

Index: src/sys/netinet/udp_usrreq.c
diff -u src/sys/netinet/udp_usrreq.c:1.216 src/sys/netinet/udp_usrreq.c:1.217
--- src/sys/netinet/udp_usrreq.c:1.216	Fri Aug  8 03:05:45 2014
+++ src/sys/netinet/udp_usrreq.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.216 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.217 2014/08/09 05:33:01 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.216 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.217 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -950,6 +950,14 @@ udp_connect(struct socket *so, struct mb
 }
 
 static int
+udp_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 udp_disconnect(struct socket *so)
 {
 	struct inpcb *inp = sotoinpcb(so);
@@ -1120,18 +1128,32 @@ udp_sendoob(struct socket *so, struct mb
 }
 
 static int
+udp_purgeif(struct socket *so, struct ifnet *ifp)
+{
+	int s;
+
+	s = splsoftnet();
+	mutex_enter(softnet_lock);
+	in_pcbpurgeif0(&udbtable, ifp);
+	in_purgeif(ifp);
+	in_pcbpurgeif(&udbtable, ifp);
+	mutex_exit(softnet_lock);
+	splx(s);
+
+	return 0;
+}
+
+static int
 udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
 {
-	struct inpcb *inp;
-	int s, error = 0;
-
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -1143,42 +1165,16 @@ udp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
-
-	s = splsoftnet();
-	if (req == PRU_PURGEIF) {
-		mutex_enter(softnet_lock);
-		in_pcbpurgeif0(&udbtable, (struct ifnet *)control);
-		in_purgeif((struct ifnet *)control);
-		in_pcbpurgeif(&udbtable, (struct ifnet *)control);
-		mutex_exit(softnet_lock);
-		splx(s);
-		return 0;
-	}
+	KASSERT(req != PRU_PURGEIF);
 
 	KASSERT(solocked(so));
-	inp = sotoinpcb(so);
 
-	KASSERT(!control);
-	if (inp == NULL) {
-		splx(s);
+	if (sotoinpcb(so) == NULL)
 		return EINVAL;
-	}
 
-	/*
-	 * Note: need to block udp_input while changing
-	 * the udp pcb queue and/or pcb addresses.
-	 */
-	switch (req) {
-	case PRU_CONNECT2:
-		error = EOPNOTSUPP;
-		break;
-
-	default:
-		panic("udp_usrreq");
-	}
-	splx(s);
+	panic("udp_usrreq");
 
-	return error;
+	return 0;
 }
 
 static int
@@ -1405,6 +1401,7 @@ PR_WRAP_USRREQS(udp)
 #define	udp_bind	udp_bind_wrapper
 #define	udp_listen	udp_listen_wrapper
 #define	udp_connect	udp_connect_wrapper
+#define	udp_connect2	udp_connect2_wrapper
 #define	udp_disconnect	udp_disconnect_wrapper
 #define	udp_shutdown	udp_shutdown_wrapper
 #define	udp_abort	udp_abort_wrapper
@@ -1416,6 +1413,7 @@ PR_WRAP_USRREQS(udp)
 #define	udp_recvoob	udp_recvoob_wrapper
 #define	udp_send	udp_send_wrapper
 #define	udp_sendoob	udp_sendoob_wrapper
+#define	udp_purgeif	udp_purgeif_wrapper
 #define	udp_usrreq	udp_usrreq_wrapper
 
 const struct pr_usrreqs udp_usrreqs = {
@@ -1425,6 +1423,7 @@ const struct pr_usrreqs udp_usrreqs = {
 	.pr_bind	= udp_bind,
 	.pr_listen	= udp_listen,
 	.pr_connect	= udp_connect,
+	.pr_connect2	= udp_connect2,
 	.pr_disconnect	= udp_disconnect,
 	.pr_shutdown	= udp_shutdown,
 	.pr_abort	= udp_abort,
@@ -1436,5 +1435,6 @@ const struct pr_usrreqs udp_usrreqs = {
 	.pr_recvoob	= udp_recvoob,
 	.pr_send	= udp_send,
 	.pr_sendoob	= udp_sendoob,
+	.pr_purgeif	= udp_purgeif,
 	.pr_generic	= udp_usrreq,
 };

Index: src/sys/netinet6/raw_ip6.c
diff -u src/sys/netinet6/raw_ip6.c:1.135 src/sys/netinet6/raw_ip6.c:1.136
--- src/sys/netinet6/raw_ip6.c:1.135	Fri Aug  8 03:05:45 2014
+++ src/sys/netinet6/raw_ip6.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.135 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.136 2014/08/09 05:33:01 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.135 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.136 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -755,6 +755,14 @@ rip6_connect(struct socket *so, struct m
 }
 
 static int
+rip6_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 rip6_disconnect(struct socket *so)
 {
 	struct in6pcb *in6p = sotoin6pcb(so);
@@ -911,16 +919,29 @@ rip6_sendoob(struct socket *so, struct m
 	return EOPNOTSUPP;
 }
 
+static int
+rip6_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	mutex_enter(softnet_lock);
+	in6_pcbpurgeif0(&raw6cbtable, ifp);
+	in6_purgeif(ifp);
+	in6_pcbpurgeif(&raw6cbtable, ifp);
+	mutex_exit(softnet_lock);
+
+	return 0;
+}
+
 int
 rip6_usrreq(struct socket *so, int req, struct mbuf *m, 
 	struct mbuf *nam, struct mbuf *control, struct lwp *l)
 {
-	int error = 0;
 
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -931,28 +952,12 @@ rip6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
+	KASSERT(req != PRU_PURGEIF);
 	KASSERT(req != PRU_SENDOOB);
 
-	if (req == PRU_PURGEIF) {
-		mutex_enter(softnet_lock);
-		in6_pcbpurgeif0(&raw6cbtable, (struct ifnet *)control);
-		in6_purgeif((struct ifnet *)control);
-		in6_pcbpurgeif(&raw6cbtable, (struct ifnet *)control);
-		mutex_exit(softnet_lock);
-		return 0;
-	}
-
-	switch (req) {
-	case PRU_CONNECT2:
-		error = EOPNOTSUPP;
-		break;
+	panic("rip6_usrreq");
 
-	default:
-		panic("rip6_usrreq");
-	}
-	if (m != NULL)
-		m_freem(m);
-	return error;
+	return 0;
 }
 
 static int
@@ -1001,6 +1006,7 @@ PR_WRAP_USRREQS(rip6)
 #define	rip6_bind		rip6_bind_wrapper
 #define	rip6_listen		rip6_listen_wrapper
 #define	rip6_connect		rip6_connect_wrapper
+#define	rip6_connect2		rip6_connect2_wrapper
 #define	rip6_disconnect		rip6_disconnect_wrapper
 #define	rip6_shutdown		rip6_shutdown_wrapper
 #define	rip6_abort		rip6_abort_wrapper
@@ -1012,6 +1018,7 @@ PR_WRAP_USRREQS(rip6)
 #define	rip6_recvoob		rip6_recvoob_wrapper
 #define	rip6_send		rip6_send_wrapper
 #define	rip6_sendoob		rip6_sendoob_wrapper
+#define	rip6_purgeif		rip6_purgeif_wrapper
 #define	rip6_usrreq		rip6_usrreq_wrapper
 
 const struct pr_usrreqs rip6_usrreqs = {
@@ -1021,6 +1028,7 @@ const struct pr_usrreqs rip6_usrreqs = {
 	.pr_bind	= rip6_bind,
 	.pr_listen	= rip6_listen,
 	.pr_connect	= rip6_connect,
+	.pr_connect2	= rip6_connect2,
 	.pr_disconnect	= rip6_disconnect,
 	.pr_shutdown	= rip6_shutdown,
 	.pr_abort	= rip6_abort,
@@ -1032,5 +1040,6 @@ const struct pr_usrreqs rip6_usrreqs = {
 	.pr_recvoob	= rip6_recvoob,
 	.pr_send	= rip6_send,
 	.pr_sendoob	= rip6_sendoob,
+	.pr_purgeif	= rip6_purgeif,
 	.pr_generic	= rip6_usrreq,
 };

Index: src/sys/netinet6/udp6_usrreq.c
diff -u src/sys/netinet6/udp6_usrreq.c:1.114 src/sys/netinet6/udp6_usrreq.c:1.115
--- src/sys/netinet6/udp6_usrreq.c:1.114	Fri Aug  8 03:05:45 2014
+++ src/sys/netinet6/udp6_usrreq.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp6_usrreq.c,v 1.114 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: udp6_usrreq.c,v 1.115 2014/08/09 05:33:01 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.114 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.115 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_csum.h"
@@ -731,6 +731,14 @@ udp6_connect(struct socket *so, struct m
 }
 
 static int
+udp6_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 udp6_disconnect(struct socket *so)
 {
 	struct in6pcb *in6p = sotoin6pcb(so);
@@ -875,11 +883,23 @@ udp6_sendoob(struct socket *so, struct m
 	return EOPNOTSUPP;
 }
 
+static int
+udp6_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	mutex_enter(softnet_lock);
+	in6_pcbpurgeif0(&udbtable, ifp);
+	in6_purgeif(ifp);
+	in6_pcbpurgeif(&udbtable, ifp);
+	mutex_exit(softnet_lock);
+
+	return 0;
+}
+
 int
 udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6,
     struct mbuf *control, struct lwp *l)
 {
-	struct in6pcb *in6p = sotoin6pcb(so);
 	int error = 0;
 
 	KASSERT(req != PRU_ATTACH);
@@ -888,6 +908,7 @@ udp6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -899,22 +920,14 @@ udp6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
-	if (req == PRU_PURGEIF) {
-		mutex_enter(softnet_lock);
-		in6_pcbpurgeif0(&udbtable, (struct ifnet *)control);
-		in6_purgeif((struct ifnet *)control);
-		in6_pcbpurgeif(&udbtable, (struct ifnet *)control);
-		mutex_exit(softnet_lock);
-		return 0;
-	}
-	if (in6p == NULL) {
+	if (sotoin6pcb(so) == NULL) {
 		error = EINVAL;
 		goto release;
 	}
 
 	switch (req) {
-	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
 	case PRU_PROTORCV:
@@ -1009,6 +1022,7 @@ PR_WRAP_USRREQS(udp6)
 #define	udp6_bind	udp6_bind_wrapper
 #define	udp6_listen	udp6_listen_wrapper
 #define	udp6_connect	udp6_connect_wrapper
+#define	udp6_connect2	udp6_connect2_wrapper
 #define	udp6_disconnect	udp6_disconnect_wrapper
 #define	udp6_shutdown	udp6_shutdown_wrapper
 #define	udp6_abort	udp6_abort_wrapper
@@ -1020,6 +1034,7 @@ PR_WRAP_USRREQS(udp6)
 #define	udp6_recvoob	udp6_recvoob_wrapper
 #define	udp6_send	udp6_send_wrapper
 #define	udp6_sendoob	udp6_sendoob_wrapper
+#define	udp6_purgeif	udp6_purgeif_wrapper
 #define	udp6_usrreq	udp6_usrreq_wrapper
 
 const struct pr_usrreqs udp6_usrreqs = {
@@ -1029,6 +1044,7 @@ const struct pr_usrreqs udp6_usrreqs = {
 	.pr_bind	= udp6_bind,
 	.pr_listen	= udp6_listen,
 	.pr_connect	= udp6_connect,
+	.pr_connect2	= udp6_connect2,
 	.pr_disconnect	= udp6_disconnect,
 	.pr_shutdown	= udp6_shutdown,
 	.pr_abort	= udp6_abort,
@@ -1040,5 +1056,6 @@ const struct pr_usrreqs udp6_usrreqs = {
 	.pr_recvoob	= udp6_recvoob,
 	.pr_send	= udp6_send,
 	.pr_sendoob	= udp6_sendoob,
+	.pr_purgeif	= udp6_purgeif,
 	.pr_generic	= udp6_usrreq,
 };

Index: src/sys/netipsec/keysock.c
diff -u src/sys/netipsec/keysock.c:1.42 src/sys/netipsec/keysock.c:1.43
--- src/sys/netipsec/keysock.c:1.42	Fri Aug  8 03:05:45 2014
+++ src/sys/netipsec/keysock.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.42 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: keysock.c,v 1.43 2014/08/09 05:33:01 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.42 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.43 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -519,6 +519,14 @@ key_connect(struct socket *so, struct mb
 }
 
 static int
+key_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 key_disconnect(struct socket *so)
 {
 	struct rawcb *rp = sotorawcb(so);
@@ -651,6 +659,15 @@ key_sendoob(struct socket *so, struct mb
 	return EOPNOTSUPP;
 }
 
+static int
+key_purgeif(struct socket *so, struct ifnet *ifa)
+{
+
+	panic("key_purgeif");
+
+	return EOPNOTSUPP;
+}
+
 /*
  * key_usrreq()
  * derived from net/rtsock.c:route_usrreq()
@@ -667,6 +684,7 @@ key_usrreq(struct socket *so, int req,st
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -678,6 +696,7 @@ key_usrreq(struct socket *so, int req,st
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
 	s = splsoftnet();
 	error = raw_usrreq(so, req, m, nam, control, l);
@@ -700,6 +719,7 @@ PR_WRAP_USRREQS(key)
 #define	key_bind	key_bind_wrapper
 #define	key_listen	key_listen_wrapper
 #define	key_connect	key_connect_wrapper
+#define	key_connect2	key_connect2_wrapper
 #define	key_disconnect	key_disconnect_wrapper
 #define	key_shutdown	key_shutdown_wrapper
 #define	key_abort	key_abort_wrapper
@@ -711,6 +731,7 @@ PR_WRAP_USRREQS(key)
 #define	key_recvoob	key_recvoob_wrapper
 #define	key_send	key_send_wrapper
 #define	key_sendoob	key_sendoob_wrapper
+#define	key_purgeif	key_purgeif_wrapper
 #define	key_usrreq	key_usrreq_wrapper
 
 const struct pr_usrreqs key_usrreqs = {
@@ -720,6 +741,7 @@ const struct pr_usrreqs key_usrreqs = {
 	.pr_bind	= key_bind,
 	.pr_listen	= key_listen,
 	.pr_connect	= key_connect,
+	.pr_connect2	= key_connect2,
 	.pr_disconnect	= key_disconnect,
 	.pr_shutdown	= key_shutdown,
 	.pr_abort	= key_abort,
@@ -731,6 +753,7 @@ const struct pr_usrreqs key_usrreqs = {
 	.pr_recvoob	= key_recvoob,
 	.pr_send	= key_send,
 	.pr_sendoob	= key_sendoob,
+	.pr_purgeif	= key_purgeif,
 	.pr_generic	= key_usrreq,
 };
 

Index: src/sys/netmpls/mpls_proto.c
diff -u src/sys/netmpls/mpls_proto.c:1.23 src/sys/netmpls/mpls_proto.c:1.24
--- src/sys/netmpls/mpls_proto.c:1.23	Fri Aug  8 03:05:45 2014
+++ src/sys/netmpls/mpls_proto.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $ */
+/*	$NetBSD: mpls_proto.c,v 1.24 2014/08/09 05:33:01 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.23 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.24 2014/08/09 05:33:01 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_mbuftrace.h"
@@ -127,6 +127,14 @@ mpls_connect(struct socket *so, struct m
 }
 
 static int
+mpls_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 mpls_disconnect(struct socket *so)
 {
 	KASSERT(solocked(so));
@@ -214,16 +222,23 @@ mpls_sendoob(struct socket *so, struct m
 }
 
 static int
+mpls_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	return EOPNOTSUPP;
+}
+
+static int
 mpls_usrreq(struct socket *so, int req, struct mbuf *m,
     struct mbuf *nam, struct mbuf *control, struct lwp *l)
 {
-
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -235,6 +250,7 @@ mpls_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
 	return EOPNOTSUPP;
 }
@@ -327,6 +343,7 @@ PR_WRAP_USRREQS(mpls)
 #define	mpls_bind	mpls_bind_wrapper
 #define	mpls_listen	mpls_listen_wrapper
 #define	mpls_connect	mpls_connect_wrapper
+#define	mpls_connect2	mpls_connect2_wrapper
 #define	mpls_disconnect	mpls_disconnect_wrapper
 #define	mpls_shutdown	mpls_shutdown_wrapper
 #define	mpls_abort	mpls_abort_wrapper
@@ -338,6 +355,7 @@ PR_WRAP_USRREQS(mpls)
 #define	mpls_recvoob	mpls_recvoob_wrapper
 #define	mpls_send	mpls_send_wrapper
 #define	mpls_sendoob	mpls_sendoob_wrapper
+#define	mpls_purgeif	mpls_purgeif_wrapper
 #define	mpls_usrreq	mpls_usrreq_wrapper
 
 static const struct pr_usrreqs mpls_usrreqs = {
@@ -347,6 +365,7 @@ static const struct pr_usrreqs mpls_usrr
 	.pr_bind	= mpls_bind,
 	.pr_listen	= mpls_listen,
 	.pr_connect	= mpls_connect,
+	.pr_connect2	= mpls_connect2,
 	.pr_disconnect	= mpls_disconnect,
 	.pr_shutdown	= mpls_shutdown,
 	.pr_abort	= mpls_abort,
@@ -358,6 +377,7 @@ static const struct pr_usrreqs mpls_usrr
 	.pr_recvoob	= mpls_recvoob,
 	.pr_send	= mpls_send,
 	.pr_sendoob	= mpls_sendoob,
+	.pr_purgeif	= mpls_purgeif,
 	.pr_generic	= mpls_usrreq,
 };
 

Index: src/sys/netnatm/natm.c
diff -u src/sys/netnatm/natm.c:1.44 src/sys/netnatm/natm.c:1.45
--- src/sys/netnatm/natm.c:1.44	Fri Aug  8 03:05:45 2014
+++ src/sys/netnatm/natm.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: natm.c,v 1.44 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: natm.c,v 1.45 2014/08/09 05:33:01 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.44 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.45 2014/08/09 05:33:01 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -190,6 +190,14 @@ natm_connect(struct socket *so, struct m
 }
 
 static int
+natm_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 natm_disconnect(struct socket *so)
 {
 	struct natmpcb *npcb = (struct natmpcb *)so->so_pcb;
@@ -409,9 +417,16 @@ natm_send(struct socket *so, struct mbuf
 static int
 natm_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
 {
-  KASSERT(solocked(so));
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
 
-  return EOPNOTSUPP;
+static int
+natm_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	return EOPNOTSUPP;
 }
 
 /*
@@ -436,6 +451,7 @@ natm_usrreq(struct socket *so, int req, 
   KASSERT(req != PRU_BIND);
   KASSERT(req != PRU_LISTEN);
   KASSERT(req != PRU_CONNECT);
+  KASSERT(req != PRU_CONNECT2);
   KASSERT(req != PRU_DISCONNECT);
   KASSERT(req != PRU_SHUTDOWN);
   KASSERT(req != PRU_ABORT);
@@ -447,18 +463,12 @@ natm_usrreq(struct socket *so, int req, 
   KASSERT(req != PRU_RCVOOB);
   KASSERT(req != PRU_SEND);
   KASSERT(req != PRU_SENDOOB);
+  KASSERT(req != PRU_PURGEIF);
 
-  s = SPLSOFTNET();
-
-  npcb = (struct natmpcb *) so->so_pcb;
-
-  if (npcb == NULL) {
-    error = EINVAL;
-    goto done;
-  }
+  if (so->so_pcb == NULL)
+	return EINVAL;
 
   switch (req) {
-    case PRU_CONNECT2:			/* connect two sockets */
     case PRU_FASTTIMO:			/* 200ms timeout */
     case PRU_SLOWTIMO:			/* 500ms timeout */
     case PRU_PROTORCV:			/* receive from below */
@@ -473,8 +483,7 @@ natm_usrreq(struct socket *so, int req, 
   }
 
 done:
-  splx(s);
-  return(error);
+  return error;
 }
 
 /*
@@ -562,6 +571,7 @@ PR_WRAP_USRREQS(natm)
 #define	natm_bind	natm_bind_wrapper
 #define	natm_listen	natm_listen_wrapper
 #define	natm_connect	natm_connect_wrapper
+#define	natm_connect2	natm_connect2_wrapper
 #define	natm_disconnect	natm_disconnect_wrapper
 #define	natm_shutdown	natm_shutdown_wrapper
 #define	natm_abort	natm_abort_wrapper
@@ -573,6 +583,7 @@ PR_WRAP_USRREQS(natm)
 #define	natm_recvoob	natm_recvoob_wrapper
 #define	natm_send	natm_send_wrapper
 #define	natm_sendoob	natm_sendoob_wrapper
+#define	natm_purgeif	natm_purgeif_wrapper
 #define	natm_usrreq	natm_usrreq_wrapper
 
 const struct pr_usrreqs natm_usrreqs = {
@@ -582,6 +593,7 @@ const struct pr_usrreqs natm_usrreqs = {
 	.pr_bind	= natm_bind,
 	.pr_listen	= natm_listen,
 	.pr_connect	= natm_connect,
+	.pr_connect2	= natm_connect2,
 	.pr_disconnect	= natm_disconnect,
 	.pr_shutdown	= natm_shutdown,
 	.pr_abort	= natm_abort,
@@ -593,5 +605,6 @@ const struct pr_usrreqs natm_usrreqs = {
 	.pr_recvoob	= natm_recvoob,
 	.pr_send	= natm_send,
 	.pr_sendoob	= natm_sendoob,
+	.pr_purgeif	= natm_purgeif,
 	.pr_generic	= natm_usrreq,
 };

Index: src/sys/rump/net/lib/libsockin/sockin.c
diff -u src/sys/rump/net/lib/libsockin/sockin.c:1.57 src/sys/rump/net/lib/libsockin/sockin.c:1.58
--- src/sys/rump/net/lib/libsockin/sockin.c:1.57	Fri Aug  8 03:05:45 2014
+++ src/sys/rump/net/lib/libsockin/sockin.c	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sockin.c,v 1.57 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: sockin.c,v 1.58 2014/08/09 05:33:01 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.57 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.58 2014/08/09 05:33:01 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -69,6 +69,7 @@ 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_connect2(struct socket *, struct socket *);
 static int	sockin_bind(struct socket *, struct mbuf *, struct lwp *);
 static int	sockin_listen(struct socket *, struct lwp *);
 static int	sockin_connect(struct socket *, struct mbuf *, struct lwp *);
@@ -84,6 +85,7 @@ static int	sockin_recvoob(struct socket 
 static int	sockin_send(struct socket *, struct mbuf *, struct mbuf *,
 			    struct mbuf *, struct lwp *);
 static int	sockin_sendoob(struct socket *, struct mbuf *, struct mbuf *);
+static int	sockin_purgeif(struct socket *, struct ifnet *);
 static int	sockin_usrreq(struct socket *, int, struct mbuf *,
 			      struct mbuf *, struct mbuf *, struct lwp *);
 static int	sockin_ctloutput(int op, struct socket *, struct sockopt *);
@@ -95,6 +97,7 @@ static const struct pr_usrreqs sockin_us
 	.pr_bind = sockin_bind,
 	.pr_listen = sockin_listen,
 	.pr_connect = sockin_connect,
+	.pr_connect2 = sockin_connect2,
 	.pr_disconnect = sockin_disconnect,
 	.pr_shutdown = sockin_shutdown,
 	.pr_abort = sockin_abort,
@@ -106,6 +109,7 @@ static const struct pr_usrreqs sockin_us
 	.pr_recvoob = sockin_recvoob,
 	.pr_send = sockin_send,
 	.pr_sendoob = sockin_sendoob,
+	.pr_purgeif = sockin_purgeif,
 	.pr_generic = sockin_usrreq,
 };
 
@@ -525,6 +529,14 @@ sockin_connect(struct socket *so, struct
 }
 
 static int
+sockin_connect2(struct socket *so, struct socket *so2)
+{
+	KASSERT(solocked(so));
+
+	panic("sockin_connect2: IMPLEMENT ME, connect2 not supported");
+}
+
+static int
 sockin_disconnect(struct socket *so)
 {
 	KASSERT(solocked(so));
@@ -678,15 +690,21 @@ sockin_sendoob(struct socket *so, struct
 }
 
 static int
+sockin_purgeif(struct socket *so, struct ifnet *ifp)
+{
+
+	panic("sockin_purgeif: IMPLEMENT ME, purgeif not supported");
+}
+
+static int
 sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
 	struct mbuf *control, struct lwp *l)
 {
-	int error = 0;
-
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONNECT);
+	KASSERT(req != PRU_CONNECT2);
 	KASSERT(req != PRU_DISCONNECT);
 	KASSERT(req != PRU_SHUTDOWN);
 	KASSERT(req != PRU_ABORT);
@@ -698,13 +716,11 @@ sockin_usrreq(struct socket *so, int req
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
+	KASSERT(req != PRU_PURGEIF);
 
-	switch (req) {
-	default:
-		panic("sockin_usrreq: IMPLEMENT ME, req %d not supported", req);
-	}
+	panic("sockin_usrreq: IMPLEMENT ME, req %d not supported", req);
 
-	return error;
+	return 0;
 }
 
 static int

Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.59 src/sys/sys/protosw.h:1.60
--- src/sys/sys/protosw.h:1.59	Fri Aug  8 03:05:45 2014
+++ src/sys/sys/protosw.h	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: protosw.h,v 1.59 2014/08/08 03:05:45 rtr Exp $	*/
+/*	$NetBSD: protosw.h,v 1.60 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -117,7 +117,7 @@ struct protosw {
 #define	PR_ABRTACPTDIS	0x80		/* abort on accept(2) to disconnected
 					   socket */
 #define PR_PURGEIF	0x100		/* might store struct ifnet pointer;
-					   PRU_PURGEIF must be called on ifnet
+					   pr_purgeif() must be called on ifnet
 					   deletion */
 
 /*
@@ -239,9 +239,10 @@ struct pr_usrreqs {
 	int	(*pr_attach)(struct socket *, int);
 	void	(*pr_detach)(struct socket *);
 	int	(*pr_accept)(struct socket *, struct mbuf *);
+	int	(*pr_connect)(struct socket *, struct mbuf *, struct lwp *);
+	int	(*pr_connect2)(struct socket *, struct socket *);
 	int	(*pr_bind)(struct socket *, struct mbuf *, struct lwp *);
 	int	(*pr_listen)(struct socket *, struct lwp *);
-	int	(*pr_connect)(struct socket *, struct mbuf *, struct lwp *);
 	int	(*pr_disconnect)(struct socket *);
 	int	(*pr_shutdown)(struct socket *);
 	int	(*pr_abort)(struct socket *);
@@ -254,6 +255,7 @@ struct pr_usrreqs {
 	int	(*pr_send)(struct socket *, struct mbuf *, struct mbuf *,
 	    struct mbuf *, struct lwp *);
 	int	(*pr_sendoob)(struct socket *, struct mbuf *, struct mbuf *);
+	int	(*pr_purgeif)(struct socket *, struct ifnet *);
 	int	(*pr_generic)(struct socket *, int, struct mbuf *,
 	    struct mbuf *, struct mbuf *, struct lwp *);
 };
@@ -335,6 +337,16 @@ name##_connect_wrapper(struct socket *a,
 	return rv;					\
 }							\
 static int						\
+name##_connect2_wrapper(struct socket *a,		\
+    struct socket *b)					\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_connect2(a, b);			\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_listen_wrapper(struct socket *a, struct lwp *b)	\
 {							\
 	int rv;						\
@@ -448,6 +460,16 @@ name##_sendoob_wrapper(struct socket *a,
 	return rv;					\
 }							\
 static int						\
+name##_purgeif_wrapper(struct socket *a,		\
+    struct ifnet *b)					\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_purgeif(a, b);			\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_usrreq_wrapper(struct socket *a, int b,		\
     struct mbuf *c, struct mbuf *d, struct mbuf *e,	\
     struct lwp *f)					\

Index: src/sys/sys/un.h
diff -u src/sys/sys/un.h:1.54 src/sys/sys/un.h:1.55
--- src/sys/sys/un.h:1.54	Tue Aug  5 14:02:42 2014
+++ src/sys/sys/un.h	Sat Aug  9 05:33:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: un.h,v 1.54 2014/08/05 14:02:42 rtr Exp $	*/
+/*	$NetBSD: un.h,v 1.55 2014/08/09 05:33:01 rtr Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -85,7 +85,7 @@ kmutex_t *uipc_streamlock(void);
 kmutex_t *uipc_rawlock(void);
 
 int	unp_connect(struct socket *, struct mbuf *, struct lwp *);
-int	unp_connect2(struct socket *, struct socket *, int);
+int	unp_connect2(struct socket *, struct socket *);
 void 	unp_dispose(struct mbuf *);
 int 	unp_externalize(struct mbuf *, struct lwp *, int);
 

Reply via email to