blob: bee98ebfae4d9c0324ca77cca685708f12ef14a6 [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>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070035
36#include "smp.h"
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020037
Masatake YAMATO5b28d952012-07-26 01:29:25 +090038static struct bt_sock_list l2cap_sk_list = {
39 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
40};
41
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030042static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030043static void l2cap_sock_init(struct sock *sk, struct sock *parent);
Gustavo Padovan2d792812012-10-06 10:07:01 +010044static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
45 int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030046
David Herrmannb3916db2013-04-05 14:57:34 +020047bool l2cap_is_socket(struct socket *sock)
48{
49 return sock && sock->ops == &l2cap_sock_ops;
50}
51EXPORT_SYMBOL(l2cap_is_socket);
52
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020053static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
54{
55 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030056 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020057 struct sockaddr_l2 la;
58 int len, err = 0;
59
60 BT_DBG("sk %p", sk);
61
62 if (!addr || addr->sa_family != AF_BLUETOOTH)
63 return -EINVAL;
64
65 memset(&la, 0, sizeof(la));
66 len = min_t(unsigned int, sizeof(la), alen);
67 memcpy(&la, addr, len);
68
Ville Tervob62f3282011-02-10 22:38:50 -030069 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020070 return -EINVAL;
71
72 lock_sock(sk);
73
74 if (sk->sk_state != BT_OPEN) {
75 err = -EBADFD;
76 goto done;
77 }
78
79 if (la.l2_psm) {
80 __u16 psm = __le16_to_cpu(la.l2_psm);
81
82 /* PSM must be odd and lsb of upper byte must be 0 */
83 if ((psm & 0x0101) != 0x0001) {
84 err = -EINVAL;
85 goto done;
86 }
87
88 /* Restrict usage of well-known PSMs */
89 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
90 err = -EACCES;
91 goto done;
92 }
93 }
94
Ville Tervob62f3282011-02-10 22:38:50 -030095 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +053096 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030097 else
98 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030099
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300100 if (err < 0)
101 goto done;
102
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700103 switch (chan->chan_type) {
104 case L2CAP_CHAN_CONN_ORIENTED:
105 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
106 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
107 chan->sec_level = BT_SECURITY_SDP;
108 break;
109 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300110
111 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300112
113 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300114 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200115
116done:
117 release_sock(sk);
118 return err;
119}
120
Gustavo Padovan2d792812012-10-06 10:07:01 +0100121static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
122 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200123{
124 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300125 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200126 struct sockaddr_l2 la;
127 int len, err = 0;
128
129 BT_DBG("sk %p", sk);
130
131 if (!addr || alen < sizeof(addr->sa_family) ||
132 addr->sa_family != AF_BLUETOOTH)
133 return -EINVAL;
134
135 memset(&la, 0, sizeof(la));
136 len = min_t(unsigned int, sizeof(la), alen);
137 memcpy(&la, addr, len);
138
Ville Tervoacd7d372011-02-10 22:38:49 -0300139 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200140 return -EINVAL;
141
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530142 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300143 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200144 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200145 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200146
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200147 lock_sock(sk);
148
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200149 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100150 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200151
152 release_sock(sk);
153
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200154 return err;
155}
156
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200157static int l2cap_sock_listen(struct socket *sock, int backlog)
158{
159 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300160 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200161 int err = 0;
162
163 BT_DBG("sk %p backlog %d", sk, backlog);
164
165 lock_sock(sk);
166
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200167 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200168 err = -EBADFD;
169 goto done;
170 }
171
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200172 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
173 err = -EINVAL;
174 goto done;
175 }
176
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300177 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200178 case L2CAP_MODE_BASIC:
179 break;
180 case L2CAP_MODE_ERTM:
181 case L2CAP_MODE_STREAMING:
182 if (!disable_ertm)
183 break;
184 /* fall through */
185 default:
186 err = -ENOTSUPP;
187 goto done;
188 }
189
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200190 sk->sk_max_ack_backlog = backlog;
191 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300192
193 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200194 sk->sk_state = BT_LISTEN;
195
196done:
197 release_sock(sk);
198 return err;
199}
200
Gustavo Padovan2d792812012-10-06 10:07:01 +0100201static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
202 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200203{
204 DECLARE_WAITQUEUE(wait, current);
205 struct sock *sk = sock->sk, *nsk;
206 long timeo;
207 int err = 0;
208
209 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
210
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200211 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
212
213 BT_DBG("sk %p timeo %ld", sk, timeo);
214
215 /* Wait for an incoming connection. (wake-one). */
216 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400217 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200218 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200219
220 if (sk->sk_state != BT_LISTEN) {
221 err = -EBADFD;
222 break;
223 }
224
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400225 nsk = bt_accept_dequeue(sk, newsock);
226 if (nsk)
227 break;
228
229 if (!timeo) {
230 err = -EAGAIN;
231 break;
232 }
233
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200234 if (signal_pending(current)) {
235 err = sock_intr_errno(timeo);
236 break;
237 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400238
239 release_sock(sk);
240 timeo = schedule_timeout(timeo);
241 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200242 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400243 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200244 remove_wait_queue(sk_sleep(sk), &wait);
245
246 if (err)
247 goto done;
248
249 newsock->state = SS_CONNECTED;
250
251 BT_DBG("new socket %p", nsk);
252
253done:
254 release_sock(sk);
255 return err;
256}
257
Gustavo Padovan2d792812012-10-06 10:07:01 +0100258static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
259 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200260{
261 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
262 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300263 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200264
265 BT_DBG("sock %p, sk %p", sock, sk);
266
Mathias Krause792039c2012-08-15 11:31:51 +0000267 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200268 addr->sa_family = AF_BLUETOOTH;
269 *len = sizeof(struct sockaddr_l2);
270
271 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300272 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200273 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300274 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200275 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300276 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200277 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300278 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200279 }
280
281 return 0;
282}
283
Gustavo Padovan2d792812012-10-06 10:07:01 +0100284static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
285 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200286{
287 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300288 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200289 struct l2cap_options opts;
290 struct l2cap_conninfo cinfo;
291 int len, err = 0;
292 u32 opt;
293
294 BT_DBG("sk %p", sk);
295
296 if (get_user(len, optlen))
297 return -EFAULT;
298
299 lock_sock(sk);
300
301 switch (optname) {
302 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300303 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300304 opts.imtu = chan->imtu;
305 opts.omtu = chan->omtu;
306 opts.flush_to = chan->flush_to;
307 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300308 opts.fcs = chan->fcs;
309 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300310 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200311
312 len = min_t(unsigned int, len, sizeof(opts));
313 if (copy_to_user(optval, (char *) &opts, len))
314 err = -EFAULT;
315
316 break;
317
318 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300319 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200320 case BT_SECURITY_LOW:
321 opt = L2CAP_LM_AUTH;
322 break;
323 case BT_SECURITY_MEDIUM:
324 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
325 break;
326 case BT_SECURITY_HIGH:
327 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100328 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200329 break;
330 default:
331 opt = 0;
332 break;
333 }
334
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300335 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200336 opt |= L2CAP_LM_MASTER;
337
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300338 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200339 opt |= L2CAP_LM_RELIABLE;
340
341 if (put_user(opt, (u32 __user *) optval))
342 err = -EFAULT;
343 break;
344
345 case L2CAP_CONNINFO:
346 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300347 !(sk->sk_state == BT_CONNECT2 &&
348 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200349 err = -ENOTCONN;
350 break;
351 }
352
Filip Palian8d03e972011-05-12 19:32:46 +0200353 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300354 cinfo.hci_handle = chan->conn->hcon->handle;
355 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200356
357 len = min_t(unsigned int, len, sizeof(cinfo));
358 if (copy_to_user(optval, (char *) &cinfo, len))
359 err = -EFAULT;
360
361 break;
362
363 default:
364 err = -ENOPROTOOPT;
365 break;
366 }
367
368 release_sock(sk);
369 return err;
370}
371
Gustavo Padovan2d792812012-10-06 10:07:01 +0100372static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
373 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200374{
375 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300376 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200377 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700378 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200379 int len, err = 0;
380
381 BT_DBG("sk %p", sk);
382
383 if (level == SOL_L2CAP)
384 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
385
386 if (level != SOL_BLUETOOTH)
387 return -ENOPROTOOPT;
388
389 if (get_user(len, optlen))
390 return -EFAULT;
391
392 lock_sock(sk);
393
394 switch (optname) {
395 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300396 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100397 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200398 err = -EINVAL;
399 break;
400 }
401
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300402 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300403 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300404 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200405
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300406 if (sk->sk_state == BT_CONNECTED)
407 sec.key_size = chan->conn->hcon->enc_key_size;
408 } else {
409 sec.level = chan->sec_level;
410 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300411
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200412 len = min_t(unsigned int, len, sizeof(sec));
413 if (copy_to_user(optval, (char *) &sec, len))
414 err = -EFAULT;
415
416 break;
417
418 case BT_DEFER_SETUP:
419 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
420 err = -EINVAL;
421 break;
422 }
423
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300424 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
425 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200426 err = -EFAULT;
427
428 break;
429
430 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300431 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100432 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200433 err = -EFAULT;
434
435 break;
436
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700437 case BT_POWER:
438 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100439 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700440 err = -EINVAL;
441 break;
442 }
443
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300444 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700445
446 len = min_t(unsigned int, len, sizeof(pwr));
447 if (copy_to_user(optval, (char *) &pwr, len))
448 err = -EFAULT;
449
450 break;
451
Mat Martineau2ea66482011-11-02 16:18:30 -0700452 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700453 if (put_user(chan->chan_policy, (u32 __user *) optval))
454 err = -EFAULT;
455 break;
456
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200457 default:
458 err = -ENOPROTOOPT;
459 break;
460 }
461
462 release_sock(sk);
463 return err;
464}
465
Andre Guedes682877c2012-05-31 17:01:34 -0300466static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
467{
468 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300469 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300470 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300471 return false;
472 break;
473
474 default:
475 if (mtu < L2CAP_DEFAULT_MIN_MTU)
476 return false;
477 }
478
479 return true;
480}
481
Gustavo Padovan2d792812012-10-06 10:07:01 +0100482static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
483 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200484{
485 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300486 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200487 struct l2cap_options opts;
488 int len, err = 0;
489 u32 opt;
490
491 BT_DBG("sk %p", sk);
492
493 lock_sock(sk);
494
495 switch (optname) {
496 case L2CAP_OPTIONS:
497 if (sk->sk_state == BT_CONNECTED) {
498 err = -EINVAL;
499 break;
500 }
501
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300502 opts.imtu = chan->imtu;
503 opts.omtu = chan->omtu;
504 opts.flush_to = chan->flush_to;
505 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300506 opts.fcs = chan->fcs;
507 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300508 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200509
510 len = min_t(unsigned int, sizeof(opts), optlen);
511 if (copy_from_user((char *) &opts, optval, len)) {
512 err = -EFAULT;
513 break;
514 }
515
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300516 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200517 err = -EINVAL;
518 break;
519 }
520
Andre Guedes682877c2012-05-31 17:01:34 -0300521 if (!l2cap_valid_mtu(chan, opts.imtu)) {
522 err = -EINVAL;
523 break;
524 }
525
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300526 chan->mode = opts.mode;
527 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200528 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300529 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200530 break;
531 case L2CAP_MODE_ERTM:
532 case L2CAP_MODE_STREAMING:
533 if (!disable_ertm)
534 break;
535 /* fall through */
536 default:
537 err = -EINVAL;
538 break;
539 }
540
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300541 chan->imtu = opts.imtu;
542 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300543 chan->fcs = opts.fcs;
544 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300545 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300546 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200547 break;
548
549 case L2CAP_LM:
550 if (get_user(opt, (u32 __user *) optval)) {
551 err = -EFAULT;
552 break;
553 }
554
555 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300556 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200557 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300558 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200559 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300560 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200561
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300562 if (opt & L2CAP_LM_MASTER)
563 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
564 else
565 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300566
567 if (opt & L2CAP_LM_RELIABLE)
568 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
569 else
570 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200571 break;
572
573 default:
574 err = -ENOPROTOOPT;
575 break;
576 }
577
578 release_sock(sk);
579 return err;
580}
581
Gustavo Padovan2d792812012-10-06 10:07:01 +0100582static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
583 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200584{
585 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300586 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200587 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700588 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300589 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200590 int len, err = 0;
591 u32 opt;
592
593 BT_DBG("sk %p", sk);
594
595 if (level == SOL_L2CAP)
596 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
597
598 if (level != SOL_BLUETOOTH)
599 return -ENOPROTOOPT;
600
601 lock_sock(sk);
602
603 switch (optname) {
604 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300605 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100606 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200607 err = -EINVAL;
608 break;
609 }
610
611 sec.level = BT_SECURITY_LOW;
612
613 len = min_t(unsigned int, sizeof(sec), optlen);
614 if (copy_from_user((char *) &sec, optval, len)) {
615 err = -EFAULT;
616 break;
617 }
618
619 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100620 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200621 err = -EINVAL;
622 break;
623 }
624
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300625 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300626
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200627 if (!chan->conn)
628 break;
629
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300630 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200631
632 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300633 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300634 if (!conn->hcon->out) {
635 err = -EINVAL;
636 break;
637 }
638
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300639 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300640 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300641 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200642 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200643
Gustavo Padovana7d77232012-05-13 03:20:07 -0300644 /* or for ACL link */
645 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100646 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300647 sk->sk_state == BT_CONNECTED) {
648 if (!l2cap_chan_check_security(chan))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300649 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300650 else
651 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200652 } else {
653 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300654 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200655 break;
656
657 case BT_DEFER_SETUP:
658 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
659 err = -EINVAL;
660 break;
661 }
662
663 if (get_user(opt, (u32 __user *) optval)) {
664 err = -EFAULT;
665 break;
666 }
667
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300668 if (opt)
669 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
670 else
671 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200672 break;
673
674 case BT_FLUSHABLE:
675 if (get_user(opt, (u32 __user *) optval)) {
676 err = -EFAULT;
677 break;
678 }
679
680 if (opt > BT_FLUSHABLE_ON) {
681 err = -EINVAL;
682 break;
683 }
684
685 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200686 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300687 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200688 No Flush support in the LM */
689 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
690 err = -EINVAL;
691 break;
692 }
693 }
694
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300695 if (opt)
696 set_bit(FLAG_FLUSHABLE, &chan->flags);
697 else
698 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200699 break;
700
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700701 case BT_POWER:
702 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100703 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700704 err = -EINVAL;
705 break;
706 }
707
708 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
709
710 len = min_t(unsigned int, sizeof(pwr), optlen);
711 if (copy_from_user((char *) &pwr, optval, len)) {
712 err = -EFAULT;
713 break;
714 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300715
716 if (pwr.force_active)
717 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
718 else
719 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700720 break;
721
Mat Martineau2ea66482011-11-02 16:18:30 -0700722 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700723 if (get_user(opt, (u32 __user *) optval)) {
724 err = -EFAULT;
725 break;
726 }
727
728 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
729 err = -EINVAL;
730 break;
731 }
732
733 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100734 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700735 err = -EOPNOTSUPP;
736 break;
737 }
738
739 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700740
741 if (sk->sk_state == BT_CONNECTED &&
742 chan->move_role == L2CAP_MOVE_ROLE_NONE)
743 l2cap_move_start(chan);
744
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200745 break;
746
747 default:
748 err = -ENOPROTOOPT;
749 break;
750 }
751
752 release_sock(sk);
753 return err;
754}
755
Gustavo Padovan2d792812012-10-06 10:07:01 +0100756static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
757 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200758{
759 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300760 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200761 int err;
762
763 BT_DBG("sock %p, sk %p", sock, sk);
764
765 err = sock_error(sk);
766 if (err)
767 return err;
768
769 if (msg->msg_flags & MSG_OOB)
770 return -EOPNOTSUPP;
771
Mat Martineaua6a55682012-05-04 14:20:31 -0700772 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300773 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200774
Johan Hedberge793dcf2013-09-16 13:05:19 +0300775 lock_sock(sk);
776 err = bt_sock_wait_ready(sk, msg->msg_flags);
777 release_sock(sk);
778 if (err)
779 return err;
780
Mat Martineaua6a55682012-05-04 14:20:31 -0700781 l2cap_chan_lock(chan);
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200782 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Mat Martineaua6a55682012-05-04 14:20:31 -0700783 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200784
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200785 return err;
786}
787
Gustavo Padovan2d792812012-10-06 10:07:01 +0100788static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
789 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200790{
791 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700792 struct l2cap_pinfo *pi = l2cap_pi(sk);
793 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200794
795 lock_sock(sk);
796
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300797 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
798 &bt_sk(sk)->flags)) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300799 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200800 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300801
Mat Martineaue3281402011-07-07 09:39:02 -0700802 __l2cap_connect_rsp_defer(pi->chan);
Johan Hedberg970871b2013-09-25 13:26:05 +0300803 err = 0;
804 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200805 }
806
807 release_sock(sk);
808
809 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700810 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
811 else
812 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200813
Mat Martineaue3281402011-07-07 09:39:02 -0700814 if (pi->chan->mode != L2CAP_MODE_ERTM)
815 return err;
816
817 /* Attempt to put pending rx data in the socket buffer */
818
819 lock_sock(sk);
820
821 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
822 goto done;
823
824 if (pi->rx_busy_skb) {
825 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
826 pi->rx_busy_skb = NULL;
827 else
828 goto done;
829 }
830
831 /* Restore data flow when half of the receive buffer is
832 * available. This avoids resending large numbers of
833 * frames.
834 */
835 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
836 l2cap_chan_busy(pi->chan, 0);
837
838done:
839 release_sock(sk);
840 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200841}
842
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200843/* Kill socket (only if zapped and orphan)
844 * Must be called on unlocked socket.
845 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300846static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200847{
848 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
849 return;
850
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200851 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200852
853 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300854
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530855 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200856 sock_set_flag(sk, SOCK_DEAD);
857 sock_put(sk);
858}
859
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200860static int l2cap_sock_shutdown(struct socket *sock, int how)
861{
862 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200863 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200864 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200865 int err = 0;
866
867 BT_DBG("sock %p, sk %p", sock, sk);
868
869 if (!sk)
870 return 0;
871
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200872 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200873 conn = chan->conn;
874
875 if (conn)
876 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200877
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200878 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200879 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200880
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200881 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300882 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200883 err = __l2cap_wait_ack(sk);
884
885 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200886
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200887 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300888 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200889 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200890
891 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
892 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100893 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200894 }
895
896 if (!err && sk->sk_err)
897 err = -sk->sk_err;
898
899 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200900 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200901
902 if (conn)
903 mutex_unlock(&conn->chan_lock);
904
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200905 return err;
906}
907
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200908static int l2cap_sock_release(struct socket *sock)
909{
910 struct sock *sk = sock->sk;
911 int err;
912
913 BT_DBG("sock %p, sk %p", sock, sk);
914
915 if (!sk)
916 return 0;
917
Masatake YAMATO5b28d952012-07-26 01:29:25 +0900918 bt_sock_unlink(&l2cap_sk_list, sk);
919
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200920 err = l2cap_sock_shutdown(sock, 2);
921
922 sock_orphan(sk);
923 l2cap_sock_kill(sk);
924 return err;
925}
926
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -0300927static void l2cap_sock_cleanup_listen(struct sock *parent)
928{
929 struct sock *sk;
930
931 BT_DBG("parent %p", parent);
932
933 /* Close not yet accepted channels */
934 while ((sk = bt_accept_dequeue(parent, NULL))) {
935 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
936
937 l2cap_chan_lock(chan);
938 __clear_chan_timer(chan);
939 l2cap_chan_close(chan, ECONNRESET);
940 l2cap_chan_unlock(chan);
941
942 l2cap_sock_kill(sk);
943 }
944}
945
Gustavo Padovan80b98022012-05-27 22:27:51 -0300946static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300947{
Gustavo Padovan80b98022012-05-27 22:27:51 -0300948 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300949
Gustavo Padovan53826692012-05-27 22:27:55 -0300950 /* Check for backlog size */
951 if (sk_acceptq_is_full(parent)) {
952 BT_DBG("backlog full %d", parent->sk_ack_backlog);
953 return NULL;
954 }
955
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300956 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100957 GFP_ATOMIC);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300958 if (!sk)
959 return NULL;
960
Octavian Purdilad22015a2012-01-22 00:28:34 +0200961 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
962
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300963 l2cap_sock_init(sk, parent);
964
Gustavo Padovan644912e2012-10-12 19:35:23 +0800965 bt_accept_enqueue(parent, sk);
966
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300967 return l2cap_pi(sk)->chan;
968}
969
Gustavo Padovan80b98022012-05-27 22:27:51 -0300970static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300971{
Mat Martineaue3281402011-07-07 09:39:02 -0700972 int err;
Gustavo Padovan80b98022012-05-27 22:27:51 -0300973 struct sock *sk = chan->data;
Mat Martineaue3281402011-07-07 09:39:02 -0700974 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300975
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200976 lock_sock(sk);
977
978 if (pi->rx_busy_skb) {
979 err = -ENOMEM;
980 goto done;
981 }
Mat Martineaue3281402011-07-07 09:39:02 -0700982
983 err = sock_queue_rcv_skb(sk, skb);
984
985 /* For ERTM, handle one skb that doesn't fit into the recv
986 * buffer. This is important to do because the data frames
987 * have already been acked, so the skb cannot be discarded.
988 *
989 * Notify the l2cap core that the buffer is full, so the
990 * LOCAL_BUSY state is entered and no more frames are
991 * acked and reassembled until there is buffer space
992 * available.
993 */
994 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
995 pi->rx_busy_skb = skb;
996 l2cap_chan_busy(pi->chan, 1);
997 err = 0;
998 }
999
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001000done:
1001 release_sock(sk);
1002
Mat Martineaue3281402011-07-07 09:39:02 -07001003 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001004}
1005
Gustavo Padovan80b98022012-05-27 22:27:51 -03001006static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001007{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001008 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001009
1010 l2cap_sock_kill(sk);
1011}
1012
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001013static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1014{
1015 struct sock *sk = chan->data;
1016 struct sock *parent;
1017
1018 lock_sock(sk);
1019
1020 parent = bt_sk(sk)->parent;
1021
1022 sock_set_flag(sk, SOCK_ZAPPED);
1023
1024 switch (chan->state) {
1025 case BT_OPEN:
1026 case BT_BOUND:
1027 case BT_CLOSED:
1028 break;
1029 case BT_LISTEN:
1030 l2cap_sock_cleanup_listen(sk);
1031 sk->sk_state = BT_CLOSED;
1032 chan->state = BT_CLOSED;
1033
1034 break;
1035 default:
1036 sk->sk_state = BT_CLOSED;
1037 chan->state = BT_CLOSED;
1038
1039 sk->sk_err = err;
1040
1041 if (parent) {
1042 bt_accept_unlink(sk);
1043 parent->sk_data_ready(parent, 0);
1044 } else {
1045 sk->sk_state_change(sk);
1046 }
1047
1048 break;
1049 }
1050
1051 release_sock(sk);
1052}
1053
Gustavo Padovan80b98022012-05-27 22:27:51 -03001054static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001055{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001056 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001057
1058 sk->sk_state = state;
1059}
1060
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001061static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -03001062 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001063{
Gustavo Padovan90338942012-04-06 20:15:47 -03001064 struct sk_buff *skb;
1065 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001066
Mat Martineaua6a55682012-05-04 14:20:31 -07001067 l2cap_chan_unlock(chan);
Gustavo Padovan90338942012-04-06 20:15:47 -03001068 skb = bt_skb_send_alloc(chan->sk, len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001069 l2cap_chan_lock(chan);
1070
Gustavo Padovan90338942012-04-06 20:15:47 -03001071 if (!skb)
1072 return ERR_PTR(err);
1073
1074 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001075}
1076
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001077static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1078{
1079 struct sock *sk = chan->data;
1080 struct sock *parent;
1081
1082 lock_sock(sk);
1083
1084 parent = bt_sk(sk)->parent;
1085
1086 BT_DBG("sk %p, parent %p", sk, parent);
1087
1088 sk->sk_state = BT_CONNECTED;
1089 sk->sk_state_change(sk);
1090
1091 if (parent)
1092 parent->sk_data_ready(parent, 0);
1093
1094 release_sock(sk);
1095}
1096
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001097static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1098{
1099 struct sock *sk = chan->data;
1100 struct sock *parent = bt_sk(sk)->parent;
1101
1102 if (parent)
1103 parent->sk_data_ready(parent, 0);
1104}
1105
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001106static struct l2cap_ops l2cap_chan_ops = {
1107 .name = "L2CAP Socket Interface",
1108 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001109 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001110 .close = l2cap_sock_close_cb,
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001111 .teardown = l2cap_sock_teardown_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001112 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001113 .ready = l2cap_sock_ready_cb,
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001114 .defer = l2cap_sock_defer_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001115 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001116};
1117
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001118static void l2cap_sock_destruct(struct sock *sk)
1119{
1120 BT_DBG("sk %p", sk);
1121
Sasha Levin23d3a862012-10-08 16:48:32 -04001122 if (l2cap_pi(sk)->chan)
1123 l2cap_chan_put(l2cap_pi(sk)->chan);
Mat Martineaue3281402011-07-07 09:39:02 -07001124 if (l2cap_pi(sk)->rx_busy_skb) {
1125 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1126 l2cap_pi(sk)->rx_busy_skb = NULL;
1127 }
1128
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001129 skb_queue_purge(&sk->sk_receive_queue);
1130 skb_queue_purge(&sk->sk_write_queue);
1131}
1132
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001133static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001134{
1135 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001136 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001137
1138 BT_DBG("sk %p", sk);
1139
1140 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001141 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1142
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001143 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001144 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001145
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001146 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001147 chan->imtu = pchan->imtu;
1148 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001149 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001150 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001151 chan->fcs = pchan->fcs;
1152 chan->max_tx = pchan->max_tx;
1153 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001154 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001155 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001156 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +00001157
1158 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001159 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001160
1161 switch (sk->sk_type) {
1162 case SOCK_RAW:
1163 chan->chan_type = L2CAP_CHAN_RAW;
1164 break;
1165 case SOCK_DGRAM:
1166 chan->chan_type = L2CAP_CHAN_CONN_LESS;
1167 break;
1168 case SOCK_SEQPACKET:
1169 case SOCK_STREAM:
1170 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1171 break;
1172 }
1173
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001174 chan->imtu = L2CAP_DEFAULT_MTU;
1175 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001176 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001177 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001178 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001179 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001180 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001181 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001182
1183 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001184 }
1185
1186 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001187 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001188
1189 chan->data = sk;
1190 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001191}
1192
1193static struct proto l2cap_proto = {
1194 .name = "L2CAP",
1195 .owner = THIS_MODULE,
1196 .obj_size = sizeof(struct l2cap_pinfo)
1197};
1198
Gustavo Padovan2d792812012-10-06 10:07:01 +01001199static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1200 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001201{
1202 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001203 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001204
1205 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1206 if (!sk)
1207 return NULL;
1208
1209 sock_init_data(sock, sk);
1210 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1211
1212 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001213 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001214
1215 sock_reset_flag(sk, SOCK_ZAPPED);
1216
1217 sk->sk_protocol = proto;
1218 sk->sk_state = BT_OPEN;
1219
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001220 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001221 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301222 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001223 return NULL;
1224 }
1225
Mat Martineau61d6ef32012-04-27 16:50:50 -07001226 l2cap_chan_hold(chan);
1227
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001228 chan->sk = sk;
1229
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001230 l2cap_pi(sk)->chan = chan;
1231
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001232 return sk;
1233}
1234
1235static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1236 int kern)
1237{
1238 struct sock *sk;
1239
1240 BT_DBG("sock %p", sock);
1241
1242 sock->state = SS_UNCONNECTED;
1243
1244 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001245 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001246 return -ESOCKTNOSUPPORT;
1247
1248 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1249 return -EPERM;
1250
1251 sock->ops = &l2cap_sock_ops;
1252
1253 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1254 if (!sk)
1255 return -ENOMEM;
1256
1257 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001258 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001259 return 0;
1260}
1261
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001262static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001263 .family = PF_BLUETOOTH,
1264 .owner = THIS_MODULE,
1265 .release = l2cap_sock_release,
1266 .bind = l2cap_sock_bind,
1267 .connect = l2cap_sock_connect,
1268 .listen = l2cap_sock_listen,
1269 .accept = l2cap_sock_accept,
1270 .getname = l2cap_sock_getname,
1271 .sendmsg = l2cap_sock_sendmsg,
1272 .recvmsg = l2cap_sock_recvmsg,
1273 .poll = bt_sock_poll,
1274 .ioctl = bt_sock_ioctl,
1275 .mmap = sock_no_mmap,
1276 .socketpair = sock_no_socketpair,
1277 .shutdown = l2cap_sock_shutdown,
1278 .setsockopt = l2cap_sock_setsockopt,
1279 .getsockopt = l2cap_sock_getsockopt
1280};
1281
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001282static const struct net_proto_family l2cap_sock_family_ops = {
1283 .family = PF_BLUETOOTH,
1284 .owner = THIS_MODULE,
1285 .create = l2cap_sock_create,
1286};
1287
1288int __init l2cap_init_sockets(void)
1289{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001290 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001291
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001292 err = proto_register(&l2cap_proto, 0);
1293 if (err < 0)
1294 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001295
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001296 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001297 if (err < 0) {
1298 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001299 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001300 }
1301
Al Virob0316612013-04-04 19:14:33 -04001302 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001303 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001304 if (err < 0) {
1305 BT_ERR("Failed to create L2CAP proc file");
1306 bt_sock_unregister(BTPROTO_L2CAP);
1307 goto error;
1308 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001309
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001310 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001311
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001312 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001313
1314error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001315 proto_unregister(&l2cap_proto);
1316 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001317}
1318
1319void l2cap_cleanup_sockets(void)
1320{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001321 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001322 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001323 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001324}