blob: 413b8ee49feca325dea79e328c11b8ba00afbce3 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 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
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 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
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth SCO sockets. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <linux/module.h>
Marcel Holtmannaef7d972010-03-21 05:27:45 +010028#include <linux/debugfs.h>
29#include <linux/seq_file.h>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010030#include <linux/sched/signal.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031
32#include <net/bluetooth/bluetooth.h>
33#include <net/bluetooth/hci_core.h>
34#include <net/bluetooth/sco.h>
35
Rusty Russelleb939922011-12-19 14:08:01 +000036static bool disable_esco;
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080038static const struct proto_ops sco_sock_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070039
40static struct bt_sock_list sco_sk_list = {
Robert P. J. Dayd5fb2962008-03-28 16:17:38 -070041 .lock = __RW_LOCK_UNLOCKED(sco_sk_list.lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -070042};
43
Marcel Holtmannfc8f5252014-07-11 06:19:42 +020044/* ---- SCO connections ---- */
45struct sco_conn {
46 struct hci_conn *hcon;
47
48 spinlock_t lock;
49 struct sock *sk;
50
51 unsigned int mtu;
52};
53
54#define sco_conn_lock(c) spin_lock(&c->lock);
55#define sco_conn_unlock(c) spin_unlock(&c->lock);
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static void sco_sock_close(struct sock *sk);
58static void sco_sock_kill(struct sock *sk);
59
Marcel Holtmann2a0dccb2014-07-11 06:19:41 +020060/* ----- SCO socket info ----- */
61#define sco_pi(sk) ((struct sco_pinfo *) sk)
62
63struct sco_pinfo {
64 struct bt_sock bt;
65 bdaddr_t src;
66 bdaddr_t dst;
67 __u32 flags;
68 __u16 setting;
69 struct sco_conn *conn;
70};
71
Linus Torvalds1da177e2005-04-16 15:20:36 -070072/* ---- SCO timers ---- */
Marcel Holtmann068d69e2014-07-11 06:19:44 +020073#define SCO_CONN_TIMEOUT (HZ * 40)
74#define SCO_DISCONN_TIMEOUT (HZ * 2)
75
Kees Cooke99e88a2017-10-16 14:43:17 -070076static void sco_sock_timeout(struct timer_list *t)
Linus Torvalds1da177e2005-04-16 15:20:36 -070077{
Kees Cooke99e88a2017-10-16 14:43:17 -070078 struct sock *sk = from_timer(sk, t, sk_timer);
Linus Torvalds1da177e2005-04-16 15:20:36 -070079
80 BT_DBG("sock %p state %d", sk, sk->sk_state);
81
82 bh_lock_sock(sk);
83 sk->sk_err = ETIMEDOUT;
84 sk->sk_state_change(sk);
85 bh_unlock_sock(sk);
86
87 sco_sock_kill(sk);
88 sock_put(sk);
89}
90
91static void sco_sock_set_timer(struct sock *sk, long timeout)
92{
93 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
94 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
95}
96
97static void sco_sock_clear_timer(struct sock *sk)
98{
99 BT_DBG("sock %p state %d", sk, sk->sk_state);
100 sk_stop_timer(sk, &sk->sk_timer);
101}
102
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103/* ---- SCO connections ---- */
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200104static struct sco_conn *sco_conn_add(struct hci_conn *hcon)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105{
106 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200107 struct sco_conn *conn = hcon->sco_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200109 if (conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110 return conn;
111
Claudio Takahasic10cc5a2013-04-11 11:35:45 -0300112 conn = kzalloc(sizeof(struct sco_conn), GFP_KERNEL);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200113 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115
116 spin_lock_init(&conn->lock);
117
118 hcon->sco_data = conn;
119 conn->hcon = hcon;
120
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 if (hdev->sco_mtu > 0)
122 conn->mtu = hdev->sco_mtu;
123 else
124 conn->mtu = 60;
125
126 BT_DBG("hcon %p conn %p", hcon, conn);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200127
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128 return conn;
129}
130
Marcel Holtmanne03ab512014-07-13 19:54:49 +0200131/* Delete channel.
132 * Must be called on the locked socket. */
133static void sco_chan_del(struct sock *sk, int err)
134{
135 struct sco_conn *conn;
136
137 conn = sco_pi(sk)->conn;
138
139 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
140
141 if (conn) {
142 sco_conn_lock(conn);
143 conn->sk = NULL;
144 sco_pi(sk)->conn = NULL;
145 sco_conn_unlock(conn);
146
147 if (conn->hcon)
148 hci_conn_drop(conn->hcon);
149 }
150
151 sk->sk_state = BT_CLOSED;
152 sk->sk_err = err;
153 sk->sk_state_change(sk);
154
155 sock_set_flag(sk, SOCK_ZAPPED);
156}
157
Nicholas Krausedf945362015-08-18 21:23:01 -0400158static void sco_conn_del(struct hci_conn *hcon, int err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200160 struct sco_conn *conn = hcon->sco_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161 struct sock *sk;
162
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200163 if (!conn)
Nicholas Krausedf945362015-08-18 21:23:01 -0400164 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165
166 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
167
168 /* Kill socket */
Marcel Holtmanneb5a4de2014-07-14 01:30:15 +0200169 sco_conn_lock(conn);
170 sk = conn->sk;
171 sco_conn_unlock(conn);
172
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200173 if (sk) {
Kuba Pawlak75e34f52015-10-05 18:44:15 +0200174 sock_hold(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175 bh_lock_sock(sk);
176 sco_sock_clear_timer(sk);
177 sco_chan_del(sk, err);
178 bh_unlock_sock(sk);
179 sco_sock_kill(sk);
Kuba Pawlak75e34f52015-10-05 18:44:15 +0200180 sock_put(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181 }
182
183 hcon->sco_data = NULL;
184 kfree(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185}
186
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100187static void __sco_chan_add(struct sco_conn *conn, struct sock *sk,
188 struct sock *parent)
Marcel Holtmann015b01c2014-07-13 19:54:48 +0200189{
190 BT_DBG("conn %p", conn);
191
192 sco_pi(sk)->conn = conn;
193 conn->sk = sk;
194
195 if (parent)
196 bt_accept_enqueue(parent, sk);
197}
198
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300199static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
200 struct sock *parent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201{
202 int err = 0;
203
204 sco_conn_lock(conn);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300205 if (conn->sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206 err = -EBUSY;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300207 else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208 __sco_chan_add(conn, sk, parent);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300209
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210 sco_conn_unlock(conn);
211 return err;
212}
213
214static int sco_connect(struct sock *sk)
215{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216 struct sco_conn *conn;
217 struct hci_conn *hcon;
218 struct hci_dev *hdev;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200219 int err, type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220
Marcel Holtmanneea96362013-10-13 10:34:01 -0700221 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222
Johan Hedberg39385cb2016-11-12 17:03:07 +0200223 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR);
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200224 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225 return -EHOSTUNREACH;
226
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300227 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228
Marcel Holtmann7cb127d2008-07-14 20:13:53 +0200229 if (lmp_esco_capable(hdev) && !disable_esco)
230 type = ESCO_LINK;
231 else
232 type = SCO_LINK;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200233
Frédéric Dalleau79dc0082013-08-19 14:24:01 +0200234 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
235 (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
236 err = -EOPNOTSUPP;
237 goto done;
238 }
239
Marcel Holtmanneea96362013-10-13 10:34:01 -0700240 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
Marcel Holtmann041987c2013-10-13 10:15:22 -0700241 sco_pi(sk)->setting);
Ville Tervo30e76272011-02-22 16:10:53 -0300242 if (IS_ERR(hcon)) {
243 err = PTR_ERR(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244 goto done;
Ville Tervo30e76272011-02-22 16:10:53 -0300245 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200247 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248 if (!conn) {
David Herrmann76a68ba2013-04-06 20:28:37 +0200249 hci_conn_drop(hcon);
Ville Tervo30e76272011-02-22 16:10:53 -0300250 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 goto done;
252 }
253
254 /* Update source addr of the socket */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700255 bacpy(&sco_pi(sk)->src, &hcon->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256
257 err = sco_chan_add(conn, sk, NULL);
258 if (err)
259 goto done;
260
261 if (hcon->state == BT_CONNECTED) {
262 sco_sock_clear_timer(sk);
263 sk->sk_state = BT_CONNECTED;
264 } else {
265 sk->sk_state = BT_CONNECT;
266 sco_sock_set_timer(sk, sk->sk_sndtimeo);
267 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200268
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269done:
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300270 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 hci_dev_put(hdev);
272 return err;
273}
274
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300275static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276{
277 struct sco_conn *conn = sco_pi(sk)->conn;
278 struct sk_buff *skb;
Mikel Astiz088ce082012-04-11 08:48:48 +0200279 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280
281 /* Check outgoing MTU */
282 if (len > conn->mtu)
283 return -EINVAL;
284
285 BT_DBG("sk %p len %d", sk, len);
286
Mikel Astiz088ce082012-04-11 08:48:48 +0200287 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300288 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 return err;
290
Al Viro6ce8e9c2014-04-06 21:25:44 -0400291 if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300292 kfree_skb(skb);
293 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294 }
295
Gustavo F. Padovan0d861d82010-05-01 16:15:35 -0300296 hci_send_sco(conn->hcon, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297
Mikel Astiz088ce082012-04-11 08:48:48 +0200298 return len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299}
300
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300301static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302{
Marcel Holtmanneb5a4de2014-07-14 01:30:15 +0200303 struct sock *sk;
304
305 sco_conn_lock(conn);
306 sk = conn->sk;
307 sco_conn_unlock(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308
309 if (!sk)
310 goto drop;
311
312 BT_DBG("sk %p len %d", sk, skb->len);
313
314 if (sk->sk_state != BT_CONNECTED)
315 goto drop;
316
317 if (!sock_queue_rcv_skb(sk, skb))
318 return;
319
320drop:
321 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322}
323
324/* -------- Socket interface ---------- */
Marcel Holtmannfb334052012-04-19 14:37:58 +0200325static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326{
Marcel Holtmannfb334052012-04-19 14:37:58 +0200327 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328
Sasha Levinb67bfe02013-02-27 17:06:00 -0800329 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmannfb334052012-04-19 14:37:58 +0200330 if (sk->sk_state != BT_LISTEN)
331 continue;
332
Marcel Holtmanneea96362013-10-13 10:34:01 -0700333 if (!bacmp(&sco_pi(sk)->src, ba))
Marcel Holtmannfb334052012-04-19 14:37:58 +0200334 return sk;
335 }
336
337 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338}
339
340/* Find socket listening on source bdaddr.
341 * Returns closest match.
342 */
343static struct sock *sco_get_sock_listen(bdaddr_t *src)
344{
345 struct sock *sk = NULL, *sk1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346
347 read_lock(&sco_sk_list.lock);
348
Sasha Levinb67bfe02013-02-27 17:06:00 -0800349 sk_for_each(sk, &sco_sk_list.head) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350 if (sk->sk_state != BT_LISTEN)
351 continue;
352
353 /* Exact match. */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700354 if (!bacmp(&sco_pi(sk)->src, src))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355 break;
356
357 /* Closest match */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700358 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359 sk1 = sk;
360 }
361
362 read_unlock(&sco_sk_list.lock);
363
Sasha Levinb67bfe02013-02-27 17:06:00 -0800364 return sk ? sk : sk1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365}
366
367static void sco_sock_destruct(struct sock *sk)
368{
369 BT_DBG("sk %p", sk);
370
371 skb_queue_purge(&sk->sk_receive_queue);
372 skb_queue_purge(&sk->sk_write_queue);
373}
374
375static void sco_sock_cleanup_listen(struct sock *parent)
376{
377 struct sock *sk;
378
379 BT_DBG("parent %p", parent);
380
381 /* Close not yet accepted channels */
382 while ((sk = bt_accept_dequeue(parent, NULL))) {
383 sco_sock_close(sk);
384 sco_sock_kill(sk);
385 }
386
387 parent->sk_state = BT_CLOSED;
388 sock_set_flag(parent, SOCK_ZAPPED);
389}
390
391/* Kill socket (only if zapped and orphan)
392 * Must be called on unlocked socket.
393 */
394static void sco_sock_kill(struct sock *sk)
395{
396 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
397 return;
398
399 BT_DBG("sk %p state %d", sk, sk->sk_state);
400
401 /* Kill poor orphan */
402 bt_sock_unlink(&sco_sk_list, sk);
403 sock_set_flag(sk, SOCK_DEAD);
404 sock_put(sk);
405}
406
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200407static void __sco_sock_close(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408{
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200409 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410
411 switch (sk->sk_state) {
412 case BT_LISTEN:
413 sco_sock_cleanup_listen(sk);
414 break;
415
416 case BT_CONNECTED:
417 case BT_CONFIG:
Gustavo Padovanb7e98b52013-01-03 19:59:28 -0200418 if (sco_pi(sk)->conn->hcon) {
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300419 sk->sk_state = BT_DISCONN;
420 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
Kuba Pawlak435c5132015-10-05 18:44:16 +0200421 sco_conn_lock(sco_pi(sk)->conn);
David Herrmann76a68ba2013-04-06 20:28:37 +0200422 hci_conn_drop(sco_pi(sk)->conn->hcon);
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300423 sco_pi(sk)->conn->hcon = NULL;
Kuba Pawlak435c5132015-10-05 18:44:16 +0200424 sco_conn_unlock(sco_pi(sk)->conn);
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300425 } else
426 sco_chan_del(sk, ECONNRESET);
427 break;
428
Vinicius Costa Gomeseb20ff92013-03-13 19:46:20 -0300429 case BT_CONNECT2:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430 case BT_CONNECT:
431 case BT_DISCONN:
432 sco_chan_del(sk, ECONNRESET);
433 break;
434
435 default:
436 sock_set_flag(sk, SOCK_ZAPPED);
437 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -0700438 }
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200439}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200441/* Must be called on unlocked socket. */
442static void sco_sock_close(struct sock *sk)
443{
444 sco_sock_clear_timer(sk);
445 lock_sock(sk);
446 __sco_sock_close(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 sco_sock_kill(sk);
449}
450
451static void sco_sock_init(struct sock *sk, struct sock *parent)
452{
453 BT_DBG("sk %p", sk);
454
Paul Moore6230c9b2011-10-07 09:40:59 +0000455 if (parent) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 sk->sk_type = parent->sk_type;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100457 bt_sk(sk)->flags = bt_sk(parent)->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000458 security_sk_clone(parent, sk);
459 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460}
461
462static struct proto sco_proto = {
463 .name = "SCO",
464 .owner = THIS_MODULE,
465 .obj_size = sizeof(struct sco_pinfo)
466};
467
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100468static struct sock *sco_sock_alloc(struct net *net, struct socket *sock,
469 int proto, gfp_t prio, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470{
471 struct sock *sk;
472
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500473 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700474 if (!sk)
475 return NULL;
476
477 sock_init_data(sock, sk);
478 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
479
480 sk->sk_destruct = sco_sock_destruct;
481 sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
482
483 sock_reset_flag(sk, SOCK_ZAPPED);
484
485 sk->sk_protocol = proto;
486 sk->sk_state = BT_OPEN;
487
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200488 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
489
Kees Cooke99e88a2017-10-16 14:43:17 -0700490 timer_setup(&sk->sk_timer, sco_sock_timeout, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491
492 bt_sock_link(&sco_sk_list, sk);
493 return sk;
494}
495
Eric Paris3f378b62009-11-05 22:18:14 -0800496static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
497 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498{
499 struct sock *sk;
500
501 BT_DBG("sock %p", sock);
502
503 sock->state = SS_UNCONNECTED;
504
505 if (sock->type != SOCK_SEQPACKET)
506 return -ESOCKTNOSUPPORT;
507
508 sock->ops = &sco_sock_ops;
509
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500510 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Marcel Holtmann74da6262006-10-15 17:31:14 +0200511 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 return -ENOMEM;
513
514 sco_sock_init(sk, NULL);
515 return 0;
516}
517
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100518static int sco_sock_bind(struct socket *sock, struct sockaddr *addr,
519 int addr_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520{
521 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
522 struct sock *sk = sock->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523 int err = 0;
524
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +0300525 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526
Mateusz Jurczykd2ecfa72017-06-29 14:04:59 +0200527 if (!addr || addr_len < sizeof(struct sockaddr_sco) ||
528 addr->sa_family != AF_BLUETOOTH)
David S. Miller52332522015-12-15 15:39:08 -0500529 return -EINVAL;
530
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 lock_sock(sk);
532
533 if (sk->sk_state != BT_OPEN) {
534 err = -EBADFD;
535 goto done;
536 }
537
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200538 if (sk->sk_type != SOCK_SEQPACKET) {
539 err = -EINVAL;
540 goto done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 }
542
Marcel Holtmanneea96362013-10-13 10:34:01 -0700543 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr);
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200544
545 sk->sk_state = BT_BOUND;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546
547done:
548 release_sock(sk);
549 return err;
550}
551
552static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
553{
554 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
555 struct sock *sk = sock->sk;
Claudio Takahasi92f185c2013-04-11 11:35:46 -0300556 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557
558 BT_DBG("sk %p", sk);
559
Changli Gao6503d962010-03-31 22:58:26 +0000560 if (alen < sizeof(struct sockaddr_sco) ||
561 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 return -EINVAL;
563
564 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
565 return -EBADFD;
566
567 if (sk->sk_type != SOCK_SEQPACKET)
568 return -EINVAL;
569
570 lock_sock(sk);
571
572 /* Set destination address and psm */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700573 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200575 err = sco_connect(sk);
576 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 goto done;
578
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900579 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300580 sock_sndtimeo(sk, flags & O_NONBLOCK));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581
582done:
583 release_sock(sk);
584 return err;
585}
586
587static int sco_sock_listen(struct socket *sock, int backlog)
588{
589 struct sock *sk = sock->sk;
Marcel Holtmanneea96362013-10-13 10:34:01 -0700590 bdaddr_t *src = &sco_pi(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700591 int err = 0;
592
593 BT_DBG("sk %p backlog %d", sk, backlog);
594
595 lock_sock(sk);
596
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200597 if (sk->sk_state != BT_BOUND) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 err = -EBADFD;
599 goto done;
600 }
601
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200602 if (sk->sk_type != SOCK_SEQPACKET) {
603 err = -EINVAL;
604 goto done;
605 }
606
Marcel Holtmannfb334052012-04-19 14:37:58 +0200607 write_lock(&sco_sk_list.lock);
608
609 if (__sco_get_sock_listen_by_addr(src)) {
610 err = -EADDRINUSE;
611 goto unlock;
612 }
613
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 sk->sk_max_ack_backlog = backlog;
615 sk->sk_ack_backlog = 0;
Marcel Holtmannfb334052012-04-19 14:37:58 +0200616
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617 sk->sk_state = BT_LISTEN;
618
Marcel Holtmannfb334052012-04-19 14:37:58 +0200619unlock:
620 write_unlock(&sco_sk_list.lock);
621
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622done:
623 release_sock(sk);
624 return err;
625}
626
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100627static int sco_sock_accept(struct socket *sock, struct socket *newsock,
David Howellscdfbabf2017-03-09 08:09:05 +0000628 int flags, bool kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500630 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631 struct sock *sk = sock->sk, *ch;
632 long timeo;
633 int err = 0;
634
635 lock_sock(sk);
636
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
638
639 BT_DBG("sk %p timeo %ld", sk, timeo);
640
641 /* Wait for an incoming connection. (wake-one). */
Eric Dumazetaa395142010-04-20 13:03:51 +0000642 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurley552b0d32011-07-24 00:11:01 -0400643 while (1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644 if (sk->sk_state != BT_LISTEN) {
645 err = -EBADFD;
646 break;
647 }
648
Peter Hurley552b0d32011-07-24 00:11:01 -0400649 ch = bt_accept_dequeue(sk, newsock);
650 if (ch)
651 break;
652
653 if (!timeo) {
654 err = -EAGAIN;
655 break;
656 }
657
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658 if (signal_pending(current)) {
659 err = sock_intr_errno(timeo);
660 break;
661 }
Peter Hurley552b0d32011-07-24 00:11:01 -0400662
663 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500664
665 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
Peter Hurley552b0d32011-07-24 00:11:01 -0400666 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667 }
Eric Dumazetaa395142010-04-20 13:03:51 +0000668 remove_wait_queue(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669
670 if (err)
671 goto done;
672
673 newsock->state = SS_CONNECTED;
674
675 BT_DBG("new socket %p", ch);
676
677done:
678 release_sock(sk);
679 return err;
680}
681
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100682static int sco_sock_getname(struct socket *sock, struct sockaddr *addr,
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100683 int peer)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684{
685 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
686 struct sock *sk = sock->sk;
687
688 BT_DBG("sock %p, sk %p", sock, sk);
689
690 addr->sa_family = AF_BLUETOOTH;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691
692 if (peer)
Marcel Holtmanneea96362013-10-13 10:34:01 -0700693 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 else
Marcel Holtmanneea96362013-10-13 10:34:01 -0700695 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100697 return sizeof(struct sockaddr_sco);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698}
699
Ying Xue1b784142015-03-02 15:37:48 +0800700static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
701 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702{
703 struct sock *sk = sock->sk;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300704 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705
706 BT_DBG("sock %p, sk %p", sock, sk);
707
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -0800708 err = sock_error(sk);
709 if (err)
710 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711
712 if (msg->msg_flags & MSG_OOB)
713 return -EOPNOTSUPP;
714
715 lock_sock(sk);
716
717 if (sk->sk_state == BT_CONNECTED)
718 err = sco_send_frame(sk, msg, len);
719 else
720 err = -ENOTCONN;
721
722 release_sock(sk);
723 return err;
724}
725
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200726static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200727{
728 struct hci_dev *hdev = conn->hdev;
729
730 BT_DBG("conn %p", conn);
731
732 conn->state = BT_CONFIG;
733
734 if (!lmp_esco_capable(hdev)) {
735 struct hci_cp_accept_conn_req cp;
736
737 bacpy(&cp.bdaddr, &conn->dst);
Frédéric Dalleau33f24042013-08-19 14:23:55 +0200738 cp.role = 0x00; /* Ignored */
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200739
740 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
741 } else {
742 struct hci_cp_accept_sync_conn_req cp;
743
744 bacpy(&cp.bdaddr, &conn->dst);
745 cp.pkt_type = cpu_to_le16(conn->pkt_type);
746
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700747 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
748 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200749 cp.content_format = cpu_to_le16(setting);
750
751 switch (setting & SCO_AIRMODE_MASK) {
752 case SCO_AIRMODE_TRANSP:
753 if (conn->pkt_type & ESCO_2EV3)
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700754 cp.max_latency = cpu_to_le16(0x0008);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200755 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700756 cp.max_latency = cpu_to_le16(0x000D);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200757 cp.retrans_effort = 0x02;
758 break;
759 case SCO_AIRMODE_CVSD:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700760 cp.max_latency = cpu_to_le16(0xffff);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200761 cp.retrans_effort = 0xff;
762 break;
763 }
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200764
765 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
766 sizeof(cp), &cp);
767 }
768}
769
Ying Xue1b784142015-03-02 15:37:48 +0800770static int sco_sock_recvmsg(struct socket *sock, struct msghdr *msg,
771 size_t len, int flags)
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100772{
773 struct sock *sk = sock->sk;
774 struct sco_pinfo *pi = sco_pi(sk);
775
776 lock_sock(sk);
777
778 if (sk->sk_state == BT_CONNECT2 &&
779 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200780 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100781 sk->sk_state = BT_CONFIG;
782
783 release_sock(sk);
784 return 0;
785 }
786
787 release_sock(sk);
788
Ying Xue1b784142015-03-02 15:37:48 +0800789 return bt_sock_recvmsg(sock, msg, len, flags);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100790}
791
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100792static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
793 char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794{
795 struct sock *sk = sock->sk;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200796 int len, err = 0;
797 struct bt_voice voice;
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100798 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799
800 BT_DBG("sk %p", sk);
801
802 lock_sock(sk);
803
804 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100805
806 case BT_DEFER_SETUP:
807 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
808 err = -EINVAL;
809 break;
810 }
811
812 if (get_user(opt, (u32 __user *) optval)) {
813 err = -EFAULT;
814 break;
815 }
816
817 if (opt)
818 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
819 else
820 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
821 break;
822
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200823 case BT_VOICE:
824 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
825 sk->sk_state != BT_CONNECT2) {
826 err = -EINVAL;
827 break;
828 }
829
830 voice.setting = sco_pi(sk)->setting;
831
832 len = min_t(unsigned int, sizeof(voice), optlen);
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100833 if (copy_from_user((char *)&voice, optval, len)) {
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200834 err = -EFAULT;
835 break;
836 }
837
838 /* Explicitly check for these values */
839 if (voice.setting != BT_VOICE_TRANSPARENT &&
840 voice.setting != BT_VOICE_CVSD_16BIT) {
841 err = -EINVAL;
842 break;
843 }
844
845 sco_pi(sk)->setting = voice.setting;
846 break;
847
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 default:
849 err = -ENOPROTOOPT;
850 break;
851 }
852
853 release_sock(sk);
854 return err;
855}
856
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100857static int sco_sock_getsockopt_old(struct socket *sock, int optname,
858 char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859{
860 struct sock *sk = sock->sk;
861 struct sco_options opts;
862 struct sco_conninfo cinfo;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900863 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864
865 BT_DBG("sk %p", sk);
866
867 if (get_user(len, optlen))
868 return -EFAULT;
869
870 lock_sock(sk);
871
872 switch (optname) {
873 case SCO_OPTIONS:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300874 if (sk->sk_state != BT_CONNECTED &&
875 !(sk->sk_state == BT_CONNECT2 &&
876 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877 err = -ENOTCONN;
878 break;
879 }
880
881 opts.mtu = sco_pi(sk)->conn->mtu;
882
883 BT_DBG("mtu %d", opts.mtu);
884
885 len = min_t(unsigned int, len, sizeof(opts));
886 if (copy_to_user(optval, (char *)&opts, len))
887 err = -EFAULT;
888
889 break;
890
891 case SCO_CONNINFO:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300892 if (sk->sk_state != BT_CONNECTED &&
893 !(sk->sk_state == BT_CONNECT2 &&
894 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 err = -ENOTCONN;
896 break;
897 }
898
Vasiliy Kulikovc4c896e2011-02-14 13:54:26 +0300899 memset(&cinfo, 0, sizeof(cinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
901 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
902
903 len = min_t(unsigned int, len, sizeof(cinfo));
904 if (copy_to_user(optval, (char *)&cinfo, len))
905 err = -EFAULT;
906
907 break;
908
909 default:
910 err = -ENOPROTOOPT;
911 break;
912 }
913
914 release_sock(sk);
915 return err;
916}
917
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100918static int sco_sock_getsockopt(struct socket *sock, int level, int optname,
919 char __user *optval, int __user *optlen)
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100920{
921 struct sock *sk = sock->sk;
922 int len, err = 0;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200923 struct bt_voice voice;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100924
925 BT_DBG("sk %p", sk);
926
927 if (level == SOL_SCO)
928 return sco_sock_getsockopt_old(sock, optname, optval, optlen);
929
930 if (get_user(len, optlen))
931 return -EFAULT;
932
933 lock_sock(sk);
934
935 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100936
937 case BT_DEFER_SETUP:
938 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
939 err = -EINVAL;
940 break;
941 }
942
943 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100944 (u32 __user *)optval))
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100945 err = -EFAULT;
946
947 break;
948
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200949 case BT_VOICE:
950 voice.setting = sco_pi(sk)->setting;
951
952 len = min_t(unsigned int, len, sizeof(voice));
953 if (copy_to_user(optval, (char *)&voice, len))
954 err = -EFAULT;
955
956 break;
957
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100958 default:
959 err = -ENOPROTOOPT;
960 break;
961 }
962
963 release_sock(sk);
964 return err;
965}
966
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200967static int sco_sock_shutdown(struct socket *sock, int how)
968{
969 struct sock *sk = sock->sk;
970 int err = 0;
971
972 BT_DBG("sock %p, sk %p", sock, sk);
973
974 if (!sk)
975 return 0;
976
Kuba Pawlak1da55372015-10-05 18:44:17 +0200977 sock_hold(sk);
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200978 lock_sock(sk);
Kuba Pawlak1da55372015-10-05 18:44:17 +0200979
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200980 if (!sk->sk_shutdown) {
981 sk->sk_shutdown = SHUTDOWN_MASK;
982 sco_sock_clear_timer(sk);
983 __sco_sock_close(sk);
984
Vladimir Davydov093facf2014-07-15 12:25:28 +0400985 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
986 !(current->flags & PF_EXITING))
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200987 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300988 sk->sk_lingertime);
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200989 }
Kuba Pawlak1da55372015-10-05 18:44:17 +0200990
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200991 release_sock(sk);
Kuba Pawlak1da55372015-10-05 18:44:17 +0200992 sock_put(sk);
993
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200994 return err;
995}
996
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997static int sco_sock_release(struct socket *sock)
998{
999 struct sock *sk = sock->sk;
1000 int err = 0;
1001
1002 BT_DBG("sock %p, sk %p", sock, sk);
1003
1004 if (!sk)
1005 return 0;
1006
1007 sco_sock_close(sk);
1008
Vladimir Davydov093facf2014-07-15 12:25:28 +04001009 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1010 !(current->flags & PF_EXITING)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 lock_sock(sk);
1012 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
1013 release_sock(sk);
1014 }
1015
1016 sock_orphan(sk);
1017 sco_sock_kill(sk);
1018 return err;
1019}
1020
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021static void sco_conn_ready(struct sco_conn *conn)
1022{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001023 struct sock *parent;
1024 struct sock *sk = conn->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001025
1026 BT_DBG("conn %p", conn);
1027
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001028 if (sk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 sco_sock_clear_timer(sk);
1030 bh_lock_sock(sk);
1031 sk->sk_state = BT_CONNECTED;
1032 sk->sk_state_change(sk);
1033 bh_unlock_sock(sk);
1034 } else {
Andre Guedes40528082013-01-29 19:59:56 -03001035 sco_conn_lock(conn);
1036
Kuba Pawlak2c501cd2015-10-26 16:17:14 +00001037 if (!conn->hcon) {
1038 sco_conn_unlock(conn);
1039 return;
1040 }
1041
Marcel Holtmann041987c2013-10-13 10:15:22 -07001042 parent = sco_get_sock_listen(&conn->hcon->src);
Andre Guedes40528082013-01-29 19:59:56 -03001043 if (!parent) {
1044 sco_conn_unlock(conn);
1045 return;
1046 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047
1048 bh_lock_sock(parent);
1049
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -03001050 sk = sco_sock_alloc(sock_net(parent), NULL,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001051 BTPROTO_SCO, GFP_ATOMIC, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 if (!sk) {
1053 bh_unlock_sock(parent);
Andre Guedes40528082013-01-29 19:59:56 -03001054 sco_conn_unlock(conn);
1055 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 }
1057
1058 sco_sock_init(sk, parent);
1059
Marcel Holtmanneea96362013-10-13 10:34:01 -07001060 bacpy(&sco_pi(sk)->src, &conn->hcon->src);
1061 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062
1063 hci_conn_hold(conn->hcon);
1064 __sco_chan_add(conn, sk, parent);
1065
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001066 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
1067 sk->sk_state = BT_CONNECT2;
1068 else
1069 sk->sk_state = BT_CONNECTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070
1071 /* Wake up parent */
David S. Miller676d2362014-04-11 16:15:36 -04001072 parent->sk_data_ready(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073
1074 bh_unlock_sock(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075
Andre Guedes40528082013-01-29 19:59:56 -03001076 sco_conn_unlock(conn);
1077 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078}
1079
1080/* ----- SCO interface with lower layer (HCI) ----- */
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001081int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082{
Gustavo Padovanfc5fef62012-05-23 04:04:19 -03001083 struct sock *sk;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001084 int lm = 0;
1085
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001086 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001088 /* Find listening sockets */
1089 read_lock(&sco_sk_list.lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -08001090 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001091 if (sk->sk_state != BT_LISTEN)
1092 continue;
1093
Marcel Holtmanneea96362013-10-13 10:34:01 -07001094 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) ||
1095 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001096 lm |= HCI_LM_ACCEPT;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001097
1098 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
1099 *flags |= HCI_PROTO_DEFER;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001100 break;
1101 }
1102 }
1103 read_unlock(&sco_sk_list.lock);
1104
1105 return lm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106}
1107
Johan Hedberg539c4962015-02-18 14:53:57 +02001108static void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109{
Johan Hedberg539c4962015-02-18 14:53:57 +02001110 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1111 return;
1112
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001113 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Johan Hedberg539c4962015-02-18 14:53:57 +02001114
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115 if (!status) {
1116 struct sco_conn *conn;
1117
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +02001118 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119 if (conn)
1120 sco_conn_ready(conn);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001121 } else
Joe Perchese1750722011-06-29 18:18:29 -07001122 sco_conn_del(hcon, bt_to_errno(status));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123}
1124
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001125static void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126{
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001127 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1128 return;
1129
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 BT_DBG("hcon %p reason %d", hcon, reason);
1131
Joe Perchese1750722011-06-29 18:18:29 -07001132 sco_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133}
1134
Arron Wang9b4c3332015-06-09 17:47:22 +08001135void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136{
1137 struct sco_conn *conn = hcon->sco_data;
1138
1139 if (!conn)
1140 goto drop;
1141
1142 BT_DBG("conn %p len %d", conn, skb->len);
1143
1144 if (skb->len) {
1145 sco_recv_frame(conn, skb);
Arron Wang9b4c3332015-06-09 17:47:22 +08001146 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147 }
1148
1149drop:
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001150 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151}
1152
Johan Hedberg539c4962015-02-18 14:53:57 +02001153static struct hci_cb sco_cb = {
1154 .name = "SCO",
1155 .connect_cfm = sco_connect_cfm,
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001156 .disconn_cfm = sco_disconn_cfm,
Johan Hedberg539c4962015-02-18 14:53:57 +02001157};
1158
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001159static int sco_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160{
1161 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001163 read_lock(&sco_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164
Sasha Levinb67bfe02013-02-27 17:06:00 -08001165 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmanneea96362013-10-13 10:34:01 -07001166 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src,
1167 &sco_pi(sk)->dst, sk->sk_state);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001168 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001170 read_unlock(&sco_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001171
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001172 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173}
1174
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001175static int sco_debugfs_open(struct inode *inode, struct file *file)
1176{
1177 return single_open(file, sco_debugfs_show, inode->i_private);
1178}
1179
1180static const struct file_operations sco_debugfs_fops = {
1181 .open = sco_debugfs_open,
1182 .read = seq_read,
1183 .llseek = seq_lseek,
1184 .release = single_release,
1185};
1186
1187static struct dentry *sco_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001189static const struct proto_ops sco_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190 .family = PF_BLUETOOTH,
1191 .owner = THIS_MODULE,
1192 .release = sco_sock_release,
1193 .bind = sco_sock_bind,
1194 .connect = sco_sock_connect,
1195 .listen = sco_sock_listen,
1196 .accept = sco_sock_accept,
1197 .getname = sco_sock_getname,
1198 .sendmsg = sco_sock_sendmsg,
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001199 .recvmsg = sco_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02001201 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 .mmap = sock_no_mmap,
1203 .socketpair = sock_no_socketpair,
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +02001204 .shutdown = sco_sock_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205 .setsockopt = sco_sock_setsockopt,
1206 .getsockopt = sco_sock_getsockopt
1207};
1208
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001209static const struct net_proto_family sco_sock_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 .family = PF_BLUETOOTH,
1211 .owner = THIS_MODULE,
1212 .create = sco_sock_create,
1213};
1214
Gustavo F. Padovan64274512011-02-07 20:08:52 -02001215int __init sco_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216{
1217 int err;
1218
Marcel Holtmann15762fa2015-01-11 15:21:06 -08001219 BUILD_BUG_ON(sizeof(struct sockaddr_sco) > sizeof(struct sockaddr));
1220
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 err = proto_register(&sco_proto, 0);
1222 if (err < 0)
1223 return err;
1224
1225 err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
1226 if (err < 0) {
1227 BT_ERR("SCO socket registration failed");
1228 goto error;
1229 }
1230
Al Virob0316612013-04-04 19:14:33 -04001231 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001232 if (err < 0) {
1233 BT_ERR("Failed to create SCO proc file");
1234 bt_sock_unregister(BTPROTO_SCO);
1235 goto error;
1236 }
1237
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 BT_INFO("SCO socket layer initialized");
1239
Johan Hedberg539c4962015-02-18 14:53:57 +02001240 hci_register_cb(&sco_cb);
1241
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07001242 if (IS_ERR_OR_NULL(bt_debugfs))
1243 return 0;
1244
1245 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs,
1246 NULL, &sco_debugfs_fops);
1247
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 return 0;
1249
1250error:
1251 proto_unregister(&sco_proto);
1252 return err;
1253}
1254
Alexander Aring0402d9f22015-03-07 20:52:28 +01001255void sco_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256{
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001257 bt_procfs_cleanup(&init_net, "sco");
1258
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001259 debugfs_remove(sco_debugfs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260
Johan Hedberg539c4962015-02-18 14:53:57 +02001261 hci_unregister_cb(&sco_cb);
1262
David Herrmann5e9d7f82013-02-24 19:36:51 +01001263 bt_sock_unregister(BTPROTO_SCO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 proto_unregister(&sco_proto);
1266}
1267
Marcel Holtmann7cb127d2008-07-14 20:13:53 +02001268module_param(disable_esco, bool, 0644);
1269MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");