blob: c71698642ec6c9d3e6f2ca7f7f1459649d57e1c0 [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
43static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent);
44static void sco_chan_del(struct sock *sk, int err);
45
Linus Torvalds1da177e2005-04-16 15:20:36 -070046static void sco_sock_close(struct sock *sk);
47static void sco_sock_kill(struct sock *sk);
48
Marcel Holtmann2a0dccb2014-07-11 06:19:41 +020049/* ----- SCO socket info ----- */
50#define sco_pi(sk) ((struct sco_pinfo *) sk)
51
52struct sco_pinfo {
53 struct bt_sock bt;
54 bdaddr_t src;
55 bdaddr_t dst;
56 __u32 flags;
57 __u16 setting;
58 struct sco_conn *conn;
59};
60
Linus Torvalds1da177e2005-04-16 15:20:36 -070061/* ---- SCO timers ---- */
62static void sco_sock_timeout(unsigned long arg)
63{
64 struct sock *sk = (struct sock *) arg;
65
66 BT_DBG("sock %p state %d", sk, sk->sk_state);
67
68 bh_lock_sock(sk);
69 sk->sk_err = ETIMEDOUT;
70 sk->sk_state_change(sk);
71 bh_unlock_sock(sk);
72
73 sco_sock_kill(sk);
74 sock_put(sk);
75}
76
77static void sco_sock_set_timer(struct sock *sk, long timeout)
78{
79 BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
80 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
81}
82
83static void sco_sock_clear_timer(struct sock *sk)
84{
85 BT_DBG("sock %p state %d", sk, sk->sk_state);
86 sk_stop_timer(sk, &sk->sk_timer);
87}
88
Linus Torvalds1da177e2005-04-16 15:20:36 -070089/* ---- SCO connections ---- */
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +020090static struct sco_conn *sco_conn_add(struct hci_conn *hcon)
Linus Torvalds1da177e2005-04-16 15:20:36 -070091{
92 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann25ea6db2006-07-06 15:40:09 +020093 struct sco_conn *conn = hcon->sco_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070094
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +020095 if (conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -070096 return conn;
97
Claudio Takahasic10cc5a2013-04-11 11:35:45 -030098 conn = kzalloc(sizeof(struct sco_conn), GFP_KERNEL);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +020099 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101
102 spin_lock_init(&conn->lock);
103
104 hcon->sco_data = conn;
105 conn->hcon = hcon;
106
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107 if (hdev->sco_mtu > 0)
108 conn->mtu = hdev->sco_mtu;
109 else
110 conn->mtu = 60;
111
112 BT_DBG("hcon %p conn %p", hcon, conn);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200113
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114 return conn;
115}
116
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300117static struct sock *sco_chan_get(struct sco_conn *conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118{
119 struct sock *sk = NULL;
120 sco_conn_lock(conn);
121 sk = conn->sk;
122 sco_conn_unlock(conn);
123 return sk;
124}
125
126static int sco_conn_del(struct hci_conn *hcon, int err)
127{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200128 struct sco_conn *conn = hcon->sco_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129 struct sock *sk;
130
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200131 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132 return 0;
133
134 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
135
136 /* Kill socket */
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200137 sk = sco_chan_get(conn);
138 if (sk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 bh_lock_sock(sk);
140 sco_sock_clear_timer(sk);
141 sco_chan_del(sk, err);
142 bh_unlock_sock(sk);
143 sco_sock_kill(sk);
144 }
145
146 hcon->sco_data = NULL;
147 kfree(conn);
148 return 0;
149}
150
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300151static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
152 struct sock *parent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153{
154 int err = 0;
155
156 sco_conn_lock(conn);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300157 if (conn->sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158 err = -EBUSY;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300159 else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 __sco_chan_add(conn, sk, parent);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300161
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162 sco_conn_unlock(conn);
163 return err;
164}
165
166static int sco_connect(struct sock *sk)
167{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168 struct sco_conn *conn;
169 struct hci_conn *hcon;
170 struct hci_dev *hdev;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200171 int err, type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172
Marcel Holtmanneea96362013-10-13 10:34:01 -0700173 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174
Marcel Holtmanneea96362013-10-13 10:34:01 -0700175 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src);
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200176 if (!hdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 return -EHOSTUNREACH;
178
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300179 hci_dev_lock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180
Marcel Holtmann7cb127d2008-07-14 20:13:53 +0200181 if (lmp_esco_capable(hdev) && !disable_esco)
182 type = ESCO_LINK;
183 else
184 type = SCO_LINK;
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200185
Frédéric Dalleau79dc0082013-08-19 14:24:01 +0200186 if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
187 (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
188 err = -EOPNOTSUPP;
189 goto done;
190 }
191
Marcel Holtmanneea96362013-10-13 10:34:01 -0700192 hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
Marcel Holtmann041987c2013-10-13 10:15:22 -0700193 sco_pi(sk)->setting);
Ville Tervo30e76272011-02-22 16:10:53 -0300194 if (IS_ERR(hcon)) {
195 err = PTR_ERR(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196 goto done;
Ville Tervo30e76272011-02-22 16:10:53 -0300197 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +0200199 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200 if (!conn) {
David Herrmann76a68ba2013-04-06 20:28:37 +0200201 hci_conn_drop(hcon);
Ville Tervo30e76272011-02-22 16:10:53 -0300202 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 goto done;
204 }
205
206 /* Update source addr of the socket */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700207 bacpy(&sco_pi(sk)->src, &hcon->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208
209 err = sco_chan_add(conn, sk, NULL);
210 if (err)
211 goto done;
212
213 if (hcon->state == BT_CONNECTED) {
214 sco_sock_clear_timer(sk);
215 sk->sk_state = BT_CONNECTED;
216 } else {
217 sk->sk_state = BT_CONNECT;
218 sco_sock_set_timer(sk, sk->sk_sndtimeo);
219 }
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200220
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221done:
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300222 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 hci_dev_put(hdev);
224 return err;
225}
226
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300227static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228{
229 struct sco_conn *conn = sco_pi(sk)->conn;
230 struct sk_buff *skb;
Mikel Astiz088ce082012-04-11 08:48:48 +0200231 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232
233 /* Check outgoing MTU */
234 if (len > conn->mtu)
235 return -EINVAL;
236
237 BT_DBG("sk %p len %d", sk, len);
238
Mikel Astiz088ce082012-04-11 08:48:48 +0200239 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300240 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 return err;
242
Mikel Astiz088ce082012-04-11 08:48:48 +0200243 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300244 kfree_skb(skb);
245 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246 }
247
Gustavo F. Padovan0d861d82010-05-01 16:15:35 -0300248 hci_send_sco(conn->hcon, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249
Mikel Astiz088ce082012-04-11 08:48:48 +0200250 return len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251}
252
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300253static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254{
255 struct sock *sk = sco_chan_get(conn);
256
257 if (!sk)
258 goto drop;
259
260 BT_DBG("sk %p len %d", sk, skb->len);
261
262 if (sk->sk_state != BT_CONNECTED)
263 goto drop;
264
265 if (!sock_queue_rcv_skb(sk, skb))
266 return;
267
268drop:
269 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270}
271
272/* -------- Socket interface ---------- */
Marcel Holtmannfb334052012-04-19 14:37:58 +0200273static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274{
Marcel Holtmannfb334052012-04-19 14:37:58 +0200275 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276
Sasha Levinb67bfe02013-02-27 17:06:00 -0800277 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmannfb334052012-04-19 14:37:58 +0200278 if (sk->sk_state != BT_LISTEN)
279 continue;
280
Marcel Holtmanneea96362013-10-13 10:34:01 -0700281 if (!bacmp(&sco_pi(sk)->src, ba))
Marcel Holtmannfb334052012-04-19 14:37:58 +0200282 return sk;
283 }
284
285 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286}
287
288/* Find socket listening on source bdaddr.
289 * Returns closest match.
290 */
291static struct sock *sco_get_sock_listen(bdaddr_t *src)
292{
293 struct sock *sk = NULL, *sk1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294
295 read_lock(&sco_sk_list.lock);
296
Sasha Levinb67bfe02013-02-27 17:06:00 -0800297 sk_for_each(sk, &sco_sk_list.head) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298 if (sk->sk_state != BT_LISTEN)
299 continue;
300
301 /* Exact match. */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700302 if (!bacmp(&sco_pi(sk)->src, src))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303 break;
304
305 /* Closest match */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700306 if (!bacmp(&sco_pi(sk)->src, BDADDR_ANY))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 sk1 = sk;
308 }
309
310 read_unlock(&sco_sk_list.lock);
311
Sasha Levinb67bfe02013-02-27 17:06:00 -0800312 return sk ? sk : sk1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313}
314
315static void sco_sock_destruct(struct sock *sk)
316{
317 BT_DBG("sk %p", sk);
318
319 skb_queue_purge(&sk->sk_receive_queue);
320 skb_queue_purge(&sk->sk_write_queue);
321}
322
323static void sco_sock_cleanup_listen(struct sock *parent)
324{
325 struct sock *sk;
326
327 BT_DBG("parent %p", parent);
328
329 /* Close not yet accepted channels */
330 while ((sk = bt_accept_dequeue(parent, NULL))) {
331 sco_sock_close(sk);
332 sco_sock_kill(sk);
333 }
334
335 parent->sk_state = BT_CLOSED;
336 sock_set_flag(parent, SOCK_ZAPPED);
337}
338
339/* Kill socket (only if zapped and orphan)
340 * Must be called on unlocked socket.
341 */
342static void sco_sock_kill(struct sock *sk)
343{
344 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
345 return;
346
347 BT_DBG("sk %p state %d", sk, sk->sk_state);
348
349 /* Kill poor orphan */
350 bt_sock_unlink(&sco_sk_list, sk);
351 sock_set_flag(sk, SOCK_DEAD);
352 sock_put(sk);
353}
354
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200355static void __sco_sock_close(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700356{
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200357 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358
359 switch (sk->sk_state) {
360 case BT_LISTEN:
361 sco_sock_cleanup_listen(sk);
362 break;
363
364 case BT_CONNECTED:
365 case BT_CONFIG:
Gustavo Padovanb7e98b52013-01-03 19:59:28 -0200366 if (sco_pi(sk)->conn->hcon) {
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300367 sk->sk_state = BT_DISCONN;
368 sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);
David Herrmann76a68ba2013-04-06 20:28:37 +0200369 hci_conn_drop(sco_pi(sk)->conn->hcon);
Luiz Augusto von Dentz4a777082011-05-12 11:13:15 +0300370 sco_pi(sk)->conn->hcon = NULL;
371 } else
372 sco_chan_del(sk, ECONNRESET);
373 break;
374
Vinicius Costa Gomeseb20ff92013-03-13 19:46:20 -0300375 case BT_CONNECT2:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376 case BT_CONNECT:
377 case BT_DISCONN:
378 sco_chan_del(sk, ECONNRESET);
379 break;
380
381 default:
382 sock_set_flag(sk, SOCK_ZAPPED);
383 break;
Stephen Hemminger3ff50b72007-04-20 17:09:22 -0700384 }
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200385}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200387/* Must be called on unlocked socket. */
388static void sco_sock_close(struct sock *sk)
389{
390 sco_sock_clear_timer(sk);
391 lock_sock(sk);
392 __sco_sock_close(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394 sco_sock_kill(sk);
395}
396
397static void sco_sock_init(struct sock *sk, struct sock *parent)
398{
399 BT_DBG("sk %p", sk);
400
Paul Moore6230c9b2011-10-07 09:40:59 +0000401 if (parent) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402 sk->sk_type = parent->sk_type;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100403 bt_sk(sk)->flags = bt_sk(parent)->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000404 security_sk_clone(parent, sk);
405 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406}
407
408static struct proto sco_proto = {
409 .name = "SCO",
410 .owner = THIS_MODULE,
411 .obj_size = sizeof(struct sco_pinfo)
412};
413
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700414static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415{
416 struct sock *sk;
417
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700418 sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 if (!sk)
420 return NULL;
421
422 sock_init_data(sock, sk);
423 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
424
425 sk->sk_destruct = sco_sock_destruct;
426 sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
427
428 sock_reset_flag(sk, SOCK_ZAPPED);
429
430 sk->sk_protocol = proto;
431 sk->sk_state = BT_OPEN;
432
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200433 sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
434
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800435 setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436
437 bt_sock_link(&sco_sk_list, sk);
438 return sk;
439}
440
Eric Paris3f378b62009-11-05 22:18:14 -0800441static int sco_sock_create(struct net *net, struct socket *sock, int protocol,
442 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443{
444 struct sock *sk;
445
446 BT_DBG("sock %p", sock);
447
448 sock->state = SS_UNCONNECTED;
449
450 if (sock->type != SOCK_SEQPACKET)
451 return -ESOCKTNOSUPPORT;
452
453 sock->ops = &sco_sock_ops;
454
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700455 sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC);
Marcel Holtmann74da6262006-10-15 17:31:14 +0200456 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 return -ENOMEM;
458
459 sco_sock_init(sk, NULL);
460 return 0;
461}
462
463static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
464{
465 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
466 struct sock *sk = sock->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700467 int err = 0;
468
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +0300469 BT_DBG("sk %p %pMR", sk, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470
471 if (!addr || addr->sa_family != AF_BLUETOOTH)
472 return -EINVAL;
473
474 lock_sock(sk);
475
476 if (sk->sk_state != BT_OPEN) {
477 err = -EBADFD;
478 goto done;
479 }
480
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200481 if (sk->sk_type != SOCK_SEQPACKET) {
482 err = -EINVAL;
483 goto done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 }
485
Marcel Holtmanneea96362013-10-13 10:34:01 -0700486 bacpy(&sco_pi(sk)->src, &sa->sco_bdaddr);
Marcel Holtmann8ed21f72012-04-19 13:43:53 +0200487
488 sk->sk_state = BT_BOUND;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489
490done:
491 release_sock(sk);
492 return err;
493}
494
495static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
496{
497 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
498 struct sock *sk = sock->sk;
Claudio Takahasi92f185c2013-04-11 11:35:46 -0300499 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500
501 BT_DBG("sk %p", sk);
502
Changli Gao6503d962010-03-31 22:58:26 +0000503 if (alen < sizeof(struct sockaddr_sco) ||
504 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 return -EINVAL;
506
507 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
508 return -EBADFD;
509
510 if (sk->sk_type != SOCK_SEQPACKET)
511 return -EINVAL;
512
513 lock_sock(sk);
514
515 /* Set destination address and psm */
Marcel Holtmanneea96362013-10-13 10:34:01 -0700516 bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200518 err = sco_connect(sk);
519 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 goto done;
521
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900522 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300523 sock_sndtimeo(sk, flags & O_NONBLOCK));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700524
525done:
526 release_sock(sk);
527 return err;
528}
529
530static int sco_sock_listen(struct socket *sock, int backlog)
531{
532 struct sock *sk = sock->sk;
Marcel Holtmanneea96362013-10-13 10:34:01 -0700533 bdaddr_t *src = &sco_pi(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 int err = 0;
535
536 BT_DBG("sk %p backlog %d", sk, backlog);
537
538 lock_sock(sk);
539
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200540 if (sk->sk_state != BT_BOUND) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 err = -EBADFD;
542 goto done;
543 }
544
Marcel Holtmann7d5d7752012-04-19 13:43:52 +0200545 if (sk->sk_type != SOCK_SEQPACKET) {
546 err = -EINVAL;
547 goto done;
548 }
549
Marcel Holtmannfb334052012-04-19 14:37:58 +0200550 write_lock(&sco_sk_list.lock);
551
552 if (__sco_get_sock_listen_by_addr(src)) {
553 err = -EADDRINUSE;
554 goto unlock;
555 }
556
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557 sk->sk_max_ack_backlog = backlog;
558 sk->sk_ack_backlog = 0;
Marcel Holtmannfb334052012-04-19 14:37:58 +0200559
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560 sk->sk_state = BT_LISTEN;
561
Marcel Holtmannfb334052012-04-19 14:37:58 +0200562unlock:
563 write_unlock(&sco_sk_list.lock);
564
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565done:
566 release_sock(sk);
567 return err;
568}
569
570static int sco_sock_accept(struct socket *sock, struct socket *newsock, int flags)
571{
572 DECLARE_WAITQUEUE(wait, current);
573 struct sock *sk = sock->sk, *ch;
574 long timeo;
575 int err = 0;
576
577 lock_sock(sk);
578
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
580
581 BT_DBG("sk %p timeo %ld", sk, timeo);
582
583 /* Wait for an incoming connection. (wake-one). */
Eric Dumazetaa395142010-04-20 13:03:51 +0000584 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurley552b0d32011-07-24 00:11:01 -0400585 while (1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 set_current_state(TASK_INTERRUPTIBLE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587
588 if (sk->sk_state != BT_LISTEN) {
589 err = -EBADFD;
590 break;
591 }
592
Peter Hurley552b0d32011-07-24 00:11:01 -0400593 ch = bt_accept_dequeue(sk, newsock);
594 if (ch)
595 break;
596
597 if (!timeo) {
598 err = -EAGAIN;
599 break;
600 }
601
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602 if (signal_pending(current)) {
603 err = sock_intr_errno(timeo);
604 break;
605 }
Peter Hurley552b0d32011-07-24 00:11:01 -0400606
607 release_sock(sk);
608 timeo = schedule_timeout(timeo);
609 lock_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610 }
Peter Hurley552b0d32011-07-24 00:11:01 -0400611 __set_current_state(TASK_RUNNING);
Eric Dumazetaa395142010-04-20 13:03:51 +0000612 remove_wait_queue(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613
614 if (err)
615 goto done;
616
617 newsock->state = SS_CONNECTED;
618
619 BT_DBG("new socket %p", ch);
620
621done:
622 release_sock(sk);
623 return err;
624}
625
626static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
627{
628 struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
629 struct sock *sk = sock->sk;
630
631 BT_DBG("sock %p, sk %p", sock, sk);
632
633 addr->sa_family = AF_BLUETOOTH;
634 *len = sizeof(struct sockaddr_sco);
635
636 if (peer)
Marcel Holtmanneea96362013-10-13 10:34:01 -0700637 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638 else
Marcel Holtmanneea96362013-10-13 10:34:01 -0700639 bacpy(&sa->sco_bdaddr, &sco_pi(sk)->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640
641 return 0;
642}
643
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900644static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645 struct msghdr *msg, size_t len)
646{
647 struct sock *sk = sock->sk;
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -0300648 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649
650 BT_DBG("sock %p, sk %p", sock, sk);
651
Benjamin LaHaisec1cbe4b2005-12-13 23:22:19 -0800652 err = sock_error(sk);
653 if (err)
654 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655
656 if (msg->msg_flags & MSG_OOB)
657 return -EOPNOTSUPP;
658
659 lock_sock(sk);
660
661 if (sk->sk_state == BT_CONNECTED)
662 err = sco_send_frame(sk, msg, len);
663 else
664 err = -ENOTCONN;
665
666 release_sock(sk);
667 return err;
668}
669
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200670static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200671{
672 struct hci_dev *hdev = conn->hdev;
673
674 BT_DBG("conn %p", conn);
675
676 conn->state = BT_CONFIG;
677
678 if (!lmp_esco_capable(hdev)) {
679 struct hci_cp_accept_conn_req cp;
680
681 bacpy(&cp.bdaddr, &conn->dst);
Frédéric Dalleau33f24042013-08-19 14:23:55 +0200682 cp.role = 0x00; /* Ignored */
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200683
684 hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp);
685 } else {
686 struct hci_cp_accept_sync_conn_req cp;
687
688 bacpy(&cp.bdaddr, &conn->dst);
689 cp.pkt_type = cpu_to_le16(conn->pkt_type);
690
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700691 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
692 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200693 cp.content_format = cpu_to_le16(setting);
694
695 switch (setting & SCO_AIRMODE_MASK) {
696 case SCO_AIRMODE_TRANSP:
697 if (conn->pkt_type & ESCO_2EV3)
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700698 cp.max_latency = cpu_to_le16(0x0008);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200699 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700700 cp.max_latency = cpu_to_le16(0x000D);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200701 cp.retrans_effort = 0x02;
702 break;
703 case SCO_AIRMODE_CVSD:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700704 cp.max_latency = cpu_to_le16(0xffff);
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200705 cp.retrans_effort = 0xff;
706 break;
707 }
Frédéric Dalleaufa5513b2013-04-16 17:28:58 +0200708
709 hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
710 sizeof(cp), &cp);
711 }
712}
713
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100714static int sco_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
715 struct msghdr *msg, size_t len, int flags)
716{
717 struct sock *sk = sock->sk;
718 struct sco_pinfo *pi = sco_pi(sk);
719
720 lock_sock(sk);
721
722 if (sk->sk_state == BT_CONNECT2 &&
723 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
Frédéric Dalleau2f69a822013-08-19 14:23:58 +0200724 sco_conn_defer_accept(pi->conn->hcon, pi->setting);
Frédéric Dalleau20714bf2012-11-21 10:51:12 +0100725 sk->sk_state = BT_CONFIG;
726
727 release_sock(sk);
728 return 0;
729 }
730
731 release_sock(sk);
732
733 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
734}
735
David S. Millerb7058842009-09-30 16:12:20 -0700736static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737{
738 struct sock *sk = sock->sk;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200739 int len, err = 0;
740 struct bt_voice voice;
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100741 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742
743 BT_DBG("sk %p", sk);
744
745 lock_sock(sk);
746
747 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100748
749 case BT_DEFER_SETUP:
750 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
751 err = -EINVAL;
752 break;
753 }
754
755 if (get_user(opt, (u32 __user *) optval)) {
756 err = -EFAULT;
757 break;
758 }
759
760 if (opt)
761 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
762 else
763 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
764 break;
765
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200766 case BT_VOICE:
767 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND &&
768 sk->sk_state != BT_CONNECT2) {
769 err = -EINVAL;
770 break;
771 }
772
773 voice.setting = sco_pi(sk)->setting;
774
775 len = min_t(unsigned int, sizeof(voice), optlen);
776 if (copy_from_user((char *) &voice, optval, len)) {
777 err = -EFAULT;
778 break;
779 }
780
781 /* Explicitly check for these values */
782 if (voice.setting != BT_VOICE_TRANSPARENT &&
783 voice.setting != BT_VOICE_CVSD_16BIT) {
784 err = -EINVAL;
785 break;
786 }
787
788 sco_pi(sk)->setting = voice.setting;
789 break;
790
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 default:
792 err = -ENOPROTOOPT;
793 break;
794 }
795
796 release_sock(sk);
797 return err;
798}
799
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100800static int sco_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801{
802 struct sock *sk = sock->sk;
803 struct sco_options opts;
804 struct sco_conninfo cinfo;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900805 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806
807 BT_DBG("sk %p", sk);
808
809 if (get_user(len, optlen))
810 return -EFAULT;
811
812 lock_sock(sk);
813
814 switch (optname) {
815 case SCO_OPTIONS:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300816 if (sk->sk_state != BT_CONNECTED &&
817 !(sk->sk_state == BT_CONNECT2 &&
818 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 err = -ENOTCONN;
820 break;
821 }
822
823 opts.mtu = sco_pi(sk)->conn->mtu;
824
825 BT_DBG("mtu %d", opts.mtu);
826
827 len = min_t(unsigned int, len, sizeof(opts));
828 if (copy_to_user(optval, (char *)&opts, len))
829 err = -EFAULT;
830
831 break;
832
833 case SCO_CONNINFO:
Johan Hedberg9d225d22013-08-08 14:53:56 +0300834 if (sk->sk_state != BT_CONNECTED &&
835 !(sk->sk_state == BT_CONNECT2 &&
836 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837 err = -ENOTCONN;
838 break;
839 }
840
Vasiliy Kulikovc4c896e2011-02-14 13:54:26 +0300841 memset(&cinfo, 0, sizeof(cinfo));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
843 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
844
845 len = min_t(unsigned int, len, sizeof(cinfo));
846 if (copy_to_user(optval, (char *)&cinfo, len))
847 err = -EFAULT;
848
849 break;
850
851 default:
852 err = -ENOPROTOOPT;
853 break;
854 }
855
856 release_sock(sk);
857 return err;
858}
859
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100860static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
861{
862 struct sock *sk = sock->sk;
863 int len, err = 0;
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200864 struct bt_voice voice;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100865
866 BT_DBG("sk %p", sk);
867
868 if (level == SOL_SCO)
869 return sco_sock_getsockopt_old(sock, optname, optval, optlen);
870
871 if (get_user(len, optlen))
872 return -EFAULT;
873
874 lock_sock(sk);
875
876 switch (optname) {
Frédéric Dalleaub96e9c62012-11-21 10:51:11 +0100877
878 case BT_DEFER_SETUP:
879 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
880 err = -EINVAL;
881 break;
882 }
883
884 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
885 (u32 __user *) optval))
886 err = -EFAULT;
887
888 break;
889
Frédéric Dalleauad10b1a2013-08-19 14:23:56 +0200890 case BT_VOICE:
891 voice.setting = sco_pi(sk)->setting;
892
893 len = min_t(unsigned int, len, sizeof(voice));
894 if (copy_to_user(optval, (char *)&voice, len))
895 err = -EFAULT;
896
897 break;
898
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100899 default:
900 err = -ENOPROTOOPT;
901 break;
902 }
903
904 release_sock(sk);
905 return err;
906}
907
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200908static int sco_sock_shutdown(struct socket *sock, int how)
909{
910 struct sock *sk = sock->sk;
911 int err = 0;
912
913 BT_DBG("sock %p, sk %p", sock, sk);
914
915 if (!sk)
916 return 0;
917
918 lock_sock(sk);
919 if (!sk->sk_shutdown) {
920 sk->sk_shutdown = SHUTDOWN_MASK;
921 sco_sock_clear_timer(sk);
922 __sco_sock_close(sk);
923
924 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
925 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -0300926 sk->sk_lingertime);
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +0200927 }
928 release_sock(sk);
929 return err;
930}
931
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932static int sco_sock_release(struct socket *sock)
933{
934 struct sock *sk = sock->sk;
935 int err = 0;
936
937 BT_DBG("sock %p, sk %p", sock, sk);
938
939 if (!sk)
940 return 0;
941
942 sco_sock_close(sk);
943
944 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) {
945 lock_sock(sk);
946 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
947 release_sock(sk);
948 }
949
950 sock_orphan(sk);
951 sco_sock_kill(sk);
952 return err;
953}
954
955static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
956{
957 BT_DBG("conn %p", conn);
958
959 sco_pi(sk)->conn = conn;
960 conn->sk = sk;
961
962 if (parent)
963 bt_accept_enqueue(parent, sk);
964}
965
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900966/* Delete channel.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 * Must be called on the locked socket. */
968static void sco_chan_del(struct sock *sk, int err)
969{
970 struct sco_conn *conn;
971
972 conn = sco_pi(sk)->conn;
973
974 BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
975
Gustavo Padovan0b27a4b2012-12-03 15:36:51 -0200976 if (conn) {
977 sco_conn_lock(conn);
978 conn->sk = NULL;
979 sco_pi(sk)->conn = NULL;
980 sco_conn_unlock(conn);
981
982 if (conn->hcon)
David Herrmann76a68ba2013-04-06 20:28:37 +0200983 hci_conn_drop(conn->hcon);
Gustavo Padovan0b27a4b2012-12-03 15:36:51 -0200984 }
985
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 sk->sk_state = BT_CLOSED;
987 sk->sk_err = err;
988 sk->sk_state_change(sk);
989
990 sock_set_flag(sk, SOCK_ZAPPED);
991}
992
993static void sco_conn_ready(struct sco_conn *conn)
994{
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +0200995 struct sock *parent;
996 struct sock *sk = conn->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997
998 BT_DBG("conn %p", conn);
999
Andrei Emeltchenko735cbc42010-12-01 16:58:22 +02001000 if (sk) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001 sco_sock_clear_timer(sk);
1002 bh_lock_sock(sk);
1003 sk->sk_state = BT_CONNECTED;
1004 sk->sk_state_change(sk);
1005 bh_unlock_sock(sk);
1006 } else {
Andre Guedes40528082013-01-29 19:59:56 -03001007 sco_conn_lock(conn);
1008
Marcel Holtmann041987c2013-10-13 10:15:22 -07001009 parent = sco_get_sock_listen(&conn->hcon->src);
Andre Guedes40528082013-01-29 19:59:56 -03001010 if (!parent) {
1011 sco_conn_unlock(conn);
1012 return;
1013 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014
1015 bh_lock_sock(parent);
1016
Gustavo F. Padovanb9dbdbc2010-05-01 16:15:35 -03001017 sk = sco_sock_alloc(sock_net(parent), NULL,
Gustavo Padovanbe7c2b92012-05-17 00:36:21 -03001018 BTPROTO_SCO, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001019 if (!sk) {
1020 bh_unlock_sock(parent);
Andre Guedes40528082013-01-29 19:59:56 -03001021 sco_conn_unlock(conn);
1022 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023 }
1024
1025 sco_sock_init(sk, parent);
1026
Marcel Holtmanneea96362013-10-13 10:34:01 -07001027 bacpy(&sco_pi(sk)->src, &conn->hcon->src);
1028 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029
1030 hci_conn_hold(conn->hcon);
1031 __sco_chan_add(conn, sk, parent);
1032
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001033 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
1034 sk->sk_state = BT_CONNECT2;
1035 else
1036 sk->sk_state = BT_CONNECTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037
1038 /* Wake up parent */
David S. Miller676d2362014-04-11 16:15:36 -04001039 parent->sk_data_ready(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040
1041 bh_unlock_sock(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042
Andre Guedes40528082013-01-29 19:59:56 -03001043 sco_conn_unlock(conn);
1044 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045}
1046
1047/* ----- SCO interface with lower layer (HCI) ----- */
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001048int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049{
Gustavo Padovanfc5fef62012-05-23 04:04:19 -03001050 struct sock *sk;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001051 int lm = 0;
1052
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001053 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001055 /* Find listening sockets */
1056 read_lock(&sco_sk_list.lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -08001057 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001058 if (sk->sk_state != BT_LISTEN)
1059 continue;
1060
Marcel Holtmanneea96362013-10-13 10:34:01 -07001061 if (!bacmp(&sco_pi(sk)->src, &hdev->bdaddr) ||
1062 !bacmp(&sco_pi(sk)->src, BDADDR_ANY)) {
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001063 lm |= HCI_LM_ACCEPT;
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001064
1065 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))
1066 *flags |= HCI_PROTO_DEFER;
Marcel Holtmann71aeeaa2009-01-15 21:57:02 +01001067 break;
1068 }
1069 }
1070 read_unlock(&sco_sk_list.lock);
1071
1072 return lm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073}
1074
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03001075void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076{
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03001077 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 if (!status) {
1079 struct sco_conn *conn;
1080
Lukasz Rymanowski519e42b2012-04-19 16:12:28 +02001081 conn = sco_conn_add(hcon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 if (conn)
1083 sco_conn_ready(conn);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001084 } else
Joe Perchese1750722011-06-29 18:18:29 -07001085 sco_conn_del(hcon, bt_to_errno(status));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086}
1087
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03001088void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089{
1090 BT_DBG("hcon %p reason %d", hcon, reason);
1091
Joe Perchese1750722011-06-29 18:18:29 -07001092 sco_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093}
1094
Ulisses Furquim686ebf22011-12-21 10:11:33 -02001095int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096{
1097 struct sco_conn *conn = hcon->sco_data;
1098
1099 if (!conn)
1100 goto drop;
1101
1102 BT_DBG("conn %p len %d", conn, skb->len);
1103
1104 if (skb->len) {
1105 sco_recv_frame(conn, skb);
1106 return 0;
1107 }
1108
1109drop:
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001110 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 return 0;
1112}
1113
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001114static int sco_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001115{
1116 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001118 read_lock(&sco_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119
Sasha Levinb67bfe02013-02-27 17:06:00 -08001120 sk_for_each(sk, &sco_sk_list.head) {
Marcel Holtmanneea96362013-10-13 10:34:01 -07001121 seq_printf(f, "%pMR %pMR %d\n", &sco_pi(sk)->src,
1122 &sco_pi(sk)->dst, sk->sk_state);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001123 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124
Gustavo F. Padovanee65d192011-12-27 15:28:46 -02001125 read_unlock(&sco_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001126
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001127 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128}
1129
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001130static int sco_debugfs_open(struct inode *inode, struct file *file)
1131{
1132 return single_open(file, sco_debugfs_show, inode->i_private);
1133}
1134
1135static const struct file_operations sco_debugfs_fops = {
1136 .open = sco_debugfs_open,
1137 .read = seq_read,
1138 .llseek = seq_lseek,
1139 .release = single_release,
1140};
1141
1142static struct dentry *sco_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001144static const struct proto_ops sco_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 .family = PF_BLUETOOTH,
1146 .owner = THIS_MODULE,
1147 .release = sco_sock_release,
1148 .bind = sco_sock_bind,
1149 .connect = sco_sock_connect,
1150 .listen = sco_sock_listen,
1151 .accept = sco_sock_accept,
1152 .getname = sco_sock_getname,
1153 .sendmsg = sco_sock_sendmsg,
Frédéric Dalleau20714bf2012-11-21 10:51:12 +01001154 .recvmsg = sco_sock_recvmsg,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 .poll = bt_sock_poll,
Marcel Holtmann3241ad82008-07-14 20:13:50 +02001156 .ioctl = bt_sock_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157 .mmap = sock_no_mmap,
1158 .socketpair = sock_no_socketpair,
Marcel Holtmannfd0b3ff2009-06-16 00:01:49 +02001159 .shutdown = sco_sock_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 .setsockopt = sco_sock_setsockopt,
1161 .getsockopt = sco_sock_getsockopt
1162};
1163
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001164static const struct net_proto_family sco_sock_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 .family = PF_BLUETOOTH,
1166 .owner = THIS_MODULE,
1167 .create = sco_sock_create,
1168};
1169
Gustavo F. Padovan64274512011-02-07 20:08:52 -02001170int __init sco_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171{
1172 int err;
1173
1174 err = proto_register(&sco_proto, 0);
1175 if (err < 0)
1176 return err;
1177
1178 err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
1179 if (err < 0) {
1180 BT_ERR("SCO socket registration failed");
1181 goto error;
1182 }
1183
Al Virob0316612013-04-04 19:14:33 -04001184 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001185 if (err < 0) {
1186 BT_ERR("Failed to create SCO proc file");
1187 bt_sock_unregister(BTPROTO_SCO);
1188 goto error;
1189 }
1190
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 BT_INFO("SCO socket layer initialized");
1192
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07001193 if (IS_ERR_OR_NULL(bt_debugfs))
1194 return 0;
1195
1196 sco_debugfs = debugfs_create_file("sco", 0444, bt_debugfs,
1197 NULL, &sco_debugfs_fops);
1198
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 return 0;
1200
1201error:
1202 proto_unregister(&sco_proto);
1203 return err;
1204}
1205
Gustavo F. Padovan64274512011-02-07 20:08:52 -02001206void __exit sco_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207{
Masatake YAMATOde9b9212012-07-26 01:30:12 +09001208 bt_procfs_cleanup(&init_net, "sco");
1209
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001210 debugfs_remove(sco_debugfs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211
David Herrmann5e9d7f82013-02-24 19:36:51 +01001212 bt_sock_unregister(BTPROTO_SCO);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214 proto_unregister(&sco_proto);
1215}
1216
Marcel Holtmann7cb127d2008-07-14 20:13:53 +02001217module_param(disable_esco, bool, 0644);
1218MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation");