blob: 48ad8ba492a5f7a4dda45099626cb988869fb2cf [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>
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -030032#include <net/bluetooth/smp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020033
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030034static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030035static void l2cap_sock_init(struct sock *sk, struct sock *parent);
36static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030037
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020038static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
39{
40 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030041 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020042 struct sockaddr_l2 la;
43 int len, err = 0;
44
45 BT_DBG("sk %p", sk);
46
47 if (!addr || addr->sa_family != AF_BLUETOOTH)
48 return -EINVAL;
49
50 memset(&la, 0, sizeof(la));
51 len = min_t(unsigned int, sizeof(la), alen);
52 memcpy(&la, addr, len);
53
Ville Tervob62f3282011-02-10 22:38:50 -030054 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020055 return -EINVAL;
56
57 lock_sock(sk);
58
59 if (sk->sk_state != BT_OPEN) {
60 err = -EBADFD;
61 goto done;
62 }
63
64 if (la.l2_psm) {
65 __u16 psm = __le16_to_cpu(la.l2_psm);
66
67 /* PSM must be odd and lsb of upper byte must be 0 */
68 if ((psm & 0x0101) != 0x0001) {
69 err = -EINVAL;
70 goto done;
71 }
72
73 /* Restrict usage of well-known PSMs */
74 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
75 err = -EACCES;
76 goto done;
77 }
78 }
79
Ville Tervob62f3282011-02-10 22:38:50 -030080 if (la.l2_cid)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030081 err = l2cap_add_scid(chan, la.l2_cid);
82 else
83 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030084
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030085 if (err < 0)
86 goto done;
87
88 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
89 __le16_to_cpu(la.l2_psm) == 0x0003)
90 chan->sec_level = BT_SECURITY_SDP;
91
92 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -030093
94 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030095 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020096
97done:
98 release_sock(sk);
99 return err;
100}
101
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200102static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
103{
104 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300105 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200106 struct sockaddr_l2 la;
107 int len, err = 0;
108
109 BT_DBG("sk %p", sk);
110
111 if (!addr || alen < sizeof(addr->sa_family) ||
112 addr->sa_family != AF_BLUETOOTH)
113 return -EINVAL;
114
115 memset(&la, 0, sizeof(la));
116 len = min_t(unsigned int, sizeof(la), alen);
117 memcpy(&la, addr, len);
118
Ville Tervoacd7d372011-02-10 22:38:49 -0300119 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200120 return -EINVAL;
121
122 lock_sock(sk);
123
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300124 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED
Ville Tervoacd7d372011-02-10 22:38:49 -0300125 && !(la.l2_psm || la.l2_cid)) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200126 err = -EINVAL;
127 goto done;
128 }
129
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300130 switch (chan->mode) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200131 case L2CAP_MODE_BASIC:
132 break;
133 case L2CAP_MODE_ERTM:
134 case L2CAP_MODE_STREAMING:
135 if (!disable_ertm)
136 break;
137 /* fall through */
138 default:
139 err = -ENOTSUPP;
140 goto done;
141 }
142
143 switch (sk->sk_state) {
144 case BT_CONNECT:
145 case BT_CONNECT2:
146 case BT_CONFIG:
147 /* Already connecting */
148 goto wait;
149
150 case BT_CONNECTED:
151 /* Already connected */
152 err = -EISCONN;
153 goto done;
154
155 case BT_OPEN:
156 case BT_BOUND:
157 /* Can connect */
158 break;
159
160 default:
161 err = -EBADFD;
162 goto done;
163 }
164
165 /* PSM must be odd and lsb of upper byte must be 0 */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300166 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid &&
167 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200168 err = -EINVAL;
169 goto done;
170 }
171
172 /* Set destination address and psm */
173 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300174 chan->psm = la.l2_psm;
175 chan->dcid = la.l2_cid;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200176
Gustavo F. Padovan77a74c72011-04-12 18:17:14 -0300177 err = l2cap_chan_connect(l2cap_pi(sk)->chan);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200178 if (err)
179 goto done;
180
181wait:
182 err = bt_sock_wait_state(sk, BT_CONNECTED,
183 sock_sndtimeo(sk, flags & O_NONBLOCK));
184done:
185 release_sock(sk);
186 return err;
187}
188
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200189static int l2cap_sock_listen(struct socket *sock, int backlog)
190{
191 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300192 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200193 int err = 0;
194
195 BT_DBG("sk %p backlog %d", sk, backlog);
196
197 lock_sock(sk);
198
199 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
200 || sk->sk_state != BT_BOUND) {
201 err = -EBADFD;
202 goto done;
203 }
204
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300205 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200206 case L2CAP_MODE_BASIC:
207 break;
208 case L2CAP_MODE_ERTM:
209 case L2CAP_MODE_STREAMING:
210 if (!disable_ertm)
211 break;
212 /* fall through */
213 default:
214 err = -ENOTSUPP;
215 goto done;
216 }
217
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200218 sk->sk_max_ack_backlog = backlog;
219 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300220
221 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200222 sk->sk_state = BT_LISTEN;
223
224done:
225 release_sock(sk);
226 return err;
227}
228
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200229static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
230{
231 DECLARE_WAITQUEUE(wait, current);
232 struct sock *sk = sock->sk, *nsk;
233 long timeo;
234 int err = 0;
235
236 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
237
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200238 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
239
240 BT_DBG("sk %p timeo %ld", sk, timeo);
241
242 /* Wait for an incoming connection. (wake-one). */
243 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400244 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200245 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200246
247 if (sk->sk_state != BT_LISTEN) {
248 err = -EBADFD;
249 break;
250 }
251
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400252 nsk = bt_accept_dequeue(sk, newsock);
253 if (nsk)
254 break;
255
256 if (!timeo) {
257 err = -EAGAIN;
258 break;
259 }
260
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200261 if (signal_pending(current)) {
262 err = sock_intr_errno(timeo);
263 break;
264 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400265
266 release_sock(sk);
267 timeo = schedule_timeout(timeo);
268 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200269 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400270 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200271 remove_wait_queue(sk_sleep(sk), &wait);
272
273 if (err)
274 goto done;
275
276 newsock->state = SS_CONNECTED;
277
278 BT_DBG("new socket %p", nsk);
279
280done:
281 release_sock(sk);
282 return err;
283}
284
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200285static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
286{
287 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
288 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300289 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200290
291 BT_DBG("sock %p, sk %p", sock, sk);
292
293 addr->sa_family = AF_BLUETOOTH;
294 *len = sizeof(struct sockaddr_l2);
295
296 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300297 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200298 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300299 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200300 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300301 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200302 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300303 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200304 }
305
306 return 0;
307}
308
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200309static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
310{
311 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300312 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200313 struct l2cap_options opts;
314 struct l2cap_conninfo cinfo;
315 int len, err = 0;
316 u32 opt;
317
318 BT_DBG("sk %p", sk);
319
320 if (get_user(len, optlen))
321 return -EFAULT;
322
323 lock_sock(sk);
324
325 switch (optname) {
326 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300327 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300328 opts.imtu = chan->imtu;
329 opts.omtu = chan->omtu;
330 opts.flush_to = chan->flush_to;
331 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300332 opts.fcs = chan->fcs;
333 opts.max_tx = chan->max_tx;
334 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200335
336 len = min_t(unsigned int, len, sizeof(opts));
337 if (copy_to_user(optval, (char *) &opts, len))
338 err = -EFAULT;
339
340 break;
341
342 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300343 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200344 case BT_SECURITY_LOW:
345 opt = L2CAP_LM_AUTH;
346 break;
347 case BT_SECURITY_MEDIUM:
348 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
349 break;
350 case BT_SECURITY_HIGH:
351 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
352 L2CAP_LM_SECURE;
353 break;
354 default:
355 opt = 0;
356 break;
357 }
358
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300359 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200360 opt |= L2CAP_LM_MASTER;
361
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300362 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200363 opt |= L2CAP_LM_RELIABLE;
364
365 if (put_user(opt, (u32 __user *) optval))
366 err = -EFAULT;
367 break;
368
369 case L2CAP_CONNINFO:
370 if (sk->sk_state != BT_CONNECTED &&
371 !(sk->sk_state == BT_CONNECT2 &&
372 bt_sk(sk)->defer_setup)) {
373 err = -ENOTCONN;
374 break;
375 }
376
Filip Palian8d03e972011-05-12 19:32:46 +0200377 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300378 cinfo.hci_handle = chan->conn->hcon->handle;
379 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200380
381 len = min_t(unsigned int, len, sizeof(cinfo));
382 if (copy_to_user(optval, (char *) &cinfo, len))
383 err = -EFAULT;
384
385 break;
386
387 default:
388 err = -ENOPROTOOPT;
389 break;
390 }
391
392 release_sock(sk);
393 return err;
394}
395
396static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
397{
398 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300399 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200400 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700401 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200402 int len, err = 0;
403
404 BT_DBG("sk %p", sk);
405
406 if (level == SOL_L2CAP)
407 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
408
409 if (level != SOL_BLUETOOTH)
410 return -ENOPROTOOPT;
411
412 if (get_user(len, optlen))
413 return -EFAULT;
414
415 lock_sock(sk);
416
417 switch (optname) {
418 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300419 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
420 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200421 err = -EINVAL;
422 break;
423 }
424
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300425 memset(&sec, 0, sizeof(sec));
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300426 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200427
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300428 if (sk->sk_state == BT_CONNECTED)
429 sec.key_size = chan->conn->hcon->enc_key_size;
430
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200431 len = min_t(unsigned int, len, sizeof(sec));
432 if (copy_to_user(optval, (char *) &sec, len))
433 err = -EFAULT;
434
435 break;
436
437 case BT_DEFER_SETUP:
438 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
439 err = -EINVAL;
440 break;
441 }
442
443 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
444 err = -EFAULT;
445
446 break;
447
448 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300449 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
450 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200451 err = -EFAULT;
452
453 break;
454
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700455 case BT_POWER:
456 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
457 && sk->sk_type != SOCK_RAW) {
458 err = -EINVAL;
459 break;
460 }
461
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300462 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700463
464 len = min_t(unsigned int, len, sizeof(pwr));
465 if (copy_to_user(optval, (char *) &pwr, len))
466 err = -EFAULT;
467
468 break;
469
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200470 default:
471 err = -ENOPROTOOPT;
472 break;
473 }
474
475 release_sock(sk);
476 return err;
477}
478
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200479static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
480{
481 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300482 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200483 struct l2cap_options opts;
484 int len, err = 0;
485 u32 opt;
486
487 BT_DBG("sk %p", sk);
488
489 lock_sock(sk);
490
491 switch (optname) {
492 case L2CAP_OPTIONS:
493 if (sk->sk_state == BT_CONNECTED) {
494 err = -EINVAL;
495 break;
496 }
497
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300498 opts.imtu = chan->imtu;
499 opts.omtu = chan->omtu;
500 opts.flush_to = chan->flush_to;
501 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300502 opts.fcs = chan->fcs;
503 opts.max_tx = chan->max_tx;
504 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200505
506 len = min_t(unsigned int, sizeof(opts), optlen);
507 if (copy_from_user((char *) &opts, optval, len)) {
508 err = -EFAULT;
509 break;
510 }
511
512 if (opts.txwin_size > L2CAP_DEFAULT_TX_WINDOW) {
513 err = -EINVAL;
514 break;
515 }
516
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300517 chan->mode = opts.mode;
518 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200519 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300520 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200521 break;
522 case L2CAP_MODE_ERTM:
523 case L2CAP_MODE_STREAMING:
524 if (!disable_ertm)
525 break;
526 /* fall through */
527 default:
528 err = -EINVAL;
529 break;
530 }
531
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300532 chan->imtu = opts.imtu;
533 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300534 chan->fcs = opts.fcs;
535 chan->max_tx = opts.max_tx;
536 chan->tx_win = (__u8)opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200537 break;
538
539 case L2CAP_LM:
540 if (get_user(opt, (u32 __user *) optval)) {
541 err = -EFAULT;
542 break;
543 }
544
545 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300546 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200547 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300548 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200549 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300550 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200551
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300552 if (opt & L2CAP_LM_MASTER)
553 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
554 else
555 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300556
557 if (opt & L2CAP_LM_RELIABLE)
558 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
559 else
560 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200561 break;
562
563 default:
564 err = -ENOPROTOOPT;
565 break;
566 }
567
568 release_sock(sk);
569 return err;
570}
571
572static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
573{
574 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300575 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200576 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700577 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300578 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200579 int len, err = 0;
580 u32 opt;
581
582 BT_DBG("sk %p", sk);
583
584 if (level == SOL_L2CAP)
585 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
586
587 if (level != SOL_BLUETOOTH)
588 return -ENOPROTOOPT;
589
590 lock_sock(sk);
591
592 switch (optname) {
593 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300594 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
595 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200596 err = -EINVAL;
597 break;
598 }
599
600 sec.level = BT_SECURITY_LOW;
601
602 len = min_t(unsigned int, sizeof(sec), optlen);
603 if (copy_from_user((char *) &sec, optval, len)) {
604 err = -EFAULT;
605 break;
606 }
607
608 if (sec.level < BT_SECURITY_LOW ||
609 sec.level > BT_SECURITY_HIGH) {
610 err = -EINVAL;
611 break;
612 }
613
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300614 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300615
616 conn = chan->conn;
617 if (conn && chan->scid == L2CAP_CID_LE_DATA) {
618 if (!conn->hcon->out) {
619 err = -EINVAL;
620 break;
621 }
622
623 if (smp_conn_security(conn, sec.level))
624 break;
625
626 err = 0;
627 sk->sk_state = BT_CONFIG;
628 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200629 break;
630
631 case BT_DEFER_SETUP:
632 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
633 err = -EINVAL;
634 break;
635 }
636
637 if (get_user(opt, (u32 __user *) optval)) {
638 err = -EFAULT;
639 break;
640 }
641
642 bt_sk(sk)->defer_setup = opt;
643 break;
644
645 case BT_FLUSHABLE:
646 if (get_user(opt, (u32 __user *) optval)) {
647 err = -EFAULT;
648 break;
649 }
650
651 if (opt > BT_FLUSHABLE_ON) {
652 err = -EINVAL;
653 break;
654 }
655
656 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300657 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300658 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200659 No Flush support in the LM */
660 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
661 err = -EINVAL;
662 break;
663 }
664 }
665
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300666 if (opt)
667 set_bit(FLAG_FLUSHABLE, &chan->flags);
668 else
669 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200670 break;
671
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700672 case BT_POWER:
673 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
674 chan->chan_type != L2CAP_CHAN_RAW) {
675 err = -EINVAL;
676 break;
677 }
678
679 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
680
681 len = min_t(unsigned int, sizeof(pwr), optlen);
682 if (copy_from_user((char *) &pwr, optval, len)) {
683 err = -EFAULT;
684 break;
685 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300686
687 if (pwr.force_active)
688 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
689 else
690 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700691 break;
692
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200693 default:
694 err = -ENOPROTOOPT;
695 break;
696 }
697
698 release_sock(sk);
699 return err;
700}
701
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200702static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
703{
704 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300705 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200706 int err;
707
708 BT_DBG("sock %p, sk %p", sock, sk);
709
710 err = sock_error(sk);
711 if (err)
712 return err;
713
714 if (msg->msg_flags & MSG_OOB)
715 return -EOPNOTSUPP;
716
717 lock_sock(sk);
718
719 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300720 release_sock(sk);
721 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200722 }
723
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300724 err = l2cap_chan_send(chan, msg, len);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200725
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200726 release_sock(sk);
727 return err;
728}
729
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200730static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
731{
732 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700733 struct l2cap_pinfo *pi = l2cap_pi(sk);
734 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200735
736 lock_sock(sk);
737
738 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300739 sk->sk_state = BT_CONFIG;
740
Mat Martineaue3281402011-07-07 09:39:02 -0700741 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200742 release_sock(sk);
743 return 0;
744 }
745
746 release_sock(sk);
747
748 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700749 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
750 else
751 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200752
Mat Martineaue3281402011-07-07 09:39:02 -0700753 if (pi->chan->mode != L2CAP_MODE_ERTM)
754 return err;
755
756 /* Attempt to put pending rx data in the socket buffer */
757
758 lock_sock(sk);
759
760 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
761 goto done;
762
763 if (pi->rx_busy_skb) {
764 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
765 pi->rx_busy_skb = NULL;
766 else
767 goto done;
768 }
769
770 /* Restore data flow when half of the receive buffer is
771 * available. This avoids resending large numbers of
772 * frames.
773 */
774 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
775 l2cap_chan_busy(pi->chan, 0);
776
777done:
778 release_sock(sk);
779 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200780}
781
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200782/* Kill socket (only if zapped and orphan)
783 * Must be called on unlocked socket.
784 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300785static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200786{
787 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
788 return;
789
790 BT_DBG("sk %p state %d", sk, sk->sk_state);
791
792 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300793
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300794 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200795 sock_set_flag(sk, SOCK_DEAD);
796 sock_put(sk);
797}
798
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200799static int l2cap_sock_shutdown(struct socket *sock, int how)
800{
801 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300802 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200803 int err = 0;
804
805 BT_DBG("sock %p, sk %p", sock, sk);
806
807 if (!sk)
808 return 0;
809
810 lock_sock(sk);
811 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300812 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200813 err = __l2cap_wait_ack(sk);
814
815 sk->sk_shutdown = SHUTDOWN_MASK;
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300816 l2cap_chan_close(chan, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200817
818 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
819 err = bt_sock_wait_state(sk, BT_CLOSED,
820 sk->sk_lingertime);
821 }
822
823 if (!err && sk->sk_err)
824 err = -sk->sk_err;
825
826 release_sock(sk);
827 return err;
828}
829
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200830static int l2cap_sock_release(struct socket *sock)
831{
832 struct sock *sk = sock->sk;
833 int err;
834
835 BT_DBG("sock %p, sk %p", sock, sk);
836
837 if (!sk)
838 return 0;
839
840 err = l2cap_sock_shutdown(sock, 2);
841
842 sock_orphan(sk);
843 l2cap_sock_kill(sk);
844 return err;
845}
846
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300847static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
848{
849 struct sock *sk, *parent = data;
850
851 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
852 GFP_ATOMIC);
853 if (!sk)
854 return NULL;
855
856 l2cap_sock_init(sk, parent);
857
858 return l2cap_pi(sk)->chan;
859}
860
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300861static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
862{
Mat Martineaue3281402011-07-07 09:39:02 -0700863 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300864 struct sock *sk = data;
Mat Martineaue3281402011-07-07 09:39:02 -0700865 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300866
Mat Martineaue3281402011-07-07 09:39:02 -0700867 if (pi->rx_busy_skb)
868 return -ENOMEM;
869
870 err = sock_queue_rcv_skb(sk, skb);
871
872 /* For ERTM, handle one skb that doesn't fit into the recv
873 * buffer. This is important to do because the data frames
874 * have already been acked, so the skb cannot be discarded.
875 *
876 * Notify the l2cap core that the buffer is full, so the
877 * LOCAL_BUSY state is entered and no more frames are
878 * acked and reassembled until there is buffer space
879 * available.
880 */
881 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
882 pi->rx_busy_skb = skb;
883 l2cap_chan_busy(pi->chan, 1);
884 err = 0;
885 }
886
887 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300888}
889
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300890static void l2cap_sock_close_cb(void *data)
891{
892 struct sock *sk = data;
893
894 l2cap_sock_kill(sk);
895}
896
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300897static void l2cap_sock_state_change_cb(void *data, int state)
898{
899 struct sock *sk = data;
900
901 sk->sk_state = state;
902}
903
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300904static struct l2cap_ops l2cap_chan_ops = {
905 .name = "L2CAP Socket Interface",
906 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300907 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300908 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300909 .state_change = l2cap_sock_state_change_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300910};
911
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200912static void l2cap_sock_destruct(struct sock *sk)
913{
914 BT_DBG("sk %p", sk);
915
Mat Martineaue3281402011-07-07 09:39:02 -0700916 if (l2cap_pi(sk)->rx_busy_skb) {
917 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
918 l2cap_pi(sk)->rx_busy_skb = NULL;
919 }
920
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200921 skb_queue_purge(&sk->sk_receive_queue);
922 skb_queue_purge(&sk->sk_write_queue);
923}
924
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300925static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200926{
927 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300928 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200929
930 BT_DBG("sk %p", sk);
931
932 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300933 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
934
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200935 sk->sk_type = parent->sk_type;
936 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
937
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300938 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300939 chan->imtu = pchan->imtu;
940 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300941 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300942 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300943 chan->fcs = pchan->fcs;
944 chan->max_tx = pchan->max_tx;
945 chan->tx_win = pchan->tx_win;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300946 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300947 chan->flags = pchan->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200948 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300949
950 switch (sk->sk_type) {
951 case SOCK_RAW:
952 chan->chan_type = L2CAP_CHAN_RAW;
953 break;
954 case SOCK_DGRAM:
955 chan->chan_type = L2CAP_CHAN_CONN_LESS;
956 break;
957 case SOCK_SEQPACKET:
958 case SOCK_STREAM:
959 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
960 break;
961 }
962
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300963 chan->imtu = L2CAP_DEFAULT_MTU;
964 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200965 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300966 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300967 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200968 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300969 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200970 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300971 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
972 chan->fcs = L2CAP_FCS_CRC16;
973 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300974 chan->sec_level = BT_SECURITY_LOW;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300975 chan->flags = 0;
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300976 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200977 }
978
979 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300980 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300981
982 chan->data = sk;
983 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200984}
985
986static struct proto l2cap_proto = {
987 .name = "L2CAP",
988 .owner = THIS_MODULE,
989 .obj_size = sizeof(struct l2cap_pinfo)
990};
991
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300992static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200993{
994 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -0300995 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200996
997 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
998 if (!sk)
999 return NULL;
1000
1001 sock_init_data(sock, sk);
1002 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1003
1004 sk->sk_destruct = l2cap_sock_destruct;
Chen Ganir6be6b112011-07-28 15:42:09 +03001005 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001006
1007 sock_reset_flag(sk, SOCK_ZAPPED);
1008
1009 sk->sk_protocol = proto;
1010 sk->sk_state = BT_OPEN;
1011
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001012 chan = l2cap_chan_create(sk);
1013 if (!chan) {
1014 l2cap_sock_kill(sk);
1015 return NULL;
1016 }
1017
1018 l2cap_pi(sk)->chan = chan;
1019
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001020 return sk;
1021}
1022
1023static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1024 int kern)
1025{
1026 struct sock *sk;
1027
1028 BT_DBG("sock %p", sock);
1029
1030 sock->state = SS_UNCONNECTED;
1031
1032 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1033 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1034 return -ESOCKTNOSUPPORT;
1035
1036 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1037 return -EPERM;
1038
1039 sock->ops = &l2cap_sock_ops;
1040
1041 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1042 if (!sk)
1043 return -ENOMEM;
1044
1045 l2cap_sock_init(sk, NULL);
1046 return 0;
1047}
1048
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001049static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001050 .family = PF_BLUETOOTH,
1051 .owner = THIS_MODULE,
1052 .release = l2cap_sock_release,
1053 .bind = l2cap_sock_bind,
1054 .connect = l2cap_sock_connect,
1055 .listen = l2cap_sock_listen,
1056 .accept = l2cap_sock_accept,
1057 .getname = l2cap_sock_getname,
1058 .sendmsg = l2cap_sock_sendmsg,
1059 .recvmsg = l2cap_sock_recvmsg,
1060 .poll = bt_sock_poll,
1061 .ioctl = bt_sock_ioctl,
1062 .mmap = sock_no_mmap,
1063 .socketpair = sock_no_socketpair,
1064 .shutdown = l2cap_sock_shutdown,
1065 .setsockopt = l2cap_sock_setsockopt,
1066 .getsockopt = l2cap_sock_getsockopt
1067};
1068
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001069static const struct net_proto_family l2cap_sock_family_ops = {
1070 .family = PF_BLUETOOTH,
1071 .owner = THIS_MODULE,
1072 .create = l2cap_sock_create,
1073};
1074
1075int __init l2cap_init_sockets(void)
1076{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001077 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001078
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001079 err = proto_register(&l2cap_proto, 0);
1080 if (err < 0)
1081 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001082
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001083 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1084 if (err < 0)
1085 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001086
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001087 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001088
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001089 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001090
1091error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001092 BT_ERR("L2CAP socket registration failed");
1093 proto_unregister(&l2cap_proto);
1094 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001095}
1096
1097void l2cap_cleanup_sockets(void)
1098{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001099 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1100 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001101
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001102 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001103}