blob: 1273fcbeec286ab224a6e9cb743ad95296454be1 [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)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030085 err = l2cap_add_scid(chan, la.l2_cid);
86 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
Gustavo F. Padovan03a00192011-12-09 04:48:17 -0200126 err = l2cap_chan_connect(chan, la.l2_psm, la.l2_cid, &la.l2_bdaddr);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200127 if (err)
128 goto done;
129
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200130 err = bt_sock_wait_state(sk, BT_CONNECTED,
131 sock_sndtimeo(sk, flags & O_NONBLOCK));
132done:
Gustavo F. Padovan03a00192011-12-09 04:48:17 -0200133 if (sock_owned_by_user(sk))
134 release_sock(sk);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200135 return err;
136}
137
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200138static int l2cap_sock_listen(struct socket *sock, int backlog)
139{
140 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300141 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200142 int err = 0;
143
144 BT_DBG("sk %p backlog %d", sk, backlog);
145
146 lock_sock(sk);
147
148 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
149 || sk->sk_state != BT_BOUND) {
150 err = -EBADFD;
151 goto done;
152 }
153
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300154 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200155 case L2CAP_MODE_BASIC:
156 break;
157 case L2CAP_MODE_ERTM:
158 case L2CAP_MODE_STREAMING:
159 if (!disable_ertm)
160 break;
161 /* fall through */
162 default:
163 err = -ENOTSUPP;
164 goto done;
165 }
166
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200167 sk->sk_max_ack_backlog = backlog;
168 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300169
170 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200171 sk->sk_state = BT_LISTEN;
172
173done:
174 release_sock(sk);
175 return err;
176}
177
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200178static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
179{
180 DECLARE_WAITQUEUE(wait, current);
181 struct sock *sk = sock->sk, *nsk;
182 long timeo;
183 int err = 0;
184
185 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
186
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200187 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
188
189 BT_DBG("sk %p timeo %ld", sk, timeo);
190
191 /* Wait for an incoming connection. (wake-one). */
192 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400193 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200194 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200195
196 if (sk->sk_state != BT_LISTEN) {
197 err = -EBADFD;
198 break;
199 }
200
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400201 nsk = bt_accept_dequeue(sk, newsock);
202 if (nsk)
203 break;
204
205 if (!timeo) {
206 err = -EAGAIN;
207 break;
208 }
209
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200210 if (signal_pending(current)) {
211 err = sock_intr_errno(timeo);
212 break;
213 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400214
215 release_sock(sk);
216 timeo = schedule_timeout(timeo);
217 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200218 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400219 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200220 remove_wait_queue(sk_sleep(sk), &wait);
221
222 if (err)
223 goto done;
224
225 newsock->state = SS_CONNECTED;
226
227 BT_DBG("new socket %p", nsk);
228
229done:
230 release_sock(sk);
231 return err;
232}
233
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200234static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
235{
236 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
237 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300238 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200239
240 BT_DBG("sock %p, sk %p", sock, sk);
241
242 addr->sa_family = AF_BLUETOOTH;
243 *len = sizeof(struct sockaddr_l2);
244
245 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300246 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200247 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300248 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200249 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300250 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200251 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300252 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200253 }
254
255 return 0;
256}
257
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200258static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
259{
260 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300261 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200262 struct l2cap_options opts;
263 struct l2cap_conninfo cinfo;
264 int len, err = 0;
265 u32 opt;
266
267 BT_DBG("sk %p", sk);
268
269 if (get_user(len, optlen))
270 return -EFAULT;
271
272 lock_sock(sk);
273
274 switch (optname) {
275 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300276 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300277 opts.imtu = chan->imtu;
278 opts.omtu = chan->omtu;
279 opts.flush_to = chan->flush_to;
280 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300281 opts.fcs = chan->fcs;
282 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300283 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200284
285 len = min_t(unsigned int, len, sizeof(opts));
286 if (copy_to_user(optval, (char *) &opts, len))
287 err = -EFAULT;
288
289 break;
290
291 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300292 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200293 case BT_SECURITY_LOW:
294 opt = L2CAP_LM_AUTH;
295 break;
296 case BT_SECURITY_MEDIUM:
297 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
298 break;
299 case BT_SECURITY_HIGH:
300 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
301 L2CAP_LM_SECURE;
302 break;
303 default:
304 opt = 0;
305 break;
306 }
307
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300308 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200309 opt |= L2CAP_LM_MASTER;
310
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300311 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200312 opt |= L2CAP_LM_RELIABLE;
313
314 if (put_user(opt, (u32 __user *) optval))
315 err = -EFAULT;
316 break;
317
318 case L2CAP_CONNINFO:
319 if (sk->sk_state != BT_CONNECTED &&
320 !(sk->sk_state == BT_CONNECT2 &&
321 bt_sk(sk)->defer_setup)) {
322 err = -ENOTCONN;
323 break;
324 }
325
Filip Palian8d03e972011-05-12 19:32:46 +0200326 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300327 cinfo.hci_handle = chan->conn->hcon->handle;
328 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200329
330 len = min_t(unsigned int, len, sizeof(cinfo));
331 if (copy_to_user(optval, (char *) &cinfo, len))
332 err = -EFAULT;
333
334 break;
335
336 default:
337 err = -ENOPROTOOPT;
338 break;
339 }
340
341 release_sock(sk);
342 return err;
343}
344
345static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
346{
347 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300348 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200349 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700350 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200351 int len, err = 0;
352
353 BT_DBG("sk %p", sk);
354
355 if (level == SOL_L2CAP)
356 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
357
358 if (level != SOL_BLUETOOTH)
359 return -ENOPROTOOPT;
360
361 if (get_user(len, optlen))
362 return -EFAULT;
363
364 lock_sock(sk);
365
366 switch (optname) {
367 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300368 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
369 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200370 err = -EINVAL;
371 break;
372 }
373
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300374 memset(&sec, 0, sizeof(sec));
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300375 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200376
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300377 if (sk->sk_state == BT_CONNECTED)
378 sec.key_size = chan->conn->hcon->enc_key_size;
379
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200380 len = min_t(unsigned int, len, sizeof(sec));
381 if (copy_to_user(optval, (char *) &sec, len))
382 err = -EFAULT;
383
384 break;
385
386 case BT_DEFER_SETUP:
387 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
388 err = -EINVAL;
389 break;
390 }
391
392 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
393 err = -EFAULT;
394
395 break;
396
397 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300398 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
399 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200400 err = -EFAULT;
401
402 break;
403
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700404 case BT_POWER:
405 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
406 && sk->sk_type != SOCK_RAW) {
407 err = -EINVAL;
408 break;
409 }
410
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300411 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700412
413 len = min_t(unsigned int, len, sizeof(pwr));
414 if (copy_to_user(optval, (char *) &pwr, len))
415 err = -EFAULT;
416
417 break;
418
Mat Martineau2ea66482011-11-02 16:18:30 -0700419 case BT_CHANNEL_POLICY:
420 if (!enable_hs) {
421 err = -ENOPROTOOPT;
422 break;
423 }
424
425 if (put_user(chan->chan_policy, (u32 __user *) optval))
426 err = -EFAULT;
427 break;
428
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200429 default:
430 err = -ENOPROTOOPT;
431 break;
432 }
433
434 release_sock(sk);
435 return err;
436}
437
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200438static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
439{
440 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300441 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200442 struct l2cap_options opts;
443 int len, err = 0;
444 u32 opt;
445
446 BT_DBG("sk %p", sk);
447
448 lock_sock(sk);
449
450 switch (optname) {
451 case L2CAP_OPTIONS:
452 if (sk->sk_state == BT_CONNECTED) {
453 err = -EINVAL;
454 break;
455 }
456
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300457 opts.imtu = chan->imtu;
458 opts.omtu = chan->omtu;
459 opts.flush_to = chan->flush_to;
460 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300461 opts.fcs = chan->fcs;
462 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300463 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200464
465 len = min_t(unsigned int, sizeof(opts), optlen);
466 if (copy_from_user((char *) &opts, optval, len)) {
467 err = -EFAULT;
468 break;
469 }
470
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300471 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200472 err = -EINVAL;
473 break;
474 }
475
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300476 chan->mode = opts.mode;
477 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200478 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300479 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200480 break;
481 case L2CAP_MODE_ERTM:
482 case L2CAP_MODE_STREAMING:
483 if (!disable_ertm)
484 break;
485 /* fall through */
486 default:
487 err = -EINVAL;
488 break;
489 }
490
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300491 chan->imtu = opts.imtu;
492 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300493 chan->fcs = opts.fcs;
494 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300495 chan->tx_win = opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200496 break;
497
498 case L2CAP_LM:
499 if (get_user(opt, (u32 __user *) optval)) {
500 err = -EFAULT;
501 break;
502 }
503
504 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300505 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200506 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300507 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200508 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300509 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200510
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300511 if (opt & L2CAP_LM_MASTER)
512 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
513 else
514 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300515
516 if (opt & L2CAP_LM_RELIABLE)
517 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
518 else
519 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200520 break;
521
522 default:
523 err = -ENOPROTOOPT;
524 break;
525 }
526
527 release_sock(sk);
528 return err;
529}
530
531static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
532{
533 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300534 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200535 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700536 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300537 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200538 int len, err = 0;
539 u32 opt;
540
541 BT_DBG("sk %p", sk);
542
543 if (level == SOL_L2CAP)
544 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
545
546 if (level != SOL_BLUETOOTH)
547 return -ENOPROTOOPT;
548
549 lock_sock(sk);
550
551 switch (optname) {
552 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300553 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
554 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200555 err = -EINVAL;
556 break;
557 }
558
559 sec.level = BT_SECURITY_LOW;
560
561 len = min_t(unsigned int, sizeof(sec), optlen);
562 if (copy_from_user((char *) &sec, optval, len)) {
563 err = -EFAULT;
564 break;
565 }
566
567 if (sec.level < BT_SECURITY_LOW ||
568 sec.level > BT_SECURITY_HIGH) {
569 err = -EINVAL;
570 break;
571 }
572
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300573 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300574
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200575 if (!chan->conn)
576 break;
577
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300578 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200579
580 /*change security for LE channels */
581 if (chan->scid == L2CAP_CID_LE_DATA) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300582 if (!conn->hcon->out) {
583 err = -EINVAL;
584 break;
585 }
586
587 if (smp_conn_security(conn, sec.level))
588 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300589 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200590 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200591
592 /* or for ACL link, under defer_setup time */
593 } else if (sk->sk_state == BT_CONNECT2 &&
594 bt_sk(sk)->defer_setup) {
595 err = l2cap_chan_check_security(chan);
596 } else {
597 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300598 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200599 break;
600
601 case BT_DEFER_SETUP:
602 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
603 err = -EINVAL;
604 break;
605 }
606
607 if (get_user(opt, (u32 __user *) optval)) {
608 err = -EFAULT;
609 break;
610 }
611
612 bt_sk(sk)->defer_setup = opt;
613 break;
614
615 case BT_FLUSHABLE:
616 if (get_user(opt, (u32 __user *) optval)) {
617 err = -EFAULT;
618 break;
619 }
620
621 if (opt > BT_FLUSHABLE_ON) {
622 err = -EINVAL;
623 break;
624 }
625
626 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300627 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300628 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200629 No Flush support in the LM */
630 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
631 err = -EINVAL;
632 break;
633 }
634 }
635
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300636 if (opt)
637 set_bit(FLAG_FLUSHABLE, &chan->flags);
638 else
639 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200640 break;
641
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700642 case BT_POWER:
643 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
644 chan->chan_type != L2CAP_CHAN_RAW) {
645 err = -EINVAL;
646 break;
647 }
648
649 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
650
651 len = min_t(unsigned int, sizeof(pwr), optlen);
652 if (copy_from_user((char *) &pwr, optval, len)) {
653 err = -EFAULT;
654 break;
655 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300656
657 if (pwr.force_active)
658 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
659 else
660 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700661 break;
662
Mat Martineau2ea66482011-11-02 16:18:30 -0700663 case BT_CHANNEL_POLICY:
664 if (!enable_hs) {
665 err = -ENOPROTOOPT;
666 break;
667 }
668
669 if (get_user(opt, (u32 __user *) optval)) {
670 err = -EFAULT;
671 break;
672 }
673
674 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
675 err = -EINVAL;
676 break;
677 }
678
679 if (chan->mode != L2CAP_MODE_ERTM &&
680 chan->mode != L2CAP_MODE_STREAMING) {
681 err = -EOPNOTSUPP;
682 break;
683 }
684
685 chan->chan_policy = (u8) opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200686 break;
687
688 default:
689 err = -ENOPROTOOPT;
690 break;
691 }
692
693 release_sock(sk);
694 return err;
695}
696
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200697static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
698{
699 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300700 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200701 int err;
702
703 BT_DBG("sock %p, sk %p", sock, sk);
704
705 err = sock_error(sk);
706 if (err)
707 return err;
708
709 if (msg->msg_flags & MSG_OOB)
710 return -EOPNOTSUPP;
711
712 lock_sock(sk);
713
714 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300715 release_sock(sk);
716 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200717 }
718
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200719 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200720
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200721 release_sock(sk);
722 return err;
723}
724
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200725static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
726{
727 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700728 struct l2cap_pinfo *pi = l2cap_pi(sk);
729 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200730
731 lock_sock(sk);
732
733 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300734 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200735 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300736
Mat Martineaue3281402011-07-07 09:39:02 -0700737 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200738 release_sock(sk);
739 return 0;
740 }
741
742 release_sock(sk);
743
744 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700745 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
746 else
747 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200748
Mat Martineaue3281402011-07-07 09:39:02 -0700749 if (pi->chan->mode != L2CAP_MODE_ERTM)
750 return err;
751
752 /* Attempt to put pending rx data in the socket buffer */
753
754 lock_sock(sk);
755
756 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
757 goto done;
758
759 if (pi->rx_busy_skb) {
760 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
761 pi->rx_busy_skb = NULL;
762 else
763 goto done;
764 }
765
766 /* Restore data flow when half of the receive buffer is
767 * available. This avoids resending large numbers of
768 * frames.
769 */
770 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
771 l2cap_chan_busy(pi->chan, 0);
772
773done:
774 release_sock(sk);
775 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200776}
777
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200778/* Kill socket (only if zapped and orphan)
779 * Must be called on unlocked socket.
780 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300781static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200782{
783 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
784 return;
785
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200786 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200787
788 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300789
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300790 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200791 sock_set_flag(sk, SOCK_DEAD);
792 sock_put(sk);
793}
794
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200795static int l2cap_sock_shutdown(struct socket *sock, int how)
796{
797 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200798 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200799 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200800 int err = 0;
801
802 BT_DBG("sock %p, sk %p", sock, sk);
803
804 if (!sk)
805 return 0;
806
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200807 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200808 conn = chan->conn;
809
810 if (conn)
811 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200812
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200813 lock_sock(sk);
814 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300815 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200816 err = __l2cap_wait_ack(sk);
817
818 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200819
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300820 l2cap_chan_close(chan, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200821
822 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
823 err = bt_sock_wait_state(sk, BT_CLOSED,
824 sk->sk_lingertime);
825 }
826
827 if (!err && sk->sk_err)
828 err = -sk->sk_err;
829
830 release_sock(sk);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200831
832 if (conn)
833 mutex_unlock(&conn->chan_lock);
834
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200835 return err;
836}
837
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200838static int l2cap_sock_release(struct socket *sock)
839{
840 struct sock *sk = sock->sk;
841 int err;
842
843 BT_DBG("sock %p, sk %p", sock, sk);
844
845 if (!sk)
846 return 0;
847
848 err = l2cap_sock_shutdown(sock, 2);
849
850 sock_orphan(sk);
851 l2cap_sock_kill(sk);
852 return err;
853}
854
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300855static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
856{
857 struct sock *sk, *parent = data;
858
859 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
860 GFP_ATOMIC);
861 if (!sk)
862 return NULL;
863
Octavian Purdilad22015a2012-01-22 00:28:34 +0200864 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
865
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300866 l2cap_sock_init(sk, parent);
867
868 return l2cap_pi(sk)->chan;
869}
870
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300871static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
872{
Mat Martineaue3281402011-07-07 09:39:02 -0700873 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300874 struct sock *sk = data;
Mat Martineaue3281402011-07-07 09:39:02 -0700875 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300876
Mat Martineaue3281402011-07-07 09:39:02 -0700877 if (pi->rx_busy_skb)
878 return -ENOMEM;
879
880 err = sock_queue_rcv_skb(sk, skb);
881
882 /* For ERTM, handle one skb that doesn't fit into the recv
883 * buffer. This is important to do because the data frames
884 * have already been acked, so the skb cannot be discarded.
885 *
886 * Notify the l2cap core that the buffer is full, so the
887 * LOCAL_BUSY state is entered and no more frames are
888 * acked and reassembled until there is buffer space
889 * available.
890 */
891 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
892 pi->rx_busy_skb = skb;
893 l2cap_chan_busy(pi->chan, 1);
894 err = 0;
895 }
896
897 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300898}
899
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300900static void l2cap_sock_close_cb(void *data)
901{
902 struct sock *sk = data;
903
904 l2cap_sock_kill(sk);
905}
906
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300907static void l2cap_sock_state_change_cb(void *data, int state)
908{
909 struct sock *sk = data;
910
911 sk->sk_state = state;
912}
913
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200914static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
915 unsigned long len, int nb, int *err)
916{
917 struct sock *sk = chan->sk;
918
919 return bt_skb_send_alloc(sk, len, nb, err);
920}
921
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300922static struct l2cap_ops l2cap_chan_ops = {
923 .name = "L2CAP Socket Interface",
924 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300925 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300926 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300927 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +0200928 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300929};
930
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200931static void l2cap_sock_destruct(struct sock *sk)
932{
933 BT_DBG("sk %p", sk);
934
Mat Martineaue3281402011-07-07 09:39:02 -0700935 if (l2cap_pi(sk)->rx_busy_skb) {
936 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
937 l2cap_pi(sk)->rx_busy_skb = NULL;
938 }
939
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200940 skb_queue_purge(&sk->sk_receive_queue);
941 skb_queue_purge(&sk->sk_write_queue);
942}
943
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300944static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200945{
946 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300947 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200948
949 BT_DBG("sk %p", sk);
950
951 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300952 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
953
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200954 sk->sk_type = parent->sk_type;
955 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
956
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300957 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300958 chan->imtu = pchan->imtu;
959 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300960 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300961 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300962 chan->fcs = pchan->fcs;
963 chan->max_tx = pchan->max_tx;
964 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +0200965 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300966 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300967 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000968
969 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200970 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300971
972 switch (sk->sk_type) {
973 case SOCK_RAW:
974 chan->chan_type = L2CAP_CHAN_RAW;
975 break;
976 case SOCK_DGRAM:
977 chan->chan_type = L2CAP_CHAN_CONN_LESS;
978 break;
979 case SOCK_SEQPACKET:
980 case SOCK_STREAM:
981 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
982 break;
983 }
984
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300985 chan->imtu = L2CAP_DEFAULT_MTU;
986 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200987 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300988 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300989 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200990 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300991 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200992 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300993 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
994 chan->fcs = L2CAP_FCS_CRC16;
995 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +0200996 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300997 chan->sec_level = BT_SECURITY_LOW;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300998 chan->flags = 0;
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300999 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001000 }
1001
1002 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001003 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001004
1005 chan->data = sk;
1006 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001007}
1008
1009static struct proto l2cap_proto = {
1010 .name = "L2CAP",
1011 .owner = THIS_MODULE,
1012 .obj_size = sizeof(struct l2cap_pinfo)
1013};
1014
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001015static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001016{
1017 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001018 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001019
1020 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1021 if (!sk)
1022 return NULL;
1023
1024 sock_init_data(sock, sk);
1025 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1026
1027 sk->sk_destruct = l2cap_sock_destruct;
Andrzej Kaczmarek6423cf32012-01-04 12:10:41 +01001028 sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001029
1030 sock_reset_flag(sk, SOCK_ZAPPED);
1031
1032 sk->sk_protocol = proto;
1033 sk->sk_state = BT_OPEN;
1034
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001035 chan = l2cap_chan_create(sk);
1036 if (!chan) {
1037 l2cap_sock_kill(sk);
1038 return NULL;
1039 }
1040
1041 l2cap_pi(sk)->chan = chan;
1042
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001043 return sk;
1044}
1045
1046static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1047 int kern)
1048{
1049 struct sock *sk;
1050
1051 BT_DBG("sock %p", sock);
1052
1053 sock->state = SS_UNCONNECTED;
1054
1055 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1056 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1057 return -ESOCKTNOSUPPORT;
1058
1059 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1060 return -EPERM;
1061
1062 sock->ops = &l2cap_sock_ops;
1063
1064 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1065 if (!sk)
1066 return -ENOMEM;
1067
1068 l2cap_sock_init(sk, NULL);
1069 return 0;
1070}
1071
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001072static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001073 .family = PF_BLUETOOTH,
1074 .owner = THIS_MODULE,
1075 .release = l2cap_sock_release,
1076 .bind = l2cap_sock_bind,
1077 .connect = l2cap_sock_connect,
1078 .listen = l2cap_sock_listen,
1079 .accept = l2cap_sock_accept,
1080 .getname = l2cap_sock_getname,
1081 .sendmsg = l2cap_sock_sendmsg,
1082 .recvmsg = l2cap_sock_recvmsg,
1083 .poll = bt_sock_poll,
1084 .ioctl = bt_sock_ioctl,
1085 .mmap = sock_no_mmap,
1086 .socketpair = sock_no_socketpair,
1087 .shutdown = l2cap_sock_shutdown,
1088 .setsockopt = l2cap_sock_setsockopt,
1089 .getsockopt = l2cap_sock_getsockopt
1090};
1091
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001092static const struct net_proto_family l2cap_sock_family_ops = {
1093 .family = PF_BLUETOOTH,
1094 .owner = THIS_MODULE,
1095 .create = l2cap_sock_create,
1096};
1097
1098int __init l2cap_init_sockets(void)
1099{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001100 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001101
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001102 err = proto_register(&l2cap_proto, 0);
1103 if (err < 0)
1104 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001105
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001106 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1107 if (err < 0)
1108 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001109
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001110 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001111
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001112 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001113
1114error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001115 BT_ERR("L2CAP socket registration failed");
1116 proto_unregister(&l2cap_proto);
1117 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001118}
1119
1120void l2cap_cleanup_sockets(void)
1121{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001122 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1123 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001124
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001125 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001126}