blob: 4a26348444bda4564d66ff9c4cb47ad842616167 [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),
127 &la.l2_bdaddr);
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
151 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
152 || sk->sk_state != BT_BOUND) {
153 err = -EBADFD;
154 goto done;
155 }
156
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300157 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200158 case L2CAP_MODE_BASIC:
159 break;
160 case L2CAP_MODE_ERTM:
161 case L2CAP_MODE_STREAMING:
162 if (!disable_ertm)
163 break;
164 /* fall through */
165 default:
166 err = -ENOTSUPP;
167 goto done;
168 }
169
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200170 sk->sk_max_ack_backlog = backlog;
171 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300172
173 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200174 sk->sk_state = BT_LISTEN;
175
176done:
177 release_sock(sk);
178 return err;
179}
180
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200181static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
182{
183 DECLARE_WAITQUEUE(wait, current);
184 struct sock *sk = sock->sk, *nsk;
185 long timeo;
186 int err = 0;
187
188 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
189
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200190 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
191
192 BT_DBG("sk %p timeo %ld", sk, timeo);
193
194 /* Wait for an incoming connection. (wake-one). */
195 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400196 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200197 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200198
199 if (sk->sk_state != BT_LISTEN) {
200 err = -EBADFD;
201 break;
202 }
203
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400204 nsk = bt_accept_dequeue(sk, newsock);
205 if (nsk)
206 break;
207
208 if (!timeo) {
209 err = -EAGAIN;
210 break;
211 }
212
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200213 if (signal_pending(current)) {
214 err = sock_intr_errno(timeo);
215 break;
216 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400217
218 release_sock(sk);
219 timeo = schedule_timeout(timeo);
220 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200221 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400222 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200223 remove_wait_queue(sk_sleep(sk), &wait);
224
225 if (err)
226 goto done;
227
228 newsock->state = SS_CONNECTED;
229
230 BT_DBG("new socket %p", nsk);
231
232done:
233 release_sock(sk);
234 return err;
235}
236
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200237static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
238{
239 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
240 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300241 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200242
243 BT_DBG("sock %p, sk %p", sock, sk);
244
Mathias Krausedbcba7a2012-08-15 11:31:51 +0000245 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200246 addr->sa_family = AF_BLUETOOTH;
247 *len = sizeof(struct sockaddr_l2);
248
249 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300250 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200251 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300252 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200253 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300254 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200255 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300256 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200257 }
258
259 return 0;
260}
261
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200262static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
263{
264 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300265 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200266 struct l2cap_options opts;
267 struct l2cap_conninfo cinfo;
268 int len, err = 0;
269 u32 opt;
270
271 BT_DBG("sk %p", sk);
272
273 if (get_user(len, optlen))
274 return -EFAULT;
275
276 lock_sock(sk);
277
278 switch (optname) {
279 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300280 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300281 opts.imtu = chan->imtu;
282 opts.omtu = chan->omtu;
283 opts.flush_to = chan->flush_to;
284 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300285 opts.fcs = chan->fcs;
286 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300287 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200288
289 len = min_t(unsigned int, len, sizeof(opts));
290 if (copy_to_user(optval, (char *) &opts, len))
291 err = -EFAULT;
292
293 break;
294
295 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300296 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200297 case BT_SECURITY_LOW:
298 opt = L2CAP_LM_AUTH;
299 break;
300 case BT_SECURITY_MEDIUM:
301 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
302 break;
303 case BT_SECURITY_HIGH:
304 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
305 L2CAP_LM_SECURE;
306 break;
307 default:
308 opt = 0;
309 break;
310 }
311
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300312 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200313 opt |= L2CAP_LM_MASTER;
314
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300315 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200316 opt |= L2CAP_LM_RELIABLE;
317
318 if (put_user(opt, (u32 __user *) optval))
319 err = -EFAULT;
320 break;
321
322 case L2CAP_CONNINFO:
323 if (sk->sk_state != BT_CONNECTED &&
324 !(sk->sk_state == BT_CONNECT2 &&
325 bt_sk(sk)->defer_setup)) {
326 err = -ENOTCONN;
327 break;
328 }
329
Filip Palian8d03e972011-05-12 19:32:46 +0200330 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300331 cinfo.hci_handle = chan->conn->hcon->handle;
332 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200333
334 len = min_t(unsigned int, len, sizeof(cinfo));
335 if (copy_to_user(optval, (char *) &cinfo, len))
336 err = -EFAULT;
337
338 break;
339
340 default:
341 err = -ENOPROTOOPT;
342 break;
343 }
344
345 release_sock(sk);
346 return err;
347}
348
349static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
350{
351 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300352 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200353 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700354 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200355 int len, err = 0;
356
357 BT_DBG("sk %p", sk);
358
359 if (level == SOL_L2CAP)
360 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
361
362 if (level != SOL_BLUETOOTH)
363 return -ENOPROTOOPT;
364
365 if (get_user(len, optlen))
366 return -EFAULT;
367
368 lock_sock(sk);
369
370 switch (optname) {
371 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300372 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
373 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200374 err = -EINVAL;
375 break;
376 }
377
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300378 memset(&sec, 0, sizeof(sec));
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300379 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200380
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300381 if (sk->sk_state == BT_CONNECTED)
382 sec.key_size = chan->conn->hcon->enc_key_size;
383
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200384 len = min_t(unsigned int, len, sizeof(sec));
385 if (copy_to_user(optval, (char *) &sec, len))
386 err = -EFAULT;
387
388 break;
389
390 case BT_DEFER_SETUP:
391 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
392 err = -EINVAL;
393 break;
394 }
395
396 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
397 err = -EFAULT;
398
399 break;
400
401 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300402 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
403 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200404 err = -EFAULT;
405
406 break;
407
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700408 case BT_POWER:
409 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
410 && sk->sk_type != SOCK_RAW) {
411 err = -EINVAL;
412 break;
413 }
414
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300415 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700416
417 len = min_t(unsigned int, len, sizeof(pwr));
418 if (copy_to_user(optval, (char *) &pwr, len))
419 err = -EFAULT;
420
421 break;
422
Mat Martineau2ea66482011-11-02 16:18:30 -0700423 case BT_CHANNEL_POLICY:
424 if (!enable_hs) {
425 err = -ENOPROTOOPT;
426 break;
427 }
428
429 if (put_user(chan->chan_policy, (u32 __user *) optval))
430 err = -EFAULT;
431 break;
432
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200433 default:
434 err = -ENOPROTOOPT;
435 break;
436 }
437
438 release_sock(sk);
439 return err;
440}
441
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200442static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
443{
444 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300445 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200446 struct l2cap_options opts;
447 int len, err = 0;
448 u32 opt;
449
450 BT_DBG("sk %p", sk);
451
452 lock_sock(sk);
453
454 switch (optname) {
455 case L2CAP_OPTIONS:
456 if (sk->sk_state == BT_CONNECTED) {
457 err = -EINVAL;
458 break;
459 }
460
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300461 opts.imtu = chan->imtu;
462 opts.omtu = chan->omtu;
463 opts.flush_to = chan->flush_to;
464 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300465 opts.fcs = chan->fcs;
466 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300467 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200468
469 len = min_t(unsigned int, sizeof(opts), optlen);
470 if (copy_from_user((char *) &opts, optval, len)) {
471 err = -EFAULT;
472 break;
473 }
474
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300475 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200476 err = -EINVAL;
477 break;
478 }
479
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300480 chan->mode = opts.mode;
481 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200482 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300483 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200484 break;
485 case L2CAP_MODE_ERTM:
486 case L2CAP_MODE_STREAMING:
487 if (!disable_ertm)
488 break;
489 /* fall through */
490 default:
491 err = -EINVAL;
492 break;
493 }
494
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300495 chan->imtu = opts.imtu;
496 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300497 chan->fcs = opts.fcs;
498 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300499 chan->tx_win = opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200500 break;
501
502 case L2CAP_LM:
503 if (get_user(opt, (u32 __user *) optval)) {
504 err = -EFAULT;
505 break;
506 }
507
508 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300509 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200510 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300511 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200512 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300513 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200514
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300515 if (opt & L2CAP_LM_MASTER)
516 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
517 else
518 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300519
520 if (opt & L2CAP_LM_RELIABLE)
521 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
522 else
523 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200524 break;
525
526 default:
527 err = -ENOPROTOOPT;
528 break;
529 }
530
531 release_sock(sk);
532 return err;
533}
534
535static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
536{
537 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300538 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200539 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700540 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300541 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200542 int len, err = 0;
543 u32 opt;
544
545 BT_DBG("sk %p", sk);
546
547 if (level == SOL_L2CAP)
548 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
549
550 if (level != SOL_BLUETOOTH)
551 return -ENOPROTOOPT;
552
553 lock_sock(sk);
554
555 switch (optname) {
556 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300557 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
558 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200559 err = -EINVAL;
560 break;
561 }
562
563 sec.level = BT_SECURITY_LOW;
564
565 len = min_t(unsigned int, sizeof(sec), optlen);
566 if (copy_from_user((char *) &sec, optval, len)) {
567 err = -EFAULT;
568 break;
569 }
570
571 if (sec.level < BT_SECURITY_LOW ||
572 sec.level > BT_SECURITY_HIGH) {
573 err = -EINVAL;
574 break;
575 }
576
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300577 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300578
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200579 if (!chan->conn)
580 break;
581
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300582 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200583
584 /*change security for LE channels */
585 if (chan->scid == L2CAP_CID_LE_DATA) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300586 if (!conn->hcon->out) {
587 err = -EINVAL;
588 break;
589 }
590
Vinicius Costa Gomes0fcc0802012-08-23 21:32:43 -0300591 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300592 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300593 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b852011-12-28 13:54:17 -0200594 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200595
Gustavo Padovana7d77232012-05-13 03:20:07 -0300596 /* or for ACL link */
597 } else if ((sk->sk_state == BT_CONNECT2 &&
598 bt_sk(sk)->defer_setup) ||
599 sk->sk_state == BT_CONNECTED) {
600 if (!l2cap_chan_check_security(chan))
601 bt_sk(sk)->suspended = true;
602 else
603 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200604 } else {
605 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300606 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200607 break;
608
609 case BT_DEFER_SETUP:
610 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
611 err = -EINVAL;
612 break;
613 }
614
615 if (get_user(opt, (u32 __user *) optval)) {
616 err = -EFAULT;
617 break;
618 }
619
620 bt_sk(sk)->defer_setup = opt;
621 break;
622
623 case BT_FLUSHABLE:
624 if (get_user(opt, (u32 __user *) optval)) {
625 err = -EFAULT;
626 break;
627 }
628
629 if (opt > BT_FLUSHABLE_ON) {
630 err = -EINVAL;
631 break;
632 }
633
634 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300635 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300636 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200637 No Flush support in the LM */
638 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
639 err = -EINVAL;
640 break;
641 }
642 }
643
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300644 if (opt)
645 set_bit(FLAG_FLUSHABLE, &chan->flags);
646 else
647 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200648 break;
649
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700650 case BT_POWER:
651 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
652 chan->chan_type != L2CAP_CHAN_RAW) {
653 err = -EINVAL;
654 break;
655 }
656
657 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
658
659 len = min_t(unsigned int, sizeof(pwr), optlen);
660 if (copy_from_user((char *) &pwr, optval, len)) {
661 err = -EFAULT;
662 break;
663 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300664
665 if (pwr.force_active)
666 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
667 else
668 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700669 break;
670
Mat Martineau2ea66482011-11-02 16:18:30 -0700671 case BT_CHANNEL_POLICY:
672 if (!enable_hs) {
673 err = -ENOPROTOOPT;
674 break;
675 }
676
677 if (get_user(opt, (u32 __user *) optval)) {
678 err = -EFAULT;
679 break;
680 }
681
682 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
683 err = -EINVAL;
684 break;
685 }
686
687 if (chan->mode != L2CAP_MODE_ERTM &&
688 chan->mode != L2CAP_MODE_STREAMING) {
689 err = -EOPNOTSUPP;
690 break;
691 }
692
693 chan->chan_policy = (u8) opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200694 break;
695
696 default:
697 err = -ENOPROTOOPT;
698 break;
699 }
700
701 release_sock(sk);
702 return err;
703}
704
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200705static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
706{
707 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300708 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200709 int err;
710
711 BT_DBG("sock %p, sk %p", sock, sk);
712
713 err = sock_error(sk);
714 if (err)
715 return err;
716
717 if (msg->msg_flags & MSG_OOB)
718 return -EOPNOTSUPP;
719
720 lock_sock(sk);
721
722 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300723 release_sock(sk);
724 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200725 }
726
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200727 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200728
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200729 release_sock(sk);
730 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. Padovan3542b852011-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 F. Padovan04124682012-03-08 01:25:00 -0300935 unsigned long len, int nb,
936 int *err)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200937{
938 struct sock *sk = chan->sk;
939
940 return bt_skb_send_alloc(sk, len, nb, err);
941}
942
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300943static struct l2cap_ops l2cap_chan_ops = {
944 .name = "L2CAP Socket Interface",
945 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300946 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300947 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300948 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200949 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300950};
951
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200952static void l2cap_sock_destruct(struct sock *sk)
953{
954 BT_DBG("sk %p", sk);
955
Mat Martineaue3281402011-07-07 09:39:02 -0700956 if (l2cap_pi(sk)->rx_busy_skb) {
957 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
958 l2cap_pi(sk)->rx_busy_skb = NULL;
959 }
960
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200961 skb_queue_purge(&sk->sk_receive_queue);
962 skb_queue_purge(&sk->sk_write_queue);
963}
964
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300965static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200966{
967 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300968 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200969
970 BT_DBG("sk %p", sk);
971
972 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300973 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
974
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200975 sk->sk_type = parent->sk_type;
976 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
977
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300978 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300979 chan->imtu = pchan->imtu;
980 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300981 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300982 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300983 chan->fcs = pchan->fcs;
984 chan->max_tx = pchan->max_tx;
985 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +0200986 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300987 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300988 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000989
990 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200991 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300992
993 switch (sk->sk_type) {
994 case SOCK_RAW:
995 chan->chan_type = L2CAP_CHAN_RAW;
996 break;
997 case SOCK_DGRAM:
998 chan->chan_type = L2CAP_CHAN_CONN_LESS;
999 break;
1000 case SOCK_SEQPACKET:
1001 case SOCK_STREAM:
1002 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1003 break;
1004 }
1005
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001006 chan->imtu = L2CAP_DEFAULT_MTU;
1007 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001008 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001009 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001010 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001011 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001012 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001013 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001014 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
1015 chan->fcs = L2CAP_FCS_CRC16;
1016 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001017 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001018 chan->sec_level = BT_SECURITY_LOW;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001019 chan->flags = 0;
Andrei Emeltchenko15770b12011-10-11 14:04:33 +03001020 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001021 }
1022
1023 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001024 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001025
1026 chan->data = sk;
1027 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001028}
1029
1030static struct proto l2cap_proto = {
1031 .name = "L2CAP",
1032 .owner = THIS_MODULE,
1033 .obj_size = sizeof(struct l2cap_pinfo)
1034};
1035
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001036static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001037{
1038 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001039 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001040
1041 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1042 if (!sk)
1043 return NULL;
1044
1045 sock_init_data(sock, sk);
1046 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1047
1048 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001049 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001050
1051 sock_reset_flag(sk, SOCK_ZAPPED);
1052
1053 sk->sk_protocol = proto;
1054 sk->sk_state = BT_OPEN;
1055
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001056 chan = l2cap_chan_create(sk);
1057 if (!chan) {
1058 l2cap_sock_kill(sk);
1059 return NULL;
1060 }
1061
1062 l2cap_pi(sk)->chan = chan;
1063
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001064 return sk;
1065}
1066
1067static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1068 int kern)
1069{
1070 struct sock *sk;
1071
1072 BT_DBG("sock %p", sock);
1073
1074 sock->state = SS_UNCONNECTED;
1075
1076 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1077 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1078 return -ESOCKTNOSUPPORT;
1079
1080 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1081 return -EPERM;
1082
1083 sock->ops = &l2cap_sock_ops;
1084
1085 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1086 if (!sk)
1087 return -ENOMEM;
1088
1089 l2cap_sock_init(sk, NULL);
1090 return 0;
1091}
1092
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001093static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001094 .family = PF_BLUETOOTH,
1095 .owner = THIS_MODULE,
1096 .release = l2cap_sock_release,
1097 .bind = l2cap_sock_bind,
1098 .connect = l2cap_sock_connect,
1099 .listen = l2cap_sock_listen,
1100 .accept = l2cap_sock_accept,
1101 .getname = l2cap_sock_getname,
1102 .sendmsg = l2cap_sock_sendmsg,
1103 .recvmsg = l2cap_sock_recvmsg,
1104 .poll = bt_sock_poll,
1105 .ioctl = bt_sock_ioctl,
1106 .mmap = sock_no_mmap,
1107 .socketpair = sock_no_socketpair,
1108 .shutdown = l2cap_sock_shutdown,
1109 .setsockopt = l2cap_sock_setsockopt,
1110 .getsockopt = l2cap_sock_getsockopt
1111};
1112
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001113static const struct net_proto_family l2cap_sock_family_ops = {
1114 .family = PF_BLUETOOTH,
1115 .owner = THIS_MODULE,
1116 .create = l2cap_sock_create,
1117};
1118
1119int __init l2cap_init_sockets(void)
1120{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001121 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001122
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001123 err = proto_register(&l2cap_proto, 0);
1124 if (err < 0)
1125 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001126
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001127 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1128 if (err < 0)
1129 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001130
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001131 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001132
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001133 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001134
1135error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001136 BT_ERR("L2CAP socket registration failed");
1137 proto_unregister(&l2cap_proto);
1138 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001139}
1140
1141void l2cap_cleanup_sockets(void)
1142{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001143 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1144 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001145
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001146 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001147}