diff options
| author | rtr <rtr@NetBSD.org> | 2014-08-05 07:55:31 +0000 |
|---|---|---|
| committer | rtr <rtr@NetBSD.org> | 2014-08-05 07:55:31 +0000 |
| commit | c0e2453cbf840d9aec0b4bc7b5294ae0fdbab731 (patch) | |
| tree | b99d43d0d2d57c4bcc232b318bbd689ad4180592 /sys/netbt | |
| parent | 76b2df9f066fb980b8997ecac49ecedd05442f19 (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.c | 68 | ||||
| -rw-r--r-- | sys/netbt/l2cap.h | 6 | ||||
| -rw-r--r-- | sys/netbt/l2cap_lower.c | 6 | ||||
| -rw-r--r-- | sys/netbt/l2cap_socket.c | 73 | ||||
| -rw-r--r-- | sys/netbt/l2cap_upper.c | 8 | ||||
| -rw-r--r-- | sys/netbt/rfcomm.h | 6 | ||||
| -rw-r--r-- | sys/netbt/rfcomm_session.c | 8 | ||||
| -rw-r--r-- | sys/netbt/rfcomm_socket.c | 57 | ||||
| -rw-r--r-- | sys/netbt/rfcomm_upper.c | 8 | ||||
| -rw-r--r-- | sys/netbt/sco.h | 4 | ||||
| -rw-r--r-- | sys/netbt/sco_socket.c | 71 | ||||
| -rw-r--r-- | sys/netbt/sco_upper.c | 8 |
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; |
