blob: f52d58e05d028eac5dd38ceda1b628c307addc01 [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 Padovanc6585a42012-05-07 03:07:26 -0300382 if (chan->conn)
383 sec.level = chan->conn->hcon->sec_level;
384 else
385 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200386
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300387 if (sk->sk_state == BT_CONNECTED)
388 sec.key_size = chan->conn->hcon->enc_key_size;
389
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200390 len = min_t(unsigned int, len, sizeof(sec));
391 if (copy_to_user(optval, (char *) &sec, len))
392 err = -EFAULT;
393
394 break;
395
396 case BT_DEFER_SETUP:
397 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
398 err = -EINVAL;
399 break;
400 }
401
402 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
403 err = -EFAULT;
404
405 break;
406
407 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300408 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
409 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200410 err = -EFAULT;
411
412 break;
413
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700414 case BT_POWER:
415 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
416 && sk->sk_type != SOCK_RAW) {
417 err = -EINVAL;
418 break;
419 }
420
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300421 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700422
423 len = min_t(unsigned int, len, sizeof(pwr));
424 if (copy_to_user(optval, (char *) &pwr, len))
425 err = -EFAULT;
426
427 break;
428
Mat Martineau2ea66482011-11-02 16:18:30 -0700429 case BT_CHANNEL_POLICY:
430 if (!enable_hs) {
431 err = -ENOPROTOOPT;
432 break;
433 }
434
435 if (put_user(chan->chan_policy, (u32 __user *) optval))
436 err = -EFAULT;
437 break;
438
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200439 default:
440 err = -ENOPROTOOPT;
441 break;
442 }
443
444 release_sock(sk);
445 return err;
446}
447
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200448static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
449{
450 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300451 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200452 struct l2cap_options opts;
453 int len, err = 0;
454 u32 opt;
455
456 BT_DBG("sk %p", sk);
457
458 lock_sock(sk);
459
460 switch (optname) {
461 case L2CAP_OPTIONS:
462 if (sk->sk_state == BT_CONNECTED) {
463 err = -EINVAL;
464 break;
465 }
466
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300467 opts.imtu = chan->imtu;
468 opts.omtu = chan->omtu;
469 opts.flush_to = chan->flush_to;
470 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300471 opts.fcs = chan->fcs;
472 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300473 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200474
475 len = min_t(unsigned int, sizeof(opts), optlen);
476 if (copy_from_user((char *) &opts, optval, len)) {
477 err = -EFAULT;
478 break;
479 }
480
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300481 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200482 err = -EINVAL;
483 break;
484 }
485
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300486 chan->mode = opts.mode;
487 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200488 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300489 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200490 break;
491 case L2CAP_MODE_ERTM:
492 case L2CAP_MODE_STREAMING:
493 if (!disable_ertm)
494 break;
495 /* fall through */
496 default:
497 err = -EINVAL;
498 break;
499 }
500
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300501 chan->imtu = opts.imtu;
502 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300503 chan->fcs = opts.fcs;
504 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300505 chan->tx_win = opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200506 break;
507
508 case L2CAP_LM:
509 if (get_user(opt, (u32 __user *) optval)) {
510 err = -EFAULT;
511 break;
512 }
513
514 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300515 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200516 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300517 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200518 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300519 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200520
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300521 if (opt & L2CAP_LM_MASTER)
522 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
523 else
524 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300525
526 if (opt & L2CAP_LM_RELIABLE)
527 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
528 else
529 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200530 break;
531
532 default:
533 err = -ENOPROTOOPT;
534 break;
535 }
536
537 release_sock(sk);
538 return err;
539}
540
541static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
542{
543 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300544 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200545 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700546 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300547 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200548 int len, err = 0;
549 u32 opt;
550
551 BT_DBG("sk %p", sk);
552
553 if (level == SOL_L2CAP)
554 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
555
556 if (level != SOL_BLUETOOTH)
557 return -ENOPROTOOPT;
558
559 lock_sock(sk);
560
561 switch (optname) {
562 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300563 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
564 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200565 err = -EINVAL;
566 break;
567 }
568
569 sec.level = BT_SECURITY_LOW;
570
571 len = min_t(unsigned int, sizeof(sec), optlen);
572 if (copy_from_user((char *) &sec, optval, len)) {
573 err = -EFAULT;
574 break;
575 }
576
577 if (sec.level < BT_SECURITY_LOW ||
578 sec.level > BT_SECURITY_HIGH) {
579 err = -EINVAL;
580 break;
581 }
582
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300583 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300584
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200585 if (!chan->conn)
586 break;
587
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300588 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200589
590 /*change security for LE channels */
591 if (chan->scid == L2CAP_CID_LE_DATA) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300592 if (!conn->hcon->out) {
593 err = -EINVAL;
594 break;
595 }
596
597 if (smp_conn_security(conn, sec.level))
598 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300599 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200600 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200601
Gustavo Padovana7d77232012-05-13 03:20:07 -0300602 /* or for ACL link */
603 } else if ((sk->sk_state == BT_CONNECT2 &&
604 bt_sk(sk)->defer_setup) ||
605 sk->sk_state == BT_CONNECTED) {
606 if (!l2cap_chan_check_security(chan))
607 bt_sk(sk)->suspended = true;
608 else
609 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200610 } else {
611 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300612 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200613 break;
614
615 case BT_DEFER_SETUP:
616 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
617 err = -EINVAL;
618 break;
619 }
620
621 if (get_user(opt, (u32 __user *) optval)) {
622 err = -EFAULT;
623 break;
624 }
625
626 bt_sk(sk)->defer_setup = opt;
627 break;
628
629 case BT_FLUSHABLE:
630 if (get_user(opt, (u32 __user *) optval)) {
631 err = -EFAULT;
632 break;
633 }
634
635 if (opt > BT_FLUSHABLE_ON) {
636 err = -EINVAL;
637 break;
638 }
639
640 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300641 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300642 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200643 No Flush support in the LM */
644 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
645 err = -EINVAL;
646 break;
647 }
648 }
649
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300650 if (opt)
651 set_bit(FLAG_FLUSHABLE, &chan->flags);
652 else
653 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200654 break;
655
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700656 case BT_POWER:
657 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
658 chan->chan_type != L2CAP_CHAN_RAW) {
659 err = -EINVAL;
660 break;
661 }
662
663 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
664
665 len = min_t(unsigned int, sizeof(pwr), optlen);
666 if (copy_from_user((char *) &pwr, optval, len)) {
667 err = -EFAULT;
668 break;
669 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300670
671 if (pwr.force_active)
672 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
673 else
674 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700675 break;
676
Mat Martineau2ea66482011-11-02 16:18:30 -0700677 case BT_CHANNEL_POLICY:
678 if (!enable_hs) {
679 err = -ENOPROTOOPT;
680 break;
681 }
682
683 if (get_user(opt, (u32 __user *) optval)) {
684 err = -EFAULT;
685 break;
686 }
687
688 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
689 err = -EINVAL;
690 break;
691 }
692
693 if (chan->mode != L2CAP_MODE_ERTM &&
694 chan->mode != L2CAP_MODE_STREAMING) {
695 err = -EOPNOTSUPP;
696 break;
697 }
698
699 chan->chan_policy = (u8) opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200700 break;
701
702 default:
703 err = -ENOPROTOOPT;
704 break;
705 }
706
707 release_sock(sk);
708 return err;
709}
710
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200711static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
712{
713 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300714 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200715 int err;
716
717 BT_DBG("sock %p, sk %p", sock, sk);
718
719 err = sock_error(sk);
720 if (err)
721 return err;
722
723 if (msg->msg_flags & MSG_OOB)
724 return -EOPNOTSUPP;
725
Mat Martineaua6a55682012-05-04 14:20:31 -0700726 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300727 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200728
Mat Martineaua6a55682012-05-04 14:20:31 -0700729 l2cap_chan_lock(chan);
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200730 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Mat Martineaua6a55682012-05-04 14:20:31 -0700731 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200732
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200733 return err;
734}
735
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200736static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
737{
738 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700739 struct l2cap_pinfo *pi = l2cap_pi(sk);
740 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200741
742 lock_sock(sk);
743
744 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300745 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200746 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300747
Mat Martineaue3281402011-07-07 09:39:02 -0700748 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200749 release_sock(sk);
750 return 0;
751 }
752
753 release_sock(sk);
754
755 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700756 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
757 else
758 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200759
Mat Martineaue3281402011-07-07 09:39:02 -0700760 if (pi->chan->mode != L2CAP_MODE_ERTM)
761 return err;
762
763 /* Attempt to put pending rx data in the socket buffer */
764
765 lock_sock(sk);
766
767 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
768 goto done;
769
770 if (pi->rx_busy_skb) {
771 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
772 pi->rx_busy_skb = NULL;
773 else
774 goto done;
775 }
776
777 /* Restore data flow when half of the receive buffer is
778 * available. This avoids resending large numbers of
779 * frames.
780 */
781 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
782 l2cap_chan_busy(pi->chan, 0);
783
784done:
785 release_sock(sk);
786 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200787}
788
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200789/* Kill socket (only if zapped and orphan)
790 * Must be called on unlocked socket.
791 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300792static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200793{
794 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
795 return;
796
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200797 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200798
799 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300800
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300801 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200802 sock_set_flag(sk, SOCK_DEAD);
803 sock_put(sk);
804}
805
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200806static int l2cap_sock_shutdown(struct socket *sock, int how)
807{
808 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200809 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200810 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200811 int err = 0;
812
813 BT_DBG("sock %p, sk %p", sock, sk);
814
815 if (!sk)
816 return 0;
817
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200818 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200819 conn = chan->conn;
820
821 if (conn)
822 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200823
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200824 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200825 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200826
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200827 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300828 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200829 err = __l2cap_wait_ack(sk);
830
831 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200832
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200833 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300834 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200835 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200836
837 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
838 err = bt_sock_wait_state(sk, BT_CLOSED,
839 sk->sk_lingertime);
840 }
841
842 if (!err && sk->sk_err)
843 err = -sk->sk_err;
844
845 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200846 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200847
848 if (conn)
849 mutex_unlock(&conn->chan_lock);
850
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200851 return err;
852}
853
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200854static int l2cap_sock_release(struct socket *sock)
855{
856 struct sock *sk = sock->sk;
857 int err;
858
859 BT_DBG("sock %p, sk %p", sock, sk);
860
861 if (!sk)
862 return 0;
863
864 err = l2cap_sock_shutdown(sock, 2);
865
866 sock_orphan(sk);
867 l2cap_sock_kill(sk);
868 return err;
869}
870
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300871static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
872{
873 struct sock *sk, *parent = data;
874
875 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
876 GFP_ATOMIC);
877 if (!sk)
878 return NULL;
879
Octavian Purdilad22015a2012-01-22 00:28:34 +0200880 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
881
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300882 l2cap_sock_init(sk, parent);
883
884 return l2cap_pi(sk)->chan;
885}
886
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300887static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
888{
Mat Martineaue3281402011-07-07 09:39:02 -0700889 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300890 struct sock *sk = data;
Mat Martineaue3281402011-07-07 09:39:02 -0700891 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300892
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200893 lock_sock(sk);
894
895 if (pi->rx_busy_skb) {
896 err = -ENOMEM;
897 goto done;
898 }
Mat Martineaue3281402011-07-07 09:39:02 -0700899
900 err = sock_queue_rcv_skb(sk, skb);
901
902 /* For ERTM, handle one skb that doesn't fit into the recv
903 * buffer. This is important to do because the data frames
904 * have already been acked, so the skb cannot be discarded.
905 *
906 * Notify the l2cap core that the buffer is full, so the
907 * LOCAL_BUSY state is entered and no more frames are
908 * acked and reassembled until there is buffer space
909 * available.
910 */
911 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
912 pi->rx_busy_skb = skb;
913 l2cap_chan_busy(pi->chan, 1);
914 err = 0;
915 }
916
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200917done:
918 release_sock(sk);
919
Mat Martineaue3281402011-07-07 09:39:02 -0700920 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300921}
922
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300923static void l2cap_sock_close_cb(void *data)
924{
925 struct sock *sk = data;
926
927 l2cap_sock_kill(sk);
928}
929
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300930static void l2cap_sock_state_change_cb(void *data, int state)
931{
932 struct sock *sk = data;
933
934 sk->sk_state = state;
935}
936
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200937static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -0300938 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200939{
Gustavo Padovan90338942012-04-06 20:15:47 -0300940 struct sk_buff *skb;
941 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200942
Mat Martineaua6a55682012-05-04 14:20:31 -0700943 l2cap_chan_unlock(chan);
Gustavo Padovan90338942012-04-06 20:15:47 -0300944 skb = bt_skb_send_alloc(chan->sk, len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -0700945 l2cap_chan_lock(chan);
946
Gustavo Padovan90338942012-04-06 20:15:47 -0300947 if (!skb)
948 return ERR_PTR(err);
949
950 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200951}
952
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300953static struct l2cap_ops l2cap_chan_ops = {
954 .name = "L2CAP Socket Interface",
955 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300956 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300957 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300958 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200959 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300960};
961
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200962static void l2cap_sock_destruct(struct sock *sk)
963{
964 BT_DBG("sk %p", sk);
965
Mat Martineau61d6ef32012-04-27 16:50:50 -0700966 l2cap_chan_put(l2cap_pi(sk)->chan);
Mat Martineaue3281402011-07-07 09:39:02 -0700967 if (l2cap_pi(sk)->rx_busy_skb) {
968 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
969 l2cap_pi(sk)->rx_busy_skb = NULL;
970 }
971
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200972 skb_queue_purge(&sk->sk_receive_queue);
973 skb_queue_purge(&sk->sk_write_queue);
974}
975
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300976static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200977{
978 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300979 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200980
981 BT_DBG("sk %p", sk);
982
983 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300984 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
985
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200986 sk->sk_type = parent->sk_type;
987 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
988
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300989 chan->chan_type = pchan->chan_type;
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;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +0200997 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300998 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300999 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +00001000
1001 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001002 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001003
1004 switch (sk->sk_type) {
1005 case SOCK_RAW:
1006 chan->chan_type = L2CAP_CHAN_RAW;
1007 break;
1008 case SOCK_DGRAM:
1009 chan->chan_type = L2CAP_CHAN_CONN_LESS;
1010 break;
1011 case SOCK_SEQPACKET:
1012 case SOCK_STREAM:
1013 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1014 break;
1015 }
1016
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001017 chan->imtu = L2CAP_DEFAULT_MTU;
1018 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001019 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001020 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001021 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001022 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001023 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001024 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001025
1026 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001027 }
1028
1029 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001030 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001031
1032 chan->data = sk;
1033 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001034}
1035
1036static struct proto l2cap_proto = {
1037 .name = "L2CAP",
1038 .owner = THIS_MODULE,
1039 .obj_size = sizeof(struct l2cap_pinfo)
1040};
1041
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001042static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001043{
1044 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001045 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001046
1047 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1048 if (!sk)
1049 return NULL;
1050
1051 sock_init_data(sock, sk);
1052 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1053
1054 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001055 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001056
1057 sock_reset_flag(sk, SOCK_ZAPPED);
1058
1059 sk->sk_protocol = proto;
1060 sk->sk_state = BT_OPEN;
1061
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001062 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001063 if (!chan) {
1064 l2cap_sock_kill(sk);
1065 return NULL;
1066 }
1067
Mat Martineau61d6ef32012-04-27 16:50:50 -07001068 l2cap_chan_hold(chan);
1069
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001070 chan->sk = sk;
1071
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001072 l2cap_pi(sk)->chan = chan;
1073
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001074 return sk;
1075}
1076
1077static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1078 int kern)
1079{
1080 struct sock *sk;
1081
1082 BT_DBG("sock %p", sock);
1083
1084 sock->state = SS_UNCONNECTED;
1085
1086 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1087 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1088 return -ESOCKTNOSUPPORT;
1089
1090 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1091 return -EPERM;
1092
1093 sock->ops = &l2cap_sock_ops;
1094
1095 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1096 if (!sk)
1097 return -ENOMEM;
1098
1099 l2cap_sock_init(sk, NULL);
1100 return 0;
1101}
1102
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001103static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001104 .family = PF_BLUETOOTH,
1105 .owner = THIS_MODULE,
1106 .release = l2cap_sock_release,
1107 .bind = l2cap_sock_bind,
1108 .connect = l2cap_sock_connect,
1109 .listen = l2cap_sock_listen,
1110 .accept = l2cap_sock_accept,
1111 .getname = l2cap_sock_getname,
1112 .sendmsg = l2cap_sock_sendmsg,
1113 .recvmsg = l2cap_sock_recvmsg,
1114 .poll = bt_sock_poll,
1115 .ioctl = bt_sock_ioctl,
1116 .mmap = sock_no_mmap,
1117 .socketpair = sock_no_socketpair,
1118 .shutdown = l2cap_sock_shutdown,
1119 .setsockopt = l2cap_sock_setsockopt,
1120 .getsockopt = l2cap_sock_getsockopt
1121};
1122
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001123static const struct net_proto_family l2cap_sock_family_ops = {
1124 .family = PF_BLUETOOTH,
1125 .owner = THIS_MODULE,
1126 .create = l2cap_sock_create,
1127};
1128
1129int __init l2cap_init_sockets(void)
1130{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001131 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001132
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001133 err = proto_register(&l2cap_proto, 0);
1134 if (err < 0)
1135 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001136
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001137 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1138 if (err < 0)
1139 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001140
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001141 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001142
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001143 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001144
1145error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001146 BT_ERR("L2CAP socket registration failed");
1147 proto_unregister(&l2cap_proto);
1148 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001149}
1150
1151void l2cap_cleanup_sockets(void)
1152{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001153 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1154 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001155
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001156 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001157}