blob: 2b5e7e81c3c04ab7e1c90503b47609064549b1ad [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
599 /* or for ACL link, under defer_setup time */
600 } else if (sk->sk_state == BT_CONNECT2 &&
601 bt_sk(sk)->defer_setup) {
602 err = l2cap_chan_check_security(chan);
603 } else {
604 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300605 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200606 break;
607
608 case BT_DEFER_SETUP:
609 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
610 err = -EINVAL;
611 break;
612 }
613
614 if (get_user(opt, (u32 __user *) optval)) {
615 err = -EFAULT;
616 break;
617 }
618
619 bt_sk(sk)->defer_setup = opt;
620 break;
621
622 case BT_FLUSHABLE:
623 if (get_user(opt, (u32 __user *) optval)) {
624 err = -EFAULT;
625 break;
626 }
627
628 if (opt > BT_FLUSHABLE_ON) {
629 err = -EINVAL;
630 break;
631 }
632
633 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300634 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300635 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200636 No Flush support in the LM */
637 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
638 err = -EINVAL;
639 break;
640 }
641 }
642
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300643 if (opt)
644 set_bit(FLAG_FLUSHABLE, &chan->flags);
645 else
646 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200647 break;
648
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700649 case BT_POWER:
650 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
651 chan->chan_type != L2CAP_CHAN_RAW) {
652 err = -EINVAL;
653 break;
654 }
655
656 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
657
658 len = min_t(unsigned int, sizeof(pwr), optlen);
659 if (copy_from_user((char *) &pwr, optval, len)) {
660 err = -EFAULT;
661 break;
662 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300663
664 if (pwr.force_active)
665 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
666 else
667 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700668 break;
669
Mat Martineau2ea66482011-11-02 16:18:30 -0700670 case BT_CHANNEL_POLICY:
671 if (!enable_hs) {
672 err = -ENOPROTOOPT;
673 break;
674 }
675
676 if (get_user(opt, (u32 __user *) optval)) {
677 err = -EFAULT;
678 break;
679 }
680
681 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
682 err = -EINVAL;
683 break;
684 }
685
686 if (chan->mode != L2CAP_MODE_ERTM &&
687 chan->mode != L2CAP_MODE_STREAMING) {
688 err = -EOPNOTSUPP;
689 break;
690 }
691
692 chan->chan_policy = (u8) opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200693 break;
694
695 default:
696 err = -ENOPROTOOPT;
697 break;
698 }
699
700 release_sock(sk);
701 return err;
702}
703
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200704static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
705{
706 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300707 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200708 int err;
709
710 BT_DBG("sock %p, sk %p", sock, sk);
711
712 err = sock_error(sk);
713 if (err)
714 return err;
715
716 if (msg->msg_flags & MSG_OOB)
717 return -EOPNOTSUPP;
718
719 lock_sock(sk);
720
721 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300722 release_sock(sk);
723 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200724 }
725
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200726 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200727
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200728 release_sock(sk);
729 return err;
730}
731
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200732static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
733{
734 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700735 struct l2cap_pinfo *pi = l2cap_pi(sk);
736 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200737
738 lock_sock(sk);
739
740 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300741 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200742 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300743
Mat Martineaue3281402011-07-07 09:39:02 -0700744 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200745 release_sock(sk);
746 return 0;
747 }
748
749 release_sock(sk);
750
751 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700752 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
753 else
754 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200755
Mat Martineaue3281402011-07-07 09:39:02 -0700756 if (pi->chan->mode != L2CAP_MODE_ERTM)
757 return err;
758
759 /* Attempt to put pending rx data in the socket buffer */
760
761 lock_sock(sk);
762
763 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
764 goto done;
765
766 if (pi->rx_busy_skb) {
767 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
768 pi->rx_busy_skb = NULL;
769 else
770 goto done;
771 }
772
773 /* Restore data flow when half of the receive buffer is
774 * available. This avoids resending large numbers of
775 * frames.
776 */
777 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
778 l2cap_chan_busy(pi->chan, 0);
779
780done:
781 release_sock(sk);
782 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200783}
784
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200785/* Kill socket (only if zapped and orphan)
786 * Must be called on unlocked socket.
787 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300788static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200789{
790 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
791 return;
792
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200793 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200794
795 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300796
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300797 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200798 sock_set_flag(sk, SOCK_DEAD);
799 sock_put(sk);
800}
801
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200802static int l2cap_sock_shutdown(struct socket *sock, int how)
803{
804 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200805 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200806 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200807 int err = 0;
808
809 BT_DBG("sock %p, sk %p", sock, sk);
810
811 if (!sk)
812 return 0;
813
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200814 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200815 conn = chan->conn;
816
817 if (conn)
818 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200819
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200820 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200821 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200822
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200823 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300824 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200825 err = __l2cap_wait_ack(sk);
826
827 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200828
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200829 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300830 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200831 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200832
833 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
834 err = bt_sock_wait_state(sk, BT_CLOSED,
835 sk->sk_lingertime);
836 }
837
838 if (!err && sk->sk_err)
839 err = -sk->sk_err;
840
841 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200842 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200843
844 if (conn)
845 mutex_unlock(&conn->chan_lock);
846
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200847 return err;
848}
849
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200850static int l2cap_sock_release(struct socket *sock)
851{
852 struct sock *sk = sock->sk;
853 int err;
854
855 BT_DBG("sock %p, sk %p", sock, sk);
856
857 if (!sk)
858 return 0;
859
860 err = l2cap_sock_shutdown(sock, 2);
861
862 sock_orphan(sk);
863 l2cap_sock_kill(sk);
864 return err;
865}
866
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300867static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
868{
869 struct sock *sk, *parent = data;
870
871 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
872 GFP_ATOMIC);
873 if (!sk)
874 return NULL;
875
Octavian Purdilad22015a2012-01-22 00:28:34 +0200876 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
877
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300878 l2cap_sock_init(sk, parent);
879
880 return l2cap_pi(sk)->chan;
881}
882
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300883static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
884{
Mat Martineaue3281402011-07-07 09:39:02 -0700885 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300886 struct sock *sk = data;
Mat Martineaue3281402011-07-07 09:39:02 -0700887 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300888
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200889 lock_sock(sk);
890
891 if (pi->rx_busy_skb) {
892 err = -ENOMEM;
893 goto done;
894 }
Mat Martineaue3281402011-07-07 09:39:02 -0700895
896 err = sock_queue_rcv_skb(sk, skb);
897
898 /* For ERTM, handle one skb that doesn't fit into the recv
899 * buffer. This is important to do because the data frames
900 * have already been acked, so the skb cannot be discarded.
901 *
902 * Notify the l2cap core that the buffer is full, so the
903 * LOCAL_BUSY state is entered and no more frames are
904 * acked and reassembled until there is buffer space
905 * available.
906 */
907 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
908 pi->rx_busy_skb = skb;
909 l2cap_chan_busy(pi->chan, 1);
910 err = 0;
911 }
912
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200913done:
914 release_sock(sk);
915
Mat Martineaue3281402011-07-07 09:39:02 -0700916 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300917}
918
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300919static void l2cap_sock_close_cb(void *data)
920{
921 struct sock *sk = data;
922
923 l2cap_sock_kill(sk);
924}
925
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300926static void l2cap_sock_state_change_cb(void *data, int state)
927{
928 struct sock *sk = data;
929
930 sk->sk_state = state;
931}
932
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200933static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -0300934 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200935{
Gustavo Padovan90338942012-04-06 20:15:47 -0300936 struct sk_buff *skb;
937 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200938
Gustavo Padovan90338942012-04-06 20:15:47 -0300939 skb = bt_skb_send_alloc(chan->sk, len, nb, &err);
940 if (!skb)
941 return ERR_PTR(err);
942
943 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200944}
945
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300946static struct l2cap_ops l2cap_chan_ops = {
947 .name = "L2CAP Socket Interface",
948 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300949 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300950 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300951 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200952 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300953};
954
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200955static void l2cap_sock_destruct(struct sock *sk)
956{
957 BT_DBG("sk %p", sk);
958
Mat Martineaue3281402011-07-07 09:39:02 -0700959 if (l2cap_pi(sk)->rx_busy_skb) {
960 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
961 l2cap_pi(sk)->rx_busy_skb = NULL;
962 }
963
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200964 skb_queue_purge(&sk->sk_receive_queue);
965 skb_queue_purge(&sk->sk_write_queue);
966}
967
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300968static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200969{
970 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300971 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200972
973 BT_DBG("sk %p", sk);
974
975 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300976 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
977
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200978 sk->sk_type = parent->sk_type;
979 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
980
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300981 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300982 chan->imtu = pchan->imtu;
983 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300984 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300985 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300986 chan->fcs = pchan->fcs;
987 chan->max_tx = pchan->max_tx;
988 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +0200989 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300990 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300991 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000992
993 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200994 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300995
996 switch (sk->sk_type) {
997 case SOCK_RAW:
998 chan->chan_type = L2CAP_CHAN_RAW;
999 break;
1000 case SOCK_DGRAM:
1001 chan->chan_type = L2CAP_CHAN_CONN_LESS;
1002 break;
1003 case SOCK_SEQPACKET:
1004 case SOCK_STREAM:
1005 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1006 break;
1007 }
1008
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001009 chan->imtu = L2CAP_DEFAULT_MTU;
1010 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001011 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001012 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001013 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001014 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001015 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001016 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001017
1018 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001019 }
1020
1021 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001022 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001023
1024 chan->data = sk;
1025 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001026}
1027
1028static struct proto l2cap_proto = {
1029 .name = "L2CAP",
1030 .owner = THIS_MODULE,
1031 .obj_size = sizeof(struct l2cap_pinfo)
1032};
1033
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001034static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001035{
1036 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001037 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001038
1039 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1040 if (!sk)
1041 return NULL;
1042
1043 sock_init_data(sock, sk);
1044 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1045
1046 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001047 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001048
1049 sock_reset_flag(sk, SOCK_ZAPPED);
1050
1051 sk->sk_protocol = proto;
1052 sk->sk_state = BT_OPEN;
1053
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001054 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001055 if (!chan) {
1056 l2cap_sock_kill(sk);
1057 return NULL;
1058 }
1059
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001060 chan->sk = sk;
1061
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001062 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}