blob: 33d5d22e24da0e120c636c58f4bfb0739572af86 [file] [log] [blame]
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001/*
2 BlueZ - Bluetooth protocol stack for Linux
Mat Martineau966dcfa2011-12-12 10:45:31 -08003 Copyright (c) 2000-2001, 2011-2012 Code Aurora Forum. All rights reserved.
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
5 Copyright (C) 2010 Google Inc.
6
7 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 2 as
11 published by the Free Software Foundation;
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
16 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
17 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
18 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21
22 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
23 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
24 SOFTWARE IS DISCLAIMED.
25*/
26
27/* Bluetooth L2CAP sockets. */
28
29#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020030#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020031#include <net/bluetooth/l2cap.h>
Vinicius Costa Gomesa5474a82011-01-26 21:42:57 -030032#include <net/bluetooth/smp.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070033#include <net/bluetooth/amp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020034
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070035/* ---- L2CAP timers ---- */
36static void l2cap_sock_timeout(unsigned long arg)
37{
38 struct sock *sk = (struct sock *) arg;
39 int reason;
40
41 BT_DBG("sock %p state %d", sk, sk->sk_state);
42
43 bh_lock_sock(sk);
44
45 if (sock_owned_by_user(sk)) {
46 /* sk is owned by user. Try again later */
47 l2cap_sock_set_timer(sk, HZ / 5);
48 bh_unlock_sock(sk);
49 sock_put(sk);
50 return;
51 }
52
53 if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG)
54 reason = ECONNREFUSED;
55 else if (sk->sk_state == BT_CONNECT &&
56 l2cap_pi(sk)->sec_level != BT_SECURITY_SDP)
57 reason = ECONNREFUSED;
58 else
59 reason = ETIMEDOUT;
60
61 __l2cap_sock_close(sk, reason);
62
63 bh_unlock_sock(sk);
64
65 l2cap_sock_kill(sk);
66 sock_put(sk);
67}
68
69void l2cap_sock_set_timer(struct sock *sk, long timeout)
70{
71 BT_DBG("sk %p state %d timeout %ld", sk, sk->sk_state, timeout);
72 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
73}
74
75void l2cap_sock_clear_timer(struct sock *sk)
76{
77 BT_DBG("sock %p state %d", sk, sk->sk_state);
78 sk_stop_timer(sk, &sk->sk_timer);
79}
80
Brian Gixa94b6122012-02-23 16:07:10 -080081int l2cap_sock_le_params_valid(struct bt_le_params *le_params)
82{
83 if (!le_params || le_params->latency > BT_LE_LATENCY_MAX ||
84 le_params->scan_window > BT_LE_SCAN_WINDOW_MAX ||
85 le_params->scan_interval < BT_LE_SCAN_INTERVAL_MIN ||
86 le_params->scan_window > le_params->scan_interval ||
87 le_params->interval_min < BT_LE_CONN_INTERVAL_MIN ||
88 le_params->interval_max > BT_LE_CONN_INTERVAL_MAX ||
89 le_params->interval_min > le_params->interval_max ||
90 le_params->supervision_timeout < BT_LE_SUP_TO_MIN ||
91 le_params->supervision_timeout > BT_LE_SUP_TO_MAX) {
92 return 0;
93 }
94
95 return 1;
96}
97
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070098static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src)
99{
100 struct sock *sk;
101 struct hlist_node *node;
102 sk_for_each(sk, node, &l2cap_sk_list.head)
103 if (l2cap_pi(sk)->sport == psm && !bacmp(&bt_sk(sk)->src, src))
104 goto found;
105 sk = NULL;
106found:
107 return sk;
108}
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -0300109
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200110static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
111{
112 struct sock *sk = sock->sk;
113 struct sockaddr_l2 la;
114 int len, err = 0;
115
116 BT_DBG("sk %p", sk);
117
118 if (!addr || addr->sa_family != AF_BLUETOOTH)
119 return -EINVAL;
120
121 memset(&la, 0, sizeof(la));
122 len = min_t(unsigned int, sizeof(la), alen);
123 memcpy(&la, addr, len);
124
Ville Tervob62f3282011-02-10 22:38:50 -0300125 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200126 return -EINVAL;
127
128 lock_sock(sk);
129
130 if (sk->sk_state != BT_OPEN) {
131 err = -EBADFD;
132 goto done;
133 }
134
135 if (la.l2_psm) {
136 __u16 psm = __le16_to_cpu(la.l2_psm);
137
138 /* PSM must be odd and lsb of upper byte must be 0 */
139 if ((psm & 0x0101) != 0x0001) {
140 err = -EINVAL;
141 goto done;
142 }
143
144 /* Restrict usage of well-known PSMs */
145 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
146 err = -EACCES;
147 goto done;
148 }
149 }
150
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700151 write_lock_bh(&l2cap_sk_list.lock);
152
153 if (la.l2_psm && __l2cap_get_sock_by_addr(la.l2_psm, &la.l2_bdaddr)) {
154 err = -EADDRINUSE;
155 } else {
156 /* Save source address */
157 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
158 l2cap_pi(sk)->psm = la.l2_psm;
159 l2cap_pi(sk)->sport = la.l2_psm;
160 sk->sk_state = BT_BOUND;
161
162 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
163 __le16_to_cpu(la.l2_psm) == 0x0003)
164 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
165 }
166
Ville Tervob62f3282011-02-10 22:38:50 -0300167 if (la.l2_cid)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700168 l2cap_pi(sk)->scid = la.l2_cid;
Ville Tervob62f3282011-02-10 22:38:50 -0300169
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700170 write_unlock_bh(&l2cap_sk_list.lock);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200171
172done:
173 release_sock(sk);
174 return err;
175}
176
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200177static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
178{
179 struct sock *sk = sock->sk;
180 struct sockaddr_l2 la;
181 int len, err = 0;
182
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700183 BT_DBG("sk %p type %d mode %d state %d", sk, sk->sk_type,
184 l2cap_pi(sk)->mode, sk->sk_state);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200185
186 if (!addr || alen < sizeof(addr->sa_family) ||
187 addr->sa_family != AF_BLUETOOTH)
188 return -EINVAL;
189
190 memset(&la, 0, sizeof(la));
191 len = min_t(unsigned int, sizeof(la), alen);
192 memcpy(&la, addr, len);
193
Ville Tervoacd7d372011-02-10 22:38:49 -0300194 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200195 return -EINVAL;
196
197 lock_sock(sk);
198
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700199 if ((sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM)
200 && !(la.l2_psm || la.l2_cid || l2cap_pi(sk)->fixed_channel)) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200201 err = -EINVAL;
202 goto done;
203 }
204
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700205 switch (l2cap_pi(sk)->mode) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200206 case L2CAP_MODE_BASIC:
207 break;
208 case L2CAP_MODE_ERTM:
209 case L2CAP_MODE_STREAMING:
210 if (!disable_ertm)
211 break;
212 /* fall through */
213 default:
214 err = -ENOTSUPP;
215 goto done;
216 }
217
218 switch (sk->sk_state) {
219 case BT_CONNECT:
220 case BT_CONNECT2:
221 case BT_CONFIG:
222 /* Already connecting */
223 goto wait;
224
225 case BT_CONNECTED:
226 /* Already connected */
227 err = -EISCONN;
228 goto done;
229
230 case BT_OPEN:
231 case BT_BOUND:
232 /* Can connect */
233 break;
234
235 default:
236 err = -EBADFD;
237 goto done;
238 }
239
240 /* PSM must be odd and lsb of upper byte must be 0 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700241 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 &&
242 !l2cap_pi(sk)->fixed_channel &&
243 sk->sk_type != SOCK_RAW && !la.l2_cid) {
244 BT_DBG("Bad PSM 0x%x", (int)__le16_to_cpu(la.l2_psm));
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200245 err = -EINVAL;
246 goto done;
247 }
248
249 /* Set destination address and psm */
250 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700251 l2cap_pi(sk)->psm = la.l2_psm;
252 l2cap_pi(sk)->dcid = la.l2_cid;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200253
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700254 err = l2cap_do_connect(sk);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200255 if (err)
256 goto done;
257
258wait:
259 err = bt_sock_wait_state(sk, BT_CONNECTED,
260 sock_sndtimeo(sk, flags & O_NONBLOCK));
261done:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700262 if (err)
263 BT_ERR("failed %d", err);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200264 release_sock(sk);
265 return err;
266}
267
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200268static int l2cap_sock_listen(struct socket *sock, int backlog)
269{
270 struct sock *sk = sock->sk;
271 int err = 0;
272
273 BT_DBG("sk %p backlog %d", sk, backlog);
274
275 lock_sock(sk);
276
277 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
278 || sk->sk_state != BT_BOUND) {
279 err = -EBADFD;
280 goto done;
281 }
282
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700283 switch (l2cap_pi(sk)->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200284 case L2CAP_MODE_BASIC:
285 break;
286 case L2CAP_MODE_ERTM:
287 case L2CAP_MODE_STREAMING:
288 if (!disable_ertm)
289 break;
290 /* fall through */
291 default:
292 err = -ENOTSUPP;
293 goto done;
294 }
295
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700296 if (!l2cap_pi(sk)->psm && !l2cap_pi(sk)->scid) {
297 bdaddr_t *src = &bt_sk(sk)->src;
298 u16 psm;
299
300 err = -EINVAL;
301
302 write_lock_bh(&l2cap_sk_list.lock);
303
304 for (psm = 0x1001; psm < 0x1100; psm += 2)
305 if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) {
306 l2cap_pi(sk)->psm = cpu_to_le16(psm);
307 l2cap_pi(sk)->sport = cpu_to_le16(psm);
308 err = 0;
309 break;
310 }
311
312 write_unlock_bh(&l2cap_sk_list.lock);
313
314 if (err < 0)
315 goto done;
316 }
317
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200318 sk->sk_max_ack_backlog = backlog;
319 sk->sk_ack_backlog = 0;
320 sk->sk_state = BT_LISTEN;
321
322done:
323 release_sock(sk);
324 return err;
325}
326
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200327static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
328{
329 DECLARE_WAITQUEUE(wait, current);
330 struct sock *sk = sock->sk, *nsk;
331 long timeo;
332 int err = 0;
333
334 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
335
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700336 if (sk->sk_state != BT_LISTEN) {
337 err = -EBADFD;
338 goto done;
339 }
340
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200341 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
342
343 BT_DBG("sk %p timeo %ld", sk, timeo);
344
345 /* Wait for an incoming connection. (wake-one). */
346 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700347 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200348 set_current_state(TASK_INTERRUPTIBLE);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700349 if (!timeo) {
350 err = -EAGAIN;
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200351 break;
352 }
353
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700354 release_sock(sk);
355 timeo = schedule_timeout(timeo);
356 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Peter Hurley4e20b5e2011-07-24 00:10:52 -0400357
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700358 if (sk->sk_state != BT_LISTEN) {
359 err = -EBADFD;
Peter Hurley4e20b5e2011-07-24 00:10:52 -0400360 break;
361 }
362
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200363 if (signal_pending(current)) {
364 err = sock_intr_errno(timeo);
365 break;
366 }
367 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700368 set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200369 remove_wait_queue(sk_sleep(sk), &wait);
370
371 if (err)
372 goto done;
373
374 newsock->state = SS_CONNECTED;
375
376 BT_DBG("new socket %p", nsk);
377
378done:
379 release_sock(sk);
380 return err;
381}
382
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200383static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
384{
385 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
386 struct sock *sk = sock->sk;
387
388 BT_DBG("sock %p, sk %p", sock, sk);
389
390 addr->sa_family = AF_BLUETOOTH;
391 *len = sizeof(struct sockaddr_l2);
392
393 if (peer) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700394 la->l2_psm = l2cap_pi(sk)->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200395 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700396 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200397 } else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700398 la->l2_psm = l2cap_pi(sk)->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200399 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700400 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200401 }
402
403 return 0;
404}
405
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200406static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
407{
408 struct sock *sk = sock->sk;
409 struct l2cap_options opts;
410 struct l2cap_conninfo cinfo;
411 int len, err = 0;
412 u32 opt;
413
414 BT_DBG("sk %p", sk);
415
416 if (get_user(len, optlen))
417 return -EFAULT;
418
419 lock_sock(sk);
420
421 switch (optname) {
422 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300423 memset(&opts, 0, sizeof(opts));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700424 opts.imtu = l2cap_pi(sk)->imtu;
425 opts.omtu = l2cap_pi(sk)->omtu;
426 opts.flush_to = l2cap_pi(sk)->flush_to;
427 opts.mode = l2cap_pi(sk)->mode;
428 opts.fcs = l2cap_pi(sk)->fcs;
429 opts.max_tx = l2cap_pi(sk)->max_tx;
430 opts.txwin_size = l2cap_pi(sk)->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200431
432 len = min_t(unsigned int, len, sizeof(opts));
433 if (copy_to_user(optval, (char *) &opts, len))
434 err = -EFAULT;
435
436 break;
437
438 case L2CAP_LM:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700439 switch (l2cap_pi(sk)->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200440 case BT_SECURITY_LOW:
441 opt = L2CAP_LM_AUTH;
442 break;
443 case BT_SECURITY_MEDIUM:
444 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
445 break;
446 case BT_SECURITY_HIGH:
447 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
448 L2CAP_LM_SECURE;
449 break;
450 default:
451 opt = 0;
452 break;
453 }
454
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700455 if (l2cap_pi(sk)->role_switch)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200456 opt |= L2CAP_LM_MASTER;
457
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700458 if (l2cap_pi(sk)->force_reliable)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200459 opt |= L2CAP_LM_RELIABLE;
460
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700461 if (l2cap_pi(sk)->flushable)
462 opt |= L2CAP_LM_FLUSHABLE;
463
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200464 if (put_user(opt, (u32 __user *) optval))
465 err = -EFAULT;
466 break;
467
468 case L2CAP_CONNINFO:
469 if (sk->sk_state != BT_CONNECTED &&
470 !(sk->sk_state == BT_CONNECT2 &&
471 bt_sk(sk)->defer_setup)) {
472 err = -ENOTCONN;
473 break;
474 }
475
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700476 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
477 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200478
479 len = min_t(unsigned int, len, sizeof(cinfo));
480 if (copy_to_user(optval, (char *) &cinfo, len))
481 err = -EFAULT;
482
483 break;
484
485 default:
486 err = -ENOPROTOOPT;
487 break;
488 }
489
490 release_sock(sk);
491 return err;
492}
493
494static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
495{
496 struct sock *sk = sock->sk;
497 struct bt_security sec;
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700498 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200499 int len, err = 0;
500
501 BT_DBG("sk %p", sk);
502
503 if (level == SOL_L2CAP)
504 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
505
506 if (level != SOL_BLUETOOTH)
507 return -ENOPROTOOPT;
508
509 if (get_user(len, optlen))
510 return -EFAULT;
511
512 lock_sock(sk);
513
514 switch (optname) {
515 case BT_SECURITY:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700516 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
517 && sk->sk_type != SOCK_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200518 err = -EINVAL;
519 break;
520 }
521
Vinicius Costa Gomes89daa342011-07-08 18:31:46 -0300522 memset(&sec, 0, sizeof(sec));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700523 sec.level = l2cap_pi(sk)->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200524
Brian Gix27a795c2012-04-19 11:05:06 -0700525 if (sk->sk_state == BT_CONNECTED) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700526 sec.key_size = l2cap_pi(sk)->conn->hcon->enc_key_size;
Brian Gix27a795c2012-04-19 11:05:06 -0700527 sec.level = l2cap_pi(sk)->conn->hcon->sec_level;
528 }
Vinicius Costa Gomes89daa342011-07-08 18:31:46 -0300529
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200530 len = min_t(unsigned int, len, sizeof(sec));
531 if (copy_to_user(optval, (char *) &sec, len))
532 err = -EFAULT;
533
534 break;
535
536 case BT_DEFER_SETUP:
537 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
538 err = -EINVAL;
539 break;
540 }
541
542 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
543 err = -EFAULT;
544
545 break;
546
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700547 case BT_POWER:
548 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
549 && sk->sk_type != SOCK_RAW) {
550 err = -EINVAL;
551 break;
552 }
553
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700554 pwr.force_active = l2cap_pi(sk)->force_active;
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700555
556 len = min_t(unsigned int, len, sizeof(pwr));
557 if (copy_to_user(optval, (char *) &pwr, len))
558 err = -EFAULT;
559
560 break;
561
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700562 case BT_AMP_POLICY:
563 if (put_user(l2cap_pi(sk)->amp_pref, (u32 __user *) optval))
564 err = -EFAULT;
565 break;
566
Brian Gixa94b6122012-02-23 16:07:10 -0800567 case BT_LE_PARAMS:
568 if (l2cap_pi(sk)->scid != L2CAP_CID_LE_DATA) {
569 err = -EINVAL;
570 break;
571 }
572
573 if (copy_to_user(optval, (char *) &bt_sk(sk)->le_params,
574 sizeof(bt_sk(sk)->le_params)))
575 err = -EFAULT;
576 break;
577
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200578 default:
579 err = -ENOPROTOOPT;
580 break;
581 }
582
583 release_sock(sk);
584 return err;
585}
586
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200587static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
588{
589 struct sock *sk = sock->sk;
590 struct l2cap_options opts;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700591 int len, le_sock, err = 0;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200592 u32 opt;
593
594 BT_DBG("sk %p", sk);
595
596 lock_sock(sk);
597
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700598 le_sock = l2cap_pi(sk)->scid == L2CAP_CID_LE_DATA;
599
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200600 switch (optname) {
601 case L2CAP_OPTIONS:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700602 if (sk->sk_state == BT_CONNECTED && !le_sock) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200603 err = -EINVAL;
604 break;
605 }
606
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700607 opts.imtu = l2cap_pi(sk)->imtu;
608 opts.omtu = l2cap_pi(sk)->omtu;
609 opts.flush_to = l2cap_pi(sk)->flush_to;
610 opts.mode = l2cap_pi(sk)->mode;
611 opts.fcs = l2cap_pi(sk)->fcs;
612 opts.max_tx = l2cap_pi(sk)->max_tx;
613 opts.txwin_size = l2cap_pi(sk)->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200614
615 len = min_t(unsigned int, sizeof(opts), optlen);
616 if (copy_from_user((char *) &opts, optval, len)) {
617 err = -EFAULT;
618 break;
619 }
620
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700621 if ((opts.imtu || opts.omtu) && le_sock &&
622 (sk->sk_state == BT_CONNECTED)) {
623 if (opts.imtu >= L2CAP_LE_DEFAULT_MTU)
624 l2cap_pi(sk)->imtu = opts.imtu;
625 if (opts.omtu >= L2CAP_LE_DEFAULT_MTU)
626 l2cap_pi(sk)->omtu = opts.omtu;
627 if (opts.imtu < L2CAP_LE_DEFAULT_MTU ||
628 opts.omtu < L2CAP_LE_DEFAULT_MTU)
629 err = -EINVAL;
630 break;
631 }
632
633 if (opts.txwin_size < 1 ||
634 opts.txwin_size > L2CAP_TX_WIN_MAX_EXTENDED) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200635 err = -EINVAL;
636 break;
637 }
638
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700639 l2cap_pi(sk)->mode = opts.mode;
640 switch (l2cap_pi(sk)->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200641 case L2CAP_MODE_BASIC:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700642 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200643 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200644 case L2CAP_MODE_STREAMING:
Mat Martineau0ac14362012-02-03 16:24:42 -0800645 if (!disable_ertm) {
646 /* No fallback to ERTM or Basic mode */
647 l2cap_pi(sk)->conf_state |=
648 L2CAP_CONF_STATE2_DEVICE;
649 break;
650 }
651 err = -EINVAL;
652 break;
653 case L2CAP_MODE_ERTM:
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200654 if (!disable_ertm)
655 break;
656 /* fall through */
657 default:
658 err = -EINVAL;
659 break;
660 }
661
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700662 l2cap_pi(sk)->imtu = opts.imtu;
663 l2cap_pi(sk)->omtu = opts.omtu;
664 l2cap_pi(sk)->fcs = opts.fcs;
665 l2cap_pi(sk)->max_tx = opts.max_tx;
666 l2cap_pi(sk)->tx_win = opts.txwin_size;
Srinivas Krovvidi10734192011-12-29 07:29:11 +0530667 l2cap_pi(sk)->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200668 break;
669
670 case L2CAP_LM:
671 if (get_user(opt, (u32 __user *) optval)) {
672 err = -EFAULT;
673 break;
674 }
675
676 if (opt & L2CAP_LM_AUTH)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700677 l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200678 if (opt & L2CAP_LM_ENCRYPT)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700679 l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200680 if (opt & L2CAP_LM_SECURE)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700681 l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200682
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700683 l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
684 l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
685 l2cap_pi(sk)->flushable = (opt & L2CAP_LM_FLUSHABLE);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200686 break;
687
688 default:
689 err = -ENOPROTOOPT;
690 break;
691 }
692
693 release_sock(sk);
694 return err;
695}
696
697static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
698{
699 struct sock *sk = sock->sk;
700 struct bt_security sec;
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700701 struct bt_power pwr;
Brian Gixa94b6122012-02-23 16:07:10 -0800702 struct bt_le_params le_params;
Vinicius Costa Gomesa5474a82011-01-26 21:42:57 -0300703 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200704 int len, err = 0;
705 u32 opt;
706
707 BT_DBG("sk %p", sk);
708
709 if (level == SOL_L2CAP)
710 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
711
712 if (level != SOL_BLUETOOTH)
713 return -ENOPROTOOPT;
714
715 lock_sock(sk);
716
717 switch (optname) {
718 case BT_SECURITY:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700719 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
720 && sk->sk_type != SOCK_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200721 err = -EINVAL;
722 break;
723 }
724
725 sec.level = BT_SECURITY_LOW;
726
727 len = min_t(unsigned int, sizeof(sec), optlen);
728 if (copy_from_user((char *) &sec, optval, len)) {
729 err = -EFAULT;
730 break;
731 }
732
733 if (sec.level < BT_SECURITY_LOW ||
734 sec.level > BT_SECURITY_HIGH) {
735 err = -EINVAL;
736 break;
737 }
738
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700739 l2cap_pi(sk)->sec_level = sec.level;
Vinicius Costa Gomesa5474a82011-01-26 21:42:57 -0300740
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700741 conn = l2cap_pi(sk)->conn;
742 if (conn && l2cap_pi(sk)->scid == L2CAP_CID_LE_DATA) {
Vinicius Costa Gomesa5474a82011-01-26 21:42:57 -0300743 if (!conn->hcon->out) {
744 err = -EINVAL;
745 break;
746 }
747
748 if (smp_conn_security(conn, sec.level))
749 break;
750
751 err = 0;
752 sk->sk_state = BT_CONFIG;
753 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200754 break;
755
756 case BT_DEFER_SETUP:
757 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
758 err = -EINVAL;
759 break;
760 }
761
762 if (get_user(opt, (u32 __user *) optval)) {
763 err = -EFAULT;
764 break;
765 }
766
767 bt_sk(sk)->defer_setup = opt;
768 break;
769
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700770 case BT_POWER:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700771 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
772 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700773 err = -EINVAL;
774 break;
775 }
776
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700777 pwr.force_active = 1;
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700778
779 len = min_t(unsigned int, sizeof(pwr), optlen);
780 if (copy_from_user((char *) &pwr, optval, len)) {
781 err = -EFAULT;
782 break;
783 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700784 l2cap_pi(sk)->force_active = pwr.force_active;
785 break;
786
787 case BT_AMP_POLICY:
788 if (get_user(opt, (u32 __user *) optval)) {
789 err = -EFAULT;
790 break;
791 }
792
Mat Martineauf00ffac2011-10-19 15:07:32 -0700793 if ((opt > BT_AMP_POLICY_PREFER_AMP) ||
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700794 ((l2cap_pi(sk)->mode != L2CAP_MODE_ERTM) &&
795 (l2cap_pi(sk)->mode != L2CAP_MODE_STREAMING))) {
796 err = -EINVAL;
797 break;
798 }
799
800 l2cap_pi(sk)->amp_pref = (u8) opt;
801 BT_DBG("BT_AMP_POLICY now %d", opt);
802
803 if ((sk->sk_state == BT_CONNECTED) &&
Peter Krystadc446d212011-09-20 15:35:50 -0700804 (l2cap_pi(sk)->amp_move_role == L2CAP_AMP_MOVE_NONE))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700805 l2cap_amp_move_init(sk);
806
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700807 break;
808
Srinivas Krovvidi10734192011-12-29 07:29:11 +0530809 case BT_FLUSHABLE:
810 if (get_user(opt, (u32 __user *) optval)) {
811 err = -EFAULT;
812 break;
813 }
814 l2cap_pi(sk)->flushable = opt;
815
816 break;
817
Brian Gixa94b6122012-02-23 16:07:10 -0800818 case BT_LE_PARAMS:
819 if (l2cap_pi(sk)->scid != L2CAP_CID_LE_DATA) {
820 err = -EINVAL;
821 break;
822 }
823
824 if (copy_from_user((char *) &le_params, optval,
825 sizeof(struct bt_le_params))) {
826 err = -EFAULT;
827 break;
828 }
829
830 conn = l2cap_pi(sk)->conn;
831 if (!conn || !conn->hcon ||
832 l2cap_pi(sk)->scid != L2CAP_CID_LE_DATA) {
833 memcpy(&bt_sk(sk)->le_params, &le_params,
834 sizeof(le_params));
835 break;
836 }
837
838 if (!conn->hcon->out ||
839 !l2cap_sock_le_params_valid(&le_params)) {
840 err = -EINVAL;
841 break;
842 }
843
844 memcpy(&bt_sk(sk)->le_params, &le_params, sizeof(le_params));
845
846 hci_le_conn_update(conn->hcon,
847 le_params.interval_min,
848 le_params.interval_max,
849 le_params.latency,
850 le_params.supervision_timeout);
851 break;
852
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200853 default:
854 err = -ENOPROTOOPT;
855 break;
856 }
857
858 release_sock(sk);
859 return err;
860}
861
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200862static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
863{
864 struct sock *sk = sock->sk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700865 struct l2cap_pinfo *pi = l2cap_pi(sk);
866 struct sk_buff *skb;
867 struct sk_buff_head seg_queue;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200868 int err;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700869 u8 amp_id;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200870
871 BT_DBG("sock %p, sk %p", sock, sk);
872
873 err = sock_error(sk);
874 if (err)
875 return err;
876
877 if (msg->msg_flags & MSG_OOB)
878 return -EOPNOTSUPP;
879
880 lock_sock(sk);
881
882 if (sk->sk_state != BT_CONNECTED) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700883 err = -ENOTCONN;
884 goto done;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200885 }
886
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700887 /* Connectionless channel */
888 if (sk->sk_type == SOCK_DGRAM) {
889 skb = l2cap_create_connless_pdu(sk, msg, len);
890 if (IS_ERR(skb)) {
891 err = PTR_ERR(skb);
892 } else {
893 l2cap_do_send(sk, skb);
894 err = len;
895 }
896 goto done;
897 }
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200898
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700899 switch (pi->mode) {
900 case L2CAP_MODE_BASIC:
901 /* Check outgoing MTU */
902 if (len > pi->omtu) {
903 err = -EMSGSIZE;
904 goto done;
905 }
906
907 /* Create a basic PDU */
908 skb = l2cap_create_basic_pdu(sk, msg, len);
909 if (IS_ERR(skb)) {
910 err = PTR_ERR(skb);
911 goto done;
912 }
913
914 l2cap_do_send(sk, skb);
915 err = len;
916 break;
917
918 case L2CAP_MODE_ERTM:
919 case L2CAP_MODE_STREAMING:
920
921 /* Check outgoing MTU */
922 if (len > pi->omtu) {
923 err = -EMSGSIZE;
924 goto done;
925 }
926
927 __skb_queue_head_init(&seg_queue);
928
929 /* Do segmentation before calling in to the state machine,
930 * since it's possible to block while waiting for memory
931 * allocation.
932 */
933 amp_id = pi->amp_id;
934 err = l2cap_segment_sdu(sk, &seg_queue, msg, len, 0);
935
936 /* The socket lock is released while segmenting, so check
937 * that the socket is still connected
938 */
939 if (sk->sk_state != BT_CONNECTED) {
940 __skb_queue_purge(&seg_queue);
941 err = -ENOTCONN;
942 }
943
944 if (err) {
945 BT_DBG("Error %d, sk_sndbuf %d, sk_wmem_alloc %d",
946 err, sk->sk_sndbuf,
947 atomic_read(&sk->sk_wmem_alloc));
948 break;
949 }
950
951 if (pi->amp_id != amp_id) {
952 /* Channel moved while unlocked. Resegment. */
953 err = l2cap_resegment_queue(sk, &seg_queue);
954
955 if (err)
956 break;
957 }
958
959 if (pi->mode != L2CAP_MODE_STREAMING)
960 err = l2cap_ertm_tx(sk, 0, &seg_queue,
961 L2CAP_ERTM_EVENT_DATA_REQUEST);
962 else
963 err = l2cap_strm_tx(sk, &seg_queue);
964 if (!err)
965 err = len;
966
967 /* If the skbs were not queued for sending, they'll still be in
968 * seg_queue and need to be purged.
969 */
970 __skb_queue_purge(&seg_queue);
971 break;
972
973 default:
974 BT_DBG("bad state %1.1x", pi->mode);
975 err = -EBADFD;
976 }
977
978done:
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200979 release_sock(sk);
980 return err;
981}
982
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200983static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
984{
985 struct sock *sk = sock->sk;
Mat Martineauc0675b82011-07-07 09:39:02 -0700986 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200987
988 lock_sock(sk);
989
990 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700991 struct l2cap_conn_rsp rsp;
992 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
993 u8 buf[128];
994
995 if (l2cap_pi(sk)->amp_id) {
996 /* Physical link must be brought up before connection
997 * completes.
998 */
999 amp_accept_physical(conn, l2cap_pi(sk)->amp_id, sk);
1000 release_sock(sk);
1001 return 0;
1002 }
1003
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001004 sk->sk_state = BT_CONFIG;
1005
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001006 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1007 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1008 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1009 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1010 l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->ident,
1011 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1012
1013 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) {
1014 release_sock(sk);
1015 return 0;
1016 }
1017
1018 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT;
1019 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
1020 l2cap_build_conf_req(sk, buf), buf);
1021 l2cap_pi(sk)->num_conf_req++;
1022
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001023 release_sock(sk);
1024 return 0;
1025 }
1026
1027 release_sock(sk);
1028
1029 if (sock->type == SOCK_STREAM)
Mat Martineauc0675b82011-07-07 09:39:02 -07001030 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
1031 else
1032 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001033
Mat Martineau28eb3fa2012-02-09 16:06:12 -08001034 if (err >= 0)
1035 l2cap_ertm_recv_done(sk);
Mat Martineauc0675b82011-07-07 09:39:02 -07001036
Mat Martineauc0675b82011-07-07 09:39:02 -07001037 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001038}
1039
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001040/* Kill socket (only if zapped and orphan)
1041 * Must be called on unlocked socket.
1042 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001043void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001044{
1045 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1046 return;
1047
1048 BT_DBG("sk %p state %d", sk, sk->sk_state);
1049
1050 /* Kill poor orphan */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001051 bt_sock_unlink(&l2cap_sk_list, sk);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001052 sock_set_flag(sk, SOCK_DEAD);
1053 sock_put(sk);
1054}
1055
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001056/* Must be called on unlocked socket. */
1057static void l2cap_sock_close(struct sock *sk)
1058{
1059 l2cap_sock_clear_timer(sk);
1060 lock_sock(sk);
1061 __l2cap_sock_close(sk, ECONNRESET);
1062 release_sock(sk);
1063 l2cap_sock_kill(sk);
1064}
1065
1066static void l2cap_sock_cleanup_listen(struct sock *parent)
1067{
1068 struct sock *sk;
1069
1070 BT_DBG("parent %p", parent);
1071
1072 /* Close not yet accepted channels */
1073 while ((sk = bt_accept_dequeue(parent, NULL)))
1074 l2cap_sock_close(sk);
1075
1076 parent->sk_state = BT_CLOSED;
1077 sock_set_flag(parent, SOCK_ZAPPED);
1078}
1079
1080void __l2cap_sock_close(struct sock *sk, int reason)
1081{
1082 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1083
1084 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
1085
1086 switch (sk->sk_state) {
1087 case BT_LISTEN:
1088 l2cap_sock_cleanup_listen(sk);
1089 break;
1090
1091 case BT_CONNECTED:
1092 case BT_CONFIG:
1093 if ((sk->sk_type == SOCK_SEQPACKET ||
1094 sk->sk_type == SOCK_STREAM) &&
1095 conn->hcon->type == ACL_LINK) {
1096 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
1097 l2cap_send_disconn_req(conn, sk, reason);
1098 } else
1099 l2cap_chan_del(sk, reason);
1100 break;
1101
1102 case BT_CONNECT2:
1103 if ((sk->sk_type == SOCK_SEQPACKET ||
1104 sk->sk_type == SOCK_STREAM) &&
1105 conn->hcon->type == ACL_LINK) {
1106 struct l2cap_conn_rsp rsp;
1107 __u16 result;
1108
1109 if (bt_sk(sk)->defer_setup)
1110 result = L2CAP_CR_SEC_BLOCK;
1111 else
1112 result = L2CAP_CR_BAD_PSM;
1113 sk->sk_state = BT_DISCONN;
1114
1115 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1116 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1117 rsp.result = cpu_to_le16(result);
1118 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1119 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
1120 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1121 }
1122
1123 l2cap_chan_del(sk, reason);
1124 break;
1125
1126 case BT_CONNECT:
1127 case BT_DISCONN:
1128 l2cap_chan_del(sk, reason);
1129 break;
1130
1131 default:
1132 sock_set_flag(sk, SOCK_ZAPPED);
1133 break;
1134 }
1135}
1136
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001137static int l2cap_sock_shutdown(struct socket *sock, int how)
1138{
1139 struct sock *sk = sock->sk;
1140 int err = 0;
1141
1142 BT_DBG("sock %p, sk %p", sock, sk);
1143
1144 if (!sk)
1145 return 0;
1146
1147 lock_sock(sk);
1148 if (!sk->sk_shutdown) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001149
1150 if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) {
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001151 err = __l2cap_wait_ack(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001152 l2cap_ertm_shutdown(sk);
1153 }
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001154
1155 sk->sk_shutdown = SHUTDOWN_MASK;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001156 l2cap_sock_clear_timer(sk);
1157 __l2cap_sock_close(sk, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001158
1159 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
1160 err = bt_sock_wait_state(sk, BT_CLOSED,
1161 sk->sk_lingertime);
1162 }
1163
1164 if (!err && sk->sk_err)
1165 err = -sk->sk_err;
1166
1167 release_sock(sk);
1168 return err;
1169}
1170
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001171static int l2cap_sock_release(struct socket *sock)
1172{
1173 struct sock *sk = sock->sk;
Brian Gix20de7cf2012-02-02 14:56:51 -08001174 struct sock *srv_sk = NULL;
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001175 int err;
1176
1177 BT_DBG("sock %p, sk %p", sock, sk);
1178
1179 if (!sk)
1180 return 0;
1181
Brian Gix20de7cf2012-02-02 14:56:51 -08001182 /* If this is an ATT Client socket, find the matching Server */
1183 if (l2cap_pi(sk)->scid == L2CAP_CID_LE_DATA && !l2cap_pi(sk)->incoming)
1184 srv_sk = l2cap_find_sock_by_fixed_cid_and_dir(L2CAP_CID_LE_DATA,
1185 &bt_sk(sk)->src, &bt_sk(sk)->dst, 1);
1186
1187 /* If server socket found, request tear down */
1188 BT_DBG("client:%p server:%p", sk, srv_sk);
1189 if (srv_sk)
1190 l2cap_sock_set_timer(srv_sk, 1);
1191
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001192 err = l2cap_sock_shutdown(sock, 2);
1193
1194 sock_orphan(sk);
1195 l2cap_sock_kill(sk);
1196 return err;
1197}
1198
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001199static void l2cap_sock_destruct(struct sock *sk)
1200{
1201 BT_DBG("sk %p", sk);
1202
1203 skb_queue_purge(&sk->sk_receive_queue);
1204 skb_queue_purge(&sk->sk_write_queue);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001205
1206 l2cap_ertm_destruct(sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001207}
1208
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001209static void set_default_config(struct l2cap_conf_prm *conf_prm)
1210{
1211 conf_prm->fcs = L2CAP_FCS_CRC16;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001212 conf_prm->flush_to = L2CAP_DEFAULT_FLUSH_TO;
1213}
1214
1215void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001216{
1217 struct l2cap_pinfo *pi = l2cap_pi(sk);
1218
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001219 BT_DBG("sk %p parent %p", sk, parent);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001220
1221 if (parent) {
1222 sk->sk_type = parent->sk_type;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001223 sk->sk_rcvbuf = parent->sk_rcvbuf;
1224 sk->sk_sndbuf = parent->sk_sndbuf;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001225 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
1226
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001227 pi->imtu = l2cap_pi(parent)->imtu;
1228 pi->omtu = l2cap_pi(parent)->omtu;
1229 pi->conf_state = l2cap_pi(parent)->conf_state;
1230 pi->mode = l2cap_pi(parent)->mode;
1231 pi->fcs = l2cap_pi(parent)->fcs;
1232 pi->max_tx = l2cap_pi(parent)->max_tx;
1233 pi->tx_win = l2cap_pi(parent)->tx_win;
1234 pi->sec_level = l2cap_pi(parent)->sec_level;
1235 pi->role_switch = l2cap_pi(parent)->role_switch;
1236 pi->force_reliable = l2cap_pi(parent)->force_reliable;
1237 pi->flushable = l2cap_pi(parent)->flushable;
1238 pi->force_active = l2cap_pi(parent)->force_active;
1239 pi->amp_pref = l2cap_pi(parent)->amp_pref;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001240 } else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001241 pi->imtu = L2CAP_DEFAULT_MTU;
1242 pi->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001243 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001244 pi->mode = L2CAP_MODE_ERTM;
1245 pi->conf_state |= L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001246 } else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001247 pi->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001248 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001249 pi->reconf_state = L2CAP_RECONF_NONE;
1250 pi->max_tx = L2CAP_DEFAULT_MAX_TX;
1251 pi->fcs = L2CAP_FCS_CRC16;
1252 pi->tx_win = L2CAP_DEFAULT_TX_WINDOW;
1253 pi->sec_level = BT_SECURITY_LOW;
1254 pi->role_switch = 0;
1255 pi->force_reliable = 0;
1256 pi->flushable = 0;
1257 pi->force_active = 1;
1258 pi->amp_pref = BT_AMP_POLICY_REQUIRE_BR_EDR;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001259 }
1260
1261 /* Default config options */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001262 sk->sk_backlog_rcv = l2cap_data_channel;
1263 pi->ampcon = NULL;
1264 pi->ampchan = NULL;
1265 pi->conf_len = 0;
1266 pi->flush_to = L2CAP_DEFAULT_FLUSH_TO;
1267 pi->scid = 0;
1268 pi->dcid = 0;
1269 pi->tx_win_max = L2CAP_TX_WIN_MAX_ENHANCED;
1270 pi->extended_control = 0;
Gustavo F. Padovanb090c4b2011-05-16 17:24:37 -03001271
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001272 pi->local_conf.fcs = pi->fcs;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001273 pi->local_conf.flush_to = pi->flush_to;
1274
1275 set_default_config(&pi->remote_conf);
1276
1277 skb_queue_head_init(TX_QUEUE(sk));
1278 skb_queue_head_init(SREJ_QUEUE(sk));
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001279}
1280
1281static struct proto l2cap_proto = {
1282 .name = "L2CAP",
1283 .owner = THIS_MODULE,
1284 .obj_size = sizeof(struct l2cap_pinfo)
1285};
1286
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001287struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001288{
1289 struct sock *sk;
1290
1291 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1292 if (!sk)
1293 return NULL;
1294
1295 sock_init_data(sock, sk);
1296 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1297
1298 sk->sk_destruct = l2cap_sock_destruct;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001299 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001300
1301 sock_reset_flag(sk, SOCK_ZAPPED);
1302
1303 sk->sk_protocol = proto;
1304 sk->sk_state = BT_OPEN;
1305
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001306 setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk);
Gustavo F. Padovanb87bf5b2011-05-16 16:42:01 -03001307
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001308 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001309 return sk;
1310}
1311
1312static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1313 int kern)
1314{
1315 struct sock *sk;
1316
1317 BT_DBG("sock %p", sock);
1318
1319 sock->state = SS_UNCONNECTED;
1320
1321 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1322 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1323 return -ESOCKTNOSUPPORT;
1324
1325 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1326 return -EPERM;
1327
1328 sock->ops = &l2cap_sock_ops;
1329
1330 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1331 if (!sk)
1332 return -ENOMEM;
1333
1334 l2cap_sock_init(sk, NULL);
1335 return 0;
1336}
1337
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001338const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001339 .family = PF_BLUETOOTH,
1340 .owner = THIS_MODULE,
1341 .release = l2cap_sock_release,
1342 .bind = l2cap_sock_bind,
1343 .connect = l2cap_sock_connect,
1344 .listen = l2cap_sock_listen,
1345 .accept = l2cap_sock_accept,
1346 .getname = l2cap_sock_getname,
1347 .sendmsg = l2cap_sock_sendmsg,
1348 .recvmsg = l2cap_sock_recvmsg,
1349 .poll = bt_sock_poll,
1350 .ioctl = bt_sock_ioctl,
1351 .mmap = sock_no_mmap,
1352 .socketpair = sock_no_socketpair,
1353 .shutdown = l2cap_sock_shutdown,
1354 .setsockopt = l2cap_sock_setsockopt,
1355 .getsockopt = l2cap_sock_getsockopt
1356};
1357
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001358static const struct net_proto_family l2cap_sock_family_ops = {
1359 .family = PF_BLUETOOTH,
1360 .owner = THIS_MODULE,
1361 .create = l2cap_sock_create,
1362};
1363
1364int __init l2cap_init_sockets(void)
1365{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001366 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001367
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001368 err = proto_register(&l2cap_proto, 0);
1369 if (err < 0)
1370 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001371
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001372 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1373 if (err < 0)
1374 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001375
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001376 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001377
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001378 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001379
1380error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001381 BT_ERR("L2CAP socket registration failed");
1382 proto_unregister(&l2cap_proto);
1383 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001384}
1385
1386void l2cap_cleanup_sockets(void)
1387{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001388 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1389 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001390
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001391 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001392}