Module Name:    src
Committed By:   rtr
Date:           Wed Jul 30 10:04:26 UTC 2014

Modified Files:
        src/sys/dev/bluetooth: bthidev.c btmagic.c btsco.c
        src/sys/kern: uipc_socket.c uipc_usrreq.c
        src/sys/net: raw_usrreq.c rtsock.c
        src/sys/netatalk: ddp_usrreq.c
        src/sys/netbt: hci_socket.c l2cap.h l2cap_socket.c l2cap_upper.c
            rfcomm.h rfcomm_socket.c rfcomm_upper.c sco.h sco_socket.c
            sco_upper.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_CONNECT function out of pr_generic() usrreq switches and put
into seaparate functions

  xxx_listen(struct socket *, struct mbuf *)

  - always KASSERT(solocked(so)) and KASSERT(nam != NULL)
  - replace calls to pr_generic() with req = PRU_CONNECT with
    pr_connect()
  - rename existin {l2cap,sco,rfcomm}_connect() to
    {l2cap,sco,rfcomm}_connect_pcb() respectively to permit
    naming consistency with other protocols functions.
  - drop struct lwp * parameter from unp_connect() and at_pcbconnect()
    and use curlwp instead where appropriate.

patch reviewed by rmind


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/bluetooth/bthidev.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/bluetooth/btmagic.c
cvs rdiff -u -r1.30 -r1.31 src/sys/dev/bluetooth/btsco.c
cvs rdiff -u -r1.227 -r1.228 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.161 -r1.162 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.45 -r1.46 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.157 -r1.158 src/sys/net/rtsock.c
cvs rdiff -u -r1.55 -r1.56 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.34 -r1.35 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.15 -r1.16 src/sys/netbt/l2cap.h src/sys/netbt/l2cap_upper.c
cvs rdiff -u -r1.25 -r1.26 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.14 -r1.15 src/sys/netbt/rfcomm.h
cvs rdiff -u -r1.26 -r1.27 src/sys/netbt/rfcomm_socket.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netbt/rfcomm_upper.c
cvs rdiff -u -r1.8 -r1.9 src/sys/netbt/sco.h
cvs rdiff -u -r1.27 -r1.28 src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.13 -r1.14 src/sys/netbt/sco_upper.c
cvs rdiff -u -r1.136 -r1.137 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.192 -r1.193 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.210 -r1.211 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.129 -r1.130 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.109 -r1.110 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.37 -r1.38 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.39 -r1.40 src/sys/netnatm/natm.c
cvs rdiff -u -r1.52 -r1.53 src/sys/rump/net/lib/libsockin/sockin.c
cvs rdiff -u -r1.54 -r1.55 src/sys/sys/protosw.h
cvs rdiff -u -r1.49 -r1.50 src/sys/sys/un.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/bluetooth/bthidev.c
diff -u src/sys/dev/bluetooth/bthidev.c:1.26 src/sys/dev/bluetooth/bthidev.c:1.27
--- src/sys/dev/bluetooth/bthidev.c:1.26	Thu Jul 24 15:12:03 2014
+++ src/sys/dev/bluetooth/bthidev.c	Wed Jul 30 10:04:25 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: bthidev.c,v 1.26 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: bthidev.c,v 1.27 2014/07/30 10:04:25 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.26 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.27 2014/07/30 10:04:25 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -577,9 +577,9 @@ bthidev_connect(struct bthidev_softc *sc
 
 	sa.bt_psm = sc->sc_ctlpsm;
 	bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
-	err = l2cap_connect(sc->sc_ctl, &sa);
+	err = l2cap_connect_pcb(sc->sc_ctl, &sa);
 	if (err) {
-		aprint_error_dev(sc->sc_dev, "l2cap_connect failed (%d)\n", err);
+		aprint_error_dev(sc->sc_dev, "l2cap_connect_pcb failed (%d)\n", err);
 		return err;
 	}
 
@@ -753,7 +753,7 @@ bthidev_ctl_connected(void *arg)
 
 		sa.bt_psm = sc->sc_intpsm;
 		bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
-		err = l2cap_connect(sc->sc_int, &sa);
+		err = l2cap_connect_pcb(sc->sc_int, &sa);
 		if (err)
 			goto fail;
 	}

Index: src/sys/dev/bluetooth/btmagic.c
diff -u src/sys/dev/bluetooth/btmagic.c:1.8 src/sys/dev/bluetooth/btmagic.c:1.9
--- src/sys/dev/bluetooth/btmagic.c:1.8	Thu Jul 24 15:12:03 2014
+++ src/sys/dev/bluetooth/btmagic.c	Wed Jul 30 10:04:25 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: btmagic.c,v 1.8 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: btmagic.c,v 1.9 2014/07/30 10:04:25 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -85,7 +85,7 @@
  *****************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: btmagic.c,v 1.8 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: btmagic.c,v 1.9 2014/07/30 10:04:25 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -543,9 +543,9 @@ btmagic_connect(struct btmagic_softc *sc
 
 	sa.bt_psm = L2CAP_PSM_HID_CNTL;
 	bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
-	err = l2cap_connect(sc->sc_ctl, &sa);
+	err = l2cap_connect_pcb(sc->sc_ctl, &sa);
 	if (err) {
-		printf("%s: l2cap_connect failed (%d)\n",
+		printf("%s: l2cap_connect_pcb failed (%d)\n",
 		    device_xname(sc->sc_dev), err);
 		return err;
 	}
@@ -830,7 +830,7 @@ btmagic_ctl_connected(void *arg)
 
 		sa.bt_psm = L2CAP_PSM_HID_INTR;
 		bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
-		err = l2cap_connect(sc->sc_int, &sa);
+		err = l2cap_connect_pcb(sc->sc_int, &sa);
 		if (err)
 			goto fail;
 	}

Index: src/sys/dev/bluetooth/btsco.c
diff -u src/sys/dev/bluetooth/btsco.c:1.30 src/sys/dev/bluetooth/btsco.c:1.31
--- src/sys/dev/bluetooth/btsco.c:1.30	Thu Jul 24 15:12:03 2014
+++ src/sys/dev/bluetooth/btsco.c	Wed Jul 30 10:04:25 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: btsco.c,v 1.30 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: btsco.c,v 1.31 2014/07/30 10:04:25 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.30 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.31 2014/07/30 10:04:25 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/audioio.h>
@@ -617,7 +617,7 @@ btsco_open(void *hdl, int flags)
 		}
 
 		bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
-		err = sco_connect(sc->sc_sco, &sa);
+		err = sco_connect_pcb(sc->sc_sco, &sa);
 		if (err) {
 			sco_detach_pcb(&sc->sc_sco);
 			goto done;

Index: src/sys/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.227 src/sys/kern/uipc_socket.c:1.228
--- src/sys/kern/uipc_socket.c:1.227	Thu Jul 24 15:12:03 2014
+++ src/sys/kern/uipc_socket.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.227 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.228 2014/07/30 10:04:26 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.227 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.228 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_sock_counters.h"
@@ -827,8 +827,7 @@ soconnect(struct socket *so, struct mbuf
 	    (error = sodisconnect(so))))
 		error = EISCONN;
 	else
-		error = (*so->so_proto->pr_usrreqs->pr_generic)(so,
-		    PRU_CONNECT, NULL, nam, NULL, l);
+		error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam);
 
 	return error;
 }

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.161 src/sys/kern/uipc_usrreq.c:1.162
--- src/sys/kern/uipc_usrreq.c:1.161	Thu Jul 24 15:12:03 2014
+++ src/sys/kern/uipc_usrreq.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.161 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.162 2014/07/30 10:04:26 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.161 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.162 2014/07/30 10:04:26 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -398,6 +398,7 @@ unp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -415,11 +416,6 @@ unp_usrreq(struct socket *so, int req, s
 	}
 
 	switch (req) {
-	case PRU_CONNECT:
-		KASSERT(l != NULL);
-		error = unp_connect(so, nam, l);
-		break;
-
 	case PRU_CONNECT2:
 		error = unp_connect2(so, (struct socket *)nam, PRU_CONNECT2);
 		break;
@@ -502,7 +498,7 @@ unp_usrreq(struct socket *so, int req, s
 					 * intervening control ops, like
 					 * another connection.
 					 */
-					error = unp_connect(so, nam, l);
+					error = unp_connect(so, nam);
 				}
 			} else {
 				if ((so->so_state & SS_ISCONNECTED) == 0)
@@ -1044,7 +1040,7 @@ unp_listen(struct socket *so)
 }
 
 int
-unp_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
+unp_connect(struct socket *so, struct mbuf *nam)
 {
 	struct sockaddr_un *sun;
 	vnode_t *vp;
@@ -1085,7 +1081,7 @@ unp_connect(struct socket *so, struct mb
 		goto bad;
 	}
 	pathbuf_destroy(pb);
-	if ((error = VOP_ACCESS(vp, VWRITE, l->l_cred)) != 0)
+	if ((error = VOP_ACCESS(vp, VWRITE, curlwp->l_cred)) != 0)
 		goto bad;
 	/* Acquire v_interlock to protect against unp_detach(). */
 	mutex_enter(vp->v_interlock);
@@ -1127,9 +1123,9 @@ unp_connect(struct socket *so, struct mb
 			unp3->unp_addrlen = unp2->unp_addrlen;
 		}
 		unp3->unp_flags = unp2->unp_flags;
-		unp3->unp_connid.unp_pid = l->l_proc->p_pid;
-		unp3->unp_connid.unp_euid = kauth_cred_geteuid(l->l_cred);
-		unp3->unp_connid.unp_egid = kauth_cred_getegid(l->l_cred);
+		unp3->unp_connid.unp_pid = curlwp->l_proc->p_pid;
+		unp3->unp_connid.unp_euid = kauth_cred_geteuid(curlwp->l_cred);
+		unp3->unp_connid.unp_egid = kauth_cred_getegid(curlwp->l_cred);
 		unp3->unp_flags |= UNP_EIDSVALID;
 		if (unp2->unp_flags & UNP_EIDSBIND) {
 			unp->unp_connid = unp2->unp_connid;
@@ -1882,6 +1878,7 @@ const struct pr_usrreqs unp_usrreqs = {
 	.pr_accept	= unp_accept,
 	.pr_bind	= unp_bind,
 	.pr_listen	= unp_listen,
+	.pr_connect	= unp_connect,
 	.pr_ioctl	= unp_ioctl,
 	.pr_stat	= unp_stat,
 	.pr_peeraddr	= unp_peeraddr,

Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.45 src/sys/net/raw_usrreq.c:1.46
--- src/sys/net/raw_usrreq.c:1.45	Thu Jul 24 15:12:03 2014
+++ src/sys/net/raw_usrreq.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_usrreq.c,v 1.45 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: raw_usrreq.c,v 1.46 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.45 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.46 2014/07/30 10:04:26 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -165,6 +165,7 @@ raw_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -188,7 +189,6 @@ raw_usrreq(struct socket *so, int req, s
 	 * within that protocol family (assuming there's
 	 * nothing else around it should go to).
 	 */
-	case PRU_CONNECT:
 	case PRU_CONNECT2:
 		error = EOPNOTSUPP;
 		break;

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.157 src/sys/net/rtsock.c:1.158
--- src/sys/net/rtsock.c:1.157	Thu Jul 24 15:12:03 2014
+++ src/sys/net/rtsock.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.157 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.158 2014/07/30 10:04:26 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.157 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.158 2014/07/30 10:04:26 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -250,6 +250,14 @@ COMPATNAME(route_listen)(struct socket *
 }
 
 static int
+COMPATNAME(route_connect)(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 COMPATNAME(route_ioctl)(struct socket *so, u_long cmd, void *nam,
     struct ifnet * ifp)
 {
@@ -327,6 +335,7 @@ COMPATNAME(route_usrreq)(struct socket *
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -1432,6 +1441,7 @@ static const struct pr_usrreqs route_usr
 	.pr_accept	= COMPATNAME(route_accept_wrapper),
 	.pr_bind	= COMPATNAME(route_bind_wrapper),
 	.pr_listen	= COMPATNAME(route_listen_wrapper),
+	.pr_connect	= COMPATNAME(route_connect_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.55 src/sys/netatalk/ddp_usrreq.c:1.56
--- src/sys/netatalk/ddp_usrreq.c:1.55	Thu Jul 24 15:12:03 2014
+++ src/sys/netatalk/ddp_usrreq.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ddp_usrreq.c,v 1.55 2014/07/24 15:12:03 rtr Exp $	 */
+/*	$NetBSD: ddp_usrreq.c,v 1.56 2014/07/30 10:04:26 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.55 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.56 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -59,7 +59,7 @@ __KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c
 static void at_pcbdisconnect(struct ddpcb *);
 static void at_sockaddr(struct ddpcb *, struct mbuf *);
 static int at_pcbsetaddr(struct ddpcb *, struct mbuf *);
-static int at_pcbconnect(struct ddpcb *, struct mbuf *, struct lwp *);
+static int at_pcbconnect(struct ddpcb *, struct mbuf *);
 static void ddp_detach(struct socket *);
 
 struct ifqueue atintrq1, atintrq2;
@@ -87,6 +87,7 @@ ddp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -111,16 +112,6 @@ ddp_usrreq(struct socket *so, int req, s
 		goto release;
 	}
 	switch (req) {
-	case PRU_CONNECT:
-		if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT) {
-			error = EISCONN;
-			break;
-		}
-		error = at_pcbconnect(ddp, addr, l);
-		if (error == 0)
-			soisconnected(so);
-		break;
-
 	case PRU_DISCONNECT:
 		if (ddp->ddp_fsat.sat_addr.s_node == ATADDR_ANYNODE) {
 			error = ENOTCONN;
@@ -143,7 +134,7 @@ ddp_usrreq(struct socket *so, int req, s
 					break;
 				}
 				s = splnet();
-				error = at_pcbconnect(ddp, addr, l);
+				error = at_pcbconnect(ddp, addr);
 				if (error) {
 					splx(s);
 					break;
@@ -300,7 +291,7 @@ at_pcbsetaddr(struct ddpcb *ddp, struct 
 }
 
 static int
-at_pcbconnect(struct ddpcb *ddp, struct mbuf *addr, struct lwp *l)
+at_pcbconnect(struct ddpcb *ddp, struct mbuf *addr)
 {
 	struct rtentry *rt;
 	const struct sockaddr_at *cdst;
@@ -493,6 +484,25 @@ ddp_listen(struct socket *so)
 }
 
 static int
+ddp_connect(struct socket *so, struct mbuf *nam)
+{
+	struct ddpcb *ddp = sotoddpcb(so);
+	int error = 0;
+
+	KASSERT(solocked(so));
+	KASSERT(ddp != NULL);
+	KASSERT(nam != NULL);
+
+	if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT)
+		return EISCONN;
+	error = at_pcbconnect(ddp, nam);
+	if (error == 0)
+		soisconnected(so);
+
+	return error;
+}
+
+static int
 ddp_ioctl(struct socket *so, u_long cmd, void *addr, struct ifnet *ifp)
 {
 	return at_control(cmd, addr, ifp);
@@ -621,6 +631,7 @@ PR_WRAP_USRREQS(ddp)
 #define	ddp_accept	ddp_accept_wrapper
 #define	ddp_bind	ddp_bind_wrapper
 #define	ddp_listen	ddp_listen_wrapper
+#define	ddp_connect	ddp_connect_wrapper
 #define	ddp_ioctl	ddp_ioctl_wrapper
 #define	ddp_stat	ddp_stat_wrapper
 #define	ddp_peeraddr	ddp_peeraddr_wrapper
@@ -635,6 +646,7 @@ const struct pr_usrreqs ddp_usrreqs = {
 	.pr_accept	= ddp_accept,
 	.pr_bind	= ddp_bind,
 	.pr_listen	= ddp_listen,
+	.pr_connect	= ddp_connect,
 	.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.34 src/sys/netbt/hci_socket.c:1.35
--- src/sys/netbt/hci_socket.c:1.34	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/hci_socket.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_socket.c,v 1.34 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: hci_socket.c,v 1.35 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.34 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.35 2014/07/30 10:04:26 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -527,6 +527,31 @@ hci_listen(struct socket *so)
 }
 
 static int
+hci_connect(struct socket *so, struct mbuf *nam)
+{
+	struct hci_pcb *pcb = so->so_pcb;
+	struct sockaddr_bt *sa;
+
+	KASSERT(solocked(so));
+	KASSERT(pcb != NULL);
+	KASSERT(nam != NULL);
+
+	sa = mtod(nam, struct sockaddr_bt *);
+	if (sa->bt_len != sizeof(struct sockaddr_bt))
+		return EINVAL;
+
+	if (sa->bt_family != AF_BLUETOOTH)
+		return EAFNOSUPPORT;
+
+	if (hci_unit_lookup(&sa->bt_bdaddr) == NULL)
+		return EADDRNOTAVAIL;
+
+	bdaddr_copy(&pcb->hp_raddr, &sa->bt_bdaddr);
+	soisconnected(so);
+	return 0;
+}
+
+static int
 hci_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	int err;
@@ -627,6 +652,7 @@ hci_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -663,23 +689,6 @@ hci_usrreq(struct socket *up, int req, s
 		hci_detach(up);
 		return 0;
 
-	case PRU_CONNECT:
-		KASSERT(nam != NULL);
-		sa = mtod(nam, struct sockaddr_bt *);
-
-		if (sa->bt_len != sizeof(struct sockaddr_bt))
-			return EINVAL;
-
-		if (sa->bt_family != AF_BLUETOOTH)
-			return EAFNOSUPPORT;
-
-		if (hci_unit_lookup(&sa->bt_bdaddr) == NULL)
-			return EADDRNOTAVAIL;
-
-		bdaddr_copy(&pcb->hp_raddr, &sa->bt_bdaddr);
-		soisconnected(up);
-		return 0;
-
 	case PRU_SHUTDOWN:
 		socantsendmore(up);
 		break;
@@ -941,6 +950,7 @@ PR_WRAP_USRREQS(hci)
 #define	hci_accept		hci_accept_wrapper
 #define	hci_bind		hci_bind_wrapper
 #define	hci_listen		hci_listen_wrapper
+#define	hci_connect		hci_connect_wrapper
 #define	hci_ioctl		hci_ioctl_wrapper
 #define	hci_stat		hci_stat_wrapper
 #define	hci_peeraddr		hci_peeraddr_wrapper
@@ -955,6 +965,7 @@ const struct pr_usrreqs hci_usrreqs = {
 	.pr_accept	= hci_accept,
 	.pr_bind	= hci_bind,
 	.pr_listen	= hci_listen,
+	.pr_connect	= hci_connect,
 	.pr_ioctl	= hci_ioctl,
 	.pr_stat	= hci_stat,
 	.pr_peeraddr	= hci_peeraddr,

Index: src/sys/netbt/l2cap.h
diff -u src/sys/netbt/l2cap.h:1.15 src/sys/netbt/l2cap.h:1.16
--- src/sys/netbt/l2cap.h:1.15	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/l2cap.h	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap.h,v 1.15 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: l2cap.h,v 1.16 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -54,7 +54,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: l2cap.h,v 1.15 2014/07/24 15:12:03 rtr Exp $
+ * $Id: l2cap.h,v 1.16 2014/07/30 10:04:26 rtr Exp $
  * $FreeBSD: src/sys/netgraph/bluetooth/include/l2cap.h,v 1.4 2005/08/31 18:13:23 emax Exp $
  */
 
@@ -464,7 +464,7 @@ int l2cap_ctloutput(int, struct socket *
 int l2cap_attach_pcb(struct l2cap_channel **, const struct btproto *, void *);
 int l2cap_bind_pcb(struct l2cap_channel *, struct sockaddr_bt *);
 int l2cap_sockaddr_pcb(struct l2cap_channel *, struct sockaddr_bt *);
-int l2cap_connect(struct l2cap_channel *, struct sockaddr_bt *);
+int l2cap_connect_pcb(struct l2cap_channel *, struct sockaddr_bt *);
 int l2cap_peeraddr_pcb(struct l2cap_channel *, struct sockaddr_bt *);
 int l2cap_disconnect(struct l2cap_channel *, int);
 void l2cap_detach_pcb(struct l2cap_channel **);
Index: src/sys/netbt/l2cap_upper.c
diff -u src/sys/netbt/l2cap_upper.c:1.15 src/sys/netbt/l2cap_upper.c:1.16
--- src/sys/netbt/l2cap_upper.c:1.15	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/l2cap_upper.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_upper.c,v 1.15 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: l2cap_upper.c,v 1.16 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.15 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.16 2014/07/30 10:04:26 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -131,7 +131,7 @@ l2cap_sockaddr_pcb(struct l2cap_channel 
 }
 
 /*
- * l2cap_connect(l2cap_channel, sockaddr)
+ * l2cap_connect_pcb(l2cap_channel, sockaddr)
  *
  *	Initiate a connection to destination. This corresponds to
  *	"Open Channel Request" in the L2CAP specification and will
@@ -144,7 +144,7 @@ l2cap_sockaddr_pcb(struct l2cap_channel 
  *		proto->connecting(upper)
  */
 int
-l2cap_connect(struct l2cap_channel *chan, struct sockaddr_bt *dest)
+l2cap_connect_pcb(struct l2cap_channel *chan, struct sockaddr_bt *dest)
 {
 	struct hci_unit *unit;
 	int err;

Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.25 src/sys/netbt/l2cap_socket.c:1.26
--- src/sys/netbt/l2cap_socket.c:1.25	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/l2cap_socket.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_socket.c,v 1.25 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: l2cap_socket.c,v 1.26 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.25 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.26 2014/07/30 10:04:26 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -169,6 +169,29 @@ l2cap_listen(struct socket *so)
 }
 
 static int
+l2cap_connect(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 *);
+	if (sa->bt_len != sizeof(struct sockaddr_bt))
+		return EINVAL;
+
+	if (sa->bt_family != AF_BLUETOOTH)
+		return EAFNOSUPPORT;
+
+	soisconnecting(so);
+	return l2cap_connect_pcb(pcb, sa);
+}
+
+static int
 l2cap_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EPASSTHROUGH;
@@ -253,7 +276,6 @@ l2cap_usrreq(struct socket *up, int req,
     struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
 {
 	struct l2cap_channel *pcb = up->so_pcb;
-	struct sockaddr_bt *sa;
 	struct mbuf *m0;
 	int err = 0;
 
@@ -263,6 +285,7 @@ l2cap_usrreq(struct socket *up, int req,
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -291,19 +314,6 @@ l2cap_usrreq(struct socket *up, int req,
 		l2cap_detach(up);
 		return 0;
 
-	case PRU_CONNECT:
-		KASSERT(nam != NULL);
-		sa = mtod(nam, struct sockaddr_bt *);
-
-		if (sa->bt_len != sizeof(struct sockaddr_bt))
-			return EINVAL;
-
-		if (sa->bt_family != AF_BLUETOOTH)
-			return EAFNOSUPPORT;
-
-		soisconnecting(up);
-		return l2cap_connect(pcb, sa);
-
 	case PRU_SHUTDOWN:
 		socantsendmore(up);
 		break;
@@ -500,6 +510,7 @@ PR_WRAP_USRREQS(l2cap)
 #define	l2cap_accept		l2cap_accept_wrapper
 #define	l2cap_bind		l2cap_bind_wrapper
 #define	l2cap_listen		l2cap_listen_wrapper
+#define	l2cap_connect		l2cap_connect_wrapper
 #define	l2cap_ioctl		l2cap_ioctl_wrapper
 #define	l2cap_stat		l2cap_stat_wrapper
 #define	l2cap_peeraddr		l2cap_peeraddr_wrapper
@@ -514,6 +525,7 @@ const struct pr_usrreqs l2cap_usrreqs = 
 	.pr_accept	= l2cap_accept,
 	.pr_bind	= l2cap_bind,
 	.pr_listen	= l2cap_listen,
+	.pr_connect	= l2cap_connect,
 	.pr_ioctl	= l2cap_ioctl,
 	.pr_stat	= l2cap_stat,
 	.pr_peeraddr	= l2cap_peeraddr,

Index: src/sys/netbt/rfcomm.h
diff -u src/sys/netbt/rfcomm.h:1.14 src/sys/netbt/rfcomm.h:1.15
--- src/sys/netbt/rfcomm.h:1.14	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/rfcomm.h	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm.h,v 1.14 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: rfcomm.h,v 1.15 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -55,7 +55,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: rfcomm.h,v 1.14 2014/07/24 15:12:03 rtr Exp $
+ * $Id: rfcomm.h,v 1.15 2014/07/30 10:04:26 rtr Exp $
  * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $
  */
 
@@ -410,7 +410,7 @@ int rfcomm_ctloutput(int, struct socket 
 int rfcomm_attach_pcb(struct rfcomm_dlc **, const struct btproto *, void *);
 int rfcomm_bind_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
 int rfcomm_sockaddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
-int rfcomm_connect(struct rfcomm_dlc *, struct sockaddr_bt *);
+int rfcomm_connect_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
 int rfcomm_peeraddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
 int rfcomm_disconnect(struct rfcomm_dlc *, int);
 void rfcomm_detach_pcb(struct rfcomm_dlc **);

Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.26 src/sys/netbt/rfcomm_socket.c:1.27
--- src/sys/netbt/rfcomm_socket.c:1.26	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/rfcomm_socket.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_socket.c,v 1.26 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: rfcomm_socket.c,v 1.27 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.26 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.27 2014/07/30 10:04:26 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -177,6 +177,29 @@ rfcomm_listen(struct socket *so)
 }
 
 static int
+rfcomm_connect(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 *);
+	if (sa->bt_len != sizeof(struct sockaddr_bt))
+		return EINVAL;
+
+	if (sa->bt_family != AF_BLUETOOTH)
+		return EAFNOSUPPORT;
+
+	soisconnecting(so);
+	return rfcomm_connect_pcb(pcb, sa);
+}
+
+static int
 rfcomm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EPASSTHROUGH;
@@ -261,7 +284,6 @@ rfcomm_usrreq(struct socket *up, int req
 		struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
 {
 	struct rfcomm_dlc *pcb = up->so_pcb;
-	struct sockaddr_bt *sa;
 	struct mbuf *m0;
 	int err = 0;
 
@@ -271,6 +293,7 @@ rfcomm_usrreq(struct socket *up, int req
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -298,19 +321,6 @@ rfcomm_usrreq(struct socket *up, int req
 		rfcomm_detach(up);
 		return 0;
 
-	case PRU_CONNECT:
-		KASSERT(nam != NULL);
-		sa = mtod(nam, struct sockaddr_bt *);
-
-		if (sa->bt_len != sizeof(struct sockaddr_bt))
-			return EINVAL;
-
-		if (sa->bt_family != AF_BLUETOOTH)
-			return EAFNOSUPPORT;
-
-		soisconnecting(up);
-		return rfcomm_connect(pcb, sa);
-
 	case PRU_SHUTDOWN:
 		socantsendmore(up);
 		break;
@@ -511,6 +521,7 @@ PR_WRAP_USRREQS(rfcomm)
 #define	rfcomm_accept		rfcomm_accept_wrapper
 #define	rfcomm_bind		rfcomm_bind_wrapper
 #define	rfcomm_listen		rfcomm_listen_wrapper
+#define	rfcomm_connect		rfcomm_connect_wrapper
 #define	rfcomm_ioctl		rfcomm_ioctl_wrapper
 #define	rfcomm_stat		rfcomm_stat_wrapper
 #define	rfcomm_peeraddr		rfcomm_peeraddr_wrapper
@@ -525,6 +536,7 @@ const struct pr_usrreqs rfcomm_usrreqs =
 	.pr_accept	= rfcomm_accept,
 	.pr_bind	= rfcomm_bind,
 	.pr_listen	= rfcomm_listen,
+	.pr_connect	= rfcomm_connect,
 	.pr_ioctl	= rfcomm_ioctl,
 	.pr_stat	= rfcomm_stat,
 	.pr_peeraddr	= rfcomm_peeraddr,

Index: src/sys/netbt/rfcomm_upper.c
diff -u src/sys/netbt/rfcomm_upper.c:1.17 src/sys/netbt/rfcomm_upper.c:1.18
--- src/sys/netbt/rfcomm_upper.c:1.17	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/rfcomm_upper.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_upper.c,v 1.17 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: rfcomm_upper.c,v 1.18 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.17 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.18 2014/07/30 10:04:26 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -125,12 +125,12 @@ rfcomm_sockaddr_pcb(struct rfcomm_dlc *d
 }
 
 /*
- * rfcomm_connect(dlc, sockaddr)
+ * rfcomm_connect_pcb(dlc, sockaddr)
  *
  * Initiate connection of RFCOMM DLC to remote address.
  */
 int
-rfcomm_connect(struct rfcomm_dlc *dlc, struct sockaddr_bt *dest)
+rfcomm_connect_pcb(struct rfcomm_dlc *dlc, struct sockaddr_bt *dest)
 {
 	struct rfcomm_session *rs;
 	int err = 0;
@@ -167,7 +167,7 @@ rfcomm_connect(struct rfcomm_dlc *dlc, s
 		rs->rs_flags |= RFCOMM_SESSION_INITIATOR;
 		rs->rs_state = RFCOMM_SESSION_WAIT_CONNECT;
 
-		err = l2cap_connect(rs->rs_l2cap, &dlc->rd_raddr);
+		err = l2cap_connect_pcb(rs->rs_l2cap, &dlc->rd_raddr);
 		if (err) {
 			rfcomm_session_free(rs);
 			return err;

Index: src/sys/netbt/sco.h
diff -u src/sys/netbt/sco.h:1.8 src/sys/netbt/sco.h:1.9
--- src/sys/netbt/sco.h:1.8	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/sco.h	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco.h,v 1.8 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: sco.h,v 1.9 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -71,7 +71,7 @@ int sco_ctloutput(int, struct socket *, 
 int sco_attach_pcb(struct sco_pcb **, const struct btproto *, void *);
 int sco_bind_pcb(struct sco_pcb *, struct sockaddr_bt *);
 int sco_sockaddr_pcb(struct sco_pcb *, struct sockaddr_bt *);
-int sco_connect(struct sco_pcb *, struct sockaddr_bt *);
+int sco_connect_pcb(struct sco_pcb *, struct sockaddr_bt *);
 int sco_peeraddr_pcb(struct sco_pcb *, struct sockaddr_bt *);
 int sco_disconnect(struct sco_pcb *, int);
 void sco_detach_pcb(struct sco_pcb **);

Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.27 src/sys/netbt/sco_socket.c:1.28
--- src/sys/netbt/sco_socket.c:1.27	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/sco_socket.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_socket.c,v 1.27 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: sco_socket.c,v 1.28 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.27 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.28 2014/07/30 10:04:26 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -160,6 +160,29 @@ sco_listen(struct socket *so)
 }
 
 static int
+sco_connect(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 *);
+	if (sa->bt_len != sizeof(struct sockaddr_bt))
+		return EINVAL;
+
+	if (sa->bt_family != AF_BLUETOOTH)
+		return EAFNOSUPPORT;
+
+	soisconnecting(so);
+	return sco_connect_pcb(pcb, sa);
+}
+
+static int
 sco_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -240,7 +263,6 @@ sco_usrreq(struct socket *up, int req, s
     struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
 {
 	struct sco_pcb *pcb = (struct sco_pcb *)up->so_pcb;
-	struct sockaddr_bt *sa;
 	struct mbuf *m0;
 	int err = 0;
 
@@ -250,6 +272,7 @@ sco_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -279,19 +302,6 @@ sco_usrreq(struct socket *up, int req, s
 		sco_detach(up);
 		return 0;
 
-	case PRU_CONNECT:
-		KASSERT(nam != NULL);
-		sa = mtod(nam, struct sockaddr_bt *);
-
-		if (sa->bt_len != sizeof(struct sockaddr_bt))
-			return EINVAL;
-
-		if (sa->bt_family != AF_BLUETOOTH)
-			return EAFNOSUPPORT;
-
-		soisconnecting(up);
-		return sco_connect(pcb, sa);
-
 	case PRU_SHUTDOWN:
 		socantsendmore(up);
 		break;
@@ -467,6 +477,7 @@ PR_WRAP_USRREQS(sco)
 #define	sco_accept		sco_accept_wrapper
 #define	sco_bind		sco_bind_wrapper
 #define	sco_listen		sco_listen_wrapper
+#define	sco_connect		sco_connect_wrapper
 #define	sco_ioctl		sco_ioctl_wrapper
 #define	sco_stat		sco_stat_wrapper
 #define	sco_peeraddr		sco_peeraddr_wrapper
@@ -481,6 +492,7 @@ const struct pr_usrreqs sco_usrreqs = {
 	.pr_accept	= sco_accept,
 	.pr_bind	= sco_bind,
 	.pr_listen	= sco_listen,
+	.pr_connect	= sco_connect,
 	.pr_ioctl	= sco_ioctl,
 	.pr_stat	= sco_stat,
 	.pr_peeraddr	= sco_peeraddr,

Index: src/sys/netbt/sco_upper.c
diff -u src/sys/netbt/sco_upper.c:1.13 src/sys/netbt/sco_upper.c:1.14
--- src/sys/netbt/sco_upper.c:1.13	Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/sco_upper.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_upper.c,v 1.13 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: sco_upper.c,v 1.14 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.13 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.14 2014/07/30 10:04:26 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -114,12 +114,12 @@ sco_sockaddr_pcb(struct sco_pcb *pcb, st
 }
 
 /*
- * sco_connect(pcb, sockaddr)
+ * sco_connect_pcb(pcb, sockaddr)
  *
  *	Initiate a SCO connection to the destination address.
  */
 int
-sco_connect(struct sco_pcb *pcb, struct sockaddr_bt *dest)
+sco_connect_pcb(struct sco_pcb *pcb, struct sockaddr_bt *dest)
 {
 	hci_add_sco_con_cp cp;
 	struct hci_unit *unit;

Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.136 src/sys/netinet/raw_ip.c:1.137
--- src/sys/netinet/raw_ip.c:1.136	Thu Jul 24 15:12:03 2014
+++ src/sys/netinet/raw_ip.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip.c,v 1.136 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: raw_ip.c,v 1.137 2014/07/30 10:04:26 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.136 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.137 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -112,7 +112,7 @@ struct inpcbtable rawcbtable;
 
 int	 rip_pcbnotify(struct inpcbtable *, struct in_addr,
     struct in_addr, int, int, void (*)(struct inpcb *, int));
-int	 rip_connect(struct inpcb *, struct mbuf *);
+int	 rip_connect_pcb(struct inpcb *, struct mbuf *);
 void	 rip_disconnect(struct inpcb *);
 
 static void sysctl_net_inet_raw_setup(struct sysctllog **);
@@ -481,7 +481,7 @@ rip_ctloutput(int op, struct socket *so,
 }
 
 int
-rip_connect(struct inpcb *inp, struct mbuf *nam)
+rip_connect_pcb(struct inpcb *inp, struct mbuf *nam)
 {
 	struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *);
 
@@ -604,6 +604,27 @@ rip_listen(struct socket *so)
 }
 
 static int
+rip_connect(struct socket *so, struct mbuf *nam)
+{
+	struct inpcb *inp = sotoinpcb(so);
+	int error = 0;
+	int s;
+
+	KASSERT(solocked(so));
+	KASSERT(inp != NULL);
+	KASSERT(nam != NULL);
+
+	s = splsoftnet();
+	error = rip_connect_pcb(inp, nam);
+	if (! error)
+		soisconnected(so);
+
+	splx(s);
+	return error;
+}
+
+
+static int
 rip_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return in_control(so, cmd, nam, ifp);
@@ -671,6 +692,7 @@ rip_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -700,13 +722,6 @@ rip_usrreq(struct socket *so, int req, s
 
 	switch (req) {
 
-	case PRU_CONNECT:
-		error = rip_connect(inp, nam);
-		if (error)
-			break;
-		soisconnected(so);
-		break;
-
 	case PRU_CONNECT2:
 		error = EOPNOTSUPP;
 		break;
@@ -744,7 +759,7 @@ rip_usrreq(struct socket *so, int req, s
 				error = EISCONN;
 				goto die;
 			}
-			error = rip_connect(inp, nam);
+			error = rip_connect_pcb(inp, nam);
 			if (error) {
 			die:
 				m_freem(m);
@@ -776,6 +791,7 @@ PR_WRAP_USRREQS(rip)
 #define	rip_accept	rip_accept_wrapper
 #define	rip_bind	rip_bind_wrapper
 #define	rip_listen	rip_listen_wrapper
+#define	rip_connect	rip_connect_wrapper
 #define	rip_ioctl	rip_ioctl_wrapper
 #define	rip_stat	rip_stat_wrapper
 #define	rip_peeraddr	rip_peeraddr_wrapper
@@ -790,6 +806,7 @@ const struct pr_usrreqs rip_usrreqs = {
 	.pr_accept	= rip_accept,
 	.pr_bind	= rip_bind,
 	.pr_listen	= rip_listen,
+	.pr_connect	= rip_connect,
 	.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.192 src/sys/netinet/tcp_usrreq.c:1.193
--- src/sys/netinet/tcp_usrreq.c:1.192	Wed Jul 30 06:53:53 2014
+++ src/sys/netinet/tcp_usrreq.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.192 2014/07/30 06:53:53 rtr Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.193 2014/07/30 10:04:26 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.192 2014/07/30 06:53:53 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.193 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -233,6 +233,7 @@ tcp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -286,72 +287,6 @@ tcp_usrreq(struct socket *so, int req, s
 	switch (req) {
 
 	/*
-	 * Initiate connection to peer.
-	 * Create a template for use in transmissions on this connection.
-	 * Enter SYN_SENT state, and mark socket as connecting.
-	 * Start keep-alive timer, and seed output sequence space.
-	 * Send initial segment on connection.
-	 */
-	case PRU_CONNECT:
-#ifdef INET
-		if (inp) {
-			if (inp->inp_lport == 0) {
-				error = in_pcbbind(inp, NULL);
-				if (error)
-					break;
-			}
-			error = in_pcbconnect(inp, nam, l);
-		}
-#endif
-#ifdef INET6
-		if (in6p) {
-			if (in6p->in6p_lport == 0) {
-				error = in6_pcbbind(in6p, NULL);
-				if (error)
-					break;
-			}
-			error = in6_pcbconnect(in6p, nam, l);
-			if (!error) {
-				/* mapped addr case */
-				if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr))
-					tp->t_family = AF_INET;
-				else
-					tp->t_family = AF_INET6;
-			}
-		}
-#endif
-		if (error)
-			break;
-		tp->t_template = tcp_template(tp);
-		if (tp->t_template == 0) {
-#ifdef INET
-			if (inp)
-				in_pcbdisconnect(inp);
-#endif
-#ifdef INET6
-			if (in6p)
-				in6_pcbdisconnect(in6p);
-#endif
-			error = ENOBUFS;
-			break;
-		}
-		/*
-		 * Compute window scaling to request.
-		 * XXX: This should be moved to tcp_output().
-		 */
-		while (tp->request_r_scale < TCP_MAX_WINSHIFT &&
-		    (TCP_MAXWIN << tp->request_r_scale) < sb_max)
-			tp->request_r_scale++;
-		soisconnecting(so);
-		TCP_STATINC(TCP_STAT_CONNATTEMPT);
-		tp->t_state = TCPS_SYN_SENT;
-		TCP_TIMER_ARM(tp, TCPT_KEEP, tp->t_keepinit);
-		tp->iss = tcp_new_iss(tp, 0);
-		tcp_sendseqinit(tp);
-		error = tcp_output(tp);
-		break;
-
-	/*
 	 * Create a TCP connection between two sockets.
 	 */
 	case PRU_CONNECT2:
@@ -919,6 +854,96 @@ release:
 }
 
 static int
+tcp_connect(struct socket *so, struct mbuf *nam)
+{
+	struct inpcb *inp = NULL;
+	struct in6pcb *in6p = NULL;
+	struct tcpcb *tp = NULL;
+	int s;
+	int error = 0;
+	int ostate = 0;
+
+	KASSERT(solocked(so));
+
+	if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
+		return error;
+
+	ostate = tcp_debug_capture(tp, PRU_CONNECT);
+
+	s = splsoftnet();
+
+	/*
+	 * Initiate connection to peer.
+	 * Create a template for use in transmissions on this connection.
+	 * Enter SYN_SENT state, and mark socket as connecting.
+	 * Start keep-alive timer, and seed output sequence space.
+	 * Send initial segment on connection.
+	 */
+#ifdef INET
+	if (inp) {
+		if (inp->inp_lport == 0) {
+			error = in_pcbbind(inp, NULL);
+			if (error)
+				goto release;
+		}
+		error = in_pcbconnect(inp, nam, curlwp);
+	}
+#endif
+#ifdef INET6
+	if (in6p) {
+		if (in6p->in6p_lport == 0) {
+			error = in6_pcbbind(in6p, NULL);
+			if (error)
+				goto release;
+		}
+		error = in6_pcbconnect(in6p, nam, curlwp);
+		if (!error) {
+			/* mapped addr case */
+			if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr))
+				tp->t_family = AF_INET;
+			else
+				tp->t_family = AF_INET6;
+		}
+	}
+#endif
+	if (error)
+		goto release;
+	tp->t_template = tcp_template(tp);
+	if (tp->t_template == 0) {
+#ifdef INET
+		if (inp)
+			in_pcbdisconnect(inp);
+#endif
+#ifdef INET6
+		if (in6p)
+			in6_pcbdisconnect(in6p);
+#endif
+		error = ENOBUFS;
+		goto release;
+	}
+	/*
+	 * Compute window scaling to request.
+	 * XXX: This should be moved to tcp_output().
+	 */
+	while (tp->request_r_scale < TCP_MAX_WINSHIFT &&
+	    (TCP_MAXWIN << tp->request_r_scale) < sb_max)
+		tp->request_r_scale++;
+	soisconnecting(so);
+	TCP_STATINC(TCP_STAT_CONNATTEMPT);
+	tp->t_state = TCPS_SYN_SENT;
+	TCP_TIMER_ARM(tp, TCPT_KEEP, tp->t_keepinit);
+	tp->iss = tcp_new_iss(tp, 0);
+	tcp_sendseqinit(tp);
+	error = tcp_output(tp);
+
+release:
+	tcp_debug_trace(so, tp, ostate, PRU_CONNECT);
+	splx(s);
+
+	return error;
+}
+
+static int
 tcp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	switch (so->so_proto->pr_domain->dom_family) {
@@ -2309,6 +2334,7 @@ PR_WRAP_USRREQS(tcp)
 #define	tcp_accept	tcp_accept_wrapper
 #define	tcp_bind	tcp_bind_wrapper
 #define	tcp_listen	tcp_listen_wrapper
+#define	tcp_connect	tcp_connect_wrapper
 #define	tcp_ioctl	tcp_ioctl_wrapper
 #define	tcp_stat	tcp_stat_wrapper
 #define	tcp_peeraddr	tcp_peeraddr_wrapper
@@ -2323,6 +2349,7 @@ const struct pr_usrreqs tcp_usrreqs = {
 	.pr_accept	= tcp_accept,
 	.pr_bind	= tcp_bind,
 	.pr_listen	= tcp_listen,
+	.pr_connect	= tcp_connect,
 	.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.210 src/sys/netinet/udp_usrreq.c:1.211
--- src/sys/netinet/udp_usrreq.c:1.210	Thu Jul 24 15:12:03 2014
+++ src/sys/netinet/udp_usrreq.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.210 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.211 2014/07/30 10:04:26 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.210 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.211 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -930,6 +930,24 @@ udp_listen(struct socket *so)
 	return EOPNOTSUPP;
 }
 
+static int
+udp_connect(struct socket *so, struct mbuf *nam)
+{
+	struct inpcb *inp = sotoinpcb(so);
+	int error = 0;
+	int s;
+
+	KASSERT(solocked(so));
+	KASSERT(inp != NULL);
+	KASSERT(nam != NULL);
+
+	s = splsoftnet();
+	error = in_pcbconnect(inp, nam, curlwp);
+	if (! error)
+		soisconnected(so);
+	splx(s);
+	return error;
+}
 
 static int
 udp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
@@ -999,6 +1017,7 @@ udp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -1031,13 +1050,6 @@ udp_usrreq(struct socket *so, int req, s
 	 * the udp pcb queue and/or pcb addresses.
 	 */
 	switch (req) {
-	case PRU_CONNECT:
-		error = in_pcbconnect(inp, nam, l);
-		if (error)
-			break;
-		soisconnected(so);
-		break;
-
 	case PRU_CONNECT2:
 		error = EOPNOTSUPP;
 		break;
@@ -1328,6 +1340,7 @@ PR_WRAP_USRREQS(udp)
 #define	udp_accept	udp_accept_wrapper
 #define	udp_bind	udp_bind_wrapper
 #define	udp_listen	udp_listen_wrapper
+#define	udp_connect	udp_connect_wrapper
 #define	udp_ioctl	udp_ioctl_wrapper
 #define	udp_stat	udp_stat_wrapper
 #define	udp_peeraddr	udp_peeraddr_wrapper
@@ -1342,6 +1355,7 @@ const struct pr_usrreqs udp_usrreqs = {
 	.pr_accept	= udp_accept,
 	.pr_bind	= udp_bind,
 	.pr_listen	= udp_listen,
+	.pr_connect	= udp_connect,
 	.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.129 src/sys/netinet6/raw_ip6.c:1.130
--- src/sys/netinet6/raw_ip6.c:1.129	Thu Jul 24 15:12:03 2014
+++ src/sys/netinet6/raw_ip6.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.129 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.130 2014/07/30 10:04:26 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.129 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.130 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -699,6 +699,62 @@ rip6_listen(struct socket *so)
 }
 
 static int
+rip6_connect(struct socket *so, struct mbuf *nam)
+{
+	struct in6pcb *in6p = sotoin6pcb(so);
+	struct sockaddr_in6 *addr;
+	struct in6_addr *in6a = NULL;
+	struct ifnet *ifp = NULL;
+	int scope_ambiguous = 0;
+	int error = 0;
+
+	KASSERT(solocked(so));
+	KASSERT(in6p != NULL);
+	KASSERT(nam != NULL);
+
+	addr = mtod(nam, struct sockaddr_in6 *);
+
+	if (nam->m_len != sizeof(*addr))
+		return EINVAL;
+	if (!IFNET_FIRST())
+		return EADDRNOTAVAIL;
+	if (addr->sin6_family != AF_INET6)
+		return EAFNOSUPPORT;
+
+	/*
+	 * Application should provide a proper zone ID or the use of
+	 * default zone IDs should be enabled.  Unfortunately, some
+	 * applications do not behave as it should, so we need a
+	 * workaround.  Even if an appropriate ID is not determined,
+	 * we'll see if we can determine the outgoing interface.  If we
+	 * can, determine the zone ID based on the interface below.
+	 */
+	if (addr->sin6_scope_id == 0 && !ip6_use_defzone)
+		scope_ambiguous = 1;
+	if ((error = sa6_embedscope(addr, ip6_use_defzone)) != 0)
+		return error;
+
+	/* Source address selection. XXX: need pcblookup? */
+	in6a = in6_selectsrc(addr, in6p->in6p_outputopts,
+	    in6p->in6p_moptions, &in6p->in6p_route,
+	    &in6p->in6p_laddr, &ifp, &error);
+	if (in6a == NULL) {
+		if (error == 0)
+			return EADDRNOTAVAIL;
+		return error;
+	}
+	/* XXX: see above */
+	if (ifp && scope_ambiguous &&
+	    (error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
+		return error;
+	}
+	in6p->in6p_laddr = *in6a;
+	in6p->in6p_faddr = addr->sin6_addr;
+	soisconnected(so);
+	return error;
+}
+
+static int
 rip6_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return in6_control(so, cmd, nam, ifp);
@@ -764,6 +820,7 @@ rip6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -795,59 +852,6 @@ rip6_usrreq(struct socket *so, int req, 
 		rip6_detach(so);
 		break;
 
-	case PRU_CONNECT:
-	{
-		struct sockaddr_in6 *addr = mtod(nam, struct sockaddr_in6 *);
-		struct in6_addr *in6a = NULL;
-		struct ifnet *ifp = NULL;
-		int scope_ambiguous = 0;
-
-		if (nam->m_len != sizeof(*addr)) {
-			error = EINVAL;
-			break;
-		}
-		if (!IFNET_FIRST()) {
-			error = EADDRNOTAVAIL;
-			break;
-		}
-		if (addr->sin6_family != AF_INET6) {
-			error = EAFNOSUPPORT;
-			break;
-		}
-
-		/*
-		 * Application should provide a proper zone ID or the use of
-		 * default zone IDs should be enabled.  Unfortunately, some
-		 * applications do not behave as it should, so we need a
-		 * workaround.  Even if an appropriate ID is not determined,
-		 * we'll see if we can determine the outgoing interface.  If we
-		 * can, determine the zone ID based on the interface below.
-		 */
-		if (addr->sin6_scope_id == 0 && !ip6_use_defzone)
-			scope_ambiguous = 1;
-		if ((error = sa6_embedscope(addr, ip6_use_defzone)) != 0)
-			return error;
-
-		/* Source address selection. XXX: need pcblookup? */
-		in6a = in6_selectsrc(addr, in6p->in6p_outputopts,
-		    in6p->in6p_moptions, &in6p->in6p_route,
-		    &in6p->in6p_laddr, &ifp, &error);
-		if (in6a == NULL) {
-			if (error == 0)
-				error = EADDRNOTAVAIL;
-			break;
-		}
-		/* XXX: see above */
-		if (ifp && scope_ambiguous &&
-		    (error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
-			break;
-		}
-		in6p->in6p_laddr = *in6a;
-		in6p->in6p_faddr = addr->sin6_addr;
-		soisconnected(so);
-		break;
-	}
-
 	case PRU_CONNECT2:
 		error = EOPNOTSUPP;
 		break;
@@ -959,6 +963,7 @@ PR_WRAP_USRREQS(rip6)
 #define	rip6_accept		rip6_accept_wrapper
 #define	rip6_bind		rip6_bind_wrapper
 #define	rip6_listen		rip6_listen_wrapper
+#define	rip6_connect		rip6_connect_wrapper
 #define	rip6_ioctl		rip6_ioctl_wrapper
 #define	rip6_stat		rip6_stat_wrapper
 #define	rip6_peeraddr		rip6_peeraddr_wrapper
@@ -973,6 +978,7 @@ const struct pr_usrreqs rip6_usrreqs = {
 	.pr_accept	= rip6_accept,
 	.pr_bind	= rip6_bind,
 	.pr_listen	= rip6_listen,
+	.pr_connect	= rip6_connect,
 	.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.109 src/sys/netinet6/udp6_usrreq.c:1.110
--- src/sys/netinet6/udp6_usrreq.c:1.109	Thu Jul 24 15:12:03 2014
+++ src/sys/netinet6/udp6_usrreq.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp6_usrreq.c,v 1.109 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: udp6_usrreq.c,v 1.110 2014/07/30 10:04:26 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.109 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.110 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_csum.h"
@@ -710,6 +710,27 @@ udp6_listen(struct socket *so)
 }
 
 static int
+udp6_connect(struct socket *so, struct mbuf *nam)
+{
+	struct in6pcb *in6p = sotoin6pcb(so);
+	int error = 0;
+	int s;
+
+	KASSERT(solocked(so));
+	KASSERT(in6p != NULL);
+
+	if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr))
+		return EISCONN;
+	s = splsoftnet();
+	error = in6_pcbconnect(in6p, nam, curlwp);
+	splx(s);
+	if (error == 0)
+		soisconnected(so);
+
+	return error;
+}
+
+static int
 udp6_ioctl(struct socket *so, u_long cmd, void *addr6, struct ifnet *ifp)
 {
 	/*
@@ -789,6 +810,7 @@ udp6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -811,18 +833,6 @@ udp6_usrreq(struct socket *so, int req, 
 
 	switch (req) {
 
-	case PRU_CONNECT:
-		if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
-			error = EISCONN;
-			break;
-		}
-		s = splsoftnet();
-		error = in6_pcbconnect(in6p, addr6, l);
-		splx(s);
-		if (error == 0)
-			soisconnected(so);
-		break;
-
 	case PRU_DISCONNECT:
 		if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
 			error = ENOTCONN;
@@ -948,6 +958,7 @@ PR_WRAP_USRREQS(udp6)
 #define	udp6_accept	udp6_accept_wrapper
 #define	udp6_bind	udp6_bind_wrapper
 #define	udp6_listen	udp6_listen_wrapper
+#define	udp6_connect	udp6_connect_wrapper
 #define	udp6_ioctl	udp6_ioctl_wrapper
 #define	udp6_stat	udp6_stat_wrapper
 #define	udp6_peeraddr	udp6_peeraddr_wrapper
@@ -962,6 +973,7 @@ const struct pr_usrreqs udp6_usrreqs = {
 	.pr_accept	= udp6_accept,
 	.pr_bind	= udp6_bind,
 	.pr_listen	= udp6_listen,
+	.pr_connect	= udp6_connect,
 	.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.37 src/sys/netipsec/keysock.c:1.38
--- src/sys/netipsec/keysock.c:1.37	Thu Jul 24 15:12:03 2014
+++ src/sys/netipsec/keysock.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.37 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: keysock.c,v 1.38 2014/07/30 10:04:26 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.37 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.38 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -511,6 +511,14 @@ key_listen(struct socket *so)
 }
 
 static int
+key_connect(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -590,6 +598,7 @@ key_usrreq(struct socket *so, int req,st
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -617,6 +626,7 @@ PR_WRAP_USRREQS(key)
 #define	key_accept	key_accept_wrapper
 #define	key_bind	key_bind_wrapper
 #define	key_listen	key_listen_wrapper
+#define	key_connect	key_connect_wrapper
 #define	key_ioctl	key_ioctl_wrapper
 #define	key_stat	key_stat_wrapper
 #define	key_peeraddr	key_peeraddr_wrapper
@@ -631,6 +641,7 @@ const struct pr_usrreqs key_usrreqs = {
 	.pr_accept	= key_accept,
 	.pr_bind	= key_bind,
 	.pr_listen	= key_listen,
+	.pr_connect	= key_connect,
 	.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.17 src/sys/netmpls/mpls_proto.c:1.18
--- src/sys/netmpls/mpls_proto.c:1.17	Thu Jul 24 15:12:03 2014
+++ src/sys/netmpls/mpls_proto.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_proto.c,v 1.17 2014/07/24 15:12:03 rtr Exp $ */
+/*	$NetBSD: mpls_proto.c,v 1.18 2014/07/30 10:04:26 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.17 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.18 2014/07/30 10:04:26 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_mbuftrace.h"
@@ -119,6 +119,14 @@ mpls_listen(struct socket *so)
 }
 
 static int
+mpls_connect(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;
@@ -258,6 +266,7 @@ PR_WRAP_USRREQS(mpls)
 #define	mpls_accept	mpls_accept_wrapper
 #define	mpls_bind	mpls_bind_wrapper
 #define	mpls_listen	mpls_listen_wrapper
+#define	mpls_connect	mpls_connect_wrapper
 #define	mpls_ioctl	mpls_ioctl_wrapper
 #define	mpls_stat	mpls_stat_wrapper
 #define	mpls_peeraddr	mpls_peeraddr_wrapper
@@ -272,6 +281,7 @@ static const struct pr_usrreqs mpls_usrr
 	.pr_accept	= mpls_accept,
 	.pr_bind	= mpls_bind,
 	.pr_listen	= mpls_listen,
+	.pr_connect	= mpls_connect,
 	.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.39 src/sys/netnatm/natm.c:1.40
--- src/sys/netnatm/natm.c:1.39	Thu Jul 24 15:12:03 2014
+++ src/sys/netnatm/natm.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: natm.c,v 1.39 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: natm.c,v 1.40 2014/07/30 10:04:26 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.39 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.40 2014/07/30 10:04:26 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -100,7 +100,7 @@ natm_detach(struct socket *so)
 static int
 natm_accept(struct socket *so, struct mbuf *nam)
 {
-	KASSERt(solocked(so));
+	KASSERT(solocked(so));
 
 	return EOPNOTSUPP;
 }
@@ -108,7 +108,7 @@ natm_accept(struct socket *so, struct mb
 static int
 natm_bind(struct socket *so, struct mbuf *nam)
 {
-	KASSERt(solocked(so));
+	KASSERT(solocked(so));
 
 	return EOPNOTSUPP;
 }
@@ -116,12 +116,81 @@ natm_bind(struct socket *so, struct mbuf
 static int
 natm_listen(struct socket *so)
 {
-	KASSERt(solocked(so));
+	KASSERT(solocked(so));
 
 	return EOPNOTSUPP;
 }
 
 static int
+natm_connect(struct socket *so, struct mbuf *nam)
+{
+	int error = 0, s2;
+	struct natmpcb *npcb;
+	struct sockaddr_natm *snatm;
+	struct atm_pseudoioctl api;
+	struct atm_pseudohdr *aph;
+	struct ifnet *ifp;
+	int proto = so->so_proto->pr_protocol;
+
+	KASSERT(solocked(so));
+
+	/*
+	 * validate nam and npcb
+	 */
+
+	if (nam->m_len != sizeof(*snatm))
+		return EINVAL;
+	snatm = mtod(nam, struct sockaddr_natm *);
+	if (snatm->snatm_len != sizeof(*snatm) ||
+	    (npcb->npcb_flags & NPCB_FREE) == 0)
+		return EINVAL;
+	if (snatm->snatm_family != AF_NATM)
+		return EAFNOSUPPORT;
+
+	snatm->snatm_if[IFNAMSIZ-1] = '\0';  /* XXX ensure null termination
+						since ifunit() uses strcmp */
+
+	/*
+	 * convert interface string to ifp, validate.
+	 */
+
+	ifp = ifunit(snatm->snatm_if);
+	if (ifp == NULL || (ifp->if_flags & IFF_RUNNING) == 0) {
+		return ENXIO;
+	}
+	if (ifp->if_output != atm_output) {
+		return EAFNOSUPPORT;
+	}
+
+	/*
+	 * register us with the NATM PCB layer
+	 */
+
+	if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb)
+		return EADDRINUSE;
+
+	/*
+	 * enable rx
+	 */
+
+	ATM_PH_FLAGS(&api.aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
+	ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
+	ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
+	api.rxhand = npcb;
+	s2 = splnet();
+	if (ifp->if_ioctl(ifp, SIOCATMENA, &api) != 0) {
+		splx(s2);
+		npcb_free(npcb, NPCB_REMOVE);
+		return EIO;
+	}
+	splx(s2);
+
+	soisconnected(so);
+	return error;
+}
+
+
+static int
 natm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
   int error = 0, s;
@@ -234,6 +303,7 @@ natm_usrreq(struct socket *so, int req, 
   KASSERT(req != PRU_ACCEPT);
   KASSERT(req != PRU_BIND);
   KASSERT(req != PRU_LISTEN);
+  KASSERT(req != PRU_CONNECT);
   KASSERT(req != PRU_CONTROL);
   KASSERT(req != PRU_SENSE);
   KASSERT(req != PRU_PEERADDR);
@@ -251,75 +321,6 @@ natm_usrreq(struct socket *so, int req, 
   }
 
   switch (req) {
-    case PRU_CONNECT:			/* establish connection to peer */
-
-      /*
-       * validate nam and npcb
-       */
-
-      if (nam->m_len != sizeof(*snatm)) {
-        error = EINVAL;
-	break;
-      }
-      snatm = mtod(nam, struct sockaddr_natm *);
-      if (snatm->snatm_len != sizeof(*snatm) ||
-		(npcb->npcb_flags & NPCB_FREE) == 0) {
-	error = EINVAL;
-	break;
-      }
-      if (snatm->snatm_family != AF_NATM) {
-	error = EAFNOSUPPORT;
-	break;
-      }
-
-      snatm->snatm_if[IFNAMSIZ-1] = '\0';  /* XXX ensure null termination
-						since ifunit() uses strcmp */
-
-      /*
-       * convert interface string to ifp, validate.
-       */
-
-      ifp = ifunit(snatm->snatm_if);
-      if (ifp == NULL || (ifp->if_flags & IFF_RUNNING) == 0) {
-	error = ENXIO;
-	break;
-      }
-      if (ifp->if_output != atm_output) {
-	error = EAFNOSUPPORT;
-	break;
-      }
-
-
-      /*
-       * register us with the NATM PCB layer
-       */
-
-      if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb) {
-        error = EADDRINUSE;
-        break;
-      }
-
-      /*
-       * enable rx
-       */
-
-      ATM_PH_FLAGS(&api.aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
-      ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
-      ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
-      api.rxhand = npcb;
-      s2 = splnet();
-      if (ifp->if_ioctl(ifp, SIOCATMENA, &api) != 0) {
-	splx(s2);
-	npcb_free(npcb, NPCB_REMOVE);
-        error = EIO;
-	break;
-      }
-      splx(s2);
-
-      soisconnected(so);
-
-      break;
-
     case PRU_DISCONNECT:		/* disconnect from peer */
 
       if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) {
@@ -482,6 +483,7 @@ PR_WRAP_USRREQS(natm)
 #define	natm_accept	natm_accept_wrapper
 #define	natm_bind	natm_bind_wrapper
 #define	natm_listen	natm_listen_wrapper
+#define	natm_connect	natm_connect_wrapper
 #define	natm_ioctl	natm_ioctl_wrapper
 #define	natm_stat	natm_stat_wrapper
 #define	natm_peeraddr	natm_peeraddr_wrapper
@@ -496,6 +498,7 @@ const struct pr_usrreqs natm_usrreqs = {
 	.pr_accept	= natm_accept,
 	.pr_bind	= natm_bind,
 	.pr_listen	= natm_listen,
+	.pr_connect	= natm_connect,
 	.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.52 src/sys/rump/net/lib/libsockin/sockin.c:1.53
--- src/sys/rump/net/lib/libsockin/sockin.c:1.52	Mon Jul 28 10:09:51 2014
+++ src/sys/rump/net/lib/libsockin/sockin.c	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sockin.c,v 1.52 2014/07/28 10:09:51 rtr Exp $	*/
+/*	$NetBSD: sockin.c,v 1.53 2014/07/30 10:04:26 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.52 2014/07/28 10:09:51 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.53 2014/07/30 10:04:26 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -71,6 +71,7 @@ static void	sockin_detach(struct socket 
 static int	sockin_accept(struct socket *, struct mbuf *);
 static int	sockin_bind(struct socket *, struct mbuf *);
 static int	sockin_listen(struct socket *);
+static int	sockin_connect(struct socket *, struct mbuf *);
 static int	sockin_ioctl(struct socket *, u_long, void *, struct ifnet *);
 static int	sockin_stat(struct socket *, struct stat *);
 static int	sockin_peeraddr(struct socket *, struct mbuf *);
@@ -87,6 +88,7 @@ static const struct pr_usrreqs sockin_us
 	.pr_accept = sockin_accept,
 	.pr_bind = sockin_bind,
 	.pr_listen = sockin_listen,
+	.pr_connect = sockin_connect,
 	.pr_ioctl = sockin_ioctl,
 	.pr_stat = sockin_stat,
 	.pr_peeraddr = sockin_peeraddr,
@@ -496,6 +498,23 @@ sockin_listen(struct socket *so)
 }
 
 static int
+sockin_connect(struct socket *so, struct mbuf *nam)
+{
+	int error = 0;
+
+	KASSERT(solocked(so));
+	KASSERT(nam != NULL);
+
+	error = rumpcomp_sockin_connect(SO2S(so),
+	    mtod(nam, struct sockaddr *), nam->m_len);
+	if (error == 0)
+		soisconnected(so);
+
+	return error;
+}
+
+
+static int
 sockin_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return ENOTTY;
@@ -560,6 +579,7 @@ sockin_usrreq(struct socket *so, int req
 	KASSERT(req != PRU_ACCEPT);
 	KASSERT(req != PRU_BIND);
 	KASSERT(req != PRU_LISTEN);
+	KASSERT(req != PRU_CONNECT);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -568,13 +588,6 @@ sockin_usrreq(struct socket *so, int req
 	KASSERT(req != PRU_SENDOOB);
 
 	switch (req) {
-	case PRU_CONNECT:
-		error = rumpcomp_sockin_connect(SO2S(so),
-		    mtod(nam, struct sockaddr *), nam->m_len);
-		if (error == 0)
-			soisconnected(so);
-		break;
-
 	case PRU_SEND:
 	{
 		struct sockaddr *saddr;

Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.54 src/sys/sys/protosw.h:1.55
--- src/sys/sys/protosw.h:1.54	Thu Jul 24 15:12:03 2014
+++ src/sys/sys/protosw.h	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: protosw.h,v 1.54 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: protosw.h,v 1.55 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -241,6 +241,7 @@ struct pr_usrreqs {
 	int	(*pr_accept)(struct socket *, struct mbuf *);
 	int	(*pr_bind)(struct socket *, struct mbuf *);
 	int	(*pr_listen)(struct socket *);
+	int	(*pr_connect)(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 *);
@@ -317,6 +318,15 @@ name##_bind_wrapper(struct socket *a, st
 	return rv;					\
 }							\
 static int						\
+name##_connect_wrapper(struct socket *a, struct mbuf *b)\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_connect(a, b);			\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_listen_wrapper(struct socket *a)			\
 {							\
 	int rv;						\

Index: src/sys/sys/un.h
diff -u src/sys/sys/un.h:1.49 src/sys/sys/un.h:1.50
--- src/sys/sys/un.h:1.49	Thu Jul 24 15:12:03 2014
+++ src/sys/sys/un.h	Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: un.h,v 1.49 2014/07/24 15:12:03 rtr Exp $	*/
+/*	$NetBSD: un.h,v 1.50 2014/07/30 10:04:26 rtr Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -85,7 +85,7 @@ kmutex_t *uipc_streamlock (void);
 kmutex_t *uipc_rawlock (void);
 
 int	unp_bind (struct socket *, struct mbuf *);
-int	unp_connect (struct socket *, struct mbuf *, struct lwp *);
+int	unp_connect (struct socket *, struct mbuf *);
 int	unp_connect2 (struct socket *, struct socket *, int);
 void	unp_discard (struct file *);
 void	unp_disconnect (struct unpcb *);

Reply via email to