blob: 13d1076bcf83982c97e3f89cea98b8c1c33c68ae [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. Padovanaf6bcd82011-02-04 02:40:28 -020035static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
36{
37 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030038 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020039 struct sockaddr_l2 la;
40 int len, err = 0;
41
42 BT_DBG("sk %p", sk);
43
44 if (!addr || addr->sa_family != AF_BLUETOOTH)
45 return -EINVAL;
46
47 memset(&la, 0, sizeof(la));
48 len = min_t(unsigned int, sizeof(la), alen);
49 memcpy(&la, addr, len);
50
Ville Tervob62f3282011-02-10 22:38:50 -030051 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020052 return -EINVAL;
53
54 lock_sock(sk);
55
56 if (sk->sk_state != BT_OPEN) {
57 err = -EBADFD;
58 goto done;
59 }
60
61 if (la.l2_psm) {
62 __u16 psm = __le16_to_cpu(la.l2_psm);
63
64 /* PSM must be odd and lsb of upper byte must be 0 */
65 if ((psm & 0x0101) != 0x0001) {
66 err = -EINVAL;
67 goto done;
68 }
69
70 /* Restrict usage of well-known PSMs */
71 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
72 err = -EACCES;
73 goto done;
74 }
75 }
76
Ville Tervob62f3282011-02-10 22:38:50 -030077 if (la.l2_cid)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030078 err = l2cap_add_scid(chan, la.l2_cid);
79 else
80 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030081
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030082 if (err < 0)
83 goto done;
84
85 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
86 __le16_to_cpu(la.l2_psm) == 0x0003)
87 chan->sec_level = BT_SECURITY_SDP;
88
89 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
90 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020091
92done:
93 release_sock(sk);
94 return err;
95}
96
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -020097static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
98{
99 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300100 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200101 struct sockaddr_l2 la;
102 int len, err = 0;
103
104 BT_DBG("sk %p", sk);
105
106 if (!addr || alen < sizeof(addr->sa_family) ||
107 addr->sa_family != AF_BLUETOOTH)
108 return -EINVAL;
109
110 memset(&la, 0, sizeof(la));
111 len = min_t(unsigned int, sizeof(la), alen);
112 memcpy(&la, addr, len);
113
Ville Tervoacd7d372011-02-10 22:38:49 -0300114 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200115 return -EINVAL;
116
117 lock_sock(sk);
118
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300119 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED
Ville Tervoacd7d372011-02-10 22:38:49 -0300120 && !(la.l2_psm || la.l2_cid)) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200121 err = -EINVAL;
122 goto done;
123 }
124
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300125 switch (chan->mode) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200126 case L2CAP_MODE_BASIC:
127 break;
128 case L2CAP_MODE_ERTM:
129 case L2CAP_MODE_STREAMING:
130 if (!disable_ertm)
131 break;
132 /* fall through */
133 default:
134 err = -ENOTSUPP;
135 goto done;
136 }
137
138 switch (sk->sk_state) {
139 case BT_CONNECT:
140 case BT_CONNECT2:
141 case BT_CONFIG:
142 /* Already connecting */
143 goto wait;
144
145 case BT_CONNECTED:
146 /* Already connected */
147 err = -EISCONN;
148 goto done;
149
150 case BT_OPEN:
151 case BT_BOUND:
152 /* Can connect */
153 break;
154
155 default:
156 err = -EBADFD;
157 goto done;
158 }
159
160 /* PSM must be odd and lsb of upper byte must be 0 */
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300161 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid &&
162 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200163 err = -EINVAL;
164 goto done;
165 }
166
167 /* Set destination address and psm */
168 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300169 chan->psm = la.l2_psm;
170 chan->dcid = la.l2_cid;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200171
Gustavo F. Padovan77a74c72011-04-12 18:17:14 -0300172 err = l2cap_chan_connect(l2cap_pi(sk)->chan);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200173 if (err)
174 goto done;
175
176wait:
177 err = bt_sock_wait_state(sk, BT_CONNECTED,
178 sock_sndtimeo(sk, flags & O_NONBLOCK));
179done:
180 release_sock(sk);
181 return err;
182}
183
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200184static int l2cap_sock_listen(struct socket *sock, int backlog)
185{
186 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300187 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200188 int err = 0;
189
190 BT_DBG("sk %p backlog %d", sk, backlog);
191
192 lock_sock(sk);
193
194 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
195 || sk->sk_state != BT_BOUND) {
196 err = -EBADFD;
197 goto done;
198 }
199
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300200 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200201 case L2CAP_MODE_BASIC:
202 break;
203 case L2CAP_MODE_ERTM:
204 case L2CAP_MODE_STREAMING:
205 if (!disable_ertm)
206 break;
207 /* fall through */
208 default:
209 err = -ENOTSUPP;
210 goto done;
211 }
212
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200213 sk->sk_max_ack_backlog = backlog;
214 sk->sk_ack_backlog = 0;
215 sk->sk_state = BT_LISTEN;
216
217done:
218 release_sock(sk);
219 return err;
220}
221
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200222static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
223{
224 DECLARE_WAITQUEUE(wait, current);
225 struct sock *sk = sock->sk, *nsk;
226 long timeo;
227 int err = 0;
228
229 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
230
231 if (sk->sk_state != BT_LISTEN) {
232 err = -EBADFD;
233 goto done;
234 }
235
236 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
237
238 BT_DBG("sk %p timeo %ld", sk, timeo);
239
240 /* Wait for an incoming connection. (wake-one). */
241 add_wait_queue_exclusive(sk_sleep(sk), &wait);
242 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
243 set_current_state(TASK_INTERRUPTIBLE);
244 if (!timeo) {
245 err = -EAGAIN;
246 break;
247 }
248
249 release_sock(sk);
250 timeo = schedule_timeout(timeo);
251 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
252
253 if (sk->sk_state != BT_LISTEN) {
254 err = -EBADFD;
255 break;
256 }
257
258 if (signal_pending(current)) {
259 err = sock_intr_errno(timeo);
260 break;
261 }
262 }
263 set_current_state(TASK_RUNNING);
264 remove_wait_queue(sk_sleep(sk), &wait);
265
266 if (err)
267 goto done;
268
269 newsock->state = SS_CONNECTED;
270
271 BT_DBG("new socket %p", nsk);
272
273done:
274 release_sock(sk);
275 return err;
276}
277
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200278static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
279{
280 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
281 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300282 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200283
284 BT_DBG("sock %p, sk %p", sock, sk);
285
286 addr->sa_family = AF_BLUETOOTH;
287 *len = sizeof(struct sockaddr_l2);
288
289 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300290 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200291 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300292 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200293 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300294 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200295 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300296 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200297 }
298
299 return 0;
300}
301
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200302static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
303{
304 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300305 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200306 struct l2cap_options opts;
307 struct l2cap_conninfo cinfo;
308 int len, err = 0;
309 u32 opt;
310
311 BT_DBG("sk %p", sk);
312
313 if (get_user(len, optlen))
314 return -EFAULT;
315
316 lock_sock(sk);
317
318 switch (optname) {
319 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300320 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300321 opts.imtu = chan->imtu;
322 opts.omtu = chan->omtu;
323 opts.flush_to = chan->flush_to;
324 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300325 opts.fcs = chan->fcs;
326 opts.max_tx = chan->max_tx;
327 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200328
329 len = min_t(unsigned int, len, sizeof(opts));
330 if (copy_to_user(optval, (char *) &opts, len))
331 err = -EFAULT;
332
333 break;
334
335 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300336 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200337 case BT_SECURITY_LOW:
338 opt = L2CAP_LM_AUTH;
339 break;
340 case BT_SECURITY_MEDIUM:
341 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
342 break;
343 case BT_SECURITY_HIGH:
344 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
345 L2CAP_LM_SECURE;
346 break;
347 default:
348 opt = 0;
349 break;
350 }
351
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300352 if (chan->role_switch)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200353 opt |= L2CAP_LM_MASTER;
354
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300355 if (chan->force_reliable)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200356 opt |= L2CAP_LM_RELIABLE;
357
358 if (put_user(opt, (u32 __user *) optval))
359 err = -EFAULT;
360 break;
361
362 case L2CAP_CONNINFO:
363 if (sk->sk_state != BT_CONNECTED &&
364 !(sk->sk_state == BT_CONNECT2 &&
365 bt_sk(sk)->defer_setup)) {
366 err = -ENOTCONN;
367 break;
368 }
369
Filip Palian8d03e972011-05-12 19:32:46 +0200370 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300371 cinfo.hci_handle = chan->conn->hcon->handle;
372 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200373
374 len = min_t(unsigned int, len, sizeof(cinfo));
375 if (copy_to_user(optval, (char *) &cinfo, len))
376 err = -EFAULT;
377
378 break;
379
380 default:
381 err = -ENOPROTOOPT;
382 break;
383 }
384
385 release_sock(sk);
386 return err;
387}
388
389static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
390{
391 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300392 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200393 struct bt_security sec;
394 int len, err = 0;
395
396 BT_DBG("sk %p", sk);
397
398 if (level == SOL_L2CAP)
399 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
400
401 if (level != SOL_BLUETOOTH)
402 return -ENOPROTOOPT;
403
404 if (get_user(len, optlen))
405 return -EFAULT;
406
407 lock_sock(sk);
408
409 switch (optname) {
410 case BT_SECURITY:
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300411 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
412 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200413 err = -EINVAL;
414 break;
415 }
416
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300417 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200418
419 len = min_t(unsigned int, len, sizeof(sec));
420 if (copy_to_user(optval, (char *) &sec, len))
421 err = -EFAULT;
422
423 break;
424
425 case BT_DEFER_SETUP:
426 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
427 err = -EINVAL;
428 break;
429 }
430
431 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
432 err = -EFAULT;
433
434 break;
435
436 case BT_FLUSHABLE:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300437 if (put_user(chan->flushable, (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200438 err = -EFAULT;
439
440 break;
441
442 default:
443 err = -ENOPROTOOPT;
444 break;
445 }
446
447 release_sock(sk);
448 return err;
449}
450
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200451static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
452{
453 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300454 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200455 struct l2cap_options opts;
456 int len, err = 0;
457 u32 opt;
458
459 BT_DBG("sk %p", sk);
460
461 lock_sock(sk);
462
463 switch (optname) {
464 case L2CAP_OPTIONS:
465 if (sk->sk_state == BT_CONNECTED) {
466 err = -EINVAL;
467 break;
468 }
469
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300470 opts.imtu = chan->imtu;
471 opts.omtu = chan->omtu;
472 opts.flush_to = chan->flush_to;
473 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300474 opts.fcs = chan->fcs;
475 opts.max_tx = chan->max_tx;
476 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200477
478 len = min_t(unsigned int, sizeof(opts), optlen);
479 if (copy_from_user((char *) &opts, optval, len)) {
480 err = -EFAULT;
481 break;
482 }
483
484 if (opts.txwin_size > L2CAP_DEFAULT_TX_WINDOW) {
485 err = -EINVAL;
486 break;
487 }
488
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300489 chan->mode = opts.mode;
490 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200491 case L2CAP_MODE_BASIC:
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300492 chan->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200493 break;
494 case L2CAP_MODE_ERTM:
495 case L2CAP_MODE_STREAMING:
496 if (!disable_ertm)
497 break;
498 /* fall through */
499 default:
500 err = -EINVAL;
501 break;
502 }
503
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300504 chan->imtu = opts.imtu;
505 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300506 chan->fcs = opts.fcs;
507 chan->max_tx = opts.max_tx;
508 chan->tx_win = (__u8)opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200509 break;
510
511 case L2CAP_LM:
512 if (get_user(opt, (u32 __user *) optval)) {
513 err = -EFAULT;
514 break;
515 }
516
517 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300518 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200519 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300520 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200521 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300522 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200523
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300524 chan->role_switch = (opt & L2CAP_LM_MASTER);
525 chan->force_reliable = (opt & L2CAP_LM_RELIABLE);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200526 break;
527
528 default:
529 err = -ENOPROTOOPT;
530 break;
531 }
532
533 release_sock(sk);
534 return err;
535}
536
537static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
538{
539 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300540 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200541 struct bt_security sec;
542 int len, err = 0;
543 u32 opt;
544
545 BT_DBG("sk %p", sk);
546
547 if (level == SOL_L2CAP)
548 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
549
550 if (level != SOL_BLUETOOTH)
551 return -ENOPROTOOPT;
552
553 lock_sock(sk);
554
555 switch (optname) {
556 case BT_SECURITY:
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300557 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
558 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200559 err = -EINVAL;
560 break;
561 }
562
563 sec.level = BT_SECURITY_LOW;
564
565 len = min_t(unsigned int, sizeof(sec), optlen);
566 if (copy_from_user((char *) &sec, optval, len)) {
567 err = -EFAULT;
568 break;
569 }
570
571 if (sec.level < BT_SECURITY_LOW ||
572 sec.level > BT_SECURITY_HIGH) {
573 err = -EINVAL;
574 break;
575 }
576
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300577 chan->sec_level = sec.level;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200578 break;
579
580 case BT_DEFER_SETUP:
581 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
582 err = -EINVAL;
583 break;
584 }
585
586 if (get_user(opt, (u32 __user *) optval)) {
587 err = -EFAULT;
588 break;
589 }
590
591 bt_sk(sk)->defer_setup = opt;
592 break;
593
594 case BT_FLUSHABLE:
595 if (get_user(opt, (u32 __user *) optval)) {
596 err = -EFAULT;
597 break;
598 }
599
600 if (opt > BT_FLUSHABLE_ON) {
601 err = -EINVAL;
602 break;
603 }
604
605 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300606 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300607 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200608 No Flush support in the LM */
609 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
610 err = -EINVAL;
611 break;
612 }
613 }
614
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300615 chan->flushable = opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200616 break;
617
618 default:
619 err = -ENOPROTOOPT;
620 break;
621 }
622
623 release_sock(sk);
624 return err;
625}
626
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200627static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
628{
629 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300630 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200631 int err;
632
633 BT_DBG("sock %p, sk %p", sock, sk);
634
635 err = sock_error(sk);
636 if (err)
637 return err;
638
639 if (msg->msg_flags & MSG_OOB)
640 return -EOPNOTSUPP;
641
642 lock_sock(sk);
643
644 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovandcb1cc32011-04-28 18:50:17 -0300645 release_sock(sk);
646 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200647 }
648
Gustavo F. Padovandcb1cc32011-04-28 18:50:17 -0300649 err = l2cap_chan_send(chan, msg, len);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200650
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200651 release_sock(sk);
652 return err;
653}
654
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200655static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
656{
657 struct sock *sk = sock->sk;
658
659 lock_sock(sk);
660
661 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300662 sk->sk_state = BT_CONFIG;
663
664 __l2cap_connect_rsp_defer(l2cap_pi(sk)->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200665 release_sock(sk);
666 return 0;
667 }
668
669 release_sock(sk);
670
671 if (sock->type == SOCK_STREAM)
672 return bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
673
674 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
675}
676
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200677/* Kill socket (only if zapped and orphan)
678 * Must be called on unlocked socket.
679 */
680void l2cap_sock_kill(struct sock *sk)
681{
682 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
683 return;
684
685 BT_DBG("sk %p state %d", sk, sk->sk_state);
686
687 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300688
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300689 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200690 sock_set_flag(sk, SOCK_DEAD);
691 sock_put(sk);
692}
693
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200694static int l2cap_sock_shutdown(struct socket *sock, int how)
695{
696 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300697 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200698 int err = 0;
699
700 BT_DBG("sock %p, sk %p", sock, sk);
701
702 if (!sk)
703 return 0;
704
705 lock_sock(sk);
706 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300707 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200708 err = __l2cap_wait_ack(sk);
709
710 sk->sk_shutdown = SHUTDOWN_MASK;
Gustavo F. Padovan762a9902011-05-04 19:42:50 -0300711 l2cap_chan_close(chan, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200712
713 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
714 err = bt_sock_wait_state(sk, BT_CLOSED,
715 sk->sk_lingertime);
716 }
717
718 if (!err && sk->sk_err)
719 err = -sk->sk_err;
720
721 release_sock(sk);
722 return err;
723}
724
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200725static int l2cap_sock_release(struct socket *sock)
726{
727 struct sock *sk = sock->sk;
728 int err;
729
730 BT_DBG("sock %p, sk %p", sock, sk);
731
732 if (!sk)
733 return 0;
734
735 err = l2cap_sock_shutdown(sock, 2);
736
737 sock_orphan(sk);
738 l2cap_sock_kill(sk);
739 return err;
740}
741
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200742static void l2cap_sock_destruct(struct sock *sk)
743{
744 BT_DBG("sk %p", sk);
745
746 skb_queue_purge(&sk->sk_receive_queue);
747 skb_queue_purge(&sk->sk_write_queue);
748}
749
750void l2cap_sock_init(struct sock *sk, struct sock *parent)
751{
752 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300753 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200754
755 BT_DBG("sk %p", sk);
756
757 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300758 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
759
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200760 sk->sk_type = parent->sk_type;
761 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
762
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300763 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300764 chan->imtu = pchan->imtu;
765 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300766 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300767 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300768 chan->fcs = pchan->fcs;
769 chan->max_tx = pchan->max_tx;
770 chan->tx_win = pchan->tx_win;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300771 chan->sec_level = pchan->sec_level;
772 chan->role_switch = pchan->role_switch;
773 chan->force_reliable = pchan->force_reliable;
774 chan->flushable = pchan->flushable;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200775 } else {
Gustavo F. Padovan8974c542011-05-02 17:13:55 -0300776
777 switch (sk->sk_type) {
778 case SOCK_RAW:
779 chan->chan_type = L2CAP_CHAN_RAW;
780 break;
781 case SOCK_DGRAM:
782 chan->chan_type = L2CAP_CHAN_CONN_LESS;
783 break;
784 case SOCK_SEQPACKET:
785 case SOCK_STREAM:
786 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
787 break;
788 }
789
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300790 chan->imtu = L2CAP_DEFAULT_MTU;
791 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200792 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300793 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300794 chan->conf_state |= L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200795 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300796 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200797 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300798 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
799 chan->fcs = L2CAP_FCS_CRC16;
800 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300801 chan->sec_level = BT_SECURITY_LOW;
802 chan->role_switch = 0;
803 chan->force_reliable = 0;
804 chan->flushable = BT_FLUSHABLE_OFF;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200805 }
806
807 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300808 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200809}
810
811static struct proto l2cap_proto = {
812 .name = "L2CAP",
813 .owner = THIS_MODULE,
814 .obj_size = sizeof(struct l2cap_pinfo)
815};
816
817struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
818{
819 struct sock *sk;
820
821 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
822 if (!sk)
823 return NULL;
824
825 sock_init_data(sock, sk);
826 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
827
828 sk->sk_destruct = l2cap_sock_destruct;
829 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
830
831 sock_reset_flag(sk, SOCK_ZAPPED);
832
833 sk->sk_protocol = proto;
834 sk->sk_state = BT_OPEN;
835
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200836 return sk;
837}
838
839static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
840 int kern)
841{
842 struct sock *sk;
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -0300843 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200844
845 BT_DBG("sock %p", sock);
846
847 sock->state = SS_UNCONNECTED;
848
849 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
850 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
851 return -ESOCKTNOSUPPORT;
852
853 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
854 return -EPERM;
855
856 sock->ops = &l2cap_sock_ops;
857
858 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
859 if (!sk)
860 return -ENOMEM;
861
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300862 chan = l2cap_chan_create(sk);
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -0300863 if (!chan) {
864 l2cap_sock_kill(sk);
865 return -ENOMEM;
866 }
867
868 l2cap_pi(sk)->chan = chan;
869
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200870 l2cap_sock_init(sk, NULL);
871 return 0;
872}
873
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -0300874static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -0200875 .family = PF_BLUETOOTH,
876 .owner = THIS_MODULE,
877 .release = l2cap_sock_release,
878 .bind = l2cap_sock_bind,
879 .connect = l2cap_sock_connect,
880 .listen = l2cap_sock_listen,
881 .accept = l2cap_sock_accept,
882 .getname = l2cap_sock_getname,
883 .sendmsg = l2cap_sock_sendmsg,
884 .recvmsg = l2cap_sock_recvmsg,
885 .poll = bt_sock_poll,
886 .ioctl = bt_sock_ioctl,
887 .mmap = sock_no_mmap,
888 .socketpair = sock_no_socketpair,
889 .shutdown = l2cap_sock_shutdown,
890 .setsockopt = l2cap_sock_setsockopt,
891 .getsockopt = l2cap_sock_getsockopt
892};
893
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200894static const struct net_proto_family l2cap_sock_family_ops = {
895 .family = PF_BLUETOOTH,
896 .owner = THIS_MODULE,
897 .create = l2cap_sock_create,
898};
899
900int __init l2cap_init_sockets(void)
901{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300902 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200903
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300904 err = proto_register(&l2cap_proto, 0);
905 if (err < 0)
906 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200907
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300908 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
909 if (err < 0)
910 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200911
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300912 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200913
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300914 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200915
916error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300917 BT_ERR("L2CAP socket registration failed");
918 proto_unregister(&l2cap_proto);
919 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200920}
921
922void l2cap_cleanup_sockets(void)
923{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300924 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
925 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200926
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -0300927 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200928}