Bluetooth: Move struct sco_pinfo into net/bluetooth/sco.c
[deliverable/linux.git] / net / bluetooth / sco.c
CommitLineData
8e87d142 1/*
1da177e4
LT
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
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;
10
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
8e87d142
YH
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
1da177e4
LT
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
8e87d142
YH
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4
LT
22 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth SCO sockets. */
26
1da177e4 27#include <linux/module.h>
aef7d97c
MH
28#include <linux/debugfs.h>
29#include <linux/seq_file.h>
1da177e4
LT
30
31#include <net/bluetooth/bluetooth.h>
32#include <net/bluetooth/hci_core.h>
33#include <net/bluetooth/sco.h>
34
eb939922 35static bool disable_esco;
1da177e4 36
90ddc4f0 37static const struct proto_ops sco_sock_ops;
1da177e4
LT
38
39static struct bt_sock_list sco_sk_list = {
d5fb2962 40 .lock = __RW_LOCK_UNLOCKED(sco_sk_list.lock)
1da177e4
LT
41};
42
43static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent);
44static void sco_chan_del(struct sock *sk, int err);
45
1da177e4
LT
46static void sco_sock_close(struct sock *sk);
47static void sco_sock_kill(struct sock *sk);
48
2a0dccb3
MH
49/* ----- SCO socket info ----- */
50#define sco_pi(sk) ((struct sco_pinfo *) sk)
51
52struct sco_pinfo {
53 struct bt_sock bt;
54 bdaddr_t src;
55 bdaddr_t dst;
56 __u32 flags;
57 __u16 setting;
58 struct sco_conn *conn;
59};
60
1da177e4
LT
61/* ---- SCO timers ---- */
62static void sco_sock_timeout(unsigned long arg)
63{
64 struct sock *sk = (struct sock *) arg;
65
66 BT_DBG("sock %p state %d", sk, sk->sk_state);
67
68 bh_lock_sock(sk);
69 sk->sk_err = ETIMEDOUT;
70 sk->sk_state_change(sk);
71 bh_unlock_sock(sk);
72
73 sco_sock_kill(sk);
74 sock_put(sk);
75}
76
77static void sco_sock_set_timer(struct sock *sk, long timeout)
78{
79 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
80 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
81}
82
83static void sco_sock_clear_timer(struct sock *sk)
84{
85 BT_DBG("sock %p state %d", sk, sk->sk_state);
86 sk_stop_timer(sk, &sk->sk_timer);
87}
88
1da177e4 89/* ---- SCO connections ---- */
519e42b3 90static struct sco_conn *sco_conn_add(struct hci_conn *hcon)
1da177e4
LT
91{
92 struct hci_dev *hdev = hcon->hdev;
25ea6db0 93 struct sco_conn *conn = hcon->sco_data;
1da177e4 94
519e42b3 95 if (conn)
1da177e4
LT
96 return conn;
97
c10cc5a9 98 conn = kzalloc(sizeof(struct sco_conn), GFP_KERNEL);
25ea6db0 99 if (!conn)
1da177e4 100 return NULL;
1da177e4
LT
101
102 spin_lock_init(&conn->lock);
103
104 hcon->sco_data = conn;
105 conn->hcon = hcon;
106
1da177e4
LT
107 if (hdev->sco_mtu > 0)
108 conn->mtu = hdev->sco_mtu;
109 else
110 conn->mtu = 60;
111
112 BT_DBG("hcon %p conn %p", hcon, conn);
25ea6db0 113
1da177e4
LT
114 return conn;
115}
116
6039aa73 117static struct sock *sco_chan_get(struct sco_conn *conn)
1da177e4
LT
118{
119 struct sock *sk = NULL;
120 sco_conn_lock(conn);
121 sk = conn->sk;
122 sco_conn_unlock(conn);
123 return sk;
124}
125
126static int sco_conn_del(struct hci_conn *hcon, int err)
127{
735cbc47 128 struct sco_conn *conn = hcon->sco_data;
1da177e4
LT
129 struct sock *sk;
130
735cbc47 131 if (!conn)
1da177e4
LT
132 return 0;
133
134 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
135
136 /* Kill socket */
735cbc47
AE
137 sk = sco_chan_get(conn);
138 if (sk) {
1da177e4
LT
139 bh_lock_sock(sk);
140 sco_sock_clear_timer(sk);
141 sco_chan_del(sk, err);
142 bh_unlock_sock(sk);
143 sco_sock_kill(sk);
144 }
145
146 hcon->sco_data = NULL;
147 kfree(conn);
148 return 0;
149}
150
6039aa73
GP
151static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
152 struct sock *parent)
1da177e4
LT
153{
154 int err = 0;
155
156 sco_conn_lock(conn);
b9dbdbc1 157 if (conn->sk)
1da177e4 158 err = -EBUSY;
b9dbdbc1 159 else
1da177e4 160 __sco_chan_add(conn, sk, parent);
b9dbdbc1 161
1da177e4
LT
162 sco_conn_unlock(conn);
163 return err;
164}
165
166static int sco_connect(struct sock *sk)
167{
1da177e4
LT
168 struct sco_conn *conn;
169 struct hci_conn *hcon;
170 struct hci_dev *hdev;
b6a0dc82 171 int err, type;
1da177e4 172
eea96364 173 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
1da177e4 174
eea96364 175 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src);
735cbc47 176 if (!hdev)
1da177e4
LT
177 return -EHOSTUNREACH;
178
09fd0de5 179 hci_dev_lock(hdev);
1da177e4 180
7cb127d5
MH
181 if (lmp_esco_capable(hdev) && !disable_esco)
182 type = ESCO_LINK;
183 else
184 type = SCO_LINK;
b6a0dc82 185
79dc0087
FD
186 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
187 (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
188 err = -EOPNOTSUPP;
189 goto done;
190 }
191
eea96364 192 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
041987cf 193 sco_pi(sk)->setting);
30e76272
VT
194 if (IS_ERR(hcon)) {
195 err = PTR_ERR(hcon);
1da177e4 196 goto done;
30e76272 197 }
1da177e4 198
519e42b3 199 conn = sco_conn_add(hcon);
1da177e4 200 if (!conn) {
76a68ba0 201 hci_conn_drop(hcon);
30e76272 202 err = -ENOMEM;
1da177e4
LT
203 goto done;
204 }
205
206 /* Update source addr of the socket */
eea96364 207 bacpy(&sco_pi(sk)->src, &hcon->src);
1da177e4
LT
208
209 err = sco_chan_add(conn, sk, NULL);
210 if (err)
211 goto done;
212
213 if (hcon->state == BT_CONNECTED) {
214 sco_sock_clear_timer(sk);
215 sk->sk_state = BT_CONNECTED;
216 } else {
217 sk->sk_state = BT_CONNECT;
218 sco_sock_set_timer(sk, sk->sk_sndtimeo);
219 }
b6a0dc82 220
1da177e4 221done:
09fd0de5 222 hci_dev_unlock(hdev);
1da177e4
LT
223 hci_dev_put(hdev);
224 return err;
225}
226
6039aa73 227static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
1da177e4
LT
228{
229 struct sco_conn *conn = sco_pi(sk)->conn;
230 struct sk_buff *skb;
088ce088 231 int err;
1da177e4
LT
232
233 /* Check outgoing MTU */
234 if (len > conn->mtu)
235 return -EINVAL;
236
237 BT_DBG("sk %p len %d", sk, len);
238
088ce088 239 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
b9dbdbc1 240 if (!skb)
1da177e4
LT
241 return err;
242
088ce088 243 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
b9dbdbc1
GP
244 kfree_skb(skb);
245 return -EFAULT;
1da177e4
LT
246 }
247
0d861d8b 248 hci_send_sco(conn->hcon, skb);
1da177e4 249
088ce088 250 return len;
1da177e4
LT
251}
252
6039aa73 253static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
1da177e4
LT
254{
255 struct sock *sk = sco_chan_get(conn);
256
257 if (!sk)
258 goto drop;
259
260 BT_DBG("sk %p len %d", sk, skb->len);
261
262 if (sk->sk_state != BT_CONNECTED)
263 goto drop;
264
265 if (!sock_queue_rcv_skb(sk, skb))
266 return;
267
268drop:
269 kfree_skb(skb);
1da177e4
LT
270}
271
272/* -------- Socket interface ---------- */
fb334059 273static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
1da177e4 274{
fb334059
MH
275 struct sock *sk;
276
b67bfe0d 277 sk_for_each(sk, &sco_sk_list.head) {
fb334059
MH
278 if (sk->sk_state != BT_LISTEN)
279 continue;
1da177e4 280
eea96364 281 if (!bacmp(&sco_pi(sk)->src, ba))
fb334059
MH
282 return sk;
283 }
284
285 return NULL;
1da177e4
LT
286}
287
288/* Find socket listening on source bdaddr.
289 * Returns closest match.
290 */
291static struct sock *sco_get_sock_listen(bdaddr_t *src)
292{
293 struct sock *sk = NULL, *sk1 = NULL;
1da177e4
LT
294
295 read_lock(&sco_sk_list.lock);
296
b67bfe0d 297 sk_for_each(sk, &sco_sk_list.head) {
1da177e4
LT
298 if (sk->sk_state != BT_LISTEN)
299 continue;
300
301 /* Exact match. */
eea96364 302 if (!bacmp(&sco_pi(sk)->src, src))
1da177e4
LT
303 break;
304
305 /* Closest match */
eea96364 306 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY))
1da177e4
LT
307 sk1 = sk;
308 }
309
310 read_unlock(&sco_sk_list.lock);
311
b67bfe0d 312 return sk ? sk : sk1;
1da177e4
LT
313}
314
315static void sco_sock_destruct(struct sock *sk)
316{
317 BT_DBG("sk %p", sk);
318
319 skb_queue_purge(&sk->sk_receive_queue);
320 skb_queue_purge(&sk->sk_write_queue);
321}
322
323static void sco_sock_cleanup_listen(struct sock *parent)
324{
325 struct sock *sk;
326
327 BT_DBG("parent %p", parent);
328
329 /* Close not yet accepted channels */
330 while ((sk = bt_accept_dequeue(parent, NULL))) {
331 sco_sock_close(sk);
332 sco_sock_kill(sk);
333 }
334
335 parent->sk_state = BT_CLOSED;
336 sock_set_flag(parent, SOCK_ZAPPED);
337}
338
339/* Kill socket (only if zapped and orphan)
340 * Must be called on unlocked socket.
341 */
342static void sco_sock_kill(struct sock *sk)
343{
344 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
345 return;
346
347 BT_DBG("sk %p state %d", sk, sk->sk_state);
348
349 /* Kill poor orphan */
350 bt_sock_unlink(&sco_sk_list, sk);
351 sock_set_flag(sk, SOCK_DEAD);
352 sock_put(sk);
353}
354
fd0b3ff7 355static void __sco_sock_close(struct sock *sk)
1da177e4 356{
fd0b3ff7 357 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
1da177e4
LT
358
359 switch (sk->sk_state) {
360 case BT_LISTEN:
361 sco_sock_cleanup_listen(sk);
362 break;
363
364 case BT_CONNECTED:
365 case BT_CONFIG:
b7e98b51 366 if (sco_pi(sk)->conn->hcon) {
4a77708b
LAD
367 sk->sk_state = BT_DISCONN;
368 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
76a68ba0 369 hci_conn_drop(sco_pi(sk)->conn->hcon);
4a77708b
LAD
370 sco_pi(sk)->conn->hcon = NULL;
371 } else
372 sco_chan_del(sk, ECONNRESET);
373 break;
374
eb20ff9c 375 case BT_CONNECT2:
1da177e4
LT
376 case BT_CONNECT:
377 case BT_DISCONN:
378 sco_chan_del(sk, ECONNRESET);
379 break;
380
381 default:
382 sock_set_flag(sk, SOCK_ZAPPED);
383 break;
3ff50b79 384 }
fd0b3ff7 385}
1da177e4 386
fd0b3ff7
MH
387/* Must be called on unlocked socket. */
388static void sco_sock_close(struct sock *sk)
389{
390 sco_sock_clear_timer(sk);
391 lock_sock(sk);
392 __sco_sock_close(sk);
1da177e4 393 release_sock(sk);
1da177e4
LT
394 sco_sock_kill(sk);
395}
396
397static void sco_sock_init(struct sock *sk, struct sock *parent)
398{
399 BT_DBG("sk %p", sk);
400
6230c9b4 401 if (parent) {
1da177e4 402 sk->sk_type = parent->sk_type;
20714bfe 403 bt_sk(sk)->flags = bt_sk(parent)->flags;
6230c9b4
PM
404 security_sk_clone(parent, sk);
405 }
1da177e4
LT
406}
407
408static struct proto sco_proto = {
409 .name = "SCO",
410 .owner = THIS_MODULE,
411 .obj_size = sizeof(struct sco_pinfo)
412};
413
1b8d7ae4 414static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
1da177e4
LT
415{
416 struct sock *sk;
417
6257ff21 418 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto);
1da177e4
LT
419 if (!sk)
420 return NULL;
421
422 sock_init_data(sock, sk);
423 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
424
425 sk->sk_destruct = sco_sock_destruct;
426 sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
427
428 sock_reset_flag(sk, SOCK_ZAPPED);
429
430 sk->sk_protocol = proto;
431 sk->sk_state = BT_OPEN;
432
ad10b1a4
FD
433 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
434
b24b8a24 435 setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk);
1da177e4
LT
436
437 bt_sock_link(&sco_sk_list, sk);
438 return sk;
439}
440
3f378b68
EP
441static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
442 int kern)
1da177e4
LT
443{
444 struct sock *sk;
445
446 BT_DBG("sock %p", sock);
447
448 sock->state = SS_UNCONNECTED;
449
450 if (sock->type != SOCK_SEQPACKET)
451 return -ESOCKTNOSUPPORT;
452
453 sock->ops = &sco_sock_ops;
454
1b8d7ae4 455 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC);
74da626a 456 if (!sk)
1da177e4
LT
457 return -ENOMEM;
458
459 sco_sock_init(sk, NULL);
460 return 0;
461}
462
463static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
464{
465 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
466 struct sock *sk = sock->sk;
1da177e4
LT
467 int err = 0;
468
6ed93dc6 469 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr);
1da177e4
LT
470
471 if (!addr || addr->sa_family != AF_BLUETOOTH)
472 return -EINVAL;
473
474 lock_sock(sk);
475
476 if (sk->sk_state != BT_OPEN) {
477 err = -EBADFD;
478 goto done;
479 }
480
8ed21f7e
MH
481 if (sk->sk_type != SOCK_SEQPACKET) {
482 err = -EINVAL;
483 goto done;
1da177e4
LT
484 }
485
eea96364 486 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr);
8ed21f7e
MH
487
488 sk->sk_state = BT_BOUND;
1da177e4
LT
489
490done:
491 release_sock(sk);
492 return err;
493}
494
495static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
496{
497 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
498 struct sock *sk = sock->sk;
92f185c8 499 int err;
1da177e4
LT
500
501 BT_DBG("sk %p", sk);
502
6503d961
CG
503 if (alen < sizeof(struct sockaddr_sco) ||
504 addr->sa_family != AF_BLUETOOTH)
1da177e4
LT
505 return -EINVAL;
506
507 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
508 return -EBADFD;
509
510 if (sk->sk_type != SOCK_SEQPACKET)
511 return -EINVAL;
512
513 lock_sock(sk);
514
515 /* Set destination address and psm */
eea96364 516 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
1da177e4 517
735cbc47
AE
518 err = sco_connect(sk);
519 if (err)
1da177e4
LT
520 goto done;
521
8e87d142 522 err = bt_sock_wait_state(sk, BT_CONNECTED,
be7c2b99 523 sock_sndtimeo(sk, flags & O_NONBLOCK));
1da177e4
LT
524
525done:
526 release_sock(sk);
527 return err;
528}
529
530static int sco_sock_listen(struct socket *sock, int backlog)
531{
532 struct sock *sk = sock->sk;
eea96364 533 bdaddr_t *src = &sco_pi(sk)->src;
1da177e4
LT
534 int err = 0;
535
536 BT_DBG("sk %p backlog %d", sk, backlog);
537
538 lock_sock(sk);
539
7d5d775a 540 if (sk->sk_state != BT_BOUND) {
1da177e4
LT
541 err = -EBADFD;
542 goto done;
543 }
544
7d5d775a
MH
545 if (sk->sk_type != SOCK_SEQPACKET) {
546 err = -EINVAL;
547 goto done;
548 }
549
fb334059
MH
550 write_lock(&sco_sk_list.lock);
551
552 if (__sco_get_sock_listen_by_addr(src)) {
553 err = -EADDRINUSE;
554 goto unlock;
555 }
556
1da177e4
LT
557 sk->sk_max_ack_backlog = backlog;
558 sk->sk_ack_backlog = 0;
fb334059 559
1da177e4
LT
560 sk->sk_state = BT_LISTEN;
561
fb334059
MH
562unlock:
563 write_unlock(&sco_sk_list.lock);
564
1da177e4
LT
565done:
566 release_sock(sk);
567 return err;
568}
569
570static int sco_sock_accept(struct socket *sock, struct socket *newsock, int flags)
571{
572 DECLARE_WAITQUEUE(wait, current);
573 struct sock *sk = sock->sk, *ch;
574 long timeo;
575 int err = 0;
576
577 lock_sock(sk);
578
1da177e4
LT
579 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
580
581 BT_DBG("sk %p timeo %ld", sk, timeo);
582
583 /* Wait for an incoming connection. (wake-one). */
aa395145 584 add_wait_queue_exclusive(sk_sleep(sk), &wait);
552b0d3c 585 while (1) {
1da177e4 586 set_current_state(TASK_INTERRUPTIBLE);
552b0d3c
PH
587
588 if (sk->sk_state != BT_LISTEN) {
589 err = -EBADFD;
1da177e4
LT
590 break;
591 }
592
552b0d3c
PH
593 ch = bt_accept_dequeue(sk, newsock);
594 if (ch)
595 break;
1da177e4 596
552b0d3c
PH
597 if (!timeo) {
598 err = -EAGAIN;
1da177e4
LT
599 break;
600 }
601
602 if (signal_pending(current)) {
603 err = sock_intr_errno(timeo);
604 break;
605 }
552b0d3c
PH
606
607 release_sock(sk);
608 timeo = schedule_timeout(timeo);
609 lock_sock(sk);
1da177e4 610 }
552b0d3c 611 __set_current_state(TASK_RUNNING);
aa395145 612 remove_wait_queue(sk_sleep(sk), &wait);
1da177e4
LT
613
614 if (err)
615 goto done;
616
617 newsock->state = SS_CONNECTED;
618
619 BT_DBG("new socket %p", ch);
620
621done:
622 release_sock(sk);
623 return err;
624}
625
626static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
627{
628 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
629 struct sock *sk = sock->sk;
630
631 BT_DBG("sock %p, sk %p", sock, sk);
632
633 addr->sa_family = AF_BLUETOOTH;
634 *len = sizeof(struct sockaddr_sco);
635
636 if (peer)
eea96364 637 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
1da177e4 638 else
eea96364 639 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
1da177e4
LT
640
641 return 0;
642}
643
8e87d142 644static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
1da177e4
LT
645 struct msghdr *msg, size_t len)
646{
647 struct sock *sk = sock->sk;
b9dbdbc1 648 int err;
1da177e4
LT
649
650 BT_DBG("sock %p, sk %p", sock, sk);
651
c1cbe4b7
BL
652 err = sock_error(sk);
653 if (err)
654 return err;
1da177e4
LT
655
656 if (msg->msg_flags & MSG_OOB)
657 return -EOPNOTSUPP;
658
659 lock_sock(sk);
660
661 if (sk->sk_state == BT_CONNECTED)
662 err = sco_send_frame(sk, msg, len);
663 else
664 err = -ENOTCONN;
665
666 release_sock(sk);
667 return err;
668}
669
2f69a82a 670static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
fa5513be
FD
671{
672 struct hci_dev *hdev = conn->hdev;
673
674 BT_DBG("conn %p", conn);
675
676 conn->state = BT_CONFIG;
677
678 if (!lmp_esco_capable(hdev)) {
679 struct hci_cp_accept_conn_req cp;
680
681 bacpy(&cp.bdaddr, &conn->dst);
33f24048 682 cp.role = 0x00; /* Ignored */
fa5513be
FD
683
684 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
685 } else {
686 struct hci_cp_accept_sync_conn_req cp;
687
688 bacpy(&cp.bdaddr, &conn->dst);
689 cp.pkt_type = cpu_to_le16(conn->pkt_type);
690
dcf4adbf
JP
691 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
692 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
2f69a82a
FD
693 cp.content_format = cpu_to_le16(setting);
694
695 switch (setting & SCO_AIRMODE_MASK) {
696 case SCO_AIRMODE_TRANSP:
697 if (conn->pkt_type & ESCO_2EV3)
dcf4adbf 698 cp.max_latency = cpu_to_le16(0x0008);
2f69a82a 699 else
dcf4adbf 700 cp.max_latency = cpu_to_le16(0x000D);
2f69a82a
FD
701 cp.retrans_effort = 0x02;
702 break;
703 case SCO_AIRMODE_CVSD:
dcf4adbf 704 cp.max_latency = cpu_to_le16(0xffff);
2f69a82a
FD
705 cp.retrans_effort = 0xff;
706 break;
707 }
fa5513be
FD
708
709 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
710 sizeof(cp), &cp);
711 }
712}
713
20714bfe
FD
714static int sco_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
715 struct msghdr *msg, size_t len, int flags)
716{
717 struct sock *sk = sock->sk;
718 struct sco_pinfo *pi = sco_pi(sk);
719
720 lock_sock(sk);
721
722 if (sk->sk_state == BT_CONNECT2 &&
723 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
2f69a82a 724 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
20714bfe
FD
725 sk->sk_state = BT_CONFIG;
726
727 release_sock(sk);
728 return 0;
729 }
730
731 release_sock(sk);
732
733 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
734}
735
b7058842 736static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
1da177e4
LT
737{
738 struct sock *sk = sock->sk;
ad10b1a4
FD
739 int len, err = 0;
740 struct bt_voice voice;
b96e9c67 741 u32 opt;
1da177e4
LT
742
743 BT_DBG("sk %p", sk);
744
745 lock_sock(sk);
746
747 switch (optname) {
b96e9c67
FD
748
749 case BT_DEFER_SETUP:
750 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
751 err = -EINVAL;
752 break;
753 }
754
755 if (get_user(opt, (u32 __user *) optval)) {
756 err = -EFAULT;
757 break;
758 }
759
760 if (opt)
761 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
762 else
763 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
764 break;
765
ad10b1a4
FD
766 case BT_VOICE:
767 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
768 sk->sk_state != BT_CONNECT2) {
769 err = -EINVAL;
770 break;
771 }
772
773 voice.setting = sco_pi(sk)->setting;
774
775 len = min_t(unsigned int, sizeof(voice), optlen);
776 if (copy_from_user((char *) &voice, optval, len)) {
777 err = -EFAULT;
778 break;
779 }
780
781 /* Explicitly check for these values */
782 if (voice.setting != BT_VOICE_TRANSPARENT &&
783 voice.setting != BT_VOICE_CVSD_16BIT) {
784 err = -EINVAL;
785 break;
786 }
787
788 sco_pi(sk)->setting = voice.setting;
789 break;
790
1da177e4
LT
791 default:
792 err = -ENOPROTOOPT;
793 break;
794 }
795
796 release_sock(sk);
797 return err;
798}
799
d58daf42 800static int sco_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
1da177e4
LT
801{
802 struct sock *sk = sock->sk;
803 struct sco_options opts;
804 struct sco_conninfo cinfo;
8e87d142 805 int len, err = 0;
1da177e4
LT
806
807 BT_DBG("sk %p", sk);
808
809 if (get_user(len, optlen))
810 return -EFAULT;
811
812 lock_sock(sk);
813
814 switch (optname) {
815 case SCO_OPTIONS:
9d225d22
JH
816 if (sk->sk_state != BT_CONNECTED &&
817 !(sk->sk_state == BT_CONNECT2 &&
818 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
1da177e4
LT
819 err = -ENOTCONN;
820 break;
821 }
822
823 opts.mtu = sco_pi(sk)->conn->mtu;
824
825 BT_DBG("mtu %d", opts.mtu);
826
827 len = min_t(unsigned int, len, sizeof(opts));
828 if (copy_to_user(optval, (char *)&opts, len))
829 err = -EFAULT;
830
831 break;
832
833 case SCO_CONNINFO:
9d225d22
JH
834 if (sk->sk_state != BT_CONNECTED &&
835 !(sk->sk_state == BT_CONNECT2 &&
836 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
1da177e4
LT
837 err = -ENOTCONN;
838 break;
839 }
840
c4c896e1 841 memset(&cinfo, 0, sizeof(cinfo));
1da177e4
LT
842 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
843 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
844
845 len = min_t(unsigned int, len, sizeof(cinfo));
846 if (copy_to_user(optval, (char *)&cinfo, len))
847 err = -EFAULT;
848
849 break;
850
851 default:
852 err = -ENOPROTOOPT;
853 break;
854 }
855
856 release_sock(sk);
857 return err;
858}
859
d58daf42
MH
860static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
861{
862 struct sock *sk = sock->sk;
863 int len, err = 0;
ad10b1a4 864 struct bt_voice voice;
d58daf42
MH
865
866 BT_DBG("sk %p", sk);
867
868 if (level == SOL_SCO)
869 return sco_sock_getsockopt_old(sock, optname, optval, optlen);
870
871 if (get_user(len, optlen))
872 return -EFAULT;
873
874 lock_sock(sk);
875
876 switch (optname) {
b96e9c67
FD
877
878 case BT_DEFER_SETUP:
879 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
880 err = -EINVAL;
881 break;
882 }
883
884 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
885 (u32 __user *) optval))
886 err = -EFAULT;
887
888 break;
889
ad10b1a4
FD
890 case BT_VOICE:
891 voice.setting = sco_pi(sk)->setting;
892
893 len = min_t(unsigned int, len, sizeof(voice));
894 if (copy_to_user(optval, (char *)&voice, len))
895 err = -EFAULT;
896
897 break;
898
d58daf42
MH
899 default:
900 err = -ENOPROTOOPT;
901 break;
902 }
903
904 release_sock(sk);
905 return err;
906}
907
fd0b3ff7
MH
908static int sco_sock_shutdown(struct socket *sock, int how)
909{
910 struct sock *sk = sock->sk;
911 int err = 0;
912
913 BT_DBG("sock %p, sk %p", sock, sk);
914
915 if (!sk)
916 return 0;
917
918 lock_sock(sk);
919 if (!sk->sk_shutdown) {
920 sk->sk_shutdown = SHUTDOWN_MASK;
921 sco_sock_clear_timer(sk);
922 __sco_sock_close(sk);
923
924 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
925 err = bt_sock_wait_state(sk, BT_CLOSED,
be7c2b99 926 sk->sk_lingertime);
fd0b3ff7
MH
927 }
928 release_sock(sk);
929 return err;
930}
931
1da177e4
LT
932static int sco_sock_release(struct socket *sock)
933{
934 struct sock *sk = sock->sk;
935 int err = 0;
936
937 BT_DBG("sock %p, sk %p", sock, sk);
938
939 if (!sk)
940 return 0;
941
942 sco_sock_close(sk);
943
944 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) {
945 lock_sock(sk);
946 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
947 release_sock(sk);
948 }
949
950 sock_orphan(sk);
951 sco_sock_kill(sk);
952 return err;
953}
954
955static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
956{
957 BT_DBG("conn %p", conn);
958
959 sco_pi(sk)->conn = conn;
960 conn->sk = sk;
961
962 if (parent)
963 bt_accept_enqueue(parent, sk);
964}
965
8e87d142 966/* Delete channel.
1da177e4
LT
967 * Must be called on the locked socket. */
968static void sco_chan_del(struct sock *sk, int err)
969{
970 struct sco_conn *conn;
971
972 conn = sco_pi(sk)->conn;
973
974 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
975
0b27a4b9
GP
976 if (conn) {
977 sco_conn_lock(conn);
978 conn->sk = NULL;
979 sco_pi(sk)->conn = NULL;
980 sco_conn_unlock(conn);
981
982 if (conn->hcon)
76a68ba0 983 hci_conn_drop(conn->hcon);
0b27a4b9
GP
984 }
985
1da177e4
LT
986 sk->sk_state = BT_CLOSED;
987 sk->sk_err = err;
988 sk->sk_state_change(sk);
989
990 sock_set_flag(sk, SOCK_ZAPPED);
991}
992
993static void sco_conn_ready(struct sco_conn *conn)
994{
735cbc47
AE
995 struct sock *parent;
996 struct sock *sk = conn->sk;
1da177e4
LT
997
998 BT_DBG("conn %p", conn);
999
735cbc47 1000 if (sk) {
1da177e4
LT
1001 sco_sock_clear_timer(sk);
1002 bh_lock_sock(sk);
1003 sk->sk_state = BT_CONNECTED;
1004 sk->sk_state_change(sk);
1005 bh_unlock_sock(sk);
1006 } else {
40528088
AG
1007 sco_conn_lock(conn);
1008
041987cf 1009 parent = sco_get_sock_listen(&conn->hcon->src);
40528088
AG
1010 if (!parent) {
1011 sco_conn_unlock(conn);
1012 return;
1013 }
1da177e4
LT
1014
1015 bh_lock_sock(parent);
1016
b9dbdbc1 1017 sk = sco_sock_alloc(sock_net(parent), NULL,
be7c2b99 1018 BTPROTO_SCO, GFP_ATOMIC);
1da177e4
LT
1019 if (!sk) {
1020 bh_unlock_sock(parent);
40528088
AG
1021 sco_conn_unlock(conn);
1022 return;
1da177e4
LT
1023 }
1024
1025 sco_sock_init(sk, parent);
1026
eea96364
MH
1027 bacpy(&sco_pi(sk)->src, &conn->hcon->src);
1028 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
1da177e4
LT
1029
1030 hci_conn_hold(conn->hcon);
1031 __sco_chan_add(conn, sk, parent);
1032
20714bfe
FD
1033 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
1034 sk->sk_state = BT_CONNECT2;
1035 else
1036 sk->sk_state = BT_CONNECTED;
1da177e4
LT
1037
1038 /* Wake up parent */
676d2369 1039 parent->sk_data_ready(parent);
1da177e4
LT
1040
1041 bh_unlock_sock(parent);
1da177e4 1042
40528088
AG
1043 sco_conn_unlock(conn);
1044 }
1da177e4
LT
1045}
1046
1047/* ----- SCO interface with lower layer (HCI) ----- */
20714bfe 1048int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
1da177e4 1049{
fc5fef61 1050 struct sock *sk;
71aeeaa1
MH
1051 int lm = 0;
1052
6ed93dc6 1053 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
1da177e4 1054
71aeeaa1
MH
1055 /* Find listening sockets */
1056 read_lock(&sco_sk_list.lock);
b67bfe0d 1057 sk_for_each(sk, &sco_sk_list.head) {
71aeeaa1
MH
1058 if (sk->sk_state != BT_LISTEN)
1059 continue;
1060
eea96364
MH
1061 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) ||
1062 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) {
71aeeaa1 1063 lm |= HCI_LM_ACCEPT;
20714bfe
FD
1064
1065 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
1066 *flags |= HCI_PROTO_DEFER;
71aeeaa1
MH
1067 break;
1068 }
1069 }
1070 read_unlock(&sco_sk_list.lock);
1071
1072 return lm;
1da177e4
LT
1073}
1074
9e664631 1075void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
1da177e4 1076{
6ed93dc6 1077 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
1da177e4
LT
1078 if (!status) {
1079 struct sco_conn *conn;
1080
519e42b3 1081 conn = sco_conn_add(hcon);
1da177e4
LT
1082 if (conn)
1083 sco_conn_ready(conn);
8e87d142 1084 } else
e175072f 1085 sco_conn_del(hcon, bt_to_errno(status));
1da177e4
LT
1086}
1087
9e664631 1088void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
1da177e4
LT
1089{
1090 BT_DBG("hcon %p reason %d", hcon, reason);
1091
e175072f 1092 sco_conn_del(hcon, bt_to_errno(reason));
1da177e4
LT
1093}
1094
686ebf28 1095int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
1da177e4
LT
1096{
1097 struct sco_conn *conn = hcon->sco_data;
1098
1099 if (!conn)
1100 goto drop;
1101
1102 BT_DBG("conn %p len %d", conn, skb->len);
1103
1104 if (skb->len) {
1105 sco_recv_frame(conn, skb);
1106 return 0;
1107 }
1108
1109drop:
8e87d142 1110 kfree_skb(skb);
1da177e4
LT
1111 return 0;
1112}
1113
aef7d97c 1114static int sco_debugfs_show(struct seq_file *f, void *p)
1da177e4
LT
1115{
1116 struct sock *sk;
1da177e4 1117
ee65d19e 1118 read_lock(&sco_sk_list.lock);
1da177e4 1119
b67bfe0d 1120 sk_for_each(sk, &sco_sk_list.head) {
eea96364
MH
1121 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src,
1122 &sco_pi(sk)->dst, sk->sk_state);
be9d1227 1123 }
1da177e4 1124
ee65d19e 1125 read_unlock(&sco_sk_list.lock);
1da177e4 1126
aef7d97c 1127 return 0;
1da177e4
LT
1128}
1129
aef7d97c
MH
1130static int sco_debugfs_open(struct inode *inode, struct file *file)
1131{
1132 return single_open(file, sco_debugfs_show, inode->i_private);
1133}
1134
1135static const struct file_operations sco_debugfs_fops = {
1136 .open = sco_debugfs_open,
1137 .read = seq_read,
1138 .llseek = seq_lseek,
1139 .release = single_release,
1140};
1141
1142static struct dentry *sco_debugfs;
1da177e4 1143
90ddc4f0 1144static const struct proto_ops sco_sock_ops = {
1da177e4
LT
1145 .family = PF_BLUETOOTH,
1146 .owner = THIS_MODULE,
1147 .release = sco_sock_release,
1148 .bind = sco_sock_bind,
1149 .connect = sco_sock_connect,
1150 .listen = sco_sock_listen,
1151 .accept = sco_sock_accept,
1152 .getname = sco_sock_getname,
1153 .sendmsg = sco_sock_sendmsg,
20714bfe 1154 .recvmsg = sco_sock_recvmsg,
1da177e4 1155 .poll = bt_sock_poll,
3241ad82 1156 .ioctl = bt_sock_ioctl,
1da177e4
LT
1157 .mmap = sock_no_mmap,
1158 .socketpair = sock_no_socketpair,
fd0b3ff7 1159 .shutdown = sco_sock_shutdown,
1da177e4
LT
1160 .setsockopt = sco_sock_setsockopt,
1161 .getsockopt = sco_sock_getsockopt
1162};
1163
ec1b4cf7 1164static const struct net_proto_family sco_sock_family_ops = {
1da177e4
LT
1165 .family = PF_BLUETOOTH,
1166 .owner = THIS_MODULE,
1167 .create = sco_sock_create,
1168};
1169
64274518 1170int __init sco_init(void)
1da177e4
LT
1171{
1172 int err;
1173
1174 err = proto_register(&sco_proto, 0);
1175 if (err < 0)
1176 return err;
1177
1178 err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
1179 if (err < 0) {
1180 BT_ERR("SCO socket registration failed");
1181 goto error;
1182 }
1183
b0316615 1184 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
de9b9212
MY
1185 if (err < 0) {
1186 BT_ERR("Failed to create SCO proc file");
1187 bt_sock_unregister(BTPROTO_SCO);
1188 goto error;
1189 }
1190
1da177e4
LT
1191 BT_INFO("SCO socket layer initialized");
1192
1120e4bf
MH
1193 if (IS_ERR_OR_NULL(bt_debugfs))
1194 return 0;
1195
1196 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs,
1197 NULL, &sco_debugfs_fops);
1198
1da177e4
LT
1199 return 0;
1200
1201error:
1202 proto_unregister(&sco_proto);
1203 return err;
1204}
1205
64274518 1206void __exit sco_exit(void)
1da177e4 1207{
de9b9212
MY
1208 bt_procfs_cleanup(&init_net, "sco");
1209
aef7d97c 1210 debugfs_remove(sco_debugfs);
1da177e4 1211
5e9d7f86 1212 bt_sock_unregister(BTPROTO_SCO);
1da177e4 1213
1da177e4
LT
1214 proto_unregister(&sco_proto);
1215}
1216
7cb127d5
MH
1217module_param(disable_esco, bool, 0644);
1218MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");
This page took 0.794479 seconds and 5 git commands to generate.