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