blob: 9868ec7c7dc47f37bdc3d1da25718e39dbab9490 [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_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent);
57static void sco_chan_del(struct sock *sk, int err);
58
Linus Torvalds1da177e2005-04-16 15:20:36 -070059static void sco_sock_close(struct sock *sk);
60static void sco_sock_kill(struct sock *sk);
61
Marcel Holtmann2a0dccb2014-07-11 06:19:41 +020062/* ----- SCO socket info ----- */
63#define sco_pi(sk) ((struct sco_pinfo *) sk)
64
65struct sco_pinfo {
66 struct bt_sock bt;
67 bdaddr_t src;
68 bdaddr_t dst;
69 __u32 flags;
70 __u16 setting;
71 struct sco_conn *conn;
72};
73
Linus Torvalds1da177e2005-04-16 15:20:36 -070074/* ---- SCO timers ---- */
75static 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
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300130static struct sock *sco_chan_get(struct sco_conn *conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131{
132 struct sock *sk = NULL;
133 sco_conn_lock(conn);
134 sk = conn->sk;
135 sco_conn_unlock(conn);
136 return sk;
137}
138
139static int sco_conn_del(struct hci_conn *hcon, int err)
140{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200141 struct sco_conn *conn = hcon->sco_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142 struct sock *sk;
143
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200144 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 return 0;
146
147 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
148
149 /* Kill socket */
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200150 sk = sco_chan_get(conn);
151 if (sk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152 bh_lock_sock(sk);
153 sco_sock_clear_timer(sk);
154 sco_chan_del(sk, err);
155 bh_unlock_sock(sk);
156 sco_sock_kill(sk);
157 }
158
159 hcon->sco_data = NULL;
160 kfree(conn);
161 return 0;
162}
163
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300164static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
165 struct sock *parent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166{
167 int err = 0;
168
169 sco_conn_lock(conn);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300170 if (conn->sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171 err = -EBUSY;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300172 else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700173 __sco_chan_add(conn, sk, parent);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300174
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175 sco_conn_unlock(conn);
176 return err;
177}
178
179static int sco_connect(struct sock *sk)
180{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181 struct sco_conn *conn;
182 struct hci_conn *hcon;
183 struct hci_dev *hdev;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200184 int err, type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185
Marcel Holtmanneea96362013-10-13 10:34:01 -0700186 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187
Marcel Holtmanneea96362013-10-13 10:34:01 -0700188 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src);
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200189 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 return -EHOSTUNREACH;
191
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300192 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193
Marcel Holtmann7cb127d2008-07-14 20:13:53 +0200194 if (lmp_esco_capable(hdev) && !disable_esco)
195 type = ESCO_LINK;
196 else
197 type = SCO_LINK;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200198
Frédéric Dalleau79dc0082013-08-19 14:24:01 +0200199 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
200 (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
201 err = -EOPNOTSUPP;
202 goto done;
203 }
204
Marcel Holtmanneea96362013-10-13 10:34:01 -0700205 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
Marcel Holtmann041987c2013-10-13 10:15:22 -0700206 sco_pi(sk)->setting);
Ville Tervo30e76272011-02-22 16:10:53 -0300207 if (IS_ERR(hcon)) {
208 err = PTR_ERR(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 goto done;
Ville Tervo30e76272011-02-22 16:10:53 -0300210 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200212 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213 if (!conn) {
David Herrmann76a68ba2013-04-06 20:28:37 +0200214 hci_conn_drop(hcon);
Ville Tervo30e76272011-02-22 16:10:53 -0300215 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216 goto done;
217 }
218
219 /* Update source addr of the socket */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700220 bacpy(&sco_pi(sk)->src, &hcon->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221
222 err = sco_chan_add(conn, sk, NULL);
223 if (err)
224 goto done;
225
226 if (hcon->state == BT_CONNECTED) {
227 sco_sock_clear_timer(sk);
228 sk->sk_state = BT_CONNECTED;
229 } else {
230 sk->sk_state = BT_CONNECT;
231 sco_sock_set_timer(sk, sk->sk_sndtimeo);
232 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200233
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234done:
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300235 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236 hci_dev_put(hdev);
237 return err;
238}
239
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300240static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241{
242 struct sco_conn *conn = sco_pi(sk)->conn;
243 struct sk_buff *skb;
Mikel Astiz088ce082012-04-11 08:48:48 +0200244 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245
246 /* Check outgoing MTU */
247 if (len > conn->mtu)
248 return -EINVAL;
249
250 BT_DBG("sk %p len %d", sk, len);
251
Mikel Astiz088ce082012-04-11 08:48:48 +0200252 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300253 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254 return err;
255
Mikel Astiz088ce082012-04-11 08:48:48 +0200256 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300257 kfree_skb(skb);
258 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259 }
260
Gustavo F. Padovan0d861d82010-05-01 16:15:35 -0300261 hci_send_sco(conn->hcon, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262
Mikel Astiz088ce082012-04-11 08:48:48 +0200263 return len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264}
265
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300266static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267{
268 struct sock *sk = sco_chan_get(conn);
269
270 if (!sk)
271 goto drop;
272
273 BT_DBG("sk %p len %d", sk, skb->len);
274
275 if (sk->sk_state != BT_CONNECTED)
276 goto drop;
277
278 if (!sock_queue_rcv_skb(sk, skb))
279 return;
280
281drop:
282 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283}
284
285/* -------- Socket interface ---------- */
Marcel Holtmannfb334052012-04-19 14:37:58 +0200286static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287{
Marcel Holtmannfb334052012-04-19 14:37:58 +0200288 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289
Sasha Levinb67bfe02013-02-27 17:06:00 -0800290 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmannfb334052012-04-19 14:37:58 +0200291 if (sk->sk_state != BT_LISTEN)
292 continue;
293
Marcel Holtmanneea96362013-10-13 10:34:01 -0700294 if (!bacmp(&sco_pi(sk)->src, ba))
Marcel Holtmannfb334052012-04-19 14:37:58 +0200295 return sk;
296 }
297
298 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299}
300
301/* Find socket listening on source bdaddr.
302 * Returns closest match.
303 */
304static struct sock *sco_get_sock_listen(bdaddr_t *src)
305{
306 struct sock *sk = NULL, *sk1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307
308 read_lock(&sco_sk_list.lock);
309
Sasha Levinb67bfe02013-02-27 17:06:00 -0800310 sk_for_each(sk, &sco_sk_list.head) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311 if (sk->sk_state != BT_LISTEN)
312 continue;
313
314 /* Exact match. */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700315 if (!bacmp(&sco_pi(sk)->src, src))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316 break;
317
318 /* Closest match */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700319 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320 sk1 = sk;
321 }
322
323 read_unlock(&sco_sk_list.lock);
324
Sasha Levinb67bfe02013-02-27 17:06:00 -0800325 return sk ? sk : sk1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326}
327
328static void sco_sock_destruct(struct sock *sk)
329{
330 BT_DBG("sk %p", sk);
331
332 skb_queue_purge(&sk->sk_receive_queue);
333 skb_queue_purge(&sk->sk_write_queue);
334}
335
336static void sco_sock_cleanup_listen(struct sock *parent)
337{
338 struct sock *sk;
339
340 BT_DBG("parent %p", parent);
341
342 /* Close not yet accepted channels */
343 while ((sk = bt_accept_dequeue(parent, NULL))) {
344 sco_sock_close(sk);
345 sco_sock_kill(sk);
346 }
347
348 parent->sk_state = BT_CLOSED;
349 sock_set_flag(parent, SOCK_ZAPPED);
350}
351
352/* Kill socket (only if zapped and orphan)
353 * Must be called on unlocked socket.
354 */
355static void sco_sock_kill(struct sock *sk)
356{
357 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
358 return;
359
360 BT_DBG("sk %p state %d", sk, sk->sk_state);
361
362 /* Kill poor orphan */
363 bt_sock_unlink(&sco_sk_list, sk);
364 sock_set_flag(sk, SOCK_DEAD);
365 sock_put(sk);
366}
367
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200368static void __sco_sock_close(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369{
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200370 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371
372 switch (sk->sk_state) {
373 case BT_LISTEN:
374 sco_sock_cleanup_listen(sk);
375 break;
376
377 case BT_CONNECTED:
378 case BT_CONFIG:
Gustavo Padovanb7e98b52013-01-03 19:59:28 -0200379 if (sco_pi(sk)->conn->hcon) {
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300380 sk->sk_state = BT_DISCONN;
381 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
David Herrmann76a68ba2013-04-06 20:28:37 +0200382 hci_conn_drop(sco_pi(sk)->conn->hcon);
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300383 sco_pi(sk)->conn->hcon = NULL;
384 } else
385 sco_chan_del(sk, ECONNRESET);
386 break;
387
Vinicius Costa Gomeseb20ff92013-03-13 19:46:20 -0300388 case BT_CONNECT2:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389 case BT_CONNECT:
390 case BT_DISCONN:
391 sco_chan_del(sk, ECONNRESET);
392 break;
393
394 default:
395 sock_set_flag(sk, SOCK_ZAPPED);
396 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -0700397 }
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200398}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200400/* Must be called on unlocked socket. */
401static void sco_sock_close(struct sock *sk)
402{
403 sco_sock_clear_timer(sk);
404 lock_sock(sk);
405 __sco_sock_close(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407 sco_sock_kill(sk);
408}
409
410static void sco_sock_init(struct sock *sk, struct sock *parent)
411{
412 BT_DBG("sk %p", sk);
413
Paul Moore6230c9b2011-10-07 09:40:59 +0000414 if (parent) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415 sk->sk_type = parent->sk_type;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100416 bt_sk(sk)->flags = bt_sk(parent)->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000417 security_sk_clone(parent, sk);
418 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419}
420
421static struct proto sco_proto = {
422 .name = "SCO",
423 .owner = THIS_MODULE,
424 .obj_size = sizeof(struct sco_pinfo)
425};
426
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700427static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428{
429 struct sock *sk;
430
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700431 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 if (!sk)
433 return NULL;
434
435 sock_init_data(sock, sk);
436 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
437
438 sk->sk_destruct = sco_sock_destruct;
439 sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
440
441 sock_reset_flag(sk, SOCK_ZAPPED);
442
443 sk->sk_protocol = proto;
444 sk->sk_state = BT_OPEN;
445
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200446 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
447
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800448 setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449
450 bt_sock_link(&sco_sk_list, sk);
451 return sk;
452}
453
Eric Paris3f378b62009-11-05 22:18:14 -0800454static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
455 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456{
457 struct sock *sk;
458
459 BT_DBG("sock %p", sock);
460
461 sock->state = SS_UNCONNECTED;
462
463 if (sock->type != SOCK_SEQPACKET)
464 return -ESOCKTNOSUPPORT;
465
466 sock->ops = &sco_sock_ops;
467
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700468 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC);
Marcel Holtmann74da6262006-10-15 17:31:14 +0200469 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 return -ENOMEM;
471
472 sco_sock_init(sk, NULL);
473 return 0;
474}
475
476static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
477{
478 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
479 struct sock *sk = sock->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480 int err = 0;
481
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +0300482 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483
484 if (!addr || addr->sa_family != AF_BLUETOOTH)
485 return -EINVAL;
486
487 lock_sock(sk);
488
489 if (sk->sk_state != BT_OPEN) {
490 err = -EBADFD;
491 goto done;
492 }
493
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200494 if (sk->sk_type != SOCK_SEQPACKET) {
495 err = -EINVAL;
496 goto done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 }
498
Marcel Holtmanneea96362013-10-13 10:34:01 -0700499 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr);
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200500
501 sk->sk_state = BT_BOUND;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502
503done:
504 release_sock(sk);
505 return err;
506}
507
508static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
509{
510 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
511 struct sock *sk = sock->sk;
Claudio Takahasi92f185c2013-04-11 11:35:46 -0300512 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513
514 BT_DBG("sk %p", sk);
515
Changli Gao6503d962010-03-31 22:58:26 +0000516 if (alen < sizeof(struct sockaddr_sco) ||
517 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518 return -EINVAL;
519
520 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
521 return -EBADFD;
522
523 if (sk->sk_type != SOCK_SEQPACKET)
524 return -EINVAL;
525
526 lock_sock(sk);
527
528 /* Set destination address and psm */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700529 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200531 err = sco_connect(sk);
532 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533 goto done;
534
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900535 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300536 sock_sndtimeo(sk, flags & O_NONBLOCK));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537
538done:
539 release_sock(sk);
540 return err;
541}
542
543static int sco_sock_listen(struct socket *sock, int backlog)
544{
545 struct sock *sk = sock->sk;
Marcel Holtmanneea96362013-10-13 10:34:01 -0700546 bdaddr_t *src = &sco_pi(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 int err = 0;
548
549 BT_DBG("sk %p backlog %d", sk, backlog);
550
551 lock_sock(sk);
552
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200553 if (sk->sk_state != BT_BOUND) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554 err = -EBADFD;
555 goto done;
556 }
557
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200558 if (sk->sk_type != SOCK_SEQPACKET) {
559 err = -EINVAL;
560 goto done;
561 }
562
Marcel Holtmannfb334052012-04-19 14:37:58 +0200563 write_lock(&sco_sk_list.lock);
564
565 if (__sco_get_sock_listen_by_addr(src)) {
566 err = -EADDRINUSE;
567 goto unlock;
568 }
569
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 sk->sk_max_ack_backlog = backlog;
571 sk->sk_ack_backlog = 0;
Marcel Holtmannfb334052012-04-19 14:37:58 +0200572
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 sk->sk_state = BT_LISTEN;
574
Marcel Holtmannfb334052012-04-19 14:37:58 +0200575unlock:
576 write_unlock(&sco_sk_list.lock);
577
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578done:
579 release_sock(sk);
580 return err;
581}
582
583static int sco_sock_accept(struct socket *sock, struct socket *newsock, int flags)
584{
585 DECLARE_WAITQUEUE(wait, current);
586 struct sock *sk = sock->sk, *ch;
587 long timeo;
588 int err = 0;
589
590 lock_sock(sk);
591
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
593
594 BT_DBG("sk %p timeo %ld", sk, timeo);
595
596 /* Wait for an incoming connection. (wake-one). */
Eric Dumazetaa395142010-04-20 13:03:51 +0000597 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurley552b0d32011-07-24 00:11:01 -0400598 while (1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599 set_current_state(TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600
601 if (sk->sk_state != BT_LISTEN) {
602 err = -EBADFD;
603 break;
604 }
605
Peter Hurley552b0d32011-07-24 00:11:01 -0400606 ch = bt_accept_dequeue(sk, newsock);
607 if (ch)
608 break;
609
610 if (!timeo) {
611 err = -EAGAIN;
612 break;
613 }
614
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615 if (signal_pending(current)) {
616 err = sock_intr_errno(timeo);
617 break;
618 }
Peter Hurley552b0d32011-07-24 00:11:01 -0400619
620 release_sock(sk);
621 timeo = schedule_timeout(timeo);
622 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 }
Peter Hurley552b0d32011-07-24 00:11:01 -0400624 __set_current_state(TASK_RUNNING);
Eric Dumazetaa395142010-04-20 13:03:51 +0000625 remove_wait_queue(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626
627 if (err)
628 goto done;
629
630 newsock->state = SS_CONNECTED;
631
632 BT_DBG("new socket %p", ch);
633
634done:
635 release_sock(sk);
636 return err;
637}
638
639static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
640{
641 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
642 struct sock *sk = sock->sk;
643
644 BT_DBG("sock %p, sk %p", sock, sk);
645
646 addr->sa_family = AF_BLUETOOTH;
647 *len = sizeof(struct sockaddr_sco);
648
649 if (peer)
Marcel Holtmanneea96362013-10-13 10:34:01 -0700650 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 else
Marcel Holtmanneea96362013-10-13 10:34:01 -0700652 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653
654 return 0;
655}
656
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900657static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658 struct msghdr *msg, size_t len)
659{
660 struct sock *sk = sock->sk;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300661 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662
663 BT_DBG("sock %p, sk %p", sock, sk);
664
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -0800665 err = sock_error(sk);
666 if (err)
667 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668
669 if (msg->msg_flags & MSG_OOB)
670 return -EOPNOTSUPP;
671
672 lock_sock(sk);
673
674 if (sk->sk_state == BT_CONNECTED)
675 err = sco_send_frame(sk, msg, len);
676 else
677 err = -ENOTCONN;
678
679 release_sock(sk);
680 return err;
681}
682
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200683static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200684{
685 struct hci_dev *hdev = conn->hdev;
686
687 BT_DBG("conn %p", conn);
688
689 conn->state = BT_CONFIG;
690
691 if (!lmp_esco_capable(hdev)) {
692 struct hci_cp_accept_conn_req cp;
693
694 bacpy(&cp.bdaddr, &conn->dst);
Frédéric Dalleau33f24042013-08-19 14:23:55 +0200695 cp.role = 0x00; /* Ignored */
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200696
697 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
698 } else {
699 struct hci_cp_accept_sync_conn_req cp;
700
701 bacpy(&cp.bdaddr, &conn->dst);
702 cp.pkt_type = cpu_to_le16(conn->pkt_type);
703
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700704 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
705 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200706 cp.content_format = cpu_to_le16(setting);
707
708 switch (setting & SCO_AIRMODE_MASK) {
709 case SCO_AIRMODE_TRANSP:
710 if (conn->pkt_type & ESCO_2EV3)
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700711 cp.max_latency = cpu_to_le16(0x0008);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200712 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700713 cp.max_latency = cpu_to_le16(0x000D);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200714 cp.retrans_effort = 0x02;
715 break;
716 case SCO_AIRMODE_CVSD:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700717 cp.max_latency = cpu_to_le16(0xffff);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200718 cp.retrans_effort = 0xff;
719 break;
720 }
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200721
722 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
723 sizeof(cp), &cp);
724 }
725}
726
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100727static int sco_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
728 struct msghdr *msg, size_t len, int flags)
729{
730 struct sock *sk = sock->sk;
731 struct sco_pinfo *pi = sco_pi(sk);
732
733 lock_sock(sk);
734
735 if (sk->sk_state == BT_CONNECT2 &&
736 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200737 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100738 sk->sk_state = BT_CONFIG;
739
740 release_sock(sk);
741 return 0;
742 }
743
744 release_sock(sk);
745
746 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
747}
748
David S. Millerb7058842009-09-30 16:12:20 -0700749static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750{
751 struct sock *sk = sock->sk;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200752 int len, err = 0;
753 struct bt_voice voice;
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100754 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755
756 BT_DBG("sk %p", sk);
757
758 lock_sock(sk);
759
760 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100761
762 case BT_DEFER_SETUP:
763 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
764 err = -EINVAL;
765 break;
766 }
767
768 if (get_user(opt, (u32 __user *) optval)) {
769 err = -EFAULT;
770 break;
771 }
772
773 if (opt)
774 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
775 else
776 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
777 break;
778
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200779 case BT_VOICE:
780 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
781 sk->sk_state != BT_CONNECT2) {
782 err = -EINVAL;
783 break;
784 }
785
786 voice.setting = sco_pi(sk)->setting;
787
788 len = min_t(unsigned int, sizeof(voice), optlen);
789 if (copy_from_user((char *) &voice, optval, len)) {
790 err = -EFAULT;
791 break;
792 }
793
794 /* Explicitly check for these values */
795 if (voice.setting != BT_VOICE_TRANSPARENT &&
796 voice.setting != BT_VOICE_CVSD_16BIT) {
797 err = -EINVAL;
798 break;
799 }
800
801 sco_pi(sk)->setting = voice.setting;
802 break;
803
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 default:
805 err = -ENOPROTOOPT;
806 break;
807 }
808
809 release_sock(sk);
810 return err;
811}
812
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100813static int sco_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814{
815 struct sock *sk = sock->sk;
816 struct sco_options opts;
817 struct sco_conninfo cinfo;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900818 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819
820 BT_DBG("sk %p", sk);
821
822 if (get_user(len, optlen))
823 return -EFAULT;
824
825 lock_sock(sk);
826
827 switch (optname) {
828 case SCO_OPTIONS:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300829 if (sk->sk_state != BT_CONNECTED &&
830 !(sk->sk_state == BT_CONNECT2 &&
831 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832 err = -ENOTCONN;
833 break;
834 }
835
836 opts.mtu = sco_pi(sk)->conn->mtu;
837
838 BT_DBG("mtu %d", opts.mtu);
839
840 len = min_t(unsigned int, len, sizeof(opts));
841 if (copy_to_user(optval, (char *)&opts, len))
842 err = -EFAULT;
843
844 break;
845
846 case SCO_CONNINFO:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300847 if (sk->sk_state != BT_CONNECTED &&
848 !(sk->sk_state == BT_CONNECT2 &&
849 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 err = -ENOTCONN;
851 break;
852 }
853
Vasiliy Kulikovc4c896e2011-02-14 13:54:26 +0300854 memset(&cinfo, 0, sizeof(cinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700855 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
856 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
857
858 len = min_t(unsigned int, len, sizeof(cinfo));
859 if (copy_to_user(optval, (char *)&cinfo, len))
860 err = -EFAULT;
861
862 break;
863
864 default:
865 err = -ENOPROTOOPT;
866 break;
867 }
868
869 release_sock(sk);
870 return err;
871}
872
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100873static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
874{
875 struct sock *sk = sock->sk;
876 int len, err = 0;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200877 struct bt_voice voice;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100878
879 BT_DBG("sk %p", sk);
880
881 if (level == SOL_SCO)
882 return sco_sock_getsockopt_old(sock, optname, optval, optlen);
883
884 if (get_user(len, optlen))
885 return -EFAULT;
886
887 lock_sock(sk);
888
889 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100890
891 case BT_DEFER_SETUP:
892 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
893 err = -EINVAL;
894 break;
895 }
896
897 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
898 (u32 __user *) optval))
899 err = -EFAULT;
900
901 break;
902
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200903 case BT_VOICE:
904 voice.setting = sco_pi(sk)->setting;
905
906 len = min_t(unsigned int, len, sizeof(voice));
907 if (copy_to_user(optval, (char *)&voice, len))
908 err = -EFAULT;
909
910 break;
911
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100912 default:
913 err = -ENOPROTOOPT;
914 break;
915 }
916
917 release_sock(sk);
918 return err;
919}
920
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200921static int sco_sock_shutdown(struct socket *sock, int how)
922{
923 struct sock *sk = sock->sk;
924 int err = 0;
925
926 BT_DBG("sock %p, sk %p", sock, sk);
927
928 if (!sk)
929 return 0;
930
931 lock_sock(sk);
932 if (!sk->sk_shutdown) {
933 sk->sk_shutdown = SHUTDOWN_MASK;
934 sco_sock_clear_timer(sk);
935 __sco_sock_close(sk);
936
937 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
938 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300939 sk->sk_lingertime);
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200940 }
941 release_sock(sk);
942 return err;
943}
944
Linus Torvalds1da177e2005-04-16 15:20:36 -0700945static int sco_sock_release(struct socket *sock)
946{
947 struct sock *sk = sock->sk;
948 int err = 0;
949
950 BT_DBG("sock %p, sk %p", sock, sk);
951
952 if (!sk)
953 return 0;
954
955 sco_sock_close(sk);
956
957 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) {
958 lock_sock(sk);
959 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
960 release_sock(sk);
961 }
962
963 sock_orphan(sk);
964 sco_sock_kill(sk);
965 return err;
966}
967
968static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
969{
970 BT_DBG("conn %p", conn);
971
972 sco_pi(sk)->conn = conn;
973 conn->sk = sk;
974
975 if (parent)
976 bt_accept_enqueue(parent, sk);
977}
978
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900979/* Delete channel.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 * Must be called on the locked socket. */
981static void sco_chan_del(struct sock *sk, int err)
982{
983 struct sco_conn *conn;
984
985 conn = sco_pi(sk)->conn;
986
987 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
988
Gustavo Padovan0b27a4b2012-12-03 15:36:51 -0200989 if (conn) {
990 sco_conn_lock(conn);
991 conn->sk = NULL;
992 sco_pi(sk)->conn = NULL;
993 sco_conn_unlock(conn);
994
995 if (conn->hcon)
David Herrmann76a68ba2013-04-06 20:28:37 +0200996 hci_conn_drop(conn->hcon);
Gustavo Padovan0b27a4b2012-12-03 15:36:51 -0200997 }
998
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999 sk->sk_state = BT_CLOSED;
1000 sk->sk_err = err;
1001 sk->sk_state_change(sk);
1002
1003 sock_set_flag(sk, SOCK_ZAPPED);
1004}
1005
1006static void sco_conn_ready(struct sco_conn *conn)
1007{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001008 struct sock *parent;
1009 struct sock *sk = conn->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001010
1011 BT_DBG("conn %p", conn);
1012
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001013 if (sk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014 sco_sock_clear_timer(sk);
1015 bh_lock_sock(sk);
1016 sk->sk_state = BT_CONNECTED;
1017 sk->sk_state_change(sk);
1018 bh_unlock_sock(sk);
1019 } else {
Andre Guedes40528082013-01-29 19:59:56 -03001020 sco_conn_lock(conn);
1021
Marcel Holtmann041987c2013-10-13 10:15:22 -07001022 parent = sco_get_sock_listen(&conn->hcon->src);
Andre Guedes40528082013-01-29 19:59:56 -03001023 if (!parent) {
1024 sco_conn_unlock(conn);
1025 return;
1026 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027
1028 bh_lock_sock(parent);
1029
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -03001030 sk = sco_sock_alloc(sock_net(parent), NULL,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -03001031 BTPROTO_SCO, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 if (!sk) {
1033 bh_unlock_sock(parent);
Andre Guedes40528082013-01-29 19:59:56 -03001034 sco_conn_unlock(conn);
1035 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036 }
1037
1038 sco_sock_init(sk, parent);
1039
Marcel Holtmanneea96362013-10-13 10:34:01 -07001040 bacpy(&sco_pi(sk)->src, &conn->hcon->src);
1041 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042
1043 hci_conn_hold(conn->hcon);
1044 __sco_chan_add(conn, sk, parent);
1045
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001046 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
1047 sk->sk_state = BT_CONNECT2;
1048 else
1049 sk->sk_state = BT_CONNECTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050
1051 /* Wake up parent */
David S. Miller676d2362014-04-11 16:15:36 -04001052 parent->sk_data_ready(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053
1054 bh_unlock_sock(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055
Andre Guedes40528082013-01-29 19:59:56 -03001056 sco_conn_unlock(conn);
1057 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058}
1059
1060/* ----- SCO interface with lower layer (HCI) ----- */
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001061int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062{
Gustavo Padovanfc5fef62012-05-23 04:04:19 -03001063 struct sock *sk;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001064 int lm = 0;
1065
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001066 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001068 /* Find listening sockets */
1069 read_lock(&sco_sk_list.lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -08001070 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001071 if (sk->sk_state != BT_LISTEN)
1072 continue;
1073
Marcel Holtmanneea96362013-10-13 10:34:01 -07001074 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) ||
1075 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001076 lm |= HCI_LM_ACCEPT;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001077
1078 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
1079 *flags |= HCI_PROTO_DEFER;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001080 break;
1081 }
1082 }
1083 read_unlock(&sco_sk_list.lock);
1084
1085 return lm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086}
1087
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03001088void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089{
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001090 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001091 if (!status) {
1092 struct sco_conn *conn;
1093
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +02001094 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001095 if (conn)
1096 sco_conn_ready(conn);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001097 } else
Joe Perchese1750722011-06-29 18:18:29 -07001098 sco_conn_del(hcon, bt_to_errno(status));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099}
1100
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03001101void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102{
1103 BT_DBG("hcon %p reason %d", hcon, reason);
1104
Joe Perchese1750722011-06-29 18:18:29 -07001105 sco_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106}
1107
Ulisses Furquim686ebf22011-12-21 10:11:33 -02001108int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109{
1110 struct sco_conn *conn = hcon->sco_data;
1111
1112 if (!conn)
1113 goto drop;
1114
1115 BT_DBG("conn %p len %d", conn, skb->len);
1116
1117 if (skb->len) {
1118 sco_recv_frame(conn, skb);
1119 return 0;
1120 }
1121
1122drop:
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001123 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124 return 0;
1125}
1126
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001127static int sco_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128{
1129 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001131 read_lock(&sco_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132
Sasha Levinb67bfe02013-02-27 17:06:00 -08001133 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmanneea96362013-10-13 10:34:01 -07001134 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src,
1135 &sco_pi(sk)->dst, sk->sk_state);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001136 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001138 read_unlock(&sco_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001139
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001140 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141}
1142
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001143static int sco_debugfs_open(struct inode *inode, struct file *file)
1144{
1145 return single_open(file, sco_debugfs_show, inode->i_private);
1146}
1147
1148static const struct file_operations sco_debugfs_fops = {
1149 .open = sco_debugfs_open,
1150 .read = seq_read,
1151 .llseek = seq_lseek,
1152 .release = single_release,
1153};
1154
1155static struct dentry *sco_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001157static const struct proto_ops sco_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 .family = PF_BLUETOOTH,
1159 .owner = THIS_MODULE,
1160 .release = sco_sock_release,
1161 .bind = sco_sock_bind,
1162 .connect = sco_sock_connect,
1163 .listen = sco_sock_listen,
1164 .accept = sco_sock_accept,
1165 .getname = sco_sock_getname,
1166 .sendmsg = sco_sock_sendmsg,
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001167 .recvmsg = sco_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02001169 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170 .mmap = sock_no_mmap,
1171 .socketpair = sock_no_socketpair,
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +02001172 .shutdown = sco_sock_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 .setsockopt = sco_sock_setsockopt,
1174 .getsockopt = sco_sock_getsockopt
1175};
1176
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001177static const struct net_proto_family sco_sock_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178 .family = PF_BLUETOOTH,
1179 .owner = THIS_MODULE,
1180 .create = sco_sock_create,
1181};
1182
Gustavo F. Padovan64274512011-02-07 20:08:52 -02001183int __init sco_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184{
1185 int err;
1186
1187 err = proto_register(&sco_proto, 0);
1188 if (err < 0)
1189 return err;
1190
1191 err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
1192 if (err < 0) {
1193 BT_ERR("SCO socket registration failed");
1194 goto error;
1195 }
1196
Al Virob0316612013-04-04 19:14:33 -04001197 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001198 if (err < 0) {
1199 BT_ERR("Failed to create SCO proc file");
1200 bt_sock_unregister(BTPROTO_SCO);
1201 goto error;
1202 }
1203
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204 BT_INFO("SCO socket layer initialized");
1205
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07001206 if (IS_ERR_OR_NULL(bt_debugfs))
1207 return 0;
1208
1209 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs,
1210 NULL, &sco_debugfs_fops);
1211
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212 return 0;
1213
1214error:
1215 proto_unregister(&sco_proto);
1216 return err;
1217}
1218
Gustavo F. Padovan64274512011-02-07 20:08:52 -02001219void __exit sco_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220{
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001221 bt_procfs_cleanup(&init_net, "sco");
1222
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001223 debugfs_remove(sco_debugfs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224
David Herrmann5e9d7f82013-02-24 19:36:51 +01001225 bt_sock_unregister(BTPROTO_SCO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227 proto_unregister(&sco_proto);
1228}
1229
Marcel Holtmann7cb127d2008-07-14 20:13:53 +02001230module_param(disable_esco, bool, 0644);
1231MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");