blob: 2d428f8af921d92dec9be5996482af6be5be6cf6 [file] [log] [blame]
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4 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>
32
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030033static const struct proto_ops l2cap_sock_ops;
34
Gustavo F. Padovan6ddc0482011-02-04 03:23:31 -020035/* ---- L2CAP timers ---- */
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020036static 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 &&
Gustavo F. Padovan43434782011-04-12 18:31:57 -030056 l2cap_pi(sk)->chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020057 reason = ECONNREFUSED;
58 else
59 reason = ETIMEDOUT;
60
Gustavo F. Padovan6e9e43f2011-04-28 17:55:53 -030061 __l2cap_chan_close(l2cap_pi(sk)->chan, reason);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020062
63 bh_unlock_sock(sk);
64
65 l2cap_sock_kill(sk);
66 sock_put(sk);
67}
68
Gustavo F. Padovan6ddc0482011-02-04 03:23:31 -020069void 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
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020081static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
82{
83 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030084 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020085 struct sockaddr_l2 la;
86 int len, err = 0;
87
88 BT_DBG("sk %p", sk);
89
90 if (!addr || addr->sa_family != AF_BLUETOOTH)
91 return -EINVAL;
92
93 memset(&la, 0, sizeof(la));
94 len = min_t(unsigned int, sizeof(la), alen);
95 memcpy(&la, addr, len);
96
Ville Tervob62f3282011-02-10 22:38:50 -030097 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020098 return -EINVAL;
99
100 lock_sock(sk);
101
102 if (sk->sk_state != BT_OPEN) {
103 err = -EBADFD;
104 goto done;
105 }
106
107 if (la.l2_psm) {
108 __u16 psm = __le16_to_cpu(la.l2_psm);
109
110 /* PSM must be odd and lsb of upper byte must be 0 */
111 if ((psm & 0x0101) != 0x0001) {
112 err = -EINVAL;
113 goto done;
114 }
115
116 /* Restrict usage of well-known PSMs */
117 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
118 err = -EACCES;
119 goto done;
120 }
121 }
122
Ville Tervob62f3282011-02-10 22:38:50 -0300123 if (la.l2_cid)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300124 err = l2cap_add_scid(chan, la.l2_cid);
125 else
126 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300127
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300128 if (err < 0)
129 goto done;
130
131 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
132 __le16_to_cpu(la.l2_psm) == 0x0003)
133 chan->sec_level = BT_SECURITY_SDP;
134
135 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
136 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200137
138done:
139 release_sock(sk);
140 return err;
141}
142
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200143static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
144{
145 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300146 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200147 struct sockaddr_l2 la;
148 int len, err = 0;
149
150 BT_DBG("sk %p", sk);
151
152 if (!addr || alen < sizeof(addr->sa_family) ||
153 addr->sa_family != AF_BLUETOOTH)
154 return -EINVAL;
155
156 memset(&la, 0, sizeof(la));
157 len = min_t(unsigned int, sizeof(la), alen);
158 memcpy(&la, addr, len);
159
Ville Tervoacd7d372011-02-10 22:38:49 -0300160 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200161 return -EINVAL;
162
163 lock_sock(sk);
164
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300165 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED
Ville Tervoacd7d372011-02-10 22:38:49 -0300166 && !(la.l2_psm || la.l2_cid)) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200167 err = -EINVAL;
168 goto done;
169 }
170
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300171 switch (chan->mode) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200172 case L2CAP_MODE_BASIC:
173 break;
174 case L2CAP_MODE_ERTM:
175 case L2CAP_MODE_STREAMING:
176 if (!disable_ertm)
177 break;
178 /* fall through */
179 default:
180 err = -ENOTSUPP;
181 goto done;
182 }
183
184 switch (sk->sk_state) {
185 case BT_CONNECT:
186 case BT_CONNECT2:
187 case BT_CONFIG:
188 /* Already connecting */
189 goto wait;
190
191 case BT_CONNECTED:
192 /* Already connected */
193 err = -EISCONN;
194 goto done;
195
196 case BT_OPEN:
197 case BT_BOUND:
198 /* Can connect */
199 break;
200
201 default:
202 err = -EBADFD;
203 goto done;
204 }
205
206 /* PSM must be odd and lsb of upper byte must be 0 */
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300207 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid &&
208 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200209 err = -EINVAL;
210 goto done;
211 }
212
213 /* Set destination address and psm */
214 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300215 chan->psm = la.l2_psm;
216 chan->dcid = la.l2_cid;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200217
Gustavo F. Padovan77a74c72011-04-12 18:17:14 -0300218 err = l2cap_chan_connect(l2cap_pi(sk)->chan);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200219 if (err)
220 goto done;
221
222wait:
223 err = bt_sock_wait_state(sk, BT_CONNECTED,
224 sock_sndtimeo(sk, flags & O_NONBLOCK));
225done:
226 release_sock(sk);
227 return err;
228}
229
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200230static int l2cap_sock_listen(struct socket *sock, int backlog)
231{
232 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300233 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200234 int err = 0;
235
236 BT_DBG("sk %p backlog %d", sk, backlog);
237
238 lock_sock(sk);
239
240 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
241 || sk->sk_state != BT_BOUND) {
242 err = -EBADFD;
243 goto done;
244 }
245
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300246 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200247 case L2CAP_MODE_BASIC:
248 break;
249 case L2CAP_MODE_ERTM:
250 case L2CAP_MODE_STREAMING:
251 if (!disable_ertm)
252 break;
253 /* fall through */
254 default:
255 err = -ENOTSUPP;
256 goto done;
257 }
258
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200259 sk->sk_max_ack_backlog = backlog;
260 sk->sk_ack_backlog = 0;
261 sk->sk_state = BT_LISTEN;
262
263done:
264 release_sock(sk);
265 return err;
266}
267
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200268static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
269{
270 DECLARE_WAITQUEUE(wait, current);
271 struct sock *sk = sock->sk, *nsk;
272 long timeo;
273 int err = 0;
274
275 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
276
277 if (sk->sk_state != BT_LISTEN) {
278 err = -EBADFD;
279 goto done;
280 }
281
282 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
283
284 BT_DBG("sk %p timeo %ld", sk, timeo);
285
286 /* Wait for an incoming connection. (wake-one). */
287 add_wait_queue_exclusive(sk_sleep(sk), &wait);
288 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
289 set_current_state(TASK_INTERRUPTIBLE);
290 if (!timeo) {
291 err = -EAGAIN;
292 break;
293 }
294
295 release_sock(sk);
296 timeo = schedule_timeout(timeo);
297 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
298
299 if (sk->sk_state != BT_LISTEN) {
300 err = -EBADFD;
301 break;
302 }
303
304 if (signal_pending(current)) {
305 err = sock_intr_errno(timeo);
306 break;
307 }
308 }
309 set_current_state(TASK_RUNNING);
310 remove_wait_queue(sk_sleep(sk), &wait);
311
312 if (err)
313 goto done;
314
315 newsock->state = SS_CONNECTED;
316
317 BT_DBG("new socket %p", nsk);
318
319done:
320 release_sock(sk);
321 return err;
322}
323
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200324static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
325{
326 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
327 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300328 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200329
330 BT_DBG("sock %p, sk %p", sock, sk);
331
332 addr->sa_family = AF_BLUETOOTH;
333 *len = sizeof(struct sockaddr_l2);
334
335 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300336 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200337 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300338 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200339 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300340 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200341 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300342 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200343 }
344
345 return 0;
346}
347
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200348static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
349{
350 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300351 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200352 struct l2cap_options opts;
353 struct l2cap_conninfo cinfo;
354 int len, err = 0;
355 u32 opt;
356
357 BT_DBG("sk %p", sk);
358
359 if (get_user(len, optlen))
360 return -EFAULT;
361
362 lock_sock(sk);
363
364 switch (optname) {
365 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300366 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300367 opts.imtu = chan->imtu;
368 opts.omtu = chan->omtu;
369 opts.flush_to = chan->flush_to;
370 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300371 opts.fcs = chan->fcs;
372 opts.max_tx = chan->max_tx;
373 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200374
375 len = min_t(unsigned int, len, sizeof(opts));
376 if (copy_to_user(optval, (char *) &opts, len))
377 err = -EFAULT;
378
379 break;
380
381 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300382 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200383 case BT_SECURITY_LOW:
384 opt = L2CAP_LM_AUTH;
385 break;
386 case BT_SECURITY_MEDIUM:
387 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
388 break;
389 case BT_SECURITY_HIGH:
390 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
391 L2CAP_LM_SECURE;
392 break;
393 default:
394 opt = 0;
395 break;
396 }
397
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300398 if (chan->role_switch)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200399 opt |= L2CAP_LM_MASTER;
400
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300401 if (chan->force_reliable)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200402 opt |= L2CAP_LM_RELIABLE;
403
404 if (put_user(opt, (u32 __user *) optval))
405 err = -EFAULT;
406 break;
407
408 case L2CAP_CONNINFO:
409 if (sk->sk_state != BT_CONNECTED &&
410 !(sk->sk_state == BT_CONNECT2 &&
411 bt_sk(sk)->defer_setup)) {
412 err = -ENOTCONN;
413 break;
414 }
415
Filip Palian8d03e972011-05-12 19:32:46 +0200416 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300417 cinfo.hci_handle = chan->conn->hcon->handle;
418 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200419
420 len = min_t(unsigned int, len, sizeof(cinfo));
421 if (copy_to_user(optval, (char *) &cinfo, len))
422 err = -EFAULT;
423
424 break;
425
426 default:
427 err = -ENOPROTOOPT;
428 break;
429 }
430
431 release_sock(sk);
432 return err;
433}
434
435static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
436{
437 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300438 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200439 struct bt_security sec;
440 int len, err = 0;
441
442 BT_DBG("sk %p", sk);
443
444 if (level == SOL_L2CAP)
445 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
446
447 if (level != SOL_BLUETOOTH)
448 return -ENOPROTOOPT;
449
450 if (get_user(len, optlen))
451 return -EFAULT;
452
453 lock_sock(sk);
454
455 switch (optname) {
456 case BT_SECURITY:
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300457 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
458 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200459 err = -EINVAL;
460 break;
461 }
462
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300463 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200464
465 len = min_t(unsigned int, len, sizeof(sec));
466 if (copy_to_user(optval, (char *) &sec, len))
467 err = -EFAULT;
468
469 break;
470
471 case BT_DEFER_SETUP:
472 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
473 err = -EINVAL;
474 break;
475 }
476
477 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
478 err = -EFAULT;
479
480 break;
481
482 case BT_FLUSHABLE:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300483 if (put_user(chan->flushable, (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200484 err = -EFAULT;
485
486 break;
487
488 default:
489 err = -ENOPROTOOPT;
490 break;
491 }
492
493 release_sock(sk);
494 return err;
495}
496
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200497static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
498{
499 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300500 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200501 struct l2cap_options opts;
502 int len, err = 0;
503 u32 opt;
504
505 BT_DBG("sk %p", sk);
506
507 lock_sock(sk);
508
509 switch (optname) {
510 case L2CAP_OPTIONS:
511 if (sk->sk_state == BT_CONNECTED) {
512 err = -EINVAL;
513 break;
514 }
515
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300516 opts.imtu = chan->imtu;
517 opts.omtu = chan->omtu;
518 opts.flush_to = chan->flush_to;
519 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300520 opts.fcs = chan->fcs;
521 opts.max_tx = chan->max_tx;
522 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200523
524 len = min_t(unsigned int, sizeof(opts), optlen);
525 if (copy_from_user((char *) &opts, optval, len)) {
526 err = -EFAULT;
527 break;
528 }
529
530 if (opts.txwin_size > L2CAP_DEFAULT_TX_WINDOW) {
531 err = -EINVAL;
532 break;
533 }
534
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300535 chan->mode = opts.mode;
536 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200537 case L2CAP_MODE_BASIC:
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300538 chan->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200539 break;
540 case L2CAP_MODE_ERTM:
541 case L2CAP_MODE_STREAMING:
542 if (!disable_ertm)
543 break;
544 /* fall through */
545 default:
546 err = -EINVAL;
547 break;
548 }
549
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300550 chan->imtu = opts.imtu;
551 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300552 chan->fcs = opts.fcs;
553 chan->max_tx = opts.max_tx;
554 chan->tx_win = (__u8)opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200555 break;
556
557 case L2CAP_LM:
558 if (get_user(opt, (u32 __user *) optval)) {
559 err = -EFAULT;
560 break;
561 }
562
563 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300564 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200565 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300566 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200567 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300568 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200569
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300570 chan->role_switch = (opt & L2CAP_LM_MASTER);
571 chan->force_reliable = (opt & L2CAP_LM_RELIABLE);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200572 break;
573
574 default:
575 err = -ENOPROTOOPT;
576 break;
577 }
578
579 release_sock(sk);
580 return err;
581}
582
583static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
584{
585 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300586 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200587 struct bt_security sec;
588 int len, err = 0;
589 u32 opt;
590
591 BT_DBG("sk %p", sk);
592
593 if (level == SOL_L2CAP)
594 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
595
596 if (level != SOL_BLUETOOTH)
597 return -ENOPROTOOPT;
598
599 lock_sock(sk);
600
601 switch (optname) {
602 case BT_SECURITY:
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300603 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
604 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200605 err = -EINVAL;
606 break;
607 }
608
609 sec.level = BT_SECURITY_LOW;
610
611 len = min_t(unsigned int, sizeof(sec), optlen);
612 if (copy_from_user((char *) &sec, optval, len)) {
613 err = -EFAULT;
614 break;
615 }
616
617 if (sec.level < BT_SECURITY_LOW ||
618 sec.level > BT_SECURITY_HIGH) {
619 err = -EINVAL;
620 break;
621 }
622
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300623 chan->sec_level = sec.level;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200624 break;
625
626 case BT_DEFER_SETUP:
627 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
628 err = -EINVAL;
629 break;
630 }
631
632 if (get_user(opt, (u32 __user *) optval)) {
633 err = -EFAULT;
634 break;
635 }
636
637 bt_sk(sk)->defer_setup = opt;
638 break;
639
640 case BT_FLUSHABLE:
641 if (get_user(opt, (u32 __user *) optval)) {
642 err = -EFAULT;
643 break;
644 }
645
646 if (opt > BT_FLUSHABLE_ON) {
647 err = -EINVAL;
648 break;
649 }
650
651 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300652 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300653 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200654 No Flush support in the LM */
655 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
656 err = -EINVAL;
657 break;
658 }
659 }
660
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300661 chan->flushable = opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200662 break;
663
664 default:
665 err = -ENOPROTOOPT;
666 break;
667 }
668
669 release_sock(sk);
670 return err;
671}
672
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200673static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
674{
675 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300676 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200677 int err;
678
679 BT_DBG("sock %p, sk %p", sock, sk);
680
681 err = sock_error(sk);
682 if (err)
683 return err;
684
685 if (msg->msg_flags & MSG_OOB)
686 return -EOPNOTSUPP;
687
688 lock_sock(sk);
689
690 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovandcb1cc32011-04-28 18:50:17 -0300691 release_sock(sk);
692 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200693 }
694
Gustavo F. Padovandcb1cc32011-04-28 18:50:17 -0300695 err = l2cap_chan_send(chan, msg, len);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200696
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200697 release_sock(sk);
698 return err;
699}
700
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200701static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
702{
703 struct sock *sk = sock->sk;
704
705 lock_sock(sk);
706
707 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300708 sk->sk_state = BT_CONFIG;
709
710 __l2cap_connect_rsp_defer(l2cap_pi(sk)->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200711 release_sock(sk);
712 return 0;
713 }
714
715 release_sock(sk);
716
717 if (sock->type == SOCK_STREAM)
718 return bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
719
720 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
721}
722
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200723/* Kill socket (only if zapped and orphan)
724 * Must be called on unlocked socket.
725 */
726void l2cap_sock_kill(struct sock *sk)
727{
728 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
729 return;
730
731 BT_DBG("sk %p state %d", sk, sk->sk_state);
732
733 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300734
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300735 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200736 sock_set_flag(sk, SOCK_DEAD);
737 sock_put(sk);
738}
739
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200740static int l2cap_sock_shutdown(struct socket *sock, int how)
741{
742 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300743 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200744 int err = 0;
745
746 BT_DBG("sock %p, sk %p", sock, sk);
747
748 if (!sk)
749 return 0;
750
751 lock_sock(sk);
752 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300753 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200754 err = __l2cap_wait_ack(sk);
755
756 sk->sk_shutdown = SHUTDOWN_MASK;
757 l2cap_sock_clear_timer(sk);
Gustavo F. Padovan6e9e43f2011-04-28 17:55:53 -0300758 __l2cap_chan_close(chan, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200759
760 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
761 err = bt_sock_wait_state(sk, BT_CLOSED,
762 sk->sk_lingertime);
763 }
764
765 if (!err && sk->sk_err)
766 err = -sk->sk_err;
767
768 release_sock(sk);
769 return err;
770}
771
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200772static int l2cap_sock_release(struct socket *sock)
773{
774 struct sock *sk = sock->sk;
775 int err;
776
777 BT_DBG("sock %p, sk %p", sock, sk);
778
779 if (!sk)
780 return 0;
781
782 err = l2cap_sock_shutdown(sock, 2);
783
784 sock_orphan(sk);
785 l2cap_sock_kill(sk);
786 return err;
787}
788
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200789static void l2cap_sock_destruct(struct sock *sk)
790{
791 BT_DBG("sk %p", sk);
792
793 skb_queue_purge(&sk->sk_receive_queue);
794 skb_queue_purge(&sk->sk_write_queue);
795}
796
797void l2cap_sock_init(struct sock *sk, struct sock *parent)
798{
799 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300800 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200801
802 BT_DBG("sk %p", sk);
803
804 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300805 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
806
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200807 sk->sk_type = parent->sk_type;
808 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
809
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300810 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300811 chan->imtu = pchan->imtu;
812 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300813 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300814 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300815 chan->fcs = pchan->fcs;
816 chan->max_tx = pchan->max_tx;
817 chan->tx_win = pchan->tx_win;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300818 chan->sec_level = pchan->sec_level;
819 chan->role_switch = pchan->role_switch;
820 chan->force_reliable = pchan->force_reliable;
821 chan->flushable = pchan->flushable;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200822 } else {
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300823
824 switch (sk->sk_type) {
825 case SOCK_RAW:
826 chan->chan_type = L2CAP_CHAN_RAW;
827 break;
828 case SOCK_DGRAM:
829 chan->chan_type = L2CAP_CHAN_CONN_LESS;
830 break;
831 case SOCK_SEQPACKET:
832 case SOCK_STREAM:
833 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
834 break;
835 }
836
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300837 chan->imtu = L2CAP_DEFAULT_MTU;
838 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200839 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300840 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300841 chan->conf_state |= L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200842 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300843 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200844 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300845 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
846 chan->fcs = L2CAP_FCS_CRC16;
847 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300848 chan->sec_level = BT_SECURITY_LOW;
849 chan->role_switch = 0;
850 chan->force_reliable = 0;
851 chan->flushable = BT_FLUSHABLE_OFF;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200852 }
853
854 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300855 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200856}
857
858static struct proto l2cap_proto = {
859 .name = "L2CAP",
860 .owner = THIS_MODULE,
861 .obj_size = sizeof(struct l2cap_pinfo)
862};
863
864struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
865{
866 struct sock *sk;
867
868 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
869 if (!sk)
870 return NULL;
871
872 sock_init_data(sock, sk);
873 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
874
875 sk->sk_destruct = l2cap_sock_destruct;
876 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
877
878 sock_reset_flag(sk, SOCK_ZAPPED);
879
880 sk->sk_protocol = proto;
881 sk->sk_state = BT_OPEN;
882
883 setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk);
884
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200885 return sk;
886}
887
888static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
889 int kern)
890{
891 struct sock *sk;
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -0300892 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200893
894 BT_DBG("sock %p", sock);
895
896 sock->state = SS_UNCONNECTED;
897
898 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
899 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
900 return -ESOCKTNOSUPPORT;
901
902 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
903 return -EPERM;
904
905 sock->ops = &l2cap_sock_ops;
906
907 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
908 if (!sk)
909 return -ENOMEM;
910
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300911 chan = l2cap_chan_create(sk);
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -0300912 if (!chan) {
913 l2cap_sock_kill(sk);
914 return -ENOMEM;
915 }
916
917 l2cap_pi(sk)->chan = chan;
918
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200919 l2cap_sock_init(sk, NULL);
920 return 0;
921}
922
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -0300923static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -0200924 .family = PF_BLUETOOTH,
925 .owner = THIS_MODULE,
926 .release = l2cap_sock_release,
927 .bind = l2cap_sock_bind,
928 .connect = l2cap_sock_connect,
929 .listen = l2cap_sock_listen,
930 .accept = l2cap_sock_accept,
931 .getname = l2cap_sock_getname,
932 .sendmsg = l2cap_sock_sendmsg,
933 .recvmsg = l2cap_sock_recvmsg,
934 .poll = bt_sock_poll,
935 .ioctl = bt_sock_ioctl,
936 .mmap = sock_no_mmap,
937 .socketpair = sock_no_socketpair,
938 .shutdown = l2cap_sock_shutdown,
939 .setsockopt = l2cap_sock_setsockopt,
940 .getsockopt = l2cap_sock_getsockopt
941};
942
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200943static const struct net_proto_family l2cap_sock_family_ops = {
944 .family = PF_BLUETOOTH,
945 .owner = THIS_MODULE,
946 .create = l2cap_sock_create,
947};
948
949int __init l2cap_init_sockets(void)
950{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300951 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200952
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300953 err = proto_register(&l2cap_proto, 0);
954 if (err < 0)
955 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200956
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300957 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
958 if (err < 0)
959 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200960
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300961 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200962
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300963 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200964
965error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300966 BT_ERR("L2CAP socket registration failed");
967 proto_unregister(&l2cap_proto);
968 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200969}
970
971void l2cap_cleanup_sockets(void)
972{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300973 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
974 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200975
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300976 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200977}