Module Name: src
Committed By: rtr
Date: Wed Jul 30 10:04:26 UTC 2014
Modified Files:
src/sys/dev/bluetooth: bthidev.c btmagic.c btsco.c
src/sys/kern: uipc_socket.c uipc_usrreq.c
src/sys/net: raw_usrreq.c rtsock.c
src/sys/netatalk: ddp_usrreq.c
src/sys/netbt: hci_socket.c l2cap.h l2cap_socket.c l2cap_upper.c
rfcomm.h rfcomm_socket.c rfcomm_upper.c sco.h sco_socket.c
sco_upper.c
src/sys/netinet: raw_ip.c tcp_usrreq.c udp_usrreq.c
src/sys/netinet6: raw_ip6.c udp6_usrreq.c
src/sys/netipsec: keysock.c
src/sys/netmpls: mpls_proto.c
src/sys/netnatm: natm.c
src/sys/rump/net/lib/libsockin: sockin.c
src/sys/sys: protosw.h un.h
Log Message:
split PRU_CONNECT function out of pr_generic() usrreq switches and put
into seaparate functions
xxx_listen(struct socket *, struct mbuf *)
- always KASSERT(solocked(so)) and KASSERT(nam != NULL)
- replace calls to pr_generic() with req = PRU_CONNECT with
pr_connect()
- rename existin {l2cap,sco,rfcomm}_connect() to
{l2cap,sco,rfcomm}_connect_pcb() respectively to permit
naming consistency with other protocols functions.
- drop struct lwp * parameter from unp_connect() and at_pcbconnect()
and use curlwp instead where appropriate.
patch reviewed by rmind
To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/bluetooth/bthidev.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/bluetooth/btmagic.c
cvs rdiff -u -r1.30 -r1.31 src/sys/dev/bluetooth/btsco.c
cvs rdiff -u -r1.227 -r1.228 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.161 -r1.162 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.45 -r1.46 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.157 -r1.158 src/sys/net/rtsock.c
cvs rdiff -u -r1.55 -r1.56 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.34 -r1.35 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.15 -r1.16 src/sys/netbt/l2cap.h src/sys/netbt/l2cap_upper.c
cvs rdiff -u -r1.25 -r1.26 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.14 -r1.15 src/sys/netbt/rfcomm.h
cvs rdiff -u -r1.26 -r1.27 src/sys/netbt/rfcomm_socket.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netbt/rfcomm_upper.c
cvs rdiff -u -r1.8 -r1.9 src/sys/netbt/sco.h
cvs rdiff -u -r1.27 -r1.28 src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.13 -r1.14 src/sys/netbt/sco_upper.c
cvs rdiff -u -r1.136 -r1.137 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.192 -r1.193 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.210 -r1.211 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.129 -r1.130 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.109 -r1.110 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.37 -r1.38 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.39 -r1.40 src/sys/netnatm/natm.c
cvs rdiff -u -r1.52 -r1.53 src/sys/rump/net/lib/libsockin/sockin.c
cvs rdiff -u -r1.54 -r1.55 src/sys/sys/protosw.h
cvs rdiff -u -r1.49 -r1.50 src/sys/sys/un.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/bluetooth/bthidev.c
diff -u src/sys/dev/bluetooth/bthidev.c:1.26 src/sys/dev/bluetooth/bthidev.c:1.27
--- src/sys/dev/bluetooth/bthidev.c:1.26 Thu Jul 24 15:12:03 2014
+++ src/sys/dev/bluetooth/bthidev.c Wed Jul 30 10:04:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: bthidev.c,v 1.26 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: bthidev.c,v 1.27 2014/07/30 10:04:25 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.26 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bthidev.c,v 1.27 2014/07/30 10:04:25 rtr Exp $");
#include <sys/param.h>
#include <sys/condvar.h>
@@ -577,9 +577,9 @@ bthidev_connect(struct bthidev_softc *sc
sa.bt_psm = sc->sc_ctlpsm;
bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
- err = l2cap_connect(sc->sc_ctl, &sa);
+ err = l2cap_connect_pcb(sc->sc_ctl, &sa);
if (err) {
- aprint_error_dev(sc->sc_dev, "l2cap_connect failed (%d)\n", err);
+ aprint_error_dev(sc->sc_dev, "l2cap_connect_pcb failed (%d)\n", err);
return err;
}
@@ -753,7 +753,7 @@ bthidev_ctl_connected(void *arg)
sa.bt_psm = sc->sc_intpsm;
bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
- err = l2cap_connect(sc->sc_int, &sa);
+ err = l2cap_connect_pcb(sc->sc_int, &sa);
if (err)
goto fail;
}
Index: src/sys/dev/bluetooth/btmagic.c
diff -u src/sys/dev/bluetooth/btmagic.c:1.8 src/sys/dev/bluetooth/btmagic.c:1.9
--- src/sys/dev/bluetooth/btmagic.c:1.8 Thu Jul 24 15:12:03 2014
+++ src/sys/dev/bluetooth/btmagic.c Wed Jul 30 10:04:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: btmagic.c,v 1.8 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: btmagic.c,v 1.9 2014/07/30 10:04:25 rtr Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -85,7 +85,7 @@
*****************************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: btmagic.c,v 1.8 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: btmagic.c,v 1.9 2014/07/30 10:04:25 rtr Exp $");
#include <sys/param.h>
#include <sys/conf.h>
@@ -543,9 +543,9 @@ btmagic_connect(struct btmagic_softc *sc
sa.bt_psm = L2CAP_PSM_HID_CNTL;
bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
- err = l2cap_connect(sc->sc_ctl, &sa);
+ err = l2cap_connect_pcb(sc->sc_ctl, &sa);
if (err) {
- printf("%s: l2cap_connect failed (%d)\n",
+ printf("%s: l2cap_connect_pcb failed (%d)\n",
device_xname(sc->sc_dev), err);
return err;
}
@@ -830,7 +830,7 @@ btmagic_ctl_connected(void *arg)
sa.bt_psm = L2CAP_PSM_HID_INTR;
bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
- err = l2cap_connect(sc->sc_int, &sa);
+ err = l2cap_connect_pcb(sc->sc_int, &sa);
if (err)
goto fail;
}
Index: src/sys/dev/bluetooth/btsco.c
diff -u src/sys/dev/bluetooth/btsco.c:1.30 src/sys/dev/bluetooth/btsco.c:1.31
--- src/sys/dev/bluetooth/btsco.c:1.30 Thu Jul 24 15:12:03 2014
+++ src/sys/dev/bluetooth/btsco.c Wed Jul 30 10:04:25 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: btsco.c,v 1.30 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: btsco.c,v 1.31 2014/07/30 10:04:25 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.30 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: btsco.c,v 1.31 2014/07/30 10:04:25 rtr Exp $");
#include <sys/param.h>
#include <sys/audioio.h>
@@ -617,7 +617,7 @@ btsco_open(void *hdl, int flags)
}
bdaddr_copy(&sa.bt_bdaddr, &sc->sc_raddr);
- err = sco_connect(sc->sc_sco, &sa);
+ err = sco_connect_pcb(sc->sc_sco, &sa);
if (err) {
sco_detach_pcb(&sc->sc_sco);
goto done;
Index: src/sys/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.227 src/sys/kern/uipc_socket.c:1.228
--- src/sys/kern/uipc_socket.c:1.227 Thu Jul 24 15:12:03 2014
+++ src/sys/kern/uipc_socket.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_socket.c,v 1.227 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: uipc_socket.c,v 1.228 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.227 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.228 2014/07/30 10:04:26 rtr Exp $");
#include "opt_compat_netbsd.h"
#include "opt_sock_counters.h"
@@ -827,8 +827,7 @@ soconnect(struct socket *so, struct mbuf
(error = sodisconnect(so))))
error = EISCONN;
else
- error = (*so->so_proto->pr_usrreqs->pr_generic)(so,
- PRU_CONNECT, NULL, nam, NULL, l);
+ error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam);
return error;
}
Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.161 src/sys/kern/uipc_usrreq.c:1.162
--- src/sys/kern/uipc_usrreq.c:1.161 Thu Jul 24 15:12:03 2014
+++ src/sys/kern/uipc_usrreq.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_usrreq.c,v 1.161 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: uipc_usrreq.c,v 1.162 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.161 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.162 2014/07/30 10:04:26 rtr Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -398,6 +398,7 @@ unp_usrreq(struct socket *so, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -415,11 +416,6 @@ unp_usrreq(struct socket *so, int req, s
}
switch (req) {
- case PRU_CONNECT:
- KASSERT(l != NULL);
- error = unp_connect(so, nam, l);
- break;
-
case PRU_CONNECT2:
error = unp_connect2(so, (struct socket *)nam, PRU_CONNECT2);
break;
@@ -502,7 +498,7 @@ unp_usrreq(struct socket *so, int req, s
* intervening control ops, like
* another connection.
*/
- error = unp_connect(so, nam, l);
+ error = unp_connect(so, nam);
}
} else {
if ((so->so_state & SS_ISCONNECTED) == 0)
@@ -1044,7 +1040,7 @@ unp_listen(struct socket *so)
}
int
-unp_connect(struct socket *so, struct mbuf *nam, struct lwp *l)
+unp_connect(struct socket *so, struct mbuf *nam)
{
struct sockaddr_un *sun;
vnode_t *vp;
@@ -1085,7 +1081,7 @@ unp_connect(struct socket *so, struct mb
goto bad;
}
pathbuf_destroy(pb);
- if ((error = VOP_ACCESS(vp, VWRITE, l->l_cred)) != 0)
+ if ((error = VOP_ACCESS(vp, VWRITE, curlwp->l_cred)) != 0)
goto bad;
/* Acquire v_interlock to protect against unp_detach(). */
mutex_enter(vp->v_interlock);
@@ -1127,9 +1123,9 @@ unp_connect(struct socket *so, struct mb
unp3->unp_addrlen = unp2->unp_addrlen;
}
unp3->unp_flags = unp2->unp_flags;
- unp3->unp_connid.unp_pid = l->l_proc->p_pid;
- unp3->unp_connid.unp_euid = kauth_cred_geteuid(l->l_cred);
- unp3->unp_connid.unp_egid = kauth_cred_getegid(l->l_cred);
+ unp3->unp_connid.unp_pid = curlwp->l_proc->p_pid;
+ unp3->unp_connid.unp_euid = kauth_cred_geteuid(curlwp->l_cred);
+ unp3->unp_connid.unp_egid = kauth_cred_getegid(curlwp->l_cred);
unp3->unp_flags |= UNP_EIDSVALID;
if (unp2->unp_flags & UNP_EIDSBIND) {
unp->unp_connid = unp2->unp_connid;
@@ -1882,6 +1878,7 @@ const struct pr_usrreqs unp_usrreqs = {
.pr_accept = unp_accept,
.pr_bind = unp_bind,
.pr_listen = unp_listen,
+ .pr_connect = unp_connect,
.pr_ioctl = unp_ioctl,
.pr_stat = unp_stat,
.pr_peeraddr = unp_peeraddr,
Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.45 src/sys/net/raw_usrreq.c:1.46
--- src/sys/net/raw_usrreq.c:1.45 Thu Jul 24 15:12:03 2014
+++ src/sys/net/raw_usrreq.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: raw_usrreq.c,v 1.45 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: raw_usrreq.c,v 1.46 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.45 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.46 2014/07/30 10:04:26 rtr Exp $");
#include <sys/param.h>
#include <sys/mbuf.h>
@@ -165,6 +165,7 @@ raw_usrreq(struct socket *so, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -188,7 +189,6 @@ raw_usrreq(struct socket *so, int req, s
* within that protocol family (assuming there's
* nothing else around it should go to).
*/
- case PRU_CONNECT:
case PRU_CONNECT2:
error = EOPNOTSUPP;
break;
Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.157 src/sys/net/rtsock.c:1.158
--- src/sys/net/rtsock.c:1.157 Thu Jul 24 15:12:03 2014
+++ src/sys/net/rtsock.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rtsock.c,v 1.157 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: rtsock.c,v 1.158 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.157 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.158 2014/07/30 10:04:26 rtr Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -250,6 +250,14 @@ COMPATNAME(route_listen)(struct socket *
}
static int
+COMPATNAME(route_connect)(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
COMPATNAME(route_ioctl)(struct socket *so, u_long cmd, void *nam,
struct ifnet * ifp)
{
@@ -327,6 +335,7 @@ COMPATNAME(route_usrreq)(struct socket *
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -1432,6 +1441,7 @@ static const struct pr_usrreqs route_usr
.pr_accept = COMPATNAME(route_accept_wrapper),
.pr_bind = COMPATNAME(route_bind_wrapper),
.pr_listen = COMPATNAME(route_listen_wrapper),
+ .pr_connect = COMPATNAME(route_connect_wrapper),
.pr_ioctl = COMPATNAME(route_ioctl_wrapper),
.pr_stat = COMPATNAME(route_stat_wrapper),
.pr_peeraddr = COMPATNAME(route_peeraddr_wrapper),
Index: src/sys/netatalk/ddp_usrreq.c
diff -u src/sys/netatalk/ddp_usrreq.c:1.55 src/sys/netatalk/ddp_usrreq.c:1.56
--- src/sys/netatalk/ddp_usrreq.c:1.55 Thu Jul 24 15:12:03 2014
+++ src/sys/netatalk/ddp_usrreq.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: ddp_usrreq.c,v 1.55 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: ddp_usrreq.c,v 1.56 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (c) 1990,1991 Regents of The University of Michigan.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.55 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.56 2014/07/30 10:04:26 rtr Exp $");
#include "opt_mbuftrace.h"
@@ -59,7 +59,7 @@ __KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c
static void at_pcbdisconnect(struct ddpcb *);
static void at_sockaddr(struct ddpcb *, struct mbuf *);
static int at_pcbsetaddr(struct ddpcb *, struct mbuf *);
-static int at_pcbconnect(struct ddpcb *, struct mbuf *, struct lwp *);
+static int at_pcbconnect(struct ddpcb *, struct mbuf *);
static void ddp_detach(struct socket *);
struct ifqueue atintrq1, atintrq2;
@@ -87,6 +87,7 @@ ddp_usrreq(struct socket *so, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -111,16 +112,6 @@ ddp_usrreq(struct socket *so, int req, s
goto release;
}
switch (req) {
- case PRU_CONNECT:
- if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT) {
- error = EISCONN;
- break;
- }
- error = at_pcbconnect(ddp, addr, l);
- if (error == 0)
- soisconnected(so);
- break;
-
case PRU_DISCONNECT:
if (ddp->ddp_fsat.sat_addr.s_node == ATADDR_ANYNODE) {
error = ENOTCONN;
@@ -143,7 +134,7 @@ ddp_usrreq(struct socket *so, int req, s
break;
}
s = splnet();
- error = at_pcbconnect(ddp, addr, l);
+ error = at_pcbconnect(ddp, addr);
if (error) {
splx(s);
break;
@@ -300,7 +291,7 @@ at_pcbsetaddr(struct ddpcb *ddp, struct
}
static int
-at_pcbconnect(struct ddpcb *ddp, struct mbuf *addr, struct lwp *l)
+at_pcbconnect(struct ddpcb *ddp, struct mbuf *addr)
{
struct rtentry *rt;
const struct sockaddr_at *cdst;
@@ -493,6 +484,25 @@ ddp_listen(struct socket *so)
}
static int
+ddp_connect(struct socket *so, struct mbuf *nam)
+{
+ struct ddpcb *ddp = sotoddpcb(so);
+ int error = 0;
+
+ KASSERT(solocked(so));
+ KASSERT(ddp != NULL);
+ KASSERT(nam != NULL);
+
+ if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT)
+ return EISCONN;
+ error = at_pcbconnect(ddp, nam);
+ if (error == 0)
+ soisconnected(so);
+
+ return error;
+}
+
+static int
ddp_ioctl(struct socket *so, u_long cmd, void *addr, struct ifnet *ifp)
{
return at_control(cmd, addr, ifp);
@@ -621,6 +631,7 @@ PR_WRAP_USRREQS(ddp)
#define ddp_accept ddp_accept_wrapper
#define ddp_bind ddp_bind_wrapper
#define ddp_listen ddp_listen_wrapper
+#define ddp_connect ddp_connect_wrapper
#define ddp_ioctl ddp_ioctl_wrapper
#define ddp_stat ddp_stat_wrapper
#define ddp_peeraddr ddp_peeraddr_wrapper
@@ -635,6 +646,7 @@ const struct pr_usrreqs ddp_usrreqs = {
.pr_accept = ddp_accept,
.pr_bind = ddp_bind,
.pr_listen = ddp_listen,
+ .pr_connect = ddp_connect,
.pr_ioctl = ddp_ioctl,
.pr_stat = ddp_stat,
.pr_peeraddr = ddp_peeraddr,
Index: src/sys/netbt/hci_socket.c
diff -u src/sys/netbt/hci_socket.c:1.34 src/sys/netbt/hci_socket.c:1.35
--- src/sys/netbt/hci_socket.c:1.34 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/hci_socket.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: hci_socket.c,v 1.34 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: hci_socket.c,v 1.35 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.34 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.35 2014/07/30 10:04:26 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -527,6 +527,31 @@ hci_listen(struct socket *so)
}
static int
+hci_connect(struct socket *so, struct mbuf *nam)
+{
+ struct hci_pcb *pcb = so->so_pcb;
+ struct sockaddr_bt *sa;
+
+ KASSERT(solocked(so));
+ KASSERT(pcb != NULL);
+ KASSERT(nam != NULL);
+
+ sa = mtod(nam, struct sockaddr_bt *);
+ if (sa->bt_len != sizeof(struct sockaddr_bt))
+ return EINVAL;
+
+ if (sa->bt_family != AF_BLUETOOTH)
+ return EAFNOSUPPORT;
+
+ if (hci_unit_lookup(&sa->bt_bdaddr) == NULL)
+ return EADDRNOTAVAIL;
+
+ bdaddr_copy(&pcb->hp_raddr, &sa->bt_bdaddr);
+ soisconnected(so);
+ return 0;
+}
+
+static int
hci_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
int err;
@@ -627,6 +652,7 @@ hci_usrreq(struct socket *up, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -663,23 +689,6 @@ hci_usrreq(struct socket *up, int req, s
hci_detach(up);
return 0;
- case PRU_CONNECT:
- KASSERT(nam != NULL);
- sa = mtod(nam, struct sockaddr_bt *);
-
- if (sa->bt_len != sizeof(struct sockaddr_bt))
- return EINVAL;
-
- if (sa->bt_family != AF_BLUETOOTH)
- return EAFNOSUPPORT;
-
- if (hci_unit_lookup(&sa->bt_bdaddr) == NULL)
- return EADDRNOTAVAIL;
-
- bdaddr_copy(&pcb->hp_raddr, &sa->bt_bdaddr);
- soisconnected(up);
- return 0;
-
case PRU_SHUTDOWN:
socantsendmore(up);
break;
@@ -941,6 +950,7 @@ PR_WRAP_USRREQS(hci)
#define hci_accept hci_accept_wrapper
#define hci_bind hci_bind_wrapper
#define hci_listen hci_listen_wrapper
+#define hci_connect hci_connect_wrapper
#define hci_ioctl hci_ioctl_wrapper
#define hci_stat hci_stat_wrapper
#define hci_peeraddr hci_peeraddr_wrapper
@@ -955,6 +965,7 @@ const struct pr_usrreqs hci_usrreqs = {
.pr_accept = hci_accept,
.pr_bind = hci_bind,
.pr_listen = hci_listen,
+ .pr_connect = hci_connect,
.pr_ioctl = hci_ioctl,
.pr_stat = hci_stat,
.pr_peeraddr = hci_peeraddr,
Index: src/sys/netbt/l2cap.h
diff -u src/sys/netbt/l2cap.h:1.15 src/sys/netbt/l2cap.h:1.16
--- src/sys/netbt/l2cap.h:1.15 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/l2cap.h Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap.h,v 1.15 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: l2cap.h,v 1.16 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -54,7 +54,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: l2cap.h,v 1.15 2014/07/24 15:12:03 rtr Exp $
+ * $Id: l2cap.h,v 1.16 2014/07/30 10:04:26 rtr Exp $
* $FreeBSD: src/sys/netgraph/bluetooth/include/l2cap.h,v 1.4 2005/08/31 18:13:23 emax Exp $
*/
@@ -464,7 +464,7 @@ int l2cap_ctloutput(int, struct socket *
int l2cap_attach_pcb(struct l2cap_channel **, const struct btproto *, void *);
int l2cap_bind_pcb(struct l2cap_channel *, struct sockaddr_bt *);
int l2cap_sockaddr_pcb(struct l2cap_channel *, struct sockaddr_bt *);
-int l2cap_connect(struct l2cap_channel *, struct sockaddr_bt *);
+int l2cap_connect_pcb(struct l2cap_channel *, struct sockaddr_bt *);
int l2cap_peeraddr_pcb(struct l2cap_channel *, struct sockaddr_bt *);
int l2cap_disconnect(struct l2cap_channel *, int);
void l2cap_detach_pcb(struct l2cap_channel **);
Index: src/sys/netbt/l2cap_upper.c
diff -u src/sys/netbt/l2cap_upper.c:1.15 src/sys/netbt/l2cap_upper.c:1.16
--- src/sys/netbt/l2cap_upper.c:1.15 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/l2cap_upper.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap_upper.c,v 1.15 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: l2cap_upper.c,v 1.16 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.15 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.16 2014/07/30 10:04:26 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -131,7 +131,7 @@ l2cap_sockaddr_pcb(struct l2cap_channel
}
/*
- * l2cap_connect(l2cap_channel, sockaddr)
+ * l2cap_connect_pcb(l2cap_channel, sockaddr)
*
* Initiate a connection to destination. This corresponds to
* "Open Channel Request" in the L2CAP specification and will
@@ -144,7 +144,7 @@ l2cap_sockaddr_pcb(struct l2cap_channel
* proto->connecting(upper)
*/
int
-l2cap_connect(struct l2cap_channel *chan, struct sockaddr_bt *dest)
+l2cap_connect_pcb(struct l2cap_channel *chan, struct sockaddr_bt *dest)
{
struct hci_unit *unit;
int err;
Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.25 src/sys/netbt/l2cap_socket.c:1.26
--- src/sys/netbt/l2cap_socket.c:1.25 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/l2cap_socket.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap_socket.c,v 1.25 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: l2cap_socket.c,v 1.26 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.25 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.26 2014/07/30 10:04:26 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -169,6 +169,29 @@ l2cap_listen(struct socket *so)
}
static int
+l2cap_connect(struct socket *so, struct mbuf *nam)
+{
+ struct l2cap_channel *pcb = so->so_pcb;
+ struct sockaddr_bt *sa;
+
+ KASSERT(solocked(so));
+ KASSERT(nam != NULL);
+
+ if (pcb == NULL)
+ return EINVAL;
+
+ sa = mtod(nam, struct sockaddr_bt *);
+ if (sa->bt_len != sizeof(struct sockaddr_bt))
+ return EINVAL;
+
+ if (sa->bt_family != AF_BLUETOOTH)
+ return EAFNOSUPPORT;
+
+ soisconnecting(so);
+ return l2cap_connect_pcb(pcb, sa);
+}
+
+static int
l2cap_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return EPASSTHROUGH;
@@ -253,7 +276,6 @@ l2cap_usrreq(struct socket *up, int req,
struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
{
struct l2cap_channel *pcb = up->so_pcb;
- struct sockaddr_bt *sa;
struct mbuf *m0;
int err = 0;
@@ -263,6 +285,7 @@ l2cap_usrreq(struct socket *up, int req,
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -291,19 +314,6 @@ l2cap_usrreq(struct socket *up, int req,
l2cap_detach(up);
return 0;
- case PRU_CONNECT:
- KASSERT(nam != NULL);
- sa = mtod(nam, struct sockaddr_bt *);
-
- if (sa->bt_len != sizeof(struct sockaddr_bt))
- return EINVAL;
-
- if (sa->bt_family != AF_BLUETOOTH)
- return EAFNOSUPPORT;
-
- soisconnecting(up);
- return l2cap_connect(pcb, sa);
-
case PRU_SHUTDOWN:
socantsendmore(up);
break;
@@ -500,6 +510,7 @@ PR_WRAP_USRREQS(l2cap)
#define l2cap_accept l2cap_accept_wrapper
#define l2cap_bind l2cap_bind_wrapper
#define l2cap_listen l2cap_listen_wrapper
+#define l2cap_connect l2cap_connect_wrapper
#define l2cap_ioctl l2cap_ioctl_wrapper
#define l2cap_stat l2cap_stat_wrapper
#define l2cap_peeraddr l2cap_peeraddr_wrapper
@@ -514,6 +525,7 @@ const struct pr_usrreqs l2cap_usrreqs =
.pr_accept = l2cap_accept,
.pr_bind = l2cap_bind,
.pr_listen = l2cap_listen,
+ .pr_connect = l2cap_connect,
.pr_ioctl = l2cap_ioctl,
.pr_stat = l2cap_stat,
.pr_peeraddr = l2cap_peeraddr,
Index: src/sys/netbt/rfcomm.h
diff -u src/sys/netbt/rfcomm.h:1.14 src/sys/netbt/rfcomm.h:1.15
--- src/sys/netbt/rfcomm.h:1.14 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/rfcomm.h Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm.h,v 1.14 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: rfcomm.h,v 1.15 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -55,7 +55,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: rfcomm.h,v 1.14 2014/07/24 15:12:03 rtr Exp $
+ * $Id: rfcomm.h,v 1.15 2014/07/30 10:04:26 rtr Exp $
* $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $
*/
@@ -410,7 +410,7 @@ int rfcomm_ctloutput(int, struct socket
int rfcomm_attach_pcb(struct rfcomm_dlc **, const struct btproto *, void *);
int rfcomm_bind_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
int rfcomm_sockaddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
-int rfcomm_connect(struct rfcomm_dlc *, struct sockaddr_bt *);
+int rfcomm_connect_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
int rfcomm_peeraddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
int rfcomm_disconnect(struct rfcomm_dlc *, int);
void rfcomm_detach_pcb(struct rfcomm_dlc **);
Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.26 src/sys/netbt/rfcomm_socket.c:1.27
--- src/sys/netbt/rfcomm_socket.c:1.26 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/rfcomm_socket.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm_socket.c,v 1.26 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: rfcomm_socket.c,v 1.27 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.26 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.27 2014/07/30 10:04:26 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -177,6 +177,29 @@ rfcomm_listen(struct socket *so)
}
static int
+rfcomm_connect(struct socket *so, struct mbuf *nam)
+{
+ struct rfcomm_dlc *pcb = so->so_pcb;
+ struct sockaddr_bt *sa;
+
+ KASSERT(solocked(so));
+ KASSERT(nam != NULL);
+
+ if (pcb == NULL)
+ return EINVAL;
+
+ sa = mtod(nam, struct sockaddr_bt *);
+ if (sa->bt_len != sizeof(struct sockaddr_bt))
+ return EINVAL;
+
+ if (sa->bt_family != AF_BLUETOOTH)
+ return EAFNOSUPPORT;
+
+ soisconnecting(so);
+ return rfcomm_connect_pcb(pcb, sa);
+}
+
+static int
rfcomm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return EPASSTHROUGH;
@@ -261,7 +284,6 @@ rfcomm_usrreq(struct socket *up, int req
struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
{
struct rfcomm_dlc *pcb = up->so_pcb;
- struct sockaddr_bt *sa;
struct mbuf *m0;
int err = 0;
@@ -271,6 +293,7 @@ rfcomm_usrreq(struct socket *up, int req
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -298,19 +321,6 @@ rfcomm_usrreq(struct socket *up, int req
rfcomm_detach(up);
return 0;
- case PRU_CONNECT:
- KASSERT(nam != NULL);
- sa = mtod(nam, struct sockaddr_bt *);
-
- if (sa->bt_len != sizeof(struct sockaddr_bt))
- return EINVAL;
-
- if (sa->bt_family != AF_BLUETOOTH)
- return EAFNOSUPPORT;
-
- soisconnecting(up);
- return rfcomm_connect(pcb, sa);
-
case PRU_SHUTDOWN:
socantsendmore(up);
break;
@@ -511,6 +521,7 @@ PR_WRAP_USRREQS(rfcomm)
#define rfcomm_accept rfcomm_accept_wrapper
#define rfcomm_bind rfcomm_bind_wrapper
#define rfcomm_listen rfcomm_listen_wrapper
+#define rfcomm_connect rfcomm_connect_wrapper
#define rfcomm_ioctl rfcomm_ioctl_wrapper
#define rfcomm_stat rfcomm_stat_wrapper
#define rfcomm_peeraddr rfcomm_peeraddr_wrapper
@@ -525,6 +536,7 @@ const struct pr_usrreqs rfcomm_usrreqs =
.pr_accept = rfcomm_accept,
.pr_bind = rfcomm_bind,
.pr_listen = rfcomm_listen,
+ .pr_connect = rfcomm_connect,
.pr_ioctl = rfcomm_ioctl,
.pr_stat = rfcomm_stat,
.pr_peeraddr = rfcomm_peeraddr,
Index: src/sys/netbt/rfcomm_upper.c
diff -u src/sys/netbt/rfcomm_upper.c:1.17 src/sys/netbt/rfcomm_upper.c:1.18
--- src/sys/netbt/rfcomm_upper.c:1.17 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/rfcomm_upper.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm_upper.c,v 1.17 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: rfcomm_upper.c,v 1.18 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.17 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.18 2014/07/30 10:04:26 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -125,12 +125,12 @@ rfcomm_sockaddr_pcb(struct rfcomm_dlc *d
}
/*
- * rfcomm_connect(dlc, sockaddr)
+ * rfcomm_connect_pcb(dlc, sockaddr)
*
* Initiate connection of RFCOMM DLC to remote address.
*/
int
-rfcomm_connect(struct rfcomm_dlc *dlc, struct sockaddr_bt *dest)
+rfcomm_connect_pcb(struct rfcomm_dlc *dlc, struct sockaddr_bt *dest)
{
struct rfcomm_session *rs;
int err = 0;
@@ -167,7 +167,7 @@ rfcomm_connect(struct rfcomm_dlc *dlc, s
rs->rs_flags |= RFCOMM_SESSION_INITIATOR;
rs->rs_state = RFCOMM_SESSION_WAIT_CONNECT;
- err = l2cap_connect(rs->rs_l2cap, &dlc->rd_raddr);
+ err = l2cap_connect_pcb(rs->rs_l2cap, &dlc->rd_raddr);
if (err) {
rfcomm_session_free(rs);
return err;
Index: src/sys/netbt/sco.h
diff -u src/sys/netbt/sco.h:1.8 src/sys/netbt/sco.h:1.9
--- src/sys/netbt/sco.h:1.8 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/sco.h Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: sco.h,v 1.8 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: sco.h,v 1.9 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -71,7 +71,7 @@ int sco_ctloutput(int, struct socket *,
int sco_attach_pcb(struct sco_pcb **, const struct btproto *, void *);
int sco_bind_pcb(struct sco_pcb *, struct sockaddr_bt *);
int sco_sockaddr_pcb(struct sco_pcb *, struct sockaddr_bt *);
-int sco_connect(struct sco_pcb *, struct sockaddr_bt *);
+int sco_connect_pcb(struct sco_pcb *, struct sockaddr_bt *);
int sco_peeraddr_pcb(struct sco_pcb *, struct sockaddr_bt *);
int sco_disconnect(struct sco_pcb *, int);
void sco_detach_pcb(struct sco_pcb **);
Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.27 src/sys/netbt/sco_socket.c:1.28
--- src/sys/netbt/sco_socket.c:1.27 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/sco_socket.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: sco_socket.c,v 1.27 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: sco_socket.c,v 1.28 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.27 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.28 2014/07/30 10:04:26 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -160,6 +160,29 @@ sco_listen(struct socket *so)
}
static int
+sco_connect(struct socket *so, struct mbuf *nam)
+{
+ struct sco_pcb *pcb = so->so_pcb;
+ struct sockaddr_bt *sa;
+
+ KASSERT(solocked(so));
+ KASSERT(nam != NULL);
+
+ if (pcb == NULL)
+ return EINVAL;
+
+ sa = mtod(nam, struct sockaddr_bt *);
+ if (sa->bt_len != sizeof(struct sockaddr_bt))
+ return EINVAL;
+
+ if (sa->bt_family != AF_BLUETOOTH)
+ return EAFNOSUPPORT;
+
+ soisconnecting(so);
+ return sco_connect_pcb(pcb, sa);
+}
+
+static int
sco_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return EOPNOTSUPP;
@@ -240,7 +263,6 @@ sco_usrreq(struct socket *up, int req, s
struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
{
struct sco_pcb *pcb = (struct sco_pcb *)up->so_pcb;
- struct sockaddr_bt *sa;
struct mbuf *m0;
int err = 0;
@@ -250,6 +272,7 @@ sco_usrreq(struct socket *up, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -279,19 +302,6 @@ sco_usrreq(struct socket *up, int req, s
sco_detach(up);
return 0;
- case PRU_CONNECT:
- KASSERT(nam != NULL);
- sa = mtod(nam, struct sockaddr_bt *);
-
- if (sa->bt_len != sizeof(struct sockaddr_bt))
- return EINVAL;
-
- if (sa->bt_family != AF_BLUETOOTH)
- return EAFNOSUPPORT;
-
- soisconnecting(up);
- return sco_connect(pcb, sa);
-
case PRU_SHUTDOWN:
socantsendmore(up);
break;
@@ -467,6 +477,7 @@ PR_WRAP_USRREQS(sco)
#define sco_accept sco_accept_wrapper
#define sco_bind sco_bind_wrapper
#define sco_listen sco_listen_wrapper
+#define sco_connect sco_connect_wrapper
#define sco_ioctl sco_ioctl_wrapper
#define sco_stat sco_stat_wrapper
#define sco_peeraddr sco_peeraddr_wrapper
@@ -481,6 +492,7 @@ const struct pr_usrreqs sco_usrreqs = {
.pr_accept = sco_accept,
.pr_bind = sco_bind,
.pr_listen = sco_listen,
+ .pr_connect = sco_connect,
.pr_ioctl = sco_ioctl,
.pr_stat = sco_stat,
.pr_peeraddr = sco_peeraddr,
Index: src/sys/netbt/sco_upper.c
diff -u src/sys/netbt/sco_upper.c:1.13 src/sys/netbt/sco_upper.c:1.14
--- src/sys/netbt/sco_upper.c:1.13 Thu Jul 24 15:12:03 2014
+++ src/sys/netbt/sco_upper.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: sco_upper.c,v 1.13 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: sco_upper.c,v 1.14 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.13 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.14 2014/07/30 10:04:26 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -114,12 +114,12 @@ sco_sockaddr_pcb(struct sco_pcb *pcb, st
}
/*
- * sco_connect(pcb, sockaddr)
+ * sco_connect_pcb(pcb, sockaddr)
*
* Initiate a SCO connection to the destination address.
*/
int
-sco_connect(struct sco_pcb *pcb, struct sockaddr_bt *dest)
+sco_connect_pcb(struct sco_pcb *pcb, struct sockaddr_bt *dest)
{
hci_add_sco_con_cp cp;
struct hci_unit *unit;
Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.136 src/sys/netinet/raw_ip.c:1.137
--- src/sys/netinet/raw_ip.c:1.136 Thu Jul 24 15:12:03 2014
+++ src/sys/netinet/raw_ip.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: raw_ip.c,v 1.136 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: raw_ip.c,v 1.137 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.136 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.137 2014/07/30 10:04:26 rtr Exp $");
#include "opt_inet.h"
#include "opt_compat_netbsd.h"
@@ -112,7 +112,7 @@ struct inpcbtable rawcbtable;
int rip_pcbnotify(struct inpcbtable *, struct in_addr,
struct in_addr, int, int, void (*)(struct inpcb *, int));
-int rip_connect(struct inpcb *, struct mbuf *);
+int rip_connect_pcb(struct inpcb *, struct mbuf *);
void rip_disconnect(struct inpcb *);
static void sysctl_net_inet_raw_setup(struct sysctllog **);
@@ -481,7 +481,7 @@ rip_ctloutput(int op, struct socket *so,
}
int
-rip_connect(struct inpcb *inp, struct mbuf *nam)
+rip_connect_pcb(struct inpcb *inp, struct mbuf *nam)
{
struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *);
@@ -604,6 +604,27 @@ rip_listen(struct socket *so)
}
static int
+rip_connect(struct socket *so, struct mbuf *nam)
+{
+ struct inpcb *inp = sotoinpcb(so);
+ int error = 0;
+ int s;
+
+ KASSERT(solocked(so));
+ KASSERT(inp != NULL);
+ KASSERT(nam != NULL);
+
+ s = splsoftnet();
+ error = rip_connect_pcb(inp, nam);
+ if (! error)
+ soisconnected(so);
+
+ splx(s);
+ return error;
+}
+
+
+static int
rip_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return in_control(so, cmd, nam, ifp);
@@ -671,6 +692,7 @@ rip_usrreq(struct socket *so, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -700,13 +722,6 @@ rip_usrreq(struct socket *so, int req, s
switch (req) {
- case PRU_CONNECT:
- error = rip_connect(inp, nam);
- if (error)
- break;
- soisconnected(so);
- break;
-
case PRU_CONNECT2:
error = EOPNOTSUPP;
break;
@@ -744,7 +759,7 @@ rip_usrreq(struct socket *so, int req, s
error = EISCONN;
goto die;
}
- error = rip_connect(inp, nam);
+ error = rip_connect_pcb(inp, nam);
if (error) {
die:
m_freem(m);
@@ -776,6 +791,7 @@ PR_WRAP_USRREQS(rip)
#define rip_accept rip_accept_wrapper
#define rip_bind rip_bind_wrapper
#define rip_listen rip_listen_wrapper
+#define rip_connect rip_connect_wrapper
#define rip_ioctl rip_ioctl_wrapper
#define rip_stat rip_stat_wrapper
#define rip_peeraddr rip_peeraddr_wrapper
@@ -790,6 +806,7 @@ const struct pr_usrreqs rip_usrreqs = {
.pr_accept = rip_accept,
.pr_bind = rip_bind,
.pr_listen = rip_listen,
+ .pr_connect = rip_connect,
.pr_ioctl = rip_ioctl,
.pr_stat = rip_stat,
.pr_peeraddr = rip_peeraddr,
Index: src/sys/netinet/tcp_usrreq.c
diff -u src/sys/netinet/tcp_usrreq.c:1.192 src/sys/netinet/tcp_usrreq.c:1.193
--- src/sys/netinet/tcp_usrreq.c:1.192 Wed Jul 30 06:53:53 2014
+++ src/sys/netinet/tcp_usrreq.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_usrreq.c,v 1.192 2014/07/30 06:53:53 rtr Exp $ */
+/* $NetBSD: tcp_usrreq.c,v 1.193 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -99,7 +99,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.192 2014/07/30 06:53:53 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.193 2014/07/30 10:04:26 rtr Exp $");
#include "opt_inet.h"
#include "opt_ipsec.h"
@@ -233,6 +233,7 @@ tcp_usrreq(struct socket *so, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -286,72 +287,6 @@ tcp_usrreq(struct socket *so, int req, s
switch (req) {
/*
- * Initiate connection to peer.
- * Create a template for use in transmissions on this connection.
- * Enter SYN_SENT state, and mark socket as connecting.
- * Start keep-alive timer, and seed output sequence space.
- * Send initial segment on connection.
- */
- case PRU_CONNECT:
-#ifdef INET
- if (inp) {
- if (inp->inp_lport == 0) {
- error = in_pcbbind(inp, NULL);
- if (error)
- break;
- }
- error = in_pcbconnect(inp, nam, l);
- }
-#endif
-#ifdef INET6
- if (in6p) {
- if (in6p->in6p_lport == 0) {
- error = in6_pcbbind(in6p, NULL);
- if (error)
- break;
- }
- error = in6_pcbconnect(in6p, nam, l);
- if (!error) {
- /* mapped addr case */
- if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr))
- tp->t_family = AF_INET;
- else
- tp->t_family = AF_INET6;
- }
- }
-#endif
- if (error)
- break;
- tp->t_template = tcp_template(tp);
- if (tp->t_template == 0) {
-#ifdef INET
- if (inp)
- in_pcbdisconnect(inp);
-#endif
-#ifdef INET6
- if (in6p)
- in6_pcbdisconnect(in6p);
-#endif
- error = ENOBUFS;
- break;
- }
- /*
- * Compute window scaling to request.
- * XXX: This should be moved to tcp_output().
- */
- while (tp->request_r_scale < TCP_MAX_WINSHIFT &&
- (TCP_MAXWIN << tp->request_r_scale) < sb_max)
- tp->request_r_scale++;
- soisconnecting(so);
- TCP_STATINC(TCP_STAT_CONNATTEMPT);
- tp->t_state = TCPS_SYN_SENT;
- TCP_TIMER_ARM(tp, TCPT_KEEP, tp->t_keepinit);
- tp->iss = tcp_new_iss(tp, 0);
- tcp_sendseqinit(tp);
- error = tcp_output(tp);
- break;
-
- /*
* Create a TCP connection between two sockets.
*/
case PRU_CONNECT2:
@@ -919,6 +854,96 @@ release:
}
static int
+tcp_connect(struct socket *so, struct mbuf *nam)
+{
+ struct inpcb *inp = NULL;
+ struct in6pcb *in6p = NULL;
+ struct tcpcb *tp = NULL;
+ int s;
+ int error = 0;
+ int ostate = 0;
+
+ KASSERT(solocked(so));
+
+ if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
+ return error;
+
+ ostate = tcp_debug_capture(tp, PRU_CONNECT);
+
+ s = splsoftnet();
+
+ /*
+ * Initiate connection to peer.
+ * Create a template for use in transmissions on this connection.
+ * Enter SYN_SENT state, and mark socket as connecting.
+ * Start keep-alive timer, and seed output sequence space.
+ * Send initial segment on connection.
+ */
+#ifdef INET
+ if (inp) {
+ if (inp->inp_lport == 0) {
+ error = in_pcbbind(inp, NULL);
+ if (error)
+ goto release;
+ }
+ error = in_pcbconnect(inp, nam, curlwp);
+ }
+#endif
+#ifdef INET6
+ if (in6p) {
+ if (in6p->in6p_lport == 0) {
+ error = in6_pcbbind(in6p, NULL);
+ if (error)
+ goto release;
+ }
+ error = in6_pcbconnect(in6p, nam, curlwp);
+ if (!error) {
+ /* mapped addr case */
+ if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr))
+ tp->t_family = AF_INET;
+ else
+ tp->t_family = AF_INET6;
+ }
+ }
+#endif
+ if (error)
+ goto release;
+ tp->t_template = tcp_template(tp);
+ if (tp->t_template == 0) {
+#ifdef INET
+ if (inp)
+ in_pcbdisconnect(inp);
+#endif
+#ifdef INET6
+ if (in6p)
+ in6_pcbdisconnect(in6p);
+#endif
+ error = ENOBUFS;
+ goto release;
+ }
+ /*
+ * Compute window scaling to request.
+ * XXX: This should be moved to tcp_output().
+ */
+ while (tp->request_r_scale < TCP_MAX_WINSHIFT &&
+ (TCP_MAXWIN << tp->request_r_scale) < sb_max)
+ tp->request_r_scale++;
+ soisconnecting(so);
+ TCP_STATINC(TCP_STAT_CONNATTEMPT);
+ tp->t_state = TCPS_SYN_SENT;
+ TCP_TIMER_ARM(tp, TCPT_KEEP, tp->t_keepinit);
+ tp->iss = tcp_new_iss(tp, 0);
+ tcp_sendseqinit(tp);
+ error = tcp_output(tp);
+
+release:
+ tcp_debug_trace(so, tp, ostate, PRU_CONNECT);
+ splx(s);
+
+ return error;
+}
+
+static int
tcp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
switch (so->so_proto->pr_domain->dom_family) {
@@ -2309,6 +2334,7 @@ PR_WRAP_USRREQS(tcp)
#define tcp_accept tcp_accept_wrapper
#define tcp_bind tcp_bind_wrapper
#define tcp_listen tcp_listen_wrapper
+#define tcp_connect tcp_connect_wrapper
#define tcp_ioctl tcp_ioctl_wrapper
#define tcp_stat tcp_stat_wrapper
#define tcp_peeraddr tcp_peeraddr_wrapper
@@ -2323,6 +2349,7 @@ const struct pr_usrreqs tcp_usrreqs = {
.pr_accept = tcp_accept,
.pr_bind = tcp_bind,
.pr_listen = tcp_listen,
+ .pr_connect = tcp_connect,
.pr_ioctl = tcp_ioctl,
.pr_stat = tcp_stat,
.pr_peeraddr = tcp_peeraddr,
Index: src/sys/netinet/udp_usrreq.c
diff -u src/sys/netinet/udp_usrreq.c:1.210 src/sys/netinet/udp_usrreq.c:1.211
--- src/sys/netinet/udp_usrreq.c:1.210 Thu Jul 24 15:12:03 2014
+++ src/sys/netinet/udp_usrreq.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: udp_usrreq.c,v 1.210 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: udp_usrreq.c,v 1.211 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.210 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.211 2014/07/30 10:04:26 rtr Exp $");
#include "opt_inet.h"
#include "opt_compat_netbsd.h"
@@ -930,6 +930,24 @@ udp_listen(struct socket *so)
return EOPNOTSUPP;
}
+static int
+udp_connect(struct socket *so, struct mbuf *nam)
+{
+ struct inpcb *inp = sotoinpcb(so);
+ int error = 0;
+ int s;
+
+ KASSERT(solocked(so));
+ KASSERT(inp != NULL);
+ KASSERT(nam != NULL);
+
+ s = splsoftnet();
+ error = in_pcbconnect(inp, nam, curlwp);
+ if (! error)
+ soisconnected(so);
+ splx(s);
+ return error;
+}
static int
udp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
@@ -999,6 +1017,7 @@ udp_usrreq(struct socket *so, int req, s
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -1031,13 +1050,6 @@ udp_usrreq(struct socket *so, int req, s
* the udp pcb queue and/or pcb addresses.
*/
switch (req) {
- case PRU_CONNECT:
- error = in_pcbconnect(inp, nam, l);
- if (error)
- break;
- soisconnected(so);
- break;
-
case PRU_CONNECT2:
error = EOPNOTSUPP;
break;
@@ -1328,6 +1340,7 @@ PR_WRAP_USRREQS(udp)
#define udp_accept udp_accept_wrapper
#define udp_bind udp_bind_wrapper
#define udp_listen udp_listen_wrapper
+#define udp_connect udp_connect_wrapper
#define udp_ioctl udp_ioctl_wrapper
#define udp_stat udp_stat_wrapper
#define udp_peeraddr udp_peeraddr_wrapper
@@ -1342,6 +1355,7 @@ const struct pr_usrreqs udp_usrreqs = {
.pr_accept = udp_accept,
.pr_bind = udp_bind,
.pr_listen = udp_listen,
+ .pr_connect = udp_connect,
.pr_ioctl = udp_ioctl,
.pr_stat = udp_stat,
.pr_peeraddr = udp_peeraddr,
Index: src/sys/netinet6/raw_ip6.c
diff -u src/sys/netinet6/raw_ip6.c:1.129 src/sys/netinet6/raw_ip6.c:1.130
--- src/sys/netinet6/raw_ip6.c:1.129 Thu Jul 24 15:12:03 2014
+++ src/sys/netinet6/raw_ip6.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: raw_ip6.c,v 1.129 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: raw_ip6.c,v 1.130 2014/07/30 10:04:26 rtr Exp $ */
/* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.129 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.130 2014/07/30 10:04:26 rtr Exp $");
#include "opt_ipsec.h"
@@ -699,6 +699,62 @@ rip6_listen(struct socket *so)
}
static int
+rip6_connect(struct socket *so, struct mbuf *nam)
+{
+ struct in6pcb *in6p = sotoin6pcb(so);
+ struct sockaddr_in6 *addr;
+ struct in6_addr *in6a = NULL;
+ struct ifnet *ifp = NULL;
+ int scope_ambiguous = 0;
+ int error = 0;
+
+ KASSERT(solocked(so));
+ KASSERT(in6p != NULL);
+ KASSERT(nam != NULL);
+
+ addr = mtod(nam, struct sockaddr_in6 *);
+
+ if (nam->m_len != sizeof(*addr))
+ return EINVAL;
+ if (!IFNET_FIRST())
+ return EADDRNOTAVAIL;
+ if (addr->sin6_family != AF_INET6)
+ return EAFNOSUPPORT;
+
+ /*
+ * Application should provide a proper zone ID or the use of
+ * default zone IDs should be enabled. Unfortunately, some
+ * applications do not behave as it should, so we need a
+ * workaround. Even if an appropriate ID is not determined,
+ * we'll see if we can determine the outgoing interface. If we
+ * can, determine the zone ID based on the interface below.
+ */
+ if (addr->sin6_scope_id == 0 && !ip6_use_defzone)
+ scope_ambiguous = 1;
+ if ((error = sa6_embedscope(addr, ip6_use_defzone)) != 0)
+ return error;
+
+ /* Source address selection. XXX: need pcblookup? */
+ in6a = in6_selectsrc(addr, in6p->in6p_outputopts,
+ in6p->in6p_moptions, &in6p->in6p_route,
+ &in6p->in6p_laddr, &ifp, &error);
+ if (in6a == NULL) {
+ if (error == 0)
+ return EADDRNOTAVAIL;
+ return error;
+ }
+ /* XXX: see above */
+ if (ifp && scope_ambiguous &&
+ (error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
+ return error;
+ }
+ in6p->in6p_laddr = *in6a;
+ in6p->in6p_faddr = addr->sin6_addr;
+ soisconnected(so);
+ return error;
+}
+
+static int
rip6_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return in6_control(so, cmd, nam, ifp);
@@ -764,6 +820,7 @@ rip6_usrreq(struct socket *so, int req,
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -795,59 +852,6 @@ rip6_usrreq(struct socket *so, int req,
rip6_detach(so);
break;
- case PRU_CONNECT:
- {
- struct sockaddr_in6 *addr = mtod(nam, struct sockaddr_in6 *);
- struct in6_addr *in6a = NULL;
- struct ifnet *ifp = NULL;
- int scope_ambiguous = 0;
-
- if (nam->m_len != sizeof(*addr)) {
- error = EINVAL;
- break;
- }
- if (!IFNET_FIRST()) {
- error = EADDRNOTAVAIL;
- break;
- }
- if (addr->sin6_family != AF_INET6) {
- error = EAFNOSUPPORT;
- break;
- }
-
- /*
- * Application should provide a proper zone ID or the use of
- * default zone IDs should be enabled. Unfortunately, some
- * applications do not behave as it should, so we need a
- * workaround. Even if an appropriate ID is not determined,
- * we'll see if we can determine the outgoing interface. If we
- * can, determine the zone ID based on the interface below.
- */
- if (addr->sin6_scope_id == 0 && !ip6_use_defzone)
- scope_ambiguous = 1;
- if ((error = sa6_embedscope(addr, ip6_use_defzone)) != 0)
- return error;
-
- /* Source address selection. XXX: need pcblookup? */
- in6a = in6_selectsrc(addr, in6p->in6p_outputopts,
- in6p->in6p_moptions, &in6p->in6p_route,
- &in6p->in6p_laddr, &ifp, &error);
- if (in6a == NULL) {
- if (error == 0)
- error = EADDRNOTAVAIL;
- break;
- }
- /* XXX: see above */
- if (ifp && scope_ambiguous &&
- (error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
- break;
- }
- in6p->in6p_laddr = *in6a;
- in6p->in6p_faddr = addr->sin6_addr;
- soisconnected(so);
- break;
- }
-
case PRU_CONNECT2:
error = EOPNOTSUPP;
break;
@@ -959,6 +963,7 @@ PR_WRAP_USRREQS(rip6)
#define rip6_accept rip6_accept_wrapper
#define rip6_bind rip6_bind_wrapper
#define rip6_listen rip6_listen_wrapper
+#define rip6_connect rip6_connect_wrapper
#define rip6_ioctl rip6_ioctl_wrapper
#define rip6_stat rip6_stat_wrapper
#define rip6_peeraddr rip6_peeraddr_wrapper
@@ -973,6 +978,7 @@ const struct pr_usrreqs rip6_usrreqs = {
.pr_accept = rip6_accept,
.pr_bind = rip6_bind,
.pr_listen = rip6_listen,
+ .pr_connect = rip6_connect,
.pr_ioctl = rip6_ioctl,
.pr_stat = rip6_stat,
.pr_peeraddr = rip6_peeraddr,
Index: src/sys/netinet6/udp6_usrreq.c
diff -u src/sys/netinet6/udp6_usrreq.c:1.109 src/sys/netinet6/udp6_usrreq.c:1.110
--- src/sys/netinet6/udp6_usrreq.c:1.109 Thu Jul 24 15:12:03 2014
+++ src/sys/netinet6/udp6_usrreq.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: udp6_usrreq.c,v 1.109 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: udp6_usrreq.c,v 1.110 2014/07/30 10:04:26 rtr Exp $ */
/* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.109 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.110 2014/07/30 10:04:26 rtr Exp $");
#include "opt_inet.h"
#include "opt_inet_csum.h"
@@ -710,6 +710,27 @@ udp6_listen(struct socket *so)
}
static int
+udp6_connect(struct socket *so, struct mbuf *nam)
+{
+ struct in6pcb *in6p = sotoin6pcb(so);
+ int error = 0;
+ int s;
+
+ KASSERT(solocked(so));
+ KASSERT(in6p != NULL);
+
+ if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr))
+ return EISCONN;
+ s = splsoftnet();
+ error = in6_pcbconnect(in6p, nam, curlwp);
+ splx(s);
+ if (error == 0)
+ soisconnected(so);
+
+ return error;
+}
+
+static int
udp6_ioctl(struct socket *so, u_long cmd, void *addr6, struct ifnet *ifp)
{
/*
@@ -789,6 +810,7 @@ udp6_usrreq(struct socket *so, int req,
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -811,18 +833,6 @@ udp6_usrreq(struct socket *so, int req,
switch (req) {
- case PRU_CONNECT:
- if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
- error = EISCONN;
- break;
- }
- s = splsoftnet();
- error = in6_pcbconnect(in6p, addr6, l);
- splx(s);
- if (error == 0)
- soisconnected(so);
- break;
-
case PRU_DISCONNECT:
if (IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) {
error = ENOTCONN;
@@ -948,6 +958,7 @@ PR_WRAP_USRREQS(udp6)
#define udp6_accept udp6_accept_wrapper
#define udp6_bind udp6_bind_wrapper
#define udp6_listen udp6_listen_wrapper
+#define udp6_connect udp6_connect_wrapper
#define udp6_ioctl udp6_ioctl_wrapper
#define udp6_stat udp6_stat_wrapper
#define udp6_peeraddr udp6_peeraddr_wrapper
@@ -962,6 +973,7 @@ const struct pr_usrreqs udp6_usrreqs = {
.pr_accept = udp6_accept,
.pr_bind = udp6_bind,
.pr_listen = udp6_listen,
+ .pr_connect = udp6_connect,
.pr_ioctl = udp6_ioctl,
.pr_stat = udp6_stat,
.pr_peeraddr = udp6_peeraddr,
Index: src/sys/netipsec/keysock.c
diff -u src/sys/netipsec/keysock.c:1.37 src/sys/netipsec/keysock.c:1.38
--- src/sys/netipsec/keysock.c:1.37 Thu Jul 24 15:12:03 2014
+++ src/sys/netipsec/keysock.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: keysock.c,v 1.37 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: keysock.c,v 1.38 2014/07/30 10:04:26 rtr Exp $ */
/* $FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */
/* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.37 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.38 2014/07/30 10:04:26 rtr Exp $");
#include "opt_ipsec.h"
@@ -511,6 +511,14 @@ key_listen(struct socket *so)
}
static int
+key_connect(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return EOPNOTSUPP;
@@ -590,6 +598,7 @@ key_usrreq(struct socket *so, int req,st
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -617,6 +626,7 @@ PR_WRAP_USRREQS(key)
#define key_accept key_accept_wrapper
#define key_bind key_bind_wrapper
#define key_listen key_listen_wrapper
+#define key_connect key_connect_wrapper
#define key_ioctl key_ioctl_wrapper
#define key_stat key_stat_wrapper
#define key_peeraddr key_peeraddr_wrapper
@@ -631,6 +641,7 @@ const struct pr_usrreqs key_usrreqs = {
.pr_accept = key_accept,
.pr_bind = key_bind,
.pr_listen = key_listen,
+ .pr_connect = key_connect,
.pr_ioctl = key_ioctl,
.pr_stat = key_stat,
.pr_peeraddr = key_peeraddr,
Index: src/sys/netmpls/mpls_proto.c
diff -u src/sys/netmpls/mpls_proto.c:1.17 src/sys/netmpls/mpls_proto.c:1.18
--- src/sys/netmpls/mpls_proto.c:1.17 Thu Jul 24 15:12:03 2014
+++ src/sys/netmpls/mpls_proto.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: mpls_proto.c,v 1.17 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: mpls_proto.c,v 1.18 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.17 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.18 2014/07/30 10:04:26 rtr Exp $");
#include "opt_inet.h"
#include "opt_mbuftrace.h"
@@ -119,6 +119,14 @@ mpls_listen(struct socket *so)
}
static int
+mpls_connect(struct socket *so, struct mbuf *nam)
+{
+ KASSERT(solocked(so));
+
+ return EOPNOTSUPP;
+}
+
+static int
mpls_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return EOPNOTSUPP;
@@ -258,6 +266,7 @@ PR_WRAP_USRREQS(mpls)
#define mpls_accept mpls_accept_wrapper
#define mpls_bind mpls_bind_wrapper
#define mpls_listen mpls_listen_wrapper
+#define mpls_connect mpls_connect_wrapper
#define mpls_ioctl mpls_ioctl_wrapper
#define mpls_stat mpls_stat_wrapper
#define mpls_peeraddr mpls_peeraddr_wrapper
@@ -272,6 +281,7 @@ static const struct pr_usrreqs mpls_usrr
.pr_accept = mpls_accept,
.pr_bind = mpls_bind,
.pr_listen = mpls_listen,
+ .pr_connect = mpls_connect,
.pr_ioctl = mpls_ioctl,
.pr_stat = mpls_stat,
.pr_peeraddr = mpls_peeraddr,
Index: src/sys/netnatm/natm.c
diff -u src/sys/netnatm/natm.c:1.39 src/sys/netnatm/natm.c:1.40
--- src/sys/netnatm/natm.c:1.39 Thu Jul 24 15:12:03 2014
+++ src/sys/netnatm/natm.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: natm.c,v 1.39 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: natm.c,v 1.40 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (c) 1996 Charles D. Cranor and Washington University.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.39 2014/07/24 15:12:03 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.40 2014/07/30 10:04:26 rtr Exp $");
#include <sys/param.h>
#include <sys/kmem.h>
@@ -100,7 +100,7 @@ natm_detach(struct socket *so)
static int
natm_accept(struct socket *so, struct mbuf *nam)
{
- KASSERt(solocked(so));
+ KASSERT(solocked(so));
return EOPNOTSUPP;
}
@@ -108,7 +108,7 @@ natm_accept(struct socket *so, struct mb
static int
natm_bind(struct socket *so, struct mbuf *nam)
{
- KASSERt(solocked(so));
+ KASSERT(solocked(so));
return EOPNOTSUPP;
}
@@ -116,12 +116,81 @@ natm_bind(struct socket *so, struct mbuf
static int
natm_listen(struct socket *so)
{
- KASSERt(solocked(so));
+ KASSERT(solocked(so));
return EOPNOTSUPP;
}
static int
+natm_connect(struct socket *so, struct mbuf *nam)
+{
+ int error = 0, s2;
+ struct natmpcb *npcb;
+ struct sockaddr_natm *snatm;
+ struct atm_pseudoioctl api;
+ struct atm_pseudohdr *aph;
+ struct ifnet *ifp;
+ int proto = so->so_proto->pr_protocol;
+
+ KASSERT(solocked(so));
+
+ /*
+ * validate nam and npcb
+ */
+
+ if (nam->m_len != sizeof(*snatm))
+ return EINVAL;
+ snatm = mtod(nam, struct sockaddr_natm *);
+ if (snatm->snatm_len != sizeof(*snatm) ||
+ (npcb->npcb_flags & NPCB_FREE) == 0)
+ return EINVAL;
+ if (snatm->snatm_family != AF_NATM)
+ return EAFNOSUPPORT;
+
+ snatm->snatm_if[IFNAMSIZ-1] = '\0'; /* XXX ensure null termination
+ since ifunit() uses strcmp */
+
+ /*
+ * convert interface string to ifp, validate.
+ */
+
+ ifp = ifunit(snatm->snatm_if);
+ if (ifp == NULL || (ifp->if_flags & IFF_RUNNING) == 0) {
+ return ENXIO;
+ }
+ if (ifp->if_output != atm_output) {
+ return EAFNOSUPPORT;
+ }
+
+ /*
+ * register us with the NATM PCB layer
+ */
+
+ if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb)
+ return EADDRINUSE;
+
+ /*
+ * enable rx
+ */
+
+ ATM_PH_FLAGS(&api.aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
+ ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
+ ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
+ api.rxhand = npcb;
+ s2 = splnet();
+ if (ifp->if_ioctl(ifp, SIOCATMENA, &api) != 0) {
+ splx(s2);
+ npcb_free(npcb, NPCB_REMOVE);
+ return EIO;
+ }
+ splx(s2);
+
+ soisconnected(so);
+ return error;
+}
+
+
+static int
natm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
int error = 0, s;
@@ -234,6 +303,7 @@ natm_usrreq(struct socket *so, int req,
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -251,75 +321,6 @@ natm_usrreq(struct socket *so, int req,
}
switch (req) {
- case PRU_CONNECT: /* establish connection to peer */
-
- /*
- * validate nam and npcb
- */
-
- if (nam->m_len != sizeof(*snatm)) {
- error = EINVAL;
- break;
- }
- snatm = mtod(nam, struct sockaddr_natm *);
- if (snatm->snatm_len != sizeof(*snatm) ||
- (npcb->npcb_flags & NPCB_FREE) == 0) {
- error = EINVAL;
- break;
- }
- if (snatm->snatm_family != AF_NATM) {
- error = EAFNOSUPPORT;
- break;
- }
-
- snatm->snatm_if[IFNAMSIZ-1] = '\0'; /* XXX ensure null termination
- since ifunit() uses strcmp */
-
- /*
- * convert interface string to ifp, validate.
- */
-
- ifp = ifunit(snatm->snatm_if);
- if (ifp == NULL || (ifp->if_flags & IFF_RUNNING) == 0) {
- error = ENXIO;
- break;
- }
- if (ifp->if_output != atm_output) {
- error = EAFNOSUPPORT;
- break;
- }
-
-
- /*
- * register us with the NATM PCB layer
- */
-
- if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb) {
- error = EADDRINUSE;
- break;
- }
-
- /*
- * enable rx
- */
-
- ATM_PH_FLAGS(&api.aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
- ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
- ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
- api.rxhand = npcb;
- s2 = splnet();
- if (ifp->if_ioctl(ifp, SIOCATMENA, &api) != 0) {
- splx(s2);
- npcb_free(npcb, NPCB_REMOVE);
- error = EIO;
- break;
- }
- splx(s2);
-
- soisconnected(so);
-
- break;
-
case PRU_DISCONNECT: /* disconnect from peer */
if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) {
@@ -482,6 +483,7 @@ PR_WRAP_USRREQS(natm)
#define natm_accept natm_accept_wrapper
#define natm_bind natm_bind_wrapper
#define natm_listen natm_listen_wrapper
+#define natm_connect natm_connect_wrapper
#define natm_ioctl natm_ioctl_wrapper
#define natm_stat natm_stat_wrapper
#define natm_peeraddr natm_peeraddr_wrapper
@@ -496,6 +498,7 @@ const struct pr_usrreqs natm_usrreqs = {
.pr_accept = natm_accept,
.pr_bind = natm_bind,
.pr_listen = natm_listen,
+ .pr_connect = natm_connect,
.pr_ioctl = natm_ioctl,
.pr_stat = natm_stat,
.pr_peeraddr = natm_peeraddr,
Index: src/sys/rump/net/lib/libsockin/sockin.c
diff -u src/sys/rump/net/lib/libsockin/sockin.c:1.52 src/sys/rump/net/lib/libsockin/sockin.c:1.53
--- src/sys/rump/net/lib/libsockin/sockin.c:1.52 Mon Jul 28 10:09:51 2014
+++ src/sys/rump/net/lib/libsockin/sockin.c Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: sockin.c,v 1.52 2014/07/28 10:09:51 rtr Exp $ */
+/* $NetBSD: sockin.c,v 1.53 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (c) 2008, 2009 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.52 2014/07/28 10:09:51 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.53 2014/07/30 10:04:26 rtr Exp $");
#include <sys/param.h>
#include <sys/condvar.h>
@@ -71,6 +71,7 @@ static void sockin_detach(struct socket
static int sockin_accept(struct socket *, struct mbuf *);
static int sockin_bind(struct socket *, struct mbuf *);
static int sockin_listen(struct socket *);
+static int sockin_connect(struct socket *, struct mbuf *);
static int sockin_ioctl(struct socket *, u_long, void *, struct ifnet *);
static int sockin_stat(struct socket *, struct stat *);
static int sockin_peeraddr(struct socket *, struct mbuf *);
@@ -87,6 +88,7 @@ static const struct pr_usrreqs sockin_us
.pr_accept = sockin_accept,
.pr_bind = sockin_bind,
.pr_listen = sockin_listen,
+ .pr_connect = sockin_connect,
.pr_ioctl = sockin_ioctl,
.pr_stat = sockin_stat,
.pr_peeraddr = sockin_peeraddr,
@@ -496,6 +498,23 @@ sockin_listen(struct socket *so)
}
static int
+sockin_connect(struct socket *so, struct mbuf *nam)
+{
+ int error = 0;
+
+ KASSERT(solocked(so));
+ KASSERT(nam != NULL);
+
+ error = rumpcomp_sockin_connect(SO2S(so),
+ mtod(nam, struct sockaddr *), nam->m_len);
+ if (error == 0)
+ soisconnected(so);
+
+ return error;
+}
+
+
+static int
sockin_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp)
{
return ENOTTY;
@@ -560,6 +579,7 @@ sockin_usrreq(struct socket *so, int req
KASSERT(req != PRU_ACCEPT);
KASSERT(req != PRU_BIND);
KASSERT(req != PRU_LISTEN);
+ KASSERT(req != PRU_CONNECT);
KASSERT(req != PRU_CONTROL);
KASSERT(req != PRU_SENSE);
KASSERT(req != PRU_PEERADDR);
@@ -568,13 +588,6 @@ sockin_usrreq(struct socket *so, int req
KASSERT(req != PRU_SENDOOB);
switch (req) {
- case PRU_CONNECT:
- error = rumpcomp_sockin_connect(SO2S(so),
- mtod(nam, struct sockaddr *), nam->m_len);
- if (error == 0)
- soisconnected(so);
- break;
-
case PRU_SEND:
{
struct sockaddr *saddr;
Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.54 src/sys/sys/protosw.h:1.55
--- src/sys/sys/protosw.h:1.54 Thu Jul 24 15:12:03 2014
+++ src/sys/sys/protosw.h Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: protosw.h,v 1.54 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: protosw.h,v 1.55 2014/07/30 10:04:26 rtr Exp $ */
/*-
* Copyright (c) 1982, 1986, 1993
@@ -241,6 +241,7 @@ struct pr_usrreqs {
int (*pr_accept)(struct socket *, struct mbuf *);
int (*pr_bind)(struct socket *, struct mbuf *);
int (*pr_listen)(struct socket *);
+ int (*pr_connect)(struct socket *, struct mbuf *);
int (*pr_ioctl)(struct socket *, u_long, void *, struct ifnet *);
int (*pr_stat)(struct socket *, struct stat *);
int (*pr_peeraddr)(struct socket *, struct mbuf *);
@@ -317,6 +318,15 @@ name##_bind_wrapper(struct socket *a, st
return rv; \
} \
static int \
+name##_connect_wrapper(struct socket *a, struct mbuf *b)\
+{ \
+ int rv; \
+ KERNEL_LOCK(1, NULL); \
+ rv = name##_connect(a, b); \
+ KERNEL_UNLOCK_ONE(NULL); \
+ return rv; \
+} \
+static int \
name##_listen_wrapper(struct socket *a) \
{ \
int rv; \
Index: src/sys/sys/un.h
diff -u src/sys/sys/un.h:1.49 src/sys/sys/un.h:1.50
--- src/sys/sys/un.h:1.49 Thu Jul 24 15:12:03 2014
+++ src/sys/sys/un.h Wed Jul 30 10:04:26 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: un.h,v 1.49 2014/07/24 15:12:03 rtr Exp $ */
+/* $NetBSD: un.h,v 1.50 2014/07/30 10:04:26 rtr Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@@ -85,7 +85,7 @@ kmutex_t *uipc_streamlock (void);
kmutex_t *uipc_rawlock (void);
int unp_bind (struct socket *, struct mbuf *);
-int unp_connect (struct socket *, struct mbuf *, struct lwp *);
+int unp_connect (struct socket *, struct mbuf *);
int unp_connect2 (struct socket *, struct socket *, int);
void unp_discard (struct file *);
void unp_disconnect (struct unpcb *);