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 *);