2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
28 * $Id: sco.c,v 1.4 2002/07/22 20:32:54 maxk Exp $
32 #include <linux/config.h>
33 #include <linux/module.h>
35 #include <linux/types.h>
36 #include <linux/errno.h>
37 #include <linux/kernel.h>
38 #include <linux/major.h>
39 #include <linux/sched.h>
40 #include <linux/slab.h>
41 #include <linux/poll.h>
42 #include <linux/fcntl.h>
43 #include <linux/init.h>
44 #include <linux/skbuff.h>
45 #include <linux/interrupt.h>
46 #include <linux/socket.h>
47 #include <linux/skbuff.h>
48 #include <linux/proc_fs.h>
49 #include <linux/list.h>
52 #include <asm/system.h>
53 #include <asm/uaccess.h>
55 #include <net/bluetooth/bluetooth.h>
56 #include <net/bluetooth/hci_core.h>
57 #include <net/bluetooth/sco.h>
61 #define BT_DBG( A... )
64 static struct proto_ops sco_sock_ops;
66 static struct bluez_sock_list sco_sk_list = {
67 lock: RW_LOCK_UNLOCKED
70 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent);
71 static void sco_chan_del(struct sock *sk, int err);
73 static int sco_conn_del(struct hci_conn *conn, int err);
75 static void sco_sock_close(struct sock *sk);
76 static void sco_sock_kill(struct sock *sk);
78 /* ----- SCO timers ------ */
79 static void sco_sock_timeout(unsigned long arg)
81 struct sock *sk = (struct sock *) arg;
83 BT_DBG("sock %p state %d", sk, sk->state);
94 static void sco_sock_set_timer(struct sock *sk, long timeout)
96 BT_DBG("sock %p state %d timeout %ld", sk, sk->state, timeout);
98 if (!mod_timer(&sk->timer, jiffies + timeout))
102 static void sco_sock_clear_timer(struct sock *sk)
104 BT_DBG("sock %p state %d", sk, sk->state);
106 if (timer_pending(&sk->timer) && del_timer(&sk->timer))
110 static void sco_sock_init_timer(struct sock *sk)
112 init_timer(&sk->timer);
113 sk->timer.function = sco_sock_timeout;
114 sk->timer.data = (unsigned long)sk;
117 /* -------- SCO connections --------- */
118 static struct sco_conn *sco_conn_add(struct hci_conn *hcon, __u8 status)
120 struct hci_dev *hdev = hcon->hdev;
121 struct sco_conn *conn;
123 if ((conn = hcon->sco_data))
129 if (!(conn = kmalloc(sizeof(struct sco_conn), GFP_ATOMIC)))
131 memset(conn, 0, sizeof(struct sco_conn));
133 spin_lock_init(&conn->lock);
135 hcon->sco_data = conn;
138 conn->src = &hdev->bdaddr;
139 conn->dst = &hcon->dst;
141 if (hdev->sco_mtu > 0)
142 conn->mtu = hdev->sco_mtu;
146 BT_DBG("hcon %p conn %p", hcon, conn);
152 static inline struct sock * sco_chan_get(struct sco_conn *conn)
154 struct sock *sk = NULL;
157 sco_conn_unlock(conn);
161 static int sco_conn_del(struct hci_conn *hcon, int err)
163 struct sco_conn *conn;
166 if (!(conn = hcon->sco_data))
169 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
172 if ((sk = sco_chan_get(conn))) {
174 sco_sock_clear_timer(sk);
175 sco_chan_del(sk, err);
180 hcon->sco_data = NULL;
187 static inline int sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
195 __sco_chan_add(conn, sk, parent);
197 sco_conn_unlock(conn);
201 int sco_connect(struct sock *sk)
203 bdaddr_t *src = &bluez_pi(sk)->src;
204 bdaddr_t *dst = &bluez_pi(sk)->dst;
205 struct sco_conn *conn;
206 struct hci_conn *hcon;
207 struct hci_dev *hdev;
210 BT_DBG("%s -> %s", batostr(src), batostr(dst));
212 if (!(hdev = hci_get_route(dst, src)))
213 return -EHOSTUNREACH;
215 hci_dev_lock_bh(hdev);
219 hcon = hci_connect(hdev, SCO_LINK, dst);
223 conn = sco_conn_add(hcon, 0);
229 /* Update source addr of the socket */
230 bacpy(src, conn->src);
232 err = sco_chan_add(conn, sk, NULL);
236 if (hcon->state == BT_CONNECTED) {
237 sco_sock_clear_timer(sk);
238 sk->state = BT_CONNECTED;
240 sk->state = BT_CONNECT;
241 sco_sock_set_timer(sk, sk->sndtimeo);
244 hci_dev_unlock_bh(hdev);
249 static inline int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
251 struct sco_conn *conn = sco_pi(sk)->conn;
255 /* Check outgoing MTU */
259 BT_DBG("sk %p len %d", sk, len);
261 count = MIN(conn->mtu, len);
262 if (!(skb = bluez_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err)))
265 if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) {
270 if ((err = hci_send_sco(conn->hcon, skb)) < 0)
280 static inline void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
282 struct sock *sk = sco_chan_get(conn);
287 BT_DBG("sk %p len %d", sk, skb->len);
289 if (sk->state != BT_CONNECTED)
292 if (!sock_queue_rcv_skb(sk, skb))
300 /* -------- Socket interface ---------- */
301 static struct sock *__sco_get_sock_by_addr(bdaddr_t *ba)
305 for (sk = sco_sk_list.head; sk; sk = sk->next) {
306 if (!bacmp(&bluez_pi(sk)->src, ba))
313 /* Find socket listening on source bdaddr.
314 * Returns closest match.
316 static struct sock *sco_get_sock_listen(bdaddr_t *src)
318 struct sock *sk, *sk1 = NULL;
320 read_lock(&sco_sk_list.lock);
322 for (sk = sco_sk_list.head; sk; sk = sk->next) {
323 if (sk->state != BT_LISTEN)
327 if (!bacmp(&bluez_pi(sk)->src, src))
331 if (!bacmp(&bluez_pi(sk)->src, BDADDR_ANY))
335 read_unlock(&sco_sk_list.lock);
337 return sk ? sk : sk1;
340 static void sco_sock_destruct(struct sock *sk)
344 skb_queue_purge(&sk->receive_queue);
345 skb_queue_purge(&sk->write_queue);
350 static void sco_sock_cleanup_listen(struct sock *parent)
354 BT_DBG("parent %p", parent);
356 /* Close not yet accepted channels */
357 while ((sk = bluez_accept_dequeue(parent, NULL))) {
362 parent->state = BT_CLOSED;
366 /* Kill socket (only if zapped and orphan)
367 * Must be called on unlocked socket.
369 static void sco_sock_kill(struct sock *sk)
371 if (!sk->zapped || sk->socket)
374 BT_DBG("sk %p state %d", sk, sk->state);
376 /* Kill poor orphan */
377 bluez_sock_unlink(&sco_sk_list, sk);
383 * Must be called on unlocked socket.
385 static void sco_sock_close(struct sock *sk)
387 struct sco_conn *conn;
389 sco_sock_clear_timer(sk);
393 conn = sco_pi(sk)->conn;
395 BT_DBG("sk %p state %d conn %p socket %p", sk, sk->state, conn, sk->socket);
399 sco_sock_cleanup_listen(sk);
406 sco_chan_del(sk, ECONNRESET);
417 static void sco_sock_init(struct sock *sk, struct sock *parent)
422 sk->type = parent->type;
425 static struct sock *sco_sock_alloc(struct socket *sock, int proto, int prio)
429 if (!(sk = sk_alloc(PF_BLUETOOTH, prio, 1)))
432 bluez_sock_init(sock, sk);
436 sk->destruct = sco_sock_destruct;
437 sk->sndtimeo = SCO_CONN_TIMEOUT;
439 sk->protocol = proto;
442 sco_sock_init_timer(sk);
444 bluez_sock_link(&sco_sk_list, sk);
450 static int sco_sock_create(struct socket *sock, int protocol)
454 BT_DBG("sock %p", sock);
456 sock->state = SS_UNCONNECTED;
458 if (sock->type != SOCK_SEQPACKET)
459 return -ESOCKTNOSUPPORT;
461 sock->ops = &sco_sock_ops;
463 if (!(sk = sco_sock_alloc(sock, protocol, GFP_KERNEL)))
466 sco_sock_init(sk, NULL);
470 static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
472 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
473 struct sock *sk = sock->sk;
474 bdaddr_t *src = &sa->sco_bdaddr;
477 BT_DBG("sk %p %s", sk, batostr(&sa->sco_bdaddr));
479 if (!addr || addr->sa_family != AF_BLUETOOTH)
484 if (sk->state != BT_OPEN) {
489 write_lock_bh(&sco_sk_list.lock);
491 if (bacmp(src, BDADDR_ANY) && __sco_get_sock_by_addr(src)) {
494 /* Save source address */
495 bacpy(&bluez_pi(sk)->src, &sa->sco_bdaddr);
496 sk->state = BT_BOUND;
499 write_unlock_bh(&sco_sk_list.lock);
507 static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
509 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
510 struct sock *sk = sock->sk;
516 if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_sco))
519 if (sk->state != BT_OPEN && sk->state != BT_BOUND)
522 if (sk->type != SOCK_SEQPACKET)
527 /* Set destination address and psm */
528 bacpy(&bluez_pi(sk)->dst, &sa->sco_bdaddr);
530 if ((err = sco_connect(sk)))
533 err = bluez_sock_wait_state(sk, BT_CONNECTED,
534 sock_sndtimeo(sk, flags & O_NONBLOCK));
541 int sco_sock_listen(struct socket *sock, int backlog)
543 struct sock *sk = sock->sk;
546 BT_DBG("sk %p backlog %d", sk, backlog);
550 if (sk->state != BT_BOUND || sock->type != SOCK_SEQPACKET) {
555 sk->max_ack_backlog = backlog;
557 sk->state = BT_LISTEN;
564 int sco_sock_accept(struct socket *sock, struct socket *newsock, int flags)
566 DECLARE_WAITQUEUE(wait, current);
567 struct sock *sk = sock->sk, *ch;
573 if (sk->state != BT_LISTEN) {
578 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
580 BT_DBG("sk %p timeo %ld", sk, timeo);
582 /* Wait for an incoming connection. (wake-one). */
583 add_wait_queue_exclusive(sk->sleep, &wait);
584 while (!(ch = bluez_accept_dequeue(sk, newsock))) {
585 set_current_state(TASK_INTERRUPTIBLE);
592 timeo = schedule_timeout(timeo);
595 if (sk->state != BT_LISTEN) {
600 if (signal_pending(current)) {
601 err = sock_intr_errno(timeo);
605 set_current_state(TASK_RUNNING);
606 remove_wait_queue(sk->sleep, &wait);
611 newsock->state = SS_CONNECTED;
613 BT_DBG("new socket %p", ch);
620 static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
622 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
623 struct sock *sk = sock->sk;
625 BT_DBG("sock %p, sk %p", sock, sk);
627 addr->sa_family = AF_BLUETOOTH;
628 *len = sizeof(struct sockaddr_sco);
631 bacpy(&sa->sco_bdaddr, &bluez_pi(sk)->dst);
633 bacpy(&sa->sco_bdaddr, &bluez_pi(sk)->src);
638 static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg, int len, struct scm_cookie *scm)
640 struct sock *sk = sock->sk;
643 BT_DBG("sock %p, sk %p", sock, sk);
646 return sock_error(sk);
648 if (msg->msg_flags & MSG_OOB)
653 if (sk->state == BT_CONNECTED)
654 err = sco_send_frame(sk, msg, len);
662 int sco_sock_setsockopt(struct socket *sock, int level, int optname, char *optval, int optlen)
664 struct sock *sk = sock->sk;
681 int sco_sock_getsockopt(struct socket *sock, int level, int optname, char *optval, int *optlen)
683 struct sock *sk = sock->sk;
684 struct sco_options opts;
685 struct sco_conninfo cinfo;
690 if (get_user(len, optlen))
697 if (sk->state != BT_CONNECTED) {
702 opts.mtu = sco_pi(sk)->conn->mtu;
704 BT_DBG("mtu %d", opts.mtu);
706 len = MIN(len, sizeof(opts));
707 if (copy_to_user(optval, (char *)&opts, len))
713 if (sk->state != BT_CONNECTED) {
718 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
720 len = MIN(len, sizeof(cinfo));
721 if (copy_to_user(optval, (char *)&cinfo, len))
735 static int sco_sock_release(struct socket *sock)
737 struct sock *sk = sock->sk;
740 BT_DBG("sock %p, sk %p", sock, sk);
748 err = bluez_sock_wait_state(sk, BT_CLOSED, sk->lingertime);
757 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
759 BT_DBG("conn %p", conn);
761 sco_pi(sk)->conn = conn;
765 bluez_accept_enqueue(parent, sk);
769 * Must be called on the locked socket. */
770 static void sco_chan_del(struct sock *sk, int err)
772 struct sco_conn *conn;
774 conn = sco_pi(sk)->conn;
776 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
781 sco_pi(sk)->conn = NULL;
782 sco_conn_unlock(conn);
783 hci_conn_put(conn->hcon);
786 sk->state = BT_CLOSED;
788 sk->state_change(sk);
793 static void sco_conn_ready(struct sco_conn *conn)
795 struct sock *parent, *sk;
797 BT_DBG("conn %p", conn);
801 if ((sk = conn->sk)) {
802 sco_sock_clear_timer(sk);
804 sk->state = BT_CONNECTED;
805 sk->state_change(sk);
808 parent = sco_get_sock_listen(conn->src);
812 bh_lock_sock(parent);
814 sk = sco_sock_alloc(NULL, BTPROTO_SCO, GFP_ATOMIC);
816 bh_unlock_sock(parent);
820 sco_sock_init(sk, parent);
822 bacpy(&bluez_pi(sk)->src, conn->src);
823 bacpy(&bluez_pi(sk)->dst, conn->dst);
825 hci_conn_hold(conn->hcon);
826 __sco_chan_add(conn, sk, parent);
828 sk->state = BT_CONNECTED;
831 parent->data_ready(parent, 1);
833 bh_unlock_sock(parent);
837 sco_conn_unlock(conn);
840 /* ----- SCO interface with lower layer (HCI) ----- */
841 int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
843 BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
845 /* Always accept connection */
846 return HCI_LM_ACCEPT;
849 int sco_connect_cfm(struct hci_conn *hcon, __u8 status)
851 BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
853 if (hcon->type != SCO_LINK)
857 struct sco_conn *conn;
859 conn = sco_conn_add(hcon, status);
861 sco_conn_ready(conn);
863 sco_conn_del(hcon, bterr(status));
868 int sco_disconn_ind(struct hci_conn *hcon, __u8 reason)
870 BT_DBG("hcon %p reason %d", hcon, reason);
872 if (hcon->type != SCO_LINK)
875 sco_conn_del(hcon, bterr(reason));
879 int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
881 struct sco_conn *conn = hcon->sco_data;
886 BT_DBG("conn %p len %d", conn, skb->len);
889 sco_recv_frame(conn, skb);
898 /* ----- Proc fs support ------ */
899 static int sco_sock_dump(char *buf, struct bluez_sock_list *list)
901 struct sco_pinfo *pi;
905 write_lock_bh(&list->lock);
907 for (sk = list->head; sk; sk = sk->next) {
909 ptr += sprintf(ptr, "%s %s %d\n",
910 batostr(&bluez_pi(sk)->src), batostr(&bluez_pi(sk)->dst),
914 write_unlock_bh(&list->lock);
916 ptr += sprintf(ptr, "\n");
921 static int sco_read_proc(char *buf, char **start, off_t offset, int count, int *eof, void *priv)
926 BT_DBG("count %d, offset %ld", count, offset);
928 ptr += sco_sock_dump(ptr, &sco_sk_list);
931 if (len <= count + offset)
934 *start = buf + offset;
945 static struct proto_ops sco_sock_ops = {
946 family: PF_BLUETOOTH,
947 release: sco_sock_release,
949 connect: sco_sock_connect,
950 listen: sco_sock_listen,
951 accept: sco_sock_accept,
952 getname: sco_sock_getname,
953 sendmsg: sco_sock_sendmsg,
954 recvmsg: bluez_sock_recvmsg,
955 poll: bluez_sock_poll,
956 socketpair: sock_no_socketpair,
957 ioctl: sock_no_ioctl,
958 shutdown: sock_no_shutdown,
959 setsockopt: sco_sock_setsockopt,
960 getsockopt: sco_sock_getsockopt,
964 static struct net_proto_family sco_sock_family_ops = {
965 family: PF_BLUETOOTH,
966 create: sco_sock_create
969 static struct hci_proto sco_hci_proto = {
972 connect_ind: sco_connect_ind,
973 connect_cfm: sco_connect_cfm,
974 disconn_ind: sco_disconn_ind,
975 recv_scodata: sco_recv_scodata,
978 int __init sco_init(void)
982 if ((err = bluez_sock_register(BTPROTO_SCO, &sco_sock_family_ops))) {
983 BT_ERR("Can't register SCO socket layer");
987 if ((err = hci_register_proto(&sco_hci_proto))) {
988 BT_ERR("Can't register SCO protocol");
992 create_proc_read_entry("bluetooth/sco", 0, 0, sco_read_proc, NULL);
994 BT_INFO("BlueZ SCO ver %s Copyright (C) 2000,2001 Qualcomm Inc", VERSION);
995 BT_INFO("Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>");
999 void sco_cleanup(void)
1003 remove_proc_entry("bluetooth/sco", NULL);
1005 /* Unregister socket, protocol and notifier */
1006 if ((err = bluez_sock_unregister(BTPROTO_SCO)))
1007 BT_ERR("Can't unregister SCO socket layer %d", err);
1009 if ((err = hci_unregister_proto(&sco_hci_proto)))
1010 BT_ERR("Can't unregister SCO protocol %d", err);
1013 module_init(sco_init);
1014 module_exit(sco_cleanup);
1016 MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>");
1017 MODULE_DESCRIPTION("BlueZ SCO ver " VERSION);
1018 MODULE_LICENSE("GPL");