Module Name:    src
Committed By:   rtr
Date:           Thu Jul 24 15:12:04 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: link_proto.c raw_usrreq.c rtsock.c
        src/sys/netatalk: ddp_usrreq.c
        src/sys/netbt: hci_socket.c l2cap.h l2cap_socket.c l2cap_upper.c
            rfcomm.h rfcomm_session.c rfcomm_socket.c rfcomm_upper.c sco.h
            sco_socket.c sco_upper.c
        src/sys/netinet: in_pcb.c in_pcb.h raw_ip.c tcp_usrreq.c udp_usrreq.c
        src/sys/netinet6: in6_pcb.c in6_pcb.h 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: param.h protosw.h un.h

Log Message:
split PRU_BIND and PRU_LISTEN function out of pr_generic() usrreq
switches and put into separate functions
  xxx_bind(struct socket *, struct mbuf *)
  xxx_listen(struct socket *)

  - always KASSERT(solocked(so)) even if not implemented

  - replace calls to pr_generic() with req = PRU_BIND with call to
    pr_bind()

  - replace calls to pr_generic() with req = PRU_LISTEN with call to
    pr_listen()

  - drop struct lwp * parameter from at_pcbsetaddr(), in_pcbbind() and
    unp_bind() and always use curlwp.

rename existing functions that operate on PCB for consistency (and to
free up their names for xxx_{bind,listen}() PRUs

  - l2cap_{bind,listen}() -> l2cap_{bind,listen}_pcb()
  - sco_{bind,listen}() -> sco_{bind,listen}_pcb()
  - rfcomm_{bind,listen}() -> rfcomm_{bind,listen}_pcb()

patch reviewed by rmind

welcome to netbsd 6.99.48


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/bluetooth/bthidev.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/bluetooth/btmagic.c
cvs rdiff -u -r1.29 -r1.30 src/sys/dev/bluetooth/btsco.c
cvs rdiff -u -r1.226 -r1.227 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.160 -r1.161 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.17 -r1.18 src/sys/net/link_proto.c
cvs rdiff -u -r1.44 -r1.45 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.156 -r1.157 src/sys/net/rtsock.c
cvs rdiff -u -r1.54 -r1.55 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.33 -r1.34 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.14 -r1.15 src/sys/netbt/l2cap.h src/sys/netbt/l2cap_upper.c
cvs rdiff -u -r1.24 -r1.25 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.13 -r1.14 src/sys/netbt/rfcomm.h
cvs rdiff -u -r1.20 -r1.21 src/sys/netbt/rfcomm_session.c
cvs rdiff -u -r1.25 -r1.26 src/sys/netbt/rfcomm_socket.c
cvs rdiff -u -r1.16 -r1.17 src/sys/netbt/rfcomm_upper.c
cvs rdiff -u -r1.7 -r1.8 src/sys/netbt/sco.h
cvs rdiff -u -r1.26 -r1.27 src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.12 -r1.13 src/sys/netbt/sco_upper.c
cvs rdiff -u -r1.148 -r1.149 src/sys/netinet/in_pcb.c
cvs rdiff -u -r1.52 -r1.53 src/sys/netinet/in_pcb.h
cvs rdiff -u -r1.135 -r1.136 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.189 -r1.190 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.209 -r1.210 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.125 -r1.126 src/sys/netinet6/in6_pcb.c
cvs rdiff -u -r1.37 -r1.38 src/sys/netinet6/in6_pcb.h
cvs rdiff -u -r1.128 -r1.129 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.108 -r1.109 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.36 -r1.37 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.16 -r1.17 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.38 -r1.39 src/sys/netnatm/natm.c
cvs rdiff -u -r1.50 -r1.51 src/sys/rump/net/lib/libsockin/sockin.c
cvs rdiff -u -r1.457 -r1.458 src/sys/sys/param.h
cvs rdiff -u -r1.53 -r1.54 src/sys/sys/protosw.h
cvs rdiff -u -r1.48 -r1.49 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.25 src/sys/dev/bluetooth/bthidev.c:1.26
--- src/sys/dev/bluetooth/bthidev.c:1.25	Tue May 20 18:25:54 2014
+++ src/sys/dev/bluetooth/bthidev.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: bthidev.c,v 1.25 2014/05/20 18:25:54 rmind Exp $	*/
+/*	$NetBSD: bthidev.c,v 1.26 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.25 2014/05/20 18:25:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.26 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -508,11 +508,11 @@ bthidev_listen(struct bthidev_softc *sc)
 		return err;
 
 	sa.bt_psm = sc->sc_ctlpsm;
-	err = l2cap_bind(sc->sc_ctl_l, &sa);
+	err = l2cap_bind_pcb(sc->sc_ctl_l, &sa);
 	if (err)
 		return err;
 
-	err = l2cap_listen(sc->sc_ctl_l);
+	err = l2cap_listen_pcb(sc->sc_ctl_l);
 	if (err)
 		return err;
 
@@ -528,11 +528,11 @@ bthidev_listen(struct bthidev_softc *sc)
 		return err;
 
 	sa.bt_psm = sc->sc_intpsm;
-	err = l2cap_bind(sc->sc_int_l, &sa);
+	err = l2cap_bind_pcb(sc->sc_int_l, &sa);
 	if (err)
 		return err;
 
-	err = l2cap_listen(sc->sc_int_l);
+	err = l2cap_listen_pcb(sc->sc_int_l);
 	if (err)
 		return err;
 
@@ -569,9 +569,9 @@ bthidev_connect(struct bthidev_softc *sc
 	}
 
 	bdaddr_copy(&sa.bt_bdaddr, &sc->sc_laddr);
-	err = l2cap_bind(sc->sc_ctl, &sa);
+	err = l2cap_bind_pcb(sc->sc_ctl, &sa);
 	if (err) {
-		aprint_error_dev(sc->sc_dev, "l2cap_bind failed (%d)\n", err);
+		aprint_error_dev(sc->sc_dev, "l2cap_bind_pcb failed (%d)\n", err);
 		return err;
 	}
 
@@ -747,7 +747,7 @@ bthidev_ctl_connected(void *arg)
 		sa.bt_family = AF_BLUETOOTH;
 		bdaddr_copy(&sa.bt_bdaddr, &sc->sc_laddr);
 
-		err = l2cap_bind(sc->sc_int, &sa);
+		err = l2cap_bind_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.7 src/sys/dev/bluetooth/btmagic.c:1.8
--- src/sys/dev/bluetooth/btmagic.c:1.7	Tue May 20 18:25:54 2014
+++ src/sys/dev/bluetooth/btmagic.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: btmagic.c,v 1.7 2014/05/20 18:25:54 rmind Exp $	*/
+/*	$NetBSD: btmagic.c,v 1.8 2014/07/24 15:12:03 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.7 2014/05/20 18:25:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: btmagic.c,v 1.8 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -472,11 +472,11 @@ btmagic_listen(struct btmagic_softc *sc)
 		return err;
 
 	sa.bt_psm = L2CAP_PSM_HID_CNTL;
-	err = l2cap_bind(sc->sc_ctl_l, &sa);
+	err = l2cap_bind_pcb(sc->sc_ctl_l, &sa);
 	if (err)
 		return err;
 
-	err = l2cap_listen(sc->sc_ctl_l);
+	err = l2cap_listen_pcb(sc->sc_ctl_l);
 	if (err)
 		return err;
 
@@ -492,11 +492,11 @@ btmagic_listen(struct btmagic_softc *sc)
 		return err;
 
 	sa.bt_psm = L2CAP_PSM_HID_INTR;
-	err = l2cap_bind(sc->sc_int_l, &sa);
+	err = l2cap_bind_pcb(sc->sc_int_l, &sa);
 	if (err)
 		return err;
 
-	err = l2cap_listen(sc->sc_int_l);
+	err = l2cap_listen_pcb(sc->sc_int_l);
 	if (err)
 		return err;
 
@@ -534,9 +534,9 @@ btmagic_connect(struct btmagic_softc *sc
 	}
 
 	bdaddr_copy(&sa.bt_bdaddr, &sc->sc_laddr);
-	err = l2cap_bind(sc->sc_ctl, &sa);
+	err = l2cap_bind_pcb(sc->sc_ctl, &sa);
 	if (err) {
-		printf("%s: l2cap_bind failed (%d)\n",
+		printf("%s: l2cap_bind_pcb failed (%d)\n",
 		    device_xname(sc->sc_dev), err);
 		return err;
 	}
@@ -824,7 +824,7 @@ btmagic_ctl_connected(void *arg)
 		sa.bt_family = AF_BLUETOOTH;
 		bdaddr_copy(&sa.bt_bdaddr, &sc->sc_laddr);
 
-		err = l2cap_bind(sc->sc_int, &sa);
+		err = l2cap_bind_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.29 src/sys/dev/bluetooth/btsco.c:1.30
--- src/sys/dev/bluetooth/btsco.c:1.29	Tue May 20 18:25:54 2014
+++ src/sys/dev/bluetooth/btsco.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: btsco.c,v 1.29 2014/05/20 18:25:54 rmind Exp $	*/
+/*	$NetBSD: btsco.c,v 1.30 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.29 2014/05/20 18:25:54 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.30 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/audioio.h>
@@ -592,13 +592,13 @@ btsco_open(void *hdl, int flags)
 		if (err)
 			goto done;
 
-		err = sco_bind(sc->sc_sco_l, &sa);
+		err = sco_bind_pcb(sc->sc_sco_l, &sa);
 		if (err) {
 			sco_detach_pcb(&sc->sc_sco_l);
 			goto done;
 		}
 
-		err = sco_listen(sc->sc_sco_l);
+		err = sco_listen_pcb(sc->sc_sco_l);
 		if (err) {
 			sco_detach_pcb(&sc->sc_sco_l);
 			goto done;
@@ -610,7 +610,7 @@ btsco_open(void *hdl, int flags)
 		if (err)
 			goto done;
 
-		err = sco_bind(sc->sc_sco, &sa);
+		err = sco_bind_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.226 src/sys/kern/uipc_socket.c:1.227
--- src/sys/kern/uipc_socket.c:1.226	Wed Jul 23 13:17:18 2014
+++ src/sys/kern/uipc_socket.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.226 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.227 2014/07/24 15:12:03 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.226 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.227 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_sock_counters.h"
@@ -629,8 +629,7 @@ sobind(struct socket *so, struct mbuf *n
 	int	error;
 
 	solock(so);
-	error = (*so->so_proto->pr_usrreqs->pr_generic)(so,
-	    PRU_BIND, NULL, nam, NULL, l);
+	error = (*so->so_proto->pr_usrreqs->pr_bind)(so, nam);
 	sounlock(so);
 	return error;
 }
@@ -646,8 +645,7 @@ solisten(struct socket *so, int backlog,
 		sounlock(so);
 		return EINVAL;
 	}
-	error = (*so->so_proto->pr_usrreqs->pr_generic)(so,
-	    PRU_LISTEN, NULL, NULL, NULL, l);
+	error = (*so->so_proto->pr_usrreqs->pr_listen)(so);
 	if (error != 0) {
 		sounlock(so);
 		return error;

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.160 src/sys/kern/uipc_usrreq.c:1.161
--- src/sys/kern/uipc_usrreq.c:1.160	Wed Jul 23 13:17:18 2014
+++ src/sys/kern/uipc_usrreq.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.160 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.161 2014/07/24 15:12:03 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.160 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.161 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -396,6 +396,8 @@ unp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -413,21 +415,6 @@ unp_usrreq(struct socket *so, int req, s
 	}
 
 	switch (req) {
-	case PRU_BIND:
-		KASSERT(l != NULL);
-		error = unp_bind(so, nam, l);
-		break;
-
-	case PRU_LISTEN:
-		/*
-		 * If the socket can accept a connection, it must be
-		 * locked by uipc_lock.
-		 */
-		unp_resetlock(so);
-		if (unp->unp_vnode == NULL)
-			error = EINVAL;
-		break;
-
 	case PRU_CONNECT:
 		KASSERT(l != NULL);
 		error = unp_connect(so, nam, l);
@@ -947,7 +934,7 @@ makeun(struct mbuf *nam, size_t *addrlen
 }
 
 int
-unp_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
+unp_bind(struct socket *so, struct mbuf *nam)
 {
 	struct sockaddr_un *sun;
 	struct unpcb *unp;
@@ -960,6 +947,11 @@ unp_bind(struct socket *so, struct mbuf 
 	proc_t *p;
 
 	unp = sotounpcb(so);
+
+	KASSERT(solocked(so));
+	KASSERT(unp != NULL);
+	KASSERT(nam != NULL);
+
 	if (unp->unp_vnode != NULL)
 		return (EINVAL);
 	if ((unp->unp_flags & UNP_BUSY) != 0) {
@@ -972,7 +964,7 @@ unp_bind(struct socket *so, struct mbuf 
 	unp->unp_flags |= UNP_BUSY;
 	sounlock(so);
 
-	p = l->l_proc;
+	p = curlwp->l_proc;
 	sun = makeun(nam, &addrlen);
 
 	pb = pathbuf_create(sun->sun_path);
@@ -1016,8 +1008,8 @@ unp_bind(struct socket *so, struct mbuf 
 	unp->unp_addrlen = addrlen;
 	unp->unp_addr = sun;
 	unp->unp_connid.unp_pid = p->p_pid;
-	unp->unp_connid.unp_euid = kauth_cred_geteuid(l->l_cred);
-	unp->unp_connid.unp_egid = kauth_cred_getegid(l->l_cred);
+	unp->unp_connid.unp_euid = kauth_cred_geteuid(curlwp->l_cred);
+	unp->unp_connid.unp_egid = kauth_cred_getegid(curlwp->l_cred);
 	unp->unp_flags |= UNP_EIDSBIND;
 	VOP_UNLOCK(vp);
 	vput(nd.ni_dvp);
@@ -1032,6 +1024,25 @@ unp_bind(struct socket *so, struct mbuf 
 	return (error);
 }
 
+static int
+unp_listen(struct socket *so)
+{
+	struct unpcb *unp = sotounpcb(so);
+
+	KASSERT(solocked(so));
+	KASSERT(unp != NULL);
+
+	/*
+	 * If the socket can accept a connection, it must be
+	 * locked by uipc_lock.
+	 */
+	unp_resetlock(so);
+	if (unp->unp_vnode == NULL)
+		return EINVAL;
+
+	return 0;
+}
+
 int
 unp_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
 {
@@ -1869,6 +1880,8 @@ const struct pr_usrreqs unp_usrreqs = {
 	.pr_attach	= unp_attach,
 	.pr_detach	= unp_detach,
 	.pr_accept	= unp_accept,
+	.pr_bind	= unp_bind,
+	.pr_listen	= unp_listen,
 	.pr_ioctl	= unp_ioctl,
 	.pr_stat	= unp_stat,
 	.pr_peeraddr	= unp_peeraddr,

Index: src/sys/net/link_proto.c
diff -u src/sys/net/link_proto.c:1.17 src/sys/net/link_proto.c:1.18
--- src/sys/net/link_proto.c:1.17	Mon Jul 21 12:03:38 2014
+++ src/sys/net/link_proto.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: link_proto.c,v 1.17 2014/07/21 12:03:38 ozaki-r Exp $	*/
+/*	$NetBSD: link_proto.c,v 1.18 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.17 2014/07/21 12:03:38 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.18 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -50,6 +50,9 @@ __KERNEL_RCSID(0, "$NetBSD: link_proto.c
 static int sockaddr_dl_cmp(const struct sockaddr *, const struct sockaddr *);
 static int link_attach(struct socket *, int);
 static void link_detach(struct socket *);
+static int link_accept(struct socket *, struct mbuf *);
+static int link_bind(struct socket *, struct mbuf *);
+static int link_listen(struct socket *);
 static int link_ioctl(struct socket *, u_long, void *, struct ifnet *);
 static int link_stat(struct socket *, struct stat *);
 static int link_peeraddr(struct socket *, struct mbuf *);
@@ -67,6 +70,9 @@ DOMAIN_DEFINE(linkdomain);	/* forward de
 static const struct pr_usrreqs link_usrreqs = {
 	.pr_attach	= link_attach,
 	.pr_detach	= link_detach,
+	.pr_accept	= link_accept,
+	.pr_bind	= link_bind,
+	.pr_listen	= link_listen,
 	.pr_ioctl	= link_ioctl,
 	.pr_stat	= link_stat,
 	.pr_peeraddr	= link_peeraddr,
@@ -239,6 +245,30 @@ link_detach(struct socket *so)
 }
 
 static int
+link_accept(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+link_bind(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+link_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 link_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return link_control(so, cmd, nam, ifp);
@@ -274,6 +304,9 @@ link_usrreq(struct socket *so, int req, 
 {
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);

Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.44 src/sys/net/raw_usrreq.c:1.45
--- src/sys/net/raw_usrreq.c:1.44	Wed Jul 23 13:17:18 2014
+++ src/sys/net/raw_usrreq.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_usrreq.c,v 1.44 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: raw_usrreq.c,v 1.45 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.44 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.45 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -163,6 +163,8 @@ raw_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -186,8 +188,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_BIND:
-	case PRU_LISTEN:
 	case PRU_CONNECT:
 	case PRU_CONNECT2:
 		error = EOPNOTSUPP;

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.156 src/sys/net/rtsock.c:1.157
--- src/sys/net/rtsock.c:1.156	Wed Jul 23 13:17:18 2014
+++ src/sys/net/rtsock.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.156 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.157 2014/07/24 15:12:03 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.156 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.157 2014/07/24 15:12:03 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -229,7 +229,23 @@ COMPATNAME(route_accept)(struct socket *
 	KASSERT(solocked(so));
 
 	panic("route_accept");
-	/* NOT REACHED */
+
+	return EOPNOTSUPP;
+}
+
+static int
+COMPATNAME(route_bind)(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+COMPATNAME(route_listen)(struct socket *so)
+{
+	KASSERT(solocked(so));
+
 	return EOPNOTSUPP;
 }
 
@@ -309,6 +325,8 @@ COMPATNAME(route_usrreq)(struct socket *
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -1412,6 +1430,8 @@ static const struct pr_usrreqs route_usr
 	.pr_attach	= COMPATNAME(route_attach_wrapper),
 	.pr_detach	= COMPATNAME(route_detach_wrapper),
 	.pr_accept	= COMPATNAME(route_accept_wrapper),
+	.pr_bind	= COMPATNAME(route_bind_wrapper),
+	.pr_listen	= COMPATNAME(route_listen_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.54 src/sys/netatalk/ddp_usrreq.c:1.55
--- src/sys/netatalk/ddp_usrreq.c:1.54	Wed Jul 23 13:17:18 2014
+++ src/sys/netatalk/ddp_usrreq.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ddp_usrreq.c,v 1.54 2014/07/23 13:17:18 rtr Exp $	 */
+/*	$NetBSD: ddp_usrreq.c,v 1.55 2014/07/24 15:12:03 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.54 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.55 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -58,7 +58,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 *, struct lwp *);
+static int at_pcbsetaddr(struct ddpcb *, struct mbuf *);
 static int at_pcbconnect(struct ddpcb *, struct mbuf *, struct lwp *);
 static void ddp_detach(struct socket *);
 
@@ -85,6 +85,8 @@ ddp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -109,10 +111,6 @@ ddp_usrreq(struct socket *so, int req, s
 		goto release;
 	}
 	switch (req) {
-	case PRU_BIND:
-		error = at_pcbsetaddr(ddp, addr, l);
-		break;
-
 	case PRU_CONNECT:
 		if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT) {
 			error = EISCONN;
@@ -171,7 +169,6 @@ ddp_usrreq(struct socket *so, int req, s
 		ddp_detach(so);
 		break;
 
-	case PRU_LISTEN:
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -208,7 +205,7 @@ at_sockaddr(struct ddpcb *ddp, struct mb
 }
 
 static int
-at_pcbsetaddr(struct ddpcb *ddp, struct mbuf *addr, struct lwp *l)
+at_pcbsetaddr(struct ddpcb *ddp, struct mbuf *addr)
 {
 	struct sockaddr_at lsat, *sat;
 	struct at_ifaddr *aa;
@@ -244,8 +241,8 @@ at_pcbsetaddr(struct ddpcb *ddp, struct 
 			    sat->sat_port >= ATPORT_LAST)
 				return (EINVAL);
 
-			if (sat->sat_port < ATPORT_RESERVED && l &&
-			    (error = kauth_authorize_network(l->l_cred,
+			if (sat->sat_port < ATPORT_RESERVED &&
+			    (error = kauth_authorize_network(curlwp->l_cred,
 			    KAUTH_NETWORK_BIND, KAUTH_REQ_NETWORK_BIND_PRIVPORT,
 			    ddpcb->ddp_socket, sat, NULL)) != 0)
 				return (error);
@@ -389,7 +386,7 @@ at_pcbconnect(struct ddpcb *ddp, struct 
 		return ENETUNREACH;
 	ddp->ddp_fsat = *sat;
 	if (ddp->ddp_lsat.sat_port == ATADDR_ANYPORT)
-		return at_pcbsetaddr(ddp, NULL, l);
+		return at_pcbsetaddr(ddp, NULL);
 	return 0;
 }
 
@@ -479,6 +476,23 @@ ddp_accept(struct socket *so, struct mbu
 }
 
 static int
+ddp_bind(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+	KASSERT(sotoddpcb(so) != NULL);
+
+	return at_pcbsetaddr(sotoddpcb(so), nam);
+}
+
+static int
+ddp_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 ddp_ioctl(struct socket *so, u_long cmd, void *addr, struct ifnet *ifp)
 {
 	return at_control(cmd, addr, ifp);
@@ -605,6 +619,8 @@ PR_WRAP_USRREQS(ddp)
 #define	ddp_attach	ddp_attach_wrapper
 #define	ddp_detach	ddp_detach_wrapper
 #define	ddp_accept	ddp_accept_wrapper
+#define	ddp_bind	ddp_bind_wrapper
+#define	ddp_listen	ddp_listen_wrapper
 #define	ddp_ioctl	ddp_ioctl_wrapper
 #define	ddp_stat	ddp_stat_wrapper
 #define	ddp_peeraddr	ddp_peeraddr_wrapper
@@ -617,6 +633,8 @@ const struct pr_usrreqs ddp_usrreqs = {
 	.pr_attach	= ddp_attach,
 	.pr_detach	= ddp_detach,
 	.pr_accept	= ddp_accept,
+	.pr_bind	= ddp_bind,
+	.pr_listen	= ddp_listen,
 	.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.33 src/sys/netbt/hci_socket.c:1.34
--- src/sys/netbt/hci_socket.c:1.33	Wed Jul 23 13:17:18 2014
+++ src/sys/netbt/hci_socket.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_socket.c,v 1.33 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: hci_socket.c,v 1.34 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.33 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.34 2014/07/24 15:12:03 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -492,6 +492,41 @@ hci_accept(struct socket *so, struct mbu
 }
 
 static int
+hci_bind(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;
+
+	bdaddr_copy(&pcb->hp_laddr, &sa->bt_bdaddr);
+
+	if (bdaddr_any(&sa->bt_bdaddr))
+		pcb->hp_flags |= HCI_PROMISCUOUS;
+	else
+		pcb->hp_flags &= ~HCI_PROMISCUOUS;
+
+	return 0;
+}
+
+static int
+hci_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 hci_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	int err;
@@ -590,6 +625,8 @@ hci_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -626,25 +663,6 @@ hci_usrreq(struct socket *up, int req, s
 		hci_detach(up);
 		return 0;
 
-	case PRU_BIND:
-		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;
-
-		bdaddr_copy(&pcb->hp_laddr, &sa->bt_bdaddr);
-
-		if (bdaddr_any(&sa->bt_bdaddr))
-			pcb->hp_flags |= HCI_PROMISCUOUS;
-		else
-			pcb->hp_flags &= ~HCI_PROMISCUOUS;
-
-		return 0;
-
 	case PRU_CONNECT:
 		KASSERT(nam != NULL);
 		sa = mtod(nam, struct sockaddr_bt *);
@@ -691,7 +709,6 @@ hci_usrreq(struct socket *up, int req, s
 		return EOPNOTSUPP;	/* (no release) */
 
 	case PRU_CONNECT2:
-	case PRU_LISTEN:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
 	case PRU_PROTORCV:
@@ -922,6 +939,8 @@ PR_WRAP_USRREQS(hci)
 #define	hci_attach		hci_attach_wrapper
 #define	hci_detach		hci_detach_wrapper
 #define	hci_accept		hci_accept_wrapper
+#define	hci_bind		hci_bind_wrapper
+#define	hci_listen		hci_listen_wrapper
 #define	hci_ioctl		hci_ioctl_wrapper
 #define	hci_stat		hci_stat_wrapper
 #define	hci_peeraddr		hci_peeraddr_wrapper
@@ -934,6 +953,8 @@ const struct pr_usrreqs hci_usrreqs = {
 	.pr_attach	= hci_attach,
 	.pr_detach	= hci_detach,
 	.pr_accept	= hci_accept,
+	.pr_bind	= hci_bind,
+	.pr_listen	= hci_listen,
 	.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.14 src/sys/netbt/l2cap.h:1.15
--- src/sys/netbt/l2cap.h:1.14	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/l2cap.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap.h,v 1.14 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: l2cap.h,v 1.15 2014/07/24 15:12:03 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.14 2014/07/09 04:54:03 rtr Exp $
+ * $Id: l2cap.h,v 1.15 2014/07/24 15:12:03 rtr Exp $
  * $FreeBSD: src/sys/netgraph/bluetooth/include/l2cap.h,v 1.4 2005/08/31 18:13:23 emax Exp $
  */
 
@@ -462,13 +462,13 @@ int l2cap_ctloutput(int, struct socket *
 
 /* l2cap_upper.c */
 int l2cap_attach_pcb(struct l2cap_channel **, const struct btproto *, void *);
-int l2cap_bind(struct l2cap_channel *, struct sockaddr_bt *);
+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_peeraddr_pcb(struct l2cap_channel *, struct sockaddr_bt *);
 int l2cap_disconnect(struct l2cap_channel *, int);
 void l2cap_detach_pcb(struct l2cap_channel **);
-int l2cap_listen(struct l2cap_channel *);
+int l2cap_listen_pcb(struct l2cap_channel *);
 int l2cap_send(struct l2cap_channel *, struct mbuf *);
 int l2cap_setopt(struct l2cap_channel *, const struct sockopt *);
 int l2cap_getopt(struct l2cap_channel *, struct sockopt *);
Index: src/sys/netbt/l2cap_upper.c
diff -u src/sys/netbt/l2cap_upper.c:1.14 src/sys/netbt/l2cap_upper.c:1.15
--- src/sys/netbt/l2cap_upper.c:1.14	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/l2cap_upper.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_upper.c,v 1.14 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: l2cap_upper.c,v 1.15 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.14 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.15 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -102,12 +102,12 @@ l2cap_attach_pcb(struct l2cap_channel **
 }
 
 /*
- * l2cap_bind(l2cap_channel, sockaddr)
+ * l2cap_bind_pcb(l2cap_channel, sockaddr)
  *
  *	set local address of channel
  */
 int
-l2cap_bind(struct l2cap_channel *chan, struct sockaddr_bt *addr)
+l2cap_bind_pcb(struct l2cap_channel *chan, struct sockaddr_bt *addr)
 {
 
 	if (chan->lc_lcid != L2CAP_NULL_CID)
@@ -291,7 +291,7 @@ l2cap_detach_pcb(struct l2cap_channel **
 }
 
 /*
- * l2cap_listen(l2cap_channel)
+ * l2cap_listen_pcb(l2cap_channel)
  *
  *	Use this channel as a listening post (until detached). This will
  *	result in calls to:
@@ -308,7 +308,7 @@ l2cap_detach_pcb(struct l2cap_channel **
  *	You cannot use this channel for anything else subsequent to this call
  */
 int
-l2cap_listen(struct l2cap_channel *chan)
+l2cap_listen_pcb(struct l2cap_channel *chan)
 {
 	struct l2cap_channel *used, *prev = NULL;
 	uint32_t psm;

Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.24 src/sys/netbt/l2cap_socket.c:1.25
--- src/sys/netbt/l2cap_socket.c:1.24	Wed Jul 23 13:17:18 2014
+++ src/sys/netbt/l2cap_socket.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_socket.c,v 1.24 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: l2cap_socket.c,v 1.25 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.24 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.25 2014/07/24 15:12:03 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -134,6 +134,41 @@ l2cap_accept(struct socket *so, struct m
 }
 
 static int
+l2cap_bind(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;
+
+	return l2cap_bind_pcb(pcb, sa);
+}
+
+static int
+l2cap_listen(struct socket *so)
+{
+	struct l2cap_channel *pcb = so->so_pcb;
+
+	KASSERT(solocked(so));
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return l2cap_listen_pcb(pcb);
+}
+
+static int
 l2cap_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EPASSTHROUGH;
@@ -226,6 +261,8 @@ l2cap_usrreq(struct socket *up, int req,
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -254,18 +291,6 @@ l2cap_usrreq(struct socket *up, int req,
 		l2cap_detach(up);
 		return 0;
 
-	case PRU_BIND:
-		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;
-
-		return l2cap_bind(pcb, sa);
-
 	case PRU_CONNECT:
 		KASSERT(nam != NULL);
 		sa = mtod(nam, struct sockaddr_bt *);
@@ -308,9 +333,6 @@ l2cap_usrreq(struct socket *up, int req,
 	case PRU_RCVD:
 		return EOPNOTSUPP;	/* (no release) */
 
-	case PRU_LISTEN:
-		return l2cap_listen(pcb);
-
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -476,6 +498,8 @@ PR_WRAP_USRREQS(l2cap)
 #define	l2cap_attach		l2cap_attach_wrapper
 #define	l2cap_detach		l2cap_detach_wrapper
 #define	l2cap_accept		l2cap_accept_wrapper
+#define	l2cap_bind		l2cap_bind_wrapper
+#define	l2cap_listen		l2cap_listen_wrapper
 #define	l2cap_ioctl		l2cap_ioctl_wrapper
 #define	l2cap_stat		l2cap_stat_wrapper
 #define	l2cap_peeraddr		l2cap_peeraddr_wrapper
@@ -488,6 +512,8 @@ const struct pr_usrreqs l2cap_usrreqs = 
 	.pr_attach	= l2cap_attach,
 	.pr_detach	= l2cap_detach,
 	.pr_accept	= l2cap_accept,
+	.pr_bind	= l2cap_bind,
+	.pr_listen	= l2cap_listen,
 	.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.13 src/sys/netbt/rfcomm.h:1.14
--- src/sys/netbt/rfcomm.h:1.13	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/rfcomm.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm.h,v 1.13 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: rfcomm.h,v 1.14 2014/07/24 15:12:03 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.13 2014/07/09 04:54:03 rtr Exp $
+ * $Id: rfcomm.h,v 1.14 2014/07/24 15:12:03 rtr Exp $
  * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $
  */
 
@@ -408,13 +408,13 @@ int rfcomm_ctloutput(int, struct socket 
 
 /* rfcomm_upper.c */
 int rfcomm_attach_pcb(struct rfcomm_dlc **, const struct btproto *, void *);
-int rfcomm_bind(struct rfcomm_dlc *, struct sockaddr_bt *);
+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_peeraddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
 int rfcomm_disconnect(struct rfcomm_dlc *, int);
 void rfcomm_detach_pcb(struct rfcomm_dlc **);
-int rfcomm_listen(struct rfcomm_dlc *);
+int rfcomm_listen_pcb(struct rfcomm_dlc *);
 int rfcomm_send(struct rfcomm_dlc *, struct mbuf *);
 int rfcomm_rcvd(struct rfcomm_dlc *, size_t);
 int rfcomm_setopt(struct rfcomm_dlc *, const struct sockopt *);

Index: src/sys/netbt/rfcomm_session.c
diff -u src/sys/netbt/rfcomm_session.c:1.20 src/sys/netbt/rfcomm_session.c:1.21
--- src/sys/netbt/rfcomm_session.c:1.20	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/rfcomm_session.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_session.c,v 1.20 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: rfcomm_session.c,v 1.21 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.20 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.21 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -199,7 +199,7 @@ rfcomm_session_alloc(struct rfcomm_sessi
 	if (laddr->bt_psm == L2CAP_PSM_ANY)
 		laddr->bt_psm = L2CAP_PSM_RFCOMM;
 
-	(void)l2cap_bind(rs->rs_l2cap, laddr);
+	(void)l2cap_bind_pcb(rs->rs_l2cap, laddr);
 
 	LIST_INSERT_HEAD(list, rs, rs_next);
 

Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.25 src/sys/netbt/rfcomm_socket.c:1.26
--- src/sys/netbt/rfcomm_socket.c:1.25	Wed Jul 23 13:17:18 2014
+++ src/sys/netbt/rfcomm_socket.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_socket.c,v 1.25 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: rfcomm_socket.c,v 1.26 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.25 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.26 2014/07/24 15:12:03 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -142,6 +142,41 @@ rfcomm_accept(struct socket *so, struct 
 }
 
 static int
+rfcomm_bind(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;
+
+	return rfcomm_bind_pcb(pcb, sa);
+}
+
+static int
+rfcomm_listen(struct socket *so)
+{
+	struct rfcomm_dlc *pcb = so->so_pcb;
+
+	KASSERT(solocked(so));
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return rfcomm_listen_pcb(pcb);
+}
+
+static int
 rfcomm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EPASSTHROUGH;
@@ -234,6 +269,8 @@ rfcomm_usrreq(struct socket *up, int req
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -261,18 +298,6 @@ rfcomm_usrreq(struct socket *up, int req
 		rfcomm_detach(up);
 		return 0;
 
-	case PRU_BIND:
-		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;
-
-		return rfcomm_bind(pcb, sa);
-
 	case PRU_CONNECT:
 		KASSERT(nam != NULL);
 		sa = mtod(nam, struct sockaddr_bt *);
@@ -307,9 +332,6 @@ rfcomm_usrreq(struct socket *up, int req
 	case PRU_RCVD:
 		return rfcomm_rcvd(pcb, sbspace(&up->so_rcv));
 
-	case PRU_LISTEN:
-		return rfcomm_listen(pcb);
-
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -487,6 +509,8 @@ PR_WRAP_USRREQS(rfcomm)
 #define	rfcomm_attach		rfcomm_attach_wrapper
 #define	rfcomm_detach		rfcomm_detach_wrapper
 #define	rfcomm_accept		rfcomm_accept_wrapper
+#define	rfcomm_bind		rfcomm_bind_wrapper
+#define	rfcomm_listen		rfcomm_listen_wrapper
 #define	rfcomm_ioctl		rfcomm_ioctl_wrapper
 #define	rfcomm_stat		rfcomm_stat_wrapper
 #define	rfcomm_peeraddr		rfcomm_peeraddr_wrapper
@@ -499,6 +523,8 @@ const struct pr_usrreqs rfcomm_usrreqs =
 	.pr_attach	= rfcomm_attach,
 	.pr_detach	= rfcomm_detach,
 	.pr_accept	= rfcomm_accept,
+	.pr_bind	= rfcomm_bind,
+	.pr_listen	= rfcomm_listen,
 	.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.16 src/sys/netbt/rfcomm_upper.c:1.17
--- src/sys/netbt/rfcomm_upper.c:1.16	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/rfcomm_upper.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_upper.c,v 1.16 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: rfcomm_upper.c,v 1.17 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.16 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.17 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -96,12 +96,12 @@ rfcomm_attach_pcb(struct rfcomm_dlc **ha
 }
 
 /*
- * rfcomm_bind(dlc, sockaddr)
+ * rfcomm_bind_pcb(dlc, sockaddr)
  *
  * bind DLC to local address
  */
 int
-rfcomm_bind(struct rfcomm_dlc *dlc, struct sockaddr_bt *addr)
+rfcomm_bind_pcb(struct rfcomm_dlc *dlc, struct sockaddr_bt *addr)
 {
 
 	if (dlc->rd_state != RFCOMM_DLC_CLOSED)
@@ -301,7 +301,7 @@ rfcomm_detach_pcb(struct rfcomm_dlc **ha
 }
 
 /*
- * rfcomm_listen(dlc)
+ * rfcomm_listen_pcb(dlc)
  *
  * This DLC is a listener. We look for an existing listening session
  * with a matching address to attach to or else create a new one on
@@ -309,7 +309,7 @@ rfcomm_detach_pcb(struct rfcomm_dlc **ha
  * available for the session.
  */
 int
-rfcomm_listen(struct rfcomm_dlc *dlc)
+rfcomm_listen_pcb(struct rfcomm_dlc *dlc)
 {
 	struct rfcomm_session *rs;
 	struct rfcomm_dlc *used;
@@ -349,7 +349,7 @@ rfcomm_listen(struct rfcomm_dlc *dlc)
 
 		rs->rs_state = RFCOMM_SESSION_LISTEN;
 
-		err = l2cap_listen(rs->rs_l2cap);
+		err = l2cap_listen_pcb(rs->rs_l2cap);
 		if (err) {
 			rfcomm_session_free(rs);
 			return err;

Index: src/sys/netbt/sco.h
diff -u src/sys/netbt/sco.h:1.7 src/sys/netbt/sco.h:1.8
--- src/sys/netbt/sco.h:1.7	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/sco.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco.h,v 1.7 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: sco.h,v 1.8 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -69,13 +69,13 @@ int sco_ctloutput(int, struct socket *, 
 
 /* sco_upper.c */
 int sco_attach_pcb(struct sco_pcb **, const struct btproto *, void *);
-int sco_bind(struct sco_pcb *, struct sockaddr_bt *);
+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_peeraddr_pcb(struct sco_pcb *, struct sockaddr_bt *);
 int sco_disconnect(struct sco_pcb *, int);
 void sco_detach_pcb(struct sco_pcb **);
-int sco_listen(struct sco_pcb *);
+int sco_listen_pcb(struct sco_pcb *);
 int sco_send(struct sco_pcb *, struct mbuf *);
 int sco_setopt(struct sco_pcb *, const struct sockopt *);
 int sco_getopt(struct sco_pcb *, struct sockopt *);

Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.26 src/sys/netbt/sco_socket.c:1.27
--- src/sys/netbt/sco_socket.c:1.26	Wed Jul 23 13:17:18 2014
+++ src/sys/netbt/sco_socket.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_socket.c,v 1.26 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: sco_socket.c,v 1.27 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.26 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.27 2014/07/24 15:12:03 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -125,6 +125,41 @@ sco_accept(struct socket *so, struct mbu
 }
 
 static int
+sco_bind(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;
+
+	return sco_bind_pcb(pcb, sa);
+}
+
+static int
+sco_listen(struct socket *so)
+{
+	struct sco_pcb *pcb = so->so_pcb;
+
+	KASSERT(solocked(so));
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return sco_listen_pcb(pcb);
+}
+
+static int
 sco_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -213,6 +248,8 @@ sco_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -242,18 +279,6 @@ sco_usrreq(struct socket *up, int req, s
 		sco_detach(up);
 		return 0;
 
-	case PRU_BIND:
-		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;
-
-		return sco_bind(pcb, sa);
-
 	case PRU_CONNECT:
 		KASSERT(nam != NULL);
 		sa = mtod(nam, struct sockaddr_bt *);
@@ -296,9 +321,6 @@ sco_usrreq(struct socket *up, int req, s
 	case PRU_RCVD:
 		return EOPNOTSUPP;	/* (no release) */
 
-	case PRU_LISTEN:
-		return sco_listen(pcb);
-
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -443,6 +465,8 @@ PR_WRAP_USRREQS(sco)
 #define	sco_attach		sco_attach_wrapper
 #define	sco_detach		sco_detach_wrapper
 #define	sco_accept		sco_accept_wrapper
+#define	sco_bind		sco_bind_wrapper
+#define	sco_listen		sco_listen_wrapper
 #define	sco_ioctl		sco_ioctl_wrapper
 #define	sco_stat		sco_stat_wrapper
 #define	sco_peeraddr		sco_peeraddr_wrapper
@@ -455,6 +479,8 @@ const struct pr_usrreqs sco_usrreqs = {
 	.pr_attach	= sco_attach,
 	.pr_detach	= sco_detach,
 	.pr_accept	= sco_accept,
+	.pr_bind	= sco_bind,
+	.pr_listen	= sco_listen,
 	.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.12 src/sys/netbt/sco_upper.c:1.13
--- src/sys/netbt/sco_upper.c:1.12	Wed Jul  9 04:54:03 2014
+++ src/sys/netbt/sco_upper.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_upper.c,v 1.12 2014/07/09 04:54:03 rtr Exp $	*/
+/*	$NetBSD: sco_upper.c,v 1.13 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.12 2014/07/09 04:54:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.13 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -82,12 +82,12 @@ sco_attach_pcb(struct sco_pcb **handle,
 }
 
 /*
- * sco_bind(pcb, sockaddr)
+ * sco_bind_pcb(pcb, sockaddr)
  *
  *	Bind SCO pcb to local address
  */
 int
-sco_bind(struct sco_pcb *pcb, struct sockaddr_bt *addr)
+sco_bind_pcb(struct sco_pcb *pcb, struct sockaddr_bt *addr)
 {
 
 	if (pcb->sp_link != NULL || pcb->sp_flags & SP_LISTENING)
@@ -245,12 +245,12 @@ sco_detach_pcb(struct sco_pcb **handle)
 }
 
 /*
- * sco_listen(pcb)
+ * sco_listen_pcb(pcb)
  *
  *	Mark pcb as a listener.
  */
 int
-sco_listen(struct sco_pcb *pcb)
+sco_listen_pcb(struct sco_pcb *pcb)
 {
 
 	if (pcb->sp_link != NULL)

Index: src/sys/netinet/in_pcb.c
diff -u src/sys/netinet/in_pcb.c:1.148 src/sys/netinet/in_pcb.c:1.149
--- src/sys/netinet/in_pcb.c:1.148	Fri May 30 01:39:03 2014
+++ src/sys/netinet/in_pcb.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb.c,v 1.148 2014/05/30 01:39:03 christos Exp $	*/
+/*	$NetBSD: in_pcb.c,v 1.149 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.148 2014/05/30 01:39:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.149 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -402,7 +402,7 @@ in_pcbbind_port(struct inpcb *inp, struc
 }
 
 int
-in_pcbbind(void *v, struct mbuf *nam, struct lwp *l)
+in_pcbbind(void *v, struct mbuf *nam)
 {
 	struct inpcb *inp = v;
 	struct sockaddr_in *sin = NULL; /* XXXGCC */
@@ -428,12 +428,12 @@ in_pcbbind(void *v, struct mbuf *nam, st
 	}
 
 	/* Bind address. */
-	error = in_pcbbind_addr(inp, sin, l->l_cred);
+	error = in_pcbbind_addr(inp, sin, curlwp->l_cred);
 	if (error)
 		return (error);
 
 	/* Bind port. */
-	error = in_pcbbind_port(inp, sin, l->l_cred);
+	error = in_pcbbind_port(inp, sin, curlwp->l_cred);
 	if (error) {
 		inp->inp_laddr.s_addr = INADDR_ANY;
 
@@ -527,7 +527,7 @@ in_pcbconnect(void *v, struct mbuf *nam,
 		return (EADDRINUSE);
 	if (in_nullhost(inp->inp_laddr)) {
 		if (inp->inp_lport == 0) {
-			error = in_pcbbind(inp, NULL, l);
+			error = in_pcbbind(inp, NULL);
 			/*
 			 * This used to ignore the return value
 			 * completely, but we need to check for

Index: src/sys/netinet/in_pcb.h
diff -u src/sys/netinet/in_pcb.h:1.52 src/sys/netinet/in_pcb.h:1.53
--- src/sys/netinet/in_pcb.h:1.52	Thu May 22 22:01:12 2014
+++ src/sys/netinet/in_pcb.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb.h,v 1.52 2014/05/22 22:01:12 rmind Exp $	*/
+/*	$NetBSD: in_pcb.h,v 1.53 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -131,7 +131,7 @@ struct inpcb {
 #ifdef _KERNEL
 void	in_losing(struct inpcb *);
 int	in_pcballoc(struct socket *, void *);
-int	in_pcbbind(void *, struct mbuf *, struct lwp *);
+int	in_pcbbind(void *, struct mbuf *);
 int	in_pcbconnect(void *, struct mbuf *, struct lwp *);
 void	in_pcbdetach(void *);
 void	in_pcbdisconnect(void *);

Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.135 src/sys/netinet/raw_ip.c:1.136
--- src/sys/netinet/raw_ip.c:1.135	Wed Jul 23 13:17:18 2014
+++ src/sys/netinet/raw_ip.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip.c,v 1.135 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: raw_ip.c,v 1.136 2014/07/24 15:12:03 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.135 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.136 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -112,7 +112,6 @@ struct inpcbtable rawcbtable;
 
 int	 rip_pcbnotify(struct inpcbtable *, struct in_addr,
     struct in_addr, int, int, void (*)(struct inpcb *, int));
-int	 rip_bind(struct inpcb *, struct mbuf *);
 int	 rip_connect(struct inpcb *, struct mbuf *);
 void	 rip_disconnect(struct inpcb *);
 
@@ -482,24 +481,6 @@ rip_ctloutput(int op, struct socket *so,
 }
 
 int
-rip_bind(struct inpcb *inp, struct mbuf *nam)
-{
-	struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *);
-
-	if (nam->m_len != sizeof(*addr))
-		return (EINVAL);
-	if (!IFNET_FIRST())
-		return (EADDRNOTAVAIL);
-	if (addr->sin_family != AF_INET)
-		return (EAFNOSUPPORT);
-	if (!in_nullhost(addr->sin_addr) &&
-	    ifa_ifwithaddr(sintosa(addr)) == 0)
-		return (EADDRNOTAVAIL);
-	inp->inp_laddr = addr->sin_addr;
-	return (0);
-}
-
-int
 rip_connect(struct inpcb *inp, struct mbuf *nam)
 {
 	struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *);
@@ -572,7 +553,53 @@ rip_accept(struct socket *so, struct mbu
 	KASSERT(solocked(so));
 
 	panic("rip_accept");
-	/* NOT REACHED */
+
+	return EOPNOTSUPP;
+}
+
+static int
+rip_bind(struct socket *so, struct mbuf *nam)
+{
+	struct inpcb *inp = sotoinpcb(so);
+	struct sockaddr_in *addr;
+	int error = 0;
+	int s;
+
+	KASSERT(solocked(so));
+	KASSERT(inp != NULL);
+	KASSERT(nam != NULL);
+
+	s = splsoftnet();
+	addr = mtod(nam, struct sockaddr_in *);
+	if (nam->m_len != sizeof(*addr)) {
+		error = EINVAL;
+		goto release;
+	}
+	if (!IFNET_FIRST()) {
+		error = EADDRNOTAVAIL;
+		goto release;
+	}
+	if (addr->sin_family != AF_INET) {
+		error = EAFNOSUPPORT;
+		goto release;
+	}
+	if (!in_nullhost(addr->sin_addr) &&
+	    ifa_ifwithaddr(sintosa(addr)) == 0) {
+		error = EADDRNOTAVAIL;
+		goto release;
+	}
+	inp->inp_laddr = addr->sin_addr;
+
+release:
+	splx(s);
+	return error;
+}
+
+static int
+rip_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
 	return EOPNOTSUPP;
 }
 
@@ -642,6 +669,8 @@ rip_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -671,14 +700,6 @@ rip_usrreq(struct socket *so, int req, s
 
 	switch (req) {
 
-	case PRU_BIND:
-		error = rip_bind(inp, nam);
-		break;
-
-	case PRU_LISTEN:
-		error = EOPNOTSUPP;
-		break;
-
 	case PRU_CONNECT:
 		error = rip_connect(inp, nam);
 		if (error)
@@ -753,6 +774,8 @@ PR_WRAP_USRREQS(rip)
 #define	rip_attach	rip_attach_wrapper
 #define	rip_detach	rip_detach_wrapper
 #define	rip_accept	rip_accept_wrapper
+#define	rip_bind	rip_bind_wrapper
+#define	rip_listen	rip_listen_wrapper
 #define	rip_ioctl	rip_ioctl_wrapper
 #define	rip_stat	rip_stat_wrapper
 #define	rip_peeraddr	rip_peeraddr_wrapper
@@ -765,6 +788,8 @@ const struct pr_usrreqs rip_usrreqs = {
 	.pr_attach	= rip_attach,
 	.pr_detach	= rip_detach,
 	.pr_accept	= rip_accept,
+	.pr_bind	= rip_bind,
+	.pr_listen	= rip_listen,
 	.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.189 src/sys/netinet/tcp_usrreq.c:1.190
--- src/sys/netinet/tcp_usrreq.c:1.189	Wed Jul 23 13:17:18 2014
+++ src/sys/netinet/tcp_usrreq.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.189 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.190 2014/07/24 15:12:03 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.189 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.190 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -294,44 +294,19 @@ tcp_usrreq(struct socket *so, int req, s
 	switch (req) {
 
 	/*
-	 * Give the socket an address.
-	 */
-	case PRU_BIND:
-		switch (family) {
-#ifdef INET
-		case PF_INET:
-			error = in_pcbbind(inp, nam, l);
-			break;
-#endif
-#ifdef INET6
-		case PF_INET6:
-			error = in6_pcbbind(in6p, nam, l);
-			if (!error) {
-				/* mapped addr case */
-				if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr))
-					tp->t_family = AF_INET;
-				else
-					tp->t_family = AF_INET6;
-			}
-			break;
-#endif
-		}
-		break;
-
-	/*
 	 * Prepare to accept connections.
 	 */
 	case PRU_LISTEN:
 #ifdef INET
 		if (inp && inp->inp_lport == 0) {
-			error = in_pcbbind(inp, NULL, l);
+			error = in_pcbbind(inp, NULL);
 			if (error)
 				break;
 		}
 #endif
 #ifdef INET6
 		if (in6p && in6p->in6p_lport == 0) {
-			error = in6_pcbbind(in6p, NULL, l);
+			error = in6_pcbbind(in6p, NULL);
 			if (error)
 				break;
 		}
@@ -350,7 +325,7 @@ tcp_usrreq(struct socket *so, int req, s
 #ifdef INET
 		if (inp) {
 			if (inp->inp_lport == 0) {
-				error = in_pcbbind(inp, NULL, l);
+				error = in_pcbbind(inp, NULL);
 				if (error)
 					break;
 			}
@@ -360,7 +335,7 @@ tcp_usrreq(struct socket *so, int req, s
 #ifdef INET6
 		if (in6p) {
 			if (in6p->in6p_lport == 0) {
-				error = in6_pcbbind(in6p, NULL, l);
+				error = in6_pcbbind(in6p, NULL);
 				if (error)
 					break;
 			}
@@ -932,6 +907,193 @@ tcp_accept(struct socket *so, struct mbu
 }
 
 static int
+tcp_bind(struct socket *so, struct mbuf *nam)
+{
+	struct inpcb *inp;
+#ifdef INET6
+	struct in6pcb *in6p;
+#endif
+	struct tcpcb *tp = NULL;
+	int s;
+	int error = 0;
+	int ostate = 0;
+	int family;	/* family of the socket */
+
+	KASSERT(solocked(so));
+
+
+	s = splsoftnet();
+
+	family = so->so_proto->pr_domain->dom_family;
+	switch (family) {
+#ifdef INET
+	case PF_INET:
+		inp = sotoinpcb(so);
+#ifdef INET6
+		in6p = NULL;
+#endif
+		break;
+#endif
+#ifdef INET6
+	case PF_INET6:
+		inp = NULL;
+		in6p = sotoin6pcb(so);
+		break;
+#endif
+	default:
+		splx(s);
+		return EAFNOSUPPORT;
+	}
+
+	/*
+	 * When a TCP is attached to a socket, then there will be
+	 * a (struct inpcb) pointed at by the socket, and this
+	 * structure will point at a subsidary (struct tcpcb).
+	 */
+	if (inp == NULL
+#ifdef INET6
+	    && in6p == NULL
+#endif
+	    )
+	{
+		error = EINVAL;
+		goto release;
+	}
+#ifdef INET
+	if (inp) {
+		tp = intotcpcb(inp);
+		ostate = tcp_debug_capture(tp, PRU_BIND);
+	}
+#endif
+#ifdef INET6
+	if (in6p) {
+		tp = in6totcpcb(in6p);
+		ostate = tcp_debug_capture(tp, PRU_BIND);
+	}
+#endif
+
+	/*
+	 * Give the socket an address.
+	 */
+	switch (family) {
+#ifdef INET
+	case PF_INET:
+		error = in_pcbbind(inp, nam);
+		break;
+#endif
+#ifdef INET6
+	case PF_INET6:
+		error = in6_pcbbind(in6p, nam);
+		if (!error) {
+			/* mapped addr case */
+			if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr))
+				tp->t_family = AF_INET;
+			else
+				tp->t_family = AF_INET6;
+		}
+		break;
+#endif
+	}
+
+	tcp_debug_trace(so, tp, ostate, PRU_BIND);
+
+release:
+	splx(s);
+	return (error);
+}
+
+static int
+tcp_listen(struct socket *so)
+{
+	struct inpcb *inp;
+#ifdef INET6
+	struct in6pcb *in6p;
+#endif
+	struct tcpcb *tp = NULL;
+	int s;
+	int error = 0;
+	int ostate = 0;
+	int family;	/* family of the socket */
+
+	KASSERT(solocked(so));
+
+	s = splsoftnet();
+
+	family = so->so_proto->pr_domain->dom_family;
+	switch (family) {
+#ifdef INET
+	case PF_INET:
+		inp = sotoinpcb(so);
+#ifdef INET6
+		in6p = NULL;
+#endif
+		break;
+#endif
+#ifdef INET6
+	case PF_INET6:
+		inp = NULL;
+		in6p = sotoin6pcb(so);
+		break;
+#endif
+	default:
+		splx(s);
+		return EAFNOSUPPORT;
+	}
+
+	/*
+	 * When a TCP is attached to a socket, then there will be
+	 * a (struct inpcb) pointed at by the socket, and this
+	 * structure will point at a subsidary (struct tcpcb).
+	 */
+	if (inp == NULL
+#ifdef INET6
+	    && in6p == NULL
+#endif
+	    )
+	{
+		error = EINVAL;
+		goto release;
+	}
+#ifdef INET
+	if (inp) {
+		tp = intotcpcb(inp);
+		ostate = tcp_debug_capture(tp, PRU_LISTEN);
+	}
+#endif
+#ifdef INET6
+	if (in6p) {
+		tp = in6totcpcb(in6p);
+		ostate = tcp_debug_capture(tp, PRU_LISTEN);
+	}
+#endif
+
+	/*
+	 * Prepare to accept connections.
+	 */
+#ifdef INET
+	if (inp && inp->inp_lport == 0) {
+		error = in_pcbbind(inp, NULL);
+		if (error)
+			goto release;
+	}
+#endif
+#ifdef INET6
+	if (in6p && in6p->in6p_lport == 0) {
+		error = in6_pcbbind(in6p, NULL);
+		if (error)
+			goto release;
+	}
+#endif
+	tp->t_state = TCPS_LISTEN;
+
+	tcp_debug_trace(so, tp, ostate, PRU_LISTEN);
+
+release:
+	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) {
@@ -2431,6 +2593,8 @@ PR_WRAP_USRREQS(tcp)
 #define	tcp_attach	tcp_attach_wrapper
 #define	tcp_detach	tcp_detach_wrapper
 #define	tcp_accept	tcp_accept_wrapper
+#define	tcp_bind	tcp_bind_wrapper
+#define	tcp_listen	tcp_listen_wrapper
 #define	tcp_ioctl	tcp_ioctl_wrapper
 #define	tcp_stat	tcp_stat_wrapper
 #define	tcp_peeraddr	tcp_peeraddr_wrapper
@@ -2443,6 +2607,8 @@ const struct pr_usrreqs tcp_usrreqs = {
 	.pr_attach	= tcp_attach,
 	.pr_detach	= tcp_detach,
 	.pr_accept	= tcp_accept,
+	.pr_bind	= tcp_bind,
+	.pr_listen	= tcp_listen,
 	.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.209 src/sys/netinet/udp_usrreq.c:1.210
--- src/sys/netinet/udp_usrreq.c:1.209	Wed Jul 23 13:17:18 2014
+++ src/sys/netinet/udp_usrreq.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.209 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.210 2014/07/24 15:12:03 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.209 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.210 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -900,11 +900,38 @@ udp_accept(struct socket *so, struct mbu
 	KASSERT(solocked(so));
 
 	panic("udp_accept");
-	/* NOT REACHED */
+
 	return EOPNOTSUPP;
 }
 
 static int
+udp_bind(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_pcbbind(inp, nam);
+	splx(s);
+
+	return error;
+}
+
+static int
+udp_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+
+static int
 udp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return in_control(so, cmd, nam, ifp);
@@ -970,6 +997,8 @@ udp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -1002,14 +1031,6 @@ udp_usrreq(struct socket *so, int req, s
 	 * the udp pcb queue and/or pcb addresses.
 	 */
 	switch (req) {
-	case PRU_BIND:
-		error = in_pcbbind(inp, nam, l);
-		break;
-
-	case PRU_LISTEN:
-		error = EOPNOTSUPP;
-		break;
-
 	case PRU_CONNECT:
 		error = in_pcbconnect(inp, nam, l);
 		if (error)
@@ -1305,6 +1326,8 @@ PR_WRAP_USRREQS(udp)
 #define	udp_attach	udp_attach_wrapper
 #define	udp_detach	udp_detach_wrapper
 #define	udp_accept	udp_accept_wrapper
+#define	udp_bind	udp_bind_wrapper
+#define	udp_listen	udp_listen_wrapper
 #define	udp_ioctl	udp_ioctl_wrapper
 #define	udp_stat	udp_stat_wrapper
 #define	udp_peeraddr	udp_peeraddr_wrapper
@@ -1317,6 +1340,8 @@ const struct pr_usrreqs udp_usrreqs = {
 	.pr_attach	= udp_attach,
 	.pr_detach	= udp_detach,
 	.pr_accept	= udp_accept,
+	.pr_bind	= udp_bind,
+	.pr_listen	= udp_listen,
 	.pr_ioctl	= udp_ioctl,
 	.pr_stat	= udp_stat,
 	.pr_peeraddr	= udp_peeraddr,

Index: src/sys/netinet6/in6_pcb.c
diff -u src/sys/netinet6/in6_pcb.c:1.125 src/sys/netinet6/in6_pcb.c:1.126
--- src/sys/netinet6/in6_pcb.c:1.125	Fri May 30 01:39:03 2014
+++ src/sys/netinet6/in6_pcb.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_pcb.c,v 1.125 2014/05/30 01:39:03 christos Exp $	*/
+/*	$NetBSD: in6_pcb.c,v 1.126 2014/07/24 15:12:03 rtr Exp $	*/
 /*	$KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.125 2014/05/30 01:39:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.126 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -362,7 +362,7 @@ in6_pcbbind_port(struct in6pcb *in6p, st
 }
 
 int
-in6_pcbbind(void *v, struct mbuf *nam, struct lwp *l)
+in6_pcbbind(void *v, struct mbuf *nam)
 {
 	struct in6pcb *in6p = v;
 	struct sockaddr_in6 lsin6;
@@ -394,12 +394,12 @@ in6_pcbbind(void *v, struct mbuf *nam, s
 	}
 
 	/* Bind address. */
-	error = in6_pcbbind_addr(in6p, sin6, l);
+	error = in6_pcbbind_addr(in6p, sin6, curlwp);
 	if (error)
 		return (error);
 
 	/* Bind port. */
-	error = in6_pcbbind_port(in6p, sin6, l);
+	error = in6_pcbbind_port(in6p, sin6, curlwp);
 	if (error) {
 		/*
 		 * Reset the address here to "any" so we don't "leak" the
@@ -540,7 +540,7 @@ in6_pcbconnect(void *v, struct mbuf *nam
 	     in6p->in6p_laddr.s6_addr32[3] == 0))
 	{
 		if (in6p->in6p_lport == 0) {
-			error = in6_pcbbind(in6p, NULL, l);
+			error = in6_pcbbind(in6p, NULL);
 			if (error != 0)
 				return error;
 		}

Index: src/sys/netinet6/in6_pcb.h
diff -u src/sys/netinet6/in6_pcb.h:1.37 src/sys/netinet6/in6_pcb.h:1.38
--- src/sys/netinet6/in6_pcb.h:1.37	Mon Jun 25 15:28:39 2012
+++ src/sys/netinet6/in6_pcb.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_pcb.h,v 1.37 2012/06/25 15:28:39 christos Exp $	*/
+/*	$NetBSD: in6_pcb.h,v 1.38 2014/07/24 15:12:03 rtr Exp $	*/
 /*	$KAME: in6_pcb.h,v 1.45 2001/02/09 05:59:46 itojun Exp $	*/
 
 /*
@@ -154,7 +154,7 @@ struct	in6pcb {
 void	in6_losing(struct in6pcb *);
 void	in6_pcbinit(struct inpcbtable *, int, int);
 int	in6_pcballoc(struct socket *, void *);
-int	in6_pcbbind(void *, struct mbuf *, struct lwp *);
+int	in6_pcbbind(void *, struct mbuf *);
 int	in6_pcbconnect(void *, struct mbuf *, struct lwp *);
 void	in6_pcbdetach(struct in6pcb *);
 void	in6_pcbdisconnect(struct in6pcb *);

Index: src/sys/netinet6/raw_ip6.c
diff -u src/sys/netinet6/raw_ip6.c:1.128 src/sys/netinet6/raw_ip6.c:1.129
--- src/sys/netinet6/raw_ip6.c:1.128	Wed Jul 23 13:17:18 2014
+++ src/sys/netinet6/raw_ip6.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.128 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.129 2014/07/24 15:12:03 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.128 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.129 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -653,6 +653,52 @@ rip6_accept(struct socket *so, struct mb
 }
 
 static int
+rip6_bind(struct socket *so, struct mbuf *nam)
+{
+	struct in6pcb *in6p = sotoin6pcb(so);
+	struct sockaddr_in6 *addr;
+	struct ifaddr *ia = NULL;
+	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() || addr->sin6_family != AF_INET6)
+		return EADDRNOTAVAIL;
+
+	if ((error = sa6_embedscope(addr, ip6_use_defzone)) != 0)
+		return error;
+
+	/*
+	 * we don't support mapped address here, it would confuse
+	 * users so reject it
+	 */
+	if (IN6_IS_ADDR_V4MAPPED(&addr->sin6_addr))
+		return EADDRNOTAVAIL;
+	if (!IN6_IS_ADDR_UNSPECIFIED(&addr->sin6_addr) &&
+	    (ia = ifa_ifwithaddr((struct sockaddr *)addr)) == 0)
+		return EADDRNOTAVAIL;
+	if (ia && ((struct in6_ifaddr *)ia)->ia6_flags &
+	    (IN6_IFF_ANYCAST|IN6_IFF_NOTREADY|
+	     IN6_IFF_DETACHED|IN6_IFF_DEPRECATED))
+		return EADDRNOTAVAIL;
+	in6p->in6p_laddr = addr->sin6_addr;
+	return 0;
+}
+
+static int
+rip6_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 rip6_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return in6_control(so, cmd, nam, ifp);
@@ -716,6 +762,8 @@ rip6_usrreq(struct socket *so, int req, 
 	int error = 0;
 
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -747,45 +795,6 @@ rip6_usrreq(struct socket *so, int req, 
 		rip6_detach(so);
 		break;
 
-	case PRU_BIND:
-	    {
-		struct sockaddr_in6 *addr = mtod(nam, struct sockaddr_in6 *);
-		struct ifaddr *ia = NULL;
-
-		if (nam->m_len != sizeof(*addr)) {
-			error = EINVAL;
-			break;
-		}
-		if (!IFNET_FIRST() || addr->sin6_family != AF_INET6) {
-			error = EADDRNOTAVAIL;
-			break;
-		}
-		if ((error = sa6_embedscope(addr, ip6_use_defzone)) != 0)
-			break;
-
-		/*
-		 * we don't support mapped address here, it would confuse
-		 * users so reject it
-		 */
-		if (IN6_IS_ADDR_V4MAPPED(&addr->sin6_addr)) {
-			error = EADDRNOTAVAIL;
-			break;
-		}
-		if (!IN6_IS_ADDR_UNSPECIFIED(&addr->sin6_addr) &&
-		    (ia = ifa_ifwithaddr((struct sockaddr *)addr)) == 0) {
-			error = EADDRNOTAVAIL;
-			break;
-		}
-		if (ia && ((struct in6_ifaddr *)ia)->ia6_flags &
-		    (IN6_IFF_ANYCAST|IN6_IFF_NOTREADY|
-		     IN6_IFF_DETACHED|IN6_IFF_DEPRECATED)) {
-			error = EADDRNOTAVAIL;
-			break;
-		}
-		in6p->in6p_laddr = addr->sin6_addr;
-		break;
-	    }
-
 	case PRU_CONNECT:
 	{
 		struct sockaddr_in6 *addr = mtod(nam, struct sockaddr_in6 *);
@@ -894,7 +903,6 @@ rip6_usrreq(struct socket *so, int req, 
 	 * Not supported.
 	 */
 	case PRU_RCVD:
-	case PRU_LISTEN:
 		error = EOPNOTSUPP;
 		break;
 
@@ -949,6 +957,8 @@ PR_WRAP_USRREQS(rip6)
 #define	rip6_attach		rip6_attach_wrapper
 #define	rip6_detach		rip6_detach_wrapper
 #define	rip6_accept		rip6_accept_wrapper
+#define	rip6_bind		rip6_bind_wrapper
+#define	rip6_listen		rip6_listen_wrapper
 #define	rip6_ioctl		rip6_ioctl_wrapper
 #define	rip6_stat		rip6_stat_wrapper
 #define	rip6_peeraddr		rip6_peeraddr_wrapper
@@ -961,6 +971,8 @@ const struct pr_usrreqs rip6_usrreqs = {
 	.pr_attach	= rip6_attach,
 	.pr_detach	= rip6_detach,
 	.pr_accept	= rip6_accept,
+	.pr_bind	= rip6_bind,
+	.pr_listen	= rip6_listen,
 	.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.108 src/sys/netinet6/udp6_usrreq.c:1.109
--- src/sys/netinet6/udp6_usrreq.c:1.108	Wed Jul 23 13:17:18 2014
+++ src/sys/netinet6/udp6_usrreq.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp6_usrreq.c,v 1.108 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: udp6_usrreq.c,v 1.109 2014/07/24 15:12:03 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.108 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.109 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_csum.h"
@@ -686,6 +686,30 @@ udp6_accept(struct socket *so, struct mb
 }
 
 static int
+udp6_bind(struct socket *so, struct mbuf *nam)
+{
+	struct in6pcb *in6p = sotoin6pcb(so);
+	int error = 0;
+	int s;
+
+	KASSERT(solocked(so));
+	KASSERT(in6p != NULL);
+
+	s = splsoftnet();
+	error = in6_pcbbind(in6p, nam);
+	splx(s);
+	return error;
+}
+
+static int
+udp6_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 udp6_ioctl(struct socket *so, u_long cmd, void *addr6, struct ifnet *ifp)
 {
 	/*
@@ -763,6 +787,8 @@ udp6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -785,12 +811,6 @@ udp6_usrreq(struct socket *so, int req, 
 
 	switch (req) {
 
-	case PRU_BIND:
-		s = splsoftnet();
-		error = in6_pcbbind(in6p, addr6, l);
-		splx(s);
-		break;
-
 	case PRU_CONNECT:
 		if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
 			error = EISCONN;
@@ -831,7 +851,6 @@ udp6_usrreq(struct socket *so, int req, 
 		in6_pcbdetach(in6p);
 		break;
 
-	case PRU_LISTEN:
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -927,6 +946,8 @@ PR_WRAP_USRREQS(udp6)
 #define	udp6_attach	udp6_attach_wrapper
 #define	udp6_detach	udp6_detach_wrapper
 #define	udp6_accept	udp6_accept_wrapper
+#define	udp6_bind	udp6_bind_wrapper
+#define	udp6_listen	udp6_listen_wrapper
 #define	udp6_ioctl	udp6_ioctl_wrapper
 #define	udp6_stat	udp6_stat_wrapper
 #define	udp6_peeraddr	udp6_peeraddr_wrapper
@@ -939,6 +960,8 @@ const struct pr_usrreqs udp6_usrreqs = {
 	.pr_attach	= udp6_attach,
 	.pr_detach	= udp6_detach,
 	.pr_accept	= udp6_accept,
+	.pr_bind	= udp6_bind,
+	.pr_listen	= udp6_listen,
 	.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.36 src/sys/netipsec/keysock.c:1.37
--- src/sys/netipsec/keysock.c:1.36	Wed Jul 23 13:17:18 2014
+++ src/sys/netipsec/keysock.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.36 2014/07/23 13:17:18 rtr Exp $	*/
+/*	$NetBSD: keysock.c,v 1.37 2014/07/24 15:12:03 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.36 2014/07/23 13:17:18 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.37 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -495,6 +495,22 @@ key_accept(struct socket *so, struct mbu
 }
 
 static int
+key_bind(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+key_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -572,6 +588,8 @@ key_usrreq(struct socket *so, int req,st
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
 	KASSERT(req != PRU_ACCEPT);
+	KASSERT(req != PRU_BIND);
+	KASSERT(req != PRU_LISTEN);
 	KASSERT(req != PRU_CONTROL);
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
@@ -597,6 +615,8 @@ PR_WRAP_USRREQS(key)
 #define	key_attach	key_attach_wrapper
 #define	key_detach	key_detach_wrapper
 #define	key_accept	key_accept_wrapper
+#define	key_bind	key_bind_wrapper
+#define	key_listen	key_listen_wrapper
 #define	key_ioctl	key_ioctl_wrapper
 #define	key_stat	key_stat_wrapper
 #define	key_peeraddr	key_peeraddr_wrapper
@@ -609,6 +629,8 @@ const struct pr_usrreqs key_usrreqs = {
 	.pr_attach	= key_attach,
 	.pr_detach	= key_detach,
 	.pr_accept	= key_accept,
+	.pr_bind	= key_bind,
+	.pr_listen	= key_listen,
 	.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.16 src/sys/netmpls/mpls_proto.c:1.17
--- src/sys/netmpls/mpls_proto.c:1.16	Wed Jul 23 13:17:19 2014
+++ src/sys/netmpls/mpls_proto.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_proto.c,v 1.16 2014/07/23 13:17:19 rtr Exp $ */
+/*	$NetBSD: mpls_proto.c,v 1.17 2014/07/24 15:12:03 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.16 2014/07/23 13:17:19 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.17 2014/07/24 15:12:03 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_mbuftrace.h"
@@ -103,6 +103,22 @@ mpls_accept(struct socket *so, struct mb
 }
 
 static int
+mpls_bind(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+mpls_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 mpls_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return EOPNOTSUPP;
@@ -240,6 +256,8 @@ PR_WRAP_USRREQS(mpls)
 #define	mpls_attach	mpls_attach_wrapper
 #define	mpls_detach	mpls_detach_wrapper
 #define	mpls_accept	mpls_accept_wrapper
+#define	mpls_bind	mpls_bind_wrapper
+#define	mpls_listen	mpls_listen_wrapper
 #define	mpls_ioctl	mpls_ioctl_wrapper
 #define	mpls_stat	mpls_stat_wrapper
 #define	mpls_peeraddr	mpls_peeraddr_wrapper
@@ -252,6 +270,8 @@ static const struct pr_usrreqs mpls_usrr
 	.pr_attach	= mpls_attach,
 	.pr_detach	= mpls_detach,
 	.pr_accept	= mpls_accept,
+	.pr_bind	= mpls_bind,
+	.pr_listen	= mpls_listen,
 	.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.38 src/sys/netnatm/natm.c:1.39
--- src/sys/netnatm/natm.c:1.38	Wed Jul 23 13:17:19 2014
+++ src/sys/netnatm/natm.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: natm.c,v 1.38 2014/07/23 13:17:19 rtr Exp $	*/
+/*	$NetBSD: natm.c,v 1.39 2014/07/24 15:12:03 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.38 2014/07/23 13:17:19 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.39 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -106,6 +106,22 @@ natm_accept(struct socket *so, struct mb
 }
 
 static int
+natm_bind(struct socket *so, struct mbuf *nam)
+{
+	KASSERt(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
+natm_listen(struct socket *so)
+{
+	KASSERt(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 natm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
   int error = 0, s;
@@ -216,6 +232,8 @@ natm_usrreq(struct socket *so, int req, 
   KASSERT(req != PRU_ATTACH);
   KASSERT(req != PRU_DETACH);
   KASSERT(req != PRU_ACCEPT);
+  KASSERT(req != PRU_BIND);
+  KASSERT(req != PRU_LISTEN);
   KASSERT(req != PRU_CONTROL);
   KASSERT(req != PRU_SENSE);
   KASSERT(req != PRU_PEERADDR);
@@ -358,8 +376,6 @@ natm_usrreq(struct socket *so, int req, 
 
       break;
 
-    case PRU_BIND:			/* bind socket to address */
-    case PRU_LISTEN:			/* listen for connection */
     case PRU_CONNECT2:			/* connect two sockets */
     case PRU_ABORT:			/* abort (fast DISCONNECT, DETATCH) */
 					/* (only happens if LISTEN socket) */
@@ -464,6 +480,8 @@ PR_WRAP_USRREQS(natm)
 #define	natm_attach	natm_attach_wrapper
 #define	natm_detach	natm_detach_wrapper
 #define	natm_accept	natm_accept_wrapper
+#define	natm_bind	natm_bind_wrapper
+#define	natm_listen	natm_listen_wrapper
 #define	natm_ioctl	natm_ioctl_wrapper
 #define	natm_stat	natm_stat_wrapper
 #define	natm_peeraddr	natm_peeraddr_wrapper
@@ -476,6 +494,8 @@ const struct pr_usrreqs natm_usrreqs = {
 	.pr_attach	= natm_attach,
 	.pr_detach	= natm_detach,
 	.pr_accept	= natm_accept,
+	.pr_bind	= natm_bind,
+	.pr_listen	= natm_listen,
 	.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.50 src/sys/rump/net/lib/libsockin/sockin.c:1.51
--- src/sys/rump/net/lib/libsockin/sockin.c:1.50	Wed Jul 23 13:17:19 2014
+++ src/sys/rump/net/lib/libsockin/sockin.c	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sockin.c,v 1.50 2014/07/23 13:17:19 rtr Exp $	*/
+/*	$NetBSD: sockin.c,v 1.51 2014/07/24 15:12:03 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.50 2014/07/23 13:17:19 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.51 2014/07/24 15:12:03 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -69,6 +69,8 @@ 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_bind(struct socket *, struct mbuf *);
+static int	sockin_listen(struct socket *);
 static int	sockin_ioctl(struct socket *, u_long, void *, struct ifnet *);
 static int	sockin_stat(struct socket *, struct stat *);
 static int	sockin_peeraddr(struct socket *, struct mbuf *);
@@ -83,6 +85,8 @@ static const struct pr_usrreqs sockin_us
 	.pr_attach = sockin_attach,
 	.pr_detach = sockin_detach,
 	.pr_accept = sockin_accept,
+	.pr_bind = sockin_bind,
+	.pr_listen = sockin_listen,
 	.pr_ioctl = sockin_ioctl,
 	.pr_stat = sockin_stat,
 	.pr_peeraddr = sockin_peeraddr,
@@ -473,6 +477,25 @@ sockin_accept(struct socket *so, struct 
 }
 
 static int
+sockin_bind(struct socket *so, struct mbuf *nam)
+{
+	KASSERT(solocked(so));
+	KASSERT(nam != NULL);
+
+	return rumpcomp_sockin_bind(SO2S(so),
+	    mtod(nam, const struct sockaddr *),
+	    nam->m_len);
+}
+
+static int
+sockin_listen(struct socket *so)
+{
+	KASSERT(solocked(so));
+
+	return rumpcomp_sockin_listen(SO2S(so), so->so_qlimit);
+}
+
+static int
 sockin_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
 {
 	return ENOTTY;
@@ -543,12 +566,6 @@ sockin_usrreq(struct socket *so, int req
 	KASSERT(req != PRU_SENDOOB);
 
 	switch (req) {
-	case PRU_BIND:
-		error = rumpcomp_sockin_bind(SO2S(so),
-		    mtod(nam, const struct sockaddr *),
-		    nam->m_len);
-		break;
-
 	case PRU_CONNECT:
 		error = rumpcomp_sockin_connect(SO2S(so),
 		    mtod(nam, struct sockaddr *), nam->m_len);
@@ -556,10 +573,6 @@ sockin_usrreq(struct socket *so, int req
 			soisconnected(so);
 		break;
 
-	case PRU_LISTEN:
-		error = rumpcomp_sockin_listen(SO2S(so), so->so_qlimit);
-		break;
-
 	case PRU_SEND:
 	{
 		struct sockaddr *saddr;

Index: src/sys/sys/param.h
diff -u src/sys/sys/param.h:1.457 src/sys/sys/param.h:1.458
--- src/sys/sys/param.h:1.457	Wed Jul  9 04:54:04 2014
+++ src/sys/sys/param.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.457 2014/07/09 04:54:04 rtr Exp $	*/
+/*	$NetBSD: param.h,v 1.458 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -63,7 +63,7 @@
  *	2.99.9		(299000900)
  */
 
-#define	__NetBSD_Version__	699004700	/* NetBSD 6.99.47 */
+#define	__NetBSD_Version__	699004800	/* NetBSD 6.99.48 */
 
 #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \
     (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)

Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.53 src/sys/sys/protosw.h:1.54
--- src/sys/sys/protosw.h:1.53	Wed Jul 23 13:17:19 2014
+++ src/sys/sys/protosw.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: protosw.h,v 1.53 2014/07/23 13:17:19 rtr Exp $	*/
+/*	$NetBSD: protosw.h,v 1.54 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -239,6 +239,8 @@ struct pr_usrreqs {
 	int	(*pr_attach)(struct socket *, int);
 	void	(*pr_detach)(struct socket *);
 	int	(*pr_accept)(struct socket *, struct mbuf *);
+	int	(*pr_bind)(struct socket *, struct mbuf *);
+	int	(*pr_listen)(struct socket *);
 	int	(*pr_ioctl)(struct socket *, u_long, void *, struct ifnet *);
 	int	(*pr_stat)(struct socket *, struct stat *);
 	int	(*pr_peeraddr)(struct socket *, struct mbuf *);
@@ -306,6 +308,24 @@ name##_accept_wrapper(struct socket *a, 
 	return rv;					\
 }							\
 static int						\
+name##_bind_wrapper(struct socket *a, struct mbuf *b)	\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_bind(a, b);				\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
+name##_listen_wrapper(struct socket *a)			\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_listen(a);				\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_ioctl_wrapper(struct socket *a, u_long b,	\
     void *c, struct ifnet *d)				\
 {							\

Index: src/sys/sys/un.h
diff -u src/sys/sys/un.h:1.48 src/sys/sys/un.h:1.49
--- src/sys/sys/un.h:1.48	Mon May 19 02:51:25 2014
+++ src/sys/sys/un.h	Thu Jul 24 15:12:03 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: un.h,v 1.48 2014/05/19 02:51:25 rmind Exp $	*/
+/*	$NetBSD: un.h,v 1.49 2014/07/24 15:12:03 rtr Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1993
@@ -84,7 +84,7 @@ kmutex_t *uipc_dgramlock (void);
 kmutex_t *uipc_streamlock (void);
 kmutex_t *uipc_rawlock (void);
 
-int	unp_bind (struct socket *, struct mbuf *, struct lwp *);
+int	unp_bind (struct socket *, struct mbuf *);
 int	unp_connect (struct socket *, struct mbuf *, struct lwp *);
 int	unp_connect2 (struct socket *, struct socket *, int);
 void	unp_discard (struct file *);

Reply via email to