blob: f6d8e13197d681d67b6cbf4041350a1fc5e73b70 [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.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007
8 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License version 2 as
12 published by the Free Software Foundation;
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
17 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
18 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
24 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
25 SOFTWARE IS DISCLAIMED.
26*/
27
28/* Bluetooth L2CAP sockets. */
29
Paul Moore6230c9b2011-10-07 09:40:59 +000030#include <linux/security.h>
Paul Gortmakerbc3b2d72011-07-15 11:47:34 -040031#include <linux/export.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000032
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020033#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020034#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020035#include <net/bluetooth/l2cap.h>
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -030036#include <net/bluetooth/smp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020037
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030038static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030039static void l2cap_sock_init(struct sock *sk, struct sock *parent);
40static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030041
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020042static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
43{
44 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030045 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020046 struct sockaddr_l2 la;
47 int len, err = 0;
48
49 BT_DBG("sk %p", sk);
50
51 if (!addr || addr->sa_family != AF_BLUETOOTH)
52 return -EINVAL;
53
54 memset(&la, 0, sizeof(la));
55 len = min_t(unsigned int, sizeof(la), alen);
56 memcpy(&la, addr, len);
57
Ville Tervob62f3282011-02-10 22:38:50 -030058 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020059 return -EINVAL;
60
61 lock_sock(sk);
62
63 if (sk->sk_state != BT_OPEN) {
64 err = -EBADFD;
65 goto done;
66 }
67
68 if (la.l2_psm) {
69 __u16 psm = __le16_to_cpu(la.l2_psm);
70
71 /* PSM must be odd and lsb of upper byte must be 0 */
72 if ((psm & 0x0101) != 0x0001) {
73 err = -EINVAL;
74 goto done;
75 }
76
77 /* Restrict usage of well-known PSMs */
78 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
79 err = -EACCES;
80 goto done;
81 }
82 }
83
Ville Tervob62f3282011-02-10 22:38:50 -030084 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +053085 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030086 else
87 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030088
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030089 if (err < 0)
90 goto done;
91
92 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
93 __le16_to_cpu(la.l2_psm) == 0x0003)
94 chan->sec_level = BT_SECURITY_SDP;
95
96 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -030097
98 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030099 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200100
101done:
102 release_sock(sk);
103 return err;
104}
105
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200106static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
107{
108 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300109 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200110 struct sockaddr_l2 la;
111 int len, err = 0;
112
113 BT_DBG("sk %p", sk);
114
115 if (!addr || alen < sizeof(addr->sa_family) ||
116 addr->sa_family != AF_BLUETOOTH)
117 return -EINVAL;
118
119 memset(&la, 0, sizeof(la));
120 len = min_t(unsigned int, sizeof(la), alen);
121 memcpy(&la, addr, len);
122
Ville Tervoacd7d372011-02-10 22:38:49 -0300123 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200124 return -EINVAL;
125
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530126 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300127 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200128 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200129 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200130
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200131 lock_sock(sk);
132
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200133 err = bt_sock_wait_state(sk, BT_CONNECTED,
134 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200135
136 release_sock(sk);
137
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200138 return err;
139}
140
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200141static int l2cap_sock_listen(struct socket *sock, int backlog)
142{
143 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300144 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200145 int err = 0;
146
147 BT_DBG("sk %p backlog %d", sk, backlog);
148
149 lock_sock(sk);
150
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200151 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200152 err = -EBADFD;
153 goto done;
154 }
155
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200156 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
157 err = -EINVAL;
158 goto done;
159 }
160
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300161 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200162 case L2CAP_MODE_BASIC:
163 break;
164 case L2CAP_MODE_ERTM:
165 case L2CAP_MODE_STREAMING:
166 if (!disable_ertm)
167 break;
168 /* fall through */
169 default:
170 err = -ENOTSUPP;
171 goto done;
172 }
173
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200174 sk->sk_max_ack_backlog = backlog;
175 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300176
177 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200178 sk->sk_state = BT_LISTEN;
179
180done:
181 release_sock(sk);
182 return err;
183}
184
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200185static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
186{
187 DECLARE_WAITQUEUE(wait, current);
188 struct sock *sk = sock->sk, *nsk;
189 long timeo;
190 int err = 0;
191
192 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
193
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200194 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
195
196 BT_DBG("sk %p timeo %ld", sk, timeo);
197
198 /* Wait for an incoming connection. (wake-one). */
199 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400200 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200201 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200202
203 if (sk->sk_state != BT_LISTEN) {
204 err = -EBADFD;
205 break;
206 }
207
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400208 nsk = bt_accept_dequeue(sk, newsock);
209 if (nsk)
210 break;
211
212 if (!timeo) {
213 err = -EAGAIN;
214 break;
215 }
216
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200217 if (signal_pending(current)) {
218 err = sock_intr_errno(timeo);
219 break;
220 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400221
222 release_sock(sk);
223 timeo = schedule_timeout(timeo);
224 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200225 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400226 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200227 remove_wait_queue(sk_sleep(sk), &wait);
228
229 if (err)
230 goto done;
231
232 newsock->state = SS_CONNECTED;
233
234 BT_DBG("new socket %p", nsk);
235
236done:
237 release_sock(sk);
238 return err;
239}
240
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200241static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
242{
243 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
244 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300245 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200246
247 BT_DBG("sock %p, sk %p", sock, sk);
248
249 addr->sa_family = AF_BLUETOOTH;
250 *len = sizeof(struct sockaddr_l2);
251
252 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300253 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200254 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300255 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200256 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300257 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200258 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300259 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200260 }
261
262 return 0;
263}
264
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200265static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
266{
267 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300268 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200269 struct l2cap_options opts;
270 struct l2cap_conninfo cinfo;
271 int len, err = 0;
272 u32 opt;
273
274 BT_DBG("sk %p", sk);
275
276 if (get_user(len, optlen))
277 return -EFAULT;
278
279 lock_sock(sk);
280
281 switch (optname) {
282 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300283 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300284 opts.imtu = chan->imtu;
285 opts.omtu = chan->omtu;
286 opts.flush_to = chan->flush_to;
287 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300288 opts.fcs = chan->fcs;
289 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300290 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200291
292 len = min_t(unsigned int, len, sizeof(opts));
293 if (copy_to_user(optval, (char *) &opts, len))
294 err = -EFAULT;
295
296 break;
297
298 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300299 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200300 case BT_SECURITY_LOW:
301 opt = L2CAP_LM_AUTH;
302 break;
303 case BT_SECURITY_MEDIUM:
304 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
305 break;
306 case BT_SECURITY_HIGH:
307 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
308 L2CAP_LM_SECURE;
309 break;
310 default:
311 opt = 0;
312 break;
313 }
314
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300315 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200316 opt |= L2CAP_LM_MASTER;
317
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300318 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200319 opt |= L2CAP_LM_RELIABLE;
320
321 if (put_user(opt, (u32 __user *) optval))
322 err = -EFAULT;
323 break;
324
325 case L2CAP_CONNINFO:
326 if (sk->sk_state != BT_CONNECTED &&
327 !(sk->sk_state == BT_CONNECT2 &&
328 bt_sk(sk)->defer_setup)) {
329 err = -ENOTCONN;
330 break;
331 }
332
Filip Palian8d03e972011-05-12 19:32:46 +0200333 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300334 cinfo.hci_handle = chan->conn->hcon->handle;
335 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200336
337 len = min_t(unsigned int, len, sizeof(cinfo));
338 if (copy_to_user(optval, (char *) &cinfo, len))
339 err = -EFAULT;
340
341 break;
342
343 default:
344 err = -ENOPROTOOPT;
345 break;
346 }
347
348 release_sock(sk);
349 return err;
350}
351
352static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
353{
354 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300355 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200356 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700357 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200358 int len, err = 0;
359
360 BT_DBG("sk %p", sk);
361
362 if (level == SOL_L2CAP)
363 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
364
365 if (level != SOL_BLUETOOTH)
366 return -ENOPROTOOPT;
367
368 if (get_user(len, optlen))
369 return -EFAULT;
370
371 lock_sock(sk);
372
373 switch (optname) {
374 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300375 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
376 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200377 err = -EINVAL;
378 break;
379 }
380
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300381 memset(&sec, 0, sizeof(sec));
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300382 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200383
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300384 if (sk->sk_state == BT_CONNECTED)
385 sec.key_size = chan->conn->hcon->enc_key_size;
386
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200387 len = min_t(unsigned int, len, sizeof(sec));
388 if (copy_to_user(optval, (char *) &sec, len))
389 err = -EFAULT;
390
391 break;
392
393 case BT_DEFER_SETUP:
394 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
395 err = -EINVAL;
396 break;
397 }
398
399 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
400 err = -EFAULT;
401
402 break;
403
404 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300405 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
406 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200407 err = -EFAULT;
408
409 break;
410
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700411 case BT_POWER:
412 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
413 && sk->sk_type != SOCK_RAW) {
414 err = -EINVAL;
415 break;
416 }
417
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300418 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700419
420 len = min_t(unsigned int, len, sizeof(pwr));
421 if (copy_to_user(optval, (char *) &pwr, len))
422 err = -EFAULT;
423
424 break;
425
Mat Martineau2ea66482011-11-02 16:18:30 -0700426 case BT_CHANNEL_POLICY:
427 if (!enable_hs) {
428 err = -ENOPROTOOPT;
429 break;
430 }
431
432 if (put_user(chan->chan_policy, (u32 __user *) optval))
433 err = -EFAULT;
434 break;
435
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200436 default:
437 err = -ENOPROTOOPT;
438 break;
439 }
440
441 release_sock(sk);
442 return err;
443}
444
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200445static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
446{
447 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300448 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200449 struct l2cap_options opts;
450 int len, err = 0;
451 u32 opt;
452
453 BT_DBG("sk %p", sk);
454
455 lock_sock(sk);
456
457 switch (optname) {
458 case L2CAP_OPTIONS:
459 if (sk->sk_state == BT_CONNECTED) {
460 err = -EINVAL;
461 break;
462 }
463
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300464 opts.imtu = chan->imtu;
465 opts.omtu = chan->omtu;
466 opts.flush_to = chan->flush_to;
467 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300468 opts.fcs = chan->fcs;
469 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300470 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200471
472 len = min_t(unsigned int, sizeof(opts), optlen);
473 if (copy_from_user((char *) &opts, optval, len)) {
474 err = -EFAULT;
475 break;
476 }
477
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300478 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200479 err = -EINVAL;
480 break;
481 }
482
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300483 chan->mode = opts.mode;
484 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200485 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300486 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200487 break;
488 case L2CAP_MODE_ERTM:
489 case L2CAP_MODE_STREAMING:
490 if (!disable_ertm)
491 break;
492 /* fall through */
493 default:
494 err = -EINVAL;
495 break;
496 }
497
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300498 chan->imtu = opts.imtu;
499 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300500 chan->fcs = opts.fcs;
501 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300502 chan->tx_win = opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200503 break;
504
505 case L2CAP_LM:
506 if (get_user(opt, (u32 __user *) optval)) {
507 err = -EFAULT;
508 break;
509 }
510
511 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300512 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200513 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300514 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200515 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300516 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200517
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300518 if (opt & L2CAP_LM_MASTER)
519 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
520 else
521 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300522
523 if (opt & L2CAP_LM_RELIABLE)
524 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
525 else
526 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200527 break;
528
529 default:
530 err = -ENOPROTOOPT;
531 break;
532 }
533
534 release_sock(sk);
535 return err;
536}
537
538static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
539{
540 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300541 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200542 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700543 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300544 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200545 int len, err = 0;
546 u32 opt;
547
548 BT_DBG("sk %p", sk);
549
550 if (level == SOL_L2CAP)
551 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
552
553 if (level != SOL_BLUETOOTH)
554 return -ENOPROTOOPT;
555
556 lock_sock(sk);
557
558 switch (optname) {
559 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300560 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
561 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200562 err = -EINVAL;
563 break;
564 }
565
566 sec.level = BT_SECURITY_LOW;
567
568 len = min_t(unsigned int, sizeof(sec), optlen);
569 if (copy_from_user((char *) &sec, optval, len)) {
570 err = -EFAULT;
571 break;
572 }
573
574 if (sec.level < BT_SECURITY_LOW ||
575 sec.level > BT_SECURITY_HIGH) {
576 err = -EINVAL;
577 break;
578 }
579
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300580 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300581
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200582 if (!chan->conn)
583 break;
584
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300585 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200586
587 /*change security for LE channels */
588 if (chan->scid == L2CAP_CID_LE_DATA) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300589 if (!conn->hcon->out) {
590 err = -EINVAL;
591 break;
592 }
593
594 if (smp_conn_security(conn, sec.level))
595 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300596 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200597 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200598
Gustavo Padovana7d77232012-05-13 03:20:07 -0300599 /* or for ACL link */
600 } else if ((sk->sk_state == BT_CONNECT2 &&
601 bt_sk(sk)->defer_setup) ||
602 sk->sk_state == BT_CONNECTED) {
603 if (!l2cap_chan_check_security(chan))
604 bt_sk(sk)->suspended = true;
605 else
606 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200607 } else {
608 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300609 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200610 break;
611
612 case BT_DEFER_SETUP:
613 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
614 err = -EINVAL;
615 break;
616 }
617
618 if (get_user(opt, (u32 __user *) optval)) {
619 err = -EFAULT;
620 break;
621 }
622
623 bt_sk(sk)->defer_setup = opt;
624 break;
625
626 case BT_FLUSHABLE:
627 if (get_user(opt, (u32 __user *) optval)) {
628 err = -EFAULT;
629 break;
630 }
631
632 if (opt > BT_FLUSHABLE_ON) {
633 err = -EINVAL;
634 break;
635 }
636
637 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300638 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300639 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200640 No Flush support in the LM */
641 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
642 err = -EINVAL;
643 break;
644 }
645 }
646
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300647 if (opt)
648 set_bit(FLAG_FLUSHABLE, &chan->flags);
649 else
650 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200651 break;
652
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700653 case BT_POWER:
654 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
655 chan->chan_type != L2CAP_CHAN_RAW) {
656 err = -EINVAL;
657 break;
658 }
659
660 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
661
662 len = min_t(unsigned int, sizeof(pwr), optlen);
663 if (copy_from_user((char *) &pwr, optval, len)) {
664 err = -EFAULT;
665 break;
666 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300667
668 if (pwr.force_active)
669 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
670 else
671 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700672 break;
673
Mat Martineau2ea66482011-11-02 16:18:30 -0700674 case BT_CHANNEL_POLICY:
675 if (!enable_hs) {
676 err = -ENOPROTOOPT;
677 break;
678 }
679
680 if (get_user(opt, (u32 __user *) optval)) {
681 err = -EFAULT;
682 break;
683 }
684
685 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
686 err = -EINVAL;
687 break;
688 }
689
690 if (chan->mode != L2CAP_MODE_ERTM &&
691 chan->mode != L2CAP_MODE_STREAMING) {
692 err = -EOPNOTSUPP;
693 break;
694 }
695
696 chan->chan_policy = (u8) opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200697 break;
698
699 default:
700 err = -ENOPROTOOPT;
701 break;
702 }
703
704 release_sock(sk);
705 return err;
706}
707
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200708static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
709{
710 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300711 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200712 int err;
713
714 BT_DBG("sock %p, sk %p", sock, sk);
715
716 err = sock_error(sk);
717 if (err)
718 return err;
719
720 if (msg->msg_flags & MSG_OOB)
721 return -EOPNOTSUPP;
722
Mat Martineaua6a55682012-05-04 14:20:31 -0700723 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300724 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200725
Mat Martineaua6a55682012-05-04 14:20:31 -0700726 l2cap_chan_lock(chan);
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200727 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Mat Martineaua6a55682012-05-04 14:20:31 -0700728 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200729
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200730 return err;
731}
732
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200733static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
734{
735 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700736 struct l2cap_pinfo *pi = l2cap_pi(sk);
737 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200738
739 lock_sock(sk);
740
741 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300742 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200743 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300744
Mat Martineaue3281402011-07-07 09:39:02 -0700745 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200746 release_sock(sk);
747 return 0;
748 }
749
750 release_sock(sk);
751
752 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700753 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
754 else
755 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200756
Mat Martineaue3281402011-07-07 09:39:02 -0700757 if (pi->chan->mode != L2CAP_MODE_ERTM)
758 return err;
759
760 /* Attempt to put pending rx data in the socket buffer */
761
762 lock_sock(sk);
763
764 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
765 goto done;
766
767 if (pi->rx_busy_skb) {
768 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
769 pi->rx_busy_skb = NULL;
770 else
771 goto done;
772 }
773
774 /* Restore data flow when half of the receive buffer is
775 * available. This avoids resending large numbers of
776 * frames.
777 */
778 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
779 l2cap_chan_busy(pi->chan, 0);
780
781done:
782 release_sock(sk);
783 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200784}
785
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200786/* Kill socket (only if zapped and orphan)
787 * Must be called on unlocked socket.
788 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300789static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200790{
791 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
792 return;
793
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200794 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200795
796 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300797
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300798 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200799 sock_set_flag(sk, SOCK_DEAD);
800 sock_put(sk);
801}
802
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200803static int l2cap_sock_shutdown(struct socket *sock, int how)
804{
805 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200806 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200807 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200808 int err = 0;
809
810 BT_DBG("sock %p, sk %p", sock, sk);
811
812 if (!sk)
813 return 0;
814
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200815 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200816 conn = chan->conn;
817
818 if (conn)
819 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200820
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200821 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200822 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200823
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200824 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300825 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200826 err = __l2cap_wait_ack(sk);
827
828 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200829
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200830 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300831 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200832 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200833
834 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
835 err = bt_sock_wait_state(sk, BT_CLOSED,
836 sk->sk_lingertime);
837 }
838
839 if (!err && sk->sk_err)
840 err = -sk->sk_err;
841
842 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200843 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200844
845 if (conn)
846 mutex_unlock(&conn->chan_lock);
847
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200848 return err;
849}
850
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200851static int l2cap_sock_release(struct socket *sock)
852{
853 struct sock *sk = sock->sk;
854 int err;
855
856 BT_DBG("sock %p, sk %p", sock, sk);
857
858 if (!sk)
859 return 0;
860
861 err = l2cap_sock_shutdown(sock, 2);
862
863 sock_orphan(sk);
864 l2cap_sock_kill(sk);
865 return err;
866}
867
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300868static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
869{
870 struct sock *sk, *parent = data;
871
872 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
873 GFP_ATOMIC);
874 if (!sk)
875 return NULL;
876
Octavian Purdilad22015a2012-01-22 00:28:34 +0200877 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
878
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300879 l2cap_sock_init(sk, parent);
880
881 return l2cap_pi(sk)->chan;
882}
883
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300884static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
885{
Mat Martineaue3281402011-07-07 09:39:02 -0700886 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300887 struct sock *sk = data;
Mat Martineaue3281402011-07-07 09:39:02 -0700888 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300889
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200890 lock_sock(sk);
891
892 if (pi->rx_busy_skb) {
893 err = -ENOMEM;
894 goto done;
895 }
Mat Martineaue3281402011-07-07 09:39:02 -0700896
897 err = sock_queue_rcv_skb(sk, skb);
898
899 /* For ERTM, handle one skb that doesn't fit into the recv
900 * buffer. This is important to do because the data frames
901 * have already been acked, so the skb cannot be discarded.
902 *
903 * Notify the l2cap core that the buffer is full, so the
904 * LOCAL_BUSY state is entered and no more frames are
905 * acked and reassembled until there is buffer space
906 * available.
907 */
908 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
909 pi->rx_busy_skb = skb;
910 l2cap_chan_busy(pi->chan, 1);
911 err = 0;
912 }
913
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200914done:
915 release_sock(sk);
916
Mat Martineaue3281402011-07-07 09:39:02 -0700917 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300918}
919
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300920static void l2cap_sock_close_cb(void *data)
921{
922 struct sock *sk = data;
923
924 l2cap_sock_kill(sk);
925}
926
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300927static void l2cap_sock_state_change_cb(void *data, int state)
928{
929 struct sock *sk = data;
930
931 sk->sk_state = state;
932}
933
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200934static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -0300935 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200936{
Gustavo Padovan90338942012-04-06 20:15:47 -0300937 struct sk_buff *skb;
938 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200939
Mat Martineaua6a55682012-05-04 14:20:31 -0700940 l2cap_chan_unlock(chan);
Gustavo Padovan90338942012-04-06 20:15:47 -0300941 skb = bt_skb_send_alloc(chan->sk, len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -0700942 l2cap_chan_lock(chan);
943
Gustavo Padovan90338942012-04-06 20:15:47 -0300944 if (!skb)
945 return ERR_PTR(err);
946
947 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200948}
949
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300950static struct l2cap_ops l2cap_chan_ops = {
951 .name = "L2CAP Socket Interface",
952 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300953 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300954 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300955 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200956 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300957};
958
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200959static void l2cap_sock_destruct(struct sock *sk)
960{
961 BT_DBG("sk %p", sk);
962
Mat Martineau61d6ef32012-04-27 16:50:50 -0700963 l2cap_chan_put(l2cap_pi(sk)->chan);
Mat Martineaue3281402011-07-07 09:39:02 -0700964 if (l2cap_pi(sk)->rx_busy_skb) {
965 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
966 l2cap_pi(sk)->rx_busy_skb = NULL;
967 }
968
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200969 skb_queue_purge(&sk->sk_receive_queue);
970 skb_queue_purge(&sk->sk_write_queue);
971}
972
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300973static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200974{
975 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300976 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200977
978 BT_DBG("sk %p", sk);
979
980 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300981 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
982
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200983 sk->sk_type = parent->sk_type;
984 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
985
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300986 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300987 chan->imtu = pchan->imtu;
988 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300989 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300990 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300991 chan->fcs = pchan->fcs;
992 chan->max_tx = pchan->max_tx;
993 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +0200994 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300995 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300996 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000997
998 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200999 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001000
1001 switch (sk->sk_type) {
1002 case SOCK_RAW:
1003 chan->chan_type = L2CAP_CHAN_RAW;
1004 break;
1005 case SOCK_DGRAM:
1006 chan->chan_type = L2CAP_CHAN_CONN_LESS;
1007 break;
1008 case SOCK_SEQPACKET:
1009 case SOCK_STREAM:
1010 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1011 break;
1012 }
1013
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001014 chan->imtu = L2CAP_DEFAULT_MTU;
1015 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001016 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001017 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001018 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001019 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001020 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001021 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001022
1023 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001024 }
1025
1026 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001027 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001028
1029 chan->data = sk;
1030 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001031}
1032
1033static struct proto l2cap_proto = {
1034 .name = "L2CAP",
1035 .owner = THIS_MODULE,
1036 .obj_size = sizeof(struct l2cap_pinfo)
1037};
1038
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001039static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001040{
1041 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001042 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001043
1044 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1045 if (!sk)
1046 return NULL;
1047
1048 sock_init_data(sock, sk);
1049 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1050
1051 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001052 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001053
1054 sock_reset_flag(sk, SOCK_ZAPPED);
1055
1056 sk->sk_protocol = proto;
1057 sk->sk_state = BT_OPEN;
1058
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001059 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001060 if (!chan) {
1061 l2cap_sock_kill(sk);
1062 return NULL;
1063 }
1064
Mat Martineau61d6ef32012-04-27 16:50:50 -07001065 l2cap_chan_hold(chan);
1066
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001067 chan->sk = sk;
1068
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001069 l2cap_pi(sk)->chan = chan;
1070
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001071 return sk;
1072}
1073
1074static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1075 int kern)
1076{
1077 struct sock *sk;
1078
1079 BT_DBG("sock %p", sock);
1080
1081 sock->state = SS_UNCONNECTED;
1082
1083 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1084 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1085 return -ESOCKTNOSUPPORT;
1086
1087 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1088 return -EPERM;
1089
1090 sock->ops = &l2cap_sock_ops;
1091
1092 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1093 if (!sk)
1094 return -ENOMEM;
1095
1096 l2cap_sock_init(sk, NULL);
1097 return 0;
1098}
1099
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001100static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001101 .family = PF_BLUETOOTH,
1102 .owner = THIS_MODULE,
1103 .release = l2cap_sock_release,
1104 .bind = l2cap_sock_bind,
1105 .connect = l2cap_sock_connect,
1106 .listen = l2cap_sock_listen,
1107 .accept = l2cap_sock_accept,
1108 .getname = l2cap_sock_getname,
1109 .sendmsg = l2cap_sock_sendmsg,
1110 .recvmsg = l2cap_sock_recvmsg,
1111 .poll = bt_sock_poll,
1112 .ioctl = bt_sock_ioctl,
1113 .mmap = sock_no_mmap,
1114 .socketpair = sock_no_socketpair,
1115 .shutdown = l2cap_sock_shutdown,
1116 .setsockopt = l2cap_sock_setsockopt,
1117 .getsockopt = l2cap_sock_getsockopt
1118};
1119
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001120static const struct net_proto_family l2cap_sock_family_ops = {
1121 .family = PF_BLUETOOTH,
1122 .owner = THIS_MODULE,
1123 .create = l2cap_sock_create,
1124};
1125
1126int __init l2cap_init_sockets(void)
1127{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001128 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001129
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001130 err = proto_register(&l2cap_proto, 0);
1131 if (err < 0)
1132 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001133
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001134 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1135 if (err < 0)
1136 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001137
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001138 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001139
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001140 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001141
1142error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001143 BT_ERR("L2CAP socket registration failed");
1144 proto_unregister(&l2cap_proto);
1145 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001146}
1147
1148void l2cap_cleanup_sockets(void)
1149{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001150 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1151 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001152
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001153 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001154}