blob: 567b585d9805f2232114bc8ff2c49301e53890e1 [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.
6
7 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 2 as
11 published by the Free Software Foundation;
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
16 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
17 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
18 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21
22 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
23 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
24 SOFTWARE IS DISCLAIMED.
25*/
26
27/* Bluetooth L2CAP sockets. */
28
Paul Moore6230c9b2011-10-07 09:40:59 +000029#include <linux/security.h>
30
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020031#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020032#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020033#include <net/bluetooth/l2cap.h>
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -030034#include <net/bluetooth/smp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020035
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030036static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030037static void l2cap_sock_init(struct sock *sk, struct sock *parent);
38static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030039
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020040static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
41{
42 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030043 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020044 struct sockaddr_l2 la;
45 int len, err = 0;
46
47 BT_DBG("sk %p", sk);
48
49 if (!addr || addr->sa_family != AF_BLUETOOTH)
50 return -EINVAL;
51
52 memset(&la, 0, sizeof(la));
53 len = min_t(unsigned int, sizeof(la), alen);
54 memcpy(&la, addr, len);
55
Ville Tervob62f3282011-02-10 22:38:50 -030056 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020057 return -EINVAL;
58
59 lock_sock(sk);
60
61 if (sk->sk_state != BT_OPEN) {
62 err = -EBADFD;
63 goto done;
64 }
65
66 if (la.l2_psm) {
67 __u16 psm = __le16_to_cpu(la.l2_psm);
68
69 /* PSM must be odd and lsb of upper byte must be 0 */
70 if ((psm & 0x0101) != 0x0001) {
71 err = -EINVAL;
72 goto done;
73 }
74
75 /* Restrict usage of well-known PSMs */
76 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
77 err = -EACCES;
78 goto done;
79 }
80 }
81
Ville Tervob62f3282011-02-10 22:38:50 -030082 if (la.l2_cid)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030083 err = l2cap_add_scid(chan, la.l2_cid);
84 else
85 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030086
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030087 if (err < 0)
88 goto done;
89
90 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
91 __le16_to_cpu(la.l2_psm) == 0x0003)
92 chan->sec_level = BT_SECURITY_SDP;
93
94 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -030095
96 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030097 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020098
99done:
100 release_sock(sk);
101 return err;
102}
103
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200104static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
105{
106 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300107 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200108 struct sockaddr_l2 la;
109 int len, err = 0;
110
111 BT_DBG("sk %p", sk);
112
113 if (!addr || alen < sizeof(addr->sa_family) ||
114 addr->sa_family != AF_BLUETOOTH)
115 return -EINVAL;
116
117 memset(&la, 0, sizeof(la));
118 len = min_t(unsigned int, sizeof(la), alen);
119 memcpy(&la, addr, len);
120
Ville Tervoacd7d372011-02-10 22:38:49 -0300121 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200122 return -EINVAL;
123
124 lock_sock(sk);
125
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300126 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED
Ville Tervoacd7d372011-02-10 22:38:49 -0300127 && !(la.l2_psm || la.l2_cid)) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200128 err = -EINVAL;
129 goto done;
130 }
131
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300132 switch (chan->mode) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200133 case L2CAP_MODE_BASIC:
134 break;
135 case L2CAP_MODE_ERTM:
136 case L2CAP_MODE_STREAMING:
137 if (!disable_ertm)
138 break;
139 /* fall through */
140 default:
141 err = -ENOTSUPP;
142 goto done;
143 }
144
145 switch (sk->sk_state) {
146 case BT_CONNECT:
147 case BT_CONNECT2:
148 case BT_CONFIG:
149 /* Already connecting */
150 goto wait;
151
152 case BT_CONNECTED:
153 /* Already connected */
154 err = -EISCONN;
155 goto done;
156
157 case BT_OPEN:
158 case BT_BOUND:
159 /* Can connect */
160 break;
161
162 default:
163 err = -EBADFD;
164 goto done;
165 }
166
167 /* PSM must be odd and lsb of upper byte must be 0 */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300168 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid &&
169 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200170 err = -EINVAL;
171 goto done;
172 }
173
174 /* Set destination address and psm */
175 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300176 chan->psm = la.l2_psm;
177 chan->dcid = la.l2_cid;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200178
Gustavo F. Padovan77a74c72011-04-12 18:17:14 -0300179 err = l2cap_chan_connect(l2cap_pi(sk)->chan);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200180 if (err)
181 goto done;
182
183wait:
184 err = bt_sock_wait_state(sk, BT_CONNECTED,
185 sock_sndtimeo(sk, flags & O_NONBLOCK));
186done:
187 release_sock(sk);
188 return err;
189}
190
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200191static int l2cap_sock_listen(struct socket *sock, int backlog)
192{
193 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300194 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200195 int err = 0;
196
197 BT_DBG("sk %p backlog %d", sk, backlog);
198
199 lock_sock(sk);
200
201 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
202 || sk->sk_state != BT_BOUND) {
203 err = -EBADFD;
204 goto done;
205 }
206
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300207 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200208 case L2CAP_MODE_BASIC:
209 break;
210 case L2CAP_MODE_ERTM:
211 case L2CAP_MODE_STREAMING:
212 if (!disable_ertm)
213 break;
214 /* fall through */
215 default:
216 err = -ENOTSUPP;
217 goto done;
218 }
219
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200220 sk->sk_max_ack_backlog = backlog;
221 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300222
223 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200224 sk->sk_state = BT_LISTEN;
225
226done:
227 release_sock(sk);
228 return err;
229}
230
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200231static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
232{
233 DECLARE_WAITQUEUE(wait, current);
234 struct sock *sk = sock->sk, *nsk;
235 long timeo;
236 int err = 0;
237
238 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
239
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200240 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
241
242 BT_DBG("sk %p timeo %ld", sk, timeo);
243
244 /* Wait for an incoming connection. (wake-one). */
245 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400246 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200247 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200248
249 if (sk->sk_state != BT_LISTEN) {
250 err = -EBADFD;
251 break;
252 }
253
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400254 nsk = bt_accept_dequeue(sk, newsock);
255 if (nsk)
256 break;
257
258 if (!timeo) {
259 err = -EAGAIN;
260 break;
261 }
262
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200263 if (signal_pending(current)) {
264 err = sock_intr_errno(timeo);
265 break;
266 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400267
268 release_sock(sk);
269 timeo = schedule_timeout(timeo);
270 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200271 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400272 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200273 remove_wait_queue(sk_sleep(sk), &wait);
274
275 if (err)
276 goto done;
277
278 newsock->state = SS_CONNECTED;
279
280 BT_DBG("new socket %p", nsk);
281
282done:
283 release_sock(sk);
284 return err;
285}
286
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200287static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
288{
289 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
290 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300291 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200292
293 BT_DBG("sock %p, sk %p", sock, sk);
294
295 addr->sa_family = AF_BLUETOOTH;
296 *len = sizeof(struct sockaddr_l2);
297
298 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300299 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200300 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300301 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200302 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300303 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200304 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300305 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200306 }
307
308 return 0;
309}
310
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200311static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
312{
313 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300314 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200315 struct l2cap_options opts;
316 struct l2cap_conninfo cinfo;
317 int len, err = 0;
318 u32 opt;
319
320 BT_DBG("sk %p", sk);
321
322 if (get_user(len, optlen))
323 return -EFAULT;
324
325 lock_sock(sk);
326
327 switch (optname) {
328 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300329 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300330 opts.imtu = chan->imtu;
331 opts.omtu = chan->omtu;
332 opts.flush_to = chan->flush_to;
333 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300334 opts.fcs = chan->fcs;
335 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300336 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200337
338 len = min_t(unsigned int, len, sizeof(opts));
339 if (copy_to_user(optval, (char *) &opts, len))
340 err = -EFAULT;
341
342 break;
343
344 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300345 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200346 case BT_SECURITY_LOW:
347 opt = L2CAP_LM_AUTH;
348 break;
349 case BT_SECURITY_MEDIUM:
350 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
351 break;
352 case BT_SECURITY_HIGH:
353 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
354 L2CAP_LM_SECURE;
355 break;
356 default:
357 opt = 0;
358 break;
359 }
360
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300361 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200362 opt |= L2CAP_LM_MASTER;
363
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300364 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200365 opt |= L2CAP_LM_RELIABLE;
366
367 if (put_user(opt, (u32 __user *) optval))
368 err = -EFAULT;
369 break;
370
371 case L2CAP_CONNINFO:
372 if (sk->sk_state != BT_CONNECTED &&
373 !(sk->sk_state == BT_CONNECT2 &&
374 bt_sk(sk)->defer_setup)) {
375 err = -ENOTCONN;
376 break;
377 }
378
Filip Palian8d03e972011-05-12 19:32:46 +0200379 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300380 cinfo.hci_handle = chan->conn->hcon->handle;
381 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200382
383 len = min_t(unsigned int, len, sizeof(cinfo));
384 if (copy_to_user(optval, (char *) &cinfo, len))
385 err = -EFAULT;
386
387 break;
388
389 default:
390 err = -ENOPROTOOPT;
391 break;
392 }
393
394 release_sock(sk);
395 return err;
396}
397
398static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
399{
400 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300401 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200402 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700403 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200404 int len, err = 0;
405
406 BT_DBG("sk %p", sk);
407
408 if (level == SOL_L2CAP)
409 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
410
411 if (level != SOL_BLUETOOTH)
412 return -ENOPROTOOPT;
413
414 if (get_user(len, optlen))
415 return -EFAULT;
416
417 lock_sock(sk);
418
419 switch (optname) {
420 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300421 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
422 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200423 err = -EINVAL;
424 break;
425 }
426
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300427 memset(&sec, 0, sizeof(sec));
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300428 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200429
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300430 if (sk->sk_state == BT_CONNECTED)
431 sec.key_size = chan->conn->hcon->enc_key_size;
432
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200433 len = min_t(unsigned int, len, sizeof(sec));
434 if (copy_to_user(optval, (char *) &sec, len))
435 err = -EFAULT;
436
437 break;
438
439 case BT_DEFER_SETUP:
440 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
441 err = -EINVAL;
442 break;
443 }
444
445 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
446 err = -EFAULT;
447
448 break;
449
450 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300451 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
452 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200453 err = -EFAULT;
454
455 break;
456
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700457 case BT_POWER:
458 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
459 && sk->sk_type != SOCK_RAW) {
460 err = -EINVAL;
461 break;
462 }
463
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300464 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700465
466 len = min_t(unsigned int, len, sizeof(pwr));
467 if (copy_to_user(optval, (char *) &pwr, len))
468 err = -EFAULT;
469
470 break;
471
Mat Martineau2ea66482011-11-02 16:18:30 -0700472 case BT_CHANNEL_POLICY:
473 if (!enable_hs) {
474 err = -ENOPROTOOPT;
475 break;
476 }
477
478 if (put_user(chan->chan_policy, (u32 __user *) optval))
479 err = -EFAULT;
480 break;
481
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200482 default:
483 err = -ENOPROTOOPT;
484 break;
485 }
486
487 release_sock(sk);
488 return err;
489}
490
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200491static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
492{
493 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300494 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200495 struct l2cap_options opts;
496 int len, err = 0;
497 u32 opt;
498
499 BT_DBG("sk %p", sk);
500
501 lock_sock(sk);
502
503 switch (optname) {
504 case L2CAP_OPTIONS:
505 if (sk->sk_state == BT_CONNECTED) {
506 err = -EINVAL;
507 break;
508 }
509
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300510 opts.imtu = chan->imtu;
511 opts.omtu = chan->omtu;
512 opts.flush_to = chan->flush_to;
513 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300514 opts.fcs = chan->fcs;
515 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300516 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200517
518 len = min_t(unsigned int, sizeof(opts), optlen);
519 if (copy_from_user((char *) &opts, optval, len)) {
520 err = -EFAULT;
521 break;
522 }
523
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300524 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200525 err = -EINVAL;
526 break;
527 }
528
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300529 chan->mode = opts.mode;
530 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200531 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300532 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200533 break;
534 case L2CAP_MODE_ERTM:
535 case L2CAP_MODE_STREAMING:
536 if (!disable_ertm)
537 break;
538 /* fall through */
539 default:
540 err = -EINVAL;
541 break;
542 }
543
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300544 chan->imtu = opts.imtu;
545 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300546 chan->fcs = opts.fcs;
547 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300548 chan->tx_win = opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200549 break;
550
551 case L2CAP_LM:
552 if (get_user(opt, (u32 __user *) optval)) {
553 err = -EFAULT;
554 break;
555 }
556
557 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300558 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200559 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300560 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200561 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300562 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200563
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300564 if (opt & L2CAP_LM_MASTER)
565 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
566 else
567 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300568
569 if (opt & L2CAP_LM_RELIABLE)
570 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
571 else
572 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200573 break;
574
575 default:
576 err = -ENOPROTOOPT;
577 break;
578 }
579
580 release_sock(sk);
581 return err;
582}
583
584static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
585{
586 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300587 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200588 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700589 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300590 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200591 int len, err = 0;
592 u32 opt;
593
594 BT_DBG("sk %p", sk);
595
596 if (level == SOL_L2CAP)
597 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
598
599 if (level != SOL_BLUETOOTH)
600 return -ENOPROTOOPT;
601
602 lock_sock(sk);
603
604 switch (optname) {
605 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300606 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
607 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200608 err = -EINVAL;
609 break;
610 }
611
612 sec.level = BT_SECURITY_LOW;
613
614 len = min_t(unsigned int, sizeof(sec), optlen);
615 if (copy_from_user((char *) &sec, optval, len)) {
616 err = -EFAULT;
617 break;
618 }
619
620 if (sec.level < BT_SECURITY_LOW ||
621 sec.level > BT_SECURITY_HIGH) {
622 err = -EINVAL;
623 break;
624 }
625
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300626 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300627
628 conn = chan->conn;
629 if (conn && chan->scid == L2CAP_CID_LE_DATA) {
630 if (!conn->hcon->out) {
631 err = -EINVAL;
632 break;
633 }
634
635 if (smp_conn_security(conn, sec.level))
636 break;
637
638 err = 0;
639 sk->sk_state = BT_CONFIG;
640 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200641 break;
642
643 case BT_DEFER_SETUP:
644 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
645 err = -EINVAL;
646 break;
647 }
648
649 if (get_user(opt, (u32 __user *) optval)) {
650 err = -EFAULT;
651 break;
652 }
653
654 bt_sk(sk)->defer_setup = opt;
655 break;
656
657 case BT_FLUSHABLE:
658 if (get_user(opt, (u32 __user *) optval)) {
659 err = -EFAULT;
660 break;
661 }
662
663 if (opt > BT_FLUSHABLE_ON) {
664 err = -EINVAL;
665 break;
666 }
667
668 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300669 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300670 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200671 No Flush support in the LM */
672 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
673 err = -EINVAL;
674 break;
675 }
676 }
677
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300678 if (opt)
679 set_bit(FLAG_FLUSHABLE, &chan->flags);
680 else
681 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200682 break;
683
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700684 case BT_POWER:
685 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
686 chan->chan_type != L2CAP_CHAN_RAW) {
687 err = -EINVAL;
688 break;
689 }
690
691 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
692
693 len = min_t(unsigned int, sizeof(pwr), optlen);
694 if (copy_from_user((char *) &pwr, optval, len)) {
695 err = -EFAULT;
696 break;
697 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300698
699 if (pwr.force_active)
700 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
701 else
702 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700703 break;
704
Mat Martineau2ea66482011-11-02 16:18:30 -0700705 case BT_CHANNEL_POLICY:
706 if (!enable_hs) {
707 err = -ENOPROTOOPT;
708 break;
709 }
710
711 if (get_user(opt, (u32 __user *) optval)) {
712 err = -EFAULT;
713 break;
714 }
715
716 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
717 err = -EINVAL;
718 break;
719 }
720
721 if (chan->mode != L2CAP_MODE_ERTM &&
722 chan->mode != L2CAP_MODE_STREAMING) {
723 err = -EOPNOTSUPP;
724 break;
725 }
726
727 chan->chan_policy = (u8) opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200728 break;
729
730 default:
731 err = -ENOPROTOOPT;
732 break;
733 }
734
735 release_sock(sk);
736 return err;
737}
738
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200739static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
740{
741 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300742 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200743 int err;
744
745 BT_DBG("sock %p, sk %p", sock, sk);
746
747 err = sock_error(sk);
748 if (err)
749 return err;
750
751 if (msg->msg_flags & MSG_OOB)
752 return -EOPNOTSUPP;
753
754 lock_sock(sk);
755
756 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300757 release_sock(sk);
758 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200759 }
760
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200761 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200762
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200763 release_sock(sk);
764 return err;
765}
766
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200767static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
768{
769 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700770 struct l2cap_pinfo *pi = l2cap_pi(sk);
771 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200772
773 lock_sock(sk);
774
775 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300776 sk->sk_state = BT_CONFIG;
777
Mat Martineaue3281402011-07-07 09:39:02 -0700778 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200779 release_sock(sk);
780 return 0;
781 }
782
783 release_sock(sk);
784
785 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700786 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
787 else
788 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200789
Mat Martineaue3281402011-07-07 09:39:02 -0700790 if (pi->chan->mode != L2CAP_MODE_ERTM)
791 return err;
792
793 /* Attempt to put pending rx data in the socket buffer */
794
795 lock_sock(sk);
796
797 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
798 goto done;
799
800 if (pi->rx_busy_skb) {
801 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
802 pi->rx_busy_skb = NULL;
803 else
804 goto done;
805 }
806
807 /* Restore data flow when half of the receive buffer is
808 * available. This avoids resending large numbers of
809 * frames.
810 */
811 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
812 l2cap_chan_busy(pi->chan, 0);
813
814done:
815 release_sock(sk);
816 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200817}
818
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200819/* Kill socket (only if zapped and orphan)
820 * Must be called on unlocked socket.
821 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300822static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200823{
824 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
825 return;
826
827 BT_DBG("sk %p state %d", sk, sk->sk_state);
828
829 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300830
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300831 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200832 sock_set_flag(sk, SOCK_DEAD);
833 sock_put(sk);
834}
835
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200836static int l2cap_sock_shutdown(struct socket *sock, int how)
837{
838 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300839 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200840 int err = 0;
841
842 BT_DBG("sock %p, sk %p", sock, sk);
843
844 if (!sk)
845 return 0;
846
847 lock_sock(sk);
848 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300849 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200850 err = __l2cap_wait_ack(sk);
851
852 sk->sk_shutdown = SHUTDOWN_MASK;
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300853 l2cap_chan_close(chan, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200854
855 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
856 err = bt_sock_wait_state(sk, BT_CLOSED,
857 sk->sk_lingertime);
858 }
859
860 if (!err && sk->sk_err)
861 err = -sk->sk_err;
862
863 release_sock(sk);
864 return err;
865}
866
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200867static int l2cap_sock_release(struct socket *sock)
868{
869 struct sock *sk = sock->sk;
870 int err;
871
872 BT_DBG("sock %p, sk %p", sock, sk);
873
874 if (!sk)
875 return 0;
876
877 err = l2cap_sock_shutdown(sock, 2);
878
879 sock_orphan(sk);
880 l2cap_sock_kill(sk);
881 return err;
882}
883
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300884static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
885{
886 struct sock *sk, *parent = data;
887
888 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
889 GFP_ATOMIC);
890 if (!sk)
891 return NULL;
892
893 l2cap_sock_init(sk, parent);
894
895 return l2cap_pi(sk)->chan;
896}
897
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300898static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
899{
Mat Martineaue3281402011-07-07 09:39:02 -0700900 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300901 struct sock *sk = data;
Mat Martineaue3281402011-07-07 09:39:02 -0700902 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300903
Mat Martineaue3281402011-07-07 09:39:02 -0700904 if (pi->rx_busy_skb)
905 return -ENOMEM;
906
907 err = sock_queue_rcv_skb(sk, skb);
908
909 /* For ERTM, handle one skb that doesn't fit into the recv
910 * buffer. This is important to do because the data frames
911 * have already been acked, so the skb cannot be discarded.
912 *
913 * Notify the l2cap core that the buffer is full, so the
914 * LOCAL_BUSY state is entered and no more frames are
915 * acked and reassembled until there is buffer space
916 * available.
917 */
918 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
919 pi->rx_busy_skb = skb;
920 l2cap_chan_busy(pi->chan, 1);
921 err = 0;
922 }
923
924 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300925}
926
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300927static void l2cap_sock_close_cb(void *data)
928{
929 struct sock *sk = data;
930
931 l2cap_sock_kill(sk);
932}
933
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300934static void l2cap_sock_state_change_cb(void *data, int state)
935{
936 struct sock *sk = data;
937
938 sk->sk_state = state;
939}
940
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300941static struct l2cap_ops l2cap_chan_ops = {
942 .name = "L2CAP Socket Interface",
943 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300944 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300945 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300946 .state_change = l2cap_sock_state_change_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300947};
948
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200949static void l2cap_sock_destruct(struct sock *sk)
950{
951 BT_DBG("sk %p", sk);
952
Mat Martineaue3281402011-07-07 09:39:02 -0700953 if (l2cap_pi(sk)->rx_busy_skb) {
954 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
955 l2cap_pi(sk)->rx_busy_skb = NULL;
956 }
957
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200958 skb_queue_purge(&sk->sk_receive_queue);
959 skb_queue_purge(&sk->sk_write_queue);
960}
961
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300962static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200963{
964 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300965 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200966
967 BT_DBG("sk %p", sk);
968
969 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300970 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
971
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200972 sk->sk_type = parent->sk_type;
973 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
974
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300975 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300976 chan->imtu = pchan->imtu;
977 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300978 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300979 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300980 chan->fcs = pchan->fcs;
981 chan->max_tx = pchan->max_tx;
982 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +0200983 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300984 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300985 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +0000986
987 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200988 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300989
990 switch (sk->sk_type) {
991 case SOCK_RAW:
992 chan->chan_type = L2CAP_CHAN_RAW;
993 break;
994 case SOCK_DGRAM:
995 chan->chan_type = L2CAP_CHAN_CONN_LESS;
996 break;
997 case SOCK_SEQPACKET:
998 case SOCK_STREAM:
999 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1000 break;
1001 }
1002
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001003 chan->imtu = L2CAP_DEFAULT_MTU;
1004 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001005 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001006 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001007 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001008 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001009 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001010 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001011 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
1012 chan->fcs = L2CAP_FCS_CRC16;
1013 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001014 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001015 chan->sec_level = BT_SECURITY_LOW;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001016 chan->flags = 0;
Andrei Emeltchenko15770b12011-10-11 14:04:33 +03001017 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001018 }
1019
1020 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001021 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001022
1023 chan->data = sk;
1024 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001025}
1026
1027static struct proto l2cap_proto = {
1028 .name = "L2CAP",
1029 .owner = THIS_MODULE,
1030 .obj_size = sizeof(struct l2cap_pinfo)
1031};
1032
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001033static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001034{
1035 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001036 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001037
1038 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1039 if (!sk)
1040 return NULL;
1041
1042 sock_init_data(sock, sk);
1043 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1044
1045 sk->sk_destruct = l2cap_sock_destruct;
Chen Ganir6be6b112011-07-28 15:42:09 +03001046 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001047
1048 sock_reset_flag(sk, SOCK_ZAPPED);
1049
1050 sk->sk_protocol = proto;
1051 sk->sk_state = BT_OPEN;
1052
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001053 chan = l2cap_chan_create(sk);
1054 if (!chan) {
1055 l2cap_sock_kill(sk);
1056 return NULL;
1057 }
1058
1059 l2cap_pi(sk)->chan = chan;
1060
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001061 return sk;
1062}
1063
1064static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1065 int kern)
1066{
1067 struct sock *sk;
1068
1069 BT_DBG("sock %p", sock);
1070
1071 sock->state = SS_UNCONNECTED;
1072
1073 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1074 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1075 return -ESOCKTNOSUPPORT;
1076
1077 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1078 return -EPERM;
1079
1080 sock->ops = &l2cap_sock_ops;
1081
1082 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1083 if (!sk)
1084 return -ENOMEM;
1085
1086 l2cap_sock_init(sk, NULL);
1087 return 0;
1088}
1089
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001090static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001091 .family = PF_BLUETOOTH,
1092 .owner = THIS_MODULE,
1093 .release = l2cap_sock_release,
1094 .bind = l2cap_sock_bind,
1095 .connect = l2cap_sock_connect,
1096 .listen = l2cap_sock_listen,
1097 .accept = l2cap_sock_accept,
1098 .getname = l2cap_sock_getname,
1099 .sendmsg = l2cap_sock_sendmsg,
1100 .recvmsg = l2cap_sock_recvmsg,
1101 .poll = bt_sock_poll,
1102 .ioctl = bt_sock_ioctl,
1103 .mmap = sock_no_mmap,
1104 .socketpair = sock_no_socketpair,
1105 .shutdown = l2cap_sock_shutdown,
1106 .setsockopt = l2cap_sock_setsockopt,
1107 .getsockopt = l2cap_sock_getsockopt
1108};
1109
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001110static const struct net_proto_family l2cap_sock_family_ops = {
1111 .family = PF_BLUETOOTH,
1112 .owner = THIS_MODULE,
1113 .create = l2cap_sock_create,
1114};
1115
1116int __init l2cap_init_sockets(void)
1117{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001118 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001119
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001120 err = proto_register(&l2cap_proto, 0);
1121 if (err < 0)
1122 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001123
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001124 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1125 if (err < 0)
1126 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001127
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001128 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001129
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001130 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001131
1132error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001133 BT_ERR("L2CAP socket registration failed");
1134 proto_unregister(&l2cap_proto);
1135 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001136}
1137
1138void l2cap_cleanup_sockets(void)
1139{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001140 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1141 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001142
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001143 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001144}