blob: 09051e4cbade132fd6e106fd48c1e5e36f36eb1a [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{
77 struct sock *sk = (struct sock *) arg;
78
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 Holtmann015b01c2014-07-13 19:54:48 +0200186static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
187{
188 BT_DBG("conn %p", conn);
189
190 sco_pi(sk)->conn = conn;
191 conn->sk = sk;
192
193 if (parent)
194 bt_accept_enqueue(parent, sk);
195}
196
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300197static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
198 struct sock *parent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199{
200 int err = 0;
201
202 sco_conn_lock(conn);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300203 if (conn->sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204 err = -EBUSY;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300205 else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206 __sco_chan_add(conn, sk, parent);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300207
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208 sco_conn_unlock(conn);
209 return err;
210}
211
212static int sco_connect(struct sock *sk)
213{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 struct sco_conn *conn;
215 struct hci_conn *hcon;
216 struct hci_dev *hdev;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200217 int err, type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218
Marcel Holtmanneea96362013-10-13 10:34:01 -0700219 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220
Marcel Holtmanneea96362013-10-13 10:34:01 -0700221 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src);
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200222 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 return -EHOSTUNREACH;
224
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300225 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226
Marcel Holtmann7cb127d2008-07-14 20:13:53 +0200227 if (lmp_esco_capable(hdev) && !disable_esco)
228 type = ESCO_LINK;
229 else
230 type = SCO_LINK;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200231
Frédéric Dalleau79dc0082013-08-19 14:24:01 +0200232 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
233 (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
234 err = -EOPNOTSUPP;
235 goto done;
236 }
237
Marcel Holtmanneea96362013-10-13 10:34:01 -0700238 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
Marcel Holtmann041987c2013-10-13 10:15:22 -0700239 sco_pi(sk)->setting);
Ville Tervo30e76272011-02-22 16:10:53 -0300240 if (IS_ERR(hcon)) {
241 err = PTR_ERR(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242 goto done;
Ville Tervo30e76272011-02-22 16:10:53 -0300243 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200245 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246 if (!conn) {
David Herrmann76a68ba2013-04-06 20:28:37 +0200247 hci_conn_drop(hcon);
Ville Tervo30e76272011-02-22 16:10:53 -0300248 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249 goto done;
250 }
251
252 /* Update source addr of the socket */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700253 bacpy(&sco_pi(sk)->src, &hcon->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254
255 err = sco_chan_add(conn, sk, NULL);
256 if (err)
257 goto done;
258
259 if (hcon->state == BT_CONNECTED) {
260 sco_sock_clear_timer(sk);
261 sk->sk_state = BT_CONNECTED;
262 } else {
263 sk->sk_state = BT_CONNECT;
264 sco_sock_set_timer(sk, sk->sk_sndtimeo);
265 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200266
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267done:
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300268 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 hci_dev_put(hdev);
270 return err;
271}
272
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300273static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274{
275 struct sco_conn *conn = sco_pi(sk)->conn;
276 struct sk_buff *skb;
Mikel Astiz088ce082012-04-11 08:48:48 +0200277 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278
279 /* Check outgoing MTU */
280 if (len > conn->mtu)
281 return -EINVAL;
282
283 BT_DBG("sk %p len %d", sk, len);
284
Mikel Astiz088ce082012-04-11 08:48:48 +0200285 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300286 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 return err;
288
Al Viro6ce8e9c2014-04-06 21:25:44 -0400289 if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300290 kfree_skb(skb);
291 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292 }
293
Gustavo F. Padovan0d861d82010-05-01 16:15:35 -0300294 hci_send_sco(conn->hcon, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295
Mikel Astiz088ce082012-04-11 08:48:48 +0200296 return len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297}
298
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300299static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300{
Marcel Holtmanneb5a4de2014-07-14 01:30:15 +0200301 struct sock *sk;
302
303 sco_conn_lock(conn);
304 sk = conn->sk;
305 sco_conn_unlock(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306
307 if (!sk)
308 goto drop;
309
310 BT_DBG("sk %p len %d", sk, skb->len);
311
312 if (sk->sk_state != BT_CONNECTED)
313 goto drop;
314
315 if (!sock_queue_rcv_skb(sk, skb))
316 return;
317
318drop:
319 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320}
321
322/* -------- Socket interface ---------- */
Marcel Holtmannfb334052012-04-19 14:37:58 +0200323static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324{
Marcel Holtmannfb334052012-04-19 14:37:58 +0200325 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326
Sasha Levinb67bfe02013-02-27 17:06:00 -0800327 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmannfb334052012-04-19 14:37:58 +0200328 if (sk->sk_state != BT_LISTEN)
329 continue;
330
Marcel Holtmanneea96362013-10-13 10:34:01 -0700331 if (!bacmp(&sco_pi(sk)->src, ba))
Marcel Holtmannfb334052012-04-19 14:37:58 +0200332 return sk;
333 }
334
335 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336}
337
338/* Find socket listening on source bdaddr.
339 * Returns closest match.
340 */
341static struct sock *sco_get_sock_listen(bdaddr_t *src)
342{
343 struct sock *sk = NULL, *sk1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344
345 read_lock(&sco_sk_list.lock);
346
Sasha Levinb67bfe02013-02-27 17:06:00 -0800347 sk_for_each(sk, &sco_sk_list.head) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 if (sk->sk_state != BT_LISTEN)
349 continue;
350
351 /* Exact match. */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700352 if (!bacmp(&sco_pi(sk)->src, src))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353 break;
354
355 /* Closest match */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700356 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357 sk1 = sk;
358 }
359
360 read_unlock(&sco_sk_list.lock);
361
Sasha Levinb67bfe02013-02-27 17:06:00 -0800362 return sk ? sk : sk1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363}
364
365static void sco_sock_destruct(struct sock *sk)
366{
367 BT_DBG("sk %p", sk);
368
369 skb_queue_purge(&sk->sk_receive_queue);
370 skb_queue_purge(&sk->sk_write_queue);
371}
372
373static void sco_sock_cleanup_listen(struct sock *parent)
374{
375 struct sock *sk;
376
377 BT_DBG("parent %p", parent);
378
379 /* Close not yet accepted channels */
380 while ((sk = bt_accept_dequeue(parent, NULL))) {
381 sco_sock_close(sk);
382 sco_sock_kill(sk);
383 }
384
385 parent->sk_state = BT_CLOSED;
386 sock_set_flag(parent, SOCK_ZAPPED);
387}
388
389/* Kill socket (only if zapped and orphan)
390 * Must be called on unlocked socket.
391 */
392static void sco_sock_kill(struct sock *sk)
393{
394 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
395 return;
396
397 BT_DBG("sk %p state %d", sk, sk->sk_state);
398
399 /* Kill poor orphan */
400 bt_sock_unlink(&sco_sk_list, sk);
401 sock_set_flag(sk, SOCK_DEAD);
402 sock_put(sk);
403}
404
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200405static void __sco_sock_close(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406{
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200407 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408
409 switch (sk->sk_state) {
410 case BT_LISTEN:
411 sco_sock_cleanup_listen(sk);
412 break;
413
414 case BT_CONNECTED:
415 case BT_CONFIG:
Gustavo Padovanb7e98b52013-01-03 19:59:28 -0200416 if (sco_pi(sk)->conn->hcon) {
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300417 sk->sk_state = BT_DISCONN;
418 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
Kuba Pawlak435c5132015-10-05 18:44:16 +0200419 sco_conn_lock(sco_pi(sk)->conn);
David Herrmann76a68ba2013-04-06 20:28:37 +0200420 hci_conn_drop(sco_pi(sk)->conn->hcon);
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300421 sco_pi(sk)->conn->hcon = NULL;
Kuba Pawlak435c5132015-10-05 18:44:16 +0200422 sco_conn_unlock(sco_pi(sk)->conn);
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300423 } else
424 sco_chan_del(sk, ECONNRESET);
425 break;
426
Vinicius Costa Gomeseb20ff92013-03-13 19:46:20 -0300427 case BT_CONNECT2:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 case BT_CONNECT:
429 case BT_DISCONN:
430 sco_chan_del(sk, ECONNRESET);
431 break;
432
433 default:
434 sock_set_flag(sk, SOCK_ZAPPED);
435 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -0700436 }
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200437}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700438
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200439/* Must be called on unlocked socket. */
440static void sco_sock_close(struct sock *sk)
441{
442 sco_sock_clear_timer(sk);
443 lock_sock(sk);
444 __sco_sock_close(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 sco_sock_kill(sk);
447}
448
449static void sco_sock_init(struct sock *sk, struct sock *parent)
450{
451 BT_DBG("sk %p", sk);
452
Paul Moore6230c9b2011-10-07 09:40:59 +0000453 if (parent) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 sk->sk_type = parent->sk_type;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100455 bt_sk(sk)->flags = bt_sk(parent)->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000456 security_sk_clone(parent, sk);
457 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458}
459
460static struct proto sco_proto = {
461 .name = "SCO",
462 .owner = THIS_MODULE,
463 .obj_size = sizeof(struct sco_pinfo)
464};
465
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500466static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700467{
468 struct sock *sk;
469
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500470 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471 if (!sk)
472 return NULL;
473
474 sock_init_data(sock, sk);
475 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
476
477 sk->sk_destruct = sco_sock_destruct;
478 sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
479
480 sock_reset_flag(sk, SOCK_ZAPPED);
481
482 sk->sk_protocol = proto;
483 sk->sk_state = BT_OPEN;
484
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200485 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
486
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800487 setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488
489 bt_sock_link(&sco_sk_list, sk);
490 return sk;
491}
492
Eric Paris3f378b62009-11-05 22:18:14 -0800493static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
494 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495{
496 struct sock *sk;
497
498 BT_DBG("sock %p", sock);
499
500 sock->state = SS_UNCONNECTED;
501
502 if (sock->type != SOCK_SEQPACKET)
503 return -ESOCKTNOSUPPORT;
504
505 sock->ops = &sco_sock_ops;
506
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500507 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Marcel Holtmann74da6262006-10-15 17:31:14 +0200508 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 return -ENOMEM;
510
511 sco_sock_init(sk, NULL);
512 return 0;
513}
514
515static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
516{
517 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
518 struct sock *sk = sock->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519 int err = 0;
520
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +0300521 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522
523 if (!addr || addr->sa_family != AF_BLUETOOTH)
524 return -EINVAL;
525
526 lock_sock(sk);
527
528 if (sk->sk_state != BT_OPEN) {
529 err = -EBADFD;
530 goto done;
531 }
532
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200533 if (sk->sk_type != SOCK_SEQPACKET) {
534 err = -EINVAL;
535 goto done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 }
537
Marcel Holtmanneea96362013-10-13 10:34:01 -0700538 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr);
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200539
540 sk->sk_state = BT_BOUND;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541
542done:
543 release_sock(sk);
544 return err;
545}
546
547static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
548{
549 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
550 struct sock *sk = sock->sk;
Claudio Takahasi92f185c2013-04-11 11:35:46 -0300551 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552
553 BT_DBG("sk %p", sk);
554
Changli Gao6503d962010-03-31 22:58:26 +0000555 if (alen < sizeof(struct sockaddr_sco) ||
556 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557 return -EINVAL;
558
559 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
560 return -EBADFD;
561
562 if (sk->sk_type != SOCK_SEQPACKET)
563 return -EINVAL;
564
565 lock_sock(sk);
566
567 /* Set destination address and psm */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700568 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200570 err = sco_connect(sk);
571 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 goto done;
573
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900574 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300575 sock_sndtimeo(sk, flags & O_NONBLOCK));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576
577done:
578 release_sock(sk);
579 return err;
580}
581
582static int sco_sock_listen(struct socket *sock, int backlog)
583{
584 struct sock *sk = sock->sk;
Marcel Holtmanneea96362013-10-13 10:34:01 -0700585 bdaddr_t *src = &sco_pi(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 int err = 0;
587
588 BT_DBG("sk %p backlog %d", sk, backlog);
589
590 lock_sock(sk);
591
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200592 if (sk->sk_state != BT_BOUND) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593 err = -EBADFD;
594 goto done;
595 }
596
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200597 if (sk->sk_type != SOCK_SEQPACKET) {
598 err = -EINVAL;
599 goto done;
600 }
601
Marcel Holtmannfb334052012-04-19 14:37:58 +0200602 write_lock(&sco_sk_list.lock);
603
604 if (__sco_get_sock_listen_by_addr(src)) {
605 err = -EADDRINUSE;
606 goto unlock;
607 }
608
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609 sk->sk_max_ack_backlog = backlog;
610 sk->sk_ack_backlog = 0;
Marcel Holtmannfb334052012-04-19 14:37:58 +0200611
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612 sk->sk_state = BT_LISTEN;
613
Marcel Holtmannfb334052012-04-19 14:37:58 +0200614unlock:
615 write_unlock(&sco_sk_list.lock);
616
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617done:
618 release_sock(sk);
619 return err;
620}
621
622static int sco_sock_accept(struct socket *sock, struct socket *newsock, int flags)
623{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500624 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700625 struct sock *sk = sock->sk, *ch;
626 long timeo;
627 int err = 0;
628
629 lock_sock(sk);
630
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
632
633 BT_DBG("sk %p timeo %ld", sk, timeo);
634
635 /* Wait for an incoming connection. (wake-one). */
Eric Dumazetaa395142010-04-20 13:03:51 +0000636 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurley552b0d32011-07-24 00:11:01 -0400637 while (1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638 if (sk->sk_state != BT_LISTEN) {
639 err = -EBADFD;
640 break;
641 }
642
Peter Hurley552b0d32011-07-24 00:11:01 -0400643 ch = bt_accept_dequeue(sk, newsock);
644 if (ch)
645 break;
646
647 if (!timeo) {
648 err = -EAGAIN;
649 break;
650 }
651
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652 if (signal_pending(current)) {
653 err = sock_intr_errno(timeo);
654 break;
655 }
Peter Hurley552b0d32011-07-24 00:11:01 -0400656
657 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500658
659 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
Peter Hurley552b0d32011-07-24 00:11:01 -0400660 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 }
Eric Dumazetaa395142010-04-20 13:03:51 +0000662 remove_wait_queue(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663
664 if (err)
665 goto done;
666
667 newsock->state = SS_CONNECTED;
668
669 BT_DBG("new socket %p", ch);
670
671done:
672 release_sock(sk);
673 return err;
674}
675
676static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
677{
678 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
679 struct sock *sk = sock->sk;
680
681 BT_DBG("sock %p, sk %p", sock, sk);
682
683 addr->sa_family = AF_BLUETOOTH;
684 *len = sizeof(struct sockaddr_sco);
685
686 if (peer)
Marcel Holtmanneea96362013-10-13 10:34:01 -0700687 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 else
Marcel Holtmanneea96362013-10-13 10:34:01 -0700689 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690
691 return 0;
692}
693
Ying Xue1b784142015-03-02 15:37:48 +0800694static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
695 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696{
697 struct sock *sk = sock->sk;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300698 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699
700 BT_DBG("sock %p, sk %p", sock, sk);
701
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -0800702 err = sock_error(sk);
703 if (err)
704 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705
706 if (msg->msg_flags & MSG_OOB)
707 return -EOPNOTSUPP;
708
709 lock_sock(sk);
710
711 if (sk->sk_state == BT_CONNECTED)
712 err = sco_send_frame(sk, msg, len);
713 else
714 err = -ENOTCONN;
715
716 release_sock(sk);
717 return err;
718}
719
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200720static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200721{
722 struct hci_dev *hdev = conn->hdev;
723
724 BT_DBG("conn %p", conn);
725
726 conn->state = BT_CONFIG;
727
728 if (!lmp_esco_capable(hdev)) {
729 struct hci_cp_accept_conn_req cp;
730
731 bacpy(&cp.bdaddr, &conn->dst);
Frédéric Dalleau33f24042013-08-19 14:23:55 +0200732 cp.role = 0x00; /* Ignored */
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200733
734 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
735 } else {
736 struct hci_cp_accept_sync_conn_req cp;
737
738 bacpy(&cp.bdaddr, &conn->dst);
739 cp.pkt_type = cpu_to_le16(conn->pkt_type);
740
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700741 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
742 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200743 cp.content_format = cpu_to_le16(setting);
744
745 switch (setting & SCO_AIRMODE_MASK) {
746 case SCO_AIRMODE_TRANSP:
747 if (conn->pkt_type & ESCO_2EV3)
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700748 cp.max_latency = cpu_to_le16(0x0008);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200749 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700750 cp.max_latency = cpu_to_le16(0x000D);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200751 cp.retrans_effort = 0x02;
752 break;
753 case SCO_AIRMODE_CVSD:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700754 cp.max_latency = cpu_to_le16(0xffff);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200755 cp.retrans_effort = 0xff;
756 break;
757 }
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200758
759 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
760 sizeof(cp), &cp);
761 }
762}
763
Ying Xue1b784142015-03-02 15:37:48 +0800764static int sco_sock_recvmsg(struct socket *sock, struct msghdr *msg,
765 size_t len, int flags)
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100766{
767 struct sock *sk = sock->sk;
768 struct sco_pinfo *pi = sco_pi(sk);
769
770 lock_sock(sk);
771
772 if (sk->sk_state == BT_CONNECT2 &&
773 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200774 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100775 sk->sk_state = BT_CONFIG;
776
777 release_sock(sk);
778 return 0;
779 }
780
781 release_sock(sk);
782
Ying Xue1b784142015-03-02 15:37:48 +0800783 return bt_sock_recvmsg(sock, msg, len, flags);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100784}
785
David S. Millerb7058842009-09-30 16:12:20 -0700786static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787{
788 struct sock *sk = sock->sk;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200789 int len, err = 0;
790 struct bt_voice voice;
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100791 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792
793 BT_DBG("sk %p", sk);
794
795 lock_sock(sk);
796
797 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100798
799 case BT_DEFER_SETUP:
800 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
801 err = -EINVAL;
802 break;
803 }
804
805 if (get_user(opt, (u32 __user *) optval)) {
806 err = -EFAULT;
807 break;
808 }
809
810 if (opt)
811 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
812 else
813 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
814 break;
815
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200816 case BT_VOICE:
817 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
818 sk->sk_state != BT_CONNECT2) {
819 err = -EINVAL;
820 break;
821 }
822
823 voice.setting = sco_pi(sk)->setting;
824
825 len = min_t(unsigned int, sizeof(voice), optlen);
826 if (copy_from_user((char *) &voice, optval, len)) {
827 err = -EFAULT;
828 break;
829 }
830
831 /* Explicitly check for these values */
832 if (voice.setting != BT_VOICE_TRANSPARENT &&
833 voice.setting != BT_VOICE_CVSD_16BIT) {
834 err = -EINVAL;
835 break;
836 }
837
838 sco_pi(sk)->setting = voice.setting;
839 break;
840
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841 default:
842 err = -ENOPROTOOPT;
843 break;
844 }
845
846 release_sock(sk);
847 return err;
848}
849
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100850static int sco_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851{
852 struct sock *sk = sock->sk;
853 struct sco_options opts;
854 struct sco_conninfo cinfo;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900855 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856
857 BT_DBG("sk %p", sk);
858
859 if (get_user(len, optlen))
860 return -EFAULT;
861
862 lock_sock(sk);
863
864 switch (optname) {
865 case SCO_OPTIONS:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300866 if (sk->sk_state != BT_CONNECTED &&
867 !(sk->sk_state == BT_CONNECT2 &&
868 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869 err = -ENOTCONN;
870 break;
871 }
872
873 opts.mtu = sco_pi(sk)->conn->mtu;
874
875 BT_DBG("mtu %d", opts.mtu);
876
877 len = min_t(unsigned int, len, sizeof(opts));
878 if (copy_to_user(optval, (char *)&opts, len))
879 err = -EFAULT;
880
881 break;
882
883 case SCO_CONNINFO:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300884 if (sk->sk_state != BT_CONNECTED &&
885 !(sk->sk_state == BT_CONNECT2 &&
886 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887 err = -ENOTCONN;
888 break;
889 }
890
Vasiliy Kulikovc4c896e2011-02-14 13:54:26 +0300891 memset(&cinfo, 0, sizeof(cinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
893 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
894
895 len = min_t(unsigned int, len, sizeof(cinfo));
896 if (copy_to_user(optval, (char *)&cinfo, len))
897 err = -EFAULT;
898
899 break;
900
901 default:
902 err = -ENOPROTOOPT;
903 break;
904 }
905
906 release_sock(sk);
907 return err;
908}
909
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100910static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
911{
912 struct sock *sk = sock->sk;
913 int len, err = 0;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200914 struct bt_voice voice;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100915
916 BT_DBG("sk %p", sk);
917
918 if (level == SOL_SCO)
919 return sco_sock_getsockopt_old(sock, optname, optval, optlen);
920
921 if (get_user(len, optlen))
922 return -EFAULT;
923
924 lock_sock(sk);
925
926 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100927
928 case BT_DEFER_SETUP:
929 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
930 err = -EINVAL;
931 break;
932 }
933
934 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
935 (u32 __user *) optval))
936 err = -EFAULT;
937
938 break;
939
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200940 case BT_VOICE:
941 voice.setting = sco_pi(sk)->setting;
942
943 len = min_t(unsigned int, len, sizeof(voice));
944 if (copy_to_user(optval, (char *)&voice, len))
945 err = -EFAULT;
946
947 break;
948
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100949 default:
950 err = -ENOPROTOOPT;
951 break;
952 }
953
954 release_sock(sk);
955 return err;
956}
957
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200958static int sco_sock_shutdown(struct socket *sock, int how)
959{
960 struct sock *sk = sock->sk;
961 int err = 0;
962
963 BT_DBG("sock %p, sk %p", sock, sk);
964
965 if (!sk)
966 return 0;
967
968 lock_sock(sk);
969 if (!sk->sk_shutdown) {
970 sk->sk_shutdown = SHUTDOWN_MASK;
971 sco_sock_clear_timer(sk);
972 __sco_sock_close(sk);
973
Vladimir Davydov093facf2014-07-15 12:25:28 +0400974 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
975 !(current->flags & PF_EXITING))
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200976 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300977 sk->sk_lingertime);
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200978 }
979 release_sock(sk);
980 return err;
981}
982
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983static int sco_sock_release(struct socket *sock)
984{
985 struct sock *sk = sock->sk;
986 int err = 0;
987
988 BT_DBG("sock %p, sk %p", sock, sk);
989
990 if (!sk)
991 return 0;
992
993 sco_sock_close(sk);
994
Vladimir Davydov093facf2014-07-15 12:25:28 +0400995 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
996 !(current->flags & PF_EXITING)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 lock_sock(sk);
998 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
999 release_sock(sk);
1000 }
1001
1002 sock_orphan(sk);
1003 sco_sock_kill(sk);
1004 return err;
1005}
1006
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007static void sco_conn_ready(struct sco_conn *conn)
1008{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001009 struct sock *parent;
1010 struct sock *sk = conn->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011
1012 BT_DBG("conn %p", conn);
1013
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001014 if (sk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015 sco_sock_clear_timer(sk);
1016 bh_lock_sock(sk);
1017 sk->sk_state = BT_CONNECTED;
1018 sk->sk_state_change(sk);
1019 bh_unlock_sock(sk);
1020 } else {
Andre Guedes40528082013-01-29 19:59:56 -03001021 sco_conn_lock(conn);
1022
Marcel Holtmann041987c2013-10-13 10:15:22 -07001023 parent = sco_get_sock_listen(&conn->hcon->src);
Andre Guedes40528082013-01-29 19:59:56 -03001024 if (!parent) {
1025 sco_conn_unlock(conn);
1026 return;
1027 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001028
1029 bh_lock_sock(parent);
1030
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -03001031 sk = sco_sock_alloc(sock_net(parent), NULL,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001032 BTPROTO_SCO, GFP_ATOMIC, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 if (!sk) {
1034 bh_unlock_sock(parent);
Andre Guedes40528082013-01-29 19:59:56 -03001035 sco_conn_unlock(conn);
1036 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 }
1038
1039 sco_sock_init(sk, parent);
1040
Marcel Holtmanneea96362013-10-13 10:34:01 -07001041 bacpy(&sco_pi(sk)->src, &conn->hcon->src);
1042 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043
1044 hci_conn_hold(conn->hcon);
1045 __sco_chan_add(conn, sk, parent);
1046
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001047 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
1048 sk->sk_state = BT_CONNECT2;
1049 else
1050 sk->sk_state = BT_CONNECTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051
1052 /* Wake up parent */
David S. Miller676d2362014-04-11 16:15:36 -04001053 parent->sk_data_ready(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054
1055 bh_unlock_sock(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056
Andre Guedes40528082013-01-29 19:59:56 -03001057 sco_conn_unlock(conn);
1058 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059}
1060
1061/* ----- SCO interface with lower layer (HCI) ----- */
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001062int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063{
Gustavo Padovanfc5fef62012-05-23 04:04:19 -03001064 struct sock *sk;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001065 int lm = 0;
1066
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001067 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001069 /* Find listening sockets */
1070 read_lock(&sco_sk_list.lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -08001071 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001072 if (sk->sk_state != BT_LISTEN)
1073 continue;
1074
Marcel Holtmanneea96362013-10-13 10:34:01 -07001075 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) ||
1076 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001077 lm |= HCI_LM_ACCEPT;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001078
1079 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
1080 *flags |= HCI_PROTO_DEFER;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001081 break;
1082 }
1083 }
1084 read_unlock(&sco_sk_list.lock);
1085
1086 return lm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087}
1088
Johan Hedberg539c4962015-02-18 14:53:57 +02001089static void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090{
Johan Hedberg539c4962015-02-18 14:53:57 +02001091 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1092 return;
1093
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001094 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Johan Hedberg539c4962015-02-18 14:53:57 +02001095
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 if (!status) {
1097 struct sco_conn *conn;
1098
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +02001099 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 if (conn)
1101 sco_conn_ready(conn);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001102 } else
Joe Perchese1750722011-06-29 18:18:29 -07001103 sco_conn_del(hcon, bt_to_errno(status));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104}
1105
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001106static void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107{
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001108 if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
1109 return;
1110
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 BT_DBG("hcon %p reason %d", hcon, reason);
1112
Joe Perchese1750722011-06-29 18:18:29 -07001113 sco_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114}
1115
Arron Wang9b4c3332015-06-09 17:47:22 +08001116void sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117{
1118 struct sco_conn *conn = hcon->sco_data;
1119
1120 if (!conn)
1121 goto drop;
1122
1123 BT_DBG("conn %p len %d", conn, skb->len);
1124
1125 if (skb->len) {
1126 sco_recv_frame(conn, skb);
Arron Wang9b4c3332015-06-09 17:47:22 +08001127 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128 }
1129
1130drop:
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001131 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132}
1133
Johan Hedberg539c4962015-02-18 14:53:57 +02001134static struct hci_cb sco_cb = {
1135 .name = "SCO",
1136 .connect_cfm = sco_connect_cfm,
Johan Hedberg3a6d5762015-02-18 14:53:58 +02001137 .disconn_cfm = sco_disconn_cfm,
Johan Hedberg539c4962015-02-18 14:53:57 +02001138};
1139
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001140static int sco_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141{
1142 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001144 read_lock(&sco_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145
Sasha Levinb67bfe02013-02-27 17:06:00 -08001146 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmanneea96362013-10-13 10:34:01 -07001147 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src,
1148 &sco_pi(sk)->dst, sk->sk_state);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001149 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001151 read_unlock(&sco_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001152
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001153 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154}
1155
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001156static int sco_debugfs_open(struct inode *inode, struct file *file)
1157{
1158 return single_open(file, sco_debugfs_show, inode->i_private);
1159}
1160
1161static const struct file_operations sco_debugfs_fops = {
1162 .open = sco_debugfs_open,
1163 .read = seq_read,
1164 .llseek = seq_lseek,
1165 .release = single_release,
1166};
1167
1168static struct dentry *sco_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001170static const struct proto_ops sco_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 .family = PF_BLUETOOTH,
1172 .owner = THIS_MODULE,
1173 .release = sco_sock_release,
1174 .bind = sco_sock_bind,
1175 .connect = sco_sock_connect,
1176 .listen = sco_sock_listen,
1177 .accept = sco_sock_accept,
1178 .getname = sco_sock_getname,
1179 .sendmsg = sco_sock_sendmsg,
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001180 .recvmsg = sco_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02001182 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183 .mmap = sock_no_mmap,
1184 .socketpair = sock_no_socketpair,
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +02001185 .shutdown = sco_sock_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186 .setsockopt = sco_sock_setsockopt,
1187 .getsockopt = sco_sock_getsockopt
1188};
1189
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001190static const struct net_proto_family sco_sock_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 .family = PF_BLUETOOTH,
1192 .owner = THIS_MODULE,
1193 .create = sco_sock_create,
1194};
1195
Gustavo F. Padovan64274512011-02-07 20:08:52 -02001196int __init sco_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197{
1198 int err;
1199
Marcel Holtmann15762fa2015-01-11 15:21:06 -08001200 BUILD_BUG_ON(sizeof(struct sockaddr_sco) > sizeof(struct sockaddr));
1201
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 err = proto_register(&sco_proto, 0);
1203 if (err < 0)
1204 return err;
1205
1206 err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
1207 if (err < 0) {
1208 BT_ERR("SCO socket registration failed");
1209 goto error;
1210 }
1211
Al Virob0316612013-04-04 19:14:33 -04001212 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001213 if (err < 0) {
1214 BT_ERR("Failed to create SCO proc file");
1215 bt_sock_unregister(BTPROTO_SCO);
1216 goto error;
1217 }
1218
Linus Torvalds1da177e2005-04-16 15:20:36 -07001219 BT_INFO("SCO socket layer initialized");
1220
Johan Hedberg539c4962015-02-18 14:53:57 +02001221 hci_register_cb(&sco_cb);
1222
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07001223 if (IS_ERR_OR_NULL(bt_debugfs))
1224 return 0;
1225
1226 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs,
1227 NULL, &sco_debugfs_fops);
1228
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229 return 0;
1230
1231error:
1232 proto_unregister(&sco_proto);
1233 return err;
1234}
1235
Alexander Aring0402d9f22015-03-07 20:52:28 +01001236void sco_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237{
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001238 bt_procfs_cleanup(&init_net, "sco");
1239
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001240 debugfs_remove(sco_debugfs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241
Johan Hedberg539c4962015-02-18 14:53:57 +02001242 hci_unregister_cb(&sco_cb);
1243
David Herrmann5e9d7f82013-02-24 19:36:51 +01001244 bt_sock_unregister(BTPROTO_SCO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001245
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246 proto_unregister(&sco_proto);
1247}
1248
Marcel Holtmann7cb127d2008-07-14 20:13:53 +02001249module_param(disable_esco, bool, 0644);
1250MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");