summaryrefslogtreecommitdiff
path: root/sys/netbt
diff options
context:
space:
mode:
authorrtr <rtr@NetBSD.org>2014-08-05 07:55:31 +0000
committerrtr <rtr@NetBSD.org>2014-08-05 07:55:31 +0000
commitc0e2453cbf840d9aec0b4bc7b5294ae0fdbab731 (patch)
treeb99d43d0d2d57c4bcc232b318bbd689ad4180592 /sys/netbt
parent76b2df9f066fb980b8997ecac49ecedd05442f19 (diff)
split PRU_SEND function out of pr_generic() usrreq switches and put into
separate functions xxx_send(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *) - always KASSERT(solocked(so)) even if not implemented - replace calls to pr_generic() with req = PRU_SEND with calls to pr_send() rename existing functions that operate on PCB for consistency (and to free up their names for xxx_send() PRUs - l2cap_send() -> l2cap_send_pcb() - sco_send() -> sco_send_pcb() - rfcomm_send() -> rfcomm_send_pcb() patch reviewed by rmind
Diffstat (limited to 'sys/netbt')
-rw-r--r--sys/netbt/hci_socket.c68
-rw-r--r--sys/netbt/l2cap.h6
-rw-r--r--sys/netbt/l2cap_lower.c6
-rw-r--r--sys/netbt/l2cap_socket.c73
-rw-r--r--sys/netbt/l2cap_upper.c8
-rw-r--r--sys/netbt/rfcomm.h6
-rw-r--r--sys/netbt/rfcomm_session.c8
-rw-r--r--sys/netbt/rfcomm_socket.c57
-rw-r--r--sys/netbt/rfcomm_upper.c8
-rw-r--r--sys/netbt/sco.h4
-rw-r--r--sys/netbt/sco_socket.c71
-rw-r--r--sys/netbt/sco_upper.c8
12 files changed, 202 insertions, 121 deletions
diff --git a/sys/netbt/hci_socket.c b/sys/netbt/hci_socket.c
index c4ecb8c619e..27ee2198103 100644
--- a/sys/netbt/hci_socket.c
+++ b/sys/netbt/hci_socket.c
@@ -1,4 +1,4 @@
-/* $NetBSD: hci_socket.c,v 1.37 2014/08/05 05:24:26 rtr Exp $ */
+/* $NetBSD: hci_socket.c,v 1.38 2014/08/05 07:55:31 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.37 2014/08/05 05:24:26 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.38 2014/08/05 07:55:31 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -353,7 +353,7 @@ hci_cmdwait_flush(struct socket *so)
* This came from userland, so check it out.
*/
static int
-hci_send(struct hci_pcb *pcb, struct mbuf *m, bdaddr_t *addr)
+hci_send_pcb(struct hci_pcb *pcb, struct mbuf *m, bdaddr_t *addr)
{
struct hci_unit *unit;
struct mbuf *m0;
@@ -655,6 +655,43 @@ hci_recvoob(struct socket *so, struct mbuf *m, int flags)
}
static int
+hci_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ struct hci_pcb *pcb = so->so_pcb;
+ struct sockaddr_bt * sa = NULL;
+ int err = 0;
+
+ KASSERT(solocked(so));
+ KASSERT(pcb != NULL);
+
+ if (control) /* have no use for this */
+ m_freem(control);
+
+ if (nam) {
+ sa = mtod(nam, struct sockaddr_bt *);
+
+ if (sa->bt_len != sizeof(struct sockaddr_bt)) {
+ err = EINVAL;
+ goto release;
+ }
+
+ if (sa->bt_family != AF_BLUETOOTH) {
+ err = EAFNOSUPPORT;
+ goto release;
+ }
+ }
+
+ return hci_send_pcb(pcb, m, (sa ? &sa->bt_bdaddr : &pcb->hp_raddr));
+
+release:
+ if (m)
+ m_freem(m);
+
+ return err;
+}
+
+static int
hci_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
{
KASSERT(solocked(so));
@@ -682,7 +719,6 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m,
struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
{
struct hci_pcb *pcb = (struct hci_pcb *)up->so_pcb;
- struct sockaddr_bt *sa;
int err = 0;
DPRINTFN(2, "%s\n", prurequests[req]);
@@ -700,6 +736,7 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m,
KASSERT(req != PRU_PEERADDR);
KASSERT(req != PRU_SOCKADDR);
KASSERT(req != PRU_RCVOOB);
+ KASSERT(req != PRU_SEND);
KASSERT(req != PRU_SENDOOB);
switch(req) {
@@ -714,27 +751,6 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m,
}
switch(req) {
- case PRU_SEND:
- sa = NULL;
- if (nam) {
- sa = mtod(nam, struct sockaddr_bt *);
-
- if (sa->bt_len != sizeof(struct sockaddr_bt)) {
- err = EINVAL;
- goto release;
- }
-
- if (sa->bt_family != AF_BLUETOOTH) {
- err = EAFNOSUPPORT;
- goto release;
- }
- }
-
- if (ctl) /* have no use for this */
- m_freem(ctl);
-
- return hci_send(pcb, m, (sa ? &sa->bt_bdaddr : &pcb->hp_raddr));
-
case PRU_RCVD:
return EOPNOTSUPP; /* (no release) */
@@ -980,6 +996,7 @@ PR_WRAP_USRREQS(hci)
#define hci_peeraddr hci_peeraddr_wrapper
#define hci_sockaddr hci_sockaddr_wrapper
#define hci_recvoob hci_recvoob_wrapper
+#define hci_send hci_send_wrapper
#define hci_sendoob hci_sendoob_wrapper
#define hci_usrreq hci_usrreq_wrapper
@@ -998,6 +1015,7 @@ const struct pr_usrreqs hci_usrreqs = {
.pr_peeraddr = hci_peeraddr,
.pr_sockaddr = hci_sockaddr,
.pr_recvoob = hci_recvoob,
+ .pr_send = hci_send,
.pr_sendoob = hci_sendoob,
.pr_generic = hci_usrreq,
};
diff --git a/sys/netbt/l2cap.h b/sys/netbt/l2cap.h
index 0467beddbd2..d9f1a3f2590 100644
--- a/sys/netbt/l2cap.h
+++ b/sys/netbt/l2cap.h
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap.h,v 1.17 2014/07/31 03:39:35 rtr Exp $ */
+/* $NetBSD: l2cap.h,v 1.18 2014/08/05 07:55:31 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.17 2014/07/31 03:39:35 rtr Exp $
+ * $Id: l2cap.h,v 1.18 2014/08/05 07:55:31 rtr Exp $
* $FreeBSD: src/sys/netgraph/bluetooth/include/l2cap.h,v 1.4 2005/08/31 18:13:23 emax Exp $
*/
@@ -469,7 +469,7 @@ int l2cap_peeraddr_pcb(struct l2cap_channel *, struct sockaddr_bt *);
int l2cap_disconnect_pcb(struct l2cap_channel *, int);
void l2cap_detach_pcb(struct l2cap_channel **);
int l2cap_listen_pcb(struct l2cap_channel *);
-int l2cap_send(struct l2cap_channel *, struct mbuf *);
+int l2cap_send_pcb(struct l2cap_channel *, struct mbuf *);
int l2cap_setopt(struct l2cap_channel *, const struct sockopt *);
int l2cap_getopt(struct l2cap_channel *, struct sockopt *);
diff --git a/sys/netbt/l2cap_lower.c b/sys/netbt/l2cap_lower.c
index e95ad57f0d5..59d8c470a04 100644
--- a/sys/netbt/l2cap_lower.c
+++ b/sys/netbt/l2cap_lower.c
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap_lower.c,v 1.9 2008/08/05 13:08:31 plunky Exp $ */
+/* $NetBSD: l2cap_lower.c,v 1.10 2014/08/05 07:55:31 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_lower.c,v 1.9 2008/08/05 13:08:31 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_lower.c,v 1.10 2014/08/05 07:55:31 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -150,7 +150,7 @@ failed:
}
/*
- * Start another L2CAP packet on its way. This is called from l2cap_send
+ * Start another L2CAP packet on its way. This is called from l2cap_send_pcb
* (when no PDU is pending) and hci_acl_start (when PDU has been placed on
* device queue). Thus we can have more than one PDU waiting at the device
* if space is available but no single channel will hog the link.
diff --git a/sys/netbt/l2cap_socket.c b/sys/netbt/l2cap_socket.c
index a23f3a9705e..5a2e5138a6e 100644
--- a/sys/netbt/l2cap_socket.c
+++ b/sys/netbt/l2cap_socket.c
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap_socket.c,v 1.28 2014/08/05 05:24:26 rtr Exp $ */
+/* $NetBSD: l2cap_socket.c,v 1.29 2014/08/05 07:55:31 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.28 2014/08/05 05:24:26 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.29 2014/08/05 07:55:31 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -283,6 +283,49 @@ l2cap_recvoob(struct socket *so, struct mbuf *m, int flags)
}
static int
+l2cap_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ struct l2cap_channel *pcb = so->so_pcb;
+ struct mbuf *m0;
+ int error = 0;
+
+ KASSERT(solocked(so));
+ KASSERT(m != NULL);
+
+ if (control)
+ m_freem(control);
+
+ if (pcb == NULL) {
+ error = EINVAL;
+ goto release;
+ }
+
+ if (m->m_pkthdr.len == 0)
+ goto release;
+
+ if (m->m_pkthdr.len > pcb->lc_omtu) {
+ error = EMSGSIZE;
+ goto release;
+ }
+
+ m0 = m_copypacket(m, M_DONTWAIT);
+ if (m0 == NULL) {
+ error = ENOMEM;
+ goto release;
+ }
+
+ sbappendrecord(&so->so_snd, m);
+ return l2cap_send_pcb(pcb, m0);
+
+release:
+ if (m)
+ m_freem(m);
+
+ return error;
+}
+
+static int
l2cap_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
{
KASSERT(solocked(so));
@@ -315,7 +358,6 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m,
struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
{
struct l2cap_channel *pcb = up->so_pcb;
- struct mbuf *m0;
int err = 0;
DPRINTFN(2, "%s\n", prurequests[req]);
@@ -333,6 +375,7 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m,
KASSERT(req != PRU_PEERADDR);
KASSERT(req != PRU_SOCKADDR);
KASSERT(req != PRU_RCVOOB);
+ KASSERT(req != PRU_SEND);
KASSERT(req != PRU_SENDOOB);
switch (req) {
@@ -346,28 +389,6 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m,
}
switch(req) {
- case PRU_SEND:
- KASSERT(m != NULL);
- if (m->m_pkthdr.len == 0)
- break;
-
- if (m->m_pkthdr.len > pcb->lc_omtu) {
- err = EMSGSIZE;
- break;
- }
-
- m0 = m_copypacket(m, M_DONTWAIT);
- if (m0 == NULL) {
- err = ENOMEM;
- break;
- }
-
- if (ctl) /* no use for that */
- m_freem(ctl);
-
- sbappendrecord(&up->so_snd, m);
- return l2cap_send(pcb, m0);
-
case PRU_RCVD:
return EOPNOTSUPP; /* (no release) */
@@ -547,6 +568,7 @@ PR_WRAP_USRREQS(l2cap)
#define l2cap_peeraddr l2cap_peeraddr_wrapper
#define l2cap_sockaddr l2cap_sockaddr_wrapper
#define l2cap_recvoob l2cap_recvoob_wrapper
+#define l2cap_send l2cap_send_wrapper
#define l2cap_sendoob l2cap_sendoob_wrapper
#define l2cap_usrreq l2cap_usrreq_wrapper
@@ -565,6 +587,7 @@ const struct pr_usrreqs l2cap_usrreqs = {
.pr_peeraddr = l2cap_peeraddr,
.pr_sockaddr = l2cap_sockaddr,
.pr_recvoob = l2cap_recvoob,
+ .pr_send = l2cap_send,
.pr_sendoob = l2cap_sendoob,
.pr_generic = l2cap_usrreq,
};
diff --git a/sys/netbt/l2cap_upper.c b/sys/netbt/l2cap_upper.c
index c0d3c13e270..b66a87c1185 100644
--- a/sys/netbt/l2cap_upper.c
+++ b/sys/netbt/l2cap_upper.c
@@ -1,4 +1,4 @@
-/* $NetBSD: l2cap_upper.c,v 1.17 2014/07/31 03:39:35 rtr Exp $ */
+/* $NetBSD: l2cap_upper.c,v 1.18 2014/08/05 07:55:32 rtr Exp $ */
/*-
* Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.17 2014/07/31 03:39:35 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.18 2014/08/05 07:55:32 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -372,7 +372,7 @@ l2cap_listen_pcb(struct l2cap_channel *chan)
}
/*
- * l2cap_send(l2cap_channel, mbuf)
+ * l2cap_send_pcb(l2cap_channel, mbuf)
*
* Output SDU on channel described by channel. This corresponds
* to "Send Data Request" in the L2CAP specification. The upper
@@ -394,7 +394,7 @@ l2cap_listen_pcb(struct l2cap_channel *chan)
* B-Frame header and start sending if we are not already
*/
int
-l2cap_send(struct l2cap_channel *chan, struct mbuf *m)
+l2cap_send_pcb(struct l2cap_channel *chan, struct mbuf *m)
{
l2cap_hdr_t *hdr;
int plen;
diff --git a/sys/netbt/rfcomm.h b/sys/netbt/rfcomm.h
index c979f65973a..b21f1f00cae 100644
--- a/sys/netbt/rfcomm.h
+++ b/sys/netbt/rfcomm.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm.h,v 1.16 2014/07/31 03:39:35 rtr Exp $ */
+/* $NetBSD: rfcomm.h,v 1.17 2014/08/05 07:55:32 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.16 2014/07/31 03:39:35 rtr Exp $
+ * $Id: rfcomm.h,v 1.17 2014/08/05 07:55:32 rtr Exp $
* $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $
*/
@@ -415,7 +415,7 @@ int rfcomm_peeraddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *);
int rfcomm_disconnect_pcb(struct rfcomm_dlc *, int);
void rfcomm_detach_pcb(struct rfcomm_dlc **);
int rfcomm_listen_pcb(struct rfcomm_dlc *);
-int rfcomm_send(struct rfcomm_dlc *, struct mbuf *);
+int rfcomm_send_pcb(struct rfcomm_dlc *, struct mbuf *);
int rfcomm_rcvd(struct rfcomm_dlc *, size_t);
int rfcomm_setopt(struct rfcomm_dlc *, const struct sockopt *);
int rfcomm_getopt(struct rfcomm_dlc *, struct sockopt *);
diff --git a/sys/netbt/rfcomm_session.c b/sys/netbt/rfcomm_session.c
index effa8f52554..09d55b31f5e 100644
--- a/sys/netbt/rfcomm_session.c
+++ b/sys/netbt/rfcomm_session.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm_session.c,v 1.22 2014/07/31 03:39:35 rtr Exp $ */
+/* $NetBSD: rfcomm_session.c,v 1.23 2014/08/05 07:55:32 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.22 2014/07/31 03:39:35 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.23 2014/08/05 07:55:32 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -1510,7 +1510,7 @@ rfcomm_session_send_frame(struct rfcomm_session *rs, int type, int dlci)
DPRINTFN(5, "dlci %d type %2.2x (%d bytes, fcs=%#2.2x)\n",
dlci, type, m->m_pkthdr.len, fcs);
- return l2cap_send(rs->rs_l2cap, m);
+ return l2cap_send_pcb(rs->rs_l2cap, m);
}
/*
@@ -1610,7 +1610,7 @@ rfcomm_session_send_uih(struct rfcomm_session *rs, struct rfcomm_dlc *dlc,
/*
* UIH frame ready to go..
*/
- err = l2cap_send(rs->rs_l2cap, m0);
+ err = l2cap_send_pcb(rs->rs_l2cap, m0);
if (err)
goto fail;
diff --git a/sys/netbt/rfcomm_socket.c b/sys/netbt/rfcomm_socket.c
index 8c990bd1db1..c1020723c85 100644
--- a/sys/netbt/rfcomm_socket.c
+++ b/sys/netbt/rfcomm_socket.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm_socket.c,v 1.30 2014/08/05 05:24:26 rtr Exp $ */
+/* $NetBSD: rfcomm_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.30 2014/08/05 05:24:26 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -291,6 +291,39 @@ rfcomm_recvoob(struct socket *so, struct mbuf *m, int flags)
}
static int
+rfcomm_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ struct rfcomm_dlc *pcb = so->so_pcb;
+ int err = 0;
+ struct mbuf *m0;
+
+ KASSERT(solocked(so));
+ KASSERT(m != NULL);
+
+ if (control) /* no use for that */
+ m_freem(control);
+
+ if (pcb == NULL) {
+ err = EINVAL;
+ goto release;
+ }
+
+ m0 = m_copypacket(m, M_DONTWAIT);
+ if (m0 == NULL) {
+ err = ENOMEM;
+ goto release;
+ }
+
+ sbappendstream(&so->so_snd, m);
+ return rfcomm_send_pcb(pcb, m0);
+
+release:
+ m_freem(m);
+ return err;
+}
+
+static int
rfcomm_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
{
KASSERT(solocked(so));
@@ -323,7 +356,6 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m,
struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
{
struct rfcomm_dlc *pcb = up->so_pcb;
- struct mbuf *m0;
int err = 0;
DPRINTFN(2, "%s\n", prurequests[req]);
@@ -341,6 +373,7 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m,
KASSERT(req != PRU_PEERADDR);
KASSERT(req != PRU_SOCKADDR);
KASSERT(req != PRU_RCVOOB);
+ KASSERT(req != PRU_SEND);
KASSERT(req != PRU_SENDOOB);
switch (req) {
@@ -353,22 +386,6 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m,
}
switch(req) {
- case PRU_SEND:
- KASSERT(m != NULL);
-
- if (ctl) /* no use for that */
- m_freem(ctl);
-
- m0 = m_copypacket(m, M_DONTWAIT);
- if (m0 == NULL) {
- err = ENOMEM;
- goto release;
- }
-
- sbappendstream(&up->so_snd, m);
-
- return rfcomm_send(pcb, m0);
-
case PRU_RCVD:
return rfcomm_rcvd(pcb, sbspace(&up->so_rcv));
@@ -560,6 +577,7 @@ PR_WRAP_USRREQS(rfcomm)
#define rfcomm_peeraddr rfcomm_peeraddr_wrapper
#define rfcomm_sockaddr rfcomm_sockaddr_wrapper
#define rfcomm_recvoob rfcomm_recvoob_wrapper
+#define rfcomm_send rfcomm_send_wrapper
#define rfcomm_sendoob rfcomm_sendoob_wrapper
#define rfcomm_usrreq rfcomm_usrreq_wrapper
@@ -578,6 +596,7 @@ const struct pr_usrreqs rfcomm_usrreqs = {
.pr_peeraddr = rfcomm_peeraddr,
.pr_sockaddr = rfcomm_sockaddr,
.pr_recvoob = rfcomm_recvoob,
+ .pr_send = rfcomm_send,
.pr_sendoob = rfcomm_sendoob,
.pr_generic = rfcomm_usrreq,
};
diff --git a/sys/netbt/rfcomm_upper.c b/sys/netbt/rfcomm_upper.c
index 1e312d0057c..4d366aaf49a 100644
--- a/sys/netbt/rfcomm_upper.c
+++ b/sys/netbt/rfcomm_upper.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rfcomm_upper.c,v 1.19 2014/07/31 03:39:35 rtr Exp $ */
+/* $NetBSD: rfcomm_upper.c,v 1.20 2014/08/05 07:55:32 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.19 2014/07/31 03:39:35 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.20 2014/08/05 07:55:32 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -382,14 +382,14 @@ rfcomm_listen_pcb(struct rfcomm_dlc *dlc)
}
/*
- * rfcomm_send(dlc, mbuf)
+ * rfcomm_send_pcb(dlc, mbuf)
*
* Output data on DLC. This is streamed data, so we add it
* to our buffer and start the DLC, which will assemble
* packets and send them if it can.
*/
int
-rfcomm_send(struct rfcomm_dlc *dlc, struct mbuf *m)
+rfcomm_send_pcb(struct rfcomm_dlc *dlc, struct mbuf *m)
{
if (dlc->rd_txbuf != NULL) {
diff --git a/sys/netbt/sco.h b/sys/netbt/sco.h
index 483e08dbcc1..977322b8662 100644
--- a/sys/netbt/sco.h
+++ b/sys/netbt/sco.h
@@ -1,4 +1,4 @@
-/* $NetBSD: sco.h,v 1.10 2014/07/31 03:39:35 rtr Exp $ */
+/* $NetBSD: sco.h,v 1.11 2014/08/05 07:55:32 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -76,7 +76,7 @@ int sco_peeraddr_pcb(struct sco_pcb *, struct sockaddr_bt *);
int sco_disconnect_pcb(struct sco_pcb *, int);
void sco_detach_pcb(struct sco_pcb **);
int sco_listen_pcb(struct sco_pcb *);
-int sco_send(struct sco_pcb *, struct mbuf *);
+int sco_send_pcb(struct sco_pcb *, struct mbuf *);
int sco_setopt(struct sco_pcb *, const struct sockopt *);
int sco_getopt(struct sco_pcb *, struct sockopt *);
diff --git a/sys/netbt/sco_socket.c b/sys/netbt/sco_socket.c
index e42e63ed5de..2563cf0af4d 100644
--- a/sys/netbt/sco_socket.c
+++ b/sys/netbt/sco_socket.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sco_socket.c,v 1.30 2014/08/05 05:24:26 rtr Exp $ */
+/* $NetBSD: sco_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.30 2014/08/05 05:24:26 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $");
/* load symbolic names */
#ifdef BLUETOOTH_DEBUG
@@ -274,6 +274,47 @@ sco_recvoob(struct socket *so, struct mbuf *m, int flags)
}
static int
+sco_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct lwp *l)
+{
+ struct sco_pcb *pcb = so->so_pcb;
+ int err = 0;
+ struct mbuf *m0;
+
+ KASSERT(solocked(so));
+ KASSERT(m != NULL);
+
+ if (control) /* no use for that */
+ m_freem(control);
+
+ if (pcb == NULL) {
+ err = EINVAL;
+ goto release;
+ }
+
+ if (m->m_pkthdr.len == 0)
+ goto release;
+
+ if (m->m_pkthdr.len > pcb->sp_mtu) {
+ err = EMSGSIZE;
+ goto release;
+ }
+
+ m0 = m_copypacket(m, M_DONTWAIT);
+ if (m0 == NULL) {
+ err = ENOMEM;
+ goto release;
+ }
+
+ sbappendrecord(&so->so_snd, m);
+ return sco_send_pcb(pcb, m0);
+
+release:
+ m_freem(m);
+ return err;
+}
+
+static int
sco_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control)
{
KASSERT(solocked(so));
@@ -302,7 +343,6 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m,
struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
{
struct sco_pcb *pcb = (struct sco_pcb *)up->so_pcb;
- struct mbuf *m0;
int err = 0;
DPRINTFN(2, "%s\n", prurequests[req]);
@@ -320,6 +360,7 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m,
KASSERT(req != PRU_PEERADDR);
KASSERT(req != PRU_SOCKADDR);
KASSERT(req != PRU_RCVOOB);
+ KASSERT(req != PRU_SEND);
KASSERT(req != PRU_SENDOOB);
switch(req) {
@@ -334,28 +375,6 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m,
}
switch(req) {
- case PRU_SEND:
- KASSERT(m != NULL);
- if (m->m_pkthdr.len == 0)
- break;
-
- if (m->m_pkthdr.len > pcb->sp_mtu) {
- err = EMSGSIZE;
- break;
- }
-
- m0 = m_copypacket(m, M_DONTWAIT);
- if (m0 == NULL) {
- err = ENOMEM;
- break;
- }
-
- if (ctl) /* no use for that */
- m_freem(ctl);
-
- sbappendrecord(&up->so_snd, m);
- return sco_send(pcb, m0);
-
case PRU_RCVD:
return EOPNOTSUPP; /* (no release) */
@@ -514,6 +533,7 @@ PR_WRAP_USRREQS(sco)
#define sco_peeraddr sco_peeraddr_wrapper
#define sco_sockaddr sco_sockaddr_wrapper
#define sco_recvoob sco_recvoob_wrapper
+#define sco_send sco_send_wrapper
#define sco_sendoob sco_sendoob_wrapper
#define sco_usrreq sco_usrreq_wrapper
@@ -532,6 +552,7 @@ const struct pr_usrreqs sco_usrreqs = {
.pr_peeraddr = sco_peeraddr,
.pr_sockaddr = sco_sockaddr,
.pr_recvoob = sco_recvoob,
+ .pr_send = sco_send,
.pr_sendoob = sco_sendoob,
.pr_generic = sco_usrreq,
};
diff --git a/sys/netbt/sco_upper.c b/sys/netbt/sco_upper.c
index ec78dbf55df..28bfd55add0 100644
--- a/sys/netbt/sco_upper.c
+++ b/sys/netbt/sco_upper.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sco_upper.c,v 1.15 2014/07/31 03:39:35 rtr Exp $ */
+/* $NetBSD: sco_upper.c,v 1.16 2014/08/05 07:55:32 rtr Exp $ */
/*-
* Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.15 2014/07/31 03:39:35 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.16 2014/08/05 07:55:32 rtr Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -261,7 +261,7 @@ sco_listen_pcb(struct sco_pcb *pcb)
}
/*
- * sco_send(pcb, mbuf)
+ * sco_send_pcb(pcb, mbuf)
*
* Send data on SCO pcb.
*
@@ -271,7 +271,7 @@ sco_listen_pcb(struct sco_pcb *pcb)
* we can drop a record from the socket buffer.
*/
int
-sco_send(struct sco_pcb *pcb, struct mbuf *m)
+sco_send_pcb(struct sco_pcb *pcb, struct mbuf *m)
{
hci_scodata_hdr_t *hdr;
int plen;