blob: 1daa4c579eb232e272bcd1247a54077b89b17693 [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 Gortmakerbc3b2d72011-07-15 11:47:34 -040030#include <linux/export.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000031
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020032#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020033#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020034#include <net/bluetooth/l2cap.h>
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -030035#include <net/bluetooth/smp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020036
Masatake YAMATO5b28d952012-07-26 01:29:25 +090037static struct bt_sock_list l2cap_sk_list = {
38 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
39};
40
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030041static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030042static void l2cap_sock_init(struct sock *sk, struct sock *parent);
Gustavo Padovan2d792812012-10-06 10:07:01 +010043static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
44 int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030045
David Herrmannb3916db2013-04-05 14:57:34 +020046bool l2cap_is_socket(struct socket *sock)
47{
48 return sock && sock->ops == &l2cap_sock_ops;
49}
50EXPORT_SYMBOL(l2cap_is_socket);
51
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020052static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
53{
54 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030055 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020056 struct sockaddr_l2 la;
57 int len, err = 0;
58
59 BT_DBG("sk %p", sk);
60
61 if (!addr || addr->sa_family != AF_BLUETOOTH)
62 return -EINVAL;
63
64 memset(&la, 0, sizeof(la));
65 len = min_t(unsigned int, sizeof(la), alen);
66 memcpy(&la, addr, len);
67
Ville Tervob62f3282011-02-10 22:38:50 -030068 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020069 return -EINVAL;
70
71 lock_sock(sk);
72
73 if (sk->sk_state != BT_OPEN) {
74 err = -EBADFD;
75 goto done;
76 }
77
78 if (la.l2_psm) {
79 __u16 psm = __le16_to_cpu(la.l2_psm);
80
81 /* PSM must be odd and lsb of upper byte must be 0 */
82 if ((psm & 0x0101) != 0x0001) {
83 err = -EINVAL;
84 goto done;
85 }
86
87 /* Restrict usage of well-known PSMs */
88 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
89 err = -EACCES;
90 goto done;
91 }
92 }
93
Ville Tervob62f3282011-02-10 22:38:50 -030094 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +053095 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030096 else
97 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030098
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030099 if (err < 0)
100 goto done;
101
Andrei Emeltchenko2983fd62012-05-24 15:42:50 +0300102 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
103 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300104 chan->sec_level = BT_SECURITY_SDP;
105
106 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300107
108 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300109 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200110
111done:
112 release_sock(sk);
113 return err;
114}
115
Gustavo Padovan2d792812012-10-06 10:07:01 +0100116static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
117 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200118{
119 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300120 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200121 struct sockaddr_l2 la;
122 int len, err = 0;
123
124 BT_DBG("sk %p", sk);
125
126 if (!addr || alen < sizeof(addr->sa_family) ||
127 addr->sa_family != AF_BLUETOOTH)
128 return -EINVAL;
129
130 memset(&la, 0, sizeof(la));
131 len = min_t(unsigned int, sizeof(la), alen);
132 memcpy(&la, addr, len);
133
Ville Tervoacd7d372011-02-10 22:38:49 -0300134 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200135 return -EINVAL;
136
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530137 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300138 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200139 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200140 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200141
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200142 lock_sock(sk);
143
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200144 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100145 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200146
147 release_sock(sk);
148
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200149 return err;
150}
151
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200152static int l2cap_sock_listen(struct socket *sock, int backlog)
153{
154 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300155 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200156 int err = 0;
157
158 BT_DBG("sk %p backlog %d", sk, backlog);
159
160 lock_sock(sk);
161
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200162 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200163 err = -EBADFD;
164 goto done;
165 }
166
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200167 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
168 err = -EINVAL;
169 goto done;
170 }
171
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300172 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200173 case L2CAP_MODE_BASIC:
174 break;
175 case L2CAP_MODE_ERTM:
176 case L2CAP_MODE_STREAMING:
177 if (!disable_ertm)
178 break;
179 /* fall through */
180 default:
181 err = -ENOTSUPP;
182 goto done;
183 }
184
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200185 sk->sk_max_ack_backlog = backlog;
186 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300187
188 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200189 sk->sk_state = BT_LISTEN;
190
191done:
192 release_sock(sk);
193 return err;
194}
195
Gustavo Padovan2d792812012-10-06 10:07:01 +0100196static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
197 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200198{
199 DECLARE_WAITQUEUE(wait, current);
200 struct sock *sk = sock->sk, *nsk;
201 long timeo;
202 int err = 0;
203
204 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
205
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200206 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
207
208 BT_DBG("sk %p timeo %ld", sk, timeo);
209
210 /* Wait for an incoming connection. (wake-one). */
211 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400212 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200213 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200214
215 if (sk->sk_state != BT_LISTEN) {
216 err = -EBADFD;
217 break;
218 }
219
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400220 nsk = bt_accept_dequeue(sk, newsock);
221 if (nsk)
222 break;
223
224 if (!timeo) {
225 err = -EAGAIN;
226 break;
227 }
228
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200229 if (signal_pending(current)) {
230 err = sock_intr_errno(timeo);
231 break;
232 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400233
234 release_sock(sk);
235 timeo = schedule_timeout(timeo);
236 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200237 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400238 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200239 remove_wait_queue(sk_sleep(sk), &wait);
240
241 if (err)
242 goto done;
243
244 newsock->state = SS_CONNECTED;
245
246 BT_DBG("new socket %p", nsk);
247
248done:
249 release_sock(sk);
250 return err;
251}
252
Gustavo Padovan2d792812012-10-06 10:07:01 +0100253static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
254 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200255{
256 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
257 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300258 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200259
260 BT_DBG("sock %p, sk %p", sock, sk);
261
Mathias Krause792039c2012-08-15 11:31:51 +0000262 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200263 addr->sa_family = AF_BLUETOOTH;
264 *len = sizeof(struct sockaddr_l2);
265
266 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300267 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200268 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300269 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200270 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300271 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200272 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300273 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200274 }
275
276 return 0;
277}
278
Gustavo Padovan2d792812012-10-06 10:07:01 +0100279static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
280 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200281{
282 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300283 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200284 struct l2cap_options opts;
285 struct l2cap_conninfo cinfo;
286 int len, err = 0;
287 u32 opt;
288
289 BT_DBG("sk %p", sk);
290
291 if (get_user(len, optlen))
292 return -EFAULT;
293
294 lock_sock(sk);
295
296 switch (optname) {
297 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300298 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300299 opts.imtu = chan->imtu;
300 opts.omtu = chan->omtu;
301 opts.flush_to = chan->flush_to;
302 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300303 opts.fcs = chan->fcs;
304 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300305 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200306
307 len = min_t(unsigned int, len, sizeof(opts));
308 if (copy_to_user(optval, (char *) &opts, len))
309 err = -EFAULT;
310
311 break;
312
313 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300314 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200315 case BT_SECURITY_LOW:
316 opt = L2CAP_LM_AUTH;
317 break;
318 case BT_SECURITY_MEDIUM:
319 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
320 break;
321 case BT_SECURITY_HIGH:
322 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100323 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200324 break;
325 default:
326 opt = 0;
327 break;
328 }
329
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300330 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200331 opt |= L2CAP_LM_MASTER;
332
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300333 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200334 opt |= L2CAP_LM_RELIABLE;
335
336 if (put_user(opt, (u32 __user *) optval))
337 err = -EFAULT;
338 break;
339
340 case L2CAP_CONNINFO:
341 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300342 !(sk->sk_state == BT_CONNECT2 &&
343 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200344 err = -ENOTCONN;
345 break;
346 }
347
Filip Palian8d03e972011-05-12 19:32:46 +0200348 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300349 cinfo.hci_handle = chan->conn->hcon->handle;
350 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200351
352 len = min_t(unsigned int, len, sizeof(cinfo));
353 if (copy_to_user(optval, (char *) &cinfo, len))
354 err = -EFAULT;
355
356 break;
357
358 default:
359 err = -ENOPROTOOPT;
360 break;
361 }
362
363 release_sock(sk);
364 return err;
365}
366
Gustavo Padovan2d792812012-10-06 10:07:01 +0100367static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
368 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200369{
370 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300371 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200372 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700373 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200374 int len, err = 0;
375
376 BT_DBG("sk %p", sk);
377
378 if (level == SOL_L2CAP)
379 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
380
381 if (level != SOL_BLUETOOTH)
382 return -ENOPROTOOPT;
383
384 if (get_user(len, optlen))
385 return -EFAULT;
386
387 lock_sock(sk);
388
389 switch (optname) {
390 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300391 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100392 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200393 err = -EINVAL;
394 break;
395 }
396
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300397 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300398 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300399 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200400
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300401 if (sk->sk_state == BT_CONNECTED)
402 sec.key_size = chan->conn->hcon->enc_key_size;
403 } else {
404 sec.level = chan->sec_level;
405 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300406
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200407 len = min_t(unsigned int, len, sizeof(sec));
408 if (copy_to_user(optval, (char *) &sec, len))
409 err = -EFAULT;
410
411 break;
412
413 case BT_DEFER_SETUP:
414 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
415 err = -EINVAL;
416 break;
417 }
418
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300419 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
420 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200421 err = -EFAULT;
422
423 break;
424
425 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300426 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100427 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200428 err = -EFAULT;
429
430 break;
431
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700432 case BT_POWER:
433 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100434 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700435 err = -EINVAL;
436 break;
437 }
438
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300439 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700440
441 len = min_t(unsigned int, len, sizeof(pwr));
442 if (copy_to_user(optval, (char *) &pwr, len))
443 err = -EFAULT;
444
445 break;
446
Mat Martineau2ea66482011-11-02 16:18:30 -0700447 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700448 if (put_user(chan->chan_policy, (u32 __user *) optval))
449 err = -EFAULT;
450 break;
451
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200452 default:
453 err = -ENOPROTOOPT;
454 break;
455 }
456
457 release_sock(sk);
458 return err;
459}
460
Andre Guedes682877c2012-05-31 17:01:34 -0300461static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
462{
463 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300464 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300465 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300466 return false;
467 break;
468
469 default:
470 if (mtu < L2CAP_DEFAULT_MIN_MTU)
471 return false;
472 }
473
474 return true;
475}
476
Gustavo Padovan2d792812012-10-06 10:07:01 +0100477static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
478 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200479{
480 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300481 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200482 struct l2cap_options opts;
483 int len, err = 0;
484 u32 opt;
485
486 BT_DBG("sk %p", sk);
487
488 lock_sock(sk);
489
490 switch (optname) {
491 case L2CAP_OPTIONS:
492 if (sk->sk_state == BT_CONNECTED) {
493 err = -EINVAL;
494 break;
495 }
496
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300497 opts.imtu = chan->imtu;
498 opts.omtu = chan->omtu;
499 opts.flush_to = chan->flush_to;
500 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300501 opts.fcs = chan->fcs;
502 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300503 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200504
505 len = min_t(unsigned int, sizeof(opts), optlen);
506 if (copy_from_user((char *) &opts, optval, len)) {
507 err = -EFAULT;
508 break;
509 }
510
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300511 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200512 err = -EINVAL;
513 break;
514 }
515
Andre Guedes682877c2012-05-31 17:01:34 -0300516 if (!l2cap_valid_mtu(chan, opts.imtu)) {
517 err = -EINVAL;
518 break;
519 }
520
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300521 chan->mode = opts.mode;
522 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200523 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300524 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200525 break;
526 case L2CAP_MODE_ERTM:
527 case L2CAP_MODE_STREAMING:
528 if (!disable_ertm)
529 break;
530 /* fall through */
531 default:
532 err = -EINVAL;
533 break;
534 }
535
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300536 chan->imtu = opts.imtu;
537 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300538 chan->fcs = opts.fcs;
539 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300540 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300541 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200542 break;
543
544 case L2CAP_LM:
545 if (get_user(opt, (u32 __user *) optval)) {
546 err = -EFAULT;
547 break;
548 }
549
550 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300551 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200552 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300553 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200554 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300555 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200556
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300557 if (opt & L2CAP_LM_MASTER)
558 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
559 else
560 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300561
562 if (opt & L2CAP_LM_RELIABLE)
563 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
564 else
565 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200566 break;
567
568 default:
569 err = -ENOPROTOOPT;
570 break;
571 }
572
573 release_sock(sk);
574 return err;
575}
576
Gustavo Padovan2d792812012-10-06 10:07:01 +0100577static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
578 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200579{
580 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300581 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200582 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700583 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300584 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200585 int len, err = 0;
586 u32 opt;
587
588 BT_DBG("sk %p", sk);
589
590 if (level == SOL_L2CAP)
591 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
592
593 if (level != SOL_BLUETOOTH)
594 return -ENOPROTOOPT;
595
596 lock_sock(sk);
597
598 switch (optname) {
599 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300600 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100601 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200602 err = -EINVAL;
603 break;
604 }
605
606 sec.level = BT_SECURITY_LOW;
607
608 len = min_t(unsigned int, sizeof(sec), optlen);
609 if (copy_from_user((char *) &sec, optval, len)) {
610 err = -EFAULT;
611 break;
612 }
613
614 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100615 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200616 err = -EINVAL;
617 break;
618 }
619
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300620 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300621
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200622 if (!chan->conn)
623 break;
624
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300625 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200626
627 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300628 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300629 if (!conn->hcon->out) {
630 err = -EINVAL;
631 break;
632 }
633
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300634 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300635 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300636 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200637 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200638
Gustavo Padovana7d77232012-05-13 03:20:07 -0300639 /* or for ACL link */
640 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100641 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300642 sk->sk_state == BT_CONNECTED) {
643 if (!l2cap_chan_check_security(chan))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300644 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300645 else
646 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200647 } else {
648 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300649 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200650 break;
651
652 case BT_DEFER_SETUP:
653 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
654 err = -EINVAL;
655 break;
656 }
657
658 if (get_user(opt, (u32 __user *) optval)) {
659 err = -EFAULT;
660 break;
661 }
662
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300663 if (opt)
664 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
665 else
666 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200667 break;
668
669 case BT_FLUSHABLE:
670 if (get_user(opt, (u32 __user *) optval)) {
671 err = -EFAULT;
672 break;
673 }
674
675 if (opt > BT_FLUSHABLE_ON) {
676 err = -EINVAL;
677 break;
678 }
679
680 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200681 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300682 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200683 No Flush support in the LM */
684 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
685 err = -EINVAL;
686 break;
687 }
688 }
689
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300690 if (opt)
691 set_bit(FLAG_FLUSHABLE, &chan->flags);
692 else
693 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200694 break;
695
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700696 case BT_POWER:
697 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100698 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700699 err = -EINVAL;
700 break;
701 }
702
703 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
704
705 len = min_t(unsigned int, sizeof(pwr), optlen);
706 if (copy_from_user((char *) &pwr, optval, len)) {
707 err = -EFAULT;
708 break;
709 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300710
711 if (pwr.force_active)
712 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
713 else
714 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700715 break;
716
Mat Martineau2ea66482011-11-02 16:18:30 -0700717 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700718 if (get_user(opt, (u32 __user *) optval)) {
719 err = -EFAULT;
720 break;
721 }
722
723 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
724 err = -EINVAL;
725 break;
726 }
727
728 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100729 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700730 err = -EOPNOTSUPP;
731 break;
732 }
733
734 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700735
736 if (sk->sk_state == BT_CONNECTED &&
737 chan->move_role == L2CAP_MOVE_ROLE_NONE)
738 l2cap_move_start(chan);
739
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200740 break;
741
742 default:
743 err = -ENOPROTOOPT;
744 break;
745 }
746
747 release_sock(sk);
748 return err;
749}
750
Gustavo Padovan2d792812012-10-06 10:07:01 +0100751static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
752 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200753{
754 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300755 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200756 int err;
757
758 BT_DBG("sock %p, sk %p", sock, sk);
759
760 err = sock_error(sk);
761 if (err)
762 return err;
763
764 if (msg->msg_flags & MSG_OOB)
765 return -EOPNOTSUPP;
766
Mat Martineaua6a55682012-05-04 14:20:31 -0700767 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300768 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200769
Johan Hedberge793dcf2013-09-16 13:05:19 +0300770 lock_sock(sk);
771 err = bt_sock_wait_ready(sk, msg->msg_flags);
772 release_sock(sk);
773 if (err)
774 return err;
775
Mat Martineaua6a55682012-05-04 14:20:31 -0700776 l2cap_chan_lock(chan);
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200777 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Mat Martineaua6a55682012-05-04 14:20:31 -0700778 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200779
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200780 return err;
781}
782
Gustavo Padovan2d792812012-10-06 10:07:01 +0100783static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
784 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200785{
786 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700787 struct l2cap_pinfo *pi = l2cap_pi(sk);
788 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200789
790 lock_sock(sk);
791
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300792 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
793 &bt_sk(sk)->flags)) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300794 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200795 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300796
Mat Martineaue3281402011-07-07 09:39:02 -0700797 __l2cap_connect_rsp_defer(pi->chan);
Johan Hedberg970871b2013-09-25 13:26:05 +0300798 err = 0;
799 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200800 }
801
802 release_sock(sk);
803
804 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700805 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
806 else
807 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200808
Mat Martineaue3281402011-07-07 09:39:02 -0700809 if (pi->chan->mode != L2CAP_MODE_ERTM)
810 return err;
811
812 /* Attempt to put pending rx data in the socket buffer */
813
814 lock_sock(sk);
815
816 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
817 goto done;
818
819 if (pi->rx_busy_skb) {
820 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
821 pi->rx_busy_skb = NULL;
822 else
823 goto done;
824 }
825
826 /* Restore data flow when half of the receive buffer is
827 * available. This avoids resending large numbers of
828 * frames.
829 */
830 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
831 l2cap_chan_busy(pi->chan, 0);
832
833done:
834 release_sock(sk);
835 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200836}
837
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200838/* Kill socket (only if zapped and orphan)
839 * Must be called on unlocked socket.
840 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300841static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200842{
843 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
844 return;
845
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200846 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200847
848 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300849
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530850 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200851 sock_set_flag(sk, SOCK_DEAD);
852 sock_put(sk);
853}
854
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200855static int l2cap_sock_shutdown(struct socket *sock, int how)
856{
857 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200858 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200859 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200860 int err = 0;
861
862 BT_DBG("sock %p, sk %p", sock, sk);
863
864 if (!sk)
865 return 0;
866
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200867 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200868 conn = chan->conn;
869
870 if (conn)
871 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200872
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200873 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200874 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200875
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200876 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300877 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200878 err = __l2cap_wait_ack(sk);
879
880 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200881
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200882 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300883 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200884 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200885
886 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
887 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100888 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200889 }
890
891 if (!err && sk->sk_err)
892 err = -sk->sk_err;
893
894 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200895 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200896
897 if (conn)
898 mutex_unlock(&conn->chan_lock);
899
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200900 return err;
901}
902
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200903static int l2cap_sock_release(struct socket *sock)
904{
905 struct sock *sk = sock->sk;
906 int err;
907
908 BT_DBG("sock %p, sk %p", sock, sk);
909
910 if (!sk)
911 return 0;
912
Masatake YAMATO5b28d952012-07-26 01:29:25 +0900913 bt_sock_unlink(&l2cap_sk_list, sk);
914
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200915 err = l2cap_sock_shutdown(sock, 2);
916
917 sock_orphan(sk);
918 l2cap_sock_kill(sk);
919 return err;
920}
921
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -0300922static void l2cap_sock_cleanup_listen(struct sock *parent)
923{
924 struct sock *sk;
925
926 BT_DBG("parent %p", parent);
927
928 /* Close not yet accepted channels */
929 while ((sk = bt_accept_dequeue(parent, NULL))) {
930 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
931
932 l2cap_chan_lock(chan);
933 __clear_chan_timer(chan);
934 l2cap_chan_close(chan, ECONNRESET);
935 l2cap_chan_unlock(chan);
936
937 l2cap_sock_kill(sk);
938 }
939}
940
Gustavo Padovan80b98022012-05-27 22:27:51 -0300941static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300942{
Gustavo Padovan80b98022012-05-27 22:27:51 -0300943 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300944
Gustavo Padovan53826692012-05-27 22:27:55 -0300945 /* Check for backlog size */
946 if (sk_acceptq_is_full(parent)) {
947 BT_DBG("backlog full %d", parent->sk_ack_backlog);
948 return NULL;
949 }
950
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300951 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100952 GFP_ATOMIC);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300953 if (!sk)
954 return NULL;
955
Octavian Purdilad22015a2012-01-22 00:28:34 +0200956 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
957
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300958 l2cap_sock_init(sk, parent);
959
Gustavo Padovan644912e2012-10-12 19:35:23 +0800960 bt_accept_enqueue(parent, sk);
961
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300962 return l2cap_pi(sk)->chan;
963}
964
Gustavo Padovan80b98022012-05-27 22:27:51 -0300965static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300966{
Mat Martineaue3281402011-07-07 09:39:02 -0700967 int err;
Gustavo Padovan80b98022012-05-27 22:27:51 -0300968 struct sock *sk = chan->data;
Mat Martineaue3281402011-07-07 09:39:02 -0700969 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300970
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200971 lock_sock(sk);
972
973 if (pi->rx_busy_skb) {
974 err = -ENOMEM;
975 goto done;
976 }
Mat Martineaue3281402011-07-07 09:39:02 -0700977
978 err = sock_queue_rcv_skb(sk, skb);
979
980 /* For ERTM, handle one skb that doesn't fit into the recv
981 * buffer. This is important to do because the data frames
982 * have already been acked, so the skb cannot be discarded.
983 *
984 * Notify the l2cap core that the buffer is full, so the
985 * LOCAL_BUSY state is entered and no more frames are
986 * acked and reassembled until there is buffer space
987 * available.
988 */
989 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
990 pi->rx_busy_skb = skb;
991 l2cap_chan_busy(pi->chan, 1);
992 err = 0;
993 }
994
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200995done:
996 release_sock(sk);
997
Mat Martineaue3281402011-07-07 09:39:02 -0700998 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300999}
1000
Gustavo Padovan80b98022012-05-27 22:27:51 -03001001static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001002{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001003 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001004
1005 l2cap_sock_kill(sk);
1006}
1007
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001008static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1009{
1010 struct sock *sk = chan->data;
1011 struct sock *parent;
1012
1013 lock_sock(sk);
1014
1015 parent = bt_sk(sk)->parent;
1016
1017 sock_set_flag(sk, SOCK_ZAPPED);
1018
1019 switch (chan->state) {
1020 case BT_OPEN:
1021 case BT_BOUND:
1022 case BT_CLOSED:
1023 break;
1024 case BT_LISTEN:
1025 l2cap_sock_cleanup_listen(sk);
1026 sk->sk_state = BT_CLOSED;
1027 chan->state = BT_CLOSED;
1028
1029 break;
1030 default:
1031 sk->sk_state = BT_CLOSED;
1032 chan->state = BT_CLOSED;
1033
1034 sk->sk_err = err;
1035
1036 if (parent) {
1037 bt_accept_unlink(sk);
1038 parent->sk_data_ready(parent, 0);
1039 } else {
1040 sk->sk_state_change(sk);
1041 }
1042
1043 break;
1044 }
1045
1046 release_sock(sk);
1047}
1048
Gustavo Padovan80b98022012-05-27 22:27:51 -03001049static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001050{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001051 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001052
1053 sk->sk_state = state;
1054}
1055
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001056static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -03001057 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001058{
Gustavo Padovan90338942012-04-06 20:15:47 -03001059 struct sk_buff *skb;
1060 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001061
Mat Martineaua6a55682012-05-04 14:20:31 -07001062 l2cap_chan_unlock(chan);
Gustavo Padovan90338942012-04-06 20:15:47 -03001063 skb = bt_skb_send_alloc(chan->sk, len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001064 l2cap_chan_lock(chan);
1065
Gustavo Padovan90338942012-04-06 20:15:47 -03001066 if (!skb)
1067 return ERR_PTR(err);
1068
1069 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001070}
1071
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001072static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1073{
1074 struct sock *sk = chan->data;
1075 struct sock *parent;
1076
1077 lock_sock(sk);
1078
1079 parent = bt_sk(sk)->parent;
1080
1081 BT_DBG("sk %p, parent %p", sk, parent);
1082
1083 sk->sk_state = BT_CONNECTED;
1084 sk->sk_state_change(sk);
1085
1086 if (parent)
1087 parent->sk_data_ready(parent, 0);
1088
1089 release_sock(sk);
1090}
1091
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001092static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1093{
1094 struct sock *sk = chan->data;
1095 struct sock *parent = bt_sk(sk)->parent;
1096
1097 if (parent)
1098 parent->sk_data_ready(parent, 0);
1099}
1100
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001101static struct l2cap_ops l2cap_chan_ops = {
1102 .name = "L2CAP Socket Interface",
1103 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001104 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001105 .close = l2cap_sock_close_cb,
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001106 .teardown = l2cap_sock_teardown_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001107 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001108 .ready = l2cap_sock_ready_cb,
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001109 .defer = l2cap_sock_defer_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001110 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001111};
1112
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001113static void l2cap_sock_destruct(struct sock *sk)
1114{
1115 BT_DBG("sk %p", sk);
1116
Sasha Levin23d3a862012-10-08 16:48:32 -04001117 if (l2cap_pi(sk)->chan)
1118 l2cap_chan_put(l2cap_pi(sk)->chan);
Mat Martineaue3281402011-07-07 09:39:02 -07001119 if (l2cap_pi(sk)->rx_busy_skb) {
1120 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1121 l2cap_pi(sk)->rx_busy_skb = NULL;
1122 }
1123
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001124 skb_queue_purge(&sk->sk_receive_queue);
1125 skb_queue_purge(&sk->sk_write_queue);
1126}
1127
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001128static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001129{
1130 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001131 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001132
1133 BT_DBG("sk %p", sk);
1134
1135 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001136 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1137
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001138 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001139 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001140
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001141 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001142 chan->imtu = pchan->imtu;
1143 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001144 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001145 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001146 chan->fcs = pchan->fcs;
1147 chan->max_tx = pchan->max_tx;
1148 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001149 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001150 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001151 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +00001152
1153 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001154 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001155
1156 switch (sk->sk_type) {
1157 case SOCK_RAW:
1158 chan->chan_type = L2CAP_CHAN_RAW;
1159 break;
1160 case SOCK_DGRAM:
1161 chan->chan_type = L2CAP_CHAN_CONN_LESS;
1162 break;
1163 case SOCK_SEQPACKET:
1164 case SOCK_STREAM:
1165 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1166 break;
1167 }
1168
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001169 chan->imtu = L2CAP_DEFAULT_MTU;
1170 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001171 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001172 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001173 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001174 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001175 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001176 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001177
1178 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001179 }
1180
1181 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001182 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001183
1184 chan->data = sk;
1185 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001186}
1187
1188static struct proto l2cap_proto = {
1189 .name = "L2CAP",
1190 .owner = THIS_MODULE,
1191 .obj_size = sizeof(struct l2cap_pinfo)
1192};
1193
Gustavo Padovan2d792812012-10-06 10:07:01 +01001194static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1195 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001196{
1197 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001198 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001199
1200 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1201 if (!sk)
1202 return NULL;
1203
1204 sock_init_data(sock, sk);
1205 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1206
1207 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001208 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001209
1210 sock_reset_flag(sk, SOCK_ZAPPED);
1211
1212 sk->sk_protocol = proto;
1213 sk->sk_state = BT_OPEN;
1214
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001215 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001216 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301217 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001218 return NULL;
1219 }
1220
Mat Martineau61d6ef32012-04-27 16:50:50 -07001221 l2cap_chan_hold(chan);
1222
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001223 chan->sk = sk;
1224
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001225 l2cap_pi(sk)->chan = chan;
1226
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001227 return sk;
1228}
1229
1230static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1231 int kern)
1232{
1233 struct sock *sk;
1234
1235 BT_DBG("sock %p", sock);
1236
1237 sock->state = SS_UNCONNECTED;
1238
1239 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001240 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001241 return -ESOCKTNOSUPPORT;
1242
1243 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1244 return -EPERM;
1245
1246 sock->ops = &l2cap_sock_ops;
1247
1248 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1249 if (!sk)
1250 return -ENOMEM;
1251
1252 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001253 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001254 return 0;
1255}
1256
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001257static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001258 .family = PF_BLUETOOTH,
1259 .owner = THIS_MODULE,
1260 .release = l2cap_sock_release,
1261 .bind = l2cap_sock_bind,
1262 .connect = l2cap_sock_connect,
1263 .listen = l2cap_sock_listen,
1264 .accept = l2cap_sock_accept,
1265 .getname = l2cap_sock_getname,
1266 .sendmsg = l2cap_sock_sendmsg,
1267 .recvmsg = l2cap_sock_recvmsg,
1268 .poll = bt_sock_poll,
1269 .ioctl = bt_sock_ioctl,
1270 .mmap = sock_no_mmap,
1271 .socketpair = sock_no_socketpair,
1272 .shutdown = l2cap_sock_shutdown,
1273 .setsockopt = l2cap_sock_setsockopt,
1274 .getsockopt = l2cap_sock_getsockopt
1275};
1276
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001277static const struct net_proto_family l2cap_sock_family_ops = {
1278 .family = PF_BLUETOOTH,
1279 .owner = THIS_MODULE,
1280 .create = l2cap_sock_create,
1281};
1282
1283int __init l2cap_init_sockets(void)
1284{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001285 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001286
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001287 err = proto_register(&l2cap_proto, 0);
1288 if (err < 0)
1289 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001290
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001291 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001292 if (err < 0) {
1293 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001294 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001295 }
1296
Al Virob0316612013-04-04 19:14:33 -04001297 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001298 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001299 if (err < 0) {
1300 BT_ERR("Failed to create L2CAP proc file");
1301 bt_sock_unregister(BTPROTO_L2CAP);
1302 goto error;
1303 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001304
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001305 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001306
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001307 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001308
1309error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001310 proto_unregister(&l2cap_proto);
1311 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001312}
1313
1314void l2cap_cleanup_sockets(void)
1315{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001316 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001317 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001318 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001319}