blob: 8244d3ae185bf614398456f889e1f9e419eeac71 [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001/*
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
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.
19
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.
23*/
24
25/* Bluetooth SCO sockets. */
26
27#include <linux/module.h>
28#include <linux/debugfs.h>
29#include <linux/seq_file.h>
30#include <linux/sched/signal.h>
31
32#include <net/bluetooth/bluetooth.h>
33#include <net/bluetooth/hci_core.h>
34#include <net/bluetooth/sco.h>
35
36static bool disable_esco;
37
38static const struct proto_ops sco_sock_ops;
39
40static struct bt_sock_list sco_sk_list = {
41 .lock = __RW_LOCK_UNLOCKED(sco_sk_list.lock)
42};
43
44/* ---- SCO connections ---- */
45struct sco_conn {
46 struct hci_conn *hcon;
47
48 spinlock_t lock;
49 struct sock *sk;
50
Olivier Deprez0e641232021-09-23 10:07:05 +020051 struct delayed_work timeout_work;
52
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000053 unsigned int mtu;
54};
55
56#define sco_conn_lock(c) spin_lock(&c->lock);
57#define sco_conn_unlock(c) spin_unlock(&c->lock);
58
59static void sco_sock_close(struct sock *sk);
60static void sco_sock_kill(struct sock *sk);
61
62/* ----- SCO socket info ----- */
63#define sco_pi(sk) ((struct sco_pinfo *) sk)
64
65struct sco_pinfo {
66 struct bt_sock bt;
67 bdaddr_t src;
68 bdaddr_t dst;
69 __u32 flags;
70 __u16 setting;
Olivier Deprez157378f2022-04-04 15:47:50 +020071 __u8 cmsg_mask;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000072 struct sco_conn *conn;
73};
74
75/* ---- SCO timers ---- */
76#define SCO_CONN_TIMEOUT (HZ * 40)
77#define SCO_DISCONN_TIMEOUT (HZ * 2)
78
Olivier Deprez0e641232021-09-23 10:07:05 +020079static void sco_sock_timeout(struct work_struct *work)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000080{
Olivier Deprez0e641232021-09-23 10:07:05 +020081 struct sco_conn *conn = container_of(work, struct sco_conn,
82 timeout_work.work);
83 struct sock *sk;
84
85 sco_conn_lock(conn);
86 sk = conn->sk;
87 if (sk)
88 sock_hold(sk);
89 sco_conn_unlock(conn);
90
91 if (!sk)
92 return;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000093
94 BT_DBG("sock %p state %d", sk, sk->sk_state);
95
96 bh_lock_sock(sk);
97 sk->sk_err = ETIMEDOUT;
98 sk->sk_state_change(sk);
99 bh_unlock_sock(sk);
100
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000101 sock_put(sk);
102}
103
104static void sco_sock_set_timer(struct sock *sk, long timeout)
105{
Olivier Deprez0e641232021-09-23 10:07:05 +0200106 if (!sco_pi(sk)->conn)
107 return;
108
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000109 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
Olivier Deprez0e641232021-09-23 10:07:05 +0200110 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work);
111 schedule_delayed_work(&sco_pi(sk)->conn->timeout_work, timeout);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000112}
113
114static void sco_sock_clear_timer(struct sock *sk)
115{
Olivier Deprez0e641232021-09-23 10:07:05 +0200116 if (!sco_pi(sk)->conn)
117 return;
118
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000119 BT_DBG("sock %p state %d", sk, sk->sk_state);
Olivier Deprez0e641232021-09-23 10:07:05 +0200120 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000121}
122
123/* ---- SCO connections ---- */
124static struct sco_conn *sco_conn_add(struct hci_conn *hcon)
125{
126 struct hci_dev *hdev = hcon->hdev;
127 struct sco_conn *conn = hcon->sco_data;
128
129 if (conn)
130 return conn;
131
132 conn = kzalloc(sizeof(struct sco_conn), GFP_KERNEL);
133 if (!conn)
134 return NULL;
135
136 spin_lock_init(&conn->lock);
Olivier Deprez157378f2022-04-04 15:47:50 +0200137 INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000138
139 hcon->sco_data = conn;
140 conn->hcon = hcon;
141
142 if (hdev->sco_mtu > 0)
143 conn->mtu = hdev->sco_mtu;
144 else
145 conn->mtu = 60;
146
147 BT_DBG("hcon %p conn %p", hcon, conn);
148
149 return conn;
150}
151
152/* Delete channel.
153 * Must be called on the locked socket. */
154static void sco_chan_del(struct sock *sk, int err)
155{
156 struct sco_conn *conn;
157
158 conn = sco_pi(sk)->conn;
159
160 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
161
162 if (conn) {
163 sco_conn_lock(conn);
164 conn->sk = NULL;
165 sco_pi(sk)->conn = NULL;
166 sco_conn_unlock(conn);
167
168 if (conn->hcon)
169 hci_conn_drop(conn->hcon);
170 }
171
172 sk->sk_state = BT_CLOSED;
173 sk->sk_err = err;
174 sk->sk_state_change(sk);
175
176 sock_set_flag(sk, SOCK_ZAPPED);
177}
178
179static void sco_conn_del(struct hci_conn *hcon, int err)
180{
181 struct sco_conn *conn = hcon->sco_data;
182 struct sock *sk;
183
184 if (!conn)
185 return;
186
187 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
188
189 /* Kill socket */
190 sco_conn_lock(conn);
191 sk = conn->sk;
192 sco_conn_unlock(conn);
193
194 if (sk) {
195 sock_hold(sk);
196 bh_lock_sock(sk);
197 sco_sock_clear_timer(sk);
198 sco_chan_del(sk, err);
199 bh_unlock_sock(sk);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000200 sock_put(sk);
201 }
202
Olivier Deprez157378f2022-04-04 15:47:50 +0200203 /* Ensure no more work items will run before freeing conn. */
204 cancel_delayed_work_sync(&conn->timeout_work);
205
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000206 hcon->sco_data = NULL;
207 kfree(conn);
208}
209
210static void __sco_chan_add(struct sco_conn *conn, struct sock *sk,
211 struct sock *parent)
212{
213 BT_DBG("conn %p", conn);
214
215 sco_pi(sk)->conn = conn;
216 conn->sk = sk;
217
218 if (parent)
David Brazdil0f672f62019-12-10 10:32:29 +0000219 bt_accept_enqueue(parent, sk, true);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000220}
221
222static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
223 struct sock *parent)
224{
225 int err = 0;
226
227 sco_conn_lock(conn);
228 if (conn->sk)
229 err = -EBUSY;
230 else
231 __sco_chan_add(conn, sk, parent);
232
233 sco_conn_unlock(conn);
234 return err;
235}
236
Olivier Deprez0e641232021-09-23 10:07:05 +0200237static int sco_connect(struct hci_dev *hdev, struct sock *sk)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000238{
239 struct sco_conn *conn;
240 struct hci_conn *hcon;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000241 int err, type;
242
243 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
244
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000245 if (lmp_esco_capable(hdev) && !disable_esco)
246 type = ESCO_LINK;
247 else
248 type = SCO_LINK;
249
250 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
Olivier Deprez0e641232021-09-23 10:07:05 +0200251 (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev)))
252 return -EOPNOTSUPP;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000253
254 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
255 sco_pi(sk)->setting);
Olivier Deprez0e641232021-09-23 10:07:05 +0200256 if (IS_ERR(hcon))
257 return PTR_ERR(hcon);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000258
259 conn = sco_conn_add(hcon);
260 if (!conn) {
261 hci_conn_drop(hcon);
Olivier Deprez0e641232021-09-23 10:07:05 +0200262 return -ENOMEM;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000263 }
264
265 /* Update source addr of the socket */
266 bacpy(&sco_pi(sk)->src, &hcon->src);
267
268 err = sco_chan_add(conn, sk, NULL);
269 if (err)
Olivier Deprez0e641232021-09-23 10:07:05 +0200270 return err;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000271
272 if (hcon->state == BT_CONNECTED) {
273 sco_sock_clear_timer(sk);
274 sk->sk_state = BT_CONNECTED;
275 } else {
276 sk->sk_state = BT_CONNECT;
277 sco_sock_set_timer(sk, sk->sk_sndtimeo);
278 }
279
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000280 return err;
281}
282
Olivier Deprez92d4c212022-12-06 15:05:30 +0100283static int sco_send_frame(struct sock *sk, struct sk_buff *skb)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000284{
285 struct sco_conn *conn = sco_pi(sk)->conn;
Olivier Deprez92d4c212022-12-06 15:05:30 +0100286 int len = skb->len;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000287
288 /* Check outgoing MTU */
289 if (len > conn->mtu)
290 return -EINVAL;
291
292 BT_DBG("sk %p len %d", sk, len);
293
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000294 hci_send_sco(conn->hcon, skb);
295
296 return len;
297}
298
299static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
300{
301 struct sock *sk;
302
303 sco_conn_lock(conn);
304 sk = conn->sk;
305 sco_conn_unlock(conn);
306
307 if (!sk)
308 goto drop;
309
310 BT_DBG("sk %p len %d", sk, skb->len);
311
312 if (sk->sk_state != BT_CONNECTED)
313 goto drop;
314
315 if (!sock_queue_rcv_skb(sk, skb))
316 return;
317
318drop:
319 kfree_skb(skb);
320}
321
322/* -------- Socket interface ---------- */
323static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
324{
325 struct sock *sk;
326
327 sk_for_each(sk, &sco_sk_list.head) {
328 if (sk->sk_state != BT_LISTEN)
329 continue;
330
331 if (!bacmp(&sco_pi(sk)->src, ba))
332 return sk;
333 }
334
335 return NULL;
336}
337
338/* Find socket listening on source bdaddr.
339 * Returns closest match.
340 */
341static struct sock *sco_get_sock_listen(bdaddr_t *src)
342{
343 struct sock *sk = NULL, *sk1 = NULL;
344
345 read_lock(&sco_sk_list.lock);
346
347 sk_for_each(sk, &sco_sk_list.head) {
348 if (sk->sk_state != BT_LISTEN)
349 continue;
350
351 /* Exact match. */
352 if (!bacmp(&sco_pi(sk)->src, src))
353 break;
354
355 /* Closest match */
356 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY))
357 sk1 = sk;
358 }
359
360 read_unlock(&sco_sk_list.lock);
361
362 return sk ? sk : sk1;
363}
364
365static void sco_sock_destruct(struct sock *sk)
366{
367 BT_DBG("sk %p", sk);
368
369 skb_queue_purge(&sk->sk_receive_queue);
370 skb_queue_purge(&sk->sk_write_queue);
371}
372
373static void sco_sock_cleanup_listen(struct sock *parent)
374{
375 struct sock *sk;
376
377 BT_DBG("parent %p", parent);
378
379 /* Close not yet accepted channels */
380 while ((sk = bt_accept_dequeue(parent, NULL))) {
381 sco_sock_close(sk);
382 sco_sock_kill(sk);
383 }
384
385 parent->sk_state = BT_CLOSED;
386 sock_set_flag(parent, SOCK_ZAPPED);
387}
388
389/* Kill socket (only if zapped and orphan)
390 * Must be called on unlocked socket.
391 */
392static void sco_sock_kill(struct sock *sk)
393{
Olivier Deprez0e641232021-09-23 10:07:05 +0200394 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000395 return;
396
397 BT_DBG("sk %p state %d", sk, sk->sk_state);
398
399 /* Kill poor orphan */
400 bt_sock_unlink(&sco_sk_list, sk);
401 sock_set_flag(sk, SOCK_DEAD);
402 sock_put(sk);
403}
404
405static void __sco_sock_close(struct sock *sk)
406{
407 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
408
409 switch (sk->sk_state) {
410 case BT_LISTEN:
411 sco_sock_cleanup_listen(sk);
412 break;
413
414 case BT_CONNECTED:
415 case BT_CONFIG:
416 if (sco_pi(sk)->conn->hcon) {
417 sk->sk_state = BT_DISCONN;
418 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
419 sco_conn_lock(sco_pi(sk)->conn);
420 hci_conn_drop(sco_pi(sk)->conn->hcon);
421 sco_pi(sk)->conn->hcon = NULL;
422 sco_conn_unlock(sco_pi(sk)->conn);
423 } else
424 sco_chan_del(sk, ECONNRESET);
425 break;
426
427 case BT_CONNECT2:
428 case BT_CONNECT:
429 case BT_DISCONN:
430 sco_chan_del(sk, ECONNRESET);
431 break;
432
433 default:
434 sock_set_flag(sk, SOCK_ZAPPED);
435 break;
436 }
437}
438
439/* Must be called on unlocked socket. */
440static void sco_sock_close(struct sock *sk)
441{
442 sco_sock_clear_timer(sk);
443 lock_sock(sk);
444 __sco_sock_close(sk);
445 release_sock(sk);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000446}
447
Olivier Deprez157378f2022-04-04 15:47:50 +0200448static void sco_skb_put_cmsg(struct sk_buff *skb, struct msghdr *msg,
449 struct sock *sk)
450{
451 if (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS)
452 put_cmsg(msg, SOL_BLUETOOTH, BT_SCM_PKT_STATUS,
453 sizeof(bt_cb(skb)->sco.pkt_status),
454 &bt_cb(skb)->sco.pkt_status);
455}
456
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000457static void sco_sock_init(struct sock *sk, struct sock *parent)
458{
459 BT_DBG("sk %p", sk);
460
461 if (parent) {
462 sk->sk_type = parent->sk_type;
463 bt_sk(sk)->flags = bt_sk(parent)->flags;
464 security_sk_clone(parent, sk);
Olivier Deprez157378f2022-04-04 15:47:50 +0200465 } else {
466 bt_sk(sk)->skb_put_cmsg = sco_skb_put_cmsg;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000467 }
468}
469
470static struct proto sco_proto = {
471 .name = "SCO",
472 .owner = THIS_MODULE,
473 .obj_size = sizeof(struct sco_pinfo)
474};
475
476static struct sock *sco_sock_alloc(struct net *net, struct socket *sock,
477 int proto, gfp_t prio, int kern)
478{
479 struct sock *sk;
480
481 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto, kern);
482 if (!sk)
483 return NULL;
484
485 sock_init_data(sock, sk);
486 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
487
488 sk->sk_destruct = sco_sock_destruct;
489 sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
490
491 sock_reset_flag(sk, SOCK_ZAPPED);
492
493 sk->sk_protocol = proto;
494 sk->sk_state = BT_OPEN;
495
496 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
497
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000498 bt_sock_link(&sco_sk_list, sk);
499 return sk;
500}
501
502static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
503 int kern)
504{
505 struct sock *sk;
506
507 BT_DBG("sock %p", sock);
508
509 sock->state = SS_UNCONNECTED;
510
511 if (sock->type != SOCK_SEQPACKET)
512 return -ESOCKTNOSUPPORT;
513
514 sock->ops = &sco_sock_ops;
515
516 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
517 if (!sk)
518 return -ENOMEM;
519
520 sco_sock_init(sk, NULL);
521 return 0;
522}
523
524static int sco_sock_bind(struct socket *sock, struct sockaddr *addr,
525 int addr_len)
526{
527 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
528 struct sock *sk = sock->sk;
529 int err = 0;
530
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000531 if (!addr || addr_len < sizeof(struct sockaddr_sco) ||
532 addr->sa_family != AF_BLUETOOTH)
533 return -EINVAL;
534
David Brazdil0f672f62019-12-10 10:32:29 +0000535 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr);
536
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000537 lock_sock(sk);
538
539 if (sk->sk_state != BT_OPEN) {
540 err = -EBADFD;
541 goto done;
542 }
543
544 if (sk->sk_type != SOCK_SEQPACKET) {
545 err = -EINVAL;
546 goto done;
547 }
548
549 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr);
550
551 sk->sk_state = BT_BOUND;
552
553done:
554 release_sock(sk);
555 return err;
556}
557
558static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
559{
560 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
561 struct sock *sk = sock->sk;
Olivier Deprez0e641232021-09-23 10:07:05 +0200562 struct hci_dev *hdev;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000563 int err;
564
565 BT_DBG("sk %p", sk);
566
567 if (alen < sizeof(struct sockaddr_sco) ||
568 addr->sa_family != AF_BLUETOOTH)
569 return -EINVAL;
570
Olivier Deprez92d4c212022-12-06 15:05:30 +0100571 lock_sock(sk);
572 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
573 err = -EBADFD;
574 goto done;
575 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000576
Olivier Deprez92d4c212022-12-06 15:05:30 +0100577 if (sk->sk_type != SOCK_SEQPACKET) {
578 err = -EINVAL;
579 goto done;
580 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000581
Olivier Deprez0e641232021-09-23 10:07:05 +0200582 hdev = hci_get_route(&sa->sco_bdaddr, &sco_pi(sk)->src, BDADDR_BREDR);
Olivier Deprez92d4c212022-12-06 15:05:30 +0100583 if (!hdev) {
584 err = -EHOSTUNREACH;
585 goto done;
586 }
Olivier Deprez0e641232021-09-23 10:07:05 +0200587 hci_dev_lock(hdev);
588
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000589 /* Set destination address and psm */
590 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
591
Olivier Deprez0e641232021-09-23 10:07:05 +0200592 err = sco_connect(hdev, sk);
593 hci_dev_unlock(hdev);
594 hci_dev_put(hdev);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000595 if (err)
596 goto done;
597
598 err = bt_sock_wait_state(sk, BT_CONNECTED,
599 sock_sndtimeo(sk, flags & O_NONBLOCK));
600
601done:
602 release_sock(sk);
603 return err;
604}
605
606static int sco_sock_listen(struct socket *sock, int backlog)
607{
608 struct sock *sk = sock->sk;
609 bdaddr_t *src = &sco_pi(sk)->src;
610 int err = 0;
611
612 BT_DBG("sk %p backlog %d", sk, backlog);
613
614 lock_sock(sk);
615
616 if (sk->sk_state != BT_BOUND) {
617 err = -EBADFD;
618 goto done;
619 }
620
621 if (sk->sk_type != SOCK_SEQPACKET) {
622 err = -EINVAL;
623 goto done;
624 }
625
626 write_lock(&sco_sk_list.lock);
627
628 if (__sco_get_sock_listen_by_addr(src)) {
629 err = -EADDRINUSE;
630 goto unlock;
631 }
632
633 sk->sk_max_ack_backlog = backlog;
634 sk->sk_ack_backlog = 0;
635
636 sk->sk_state = BT_LISTEN;
637
638unlock:
639 write_unlock(&sco_sk_list.lock);
640
641done:
642 release_sock(sk);
643 return err;
644}
645
646static int sco_sock_accept(struct socket *sock, struct socket *newsock,
647 int flags, bool kern)
648{
649 DEFINE_WAIT_FUNC(wait, woken_wake_function);
650 struct sock *sk = sock->sk, *ch;
651 long timeo;
652 int err = 0;
653
654 lock_sock(sk);
655
656 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
657
658 BT_DBG("sk %p timeo %ld", sk, timeo);
659
660 /* Wait for an incoming connection. (wake-one). */
661 add_wait_queue_exclusive(sk_sleep(sk), &wait);
662 while (1) {
663 if (sk->sk_state != BT_LISTEN) {
664 err = -EBADFD;
665 break;
666 }
667
668 ch = bt_accept_dequeue(sk, newsock);
669 if (ch)
670 break;
671
672 if (!timeo) {
673 err = -EAGAIN;
674 break;
675 }
676
677 if (signal_pending(current)) {
678 err = sock_intr_errno(timeo);
679 break;
680 }
681
682 release_sock(sk);
683
684 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
685 lock_sock(sk);
686 }
687 remove_wait_queue(sk_sleep(sk), &wait);
688
689 if (err)
690 goto done;
691
692 newsock->state = SS_CONNECTED;
693
694 BT_DBG("new socket %p", ch);
695
696done:
697 release_sock(sk);
698 return err;
699}
700
701static int sco_sock_getname(struct socket *sock, struct sockaddr *addr,
702 int peer)
703{
704 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
705 struct sock *sk = sock->sk;
706
707 BT_DBG("sock %p, sk %p", sock, sk);
708
709 addr->sa_family = AF_BLUETOOTH;
710
711 if (peer)
712 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
713 else
714 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
715
716 return sizeof(struct sockaddr_sco);
717}
718
719static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
720 size_t len)
721{
722 struct sock *sk = sock->sk;
Olivier Deprez92d4c212022-12-06 15:05:30 +0100723 struct sk_buff *skb;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000724 int err;
725
726 BT_DBG("sock %p, sk %p", sock, sk);
727
728 err = sock_error(sk);
729 if (err)
730 return err;
731
732 if (msg->msg_flags & MSG_OOB)
733 return -EOPNOTSUPP;
734
Olivier Deprez92d4c212022-12-06 15:05:30 +0100735 skb = bt_skb_sendmsg(sk, msg, len, len, 0, 0);
736 if (IS_ERR(skb))
737 return PTR_ERR(skb);
Olivier Deprez157378f2022-04-04 15:47:50 +0200738
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000739 lock_sock(sk);
740
741 if (sk->sk_state == BT_CONNECTED)
Olivier Deprez92d4c212022-12-06 15:05:30 +0100742 err = sco_send_frame(sk, skb);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000743 else
744 err = -ENOTCONN;
745
746 release_sock(sk);
Olivier Deprez92d4c212022-12-06 15:05:30 +0100747
748 if (err < 0)
749 kfree_skb(skb);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000750 return err;
751}
752
753static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
754{
755 struct hci_dev *hdev = conn->hdev;
756
757 BT_DBG("conn %p", conn);
758
759 conn->state = BT_CONFIG;
760
761 if (!lmp_esco_capable(hdev)) {
762 struct hci_cp_accept_conn_req cp;
763
764 bacpy(&cp.bdaddr, &conn->dst);
765 cp.role = 0x00; /* Ignored */
766
767 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
768 } else {
769 struct hci_cp_accept_sync_conn_req cp;
770
771 bacpy(&cp.bdaddr, &conn->dst);
772 cp.pkt_type = cpu_to_le16(conn->pkt_type);
773
774 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
775 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
776 cp.content_format = cpu_to_le16(setting);
777
778 switch (setting & SCO_AIRMODE_MASK) {
779 case SCO_AIRMODE_TRANSP:
780 if (conn->pkt_type & ESCO_2EV3)
781 cp.max_latency = cpu_to_le16(0x0008);
782 else
783 cp.max_latency = cpu_to_le16(0x000D);
784 cp.retrans_effort = 0x02;
785 break;
786 case SCO_AIRMODE_CVSD:
787 cp.max_latency = cpu_to_le16(0xffff);
788 cp.retrans_effort = 0xff;
789 break;
Olivier Deprez0e641232021-09-23 10:07:05 +0200790 default:
791 /* use CVSD settings as fallback */
792 cp.max_latency = cpu_to_le16(0xffff);
793 cp.retrans_effort = 0xff;
794 break;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000795 }
796
797 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
798 sizeof(cp), &cp);
799 }
800}
801
802static int sco_sock_recvmsg(struct socket *sock, struct msghdr *msg,
803 size_t len, int flags)
804{
805 struct sock *sk = sock->sk;
806 struct sco_pinfo *pi = sco_pi(sk);
807
808 lock_sock(sk);
809
810 if (sk->sk_state == BT_CONNECT2 &&
811 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
812 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
813 sk->sk_state = BT_CONFIG;
814
815 release_sock(sk);
816 return 0;
817 }
818
819 release_sock(sk);
820
821 return bt_sock_recvmsg(sock, msg, len, flags);
822}
823
824static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
Olivier Deprez157378f2022-04-04 15:47:50 +0200825 sockptr_t optval, unsigned int optlen)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000826{
827 struct sock *sk = sock->sk;
828 int len, err = 0;
829 struct bt_voice voice;
830 u32 opt;
831
832 BT_DBG("sk %p", sk);
833
834 lock_sock(sk);
835
836 switch (optname) {
837
838 case BT_DEFER_SETUP:
839 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
840 err = -EINVAL;
841 break;
842 }
843
Olivier Deprez157378f2022-04-04 15:47:50 +0200844 if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000845 err = -EFAULT;
846 break;
847 }
848
849 if (opt)
850 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
851 else
852 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
853 break;
854
855 case BT_VOICE:
856 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
857 sk->sk_state != BT_CONNECT2) {
858 err = -EINVAL;
859 break;
860 }
861
862 voice.setting = sco_pi(sk)->setting;
863
864 len = min_t(unsigned int, sizeof(voice), optlen);
Olivier Deprez157378f2022-04-04 15:47:50 +0200865 if (copy_from_sockptr(&voice, optval, len)) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000866 err = -EFAULT;
867 break;
868 }
869
870 /* Explicitly check for these values */
871 if (voice.setting != BT_VOICE_TRANSPARENT &&
872 voice.setting != BT_VOICE_CVSD_16BIT) {
873 err = -EINVAL;
874 break;
875 }
876
877 sco_pi(sk)->setting = voice.setting;
878 break;
879
Olivier Deprez157378f2022-04-04 15:47:50 +0200880 case BT_PKT_STATUS:
881 if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
882 err = -EFAULT;
883 break;
884 }
885
886 if (opt)
887 sco_pi(sk)->cmsg_mask |= SCO_CMSG_PKT_STATUS;
888 else
889 sco_pi(sk)->cmsg_mask &= SCO_CMSG_PKT_STATUS;
890 break;
891
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000892 default:
893 err = -ENOPROTOOPT;
894 break;
895 }
896
897 release_sock(sk);
898 return err;
899}
900
901static int sco_sock_getsockopt_old(struct socket *sock, int optname,
902 char __user *optval, int __user *optlen)
903{
904 struct sock *sk = sock->sk;
905 struct sco_options opts;
906 struct sco_conninfo cinfo;
907 int len, err = 0;
908
909 BT_DBG("sk %p", sk);
910
911 if (get_user(len, optlen))
912 return -EFAULT;
913
914 lock_sock(sk);
915
916 switch (optname) {
917 case SCO_OPTIONS:
918 if (sk->sk_state != BT_CONNECTED &&
919 !(sk->sk_state == BT_CONNECT2 &&
920 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
921 err = -ENOTCONN;
922 break;
923 }
924
925 opts.mtu = sco_pi(sk)->conn->mtu;
926
927 BT_DBG("mtu %d", opts.mtu);
928
929 len = min_t(unsigned int, len, sizeof(opts));
930 if (copy_to_user(optval, (char *)&opts, len))
931 err = -EFAULT;
932
933 break;
934
935 case SCO_CONNINFO:
936 if (sk->sk_state != BT_CONNECTED &&
937 !(sk->sk_state == BT_CONNECT2 &&
938 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
939 err = -ENOTCONN;
940 break;
941 }
942
943 memset(&cinfo, 0, sizeof(cinfo));
944 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
945 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
946
947 len = min_t(unsigned int, len, sizeof(cinfo));
948 if (copy_to_user(optval, (char *)&cinfo, len))
949 err = -EFAULT;
950
951 break;
952
953 default:
954 err = -ENOPROTOOPT;
955 break;
956 }
957
958 release_sock(sk);
959 return err;
960}
961
962static int sco_sock_getsockopt(struct socket *sock, int level, int optname,
963 char __user *optval, int __user *optlen)
964{
965 struct sock *sk = sock->sk;
966 int len, err = 0;
967 struct bt_voice voice;
Olivier Deprez157378f2022-04-04 15:47:50 +0200968 u32 phys;
969 int pkt_status;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000970
971 BT_DBG("sk %p", sk);
972
973 if (level == SOL_SCO)
974 return sco_sock_getsockopt_old(sock, optname, optval, optlen);
975
976 if (get_user(len, optlen))
977 return -EFAULT;
978
979 lock_sock(sk);
980
981 switch (optname) {
982
983 case BT_DEFER_SETUP:
984 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
985 err = -EINVAL;
986 break;
987 }
988
989 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
990 (u32 __user *)optval))
991 err = -EFAULT;
992
993 break;
994
995 case BT_VOICE:
996 voice.setting = sco_pi(sk)->setting;
997
998 len = min_t(unsigned int, len, sizeof(voice));
999 if (copy_to_user(optval, (char *)&voice, len))
1000 err = -EFAULT;
1001
1002 break;
1003
Olivier Deprez157378f2022-04-04 15:47:50 +02001004 case BT_PHY:
1005 if (sk->sk_state != BT_CONNECTED) {
1006 err = -ENOTCONN;
1007 break;
1008 }
1009
1010 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon);
1011
1012 if (put_user(phys, (u32 __user *) optval))
1013 err = -EFAULT;
1014 break;
1015
1016 case BT_PKT_STATUS:
1017 pkt_status = (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS);
1018
1019 if (put_user(pkt_status, (int __user *)optval))
1020 err = -EFAULT;
1021 break;
1022
1023 case BT_SNDMTU:
1024 case BT_RCVMTU:
1025 if (sk->sk_state != BT_CONNECTED) {
1026 err = -ENOTCONN;
1027 break;
1028 }
1029
1030 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval))
1031 err = -EFAULT;
1032 break;
1033
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001034 default:
1035 err = -ENOPROTOOPT;
1036 break;
1037 }
1038
1039 release_sock(sk);
1040 return err;
1041}
1042
1043static int sco_sock_shutdown(struct socket *sock, int how)
1044{
1045 struct sock *sk = sock->sk;
1046 int err = 0;
1047
1048 BT_DBG("sock %p, sk %p", sock, sk);
1049
1050 if (!sk)
1051 return 0;
1052
1053 sock_hold(sk);
1054 lock_sock(sk);
1055
1056 if (!sk->sk_shutdown) {
1057 sk->sk_shutdown = SHUTDOWN_MASK;
1058 sco_sock_clear_timer(sk);
1059 __sco_sock_close(sk);
1060
1061 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1062 !(current->flags & PF_EXITING))
1063 err = bt_sock_wait_state(sk, BT_CLOSED,
1064 sk->sk_lingertime);
1065 }
1066
1067 release_sock(sk);
1068 sock_put(sk);
1069
1070 return err;
1071}
1072
1073static int sco_sock_release(struct socket *sock)
1074{
1075 struct sock *sk = sock->sk;
1076 int err = 0;
1077
1078 BT_DBG("sock %p, sk %p", sock, sk);
1079
1080 if (!sk)
1081 return 0;
1082
1083 sco_sock_close(sk);
1084
1085 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1086 !(current->flags & PF_EXITING)) {
1087 lock_sock(sk);
1088 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
1089 release_sock(sk);
1090 }
1091
1092 sock_orphan(sk);
1093 sco_sock_kill(sk);
1094 return err;
1095}
1096
1097static void sco_conn_ready(struct sco_conn *conn)
1098{
1099 struct sock *parent;
1100 struct sock *sk = conn->sk;
1101
1102 BT_DBG("conn %p", conn);
1103
1104 if (sk) {
1105 sco_sock_clear_timer(sk);
1106 bh_lock_sock(sk);
1107 sk->sk_state = BT_CONNECTED;
1108 sk->sk_state_change(sk);
1109 bh_unlock_sock(sk);
1110 } else {
1111 sco_conn_lock(conn);
1112
1113 if (!conn->hcon) {
1114 sco_conn_unlock(conn);
1115 return;
1116 }
1117
1118 parent = sco_get_sock_listen(&conn->hcon->src);
1119 if (!parent) {
1120 sco_conn_unlock(conn);
1121 return;
1122 }
1123
1124 bh_lock_sock(parent);
1125
1126 sk = sco_sock_alloc(sock_net(parent), NULL,
1127 BTPROTO_SCO, GFP_ATOMIC, 0);
1128 if (!sk) {
1129 bh_unlock_sock(parent);
1130 sco_conn_unlock(conn);
1131 return;
1132 }
1133
1134 sco_sock_init(sk, parent);
1135
1136 bacpy(&sco_pi(sk)->src, &conn->hcon->src);
1137 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
1138
1139 hci_conn_hold(conn->hcon);
1140 __sco_chan_add(conn, sk, parent);
1141
1142 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
1143 sk->sk_state = BT_CONNECT2;
1144 else
1145 sk->sk_state = BT_CONNECTED;
1146
1147 /* Wake up parent */
1148 parent->sk_data_ready(parent);
1149
1150 bh_unlock_sock(parent);
1151
1152 sco_conn_unlock(conn);
1153 }
1154}
1155
1156/* ----- SCO interface with lower layer (HCI) ----- */
1157int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
1158{
1159 struct sock *sk;
1160 int lm = 0;
1161
1162 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
1163
1164 /* Find listening sockets */
1165 read_lock(&sco_sk_list.lock);
1166 sk_for_each(sk, &sco_sk_list.head) {
1167 if (sk->sk_state != BT_LISTEN)
1168 continue;
1169
1170 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) ||
1171 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) {
1172 lm |= HCI_LM_ACCEPT;
1173
1174 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
1175 *flags |= HCI_PROTO_DEFER;
1176 break;
1177 }
1178 }
1179 read_unlock(&sco_sk_list.lock);
1180
1181 return lm;
1182}
1183
1184static void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
1185{
1186 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1187 return;
1188
1189 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
1190
1191 if (!status) {
1192 struct sco_conn *conn;
1193
1194 conn = sco_conn_add(hcon);
1195 if (conn)
1196 sco_conn_ready(conn);
1197 } else
1198 sco_conn_del(hcon, bt_to_errno(status));
1199}
1200
1201static void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
1202{
1203 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1204 return;
1205
1206 BT_DBG("hcon %p reason %d", hcon, reason);
1207
1208 sco_conn_del(hcon, bt_to_errno(reason));
1209}
1210
1211void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
1212{
1213 struct sco_conn *conn = hcon->sco_data;
1214
1215 if (!conn)
1216 goto drop;
1217
1218 BT_DBG("conn %p len %d", conn, skb->len);
1219
1220 if (skb->len) {
1221 sco_recv_frame(conn, skb);
1222 return;
1223 }
1224
1225drop:
1226 kfree_skb(skb);
1227}
1228
1229static struct hci_cb sco_cb = {
1230 .name = "SCO",
1231 .connect_cfm = sco_connect_cfm,
1232 .disconn_cfm = sco_disconn_cfm,
1233};
1234
1235static int sco_debugfs_show(struct seq_file *f, void *p)
1236{
1237 struct sock *sk;
1238
1239 read_lock(&sco_sk_list.lock);
1240
1241 sk_for_each(sk, &sco_sk_list.head) {
1242 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src,
1243 &sco_pi(sk)->dst, sk->sk_state);
1244 }
1245
1246 read_unlock(&sco_sk_list.lock);
1247
1248 return 0;
1249}
1250
David Brazdil0f672f62019-12-10 10:32:29 +00001251DEFINE_SHOW_ATTRIBUTE(sco_debugfs);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001252
1253static struct dentry *sco_debugfs;
1254
1255static const struct proto_ops sco_sock_ops = {
1256 .family = PF_BLUETOOTH,
1257 .owner = THIS_MODULE,
1258 .release = sco_sock_release,
1259 .bind = sco_sock_bind,
1260 .connect = sco_sock_connect,
1261 .listen = sco_sock_listen,
1262 .accept = sco_sock_accept,
1263 .getname = sco_sock_getname,
1264 .sendmsg = sco_sock_sendmsg,
1265 .recvmsg = sco_sock_recvmsg,
1266 .poll = bt_sock_poll,
1267 .ioctl = bt_sock_ioctl,
David Brazdil0f672f62019-12-10 10:32:29 +00001268 .gettstamp = sock_gettstamp,
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001269 .mmap = sock_no_mmap,
1270 .socketpair = sock_no_socketpair,
1271 .shutdown = sco_sock_shutdown,
1272 .setsockopt = sco_sock_setsockopt,
1273 .getsockopt = sco_sock_getsockopt
1274};
1275
1276static const struct net_proto_family sco_sock_family_ops = {
1277 .family = PF_BLUETOOTH,
1278 .owner = THIS_MODULE,
1279 .create = sco_sock_create,
1280};
1281
1282int __init sco_init(void)
1283{
1284 int err;
1285
1286 BUILD_BUG_ON(sizeof(struct sockaddr_sco) > sizeof(struct sockaddr));
1287
1288 err = proto_register(&sco_proto, 0);
1289 if (err < 0)
1290 return err;
1291
1292 err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
1293 if (err < 0) {
1294 BT_ERR("SCO socket registration failed");
1295 goto error;
1296 }
1297
1298 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
1299 if (err < 0) {
1300 BT_ERR("Failed to create SCO proc file");
1301 bt_sock_unregister(BTPROTO_SCO);
1302 goto error;
1303 }
1304
1305 BT_INFO("SCO socket layer initialized");
1306
1307 hci_register_cb(&sco_cb);
1308
1309 if (IS_ERR_OR_NULL(bt_debugfs))
1310 return 0;
1311
1312 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs,
1313 NULL, &sco_debugfs_fops);
1314
1315 return 0;
1316
1317error:
1318 proto_unregister(&sco_proto);
1319 return err;
1320}
1321
1322void sco_exit(void)
1323{
1324 bt_procfs_cleanup(&init_net, "sco");
1325
1326 debugfs_remove(sco_debugfs);
1327
1328 hci_unregister_cb(&sco_cb);
1329
1330 bt_sock_unregister(BTPROTO_SCO);
1331
1332 proto_unregister(&sco_proto);
1333}
1334
1335module_param(disable_esco, bool, 0644);
1336MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");