blob: 4829e6bd08300e4f0975e9f2f627aecc6132d79f [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
Steve Mucklef132c6c2012-06-06 18:30:57 -070029#include <linux/interrupt.h>
30#include <linux/module.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000031
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020032#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020033#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020034#include <net/bluetooth/l2cap.h>
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -030035#include <net/bluetooth/smp.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070036#include <net/bluetooth/amp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020037
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070038/* ---- L2CAP timers ---- */
39static void l2cap_sock_timeout(unsigned long arg)
40{
41 struct sock *sk = (struct sock *) arg;
42 int reason;
43
44 BT_DBG("sock %p state %d", sk, sk->sk_state);
45
46 bh_lock_sock(sk);
47
48 if (sock_owned_by_user(sk)) {
49 /* sk is owned by user. Try again later */
50 l2cap_sock_set_timer(sk, HZ / 5);
51 bh_unlock_sock(sk);
52 sock_put(sk);
53 return;
54 }
55
56 if (sk->sk_state == BT_CONNECTED || sk->sk_state == BT_CONFIG)
57 reason = ECONNREFUSED;
58 else if (sk->sk_state == BT_CONNECT &&
59 l2cap_pi(sk)->sec_level != BT_SECURITY_SDP)
60 reason = ECONNREFUSED;
61 else
62 reason = ETIMEDOUT;
63
64 __l2cap_sock_close(sk, reason);
65
66 bh_unlock_sock(sk);
67
68 l2cap_sock_kill(sk);
69 sock_put(sk);
70}
71
72void l2cap_sock_set_timer(struct sock *sk, long timeout)
73{
74 BT_DBG("sk %p state %d timeout %ld", sk, sk->sk_state, timeout);
75 sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
76}
77
78void l2cap_sock_clear_timer(struct sock *sk)
79{
80 BT_DBG("sock %p state %d", sk, sk->sk_state);
81 sk_stop_timer(sk, &sk->sk_timer);
82}
83
Brian Gixa94b6122012-02-23 16:07:10 -080084int l2cap_sock_le_params_valid(struct bt_le_params *le_params)
85{
86 if (!le_params || le_params->latency > BT_LE_LATENCY_MAX ||
87 le_params->scan_window > BT_LE_SCAN_WINDOW_MAX ||
88 le_params->scan_interval < BT_LE_SCAN_INTERVAL_MIN ||
89 le_params->scan_window > le_params->scan_interval ||
90 le_params->interval_min < BT_LE_CONN_INTERVAL_MIN ||
91 le_params->interval_max > BT_LE_CONN_INTERVAL_MAX ||
92 le_params->interval_min > le_params->interval_max ||
93 le_params->supervision_timeout < BT_LE_SUP_TO_MIN ||
94 le_params->supervision_timeout > BT_LE_SUP_TO_MAX) {
95 return 0;
96 }
97
98 return 1;
99}
100
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700101static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src)
102{
103 struct sock *sk;
104 struct hlist_node *node;
105 sk_for_each(sk, node, &l2cap_sk_list.head)
106 if (l2cap_pi(sk)->sport == psm && !bacmp(&bt_sk(sk)->src, src))
107 goto found;
108 sk = NULL;
109found:
110 return sk;
111}
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -0300112
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200113static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
114{
115 struct sock *sk = sock->sk;
116 struct sockaddr_l2 la;
117 int len, err = 0;
118
119 BT_DBG("sk %p", sk);
120
121 if (!addr || addr->sa_family != AF_BLUETOOTH)
122 return -EINVAL;
123
124 memset(&la, 0, sizeof(la));
125 len = min_t(unsigned int, sizeof(la), alen);
126 memcpy(&la, addr, len);
127
Ville Tervob62f3282011-02-10 22:38:50 -0300128 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200129 return -EINVAL;
130
131 lock_sock(sk);
132
133 if (sk->sk_state != BT_OPEN) {
134 err = -EBADFD;
135 goto done;
136 }
137
138 if (la.l2_psm) {
139 __u16 psm = __le16_to_cpu(la.l2_psm);
140
141 /* PSM must be odd and lsb of upper byte must be 0 */
142 if ((psm & 0x0101) != 0x0001) {
143 err = -EINVAL;
144 goto done;
145 }
146
147 /* Restrict usage of well-known PSMs */
148 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
149 err = -EACCES;
150 goto done;
151 }
152 }
153
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700154 write_lock_bh(&l2cap_sk_list.lock);
155
156 if (la.l2_psm && __l2cap_get_sock_by_addr(la.l2_psm, &la.l2_bdaddr)) {
157 err = -EADDRINUSE;
158 } else {
159 /* Save source address */
160 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
161 l2cap_pi(sk)->psm = la.l2_psm;
162 l2cap_pi(sk)->sport = la.l2_psm;
163 sk->sk_state = BT_BOUND;
164
165 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
166 __le16_to_cpu(la.l2_psm) == 0x0003)
167 l2cap_pi(sk)->sec_level = BT_SECURITY_SDP;
168 }
169
Ville Tervob62f3282011-02-10 22:38:50 -0300170 if (la.l2_cid)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700171 l2cap_pi(sk)->scid = la.l2_cid;
Ville Tervob62f3282011-02-10 22:38:50 -0300172
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700173 write_unlock_bh(&l2cap_sk_list.lock);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200174
175done:
176 release_sock(sk);
177 return err;
178}
179
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200180static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
181{
182 struct sock *sk = sock->sk;
183 struct sockaddr_l2 la;
184 int len, err = 0;
185
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700186 BT_DBG("sk %p type %d mode %d state %d", sk, sk->sk_type,
187 l2cap_pi(sk)->mode, sk->sk_state);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200188
189 if (!addr || alen < sizeof(addr->sa_family) ||
190 addr->sa_family != AF_BLUETOOTH)
191 return -EINVAL;
192
193 memset(&la, 0, sizeof(la));
194 len = min_t(unsigned int, sizeof(la), alen);
195 memcpy(&la, addr, len);
196
Ville Tervoacd7d372011-02-10 22:38:49 -0300197 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200198 return -EINVAL;
199
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200200 lock_sock(sk);
201
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700202 if ((sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM)
203 && !(la.l2_psm || la.l2_cid || l2cap_pi(sk)->fixed_channel)) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200204 err = -EINVAL;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200205 goto done;
206 }
207
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700208 switch (l2cap_pi(sk)->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200209 case L2CAP_MODE_BASIC:
210 break;
211 case L2CAP_MODE_ERTM:
212 case L2CAP_MODE_STREAMING:
213 if (!disable_ertm)
214 break;
215 /* fall through */
216 default:
217 err = -ENOTSUPP;
218 goto done;
219 }
220
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200221 switch (sk->sk_state) {
222 case BT_CONNECT:
223 case BT_CONNECT2:
224 case BT_CONFIG:
225 /* Already connecting */
226 goto wait;
227
228 case BT_CONNECTED:
229 /* Already connected */
230 err = -EISCONN;
231 goto done;
232
233 case BT_OPEN:
234 case BT_BOUND:
235 /* Can connect */
236 break;
237
238 default:
239 err = -EBADFD;
240 goto done;
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200241 }
242
243 /* PSM must be odd and lsb of upper byte must be 0 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700244 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 &&
245 !l2cap_pi(sk)->fixed_channel &&
246 sk->sk_type != SOCK_RAW && !la.l2_cid) {
247 BT_DBG("Bad PSM 0x%x", (int)__le16_to_cpu(la.l2_psm));
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200248 err = -EINVAL;
249 goto done;
250 }
251
252 /* Set destination address and psm */
253 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700254 l2cap_pi(sk)->psm = la.l2_psm;
255 l2cap_pi(sk)->dcid = la.l2_cid;
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200256
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700257 err = l2cap_do_connect(sk);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200258 if (err)
259 goto done;
260
261wait:
262 err = bt_sock_wait_state(sk, BT_CONNECTED,
263 sock_sndtimeo(sk, flags & O_NONBLOCK));
264done:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700265 if (err)
266 BT_ERR("failed %d", err);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200267 release_sock(sk);
268 return err;
269}
270
271static int l2cap_sock_listen(struct socket *sock, int backlog)
272{
273 struct sock *sk = sock->sk;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200274 int err = 0;
275
276 BT_DBG("sk %p backlog %d", sk, backlog);
277
278 lock_sock(sk);
279
280 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
281 || sk->sk_state != BT_BOUND) {
282 err = -EBADFD;
283 goto done;
284 }
285
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700286 switch (l2cap_pi(sk)->mode) {
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200287 case L2CAP_MODE_BASIC:
288 break;
289 case L2CAP_MODE_ERTM:
290 case L2CAP_MODE_STREAMING:
291 if (!disable_ertm)
292 break;
293 /* fall through */
294 default:
295 err = -ENOTSUPP;
296 goto done;
297 }
298
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700299 if (!l2cap_pi(sk)->psm && !l2cap_pi(sk)->scid) {
300 bdaddr_t *src = &bt_sk(sk)->src;
301 u16 psm;
302
303 err = -EINVAL;
304
305 write_lock_bh(&l2cap_sk_list.lock);
306
307 for (psm = 0x1001; psm < 0x1100; psm += 2)
308 if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) {
309 l2cap_pi(sk)->psm = cpu_to_le16(psm);
310 l2cap_pi(sk)->sport = cpu_to_le16(psm);
311 err = 0;
312 break;
313 }
314
315 write_unlock_bh(&l2cap_sk_list.lock);
316
317 if (err < 0)
318 goto done;
319 }
320
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200321 sk->sk_max_ack_backlog = backlog;
322 sk->sk_ack_backlog = 0;
323 sk->sk_state = BT_LISTEN;
324
Gustavo F. Padovan65390582011-02-04 02:33:56 -0200325done:
326 release_sock(sk);
327 return err;
328}
329
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200330static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
331{
332 DECLARE_WAITQUEUE(wait, current);
333 struct sock *sk = sock->sk, *nsk;
334 long timeo;
335 int err = 0;
336
337 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
338
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700339 if (sk->sk_state != BT_LISTEN) {
340 err = -EBADFD;
341 goto done;
342 }
343
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200344 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
345
346 BT_DBG("sk %p timeo %ld", sk, timeo);
347
348 /* Wait for an incoming connection. (wake-one). */
349 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700350 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200351 set_current_state(TASK_INTERRUPTIBLE);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700352 if (!timeo) {
353 err = -EAGAIN;
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200354 break;
355 }
356
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700357 release_sock(sk);
358 timeo = schedule_timeout(timeo);
359 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400360
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700361 if (sk->sk_state != BT_LISTEN) {
362 err = -EBADFD;
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400363 break;
364 }
365
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200366 if (signal_pending(current)) {
367 err = sock_intr_errno(timeo);
368 break;
369 }
370 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700371 set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200372 remove_wait_queue(sk_sleep(sk), &wait);
373
374 if (err)
375 goto done;
376
377 newsock->state = SS_CONNECTED;
378
379 BT_DBG("new socket %p", nsk);
380
381done:
382 release_sock(sk);
383 return err;
384}
385
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200386static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
387{
388 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
389 struct sock *sk = sock->sk;
390
391 BT_DBG("sock %p, sk %p", sock, sk);
392
393 addr->sa_family = AF_BLUETOOTH;
394 *len = sizeof(struct sockaddr_l2);
395
396 if (peer) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700397 la->l2_psm = l2cap_pi(sk)->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200398 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700399 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200400 } else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700401 la->l2_psm = l2cap_pi(sk)->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200402 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700403 la->l2_cid = cpu_to_le16(l2cap_pi(sk)->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200404 }
405
406 return 0;
407}
408
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200409static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
410{
411 struct sock *sk = sock->sk;
412 struct l2cap_options opts;
413 struct l2cap_conninfo cinfo;
414 int len, err = 0;
415 u32 opt;
416
417 BT_DBG("sk %p", sk);
418
419 if (get_user(len, optlen))
420 return -EFAULT;
421
422 lock_sock(sk);
423
424 switch (optname) {
425 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300426 memset(&opts, 0, sizeof(opts));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700427 opts.imtu = l2cap_pi(sk)->imtu;
428 opts.omtu = l2cap_pi(sk)->omtu;
429 opts.flush_to = l2cap_pi(sk)->flush_to;
430 opts.mode = l2cap_pi(sk)->mode;
431 opts.fcs = l2cap_pi(sk)->fcs;
432 opts.max_tx = l2cap_pi(sk)->max_tx;
433 opts.txwin_size = l2cap_pi(sk)->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200434
435 len = min_t(unsigned int, len, sizeof(opts));
436 if (copy_to_user(optval, (char *) &opts, len))
437 err = -EFAULT;
438
439 break;
440
441 case L2CAP_LM:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700442 switch (l2cap_pi(sk)->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200443 case BT_SECURITY_LOW:
444 opt = L2CAP_LM_AUTH;
445 break;
446 case BT_SECURITY_MEDIUM:
447 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
448 break;
449 case BT_SECURITY_HIGH:
450 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
451 L2CAP_LM_SECURE;
452 break;
453 default:
454 opt = 0;
455 break;
456 }
457
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700458 if (l2cap_pi(sk)->role_switch)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200459 opt |= L2CAP_LM_MASTER;
460
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700461 if (l2cap_pi(sk)->force_reliable)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200462 opt |= L2CAP_LM_RELIABLE;
463
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700464 if (l2cap_pi(sk)->flushable)
465 opt |= L2CAP_LM_FLUSHABLE;
466
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200467 if (put_user(opt, (u32 __user *) optval))
468 err = -EFAULT;
469 break;
470
471 case L2CAP_CONNINFO:
472 if (sk->sk_state != BT_CONNECTED &&
473 !(sk->sk_state == BT_CONNECT2 &&
474 bt_sk(sk)->defer_setup)) {
475 err = -ENOTCONN;
476 break;
477 }
478
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700479 cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle;
480 memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200481
482 len = min_t(unsigned int, len, sizeof(cinfo));
483 if (copy_to_user(optval, (char *) &cinfo, len))
484 err = -EFAULT;
485
486 break;
487
488 default:
489 err = -ENOPROTOOPT;
490 break;
491 }
492
493 release_sock(sk);
494 return err;
495}
496
497static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
498{
499 struct sock *sk = sock->sk;
500 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700501 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200502 int len, err = 0;
503
504 BT_DBG("sk %p", sk);
505
506 if (level == SOL_L2CAP)
507 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
508
509 if (level != SOL_BLUETOOTH)
510 return -ENOPROTOOPT;
511
512 if (get_user(len, optlen))
513 return -EFAULT;
514
515 lock_sock(sk);
516
517 switch (optname) {
518 case BT_SECURITY:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700519 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
520 && sk->sk_type != SOCK_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200521 err = -EINVAL;
522 break;
523 }
524
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300525 memset(&sec, 0, sizeof(sec));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700526 sec.level = l2cap_pi(sk)->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200527
Brian Gix27a795c2012-04-19 11:05:06 -0700528 if (sk->sk_state == BT_CONNECTED) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700529 sec.key_size = l2cap_pi(sk)->conn->hcon->enc_key_size;
Brian Gix27a795c2012-04-19 11:05:06 -0700530 sec.level = l2cap_pi(sk)->conn->hcon->sec_level;
531 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300532
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200533 len = min_t(unsigned int, len, sizeof(sec));
534 if (copy_to_user(optval, (char *) &sec, len))
535 err = -EFAULT;
536
537 break;
538
539 case BT_DEFER_SETUP:
540 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
541 err = -EINVAL;
542 break;
543 }
544
545 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
546 err = -EFAULT;
547
548 break;
549
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700550 case BT_POWER:
551 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
552 && sk->sk_type != SOCK_RAW) {
553 err = -EINVAL;
554 break;
555 }
556
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700557 pwr.force_active = l2cap_pi(sk)->force_active;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700558
559 len = min_t(unsigned int, len, sizeof(pwr));
560 if (copy_to_user(optval, (char *) &pwr, len))
561 err = -EFAULT;
562
563 break;
564
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700565 case BT_AMP_POLICY:
566 if (put_user(l2cap_pi(sk)->amp_pref, (u32 __user *) optval))
567 err = -EFAULT;
568 break;
569
Brian Gixa94b6122012-02-23 16:07:10 -0800570 case BT_LE_PARAMS:
571 if (l2cap_pi(sk)->scid != L2CAP_CID_LE_DATA) {
572 err = -EINVAL;
Mat Martineau2ea66482011-11-02 16:18:30 -0700573 break;
574 }
575
Brian Gixa94b6122012-02-23 16:07:10 -0800576 if (copy_to_user(optval, (char *) &bt_sk(sk)->le_params,
577 sizeof(bt_sk(sk)->le_params)))
Mat Martineau2ea66482011-11-02 16:18:30 -0700578 err = -EFAULT;
579 break;
580
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200581 default:
582 err = -ENOPROTOOPT;
583 break;
584 }
585
586 release_sock(sk);
587 return err;
588}
589
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200590static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
591{
592 struct sock *sk = sock->sk;
593 struct l2cap_options opts;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700594 int len, le_sock, err = 0;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200595 u32 opt;
596
597 BT_DBG("sk %p", sk);
598
599 lock_sock(sk);
600
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700601 le_sock = l2cap_pi(sk)->scid == L2CAP_CID_LE_DATA;
602
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200603 switch (optname) {
604 case L2CAP_OPTIONS:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700605 if (sk->sk_state == BT_CONNECTED && !le_sock) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200606 err = -EINVAL;
607 break;
608 }
609
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700610 opts.imtu = l2cap_pi(sk)->imtu;
611 opts.omtu = l2cap_pi(sk)->omtu;
612 opts.flush_to = l2cap_pi(sk)->flush_to;
613 opts.mode = l2cap_pi(sk)->mode;
614 opts.fcs = l2cap_pi(sk)->fcs;
615 opts.max_tx = l2cap_pi(sk)->max_tx;
616 opts.txwin_size = l2cap_pi(sk)->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200617
618 len = min_t(unsigned int, sizeof(opts), optlen);
619 if (copy_from_user((char *) &opts, optval, len)) {
620 err = -EFAULT;
621 break;
622 }
623
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700624 if ((opts.imtu || opts.omtu) && le_sock &&
625 (sk->sk_state == BT_CONNECTED)) {
626 if (opts.imtu >= L2CAP_LE_DEFAULT_MTU)
627 l2cap_pi(sk)->imtu = opts.imtu;
628 if (opts.omtu >= L2CAP_LE_DEFAULT_MTU)
629 l2cap_pi(sk)->omtu = opts.omtu;
630 if (opts.imtu < L2CAP_LE_DEFAULT_MTU ||
631 opts.omtu < L2CAP_LE_DEFAULT_MTU)
632 err = -EINVAL;
633 break;
634 }
635
636 if (opts.txwin_size < 1 ||
637 opts.txwin_size > L2CAP_TX_WIN_MAX_EXTENDED) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200638 err = -EINVAL;
639 break;
640 }
641
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700642 l2cap_pi(sk)->mode = opts.mode;
643 switch (l2cap_pi(sk)->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200644 case L2CAP_MODE_BASIC:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700645 l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200646 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200647 case L2CAP_MODE_STREAMING:
Mat Martineau0ac14362012-02-03 16:24:42 -0800648 if (!disable_ertm) {
649 /* No fallback to ERTM or Basic mode */
650 l2cap_pi(sk)->conf_state |=
651 L2CAP_CONF_STATE2_DEVICE;
652 break;
653 }
654 err = -EINVAL;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200655 break;
656 case L2CAP_MODE_ERTM:
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200657 if (!disable_ertm)
658 break;
659 /* fall through */
660 default:
661 err = -EINVAL;
662 break;
663 }
664
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700665 l2cap_pi(sk)->imtu = opts.imtu;
666 l2cap_pi(sk)->omtu = opts.omtu;
667 l2cap_pi(sk)->fcs = opts.fcs;
668 l2cap_pi(sk)->max_tx = opts.max_tx;
669 l2cap_pi(sk)->tx_win = opts.txwin_size;
Srinivas Krovvidi10734192011-12-29 07:29:11 +0530670 l2cap_pi(sk)->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200671 break;
672
673 case L2CAP_LM:
674 if (get_user(opt, (u32 __user *) optval)) {
675 err = -EFAULT;
676 break;
677 }
678
679 if (opt & L2CAP_LM_AUTH)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700680 l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200681 if (opt & L2CAP_LM_ENCRYPT)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700682 l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200683 if (opt & L2CAP_LM_SECURE)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700684 l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200685
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700686 l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
687 l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
688 l2cap_pi(sk)->flushable = (opt & L2CAP_LM_FLUSHABLE);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200689 break;
690
691 default:
692 err = -ENOPROTOOPT;
693 break;
694 }
695
696 release_sock(sk);
697 return err;
698}
699
700static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
701{
702 struct sock *sk = sock->sk;
703 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700704 struct bt_power pwr;
Brian Gixa94b6122012-02-23 16:07:10 -0800705 struct bt_le_params le_params;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300706 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200707 int len, err = 0;
708 u32 opt;
709
710 BT_DBG("sk %p", sk);
711
712 if (level == SOL_L2CAP)
713 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
714
715 if (level != SOL_BLUETOOTH)
716 return -ENOPROTOOPT;
717
718 lock_sock(sk);
719
720 switch (optname) {
721 case BT_SECURITY:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700722 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
723 && sk->sk_type != SOCK_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200724 err = -EINVAL;
725 break;
726 }
727
728 sec.level = BT_SECURITY_LOW;
729
730 len = min_t(unsigned int, sizeof(sec), optlen);
731 if (copy_from_user((char *) &sec, optval, len)) {
732 err = -EFAULT;
733 break;
734 }
735
736 if (sec.level < BT_SECURITY_LOW ||
737 sec.level > BT_SECURITY_HIGH) {
738 err = -EINVAL;
739 break;
740 }
741
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700742 l2cap_pi(sk)->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300743
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700744 conn = l2cap_pi(sk)->conn;
745 if (conn && l2cap_pi(sk)->scid == L2CAP_CID_LE_DATA) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300746 if (!conn->hcon->out) {
747 err = -EINVAL;
748 break;
749 }
750
751 if (smp_conn_security(conn, sec.level))
752 break;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200753
Vinicius Costa Gomesa5474a82011-01-26 21:42:57 -0300754 err = 0;
755 sk->sk_state = BT_CONFIG;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300756 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200757 break;
758
759 case BT_DEFER_SETUP:
760 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
761 err = -EINVAL;
762 break;
763 }
764
765 if (get_user(opt, (u32 __user *) optval)) {
766 err = -EFAULT;
767 break;
768 }
769
770 bt_sk(sk)->defer_setup = opt;
771 break;
772
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700773 case BT_POWER:
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700774 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
775 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700776 err = -EINVAL;
777 break;
778 }
779
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700780 pwr.force_active = 1;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700781
782 len = min_t(unsigned int, sizeof(pwr), optlen);
783 if (copy_from_user((char *) &pwr, optval, len)) {
784 err = -EFAULT;
785 break;
786 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700787 l2cap_pi(sk)->force_active = pwr.force_active;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700788 break;
789
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700790 case BT_AMP_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700791 if (get_user(opt, (u32 __user *) optval)) {
792 err = -EFAULT;
793 break;
794 }
795
Mat Martineauf00ffac2011-10-19 15:07:32 -0700796 if ((opt > BT_AMP_POLICY_PREFER_AMP) ||
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700797 ((l2cap_pi(sk)->mode != L2CAP_MODE_ERTM) &&
798 (l2cap_pi(sk)->mode != L2CAP_MODE_STREAMING))) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700799 err = -EINVAL;
800 break;
801 }
802
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700803 l2cap_pi(sk)->amp_pref = (u8) opt;
804 BT_DBG("BT_AMP_POLICY now %d", opt);
805
806 if ((sk->sk_state == BT_CONNECTED) &&
Peter Krystadc446d212011-09-20 15:35:50 -0700807 (l2cap_pi(sk)->amp_move_role == L2CAP_AMP_MOVE_NONE))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700808 l2cap_amp_move_init(sk);
809
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700810 break;
811
Srinivas Krovvidi10734192011-12-29 07:29:11 +0530812 case BT_FLUSHABLE:
813 if (get_user(opt, (u32 __user *) optval)) {
814 err = -EFAULT;
815 break;
816 }
817 l2cap_pi(sk)->flushable = opt;
818
819 break;
820
Brian Gixa94b6122012-02-23 16:07:10 -0800821 case BT_LE_PARAMS:
822 if (l2cap_pi(sk)->scid != L2CAP_CID_LE_DATA) {
823 err = -EINVAL;
Mat Martineau2ea66482011-11-02 16:18:30 -0700824 break;
825 }
826
Brian Gixa94b6122012-02-23 16:07:10 -0800827 if (copy_from_user((char *) &le_params, optval,
828 sizeof(struct bt_le_params))) {
829 err = -EFAULT;
830 break;
831 }
832
833 conn = l2cap_pi(sk)->conn;
834 if (!conn || !conn->hcon ||
835 l2cap_pi(sk)->scid != L2CAP_CID_LE_DATA) {
836 memcpy(&bt_sk(sk)->le_params, &le_params,
837 sizeof(le_params));
838 break;
839 }
840
841 if (!conn->hcon->out ||
842 !l2cap_sock_le_params_valid(&le_params)) {
843 err = -EINVAL;
844 break;
845 }
846
847 memcpy(&bt_sk(sk)->le_params, &le_params, sizeof(le_params));
848
849 hci_le_conn_update(conn->hcon,
850 le_params.interval_min,
851 le_params.interval_max,
852 le_params.latency,
853 le_params.supervision_timeout);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200854 break;
855
856 default:
857 err = -ENOPROTOOPT;
858 break;
859 }
860
861 release_sock(sk);
862 return err;
863}
864
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200865static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
866{
867 struct sock *sk = sock->sk;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700868 struct l2cap_pinfo *pi = l2cap_pi(sk);
869 struct sk_buff *skb;
870 struct sk_buff_head seg_queue;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200871 int err;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700872 u8 amp_id;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200873
874 BT_DBG("sock %p, sk %p", sock, sk);
875
876 err = sock_error(sk);
877 if (err)
878 return err;
879
880 if (msg->msg_flags & MSG_OOB)
881 return -EOPNOTSUPP;
882
883 lock_sock(sk);
884
885 if (sk->sk_state != BT_CONNECTED) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700886 err = -ENOTCONN;
887 goto done;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200888 }
889
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700890 /* Connectionless channel */
891 if (sk->sk_type == SOCK_DGRAM) {
892 skb = l2cap_create_connless_pdu(sk, msg, len);
893 if (IS_ERR(skb)) {
894 err = PTR_ERR(skb);
895 } else {
896 l2cap_do_send(sk, skb);
897 err = len;
898 }
899 goto done;
900 }
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200901
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700902 switch (pi->mode) {
903 case L2CAP_MODE_BASIC:
904 /* Check outgoing MTU */
905 if (len > pi->omtu) {
906 err = -EMSGSIZE;
907 goto done;
908 }
909
910 /* Create a basic PDU */
911 skb = l2cap_create_basic_pdu(sk, msg, len);
912 if (IS_ERR(skb)) {
913 err = PTR_ERR(skb);
914 goto done;
915 }
916
917 l2cap_do_send(sk, skb);
918 err = len;
919 break;
920
921 case L2CAP_MODE_ERTM:
922 case L2CAP_MODE_STREAMING:
923
924 /* Check outgoing MTU */
925 if (len > pi->omtu) {
926 err = -EMSGSIZE;
927 goto done;
928 }
929
930 __skb_queue_head_init(&seg_queue);
931
932 /* Do segmentation before calling in to the state machine,
933 * since it's possible to block while waiting for memory
934 * allocation.
935 */
936 amp_id = pi->amp_id;
937 err = l2cap_segment_sdu(sk, &seg_queue, msg, len, 0);
938
939 /* The socket lock is released while segmenting, so check
940 * that the socket is still connected
941 */
942 if (sk->sk_state != BT_CONNECTED) {
943 __skb_queue_purge(&seg_queue);
944 err = -ENOTCONN;
945 }
946
947 if (err) {
948 BT_DBG("Error %d, sk_sndbuf %d, sk_wmem_alloc %d",
949 err, sk->sk_sndbuf,
950 atomic_read(&sk->sk_wmem_alloc));
951 break;
952 }
953
954 if (pi->amp_id != amp_id) {
955 /* Channel moved while unlocked. Resegment. */
956 err = l2cap_resegment_queue(sk, &seg_queue);
957
958 if (err)
959 break;
960 }
961
962 if (pi->mode != L2CAP_MODE_STREAMING)
963 err = l2cap_ertm_tx(sk, 0, &seg_queue,
964 L2CAP_ERTM_EVENT_DATA_REQUEST);
965 else
966 err = l2cap_strm_tx(sk, &seg_queue);
967 if (!err)
968 err = len;
969
970 /* If the skbs were not queued for sending, they'll still be in
971 * seg_queue and need to be purged.
972 */
973 __skb_queue_purge(&seg_queue);
974 break;
975
976 default:
977 BT_DBG("bad state %1.1x", pi->mode);
978 err = -EBADFD;
979 }
980
981done:
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200982 release_sock(sk);
983 return err;
984}
985
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200986static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
987{
988 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700989 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200990
991 lock_sock(sk);
992
993 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700994 struct l2cap_conn_rsp rsp;
995 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
996 u8 buf[128];
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300997
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700998 if (l2cap_pi(sk)->amp_id) {
999 /* Physical link must be brought up before connection
1000 * completes.
1001 */
1002 amp_accept_physical(conn, l2cap_pi(sk)->amp_id, sk);
1003 release_sock(sk);
1004 return 0;
1005 }
1006
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001007 sk->sk_state = BT_CONFIG;
1008
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001009 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1010 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1011 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1012 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1013 l2cap_send_cmd(l2cap_pi(sk)->conn, l2cap_pi(sk)->ident,
1014 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1015
1016 if (l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT) {
1017 release_sock(sk);
1018 return 0;
1019 }
1020
1021 l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT;
1022 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
1023 l2cap_build_conf_req(sk, buf), buf);
1024 l2cap_pi(sk)->num_conf_req++;
1025
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001026 release_sock(sk);
1027 return 0;
1028 }
1029
1030 release_sock(sk);
1031
1032 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -07001033 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
1034 else
1035 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001036
Mat Martineau28eb3fa2012-02-09 16:06:12 -08001037 if (err >= 0)
1038 l2cap_ertm_recv_done(sk);
Mat Martineaue3281402011-07-07 09:39:02 -07001039
Mat Martineaue3281402011-07-07 09:39:02 -07001040 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001041}
1042
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001043/* Kill socket (only if zapped and orphan)
1044 * Must be called on unlocked socket.
1045 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001046void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001047{
1048 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1049 return;
1050
1051 BT_DBG("sk %p state %d", sk, sk->sk_state);
1052
1053 /* Kill poor orphan */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001054 bt_sock_unlink(&l2cap_sk_list, sk);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001055 sock_set_flag(sk, SOCK_DEAD);
1056 sock_put(sk);
1057}
1058
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001059/* Must be called on unlocked socket. */
1060static void l2cap_sock_close(struct sock *sk)
1061{
1062 l2cap_sock_clear_timer(sk);
1063 lock_sock(sk);
1064 __l2cap_sock_close(sk, ECONNRESET);
1065 release_sock(sk);
1066 l2cap_sock_kill(sk);
1067}
1068
1069static void l2cap_sock_cleanup_listen(struct sock *parent)
1070{
1071 struct sock *sk;
1072
1073 BT_DBG("parent %p", parent);
1074
1075 /* Close not yet accepted channels */
1076 while ((sk = bt_accept_dequeue(parent, NULL)))
1077 l2cap_sock_close(sk);
1078
1079 parent->sk_state = BT_CLOSED;
1080 sock_set_flag(parent, SOCK_ZAPPED);
1081}
1082
1083void __l2cap_sock_close(struct sock *sk, int reason)
1084{
1085 struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1086
1087 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
1088
1089 switch (sk->sk_state) {
1090 case BT_LISTEN:
1091 l2cap_sock_cleanup_listen(sk);
1092 break;
1093
1094 case BT_CONNECTED:
1095 case BT_CONFIG:
1096 if ((sk->sk_type == SOCK_SEQPACKET ||
1097 sk->sk_type == SOCK_STREAM) &&
1098 conn->hcon->type == ACL_LINK) {
1099 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
1100 l2cap_send_disconn_req(conn, sk, reason);
1101 } else
1102 l2cap_chan_del(sk, reason);
1103 break;
1104
1105 case BT_CONNECT2:
1106 if ((sk->sk_type == SOCK_SEQPACKET ||
1107 sk->sk_type == SOCK_STREAM) &&
1108 conn->hcon->type == ACL_LINK) {
1109 struct l2cap_conn_rsp rsp;
1110 __u16 result;
1111
1112 if (bt_sk(sk)->defer_setup)
1113 result = L2CAP_CR_SEC_BLOCK;
1114 else
1115 result = L2CAP_CR_BAD_PSM;
1116 sk->sk_state = BT_DISCONN;
1117
1118 rsp.scid = cpu_to_le16(l2cap_pi(sk)->dcid);
1119 rsp.dcid = cpu_to_le16(l2cap_pi(sk)->scid);
1120 rsp.result = cpu_to_le16(result);
1121 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
1122 l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
1123 L2CAP_CONN_RSP, sizeof(rsp), &rsp);
1124 }
1125
1126 l2cap_chan_del(sk, reason);
1127 break;
1128
1129 case BT_CONNECT:
1130 case BT_DISCONN:
1131 l2cap_chan_del(sk, reason);
1132 break;
1133
1134 default:
1135 sock_set_flag(sk, SOCK_ZAPPED);
1136 break;
1137 }
1138}
1139
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001140static int l2cap_sock_shutdown(struct socket *sock, int how)
1141{
1142 struct sock *sk = sock->sk;
1143 int err = 0;
1144
1145 BT_DBG("sock %p, sk %p", sock, sk);
1146
1147 if (!sk)
1148 return 0;
1149
1150 lock_sock(sk);
1151 if (!sk->sk_shutdown) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001152
1153 if (l2cap_pi(sk)->mode == L2CAP_MODE_ERTM) {
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001154 err = __l2cap_wait_ack(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001155 l2cap_ertm_shutdown(sk);
1156 }
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001157
1158 sk->sk_shutdown = SHUTDOWN_MASK;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001159 l2cap_sock_clear_timer(sk);
1160 __l2cap_sock_close(sk, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001161
1162 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
1163 err = bt_sock_wait_state(sk, BT_CLOSED,
1164 sk->sk_lingertime);
1165 }
1166
1167 if (!err && sk->sk_err)
1168 err = -sk->sk_err;
1169
1170 release_sock(sk);
1171 return err;
1172}
1173
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001174static int l2cap_sock_release(struct socket *sock)
1175{
1176 struct sock *sk = sock->sk;
Brian Gix20de7cf2012-02-02 14:56:51 -08001177 struct sock *srv_sk = NULL;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001178 int err;
1179
1180 BT_DBG("sock %p, sk %p", sock, sk);
1181
1182 if (!sk)
1183 return 0;
1184
Brian Gix20de7cf2012-02-02 14:56:51 -08001185 /* If this is an ATT Client socket, find the matching Server */
1186 if (l2cap_pi(sk)->scid == L2CAP_CID_LE_DATA && !l2cap_pi(sk)->incoming)
1187 srv_sk = l2cap_find_sock_by_fixed_cid_and_dir(L2CAP_CID_LE_DATA,
1188 &bt_sk(sk)->src, &bt_sk(sk)->dst, 1);
1189
1190 /* If server socket found, request tear down */
1191 BT_DBG("client:%p server:%p", sk, srv_sk);
1192 if (srv_sk)
1193 l2cap_sock_set_timer(srv_sk, 1);
1194
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001195 err = l2cap_sock_shutdown(sock, 2);
1196
1197 sock_orphan(sk);
1198 l2cap_sock_kill(sk);
1199 return err;
1200}
1201
1202static void l2cap_sock_destruct(struct sock *sk)
1203{
1204 BT_DBG("sk %p", sk);
1205
1206 skb_queue_purge(&sk->sk_receive_queue);
1207 skb_queue_purge(&sk->sk_write_queue);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001208
1209 l2cap_ertm_destruct(sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001210}
1211
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001212static void set_default_config(struct l2cap_conf_prm *conf_prm)
1213{
1214 conf_prm->fcs = L2CAP_FCS_CRC16;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001215 conf_prm->flush_to = L2CAP_DEFAULT_FLUSH_TO;
1216}
1217
1218void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001219{
1220 struct l2cap_pinfo *pi = l2cap_pi(sk);
1221
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001222 BT_DBG("sk %p parent %p", sk, parent);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001223
1224 if (parent) {
1225 sk->sk_type = parent->sk_type;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001226 sk->sk_rcvbuf = parent->sk_rcvbuf;
1227 sk->sk_sndbuf = parent->sk_sndbuf;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001228 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
1229
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001230 pi->imtu = l2cap_pi(parent)->imtu;
1231 pi->omtu = l2cap_pi(parent)->omtu;
1232 pi->conf_state = l2cap_pi(parent)->conf_state;
1233 pi->mode = l2cap_pi(parent)->mode;
1234 pi->fcs = l2cap_pi(parent)->fcs;
1235 pi->max_tx = l2cap_pi(parent)->max_tx;
1236 pi->tx_win = l2cap_pi(parent)->tx_win;
1237 pi->sec_level = l2cap_pi(parent)->sec_level;
1238 pi->role_switch = l2cap_pi(parent)->role_switch;
1239 pi->force_reliable = l2cap_pi(parent)->force_reliable;
1240 pi->flushable = l2cap_pi(parent)->flushable;
1241 pi->force_active = l2cap_pi(parent)->force_active;
1242 pi->amp_pref = l2cap_pi(parent)->amp_pref;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001243 } else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001244 pi->imtu = L2CAP_DEFAULT_MTU;
1245 pi->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001246 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001247 pi->mode = L2CAP_MODE_ERTM;
1248 pi->conf_state |= L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001249 } else {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001250 pi->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001251 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001252 pi->reconf_state = L2CAP_RECONF_NONE;
1253 pi->max_tx = L2CAP_DEFAULT_MAX_TX;
1254 pi->fcs = L2CAP_FCS_CRC16;
1255 pi->tx_win = L2CAP_DEFAULT_TX_WINDOW;
1256 pi->sec_level = BT_SECURITY_LOW;
1257 pi->role_switch = 0;
1258 pi->force_reliable = 0;
1259 pi->flushable = 0;
1260 pi->force_active = 1;
1261 pi->amp_pref = BT_AMP_POLICY_REQUIRE_BR_EDR;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001262 }
1263
1264 /* Default config options */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001265 sk->sk_backlog_rcv = l2cap_data_channel;
1266 pi->ampcon = NULL;
1267 pi->ampchan = NULL;
1268 pi->conf_len = 0;
1269 pi->flush_to = L2CAP_DEFAULT_FLUSH_TO;
1270 pi->scid = 0;
1271 pi->dcid = 0;
1272 pi->tx_win_max = L2CAP_TX_WIN_MAX_ENHANCED;
Mat Martineauda318242012-06-22 11:36:18 -07001273 pi->ack_win = pi->tx_win;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001274 pi->extended_control = 0;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001275
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001276 pi->local_conf.fcs = pi->fcs;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001277 pi->local_conf.flush_to = pi->flush_to;
1278
1279 set_default_config(&pi->remote_conf);
1280
1281 skb_queue_head_init(TX_QUEUE(sk));
1282 skb_queue_head_init(SREJ_QUEUE(sk));
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001283}
1284
1285static struct proto l2cap_proto = {
1286 .name = "L2CAP",
1287 .owner = THIS_MODULE,
1288 .obj_size = sizeof(struct l2cap_pinfo)
1289};
1290
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001291struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001292{
1293 struct sock *sk;
1294
1295 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1296 if (!sk)
1297 return NULL;
1298
1299 sock_init_data(sock, sk);
1300 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1301
1302 sk->sk_destruct = l2cap_sock_destruct;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001303 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001304
1305 sock_reset_flag(sk, SOCK_ZAPPED);
1306
1307 sk->sk_protocol = proto;
1308 sk->sk_state = BT_OPEN;
1309
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001310 setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001311
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001312 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001313 return sk;
1314}
1315
1316static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1317 int kern)
1318{
1319 struct sock *sk;
1320
1321 BT_DBG("sock %p", sock);
1322
1323 sock->state = SS_UNCONNECTED;
1324
1325 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1326 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1327 return -ESOCKTNOSUPPORT;
1328
1329 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1330 return -EPERM;
1331
1332 sock->ops = &l2cap_sock_ops;
1333
1334 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1335 if (!sk)
1336 return -ENOMEM;
1337
1338 l2cap_sock_init(sk, NULL);
1339 return 0;
1340}
1341
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001342const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001343 .family = PF_BLUETOOTH,
1344 .owner = THIS_MODULE,
1345 .release = l2cap_sock_release,
1346 .bind = l2cap_sock_bind,
1347 .connect = l2cap_sock_connect,
1348 .listen = l2cap_sock_listen,
1349 .accept = l2cap_sock_accept,
1350 .getname = l2cap_sock_getname,
1351 .sendmsg = l2cap_sock_sendmsg,
1352 .recvmsg = l2cap_sock_recvmsg,
1353 .poll = bt_sock_poll,
1354 .ioctl = bt_sock_ioctl,
1355 .mmap = sock_no_mmap,
1356 .socketpair = sock_no_socketpair,
1357 .shutdown = l2cap_sock_shutdown,
1358 .setsockopt = l2cap_sock_setsockopt,
1359 .getsockopt = l2cap_sock_getsockopt
1360};
1361
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001362static const struct net_proto_family l2cap_sock_family_ops = {
1363 .family = PF_BLUETOOTH,
1364 .owner = THIS_MODULE,
1365 .create = l2cap_sock_create,
1366};
1367
1368int __init l2cap_init_sockets(void)
1369{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001370 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001371
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001372 err = proto_register(&l2cap_proto, 0);
1373 if (err < 0)
1374 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001375
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001376 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1377 if (err < 0)
1378 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001379
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001380 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001381
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001382 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001383
1384error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001385 BT_ERR("L2CAP socket registration failed");
1386 proto_unregister(&l2cap_proto);
1387 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001388}
1389
1390void l2cap_cleanup_sockets(void)
1391{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001392 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1393 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001394
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001395 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001396}