diff options
| author | 2014-07-11 21:54:37 +0000 | |
|---|---|---|
| committer | 2014-07-11 21:54:37 +0000 | |
| commit | b8042ed98e3e7a691133b4fd8e91f61ba15a83ba (patch) | |
| tree | b4210de9bc12a180e816fe8ce2bb3606f14cb4f4 /sys/netbt/l2cap_socket.c | |
| parent | sync (diff) | |
| download | wireguard-openbsd-b8042ed98e3e7a691133b4fd8e91f61ba15a83ba.tar.xz wireguard-openbsd-b8042ed98e3e7a691133b4fd8e91f61ba15a83ba.zip | |
"It's not the years, honey; it's the mileage."
bluetooth support doesn't work and isn't going anywhere. the current
design is a dead end, and should not be the basis for any future support.
general consensus says to whack it so as to not mislead the unwary.
Diffstat (limited to 'sys/netbt/l2cap_socket.c')
| -rw-r--r-- | sys/netbt/l2cap_socket.c | 405 |
1 files changed, 0 insertions, 405 deletions
diff --git a/sys/netbt/l2cap_socket.c b/sys/netbt/l2cap_socket.c deleted file mode 100644 index 5a584f59598..00000000000 --- a/sys/netbt/l2cap_socket.c +++ /dev/null @@ -1,405 +0,0 @@ -/* $OpenBSD: l2cap_socket.c,v 1.5 2012/12/05 23:20:23 deraadt Exp $ */ -/* $NetBSD: l2cap_socket.c,v 1.9 2008/08/06 15:01:24 plunky Exp $ */ - -/*- - * Copyright (c) 2005 Iain Hibbert. - * Copyright (c) 2006 Itronix Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of Itronix Inc. may not be used to endorse - * or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* load symbolic names */ -#ifdef BLUETOOTH_DEBUG -#define PRUREQUESTS -#define PRCOREQUESTS -#endif - -#include <sys/param.h> -#include <sys/domain.h> -#include <sys/kernel.h> -#include <sys/mbuf.h> -#include <sys/proc.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/systm.h> - -#include <netbt/bluetooth.h> -#include <netbt/hci.h> /* XXX for EPASSTHROUGH */ -#include <netbt/l2cap.h> - -/* - * L2CAP Sockets - * - * SOCK_SEQPACKET - normal L2CAP connection - * - * SOCK_DGRAM - connectionless L2CAP - XXX not yet - */ - -static void l2cap_connecting(void *); -static void l2cap_connected(void *); -static void l2cap_disconnected(void *, int); -static void *l2cap_newconn(void *, struct sockaddr_bt *, struct sockaddr_bt *); -static void l2cap_complete(void *, int); -static void l2cap_linkmode(void *, int); -static void l2cap_input(void *, struct mbuf *); - -static const struct btproto l2cap_proto = { - l2cap_connecting, - l2cap_connected, - l2cap_disconnected, - l2cap_newconn, - l2cap_complete, - l2cap_linkmode, - l2cap_input, -}; - -/* sysctl variables */ -int l2cap_sendspace = 4096; -int l2cap_recvspace = 4096; - -/* - * User Request. - * up is socket - * m is either - * optional mbuf chain containing message - * ioctl command (PRU_CONTROL) - * nam is either - * optional mbuf chain containing an address - * ioctl data (PRU_CONTROL) - * optionally protocol number (PRU_ATTACH) - * message flags (PRU_RCVD) - * ctl is either - * optional mbuf chain containing socket options - * optional interface pointer (PRU_CONTROL, PRU_PURGEIF) - * l is pointer to process requesting action (if any) - * - * we are responsible for disposing of m and ctl if - * they are mbuf chains - */ -int -l2cap_usrreq(struct socket *up, int req, struct mbuf *m, - struct mbuf *nam, struct mbuf *ctl, struct proc *p) -{ - struct l2cap_channel *pcb = up->so_pcb; - struct sockaddr_bt *sa; - struct mbuf *m0; - int err = 0; - -#ifdef notyet /* XXX */ - DPRINTFN(2, "%s\n", prurequests[req]); -#endif - - switch (req) { - case PRU_CONTROL: - return EPASSTHROUGH; - -#ifdef notyet /* XXX */ - case PRU_PURGEIF: - return EOPNOTSUPP; -#endif - - case PRU_ATTACH: - /* XXX solock() and bt_lock fiddling in NetBSD */ - if (pcb != NULL) - return EINVAL; - /* - * For L2CAP socket PCB we just use an l2cap_channel structure - * since we have nothing to add.. - */ - err = soreserve(up, l2cap_sendspace, l2cap_recvspace); - if (err) - return err; - - return l2cap_attach((struct l2cap_channel **)&up->so_pcb, - &l2cap_proto, up); - } - - if (pcb == NULL) { - err = EINVAL; - goto release; - } - - switch(req) { - case PRU_DISCONNECT: - soisdisconnecting(up); - return l2cap_disconnect(pcb, up->so_linger); - - case PRU_ABORT: - l2cap_disconnect(pcb, 0); - soisdisconnected(up); - /* fall through to */ - case PRU_DETACH: - return l2cap_detach((struct l2cap_channel **)&up->so_pcb); - - case PRU_BIND: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - - if (sa->bt_len != sizeof(struct sockaddr_bt)) - return EINVAL; - - if (sa->bt_family != AF_BLUETOOTH) - return EAFNOSUPPORT; - - return l2cap_bind(pcb, sa); - - case PRU_CONNECT: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - - 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_PEERADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return l2cap_peeraddr(pcb, sa); - - case PRU_SOCKADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return l2cap_sockaddr(pcb, sa); - - case PRU_SHUTDOWN: - socantsendmore(up); - break; - - 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_copym(m, 0, M_COPYALL, 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_SENSE: - return 0; /* (no release) */ - - case PRU_RCVD: - case PRU_RCVOOB: - return EOPNOTSUPP; /* (no release) */ - - case PRU_LISTEN: - return l2cap_listen(pcb); - - case PRU_ACCEPT: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return l2cap_peeraddr(pcb, sa); - - case PRU_CONNECT2: - case PRU_SENDOOB: - case PRU_FASTTIMO: - case PRU_SLOWTIMO: - case PRU_PROTORCV: - case PRU_PROTOSEND: - err = EOPNOTSUPP; - break; - - default: - UNKNOWN(req); - err = EOPNOTSUPP; - break; - } - -release: - if (m) m_freem(m); - if (ctl) m_freem(ctl); - return err; -} - -/* - * l2cap_ctloutput(request, socket, level, optname, opt) - * - * Apply configuration commands to channel. This corresponds to - * "Reconfigure Channel Request" in the L2CAP specification. - */ -int -l2cap_ctloutput(int req, struct socket *so, int level, - int optname, struct mbuf **opt) -{ - struct l2cap_channel *pcb = so->so_pcb; - struct mbuf *m; - int err = 0; - -#ifdef notyet /* XXX */ - DPRINTFN(2, "%s\n", prcorequests[req]); -#endif - - if (pcb == NULL) - return EINVAL; - - if (level != BTPROTO_L2CAP) { - err = EINVAL; - if (req == PRCO_SETOPT && *opt) - m_free(*opt); - } else switch(req) { - case PRCO_GETOPT: - m = m_get(M_WAIT, MT_SOOPTS); - m->m_len = l2cap_getopt(pcb, optname, mtod(m, void *)); - if (m->m_len == 0) { - m_freem(m); - m = NULL; - err = ENOPROTOOPT; - } - *opt = m; - break; - - case PRCO_SETOPT: - m = *opt; - err = l2cap_setopt(pcb, optname, m); - m_freem(m); - break; - - default: - err = ENOPROTOOPT; - break; - } - - return err; -} - -/********************************************************************** - * - * L2CAP Protocol socket callbacks - * - */ - -static void -l2cap_connecting(void *arg) -{ - struct socket *so = arg; - - DPRINTF("Connecting\n"); - soisconnecting(so); -} - -static void -l2cap_connected(void *arg) -{ - struct socket *so = arg; - - DPRINTF("Connected\n"); - soisconnected(so); -} - -static void -l2cap_disconnected(void *arg, int err) -{ - struct socket *so = arg; - - DPRINTF("Disconnected (%d)\n", err); - - so->so_error = err; - soisdisconnected(so); -} - -static void * -l2cap_newconn(void *arg, struct sockaddr_bt *laddr, - struct sockaddr_bt *raddr) -{ - struct socket *so = arg; - - DPRINTF("New Connection\n"); - so = sonewconn(so, 0); - if (so == NULL) - return NULL; - - soisconnecting(so); - - return so->so_pcb; -} - -static void -l2cap_complete(void *arg, int count) -{ - struct socket *so = arg; - - while (count-- > 0) - sbdroprecord(&so->so_snd); - - sowwakeup(so); -} - -static void -l2cap_linkmode(void *arg, int new) -{ - struct socket *so = arg; - int mode; - - DPRINTF("auth %s, encrypt %s, secure %s\n", - (new & L2CAP_LM_AUTH ? "on" : "off"), - (new & L2CAP_LM_ENCRYPT ? "on" : "off"), - (new & L2CAP_LM_SECURE ? "on" : "off")); - - (void)l2cap_getopt(so->so_pcb, SO_L2CAP_LM, &mode); - if (((mode & L2CAP_LM_AUTH) && !(new & L2CAP_LM_AUTH)) - || ((mode & L2CAP_LM_ENCRYPT) && !(new & L2CAP_LM_ENCRYPT)) - || ((mode & L2CAP_LM_SECURE) && !(new & L2CAP_LM_SECURE))) - l2cap_disconnect(so->so_pcb, 0); -} - -static void -l2cap_input(void *arg, struct mbuf *m) -{ - struct socket *so = arg; - - if (m->m_pkthdr.len > sbspace(&so->so_rcv)) { - printf("%s: packet (%d bytes) dropped (socket buffer full)\n", - __func__, m->m_pkthdr.len); - m_freem(m); - return; - } - - DPRINTFN(10, "received %d bytes\n", m->m_pkthdr.len); - - sbappendrecord(&so->so_rcv, m); - sorwakeup(so); -} |
