blob: 95fd7a837dc5c351a6d04bb1c95df3e019deacb4 [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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
31#include <net/bluetooth/bluetooth.h>
32#include <net/bluetooth/hci_core.h>
33#include <net/bluetooth/sco.h>
34
Rusty Russelleb939922011-12-19 14:08:01 +000035static bool disable_esco;
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080037static const struct proto_ops sco_sock_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39static struct bt_sock_list sco_sk_list = {
Robert P. J. Dayd5fb2962008-03-28 16:17:38 -070040 .lock = __RW_LOCK_UNLOCKED(sco_sk_list.lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -070041};
42
Marcel Holtmannfc8f5252014-07-11 06:19:42 +020043/* ---- SCO connections ---- */
44struct sco_conn {
45 struct hci_conn *hcon;
46
47 spinlock_t lock;
48 struct sock *sk;
49
50 unsigned int mtu;
51};
52
53#define sco_conn_lock(c) spin_lock(&c->lock);
54#define sco_conn_unlock(c) spin_unlock(&c->lock);
55
Linus Torvalds1da177e2005-04-16 15:20:36 -070056static void sco_sock_close(struct sock *sk);
57static void sco_sock_kill(struct sock *sk);
58
Marcel Holtmann2a0dccb2014-07-11 06:19:41 +020059/* ----- SCO socket info ----- */
60#define sco_pi(sk) ((struct sco_pinfo *) sk)
61
62struct sco_pinfo {
63 struct bt_sock bt;
64 bdaddr_t src;
65 bdaddr_t dst;
66 __u32 flags;
67 __u16 setting;
68 struct sco_conn *conn;
69};
70
Linus Torvalds1da177e2005-04-16 15:20:36 -070071/* ---- SCO timers ---- */
Marcel Holtmann068d69e2014-07-11 06:19:44 +020072#define SCO_CONN_TIMEOUT (HZ * 40)
73#define SCO_DISCONN_TIMEOUT (HZ * 2)
74
Linus Torvalds1da177e2005-04-16 15:20:36 -070075static void sco_sock_timeout(unsigned long arg)
76{
Marcel Holtmannc4297e82015-10-26 02:08:38 +010077 struct sock *sk = (struct sock *)arg;
Linus Torvalds1da177e2005-04-16 15:20:36 -070078
79 BT_DBG("sock %p state %d", sk, sk->sk_state);
80
81 bh_lock_sock(sk);
82 sk->sk_err = ETIMEDOUT;
83 sk->sk_state_change(sk);
84 bh_unlock_sock(sk);
85
86 sco_sock_kill(sk);
87 sock_put(sk);
88}
89
90static void sco_sock_set_timer(struct sock *sk, long timeout)
91{
92 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
93 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
94}
95
96static void sco_sock_clear_timer(struct sock *sk)
97{
98 BT_DBG("sock %p state %d", sk, sk->sk_state);
99 sk_stop_timer(sk, &sk->sk_timer);
100}
101
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102/* ---- SCO connections ---- */
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200103static struct sco_conn *sco_conn_add(struct hci_conn *hcon)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104{
105 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200106 struct sco_conn *conn = hcon->sco_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200108 if (conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109 return conn;
110
Claudio Takahasic10cc5a2013-04-11 11:35:45 -0300111 conn = kzalloc(sizeof(struct sco_conn), GFP_KERNEL);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200112 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114
115 spin_lock_init(&conn->lock);
116
117 hcon->sco_data = conn;
118 conn->hcon = hcon;
119
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 if (hdev->sco_mtu > 0)
121 conn->mtu = hdev->sco_mtu;
122 else
123 conn->mtu = 60;
124
125 BT_DBG("hcon %p conn %p", hcon, conn);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200126
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127 return conn;
128}
129
Marcel Holtmanne03ab512014-07-13 19:54:49 +0200130/* Delete channel.
131 * Must be called on the locked socket. */
132static void sco_chan_del(struct sock *sk, int err)
133{
134 struct sco_conn *conn;
135
136 conn = sco_pi(sk)->conn;
137
138 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
139
140 if (conn) {
141 sco_conn_lock(conn);
142 conn->sk = NULL;
143 sco_pi(sk)->conn = NULL;
144 sco_conn_unlock(conn);
145
146 if (conn->hcon)
147 hci_conn_drop(conn->hcon);
148 }
149
150 sk->sk_state = BT_CLOSED;
151 sk->sk_err = err;
152 sk->sk_state_change(sk);
153
154 sock_set_flag(sk, SOCK_ZAPPED);
155}
156
Nicholas Krausedf945362015-08-18 21:23:01 -0400157static void sco_conn_del(struct hci_conn *hcon, int err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200159 struct sco_conn *conn = hcon->sco_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 struct sock *sk;
161
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200162 if (!conn)
Nicholas Krausedf945362015-08-18 21:23:01 -0400163 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164
165 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
166
167 /* Kill socket */
Marcel Holtmanneb5a4de2014-07-14 01:30:15 +0200168 sco_conn_lock(conn);
169 sk = conn->sk;
170 sco_conn_unlock(conn);
171
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200172 if (sk) {
Kuba Pawlak75e34f52015-10-05 18:44:15 +0200173 sock_hold(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174 bh_lock_sock(sk);
175 sco_sock_clear_timer(sk);
176 sco_chan_del(sk, err);
177 bh_unlock_sock(sk);
178 sco_sock_kill(sk);
Kuba Pawlak75e34f52015-10-05 18:44:15 +0200179 sock_put(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180 }
181
182 hcon->sco_data = NULL;
183 kfree(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700184}
185
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100186static void __sco_chan_add(struct sco_conn *conn, struct sock *sk,
187 struct sock *parent)
Marcel Holtmann015b01c2014-07-13 19:54:48 +0200188{
189 BT_DBG("conn %p", conn);
190
191 sco_pi(sk)->conn = conn;
192 conn->sk = sk;
193
194 if (parent)
195 bt_accept_enqueue(parent, sk);
196}
197
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300198static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
199 struct sock *parent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200{
201 int err = 0;
202
203 sco_conn_lock(conn);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300204 if (conn->sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205 err = -EBUSY;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300206 else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207 __sco_chan_add(conn, sk, parent);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300208
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 sco_conn_unlock(conn);
210 return err;
211}
212
213static int sco_connect(struct sock *sk)
214{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215 struct sco_conn *conn;
216 struct hci_conn *hcon;
217 struct hci_dev *hdev;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200218 int err, type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219
Marcel Holtmanneea96362013-10-13 10:34:01 -0700220 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221
Johan Hedberg39385cb2016-11-12 17:03:07 +0200222 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR);
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200223 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224 return -EHOSTUNREACH;
225
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300226 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227
Marcel Holtmann7cb127d2008-07-14 20:13:53 +0200228 if (lmp_esco_capable(hdev) && !disable_esco)
229 type = ESCO_LINK;
230 else
231 type = SCO_LINK;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200232
Frédéric Dalleau79dc0082013-08-19 14:24:01 +0200233 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
234 (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
235 err = -EOPNOTSUPP;
236 goto done;
237 }
238
Marcel Holtmanneea96362013-10-13 10:34:01 -0700239 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
Marcel Holtmann041987c2013-10-13 10:15:22 -0700240 sco_pi(sk)->setting);
Ville Tervo30e76272011-02-22 16:10:53 -0300241 if (IS_ERR(hcon)) {
242 err = PTR_ERR(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243 goto done;
Ville Tervo30e76272011-02-22 16:10:53 -0300244 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200246 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247 if (!conn) {
David Herrmann76a68ba2013-04-06 20:28:37 +0200248 hci_conn_drop(hcon);
Ville Tervo30e76272011-02-22 16:10:53 -0300249 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250 goto done;
251 }
252
253 /* Update source addr of the socket */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700254 bacpy(&sco_pi(sk)->src, &hcon->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255
256 err = sco_chan_add(conn, sk, NULL);
257 if (err)
258 goto done;
259
260 if (hcon->state == BT_CONNECTED) {
261 sco_sock_clear_timer(sk);
262 sk->sk_state = BT_CONNECTED;
263 } else {
264 sk->sk_state = BT_CONNECT;
265 sco_sock_set_timer(sk, sk->sk_sndtimeo);
266 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200267
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268done:
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300269 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270 hci_dev_put(hdev);
271 return err;
272}
273
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300274static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275{
276 struct sco_conn *conn = sco_pi(sk)->conn;
277 struct sk_buff *skb;
Mikel Astiz088ce082012-04-11 08:48:48 +0200278 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279
280 /* Check outgoing MTU */
281 if (len > conn->mtu)
282 return -EINVAL;
283
284 BT_DBG("sk %p len %d", sk, len);
285
Mikel Astiz088ce082012-04-11 08:48:48 +0200286 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300287 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288 return err;
289
Al Viro6ce8e9c2014-04-06 21:25:44 -0400290 if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300291 kfree_skb(skb);
292 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 }
294
Gustavo F. Padovan0d861d82010-05-01 16:15:35 -0300295 hci_send_sco(conn->hcon, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296
Mikel Astiz088ce082012-04-11 08:48:48 +0200297 return len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298}
299
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300300static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301{
Marcel Holtmanneb5a4de2014-07-14 01:30:15 +0200302 struct sock *sk;
303
304 sco_conn_lock(conn);
305 sk = conn->sk;
306 sco_conn_unlock(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307
308 if (!sk)
309 goto drop;
310
311 BT_DBG("sk %p len %d", sk, skb->len);
312
313 if (sk->sk_state != BT_CONNECTED)
314 goto drop;
315
316 if (!sock_queue_rcv_skb(sk, skb))
317 return;
318
319drop:
320 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700321}
322
323/* -------- Socket interface ---------- */
Marcel Holtmannfb334052012-04-19 14:37:58 +0200324static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325{
Marcel Holtmannfb334052012-04-19 14:37:58 +0200326 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327
Sasha Levinb67bfe02013-02-27 17:06:00 -0800328 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmannfb334052012-04-19 14:37:58 +0200329 if (sk->sk_state != BT_LISTEN)
330 continue;
331
Marcel Holtmanneea96362013-10-13 10:34:01 -0700332 if (!bacmp(&sco_pi(sk)->src, ba))
Marcel Holtmannfb334052012-04-19 14:37:58 +0200333 return sk;
334 }
335
336 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337}
338
339/* Find socket listening on source bdaddr.
340 * Returns closest match.
341 */
342static struct sock *sco_get_sock_listen(bdaddr_t *src)
343{
344 struct sock *sk = NULL, *sk1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345
346 read_lock(&sco_sk_list.lock);
347
Sasha Levinb67bfe02013-02-27 17:06:00 -0800348 sk_for_each(sk, &sco_sk_list.head) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349 if (sk->sk_state != BT_LISTEN)
350 continue;
351
352 /* Exact match. */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700353 if (!bacmp(&sco_pi(sk)->src, src))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354 break;
355
356 /* Closest match */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700357 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358 sk1 = sk;
359 }
360
361 read_unlock(&sco_sk_list.lock);
362
Sasha Levinb67bfe02013-02-27 17:06:00 -0800363 return sk ? sk : sk1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364}
365
366static void sco_sock_destruct(struct sock *sk)
367{
368 BT_DBG("sk %p", sk);
369
370 skb_queue_purge(&sk->sk_receive_queue);
371 skb_queue_purge(&sk->sk_write_queue);
372}
373
374static void sco_sock_cleanup_listen(struct sock *parent)
375{
376 struct sock *sk;
377
378 BT_DBG("parent %p", parent);
379
380 /* Close not yet accepted channels */
381 while ((sk = bt_accept_dequeue(parent, NULL))) {
382 sco_sock_close(sk);
383 sco_sock_kill(sk);
384 }
385
386 parent->sk_state = BT_CLOSED;
387 sock_set_flag(parent, SOCK_ZAPPED);
388}
389
390/* Kill socket (only if zapped and orphan)
391 * Must be called on unlocked socket.
392 */
393static void sco_sock_kill(struct sock *sk)
394{
Sudip Mukherjee34a806b2018-07-15 20:36:50 +0100395 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket ||
396 sock_flag(sk, SOCK_DEAD))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397 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
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800490 setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk);
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
527 if (!addr || addr->sa_family != AF_BLUETOOTH)
528 return -EINVAL;
529
David S. Miller52332522015-12-15 15:39:08 -0500530 if (addr_len < sizeof(struct sockaddr_sco))
531 return -EINVAL;
532
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533 lock_sock(sk);
534
535 if (sk->sk_state != BT_OPEN) {
536 err = -EBADFD;
537 goto done;
538 }
539
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200540 if (sk->sk_type != SOCK_SEQPACKET) {
541 err = -EINVAL;
542 goto done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543 }
544
Marcel Holtmanneea96362013-10-13 10:34:01 -0700545 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr);
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200546
547 sk->sk_state = BT_BOUND;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548
549done:
550 release_sock(sk);
551 return err;
552}
553
554static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
555{
556 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
557 struct sock *sk = sock->sk;
Claudio Takahasi92f185c2013-04-11 11:35:46 -0300558 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559
560 BT_DBG("sk %p", sk);
561
Changli Gao6503d962010-03-31 22:58:26 +0000562 if (alen < sizeof(struct sockaddr_sco) ||
563 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564 return -EINVAL;
565
566 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
567 return -EBADFD;
568
569 if (sk->sk_type != SOCK_SEQPACKET)
570 return -EINVAL;
571
572 lock_sock(sk);
573
574 /* Set destination address and psm */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700575 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200577 err = sco_connect(sk);
578 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 goto done;
580
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900581 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300582 sock_sndtimeo(sk, flags & O_NONBLOCK));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583
584done:
585 release_sock(sk);
586 return err;
587}
588
589static int sco_sock_listen(struct socket *sock, int backlog)
590{
591 struct sock *sk = sock->sk;
Marcel Holtmanneea96362013-10-13 10:34:01 -0700592 bdaddr_t *src = &sco_pi(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593 int err = 0;
594
595 BT_DBG("sk %p backlog %d", sk, backlog);
596
597 lock_sock(sk);
598
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200599 if (sk->sk_state != BT_BOUND) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600 err = -EBADFD;
601 goto done;
602 }
603
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200604 if (sk->sk_type != SOCK_SEQPACKET) {
605 err = -EINVAL;
606 goto done;
607 }
608
Marcel Holtmannfb334052012-04-19 14:37:58 +0200609 write_lock(&sco_sk_list.lock);
610
611 if (__sco_get_sock_listen_by_addr(src)) {
612 err = -EADDRINUSE;
613 goto unlock;
614 }
615
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 sk->sk_max_ack_backlog = backlog;
617 sk->sk_ack_backlog = 0;
Marcel Holtmannfb334052012-04-19 14:37:58 +0200618
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619 sk->sk_state = BT_LISTEN;
620
Marcel Holtmannfb334052012-04-19 14:37:58 +0200621unlock:
622 write_unlock(&sco_sk_list.lock);
623
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624done:
625 release_sock(sk);
626 return err;
627}
628
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100629static int sco_sock_accept(struct socket *sock, struct socket *newsock,
630 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500632 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 struct sock *sk = sock->sk, *ch;
634 long timeo;
635 int err = 0;
636
637 lock_sock(sk);
638
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
640
641 BT_DBG("sk %p timeo %ld", sk, timeo);
642
643 /* Wait for an incoming connection. (wake-one). */
Eric Dumazetaa395142010-04-20 13:03:51 +0000644 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurley552b0d32011-07-24 00:11:01 -0400645 while (1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646 if (sk->sk_state != BT_LISTEN) {
647 err = -EBADFD;
648 break;
649 }
650
Peter Hurley552b0d32011-07-24 00:11:01 -0400651 ch = bt_accept_dequeue(sk, newsock);
652 if (ch)
653 break;
654
655 if (!timeo) {
656 err = -EAGAIN;
657 break;
658 }
659
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660 if (signal_pending(current)) {
661 err = sock_intr_errno(timeo);
662 break;
663 }
Peter Hurley552b0d32011-07-24 00:11:01 -0400664
665 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500666
667 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
Peter Hurley552b0d32011-07-24 00:11:01 -0400668 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 }
Eric Dumazetaa395142010-04-20 13:03:51 +0000670 remove_wait_queue(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671
672 if (err)
673 goto done;
674
675 newsock->state = SS_CONNECTED;
676
677 BT_DBG("new socket %p", ch);
678
679done:
680 release_sock(sk);
681 return err;
682}
683
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100684static int sco_sock_getname(struct socket *sock, struct sockaddr *addr,
685 int *len, int peer)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686{
687 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
688 struct sock *sk = sock->sk;
689
690 BT_DBG("sock %p, sk %p", sock, sk);
691
692 addr->sa_family = AF_BLUETOOTH;
693 *len = sizeof(struct sockaddr_sco);
694
695 if (peer)
Marcel Holtmanneea96362013-10-13 10:34:01 -0700696 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697 else
Marcel Holtmanneea96362013-10-13 10:34:01 -0700698 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699
700 return 0;
701}
702
Ying Xue1b784142015-03-02 15:37:48 +0800703static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
704 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705{
706 struct sock *sk = sock->sk;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300707 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
709 BT_DBG("sock %p, sk %p", sock, sk);
710
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -0800711 err = sock_error(sk);
712 if (err)
713 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714
715 if (msg->msg_flags & MSG_OOB)
716 return -EOPNOTSUPP;
717
718 lock_sock(sk);
719
720 if (sk->sk_state == BT_CONNECTED)
721 err = sco_send_frame(sk, msg, len);
722 else
723 err = -ENOTCONN;
724
725 release_sock(sk);
726 return err;
727}
728
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200729static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200730{
731 struct hci_dev *hdev = conn->hdev;
732
733 BT_DBG("conn %p", conn);
734
735 conn->state = BT_CONFIG;
736
737 if (!lmp_esco_capable(hdev)) {
738 struct hci_cp_accept_conn_req cp;
739
740 bacpy(&cp.bdaddr, &conn->dst);
Frédéric Dalleau33f24042013-08-19 14:23:55 +0200741 cp.role = 0x00; /* Ignored */
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200742
743 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
744 } else {
745 struct hci_cp_accept_sync_conn_req cp;
746
747 bacpy(&cp.bdaddr, &conn->dst);
748 cp.pkt_type = cpu_to_le16(conn->pkt_type);
749
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700750 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
751 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200752 cp.content_format = cpu_to_le16(setting);
753
754 switch (setting & SCO_AIRMODE_MASK) {
755 case SCO_AIRMODE_TRANSP:
756 if (conn->pkt_type & ESCO_2EV3)
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700757 cp.max_latency = cpu_to_le16(0x0008);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200758 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700759 cp.max_latency = cpu_to_le16(0x000D);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200760 cp.retrans_effort = 0x02;
761 break;
762 case SCO_AIRMODE_CVSD:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700763 cp.max_latency = cpu_to_le16(0xffff);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200764 cp.retrans_effort = 0xff;
765 break;
766 }
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200767
768 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
769 sizeof(cp), &cp);
770 }
771}
772
Ying Xue1b784142015-03-02 15:37:48 +0800773static int sco_sock_recvmsg(struct socket *sock, struct msghdr *msg,
774 size_t len, int flags)
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100775{
776 struct sock *sk = sock->sk;
777 struct sco_pinfo *pi = sco_pi(sk);
778
779 lock_sock(sk);
780
781 if (sk->sk_state == BT_CONNECT2 &&
782 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200783 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100784 sk->sk_state = BT_CONFIG;
785
786 release_sock(sk);
787 return 0;
788 }
789
790 release_sock(sk);
791
Ying Xue1b784142015-03-02 15:37:48 +0800792 return bt_sock_recvmsg(sock, msg, len, flags);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100793}
794
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100795static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
796 char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797{
798 struct sock *sk = sock->sk;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200799 int len, err = 0;
800 struct bt_voice voice;
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100801 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802
803 BT_DBG("sk %p", sk);
804
805 lock_sock(sk);
806
807 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100808
809 case BT_DEFER_SETUP:
810 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
811 err = -EINVAL;
812 break;
813 }
814
815 if (get_user(opt, (u32 __user *) optval)) {
816 err = -EFAULT;
817 break;
818 }
819
820 if (opt)
821 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
822 else
823 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
824 break;
825
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200826 case BT_VOICE:
827 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
828 sk->sk_state != BT_CONNECT2) {
829 err = -EINVAL;
830 break;
831 }
832
833 voice.setting = sco_pi(sk)->setting;
834
835 len = min_t(unsigned int, sizeof(voice), optlen);
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100836 if (copy_from_user((char *)&voice, optval, len)) {
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200837 err = -EFAULT;
838 break;
839 }
840
841 /* Explicitly check for these values */
842 if (voice.setting != BT_VOICE_TRANSPARENT &&
843 voice.setting != BT_VOICE_CVSD_16BIT) {
844 err = -EINVAL;
845 break;
846 }
847
848 sco_pi(sk)->setting = voice.setting;
849 break;
850
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 default:
852 err = -ENOPROTOOPT;
853 break;
854 }
855
856 release_sock(sk);
857 return err;
858}
859
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100860static int sco_sock_getsockopt_old(struct socket *sock, int optname,
861 char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862{
863 struct sock *sk = sock->sk;
864 struct sco_options opts;
865 struct sco_conninfo cinfo;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900866 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867
868 BT_DBG("sk %p", sk);
869
870 if (get_user(len, optlen))
871 return -EFAULT;
872
873 lock_sock(sk);
874
875 switch (optname) {
876 case SCO_OPTIONS:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300877 if (sk->sk_state != BT_CONNECTED &&
878 !(sk->sk_state == BT_CONNECT2 &&
879 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880 err = -ENOTCONN;
881 break;
882 }
883
884 opts.mtu = sco_pi(sk)->conn->mtu;
885
886 BT_DBG("mtu %d", opts.mtu);
887
888 len = min_t(unsigned int, len, sizeof(opts));
889 if (copy_to_user(optval, (char *)&opts, len))
890 err = -EFAULT;
891
892 break;
893
894 case SCO_CONNINFO:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300895 if (sk->sk_state != BT_CONNECTED &&
896 !(sk->sk_state == BT_CONNECT2 &&
897 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 err = -ENOTCONN;
899 break;
900 }
901
Vasiliy Kulikovc4c896e2011-02-14 13:54:26 +0300902 memset(&cinfo, 0, sizeof(cinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
904 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
905
906 len = min_t(unsigned int, len, sizeof(cinfo));
907 if (copy_to_user(optval, (char *)&cinfo, len))
908 err = -EFAULT;
909
910 break;
911
912 default:
913 err = -ENOPROTOOPT;
914 break;
915 }
916
917 release_sock(sk);
918 return err;
919}
920
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100921static int sco_sock_getsockopt(struct socket *sock, int level, int optname,
922 char __user *optval, int __user *optlen)
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100923{
924 struct sock *sk = sock->sk;
925 int len, err = 0;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200926 struct bt_voice voice;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100927
928 BT_DBG("sk %p", sk);
929
930 if (level == SOL_SCO)
931 return sco_sock_getsockopt_old(sock, optname, optval, optlen);
932
933 if (get_user(len, optlen))
934 return -EFAULT;
935
936 lock_sock(sk);
937
938 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100939
940 case BT_DEFER_SETUP:
941 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
942 err = -EINVAL;
943 break;
944 }
945
946 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
Marcel Holtmannc4297e82015-10-26 02:08:38 +0100947 (u32 __user *)optval))
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100948 err = -EFAULT;
949
950 break;
951
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200952 case BT_VOICE:
953 voice.setting = sco_pi(sk)->setting;
954
955 len = min_t(unsigned int, len, sizeof(voice));
956 if (copy_to_user(optval, (char *)&voice, len))
957 err = -EFAULT;
958
959 break;
960
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100961 default:
962 err = -ENOPROTOOPT;
963 break;
964 }
965
966 release_sock(sk);
967 return err;
968}
969
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200970static int sco_sock_shutdown(struct socket *sock, int how)
971{
972 struct sock *sk = sock->sk;
973 int err = 0;
974
975 BT_DBG("sock %p, sk %p", sock, sk);
976
977 if (!sk)
978 return 0;
979
Kuba Pawlak1da55372015-10-05 18:44:17 +0200980 sock_hold(sk);
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200981 lock_sock(sk);
Kuba Pawlak1da55372015-10-05 18:44:17 +0200982
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200983 if (!sk->sk_shutdown) {
984 sk->sk_shutdown = SHUTDOWN_MASK;
985 sco_sock_clear_timer(sk);
986 __sco_sock_close(sk);
987
Vladimir Davydov093facf2014-07-15 12:25:28 +0400988 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
989 !(current->flags & PF_EXITING))
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200990 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300991 sk->sk_lingertime);
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200992 }
Kuba Pawlak1da55372015-10-05 18:44:17 +0200993
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200994 release_sock(sk);
Kuba Pawlak1da55372015-10-05 18:44:17 +0200995 sock_put(sk);
996
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200997 return err;
998}
999
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000static int sco_sock_release(struct socket *sock)
1001{
1002 struct sock *sk = sock->sk;
1003 int err = 0;
1004
1005 BT_DBG("sock %p, sk %p", sock, sk);
1006
1007 if (!sk)
1008 return 0;
1009
1010 sco_sock_close(sk);
1011
Vladimir Davydov093facf2014-07-15 12:25:28 +04001012 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1013 !(current->flags & PF_EXITING)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014 lock_sock(sk);
1015 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
1016 release_sock(sk);
1017 }
1018
1019 sock_orphan(sk);
1020 sco_sock_kill(sk);
1021 return err;
1022}
1023
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024static void sco_conn_ready(struct sco_conn *conn)
1025{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001026 struct sock *parent;
1027 struct sock *sk = conn->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001028
1029 BT_DBG("conn %p", conn);
1030
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001031 if (sk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 sco_sock_clear_timer(sk);
1033 bh_lock_sock(sk);
1034 sk->sk_state = BT_CONNECTED;
1035 sk->sk_state_change(sk);
1036 bh_unlock_sock(sk);
1037 } else {
Andre Guedes40528082013-01-29 19:59:56 -03001038 sco_conn_lock(conn);
1039
Kuba Pawlak2c501cd2015-10-26 16:17:14 +00001040 if (!conn->hcon) {
1041 sco_conn_unlock(conn);
1042 return;
1043 }
1044
Marcel Holtmann041987c2013-10-13 10:15:22 -07001045 parent = sco_get_sock_listen(&conn->hcon->src);
Andre Guedes40528082013-01-29 19:59:56 -03001046 if (!parent) {
1047 sco_conn_unlock(conn);
1048 return;
1049 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050
1051 bh_lock_sock(parent);
1052
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -03001053 sk = sco_sock_alloc(sock_net(parent), NULL,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001054 BTPROTO_SCO, GFP_ATOMIC, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 if (!sk) {
1056 bh_unlock_sock(parent);
Andre Guedes40528082013-01-29 19:59:56 -03001057 sco_conn_unlock(conn);
1058 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 }
1060
1061 sco_sock_init(sk, parent);
1062
Marcel Holtmanneea96362013-10-13 10:34:01 -07001063 bacpy(&sco_pi(sk)->src, &conn->hcon->src);
1064 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065
1066 hci_conn_hold(conn->hcon);
1067 __sco_chan_add(conn, sk, parent);
1068
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001069 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
1070 sk->sk_state = BT_CONNECT2;
1071 else
1072 sk->sk_state = BT_CONNECTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073
1074 /* Wake up parent */
David S. Miller676d2362014-04-11 16:15:36 -04001075 parent->sk_data_ready(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076
1077 bh_unlock_sock(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078
Andre Guedes40528082013-01-29 19:59:56 -03001079 sco_conn_unlock(conn);
1080 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081}
1082
1083/* ----- SCO interface with lower layer (HCI) ----- */
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001084int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085{
Gustavo Padovanfc5fef62012-05-23 04:04:19 -03001086 struct sock *sk;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001087 int lm = 0;
1088
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001089 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001091 /* Find listening sockets */
1092 read_lock(&sco_sk_list.lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -08001093 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001094 if (sk->sk_state != BT_LISTEN)
1095 continue;
1096
Marcel Holtmanneea96362013-10-13 10:34:01 -07001097 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) ||
1098 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001099 lm |= HCI_LM_ACCEPT;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001100
1101 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
1102 *flags |= HCI_PROTO_DEFER;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001103 break;
1104 }
1105 }
1106 read_unlock(&sco_sk_list.lock);
1107
1108 return lm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109}
1110
Johan Hedberg539c4962015-02-18 14:53:57 +02001111static void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112{
Johan Hedberg539c4962015-02-18 14:53:57 +02001113 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1114 return;
1115
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001116 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Johan Hedberg539c4962015-02-18 14:53:57 +02001117
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118 if (!status) {
1119 struct sco_conn *conn;
1120
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +02001121 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 if (conn)
1123 sco_conn_ready(conn);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001124 } else
Joe Perchese1750722011-06-29 18:18:29 -07001125 sco_conn_del(hcon, bt_to_errno(status));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126}
1127
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001128static void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129{
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001130 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1131 return;
1132
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133 BT_DBG("hcon %p reason %d", hcon, reason);
1134
Joe Perchese1750722011-06-29 18:18:29 -07001135 sco_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136}
1137
Arron Wang9b4c3332015-06-09 17:47:22 +08001138void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139{
1140 struct sco_conn *conn = hcon->sco_data;
1141
1142 if (!conn)
1143 goto drop;
1144
1145 BT_DBG("conn %p len %d", conn, skb->len);
1146
1147 if (skb->len) {
1148 sco_recv_frame(conn, skb);
Arron Wang9b4c3332015-06-09 17:47:22 +08001149 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 }
1151
1152drop:
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001153 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154}
1155
Johan Hedberg539c4962015-02-18 14:53:57 +02001156static struct hci_cb sco_cb = {
1157 .name = "SCO",
1158 .connect_cfm = sco_connect_cfm,
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001159 .disconn_cfm = sco_disconn_cfm,
Johan Hedberg539c4962015-02-18 14:53:57 +02001160};
1161
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001162static int sco_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163{
1164 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001166 read_lock(&sco_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167
Sasha Levinb67bfe02013-02-27 17:06:00 -08001168 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmanneea96362013-10-13 10:34:01 -07001169 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src,
1170 &sco_pi(sk)->dst, sk->sk_state);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001171 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001173 read_unlock(&sco_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001174
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001175 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176}
1177
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001178static int sco_debugfs_open(struct inode *inode, struct file *file)
1179{
1180 return single_open(file, sco_debugfs_show, inode->i_private);
1181}
1182
1183static const struct file_operations sco_debugfs_fops = {
1184 .open = sco_debugfs_open,
1185 .read = seq_read,
1186 .llseek = seq_lseek,
1187 .release = single_release,
1188};
1189
1190static struct dentry *sco_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001192static const struct proto_ops sco_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 .family = PF_BLUETOOTH,
1194 .owner = THIS_MODULE,
1195 .release = sco_sock_release,
1196 .bind = sco_sock_bind,
1197 .connect = sco_sock_connect,
1198 .listen = sco_sock_listen,
1199 .accept = sco_sock_accept,
1200 .getname = sco_sock_getname,
1201 .sendmsg = sco_sock_sendmsg,
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001202 .recvmsg = sco_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02001204 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205 .mmap = sock_no_mmap,
1206 .socketpair = sock_no_socketpair,
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +02001207 .shutdown = sco_sock_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208 .setsockopt = sco_sock_setsockopt,
1209 .getsockopt = sco_sock_getsockopt
1210};
1211
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001212static const struct net_proto_family sco_sock_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 .family = PF_BLUETOOTH,
1214 .owner = THIS_MODULE,
1215 .create = sco_sock_create,
1216};
1217
Gustavo F. Padovan64274512011-02-07 20:08:52 -02001218int __init sco_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001219{
1220 int err;
1221
Marcel Holtmann15762fa2015-01-11 15:21:06 -08001222 BUILD_BUG_ON(sizeof(struct sockaddr_sco) > sizeof(struct sockaddr));
1223
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 err = proto_register(&sco_proto, 0);
1225 if (err < 0)
1226 return err;
1227
1228 err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
1229 if (err < 0) {
1230 BT_ERR("SCO socket registration failed");
1231 goto error;
1232 }
1233
Al Virob0316612013-04-04 19:14:33 -04001234 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001235 if (err < 0) {
1236 BT_ERR("Failed to create SCO proc file");
1237 bt_sock_unregister(BTPROTO_SCO);
1238 goto error;
1239 }
1240
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 BT_INFO("SCO socket layer initialized");
1242
Johan Hedberg539c4962015-02-18 14:53:57 +02001243 hci_register_cb(&sco_cb);
1244
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07001245 if (IS_ERR_OR_NULL(bt_debugfs))
1246 return 0;
1247
1248 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs,
1249 NULL, &sco_debugfs_fops);
1250
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251 return 0;
1252
1253error:
1254 proto_unregister(&sco_proto);
1255 return err;
1256}
1257
Alexander Aring0402d9f22015-03-07 20:52:28 +01001258void sco_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001259{
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001260 bt_procfs_cleanup(&init_net, "sco");
1261
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001262 debugfs_remove(sco_debugfs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263
Johan Hedberg539c4962015-02-18 14:53:57 +02001264 hci_unregister_cb(&sco_cb);
1265
David Herrmann5e9d7f82013-02-24 19:36:51 +01001266 bt_sock_unregister(BTPROTO_SCO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 proto_unregister(&sco_proto);
1269}
1270
Marcel Holtmann7cb127d2008-07-14 20:13:53 +02001271module_param(disable_esco, bool, 0644);
1272MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");