blob: 1884f72083c2f7de4595e91f2cdb61f02cef99bb [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;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300793 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200794 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200795
Gustavo Padovana7d77232012-05-13 03:20:07 -0300796 /* or for ACL link */
797 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100798 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300799 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300800 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300801 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300802 else
803 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200804 } else {
805 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300806 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200807 break;
808
809 case BT_DEFER_SETUP:
810 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
811 err = -EINVAL;
812 break;
813 }
814
815 if (get_user(opt, (u32 __user *) optval)) {
816 err = -EFAULT;
817 break;
818 }
819
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700820 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300821 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700822 set_bit(FLAG_DEFER_SETUP, &chan->flags);
823 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300824 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700825 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
826 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200827 break;
828
829 case BT_FLUSHABLE:
830 if (get_user(opt, (u32 __user *) optval)) {
831 err = -EFAULT;
832 break;
833 }
834
835 if (opt > BT_FLUSHABLE_ON) {
836 err = -EINVAL;
837 break;
838 }
839
840 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200841 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300842 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200843 No Flush support in the LM */
844 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
845 err = -EINVAL;
846 break;
847 }
848 }
849
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300850 if (opt)
851 set_bit(FLAG_FLUSHABLE, &chan->flags);
852 else
853 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200854 break;
855
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700856 case BT_POWER:
857 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100858 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700859 err = -EINVAL;
860 break;
861 }
862
863 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
864
865 len = min_t(unsigned int, sizeof(pwr), optlen);
866 if (copy_from_user((char *) &pwr, optval, len)) {
867 err = -EFAULT;
868 break;
869 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300870
871 if (pwr.force_active)
872 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
873 else
874 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700875 break;
876
Mat Martineau2ea66482011-11-02 16:18:30 -0700877 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700878 if (get_user(opt, (u32 __user *) optval)) {
879 err = -EFAULT;
880 break;
881 }
882
883 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
884 err = -EINVAL;
885 break;
886 }
887
888 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100889 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700890 err = -EOPNOTSUPP;
891 break;
892 }
893
894 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700895
896 if (sk->sk_state == BT_CONNECTED &&
897 chan->move_role == L2CAP_MOVE_ROLE_NONE)
898 l2cap_move_start(chan);
899
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200900 break;
901
Johan Hedberg1f435422013-12-02 16:34:18 +0200902 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200903 if (!bdaddr_type_is_le(chan->src_type)) {
904 err = -EINVAL;
905 break;
906 }
907
908 /* Setting is not supported as it's the remote side that
909 * decides this.
910 */
911 err = -EPERM;
912 break;
913
914 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200915 if (!bdaddr_type_is_le(chan->src_type)) {
916 err = -EINVAL;
917 break;
918 }
919
920 if (sk->sk_state == BT_CONNECTED) {
921 err = -EISCONN;
922 break;
923 }
924
925 if (get_user(opt, (u32 __user *) optval)) {
926 err = -EFAULT;
927 break;
928 }
929
930 chan->imtu = opt;
931 break;
932
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200933 default:
934 err = -ENOPROTOOPT;
935 break;
936 }
937
938 release_sock(sk);
939 return err;
940}
941
Gustavo Padovan2d792812012-10-06 10:07:01 +0100942static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
943 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200944{
945 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300946 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200947 int err;
948
949 BT_DBG("sock %p, sk %p", sock, sk);
950
951 err = sock_error(sk);
952 if (err)
953 return err;
954
955 if (msg->msg_flags & MSG_OOB)
956 return -EOPNOTSUPP;
957
Mat Martineaua6a55682012-05-04 14:20:31 -0700958 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300959 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200960
Johan Hedberge793dcf2013-09-16 13:05:19 +0300961 lock_sock(sk);
962 err = bt_sock_wait_ready(sk, msg->msg_flags);
963 release_sock(sk);
964 if (err)
965 return err;
966
Mat Martineaua6a55682012-05-04 14:20:31 -0700967 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +0200968 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -0700969 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200970
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200971 return err;
972}
973
Gustavo Padovan2d792812012-10-06 10:07:01 +0100974static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
975 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200976{
977 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700978 struct l2cap_pinfo *pi = l2cap_pi(sk);
979 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200980
981 lock_sock(sk);
982
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300983 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
984 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +0300985 if (bdaddr_type_is_le(pi->chan->src_type)) {
986 sk->sk_state = BT_CONNECTED;
987 pi->chan->state = BT_CONNECTED;
988 __l2cap_le_connect_rsp_defer(pi->chan);
989 } else {
990 sk->sk_state = BT_CONFIG;
991 pi->chan->state = BT_CONFIG;
992 __l2cap_connect_rsp_defer(pi->chan);
993 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300994
Johan Hedberg970871b2013-09-25 13:26:05 +0300995 err = 0;
996 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200997 }
998
999 release_sock(sk);
1000
1001 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -07001002 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
1003 else
1004 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001005
Mat Martineaue3281402011-07-07 09:39:02 -07001006 if (pi->chan->mode != L2CAP_MODE_ERTM)
1007 return err;
1008
1009 /* Attempt to put pending rx data in the socket buffer */
1010
1011 lock_sock(sk);
1012
1013 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1014 goto done;
1015
1016 if (pi->rx_busy_skb) {
1017 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
1018 pi->rx_busy_skb = NULL;
1019 else
1020 goto done;
1021 }
1022
1023 /* Restore data flow when half of the receive buffer is
1024 * available. This avoids resending large numbers of
1025 * frames.
1026 */
1027 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1028 l2cap_chan_busy(pi->chan, 0);
1029
1030done:
1031 release_sock(sk);
1032 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001033}
1034
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001035/* Kill socket (only if zapped and orphan)
1036 * Must be called on unlocked socket.
1037 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001038static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001039{
1040 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1041 return;
1042
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001043 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001044
1045 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001046
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301047 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001048 sock_set_flag(sk, SOCK_DEAD);
1049 sock_put(sk);
1050}
1051
Gustavo Padovandc253062013-10-15 19:24:49 -03001052static int __l2cap_wait_ack(struct sock *sk)
1053{
1054 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1055 DECLARE_WAITQUEUE(wait, current);
1056 int err = 0;
1057 int timeo = HZ/5;
1058
1059 add_wait_queue(sk_sleep(sk), &wait);
1060 set_current_state(TASK_INTERRUPTIBLE);
1061 while (chan->unacked_frames > 0 && chan->conn) {
1062 if (!timeo)
1063 timeo = HZ/5;
1064
1065 if (signal_pending(current)) {
1066 err = sock_intr_errno(timeo);
1067 break;
1068 }
1069
1070 release_sock(sk);
1071 timeo = schedule_timeout(timeo);
1072 lock_sock(sk);
1073 set_current_state(TASK_INTERRUPTIBLE);
1074
1075 err = sock_error(sk);
1076 if (err)
1077 break;
1078 }
1079 set_current_state(TASK_RUNNING);
1080 remove_wait_queue(sk_sleep(sk), &wait);
1081 return err;
1082}
1083
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001084static int l2cap_sock_shutdown(struct socket *sock, int how)
1085{
1086 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001087 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001088 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001089 int err = 0;
1090
1091 BT_DBG("sock %p, sk %p", sock, sk);
1092
1093 if (!sk)
1094 return 0;
1095
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001096 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001097 conn = chan->conn;
1098
1099 if (conn)
1100 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001101
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001102 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001103 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001104
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001105 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001106 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001107 err = __l2cap_wait_ack(sk);
1108
1109 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001110
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001111 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03001112 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001113 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001114
Vladimir Davydov093facf2014-07-15 12:25:28 +04001115 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1116 !(current->flags & PF_EXITING))
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001117 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001118 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001119 }
1120
1121 if (!err && sk->sk_err)
1122 err = -sk->sk_err;
1123
1124 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001125 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001126
1127 if (conn)
1128 mutex_unlock(&conn->chan_lock);
1129
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001130 return err;
1131}
1132
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001133static int l2cap_sock_release(struct socket *sock)
1134{
1135 struct sock *sk = sock->sk;
1136 int err;
1137
1138 BT_DBG("sock %p, sk %p", sock, sk);
1139
1140 if (!sk)
1141 return 0;
1142
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001143 bt_sock_unlink(&l2cap_sk_list, sk);
1144
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001145 err = l2cap_sock_shutdown(sock, 2);
1146
1147 sock_orphan(sk);
1148 l2cap_sock_kill(sk);
1149 return err;
1150}
1151
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001152static void l2cap_sock_cleanup_listen(struct sock *parent)
1153{
1154 struct sock *sk;
1155
1156 BT_DBG("parent %p", parent);
1157
1158 /* Close not yet accepted channels */
1159 while ((sk = bt_accept_dequeue(parent, NULL))) {
1160 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1161
1162 l2cap_chan_lock(chan);
1163 __clear_chan_timer(chan);
1164 l2cap_chan_close(chan, ECONNRESET);
1165 l2cap_chan_unlock(chan);
1166
1167 l2cap_sock_kill(sk);
1168 }
1169}
1170
Gustavo Padovan80b98022012-05-27 22:27:51 -03001171static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001172{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001173 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001174
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001175 lock_sock(parent);
1176
Gustavo Padovan53826692012-05-27 22:27:55 -03001177 /* Check for backlog size */
1178 if (sk_acceptq_is_full(parent)) {
1179 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001180 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001181 return NULL;
1182 }
1183
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001184 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001185 GFP_ATOMIC);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001186 if (!sk) {
1187 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001188 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001189 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001190
Octavian Purdilad22015a2012-01-22 00:28:34 +02001191 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1192
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001193 l2cap_sock_init(sk, parent);
1194
Gustavo Padovan644912e2012-10-12 19:35:23 +08001195 bt_accept_enqueue(parent, sk);
1196
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001197 release_sock(parent);
1198
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001199 return l2cap_pi(sk)->chan;
1200}
1201
Gustavo Padovan80b98022012-05-27 22:27:51 -03001202static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001203{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001204 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001205 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001206
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001207 lock_sock(sk);
1208
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001209 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001210 err = -ENOMEM;
1211 goto done;
1212 }
Mat Martineaue3281402011-07-07 09:39:02 -07001213
1214 err = sock_queue_rcv_skb(sk, skb);
1215
1216 /* For ERTM, handle one skb that doesn't fit into the recv
1217 * buffer. This is important to do because the data frames
1218 * have already been acked, so the skb cannot be discarded.
1219 *
1220 * Notify the l2cap core that the buffer is full, so the
1221 * LOCAL_BUSY state is entered and no more frames are
1222 * acked and reassembled until there is buffer space
1223 * available.
1224 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001225 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1226 l2cap_pi(sk)->rx_busy_skb = skb;
1227 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001228 err = 0;
1229 }
1230
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001231done:
1232 release_sock(sk);
1233
Mat Martineaue3281402011-07-07 09:39:02 -07001234 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001235}
1236
Gustavo Padovan80b98022012-05-27 22:27:51 -03001237static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001238{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001239 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001240
1241 l2cap_sock_kill(sk);
1242}
1243
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001244static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1245{
1246 struct sock *sk = chan->data;
1247 struct sock *parent;
1248
1249 lock_sock(sk);
1250
1251 parent = bt_sk(sk)->parent;
1252
1253 sock_set_flag(sk, SOCK_ZAPPED);
1254
1255 switch (chan->state) {
1256 case BT_OPEN:
1257 case BT_BOUND:
1258 case BT_CLOSED:
1259 break;
1260 case BT_LISTEN:
1261 l2cap_sock_cleanup_listen(sk);
1262 sk->sk_state = BT_CLOSED;
1263 chan->state = BT_CLOSED;
1264
1265 break;
1266 default:
1267 sk->sk_state = BT_CLOSED;
1268 chan->state = BT_CLOSED;
1269
1270 sk->sk_err = err;
1271
1272 if (parent) {
1273 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001274 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001275 } else {
1276 sk->sk_state_change(sk);
1277 }
1278
1279 break;
1280 }
1281
1282 release_sock(sk);
1283}
1284
Gustavo Padovan53f52122013-10-15 19:24:45 -03001285static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1286 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001287{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001288 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001289
1290 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001291
1292 if (err)
1293 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001294}
1295
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001296static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001297 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001298 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001299{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001300 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001301 struct sk_buff *skb;
1302 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001303
Mat Martineaua6a55682012-05-04 14:20:31 -07001304 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001305 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001306 l2cap_chan_lock(chan);
1307
Gustavo Padovan90338942012-04-06 20:15:47 -03001308 if (!skb)
1309 return ERR_PTR(err);
1310
Marcel Holtmann8d463212014-06-05 15:22:51 +02001311 skb->priority = sk->sk_priority;
1312
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001313 bt_cb(skb)->chan = chan;
1314
Gustavo Padovan90338942012-04-06 20:15:47 -03001315 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001316}
1317
Jukka Rissanen04988782014-06-18 16:37:07 +03001318static int l2cap_sock_memcpy_fromiovec_cb(struct l2cap_chan *chan,
1319 unsigned char *kdata,
1320 struct iovec *iov, int len)
1321{
1322 return memcpy_fromiovec(kdata, iov, len);
1323}
1324
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001325static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1326{
1327 struct sock *sk = chan->data;
1328 struct sock *parent;
1329
1330 lock_sock(sk);
1331
1332 parent = bt_sk(sk)->parent;
1333
1334 BT_DBG("sk %p, parent %p", sk, parent);
1335
1336 sk->sk_state = BT_CONNECTED;
1337 sk->sk_state_change(sk);
1338
1339 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001340 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001341
1342 release_sock(sk);
1343}
1344
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001345static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1346{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001347 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001348
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001349 lock_sock(sk);
1350
1351 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001352 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001353 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001354
1355 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001356}
1357
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001358static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1359{
1360 struct sock *sk = chan->data;
1361
1362 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1363 sk->sk_state_change(sk);
1364}
1365
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001366static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1367{
1368 struct sock *sk = chan->data;
1369
1370 lock_sock(sk);
1371 sk->sk_shutdown = SHUTDOWN_MASK;
1372 release_sock(sk);
1373}
1374
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001375static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1376{
1377 struct sock *sk = chan->data;
1378
1379 return sk->sk_sndtimeo;
1380}
1381
Johan Hedberg837776f2013-10-15 11:03:18 +03001382static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1383{
1384 struct sock *sk = chan->data;
1385
1386 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1387 sk->sk_state_change(sk);
1388}
1389
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001390static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001391 .name = "L2CAP Socket Interface",
1392 .new_connection = l2cap_sock_new_connection_cb,
1393 .recv = l2cap_sock_recv_cb,
1394 .close = l2cap_sock_close_cb,
1395 .teardown = l2cap_sock_teardown_cb,
1396 .state_change = l2cap_sock_state_change_cb,
1397 .ready = l2cap_sock_ready_cb,
1398 .defer = l2cap_sock_defer_cb,
1399 .resume = l2cap_sock_resume_cb,
1400 .suspend = l2cap_sock_suspend_cb,
1401 .set_shutdown = l2cap_sock_set_shutdown_cb,
1402 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1403 .alloc_skb = l2cap_sock_alloc_skb_cb,
1404 .memcpy_fromiovec = l2cap_sock_memcpy_fromiovec_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001405};
1406
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001407static void l2cap_sock_destruct(struct sock *sk)
1408{
1409 BT_DBG("sk %p", sk);
1410
Sasha Levin23d3a862012-10-08 16:48:32 -04001411 if (l2cap_pi(sk)->chan)
1412 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001413
Mat Martineaue3281402011-07-07 09:39:02 -07001414 if (l2cap_pi(sk)->rx_busy_skb) {
1415 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1416 l2cap_pi(sk)->rx_busy_skb = NULL;
1417 }
1418
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001419 skb_queue_purge(&sk->sk_receive_queue);
1420 skb_queue_purge(&sk->sk_write_queue);
1421}
1422
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001423static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1424 int *msg_namelen)
1425{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001426 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001427
1428 memset(la, 0, sizeof(struct sockaddr_l2));
1429 la->l2_family = AF_BLUETOOTH;
1430 la->l2_psm = bt_cb(skb)->psm;
1431 bacpy(&la->l2_bdaddr, &bt_cb(skb)->bdaddr);
1432
1433 *msg_namelen = sizeof(struct sockaddr_l2);
1434}
1435
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001436static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001437{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001438 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001439
1440 BT_DBG("sk %p", sk);
1441
1442 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001443 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1444
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001445 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001446 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001447
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001448 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001449 chan->imtu = pchan->imtu;
1450 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001451 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001452 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001453 chan->fcs = pchan->fcs;
1454 chan->max_tx = pchan->max_tx;
1455 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001456 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001457 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001458 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001459 chan->tx_credits = pchan->tx_credits;
1460 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001461
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001462 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1463 chan->scid = pchan->scid;
1464 chan->dcid = pchan->scid;
1465 }
1466
Paul Moore6230c9b2011-10-07 09:40:59 +00001467 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001468 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001469 switch (sk->sk_type) {
1470 case SOCK_RAW:
1471 chan->chan_type = L2CAP_CHAN_RAW;
1472 break;
1473 case SOCK_DGRAM:
1474 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001475 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001476 break;
1477 case SOCK_SEQPACKET:
1478 case SOCK_STREAM:
1479 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1480 break;
1481 }
1482
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001483 chan->imtu = L2CAP_DEFAULT_MTU;
1484 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001485 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001486 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001487 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001488 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001489 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001490 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001491
1492 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001493 }
1494
1495 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001496 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001497
1498 chan->data = sk;
1499 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001500}
1501
1502static struct proto l2cap_proto = {
1503 .name = "L2CAP",
1504 .owner = THIS_MODULE,
1505 .obj_size = sizeof(struct l2cap_pinfo)
1506};
1507
Gustavo Padovan2d792812012-10-06 10:07:01 +01001508static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1509 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001510{
1511 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001512 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001513
1514 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1515 if (!sk)
1516 return NULL;
1517
1518 sock_init_data(sock, sk);
1519 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1520
1521 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001522 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001523
1524 sock_reset_flag(sk, SOCK_ZAPPED);
1525
1526 sk->sk_protocol = proto;
1527 sk->sk_state = BT_OPEN;
1528
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001529 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001530 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301531 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001532 return NULL;
1533 }
1534
Mat Martineau61d6ef32012-04-27 16:50:50 -07001535 l2cap_chan_hold(chan);
1536
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001537 l2cap_pi(sk)->chan = chan;
1538
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001539 return sk;
1540}
1541
1542static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1543 int kern)
1544{
1545 struct sock *sk;
1546
1547 BT_DBG("sock %p", sock);
1548
1549 sock->state = SS_UNCONNECTED;
1550
1551 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001552 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001553 return -ESOCKTNOSUPPORT;
1554
1555 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1556 return -EPERM;
1557
1558 sock->ops = &l2cap_sock_ops;
1559
1560 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1561 if (!sk)
1562 return -ENOMEM;
1563
1564 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001565 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001566 return 0;
1567}
1568
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001569static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001570 .family = PF_BLUETOOTH,
1571 .owner = THIS_MODULE,
1572 .release = l2cap_sock_release,
1573 .bind = l2cap_sock_bind,
1574 .connect = l2cap_sock_connect,
1575 .listen = l2cap_sock_listen,
1576 .accept = l2cap_sock_accept,
1577 .getname = l2cap_sock_getname,
1578 .sendmsg = l2cap_sock_sendmsg,
1579 .recvmsg = l2cap_sock_recvmsg,
1580 .poll = bt_sock_poll,
1581 .ioctl = bt_sock_ioctl,
1582 .mmap = sock_no_mmap,
1583 .socketpair = sock_no_socketpair,
1584 .shutdown = l2cap_sock_shutdown,
1585 .setsockopt = l2cap_sock_setsockopt,
1586 .getsockopt = l2cap_sock_getsockopt
1587};
1588
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001589static const struct net_proto_family l2cap_sock_family_ops = {
1590 .family = PF_BLUETOOTH,
1591 .owner = THIS_MODULE,
1592 .create = l2cap_sock_create,
1593};
1594
1595int __init l2cap_init_sockets(void)
1596{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001597 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001598
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001599 err = proto_register(&l2cap_proto, 0);
1600 if (err < 0)
1601 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001602
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001603 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001604 if (err < 0) {
1605 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001606 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001607 }
1608
Al Virob0316612013-04-04 19:14:33 -04001609 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001610 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001611 if (err < 0) {
1612 BT_ERR("Failed to create L2CAP proc file");
1613 bt_sock_unregister(BTPROTO_L2CAP);
1614 goto error;
1615 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001616
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001617 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001618
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001619 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001620
1621error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001622 proto_unregister(&l2cap_proto);
1623 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001624}
1625
1626void l2cap_cleanup_sockets(void)
1627{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001628 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001629 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001630 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001631}