blob: 2156dcecec0b00d56badb4f598a35bd7340a48aa [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
61 __l2cap_sock_close(sk, reason);
62
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
165 if ((sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM)
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 */
207 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 &&
Ville Tervoacd7d372011-02-10 22:38:49 -0300208 sk->sk_type != SOCK_RAW && !la.l2_cid) {
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. Padovanfe4128e2011-04-13 19:50:45 -0300259 if (!chan->psm && !chan->scid) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200260 bdaddr_t *src = &bt_sk(sk)->src;
261 u16 psm;
262
263 err = -EINVAL;
264
265 write_lock_bh(&l2cap_sk_list.lock);
266
267 for (psm = 0x1001; psm < 0x1100; psm += 2)
268 if (!__l2cap_get_sock_by_addr(cpu_to_le16(psm), src)) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300269 chan->psm = cpu_to_le16(psm);
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300270 chan->sport = cpu_to_le16(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200271 err = 0;
272 break;
273 }
274
275 write_unlock_bh(&l2cap_sk_list.lock);
276
277 if (err < 0)
278 goto done;
279 }
280
281 sk->sk_max_ack_backlog = backlog;
282 sk->sk_ack_backlog = 0;
283 sk->sk_state = BT_LISTEN;
284
285done:
286 release_sock(sk);
287 return err;
288}
289
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200290static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
291{
292 DECLARE_WAITQUEUE(wait, current);
293 struct sock *sk = sock->sk, *nsk;
294 long timeo;
295 int err = 0;
296
297 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
298
299 if (sk->sk_state != BT_LISTEN) {
300 err = -EBADFD;
301 goto done;
302 }
303
304 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
305
306 BT_DBG("sk %p timeo %ld", sk, timeo);
307
308 /* Wait for an incoming connection. (wake-one). */
309 add_wait_queue_exclusive(sk_sleep(sk), &wait);
310 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
311 set_current_state(TASK_INTERRUPTIBLE);
312 if (!timeo) {
313 err = -EAGAIN;
314 break;
315 }
316
317 release_sock(sk);
318 timeo = schedule_timeout(timeo);
319 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
320
321 if (sk->sk_state != BT_LISTEN) {
322 err = -EBADFD;
323 break;
324 }
325
326 if (signal_pending(current)) {
327 err = sock_intr_errno(timeo);
328 break;
329 }
330 }
331 set_current_state(TASK_RUNNING);
332 remove_wait_queue(sk_sleep(sk), &wait);
333
334 if (err)
335 goto done;
336
337 newsock->state = SS_CONNECTED;
338
339 BT_DBG("new socket %p", nsk);
340
341done:
342 release_sock(sk);
343 return err;
344}
345
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200346static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
347{
348 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
349 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300350 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200351
352 BT_DBG("sock %p, sk %p", sock, sk);
353
354 addr->sa_family = AF_BLUETOOTH;
355 *len = sizeof(struct sockaddr_l2);
356
357 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300358 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200359 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300360 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200361 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300362 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200363 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300364 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200365 }
366
367 return 0;
368}
369
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200370static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
371{
372 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300373 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200374 struct l2cap_options opts;
375 struct l2cap_conninfo cinfo;
376 int len, err = 0;
377 u32 opt;
378
379 BT_DBG("sk %p", sk);
380
381 if (get_user(len, optlen))
382 return -EFAULT;
383
384 lock_sock(sk);
385
386 switch (optname) {
387 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300388 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300389 opts.imtu = chan->imtu;
390 opts.omtu = chan->omtu;
391 opts.flush_to = chan->flush_to;
392 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300393 opts.fcs = chan->fcs;
394 opts.max_tx = chan->max_tx;
395 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200396
397 len = min_t(unsigned int, len, sizeof(opts));
398 if (copy_to_user(optval, (char *) &opts, len))
399 err = -EFAULT;
400
401 break;
402
403 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300404 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200405 case BT_SECURITY_LOW:
406 opt = L2CAP_LM_AUTH;
407 break;
408 case BT_SECURITY_MEDIUM:
409 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
410 break;
411 case BT_SECURITY_HIGH:
412 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
413 L2CAP_LM_SECURE;
414 break;
415 default:
416 opt = 0;
417 break;
418 }
419
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300420 if (chan->role_switch)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200421 opt |= L2CAP_LM_MASTER;
422
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300423 if (chan->force_reliable)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200424 opt |= L2CAP_LM_RELIABLE;
425
426 if (put_user(opt, (u32 __user *) optval))
427 err = -EFAULT;
428 break;
429
430 case L2CAP_CONNINFO:
431 if (sk->sk_state != BT_CONNECTED &&
432 !(sk->sk_state == BT_CONNECT2 &&
433 bt_sk(sk)->defer_setup)) {
434 err = -ENOTCONN;
435 break;
436 }
437
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300438 cinfo.hci_handle = chan->conn->hcon->handle;
439 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200440
441 len = min_t(unsigned int, len, sizeof(cinfo));
442 if (copy_to_user(optval, (char *) &cinfo, len))
443 err = -EFAULT;
444
445 break;
446
447 default:
448 err = -ENOPROTOOPT;
449 break;
450 }
451
452 release_sock(sk);
453 return err;
454}
455
456static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
457{
458 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300459 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200460 struct bt_security sec;
461 int len, err = 0;
462
463 BT_DBG("sk %p", sk);
464
465 if (level == SOL_L2CAP)
466 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
467
468 if (level != SOL_BLUETOOTH)
469 return -ENOPROTOOPT;
470
471 if (get_user(len, optlen))
472 return -EFAULT;
473
474 lock_sock(sk);
475
476 switch (optname) {
477 case BT_SECURITY:
478 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
479 && sk->sk_type != SOCK_RAW) {
480 err = -EINVAL;
481 break;
482 }
483
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300484 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200485
486 len = min_t(unsigned int, len, sizeof(sec));
487 if (copy_to_user(optval, (char *) &sec, len))
488 err = -EFAULT;
489
490 break;
491
492 case BT_DEFER_SETUP:
493 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
494 err = -EINVAL;
495 break;
496 }
497
498 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
499 err = -EFAULT;
500
501 break;
502
503 case BT_FLUSHABLE:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300504 if (put_user(chan->flushable, (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200505 err = -EFAULT;
506
507 break;
508
509 default:
510 err = -ENOPROTOOPT;
511 break;
512 }
513
514 release_sock(sk);
515 return err;
516}
517
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200518static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
519{
520 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300521 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200522 struct l2cap_options opts;
523 int len, err = 0;
524 u32 opt;
525
526 BT_DBG("sk %p", sk);
527
528 lock_sock(sk);
529
530 switch (optname) {
531 case L2CAP_OPTIONS:
532 if (sk->sk_state == BT_CONNECTED) {
533 err = -EINVAL;
534 break;
535 }
536
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300537 opts.imtu = chan->imtu;
538 opts.omtu = chan->omtu;
539 opts.flush_to = chan->flush_to;
540 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300541 opts.fcs = chan->fcs;
542 opts.max_tx = chan->max_tx;
543 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200544
545 len = min_t(unsigned int, sizeof(opts), optlen);
546 if (copy_from_user((char *) &opts, optval, len)) {
547 err = -EFAULT;
548 break;
549 }
550
551 if (opts.txwin_size > L2CAP_DEFAULT_TX_WINDOW) {
552 err = -EINVAL;
553 break;
554 }
555
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300556 chan->mode = opts.mode;
557 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200558 case L2CAP_MODE_BASIC:
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300559 chan->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200560 break;
561 case L2CAP_MODE_ERTM:
562 case L2CAP_MODE_STREAMING:
563 if (!disable_ertm)
564 break;
565 /* fall through */
566 default:
567 err = -EINVAL;
568 break;
569 }
570
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300571 chan->imtu = opts.imtu;
572 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300573 chan->fcs = opts.fcs;
574 chan->max_tx = opts.max_tx;
575 chan->tx_win = (__u8)opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200576 break;
577
578 case L2CAP_LM:
579 if (get_user(opt, (u32 __user *) optval)) {
580 err = -EFAULT;
581 break;
582 }
583
584 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300585 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200586 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300587 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200588 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300589 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200590
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300591 chan->role_switch = (opt & L2CAP_LM_MASTER);
592 chan->force_reliable = (opt & L2CAP_LM_RELIABLE);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200593 break;
594
595 default:
596 err = -ENOPROTOOPT;
597 break;
598 }
599
600 release_sock(sk);
601 return err;
602}
603
604static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
605{
606 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300607 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200608 struct bt_security sec;
609 int len, err = 0;
610 u32 opt;
611
612 BT_DBG("sk %p", sk);
613
614 if (level == SOL_L2CAP)
615 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
616
617 if (level != SOL_BLUETOOTH)
618 return -ENOPROTOOPT;
619
620 lock_sock(sk);
621
622 switch (optname) {
623 case BT_SECURITY:
624 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
625 && sk->sk_type != SOCK_RAW) {
626 err = -EINVAL;
627 break;
628 }
629
630 sec.level = BT_SECURITY_LOW;
631
632 len = min_t(unsigned int, sizeof(sec), optlen);
633 if (copy_from_user((char *) &sec, optval, len)) {
634 err = -EFAULT;
635 break;
636 }
637
638 if (sec.level < BT_SECURITY_LOW ||
639 sec.level > BT_SECURITY_HIGH) {
640 err = -EINVAL;
641 break;
642 }
643
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300644 chan->sec_level = sec.level;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200645 break;
646
647 case BT_DEFER_SETUP:
648 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
649 err = -EINVAL;
650 break;
651 }
652
653 if (get_user(opt, (u32 __user *) optval)) {
654 err = -EFAULT;
655 break;
656 }
657
658 bt_sk(sk)->defer_setup = opt;
659 break;
660
661 case BT_FLUSHABLE:
662 if (get_user(opt, (u32 __user *) optval)) {
663 err = -EFAULT;
664 break;
665 }
666
667 if (opt > BT_FLUSHABLE_ON) {
668 err = -EINVAL;
669 break;
670 }
671
672 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300673 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200674 /* proceed futher only when we have l2cap_conn and
675 No Flush support in the LM */
676 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
677 err = -EINVAL;
678 break;
679 }
680 }
681
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300682 chan->flushable = opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200683 break;
684
685 default:
686 err = -ENOPROTOOPT;
687 break;
688 }
689
690 release_sock(sk);
691 return err;
692}
693
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200694static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
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. Padovanfd83ccd2011-02-04 03:20:52 -0200698 struct sk_buff *skb;
699 u16 control;
700 int err;
701
702 BT_DBG("sock %p, sk %p", sock, sk);
703
704 err = sock_error(sk);
705 if (err)
706 return err;
707
708 if (msg->msg_flags & MSG_OOB)
709 return -EOPNOTSUPP;
710
711 lock_sock(sk);
712
713 if (sk->sk_state != BT_CONNECTED) {
714 err = -ENOTCONN;
715 goto done;
716 }
717
718 /* Connectionless channel */
719 if (sk->sk_type == SOCK_DGRAM) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300720 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200721 if (IS_ERR(skb)) {
722 err = PTR_ERR(skb);
723 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300724 l2cap_do_send(chan, skb);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200725 err = len;
726 }
727 goto done;
728 }
729
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300730 switch (chan->mode) {
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200731 case L2CAP_MODE_BASIC:
732 /* Check outgoing MTU */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300733 if (len > chan->omtu) {
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200734 err = -EMSGSIZE;
735 goto done;
736 }
737
738 /* Create a basic PDU */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300739 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200740 if (IS_ERR(skb)) {
741 err = PTR_ERR(skb);
742 goto done;
743 }
744
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300745 l2cap_do_send(chan, skb);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200746 err = len;
747 break;
748
749 case L2CAP_MODE_ERTM:
750 case L2CAP_MODE_STREAMING:
751 /* Entire SDU fits into one PDU */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300752 if (len <= chan->remote_mps) {
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200753 control = L2CAP_SDU_UNSEGMENTED;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300754 skb = l2cap_create_iframe_pdu(chan, msg, len, control,
755 0);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200756 if (IS_ERR(skb)) {
757 err = PTR_ERR(skb);
758 goto done;
759 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300760 __skb_queue_tail(&chan->tx_q, skb);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200761
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300762 if (chan->tx_send_head == NULL)
763 chan->tx_send_head = skb;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200764
765 } else {
766 /* Segment SDU into multiples PDUs */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300767 err = l2cap_sar_segment_sdu(chan, msg, len);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200768 if (err < 0)
769 goto done;
770 }
771
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300772 if (chan->mode == L2CAP_MODE_STREAMING) {
773 l2cap_streaming_send(chan);
Gustavo F. Padovan525cd182011-03-25 19:43:39 -0300774 err = len;
775 break;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200776 }
777
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300778 if ((chan->conn_state & L2CAP_CONN_REMOTE_BUSY) &&
779 (chan->conn_state & L2CAP_CONN_WAIT_F)) {
Gustavo F. Padovan525cd182011-03-25 19:43:39 -0300780 err = len;
781 break;
782 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300783 err = l2cap_ertm_send(chan);
Gustavo F. Padovan525cd182011-03-25 19:43:39 -0300784
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200785 if (err >= 0)
786 err = len;
787 break;
788
789 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300790 BT_DBG("bad state %1.1x", chan->mode);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200791 err = -EBADFD;
792 }
793
794done:
795 release_sock(sk);
796 return err;
797}
798
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200799static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
800{
801 struct sock *sk = sock->sk;
802
803 lock_sock(sk);
804
805 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300806 sk->sk_state = BT_CONFIG;
807
808 __l2cap_connect_rsp_defer(l2cap_pi(sk)->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200809 release_sock(sk);
810 return 0;
811 }
812
813 release_sock(sk);
814
815 if (sock->type == SOCK_STREAM)
816 return bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
817
818 return bt_sock_recvmsg(iocb, sock, msg, len, flags);
819}
820
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200821/* Kill socket (only if zapped and orphan)
822 * Must be called on unlocked socket.
823 */
824void l2cap_sock_kill(struct sock *sk)
825{
826 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
827 return;
828
829 BT_DBG("sk %p state %d", sk, sk->sk_state);
830
831 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300832
833 l2cap_chan_free(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200834 bt_sock_unlink(&l2cap_sk_list, sk);
835 sock_set_flag(sk, SOCK_DEAD);
836 sock_put(sk);
837}
838
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200839/* Must be called on unlocked socket. */
840static void l2cap_sock_close(struct sock *sk)
841{
842 l2cap_sock_clear_timer(sk);
843 lock_sock(sk);
844 __l2cap_sock_close(sk, ECONNRESET);
845 release_sock(sk);
846 l2cap_sock_kill(sk);
847}
848
849static void l2cap_sock_cleanup_listen(struct sock *parent)
850{
851 struct sock *sk;
852
853 BT_DBG("parent %p", parent);
854
855 /* Close not yet accepted channels */
856 while ((sk = bt_accept_dequeue(parent, NULL)))
857 l2cap_sock_close(sk);
858
859 parent->sk_state = BT_CLOSED;
860 sock_set_flag(parent, SOCK_ZAPPED);
861}
862
863void __l2cap_sock_close(struct sock *sk, int reason)
864{
Gustavo F. Padovane92c8e72011-04-01 00:53:45 -0300865 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300866 struct l2cap_conn *conn = chan->conn;
Ville Tervo5589fa92011-02-10 22:38:51 -0300867
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200868 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
869
870 switch (sk->sk_state) {
871 case BT_LISTEN:
872 l2cap_sock_cleanup_listen(sk);
873 break;
874
875 case BT_CONNECTED:
876 case BT_CONFIG:
Ville Tervo5589fa92011-02-10 22:38:51 -0300877 if ((sk->sk_type == SOCK_SEQPACKET ||
878 sk->sk_type == SOCK_STREAM) &&
879 conn->hcon->type == ACL_LINK) {
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200880 l2cap_sock_set_timer(sk, sk->sk_sndtimeo);
Gustavo F. Padovane92c8e72011-04-01 00:53:45 -0300881 l2cap_send_disconn_req(conn, chan, reason);
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200882 } else
Gustavo F. Padovane92c8e72011-04-01 00:53:45 -0300883 l2cap_chan_del(chan, reason);
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200884 break;
885
886 case BT_CONNECT2:
Ville Tervo5589fa92011-02-10 22:38:51 -0300887 if ((sk->sk_type == SOCK_SEQPACKET ||
888 sk->sk_type == SOCK_STREAM) &&
889 conn->hcon->type == ACL_LINK) {
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200890 struct l2cap_conn_rsp rsp;
891 __u16 result;
892
893 if (bt_sk(sk)->defer_setup)
894 result = L2CAP_CR_SEC_BLOCK;
895 else
896 result = L2CAP_CR_BAD_PSM;
897
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300898 rsp.scid = cpu_to_le16(chan->dcid);
899 rsp.dcid = cpu_to_le16(chan->scid);
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200900 rsp.result = cpu_to_le16(result);
901 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Gustavo F. Padovane92c8e72011-04-01 00:53:45 -0300902 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
903 sizeof(rsp), &rsp);
Andrei Emeltchenko34bd0272011-03-24 17:16:08 +0200904 }
905
Gustavo F. Padovane92c8e72011-04-01 00:53:45 -0300906 l2cap_chan_del(chan, reason);
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200907 break;
908
909 case BT_CONNECT:
910 case BT_DISCONN:
Gustavo F. Padovane92c8e72011-04-01 00:53:45 -0300911 l2cap_chan_del(chan, reason);
Gustavo F. Padovan6de07022011-02-04 03:35:20 -0200912 break;
913
914 default:
915 sock_set_flag(sk, SOCK_ZAPPED);
916 break;
917 }
918}
919
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200920static int l2cap_sock_shutdown(struct socket *sock, int how)
921{
922 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300923 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200924 int err = 0;
925
926 BT_DBG("sock %p, sk %p", sock, sk);
927
928 if (!sk)
929 return 0;
930
931 lock_sock(sk);
932 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300933 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200934 err = __l2cap_wait_ack(sk);
935
936 sk->sk_shutdown = SHUTDOWN_MASK;
937 l2cap_sock_clear_timer(sk);
938 __l2cap_sock_close(sk, 0);
939
940 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
941 err = bt_sock_wait_state(sk, BT_CLOSED,
942 sk->sk_lingertime);
943 }
944
945 if (!err && sk->sk_err)
946 err = -sk->sk_err;
947
948 release_sock(sk);
949 return err;
950}
951
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200952static int l2cap_sock_release(struct socket *sock)
953{
954 struct sock *sk = sock->sk;
955 int err;
956
957 BT_DBG("sock %p, sk %p", sock, sk);
958
959 if (!sk)
960 return 0;
961
962 err = l2cap_sock_shutdown(sock, 2);
963
964 sock_orphan(sk);
965 l2cap_sock_kill(sk);
966 return err;
967}
968
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200969static void l2cap_sock_destruct(struct sock *sk)
970{
971 BT_DBG("sk %p", sk);
972
973 skb_queue_purge(&sk->sk_receive_queue);
974 skb_queue_purge(&sk->sk_write_queue);
975}
976
977void l2cap_sock_init(struct sock *sk, struct sock *parent)
978{
979 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300980 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200981
982 BT_DBG("sk %p", sk);
983
984 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300985 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
986
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200987 sk->sk_type = parent->sk_type;
988 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
989
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300990 chan->imtu = pchan->imtu;
991 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300992 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300993 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300994 chan->fcs = pchan->fcs;
995 chan->max_tx = pchan->max_tx;
996 chan->tx_win = pchan->tx_win;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300997 chan->sec_level = pchan->sec_level;
998 chan->role_switch = pchan->role_switch;
999 chan->force_reliable = pchan->force_reliable;
1000 chan->flushable = pchan->flushable;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001001 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001002 chan->imtu = L2CAP_DEFAULT_MTU;
1003 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001004 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001005 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001006 chan->conf_state |= L2CAP_CONF_STATE2_DEVICE;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001007 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001008 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001009 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001010 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
1011 chan->fcs = L2CAP_FCS_CRC16;
1012 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001013 chan->sec_level = BT_SECURITY_LOW;
1014 chan->role_switch = 0;
1015 chan->force_reliable = 0;
1016 chan->flushable = BT_FLUSHABLE_OFF;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001017 }
1018
1019 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001020 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001021}
1022
1023static struct proto l2cap_proto = {
1024 .name = "L2CAP",
1025 .owner = THIS_MODULE,
1026 .obj_size = sizeof(struct l2cap_pinfo)
1027};
1028
1029struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
1030{
1031 struct sock *sk;
1032
1033 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1034 if (!sk)
1035 return NULL;
1036
1037 sock_init_data(sock, sk);
1038 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1039
1040 sk->sk_destruct = l2cap_sock_destruct;
1041 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
1042
1043 sock_reset_flag(sk, SOCK_ZAPPED);
1044
1045 sk->sk_protocol = proto;
1046 sk->sk_state = BT_OPEN;
1047
1048 setup_timer(&sk->sk_timer, l2cap_sock_timeout, (unsigned long) sk);
1049
1050 bt_sock_link(&l2cap_sk_list, sk);
1051 return sk;
1052}
1053
1054static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1055 int kern)
1056{
1057 struct sock *sk;
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -03001058 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001059
1060 BT_DBG("sock %p", sock);
1061
1062 sock->state = SS_UNCONNECTED;
1063
1064 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1065 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1066 return -ESOCKTNOSUPPORT;
1067
1068 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1069 return -EPERM;
1070
1071 sock->ops = &l2cap_sock_ops;
1072
1073 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1074 if (!sk)
1075 return -ENOMEM;
1076
Gustavo F. Padovan5d41ce12011-04-08 15:40:02 -03001077 chan = l2cap_chan_alloc(sk);
1078 if (!chan) {
1079 l2cap_sock_kill(sk);
1080 return -ENOMEM;
1081 }
1082
1083 l2cap_pi(sk)->chan = chan;
1084
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001085 l2cap_sock_init(sk, NULL);
1086 return 0;
1087}
1088
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001089static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001090 .family = PF_BLUETOOTH,
1091 .owner = THIS_MODULE,
1092 .release = l2cap_sock_release,
1093 .bind = l2cap_sock_bind,
1094 .connect = l2cap_sock_connect,
1095 .listen = l2cap_sock_listen,
1096 .accept = l2cap_sock_accept,
1097 .getname = l2cap_sock_getname,
1098 .sendmsg = l2cap_sock_sendmsg,
1099 .recvmsg = l2cap_sock_recvmsg,
1100 .poll = bt_sock_poll,
1101 .ioctl = bt_sock_ioctl,
1102 .mmap = sock_no_mmap,
1103 .socketpair = sock_no_socketpair,
1104 .shutdown = l2cap_sock_shutdown,
1105 .setsockopt = l2cap_sock_setsockopt,
1106 .getsockopt = l2cap_sock_getsockopt
1107};
1108
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001109static const struct net_proto_family l2cap_sock_family_ops = {
1110 .family = PF_BLUETOOTH,
1111 .owner = THIS_MODULE,
1112 .create = l2cap_sock_create,
1113};
1114
1115int __init l2cap_init_sockets(void)
1116{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001117 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001118
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001119 err = proto_register(&l2cap_proto, 0);
1120 if (err < 0)
1121 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001122
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001123 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1124 if (err < 0)
1125 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001126
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001127 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001128
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001129 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001130
1131error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001132 BT_ERR("L2CAP socket registration failed");
1133 proto_unregister(&l2cap_proto);
1134 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001135}
1136
1137void l2cap_cleanup_sockets(void)
1138{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001139 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1140 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001141
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001142 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001143}