blob: 5a42f6a818c04c95112cace598bc9170a3808ddf [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
Johan Hedberg91497612013-12-02 11:20:20 +020030#include <linux/module.h>
Paul Gortmakerbc3b2d72011-07-15 11:47:34 -040031#include <linux/export.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000032
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020033#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020034#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020035#include <net/bluetooth/l2cap.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070036
37#include "smp.h"
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020038
Masatake YAMATO5b28d952012-07-26 01:29:25 +090039static struct bt_sock_list l2cap_sk_list = {
40 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
41};
42
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030043static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030044static void l2cap_sock_init(struct sock *sk, struct sock *parent);
Gustavo Padovan2d792812012-10-06 10:07:01 +010045static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
46 int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030047
David Herrmannb3916db2013-04-05 14:57:34 +020048bool l2cap_is_socket(struct socket *sock)
49{
50 return sock && sock->ops == &l2cap_sock_ops;
51}
52EXPORT_SYMBOL(l2cap_is_socket);
53
Johan Hedberg49460962013-10-08 13:55:46 +020054static int l2cap_validate_bredr_psm(u16 psm)
55{
56 /* PSM must be odd and lsb of upper byte must be 0 */
57 if ((psm & 0x0101) != 0x0001)
58 return -EINVAL;
59
60 /* Restrict usage of well-known PSMs */
61 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE))
62 return -EACCES;
63
64 return 0;
65}
66
67static int l2cap_validate_le_psm(u16 psm)
68{
69 /* Valid LE_PSM ranges are defined only until 0x00ff */
70 if (psm > 0x00ff)
71 return -EINVAL;
72
73 /* Restrict fixed, SIG assigned PSM values to CAP_NET_BIND_SERVICE */
74 if (psm <= 0x007f && !capable(CAP_NET_BIND_SERVICE))
75 return -EACCES;
76
77 return 0;
78}
79
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020080static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
81{
82 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030083 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020084 struct sockaddr_l2 la;
85 int len, err = 0;
86
87 BT_DBG("sk %p", sk);
88
89 if (!addr || addr->sa_family != AF_BLUETOOTH)
90 return -EINVAL;
91
92 memset(&la, 0, sizeof(la));
93 len = min_t(unsigned int, sizeof(la), alen);
94 memcpy(&la, addr, len);
95
Ville Tervob62f3282011-02-10 22:38:50 -030096 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020097 return -EINVAL;
98
Johan Hedberg80c1a2e2013-10-14 21:17:52 +030099 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
100 return -EINVAL;
101
Johan Hedberg21626e62014-01-24 10:35:41 +0200102 if (la.l2_cid) {
103 /* When the socket gets created it defaults to
104 * CHAN_CONN_ORIENTED, so we need to overwrite the
105 * default here.
106 */
107 chan->chan_type = L2CAP_CHAN_FIXED;
108 chan->omtu = L2CAP_DEFAULT_MTU;
109 }
110
Johan Hedbergbfe46552013-10-16 17:13:26 +0300111 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300112 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200113 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700114 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300115 return -EINVAL;
116 }
117
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200118 lock_sock(sk);
119
120 if (sk->sk_state != BT_OPEN) {
121 err = -EBADFD;
122 goto done;
123 }
124
125 if (la.l2_psm) {
126 __u16 psm = __le16_to_cpu(la.l2_psm);
127
Johan Hedberg49460962013-10-08 13:55:46 +0200128 if (la.l2_bdaddr_type == BDADDR_BREDR)
129 err = l2cap_validate_bredr_psm(psm);
130 else
131 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200132
Johan Hedberg49460962013-10-08 13:55:46 +0200133 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200134 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200135 }
136
Ville Tervob62f3282011-02-10 22:38:50 -0300137 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530138 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300139 else
140 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300141
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300142 if (err < 0)
143 goto done;
144
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700145 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700146 case L2CAP_CHAN_CONN_LESS:
147 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
148 chan->sec_level = BT_SECURITY_SDP;
149 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700150 case L2CAP_CHAN_CONN_ORIENTED:
151 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
152 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
153 chan->sec_level = BT_SECURITY_SDP;
154 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200155 case L2CAP_CHAN_RAW:
156 chan->sec_level = BT_SECURITY_SDP;
157 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700158 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300159
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700160 bacpy(&chan->src, &la.l2_bdaddr);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700161 chan->src_type = la.l2_bdaddr_type;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300162
Johan Hedberg38319712013-05-17 12:49:23 +0300163 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200164 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300165
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300166 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200168
169done:
170 release_sock(sk);
171 return err;
172}
173
Gustavo Padovan2d792812012-10-06 10:07:01 +0100174static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
175 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200176{
177 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300178 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200179 struct sockaddr_l2 la;
180 int len, err = 0;
181
182 BT_DBG("sk %p", sk);
183
184 if (!addr || alen < sizeof(addr->sa_family) ||
185 addr->sa_family != AF_BLUETOOTH)
186 return -EINVAL;
187
188 memset(&la, 0, sizeof(la));
189 len = min_t(unsigned int, sizeof(la), alen);
190 memcpy(&la, addr, len);
191
Ville Tervoacd7d372011-02-10 22:38:49 -0300192 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200193 return -EINVAL;
194
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300195 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
196 return -EINVAL;
197
Johan Hedbergeb622492013-10-18 11:49:25 +0300198 /* Check that the socket wasn't bound to something that
199 * conflicts with the address given to connect(). If chan->src
200 * is BDADDR_ANY it means bind() was never used, in which case
201 * chan->src_type and la.l2_bdaddr_type do not need to match.
202 */
203 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
204 bdaddr_type_is_le(la.l2_bdaddr_type)) {
205 /* Old user space versions will try to incorrectly bind
206 * the ATT socket using BDADDR_BREDR. We need to accept
207 * this and fix up the source address type only when
208 * both the source CID and destination CID indicate
209 * ATT. Anything else is an invalid combination.
210 */
211 if (chan->scid != L2CAP_CID_ATT ||
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700212 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergeb622492013-10-18 11:49:25 +0300213 return -EINVAL;
214
215 /* We don't have the hdev available here to make a
216 * better decision on random vs public, but since all
217 * user space versions that exhibit this issue anyway do
218 * not support random local addresses assuming public
219 * here is good enough.
220 */
221 chan->src_type = BDADDR_LE_PUBLIC;
222 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300223
224 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
225 return -EINVAL;
226
Johan Hedbergbfe46552013-10-16 17:13:26 +0300227 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300228 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200229 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700230 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300231 return -EINVAL;
232 }
233
Johan Hedberg38319712013-05-17 12:49:23 +0300234 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200235 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300236
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530237 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300238 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200239 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200240 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200241
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200242 lock_sock(sk);
243
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200244 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100245 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200246
247 release_sock(sk);
248
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200249 return err;
250}
251
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200252static int l2cap_sock_listen(struct socket *sock, int backlog)
253{
254 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300255 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200256 int err = 0;
257
258 BT_DBG("sk %p backlog %d", sk, backlog);
259
260 lock_sock(sk);
261
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200262 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200263 err = -EBADFD;
264 goto done;
265 }
266
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200267 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
268 err = -EINVAL;
269 goto done;
270 }
271
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300272 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200273 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300274 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200275 break;
276 case L2CAP_MODE_ERTM:
277 case L2CAP_MODE_STREAMING:
278 if (!disable_ertm)
279 break;
280 /* fall through */
281 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300282 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200283 goto done;
284 }
285
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200286 sk->sk_max_ack_backlog = backlog;
287 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300288
289 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200290 sk->sk_state = BT_LISTEN;
291
292done:
293 release_sock(sk);
294 return err;
295}
296
Gustavo Padovan2d792812012-10-06 10:07:01 +0100297static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
298 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200299{
300 DECLARE_WAITQUEUE(wait, current);
301 struct sock *sk = sock->sk, *nsk;
302 long timeo;
303 int err = 0;
304
305 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
306
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200307 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
308
309 BT_DBG("sk %p timeo %ld", sk, timeo);
310
311 /* Wait for an incoming connection. (wake-one). */
312 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400313 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200314 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200315
316 if (sk->sk_state != BT_LISTEN) {
317 err = -EBADFD;
318 break;
319 }
320
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400321 nsk = bt_accept_dequeue(sk, newsock);
322 if (nsk)
323 break;
324
325 if (!timeo) {
326 err = -EAGAIN;
327 break;
328 }
329
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200330 if (signal_pending(current)) {
331 err = sock_intr_errno(timeo);
332 break;
333 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400334
335 release_sock(sk);
336 timeo = schedule_timeout(timeo);
337 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200338 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400339 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200340 remove_wait_queue(sk_sleep(sk), &wait);
341
342 if (err)
343 goto done;
344
345 newsock->state = SS_CONNECTED;
346
347 BT_DBG("new socket %p", nsk);
348
349done:
350 release_sock(sk);
351 return err;
352}
353
Gustavo Padovan2d792812012-10-06 10:07:01 +0100354static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
355 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200356{
357 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
358 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300359 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200360
361 BT_DBG("sock %p, sk %p", sock, sk);
362
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200363 if (peer && sk->sk_state != BT_CONNECTED &&
Johan Hedbergbf19d512014-07-01 12:07:23 +0300364 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
365 sk->sk_state != BT_CONFIG)
Johan Hedbergb783fbc2014-01-28 15:16:49 -0800366 return -ENOTCONN;
367
Mathias Krause792039c2012-08-15 11:31:51 +0000368 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200369 addr->sa_family = AF_BLUETOOTH;
370 *len = sizeof(struct sockaddr_l2);
371
Johan Hedbergd7e5e762014-01-28 15:16:51 -0800372 la->l2_psm = chan->psm;
373
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200374 if (peer) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700375 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300376 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700377 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200378 } else {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700379 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300380 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700381 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200382 }
383
384 return 0;
385}
386
Gustavo Padovan2d792812012-10-06 10:07:01 +0100387static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
388 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200389{
390 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300391 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200392 struct l2cap_options opts;
393 struct l2cap_conninfo cinfo;
394 int len, err = 0;
395 u32 opt;
396
397 BT_DBG("sk %p", sk);
398
399 if (get_user(len, optlen))
400 return -EFAULT;
401
402 lock_sock(sk);
403
404 switch (optname) {
405 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200406 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
407 * legacy ATT code depends on getsockopt for
408 * L2CAP_OPTIONS we need to let this pass.
409 */
410 if (bdaddr_type_is_le(chan->src_type) &&
411 chan->scid != L2CAP_CID_ATT) {
412 err = -EINVAL;
413 break;
414 }
415
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300416 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300417 opts.imtu = chan->imtu;
418 opts.omtu = chan->omtu;
419 opts.flush_to = chan->flush_to;
420 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300421 opts.fcs = chan->fcs;
422 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300423 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200424
425 len = min_t(unsigned int, len, sizeof(opts));
426 if (copy_to_user(optval, (char *) &opts, len))
427 err = -EFAULT;
428
429 break;
430
431 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300432 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200433 case BT_SECURITY_LOW:
434 opt = L2CAP_LM_AUTH;
435 break;
436 case BT_SECURITY_MEDIUM:
437 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
438 break;
439 case BT_SECURITY_HIGH:
440 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100441 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200442 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800443 case BT_SECURITY_FIPS:
444 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
445 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
446 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200447 default:
448 opt = 0;
449 break;
450 }
451
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300452 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200453 opt |= L2CAP_LM_MASTER;
454
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300455 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200456 opt |= L2CAP_LM_RELIABLE;
457
458 if (put_user(opt, (u32 __user *) optval))
459 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800460
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200461 break;
462
463 case L2CAP_CONNINFO:
464 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300465 !(sk->sk_state == BT_CONNECT2 &&
466 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200467 err = -ENOTCONN;
468 break;
469 }
470
Filip Palian8d03e972011-05-12 19:32:46 +0200471 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300472 cinfo.hci_handle = chan->conn->hcon->handle;
473 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200474
475 len = min_t(unsigned int, len, sizeof(cinfo));
476 if (copy_to_user(optval, (char *) &cinfo, len))
477 err = -EFAULT;
478
479 break;
480
481 default:
482 err = -ENOPROTOOPT;
483 break;
484 }
485
486 release_sock(sk);
487 return err;
488}
489
Gustavo Padovan2d792812012-10-06 10:07:01 +0100490static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
491 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200492{
493 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300494 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200495 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700496 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200497 int len, err = 0;
498
499 BT_DBG("sk %p", sk);
500
501 if (level == SOL_L2CAP)
502 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
503
504 if (level != SOL_BLUETOOTH)
505 return -ENOPROTOOPT;
506
507 if (get_user(len, optlen))
508 return -EFAULT;
509
510 lock_sock(sk);
511
512 switch (optname) {
513 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300514 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500515 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100516 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200517 err = -EINVAL;
518 break;
519 }
520
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300521 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300522 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300523 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200524
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300525 if (sk->sk_state == BT_CONNECTED)
526 sec.key_size = chan->conn->hcon->enc_key_size;
527 } else {
528 sec.level = chan->sec_level;
529 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300530
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200531 len = min_t(unsigned int, len, sizeof(sec));
532 if (copy_to_user(optval, (char *) &sec, len))
533 err = -EFAULT;
534
535 break;
536
537 case BT_DEFER_SETUP:
538 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
539 err = -EINVAL;
540 break;
541 }
542
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300543 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
544 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200545 err = -EFAULT;
546
547 break;
548
549 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300550 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100551 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200552 err = -EFAULT;
553
554 break;
555
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700556 case BT_POWER:
557 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100558 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700559 err = -EINVAL;
560 break;
561 }
562
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300563 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700564
565 len = min_t(unsigned int, len, sizeof(pwr));
566 if (copy_to_user(optval, (char *) &pwr, len))
567 err = -EFAULT;
568
569 break;
570
Mat Martineau2ea66482011-11-02 16:18:30 -0700571 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700572 if (put_user(chan->chan_policy, (u32 __user *) optval))
573 err = -EFAULT;
574 break;
575
Johan Hedberg1f435422013-12-02 16:34:18 +0200576 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200577 if (!bdaddr_type_is_le(chan->src_type)) {
578 err = -EINVAL;
579 break;
580 }
581
582 if (sk->sk_state != BT_CONNECTED) {
583 err = -ENOTCONN;
584 break;
585 }
586
587 if (put_user(chan->omtu, (u16 __user *) optval))
588 err = -EFAULT;
589 break;
590
591 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200592 if (!bdaddr_type_is_le(chan->src_type)) {
593 err = -EINVAL;
594 break;
595 }
596
597 if (put_user(chan->imtu, (u16 __user *) optval))
598 err = -EFAULT;
599 break;
600
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200601 default:
602 err = -ENOPROTOOPT;
603 break;
604 }
605
606 release_sock(sk);
607 return err;
608}
609
Andre Guedes682877c2012-05-31 17:01:34 -0300610static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
611{
612 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300613 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300614 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300615 return false;
616 break;
617
618 default:
619 if (mtu < L2CAP_DEFAULT_MIN_MTU)
620 return false;
621 }
622
623 return true;
624}
625
Gustavo Padovan2d792812012-10-06 10:07:01 +0100626static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
627 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200628{
629 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300630 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200631 struct l2cap_options opts;
632 int len, err = 0;
633 u32 opt;
634
635 BT_DBG("sk %p", sk);
636
637 lock_sock(sk);
638
639 switch (optname) {
640 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200641 if (bdaddr_type_is_le(chan->src_type)) {
642 err = -EINVAL;
643 break;
644 }
645
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200646 if (sk->sk_state == BT_CONNECTED) {
647 err = -EINVAL;
648 break;
649 }
650
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300651 opts.imtu = chan->imtu;
652 opts.omtu = chan->omtu;
653 opts.flush_to = chan->flush_to;
654 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300655 opts.fcs = chan->fcs;
656 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300657 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200658
659 len = min_t(unsigned int, sizeof(opts), optlen);
660 if (copy_from_user((char *) &opts, optval, len)) {
661 err = -EFAULT;
662 break;
663 }
664
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300665 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200666 err = -EINVAL;
667 break;
668 }
669
Andre Guedes682877c2012-05-31 17:01:34 -0300670 if (!l2cap_valid_mtu(chan, opts.imtu)) {
671 err = -EINVAL;
672 break;
673 }
674
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300675 chan->mode = opts.mode;
676 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +0300677 case L2CAP_MODE_LE_FLOWCTL:
678 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200679 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300680 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200681 break;
682 case L2CAP_MODE_ERTM:
683 case L2CAP_MODE_STREAMING:
684 if (!disable_ertm)
685 break;
686 /* fall through */
687 default:
688 err = -EINVAL;
689 break;
690 }
691
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300692 chan->imtu = opts.imtu;
693 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300694 chan->fcs = opts.fcs;
695 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300696 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300697 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200698 break;
699
700 case L2CAP_LM:
701 if (get_user(opt, (u32 __user *) optval)) {
702 err = -EFAULT;
703 break;
704 }
705
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800706 if (opt & L2CAP_LM_FIPS) {
707 err = -EINVAL;
708 break;
709 }
710
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200711 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300712 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200713 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300714 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200715 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300716 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200717
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300718 if (opt & L2CAP_LM_MASTER)
719 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
720 else
721 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300722
723 if (opt & L2CAP_LM_RELIABLE)
724 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
725 else
726 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200727 break;
728
729 default:
730 err = -ENOPROTOOPT;
731 break;
732 }
733
734 release_sock(sk);
735 return err;
736}
737
Gustavo Padovan2d792812012-10-06 10:07:01 +0100738static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
739 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200740{
741 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300742 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200743 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700744 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300745 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200746 int len, err = 0;
747 u32 opt;
748
749 BT_DBG("sk %p", sk);
750
751 if (level == SOL_L2CAP)
752 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
753
754 if (level != SOL_BLUETOOTH)
755 return -ENOPROTOOPT;
756
757 lock_sock(sk);
758
759 switch (optname) {
760 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300761 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500762 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100763 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200764 err = -EINVAL;
765 break;
766 }
767
768 sec.level = BT_SECURITY_LOW;
769
770 len = min_t(unsigned int, sizeof(sec), optlen);
771 if (copy_from_user((char *) &sec, optval, len)) {
772 err = -EFAULT;
773 break;
774 }
775
776 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100777 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200778 err = -EINVAL;
779 break;
780 }
781
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300782 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300783
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200784 if (!chan->conn)
785 break;
786
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300787 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200788
789 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300790 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300791 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300792 break;
Johan Hedbergd52deb12014-08-07 22:56:44 +0300793 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300794 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200795 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200796
Gustavo Padovana7d77232012-05-13 03:20:07 -0300797 /* or for ACL link */
798 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100799 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300800 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300801 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300802 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300803 else
804 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200805 } else {
806 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300807 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200808 break;
809
810 case BT_DEFER_SETUP:
811 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
812 err = -EINVAL;
813 break;
814 }
815
816 if (get_user(opt, (u32 __user *) optval)) {
817 err = -EFAULT;
818 break;
819 }
820
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700821 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300822 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700823 set_bit(FLAG_DEFER_SETUP, &chan->flags);
824 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300825 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700826 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
827 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200828 break;
829
830 case BT_FLUSHABLE:
831 if (get_user(opt, (u32 __user *) optval)) {
832 err = -EFAULT;
833 break;
834 }
835
836 if (opt > BT_FLUSHABLE_ON) {
837 err = -EINVAL;
838 break;
839 }
840
841 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200842 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300843 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200844 No Flush support in the LM */
845 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
846 err = -EINVAL;
847 break;
848 }
849 }
850
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300851 if (opt)
852 set_bit(FLAG_FLUSHABLE, &chan->flags);
853 else
854 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200855 break;
856
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700857 case BT_POWER:
858 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100859 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700860 err = -EINVAL;
861 break;
862 }
863
864 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
865
866 len = min_t(unsigned int, sizeof(pwr), optlen);
867 if (copy_from_user((char *) &pwr, optval, len)) {
868 err = -EFAULT;
869 break;
870 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300871
872 if (pwr.force_active)
873 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
874 else
875 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700876 break;
877
Mat Martineau2ea66482011-11-02 16:18:30 -0700878 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700879 if (get_user(opt, (u32 __user *) optval)) {
880 err = -EFAULT;
881 break;
882 }
883
884 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
885 err = -EINVAL;
886 break;
887 }
888
889 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100890 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700891 err = -EOPNOTSUPP;
892 break;
893 }
894
895 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700896
897 if (sk->sk_state == BT_CONNECTED &&
898 chan->move_role == L2CAP_MOVE_ROLE_NONE)
899 l2cap_move_start(chan);
900
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200901 break;
902
Johan Hedberg1f435422013-12-02 16:34:18 +0200903 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200904 if (!bdaddr_type_is_le(chan->src_type)) {
905 err = -EINVAL;
906 break;
907 }
908
909 /* Setting is not supported as it's the remote side that
910 * decides this.
911 */
912 err = -EPERM;
913 break;
914
915 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200916 if (!bdaddr_type_is_le(chan->src_type)) {
917 err = -EINVAL;
918 break;
919 }
920
921 if (sk->sk_state == BT_CONNECTED) {
922 err = -EISCONN;
923 break;
924 }
925
926 if (get_user(opt, (u32 __user *) optval)) {
927 err = -EFAULT;
928 break;
929 }
930
931 chan->imtu = opt;
932 break;
933
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200934 default:
935 err = -ENOPROTOOPT;
936 break;
937 }
938
939 release_sock(sk);
940 return err;
941}
942
Gustavo Padovan2d792812012-10-06 10:07:01 +0100943static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
944 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200945{
946 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300947 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200948 int err;
949
950 BT_DBG("sock %p, sk %p", sock, sk);
951
952 err = sock_error(sk);
953 if (err)
954 return err;
955
956 if (msg->msg_flags & MSG_OOB)
957 return -EOPNOTSUPP;
958
Mat Martineaua6a55682012-05-04 14:20:31 -0700959 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300960 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200961
Johan Hedberge793dcf2013-09-16 13:05:19 +0300962 lock_sock(sk);
963 err = bt_sock_wait_ready(sk, msg->msg_flags);
964 release_sock(sk);
965 if (err)
966 return err;
967
Mat Martineaua6a55682012-05-04 14:20:31 -0700968 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +0200969 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -0700970 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200971
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200972 return err;
973}
974
Gustavo Padovan2d792812012-10-06 10:07:01 +0100975static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
976 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200977{
978 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700979 struct l2cap_pinfo *pi = l2cap_pi(sk);
980 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200981
982 lock_sock(sk);
983
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300984 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
985 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +0300986 if (bdaddr_type_is_le(pi->chan->src_type)) {
987 sk->sk_state = BT_CONNECTED;
988 pi->chan->state = BT_CONNECTED;
989 __l2cap_le_connect_rsp_defer(pi->chan);
990 } else {
991 sk->sk_state = BT_CONFIG;
992 pi->chan->state = BT_CONFIG;
993 __l2cap_connect_rsp_defer(pi->chan);
994 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300995
Johan Hedberg970871b2013-09-25 13:26:05 +0300996 err = 0;
997 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200998 }
999
1000 release_sock(sk);
1001
1002 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -07001003 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
1004 else
1005 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001006
Mat Martineaue3281402011-07-07 09:39:02 -07001007 if (pi->chan->mode != L2CAP_MODE_ERTM)
1008 return err;
1009
1010 /* Attempt to put pending rx data in the socket buffer */
1011
1012 lock_sock(sk);
1013
1014 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1015 goto done;
1016
1017 if (pi->rx_busy_skb) {
1018 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
1019 pi->rx_busy_skb = NULL;
1020 else
1021 goto done;
1022 }
1023
1024 /* Restore data flow when half of the receive buffer is
1025 * available. This avoids resending large numbers of
1026 * frames.
1027 */
1028 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1029 l2cap_chan_busy(pi->chan, 0);
1030
1031done:
1032 release_sock(sk);
1033 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001034}
1035
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001036/* Kill socket (only if zapped and orphan)
1037 * Must be called on unlocked socket.
1038 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001039static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001040{
1041 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1042 return;
1043
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001044 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001045
1046 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001047
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301048 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001049 sock_set_flag(sk, SOCK_DEAD);
1050 sock_put(sk);
1051}
1052
Gustavo Padovandc253062013-10-15 19:24:49 -03001053static int __l2cap_wait_ack(struct sock *sk)
1054{
1055 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1056 DECLARE_WAITQUEUE(wait, current);
1057 int err = 0;
1058 int timeo = HZ/5;
1059
1060 add_wait_queue(sk_sleep(sk), &wait);
1061 set_current_state(TASK_INTERRUPTIBLE);
1062 while (chan->unacked_frames > 0 && chan->conn) {
1063 if (!timeo)
1064 timeo = HZ/5;
1065
1066 if (signal_pending(current)) {
1067 err = sock_intr_errno(timeo);
1068 break;
1069 }
1070
1071 release_sock(sk);
1072 timeo = schedule_timeout(timeo);
1073 lock_sock(sk);
1074 set_current_state(TASK_INTERRUPTIBLE);
1075
1076 err = sock_error(sk);
1077 if (err)
1078 break;
1079 }
1080 set_current_state(TASK_RUNNING);
1081 remove_wait_queue(sk_sleep(sk), &wait);
1082 return err;
1083}
1084
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001085static int l2cap_sock_shutdown(struct socket *sock, int how)
1086{
1087 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001088 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001089 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001090 int err = 0;
1091
1092 BT_DBG("sock %p, sk %p", sock, sk);
1093
1094 if (!sk)
1095 return 0;
1096
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001097 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001098 conn = chan->conn;
1099
1100 if (conn)
1101 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001102
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001103 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001104 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001105
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001106 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001107 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001108 err = __l2cap_wait_ack(sk);
1109
1110 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001111
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001112 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03001113 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001114 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001115
Vladimir Davydov093facf2014-07-15 12:25:28 +04001116 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1117 !(current->flags & PF_EXITING))
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001118 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001119 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001120 }
1121
1122 if (!err && sk->sk_err)
1123 err = -sk->sk_err;
1124
1125 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001126 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001127
1128 if (conn)
1129 mutex_unlock(&conn->chan_lock);
1130
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001131 return err;
1132}
1133
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001134static int l2cap_sock_release(struct socket *sock)
1135{
1136 struct sock *sk = sock->sk;
1137 int err;
1138
1139 BT_DBG("sock %p, sk %p", sock, sk);
1140
1141 if (!sk)
1142 return 0;
1143
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001144 bt_sock_unlink(&l2cap_sk_list, sk);
1145
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001146 err = l2cap_sock_shutdown(sock, 2);
1147
1148 sock_orphan(sk);
1149 l2cap_sock_kill(sk);
1150 return err;
1151}
1152
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001153static void l2cap_sock_cleanup_listen(struct sock *parent)
1154{
1155 struct sock *sk;
1156
1157 BT_DBG("parent %p", parent);
1158
1159 /* Close not yet accepted channels */
1160 while ((sk = bt_accept_dequeue(parent, NULL))) {
1161 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1162
1163 l2cap_chan_lock(chan);
1164 __clear_chan_timer(chan);
1165 l2cap_chan_close(chan, ECONNRESET);
1166 l2cap_chan_unlock(chan);
1167
1168 l2cap_sock_kill(sk);
1169 }
1170}
1171
Gustavo Padovan80b98022012-05-27 22:27:51 -03001172static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001173{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001174 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001175
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001176 lock_sock(parent);
1177
Gustavo Padovan53826692012-05-27 22:27:55 -03001178 /* Check for backlog size */
1179 if (sk_acceptq_is_full(parent)) {
1180 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001181 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001182 return NULL;
1183 }
1184
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001185 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001186 GFP_ATOMIC);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001187 if (!sk) {
1188 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001189 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001190 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001191
Octavian Purdilad22015a2012-01-22 00:28:34 +02001192 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1193
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001194 l2cap_sock_init(sk, parent);
1195
Gustavo Padovan644912e2012-10-12 19:35:23 +08001196 bt_accept_enqueue(parent, sk);
1197
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001198 release_sock(parent);
1199
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001200 return l2cap_pi(sk)->chan;
1201}
1202
Gustavo Padovan80b98022012-05-27 22:27:51 -03001203static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001204{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001205 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001206 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001207
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001208 lock_sock(sk);
1209
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001210 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001211 err = -ENOMEM;
1212 goto done;
1213 }
Mat Martineaue3281402011-07-07 09:39:02 -07001214
1215 err = sock_queue_rcv_skb(sk, skb);
1216
1217 /* For ERTM, handle one skb that doesn't fit into the recv
1218 * buffer. This is important to do because the data frames
1219 * have already been acked, so the skb cannot be discarded.
1220 *
1221 * Notify the l2cap core that the buffer is full, so the
1222 * LOCAL_BUSY state is entered and no more frames are
1223 * acked and reassembled until there is buffer space
1224 * available.
1225 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001226 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1227 l2cap_pi(sk)->rx_busy_skb = skb;
1228 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001229 err = 0;
1230 }
1231
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001232done:
1233 release_sock(sk);
1234
Mat Martineaue3281402011-07-07 09:39:02 -07001235 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001236}
1237
Gustavo Padovan80b98022012-05-27 22:27:51 -03001238static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001239{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001240 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001241
1242 l2cap_sock_kill(sk);
1243}
1244
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001245static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1246{
1247 struct sock *sk = chan->data;
1248 struct sock *parent;
1249
1250 lock_sock(sk);
1251
1252 parent = bt_sk(sk)->parent;
1253
1254 sock_set_flag(sk, SOCK_ZAPPED);
1255
1256 switch (chan->state) {
1257 case BT_OPEN:
1258 case BT_BOUND:
1259 case BT_CLOSED:
1260 break;
1261 case BT_LISTEN:
1262 l2cap_sock_cleanup_listen(sk);
1263 sk->sk_state = BT_CLOSED;
1264 chan->state = BT_CLOSED;
1265
1266 break;
1267 default:
1268 sk->sk_state = BT_CLOSED;
1269 chan->state = BT_CLOSED;
1270
1271 sk->sk_err = err;
1272
1273 if (parent) {
1274 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001275 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001276 } else {
1277 sk->sk_state_change(sk);
1278 }
1279
1280 break;
1281 }
1282
1283 release_sock(sk);
1284}
1285
Gustavo Padovan53f52122013-10-15 19:24:45 -03001286static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1287 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001288{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001289 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001290
1291 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001292
1293 if (err)
1294 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001295}
1296
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001297static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001298 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001299 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001300{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001301 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001302 struct sk_buff *skb;
1303 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001304
Mat Martineaua6a55682012-05-04 14:20:31 -07001305 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001306 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001307 l2cap_chan_lock(chan);
1308
Gustavo Padovan90338942012-04-06 20:15:47 -03001309 if (!skb)
1310 return ERR_PTR(err);
1311
Marcel Holtmann8d463212014-06-05 15:22:51 +02001312 skb->priority = sk->sk_priority;
1313
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001314 bt_cb(skb)->chan = chan;
1315
Gustavo Padovan90338942012-04-06 20:15:47 -03001316 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001317}
1318
Jukka Rissanen04988782014-06-18 16:37:07 +03001319static int l2cap_sock_memcpy_fromiovec_cb(struct l2cap_chan *chan,
1320 unsigned char *kdata,
1321 struct iovec *iov, int len)
1322{
1323 return memcpy_fromiovec(kdata, iov, len);
1324}
1325
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001326static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1327{
1328 struct sock *sk = chan->data;
1329 struct sock *parent;
1330
1331 lock_sock(sk);
1332
1333 parent = bt_sk(sk)->parent;
1334
1335 BT_DBG("sk %p, parent %p", sk, parent);
1336
1337 sk->sk_state = BT_CONNECTED;
1338 sk->sk_state_change(sk);
1339
1340 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001341 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001342
1343 release_sock(sk);
1344}
1345
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001346static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1347{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001348 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001349
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001350 lock_sock(sk);
1351
1352 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001353 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001354 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001355
1356 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001357}
1358
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001359static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1360{
1361 struct sock *sk = chan->data;
1362
Johan Hedbergd52deb12014-08-07 22:56:44 +03001363 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1364 sk->sk_state = BT_CONNECTED;
1365 chan->state = BT_CONNECTED;
1366 }
1367
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001368 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1369 sk->sk_state_change(sk);
1370}
1371
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001372static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1373{
1374 struct sock *sk = chan->data;
1375
1376 lock_sock(sk);
1377 sk->sk_shutdown = SHUTDOWN_MASK;
1378 release_sock(sk);
1379}
1380
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001381static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1382{
1383 struct sock *sk = chan->data;
1384
1385 return sk->sk_sndtimeo;
1386}
1387
Johan Hedberg837776f2013-10-15 11:03:18 +03001388static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1389{
1390 struct sock *sk = chan->data;
1391
1392 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1393 sk->sk_state_change(sk);
1394}
1395
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001396static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001397 .name = "L2CAP Socket Interface",
1398 .new_connection = l2cap_sock_new_connection_cb,
1399 .recv = l2cap_sock_recv_cb,
1400 .close = l2cap_sock_close_cb,
1401 .teardown = l2cap_sock_teardown_cb,
1402 .state_change = l2cap_sock_state_change_cb,
1403 .ready = l2cap_sock_ready_cb,
1404 .defer = l2cap_sock_defer_cb,
1405 .resume = l2cap_sock_resume_cb,
1406 .suspend = l2cap_sock_suspend_cb,
1407 .set_shutdown = l2cap_sock_set_shutdown_cb,
1408 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1409 .alloc_skb = l2cap_sock_alloc_skb_cb,
1410 .memcpy_fromiovec = l2cap_sock_memcpy_fromiovec_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001411};
1412
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001413static void l2cap_sock_destruct(struct sock *sk)
1414{
1415 BT_DBG("sk %p", sk);
1416
Sasha Levin23d3a862012-10-08 16:48:32 -04001417 if (l2cap_pi(sk)->chan)
1418 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001419
Mat Martineaue3281402011-07-07 09:39:02 -07001420 if (l2cap_pi(sk)->rx_busy_skb) {
1421 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1422 l2cap_pi(sk)->rx_busy_skb = NULL;
1423 }
1424
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001425 skb_queue_purge(&sk->sk_receive_queue);
1426 skb_queue_purge(&sk->sk_write_queue);
1427}
1428
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001429static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1430 int *msg_namelen)
1431{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001432 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001433
1434 memset(la, 0, sizeof(struct sockaddr_l2));
1435 la->l2_family = AF_BLUETOOTH;
1436 la->l2_psm = bt_cb(skb)->psm;
1437 bacpy(&la->l2_bdaddr, &bt_cb(skb)->bdaddr);
1438
1439 *msg_namelen = sizeof(struct sockaddr_l2);
1440}
1441
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001442static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001443{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001444 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001445
1446 BT_DBG("sk %p", sk);
1447
1448 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001449 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1450
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001451 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001452 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001453
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001454 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001455 chan->imtu = pchan->imtu;
1456 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001457 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001458 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001459 chan->fcs = pchan->fcs;
1460 chan->max_tx = pchan->max_tx;
1461 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001462 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001463 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001464 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001465 chan->tx_credits = pchan->tx_credits;
1466 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001467
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001468 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1469 chan->scid = pchan->scid;
1470 chan->dcid = pchan->scid;
1471 }
1472
Paul Moore6230c9b2011-10-07 09:40:59 +00001473 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001474 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001475 switch (sk->sk_type) {
1476 case SOCK_RAW:
1477 chan->chan_type = L2CAP_CHAN_RAW;
1478 break;
1479 case SOCK_DGRAM:
1480 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001481 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001482 break;
1483 case SOCK_SEQPACKET:
1484 case SOCK_STREAM:
1485 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1486 break;
1487 }
1488
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001489 chan->imtu = L2CAP_DEFAULT_MTU;
1490 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001491 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001492 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001493 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001494 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001495 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001496 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001497
1498 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001499 }
1500
1501 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001502 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001503
1504 chan->data = sk;
1505 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001506}
1507
1508static struct proto l2cap_proto = {
1509 .name = "L2CAP",
1510 .owner = THIS_MODULE,
1511 .obj_size = sizeof(struct l2cap_pinfo)
1512};
1513
Gustavo Padovan2d792812012-10-06 10:07:01 +01001514static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1515 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001516{
1517 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001518 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001519
1520 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1521 if (!sk)
1522 return NULL;
1523
1524 sock_init_data(sock, sk);
1525 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1526
1527 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001528 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001529
1530 sock_reset_flag(sk, SOCK_ZAPPED);
1531
1532 sk->sk_protocol = proto;
1533 sk->sk_state = BT_OPEN;
1534
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001535 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001536 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301537 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001538 return NULL;
1539 }
1540
Mat Martineau61d6ef32012-04-27 16:50:50 -07001541 l2cap_chan_hold(chan);
1542
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001543 l2cap_pi(sk)->chan = chan;
1544
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001545 return sk;
1546}
1547
1548static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1549 int kern)
1550{
1551 struct sock *sk;
1552
1553 BT_DBG("sock %p", sock);
1554
1555 sock->state = SS_UNCONNECTED;
1556
1557 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001558 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001559 return -ESOCKTNOSUPPORT;
1560
1561 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1562 return -EPERM;
1563
1564 sock->ops = &l2cap_sock_ops;
1565
1566 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1567 if (!sk)
1568 return -ENOMEM;
1569
1570 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001571 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001572 return 0;
1573}
1574
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001575static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001576 .family = PF_BLUETOOTH,
1577 .owner = THIS_MODULE,
1578 .release = l2cap_sock_release,
1579 .bind = l2cap_sock_bind,
1580 .connect = l2cap_sock_connect,
1581 .listen = l2cap_sock_listen,
1582 .accept = l2cap_sock_accept,
1583 .getname = l2cap_sock_getname,
1584 .sendmsg = l2cap_sock_sendmsg,
1585 .recvmsg = l2cap_sock_recvmsg,
1586 .poll = bt_sock_poll,
1587 .ioctl = bt_sock_ioctl,
1588 .mmap = sock_no_mmap,
1589 .socketpair = sock_no_socketpair,
1590 .shutdown = l2cap_sock_shutdown,
1591 .setsockopt = l2cap_sock_setsockopt,
1592 .getsockopt = l2cap_sock_getsockopt
1593};
1594
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001595static const struct net_proto_family l2cap_sock_family_ops = {
1596 .family = PF_BLUETOOTH,
1597 .owner = THIS_MODULE,
1598 .create = l2cap_sock_create,
1599};
1600
1601int __init l2cap_init_sockets(void)
1602{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001603 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001604
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001605 err = proto_register(&l2cap_proto, 0);
1606 if (err < 0)
1607 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001608
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001609 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001610 if (err < 0) {
1611 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001612 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001613 }
1614
Al Virob0316612013-04-04 19:14:33 -04001615 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001616 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001617 if (err < 0) {
1618 BT_ERR("Failed to create L2CAP proc file");
1619 bt_sock_unregister(BTPROTO_L2CAP);
1620 goto error;
1621 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001622
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001623 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001624
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001625 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001626
1627error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001628 proto_unregister(&l2cap_proto);
1629 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001630}
1631
1632void l2cap_cleanup_sockets(void)
1633{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001634 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001635 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001636 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001637}