blob: ed06f88e6f10955cae33d31a3e348b25d2c647f9 [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 Hedbergbfe46552013-10-16 17:13:26 +0300102 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300103 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200104 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700105 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300106 return -EINVAL;
107 }
108
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200109 lock_sock(sk);
110
111 if (sk->sk_state != BT_OPEN) {
112 err = -EBADFD;
113 goto done;
114 }
115
116 if (la.l2_psm) {
117 __u16 psm = __le16_to_cpu(la.l2_psm);
118
Johan Hedberg49460962013-10-08 13:55:46 +0200119 if (la.l2_bdaddr_type == BDADDR_BREDR)
120 err = l2cap_validate_bredr_psm(psm);
121 else
122 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200123
Johan Hedberg49460962013-10-08 13:55:46 +0200124 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200125 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200126 }
127
Ville Tervob62f3282011-02-10 22:38:50 -0300128 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530129 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300130 else
131 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300132
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300133 if (err < 0)
134 goto done;
135
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700136 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700137 case L2CAP_CHAN_CONN_LESS:
138 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
139 chan->sec_level = BT_SECURITY_SDP;
140 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700141 case L2CAP_CHAN_CONN_ORIENTED:
142 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
143 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
144 chan->sec_level = BT_SECURITY_SDP;
145 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200146 case L2CAP_CHAN_RAW:
147 chan->sec_level = BT_SECURITY_SDP;
148 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700149 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300150
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700151 bacpy(&chan->src, &la.l2_bdaddr);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700152 chan->src_type = la.l2_bdaddr_type;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300153
Johan Hedberg38319712013-05-17 12:49:23 +0300154 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200155 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300156
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300157 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300158 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200159
160done:
161 release_sock(sk);
162 return err;
163}
164
Gustavo Padovan2d792812012-10-06 10:07:01 +0100165static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
166 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200167{
168 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300169 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200170 struct sockaddr_l2 la;
171 int len, err = 0;
172
173 BT_DBG("sk %p", sk);
174
175 if (!addr || alen < sizeof(addr->sa_family) ||
176 addr->sa_family != AF_BLUETOOTH)
177 return -EINVAL;
178
179 memset(&la, 0, sizeof(la));
180 len = min_t(unsigned int, sizeof(la), alen);
181 memcpy(&la, addr, len);
182
Ville Tervoacd7d372011-02-10 22:38:49 -0300183 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200184 return -EINVAL;
185
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300186 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
187 return -EINVAL;
188
Johan Hedbergeb622492013-10-18 11:49:25 +0300189 /* Check that the socket wasn't bound to something that
190 * conflicts with the address given to connect(). If chan->src
191 * is BDADDR_ANY it means bind() was never used, in which case
192 * chan->src_type and la.l2_bdaddr_type do not need to match.
193 */
194 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
195 bdaddr_type_is_le(la.l2_bdaddr_type)) {
196 /* Old user space versions will try to incorrectly bind
197 * the ATT socket using BDADDR_BREDR. We need to accept
198 * this and fix up the source address type only when
199 * both the source CID and destination CID indicate
200 * ATT. Anything else is an invalid combination.
201 */
202 if (chan->scid != L2CAP_CID_ATT ||
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700203 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergeb622492013-10-18 11:49:25 +0300204 return -EINVAL;
205
206 /* We don't have the hdev available here to make a
207 * better decision on random vs public, but since all
208 * user space versions that exhibit this issue anyway do
209 * not support random local addresses assuming public
210 * here is good enough.
211 */
212 chan->src_type = BDADDR_LE_PUBLIC;
213 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300214
215 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
216 return -EINVAL;
217
Johan Hedbergbfe46552013-10-16 17:13:26 +0300218 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300219 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200220 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700221 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300222 return -EINVAL;
223 }
224
Johan Hedberg38319712013-05-17 12:49:23 +0300225 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200226 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300227
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530228 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300229 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200230 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200231 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200232
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200233 lock_sock(sk);
234
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200235 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100236 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200237
238 release_sock(sk);
239
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200240 return err;
241}
242
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200243static int l2cap_sock_listen(struct socket *sock, int backlog)
244{
245 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300246 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200247 int err = 0;
248
249 BT_DBG("sk %p backlog %d", sk, backlog);
250
251 lock_sock(sk);
252
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200253 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200254 err = -EBADFD;
255 goto done;
256 }
257
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200258 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
259 err = -EINVAL;
260 goto done;
261 }
262
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300263 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200264 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300265 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200266 break;
267 case L2CAP_MODE_ERTM:
268 case L2CAP_MODE_STREAMING:
269 if (!disable_ertm)
270 break;
271 /* fall through */
272 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300273 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200274 goto done;
275 }
276
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200277 sk->sk_max_ack_backlog = backlog;
278 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300279
280 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200281 sk->sk_state = BT_LISTEN;
282
283done:
284 release_sock(sk);
285 return err;
286}
287
Gustavo Padovan2d792812012-10-06 10:07:01 +0100288static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
289 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200290{
291 DECLARE_WAITQUEUE(wait, current);
292 struct sock *sk = sock->sk, *nsk;
293 long timeo;
294 int err = 0;
295
296 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
297
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200298 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
299
300 BT_DBG("sk %p timeo %ld", sk, timeo);
301
302 /* Wait for an incoming connection. (wake-one). */
303 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400304 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200305 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200306
307 if (sk->sk_state != BT_LISTEN) {
308 err = -EBADFD;
309 break;
310 }
311
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400312 nsk = bt_accept_dequeue(sk, newsock);
313 if (nsk)
314 break;
315
316 if (!timeo) {
317 err = -EAGAIN;
318 break;
319 }
320
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200321 if (signal_pending(current)) {
322 err = sock_intr_errno(timeo);
323 break;
324 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400325
326 release_sock(sk);
327 timeo = schedule_timeout(timeo);
328 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200329 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400330 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200331 remove_wait_queue(sk_sleep(sk), &wait);
332
333 if (err)
334 goto done;
335
336 newsock->state = SS_CONNECTED;
337
338 BT_DBG("new socket %p", nsk);
339
340done:
341 release_sock(sk);
342 return err;
343}
344
Gustavo Padovan2d792812012-10-06 10:07:01 +0100345static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
346 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200347{
348 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
349 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300350 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200351
352 BT_DBG("sock %p, sk %p", sock, sk);
353
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200354 if (peer && sk->sk_state != BT_CONNECTED &&
Johan Hedbergbf19d512014-07-01 12:07:23 +0300355 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
356 sk->sk_state != BT_CONFIG)
Johan Hedbergb783fbc2014-01-28 15:16:49 -0800357 return -ENOTCONN;
358
Mathias Krause792039c2012-08-15 11:31:51 +0000359 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200360 addr->sa_family = AF_BLUETOOTH;
361 *len = sizeof(struct sockaddr_l2);
362
Johan Hedbergd7e5e762014-01-28 15:16:51 -0800363 la->l2_psm = chan->psm;
364
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200365 if (peer) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700366 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300367 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700368 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200369 } else {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700370 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300371 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700372 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200373 }
374
375 return 0;
376}
377
Gustavo Padovan2d792812012-10-06 10:07:01 +0100378static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
379 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200380{
381 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300382 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200383 struct l2cap_options opts;
384 struct l2cap_conninfo cinfo;
385 int len, err = 0;
386 u32 opt;
387
388 BT_DBG("sk %p", sk);
389
390 if (get_user(len, optlen))
391 return -EFAULT;
392
393 lock_sock(sk);
394
395 switch (optname) {
396 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200397 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
398 * legacy ATT code depends on getsockopt for
399 * L2CAP_OPTIONS we need to let this pass.
400 */
401 if (bdaddr_type_is_le(chan->src_type) &&
402 chan->scid != L2CAP_CID_ATT) {
403 err = -EINVAL;
404 break;
405 }
406
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300407 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300408 opts.imtu = chan->imtu;
409 opts.omtu = chan->omtu;
410 opts.flush_to = chan->flush_to;
411 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300412 opts.fcs = chan->fcs;
413 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300414 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200415
416 len = min_t(unsigned int, len, sizeof(opts));
417 if (copy_to_user(optval, (char *) &opts, len))
418 err = -EFAULT;
419
420 break;
421
422 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300423 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200424 case BT_SECURITY_LOW:
425 opt = L2CAP_LM_AUTH;
426 break;
427 case BT_SECURITY_MEDIUM:
428 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
429 break;
430 case BT_SECURITY_HIGH:
431 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100432 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200433 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800434 case BT_SECURITY_FIPS:
435 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
436 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
437 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200438 default:
439 opt = 0;
440 break;
441 }
442
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300443 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200444 opt |= L2CAP_LM_MASTER;
445
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300446 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200447 opt |= L2CAP_LM_RELIABLE;
448
449 if (put_user(opt, (u32 __user *) optval))
450 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800451
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200452 break;
453
454 case L2CAP_CONNINFO:
455 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300456 !(sk->sk_state == BT_CONNECT2 &&
457 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200458 err = -ENOTCONN;
459 break;
460 }
461
Filip Palian8d03e972011-05-12 19:32:46 +0200462 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300463 cinfo.hci_handle = chan->conn->hcon->handle;
464 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200465
466 len = min_t(unsigned int, len, sizeof(cinfo));
467 if (copy_to_user(optval, (char *) &cinfo, len))
468 err = -EFAULT;
469
470 break;
471
472 default:
473 err = -ENOPROTOOPT;
474 break;
475 }
476
477 release_sock(sk);
478 return err;
479}
480
Gustavo Padovan2d792812012-10-06 10:07:01 +0100481static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
482 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200483{
484 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300485 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200486 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700487 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200488 int len, err = 0;
489
490 BT_DBG("sk %p", sk);
491
492 if (level == SOL_L2CAP)
493 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
494
495 if (level != SOL_BLUETOOTH)
496 return -ENOPROTOOPT;
497
498 if (get_user(len, optlen))
499 return -EFAULT;
500
501 lock_sock(sk);
502
503 switch (optname) {
504 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300505 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500506 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100507 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200508 err = -EINVAL;
509 break;
510 }
511
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300512 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300513 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300514 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200515
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300516 if (sk->sk_state == BT_CONNECTED)
517 sec.key_size = chan->conn->hcon->enc_key_size;
518 } else {
519 sec.level = chan->sec_level;
520 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300521
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200522 len = min_t(unsigned int, len, sizeof(sec));
523 if (copy_to_user(optval, (char *) &sec, len))
524 err = -EFAULT;
525
526 break;
527
528 case BT_DEFER_SETUP:
529 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
530 err = -EINVAL;
531 break;
532 }
533
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300534 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
535 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200536 err = -EFAULT;
537
538 break;
539
540 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300541 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100542 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200543 err = -EFAULT;
544
545 break;
546
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700547 case BT_POWER:
548 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100549 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700550 err = -EINVAL;
551 break;
552 }
553
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300554 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700555
556 len = min_t(unsigned int, len, sizeof(pwr));
557 if (copy_to_user(optval, (char *) &pwr, len))
558 err = -EFAULT;
559
560 break;
561
Mat Martineau2ea66482011-11-02 16:18:30 -0700562 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700563 if (put_user(chan->chan_policy, (u32 __user *) optval))
564 err = -EFAULT;
565 break;
566
Johan Hedberg1f435422013-12-02 16:34:18 +0200567 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200568 if (!bdaddr_type_is_le(chan->src_type)) {
569 err = -EINVAL;
570 break;
571 }
572
573 if (sk->sk_state != BT_CONNECTED) {
574 err = -ENOTCONN;
575 break;
576 }
577
578 if (put_user(chan->omtu, (u16 __user *) optval))
579 err = -EFAULT;
580 break;
581
582 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200583 if (!bdaddr_type_is_le(chan->src_type)) {
584 err = -EINVAL;
585 break;
586 }
587
588 if (put_user(chan->imtu, (u16 __user *) optval))
589 err = -EFAULT;
590 break;
591
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200592 default:
593 err = -ENOPROTOOPT;
594 break;
595 }
596
597 release_sock(sk);
598 return err;
599}
600
Andre Guedes682877c2012-05-31 17:01:34 -0300601static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
602{
603 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300604 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300605 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300606 return false;
607 break;
608
609 default:
610 if (mtu < L2CAP_DEFAULT_MIN_MTU)
611 return false;
612 }
613
614 return true;
615}
616
Gustavo Padovan2d792812012-10-06 10:07:01 +0100617static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
618 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200619{
620 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300621 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200622 struct l2cap_options opts;
623 int len, err = 0;
624 u32 opt;
625
626 BT_DBG("sk %p", sk);
627
628 lock_sock(sk);
629
630 switch (optname) {
631 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200632 if (bdaddr_type_is_le(chan->src_type)) {
633 err = -EINVAL;
634 break;
635 }
636
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200637 if (sk->sk_state == BT_CONNECTED) {
638 err = -EINVAL;
639 break;
640 }
641
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300642 opts.imtu = chan->imtu;
643 opts.omtu = chan->omtu;
644 opts.flush_to = chan->flush_to;
645 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300646 opts.fcs = chan->fcs;
647 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300648 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200649
650 len = min_t(unsigned int, sizeof(opts), optlen);
651 if (copy_from_user((char *) &opts, optval, len)) {
652 err = -EFAULT;
653 break;
654 }
655
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300656 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200657 err = -EINVAL;
658 break;
659 }
660
Andre Guedes682877c2012-05-31 17:01:34 -0300661 if (!l2cap_valid_mtu(chan, opts.imtu)) {
662 err = -EINVAL;
663 break;
664 }
665
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300666 chan->mode = opts.mode;
667 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +0300668 case L2CAP_MODE_LE_FLOWCTL:
669 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200670 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300671 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200672 break;
673 case L2CAP_MODE_ERTM:
674 case L2CAP_MODE_STREAMING:
675 if (!disable_ertm)
676 break;
677 /* fall through */
678 default:
679 err = -EINVAL;
680 break;
681 }
682
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300683 chan->imtu = opts.imtu;
684 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300685 chan->fcs = opts.fcs;
686 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300687 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300688 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200689 break;
690
691 case L2CAP_LM:
692 if (get_user(opt, (u32 __user *) optval)) {
693 err = -EFAULT;
694 break;
695 }
696
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800697 if (opt & L2CAP_LM_FIPS) {
698 err = -EINVAL;
699 break;
700 }
701
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200702 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300703 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200704 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300705 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200706 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300707 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200708
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300709 if (opt & L2CAP_LM_MASTER)
710 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
711 else
712 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300713
714 if (opt & L2CAP_LM_RELIABLE)
715 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
716 else
717 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200718 break;
719
720 default:
721 err = -ENOPROTOOPT;
722 break;
723 }
724
725 release_sock(sk);
726 return err;
727}
728
Gustavo Padovan2d792812012-10-06 10:07:01 +0100729static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
730 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200731{
732 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300733 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200734 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700735 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300736 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200737 int len, err = 0;
738 u32 opt;
739
740 BT_DBG("sk %p", sk);
741
742 if (level == SOL_L2CAP)
743 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
744
745 if (level != SOL_BLUETOOTH)
746 return -ENOPROTOOPT;
747
748 lock_sock(sk);
749
750 switch (optname) {
751 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300752 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500753 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100754 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200755 err = -EINVAL;
756 break;
757 }
758
759 sec.level = BT_SECURITY_LOW;
760
761 len = min_t(unsigned int, sizeof(sec), optlen);
762 if (copy_from_user((char *) &sec, optval, len)) {
763 err = -EFAULT;
764 break;
765 }
766
767 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100768 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200769 err = -EINVAL;
770 break;
771 }
772
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300773 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300774
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200775 if (!chan->conn)
776 break;
777
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300778 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200779
780 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300781 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300782 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300783 break;
Johan Hedbergd52deb12014-08-07 22:56:44 +0300784 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300785 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200786 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200787
Gustavo Padovana7d77232012-05-13 03:20:07 -0300788 /* or for ACL link */
789 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100790 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300791 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300792 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300793 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300794 else
795 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200796 } else {
797 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300798 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200799 break;
800
801 case BT_DEFER_SETUP:
802 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
803 err = -EINVAL;
804 break;
805 }
806
807 if (get_user(opt, (u32 __user *) optval)) {
808 err = -EFAULT;
809 break;
810 }
811
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700812 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300813 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700814 set_bit(FLAG_DEFER_SETUP, &chan->flags);
815 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300816 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700817 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
818 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200819 break;
820
821 case BT_FLUSHABLE:
822 if (get_user(opt, (u32 __user *) optval)) {
823 err = -EFAULT;
824 break;
825 }
826
827 if (opt > BT_FLUSHABLE_ON) {
828 err = -EINVAL;
829 break;
830 }
831
832 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200833 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300834 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200835 No Flush support in the LM */
836 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
837 err = -EINVAL;
838 break;
839 }
840 }
841
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300842 if (opt)
843 set_bit(FLAG_FLUSHABLE, &chan->flags);
844 else
845 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200846 break;
847
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700848 case BT_POWER:
849 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100850 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700851 err = -EINVAL;
852 break;
853 }
854
855 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
856
857 len = min_t(unsigned int, sizeof(pwr), optlen);
858 if (copy_from_user((char *) &pwr, optval, len)) {
859 err = -EFAULT;
860 break;
861 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300862
863 if (pwr.force_active)
864 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
865 else
866 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700867 break;
868
Mat Martineau2ea66482011-11-02 16:18:30 -0700869 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700870 if (get_user(opt, (u32 __user *) optval)) {
871 err = -EFAULT;
872 break;
873 }
874
875 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
876 err = -EINVAL;
877 break;
878 }
879
880 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100881 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700882 err = -EOPNOTSUPP;
883 break;
884 }
885
886 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700887
888 if (sk->sk_state == BT_CONNECTED &&
889 chan->move_role == L2CAP_MOVE_ROLE_NONE)
890 l2cap_move_start(chan);
891
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200892 break;
893
Johan Hedberg1f435422013-12-02 16:34:18 +0200894 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200895 if (!bdaddr_type_is_le(chan->src_type)) {
896 err = -EINVAL;
897 break;
898 }
899
900 /* Setting is not supported as it's the remote side that
901 * decides this.
902 */
903 err = -EPERM;
904 break;
905
906 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200907 if (!bdaddr_type_is_le(chan->src_type)) {
908 err = -EINVAL;
909 break;
910 }
911
912 if (sk->sk_state == BT_CONNECTED) {
913 err = -EISCONN;
914 break;
915 }
916
917 if (get_user(opt, (u32 __user *) optval)) {
918 err = -EFAULT;
919 break;
920 }
921
922 chan->imtu = opt;
923 break;
924
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200925 default:
926 err = -ENOPROTOOPT;
927 break;
928 }
929
930 release_sock(sk);
931 return err;
932}
933
Gustavo Padovan2d792812012-10-06 10:07:01 +0100934static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
935 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200936{
937 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300938 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200939 int err;
940
941 BT_DBG("sock %p, sk %p", sock, sk);
942
943 err = sock_error(sk);
944 if (err)
945 return err;
946
947 if (msg->msg_flags & MSG_OOB)
948 return -EOPNOTSUPP;
949
Mat Martineaua6a55682012-05-04 14:20:31 -0700950 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300951 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200952
Johan Hedberge793dcf2013-09-16 13:05:19 +0300953 lock_sock(sk);
954 err = bt_sock_wait_ready(sk, msg->msg_flags);
955 release_sock(sk);
956 if (err)
957 return err;
958
Mat Martineaua6a55682012-05-04 14:20:31 -0700959 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +0200960 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -0700961 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200962
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200963 return err;
964}
965
Gustavo Padovan2d792812012-10-06 10:07:01 +0100966static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
967 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200968{
969 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700970 struct l2cap_pinfo *pi = l2cap_pi(sk);
971 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200972
973 lock_sock(sk);
974
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300975 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
976 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +0300977 if (bdaddr_type_is_le(pi->chan->src_type)) {
978 sk->sk_state = BT_CONNECTED;
979 pi->chan->state = BT_CONNECTED;
980 __l2cap_le_connect_rsp_defer(pi->chan);
981 } else {
982 sk->sk_state = BT_CONFIG;
983 pi->chan->state = BT_CONFIG;
984 __l2cap_connect_rsp_defer(pi->chan);
985 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300986
Johan Hedberg970871b2013-09-25 13:26:05 +0300987 err = 0;
988 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200989 }
990
991 release_sock(sk);
992
993 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700994 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
995 else
996 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200997
Mat Martineaue3281402011-07-07 09:39:02 -0700998 if (pi->chan->mode != L2CAP_MODE_ERTM)
999 return err;
1000
1001 /* Attempt to put pending rx data in the socket buffer */
1002
1003 lock_sock(sk);
1004
1005 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1006 goto done;
1007
1008 if (pi->rx_busy_skb) {
1009 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
1010 pi->rx_busy_skb = NULL;
1011 else
1012 goto done;
1013 }
1014
1015 /* Restore data flow when half of the receive buffer is
1016 * available. This avoids resending large numbers of
1017 * frames.
1018 */
1019 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1020 l2cap_chan_busy(pi->chan, 0);
1021
1022done:
1023 release_sock(sk);
1024 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001025}
1026
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001027/* Kill socket (only if zapped and orphan)
1028 * Must be called on unlocked socket.
1029 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001030static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001031{
1032 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1033 return;
1034
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001035 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001036
1037 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001038
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301039 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001040 sock_set_flag(sk, SOCK_DEAD);
1041 sock_put(sk);
1042}
1043
Gustavo Padovandc253062013-10-15 19:24:49 -03001044static int __l2cap_wait_ack(struct sock *sk)
1045{
1046 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1047 DECLARE_WAITQUEUE(wait, current);
1048 int err = 0;
1049 int timeo = HZ/5;
1050
1051 add_wait_queue(sk_sleep(sk), &wait);
1052 set_current_state(TASK_INTERRUPTIBLE);
1053 while (chan->unacked_frames > 0 && chan->conn) {
1054 if (!timeo)
1055 timeo = HZ/5;
1056
1057 if (signal_pending(current)) {
1058 err = sock_intr_errno(timeo);
1059 break;
1060 }
1061
1062 release_sock(sk);
1063 timeo = schedule_timeout(timeo);
1064 lock_sock(sk);
1065 set_current_state(TASK_INTERRUPTIBLE);
1066
1067 err = sock_error(sk);
1068 if (err)
1069 break;
1070 }
1071 set_current_state(TASK_RUNNING);
1072 remove_wait_queue(sk_sleep(sk), &wait);
1073 return err;
1074}
1075
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001076static int l2cap_sock_shutdown(struct socket *sock, int how)
1077{
1078 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001079 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001080 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001081 int err = 0;
1082
1083 BT_DBG("sock %p, sk %p", sock, sk);
1084
1085 if (!sk)
1086 return 0;
1087
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001088 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001089 conn = chan->conn;
1090
1091 if (conn)
1092 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001093
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001094 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001095 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001096
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001097 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001098 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001099 err = __l2cap_wait_ack(sk);
1100
1101 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001102
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001103 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03001104 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001105 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001106
Vladimir Davydov093facf2014-07-15 12:25:28 +04001107 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1108 !(current->flags & PF_EXITING))
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001109 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001110 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001111 }
1112
1113 if (!err && sk->sk_err)
1114 err = -sk->sk_err;
1115
1116 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001117 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001118
1119 if (conn)
1120 mutex_unlock(&conn->chan_lock);
1121
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001122 return err;
1123}
1124
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001125static int l2cap_sock_release(struct socket *sock)
1126{
1127 struct sock *sk = sock->sk;
1128 int err;
1129
1130 BT_DBG("sock %p, sk %p", sock, sk);
1131
1132 if (!sk)
1133 return 0;
1134
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001135 bt_sock_unlink(&l2cap_sk_list, sk);
1136
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001137 err = l2cap_sock_shutdown(sock, 2);
1138
1139 sock_orphan(sk);
1140 l2cap_sock_kill(sk);
1141 return err;
1142}
1143
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001144static void l2cap_sock_cleanup_listen(struct sock *parent)
1145{
1146 struct sock *sk;
1147
1148 BT_DBG("parent %p", parent);
1149
1150 /* Close not yet accepted channels */
1151 while ((sk = bt_accept_dequeue(parent, NULL))) {
1152 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1153
1154 l2cap_chan_lock(chan);
1155 __clear_chan_timer(chan);
1156 l2cap_chan_close(chan, ECONNRESET);
1157 l2cap_chan_unlock(chan);
1158
1159 l2cap_sock_kill(sk);
1160 }
1161}
1162
Gustavo Padovan80b98022012-05-27 22:27:51 -03001163static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001164{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001165 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001166
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001167 lock_sock(parent);
1168
Gustavo Padovan53826692012-05-27 22:27:55 -03001169 /* Check for backlog size */
1170 if (sk_acceptq_is_full(parent)) {
1171 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001172 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001173 return NULL;
1174 }
1175
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001176 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001177 GFP_ATOMIC);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001178 if (!sk) {
1179 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001180 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001181 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001182
Octavian Purdilad22015a2012-01-22 00:28:34 +02001183 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1184
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001185 l2cap_sock_init(sk, parent);
1186
Gustavo Padovan644912e2012-10-12 19:35:23 +08001187 bt_accept_enqueue(parent, sk);
1188
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001189 release_sock(parent);
1190
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001191 return l2cap_pi(sk)->chan;
1192}
1193
Gustavo Padovan80b98022012-05-27 22:27:51 -03001194static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001195{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001196 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001197 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001198
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001199 lock_sock(sk);
1200
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001201 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001202 err = -ENOMEM;
1203 goto done;
1204 }
Mat Martineaue3281402011-07-07 09:39:02 -07001205
1206 err = sock_queue_rcv_skb(sk, skb);
1207
1208 /* For ERTM, handle one skb that doesn't fit into the recv
1209 * buffer. This is important to do because the data frames
1210 * have already been acked, so the skb cannot be discarded.
1211 *
1212 * Notify the l2cap core that the buffer is full, so the
1213 * LOCAL_BUSY state is entered and no more frames are
1214 * acked and reassembled until there is buffer space
1215 * available.
1216 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001217 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1218 l2cap_pi(sk)->rx_busy_skb = skb;
1219 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001220 err = 0;
1221 }
1222
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001223done:
1224 release_sock(sk);
1225
Mat Martineaue3281402011-07-07 09:39:02 -07001226 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001227}
1228
Gustavo Padovan80b98022012-05-27 22:27:51 -03001229static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001230{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001231 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001232
1233 l2cap_sock_kill(sk);
1234}
1235
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001236static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1237{
1238 struct sock *sk = chan->data;
1239 struct sock *parent;
1240
1241 lock_sock(sk);
1242
1243 parent = bt_sk(sk)->parent;
1244
1245 sock_set_flag(sk, SOCK_ZAPPED);
1246
1247 switch (chan->state) {
1248 case BT_OPEN:
1249 case BT_BOUND:
1250 case BT_CLOSED:
1251 break;
1252 case BT_LISTEN:
1253 l2cap_sock_cleanup_listen(sk);
1254 sk->sk_state = BT_CLOSED;
1255 chan->state = BT_CLOSED;
1256
1257 break;
1258 default:
1259 sk->sk_state = BT_CLOSED;
1260 chan->state = BT_CLOSED;
1261
1262 sk->sk_err = err;
1263
1264 if (parent) {
1265 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001266 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001267 } else {
1268 sk->sk_state_change(sk);
1269 }
1270
1271 break;
1272 }
1273
1274 release_sock(sk);
1275}
1276
Gustavo Padovan53f52122013-10-15 19:24:45 -03001277static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1278 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001279{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001280 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001281
1282 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001283
1284 if (err)
1285 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001286}
1287
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001288static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001289 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001290 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001291{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001292 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001293 struct sk_buff *skb;
1294 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001295
Mat Martineaua6a55682012-05-04 14:20:31 -07001296 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001297 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001298 l2cap_chan_lock(chan);
1299
Gustavo Padovan90338942012-04-06 20:15:47 -03001300 if (!skb)
1301 return ERR_PTR(err);
1302
Marcel Holtmann8d463212014-06-05 15:22:51 +02001303 skb->priority = sk->sk_priority;
1304
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001305 bt_cb(skb)->chan = chan;
1306
Gustavo Padovan90338942012-04-06 20:15:47 -03001307 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001308}
1309
Jukka Rissanen04988782014-06-18 16:37:07 +03001310static int l2cap_sock_memcpy_fromiovec_cb(struct l2cap_chan *chan,
1311 unsigned char *kdata,
1312 struct iovec *iov, int len)
1313{
1314 return memcpy_fromiovec(kdata, iov, len);
1315}
1316
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001317static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1318{
1319 struct sock *sk = chan->data;
1320 struct sock *parent;
1321
1322 lock_sock(sk);
1323
1324 parent = bt_sk(sk)->parent;
1325
1326 BT_DBG("sk %p, parent %p", sk, parent);
1327
1328 sk->sk_state = BT_CONNECTED;
1329 sk->sk_state_change(sk);
1330
1331 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001332 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001333
1334 release_sock(sk);
1335}
1336
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001337static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1338{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001339 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001340
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001341 lock_sock(sk);
1342
1343 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001344 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001345 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001346
1347 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001348}
1349
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001350static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1351{
1352 struct sock *sk = chan->data;
1353
Johan Hedbergd52deb12014-08-07 22:56:44 +03001354 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1355 sk->sk_state = BT_CONNECTED;
1356 chan->state = BT_CONNECTED;
1357 }
1358
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001359 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1360 sk->sk_state_change(sk);
1361}
1362
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001363static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1364{
1365 struct sock *sk = chan->data;
1366
1367 lock_sock(sk);
1368 sk->sk_shutdown = SHUTDOWN_MASK;
1369 release_sock(sk);
1370}
1371
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001372static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1373{
1374 struct sock *sk = chan->data;
1375
1376 return sk->sk_sndtimeo;
1377}
1378
Johan Hedberg837776f2013-10-15 11:03:18 +03001379static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1380{
1381 struct sock *sk = chan->data;
1382
1383 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1384 sk->sk_state_change(sk);
1385}
1386
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001387static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001388 .name = "L2CAP Socket Interface",
1389 .new_connection = l2cap_sock_new_connection_cb,
1390 .recv = l2cap_sock_recv_cb,
1391 .close = l2cap_sock_close_cb,
1392 .teardown = l2cap_sock_teardown_cb,
1393 .state_change = l2cap_sock_state_change_cb,
1394 .ready = l2cap_sock_ready_cb,
1395 .defer = l2cap_sock_defer_cb,
1396 .resume = l2cap_sock_resume_cb,
1397 .suspend = l2cap_sock_suspend_cb,
1398 .set_shutdown = l2cap_sock_set_shutdown_cb,
1399 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1400 .alloc_skb = l2cap_sock_alloc_skb_cb,
1401 .memcpy_fromiovec = l2cap_sock_memcpy_fromiovec_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001402};
1403
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001404static void l2cap_sock_destruct(struct sock *sk)
1405{
1406 BT_DBG("sk %p", sk);
1407
Sasha Levin23d3a862012-10-08 16:48:32 -04001408 if (l2cap_pi(sk)->chan)
1409 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001410
Mat Martineaue3281402011-07-07 09:39:02 -07001411 if (l2cap_pi(sk)->rx_busy_skb) {
1412 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1413 l2cap_pi(sk)->rx_busy_skb = NULL;
1414 }
1415
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001416 skb_queue_purge(&sk->sk_receive_queue);
1417 skb_queue_purge(&sk->sk_write_queue);
1418}
1419
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001420static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1421 int *msg_namelen)
1422{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001423 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001424
1425 memset(la, 0, sizeof(struct sockaddr_l2));
1426 la->l2_family = AF_BLUETOOTH;
1427 la->l2_psm = bt_cb(skb)->psm;
1428 bacpy(&la->l2_bdaddr, &bt_cb(skb)->bdaddr);
1429
1430 *msg_namelen = sizeof(struct sockaddr_l2);
1431}
1432
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001433static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001434{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001435 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001436
1437 BT_DBG("sk %p", sk);
1438
1439 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001440 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1441
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001442 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001443 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001444
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001445 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001446 chan->imtu = pchan->imtu;
1447 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001448 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001449 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001450 chan->fcs = pchan->fcs;
1451 chan->max_tx = pchan->max_tx;
1452 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001453 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001454 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001455 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001456 chan->tx_credits = pchan->tx_credits;
1457 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001458
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001459 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1460 chan->scid = pchan->scid;
1461 chan->dcid = pchan->scid;
1462 }
1463
Paul Moore6230c9b2011-10-07 09:40:59 +00001464 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001465 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001466 switch (sk->sk_type) {
1467 case SOCK_RAW:
1468 chan->chan_type = L2CAP_CHAN_RAW;
1469 break;
1470 case SOCK_DGRAM:
1471 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001472 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001473 break;
1474 case SOCK_SEQPACKET:
1475 case SOCK_STREAM:
1476 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1477 break;
1478 }
1479
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001480 chan->imtu = L2CAP_DEFAULT_MTU;
1481 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001482 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001483 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001484 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001485 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001486 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001487 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001488
1489 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001490 }
1491
1492 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001493 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001494
1495 chan->data = sk;
1496 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001497}
1498
1499static struct proto l2cap_proto = {
1500 .name = "L2CAP",
1501 .owner = THIS_MODULE,
1502 .obj_size = sizeof(struct l2cap_pinfo)
1503};
1504
Gustavo Padovan2d792812012-10-06 10:07:01 +01001505static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1506 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001507{
1508 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001509 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001510
1511 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1512 if (!sk)
1513 return NULL;
1514
1515 sock_init_data(sock, sk);
1516 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1517
1518 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001519 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001520
1521 sock_reset_flag(sk, SOCK_ZAPPED);
1522
1523 sk->sk_protocol = proto;
1524 sk->sk_state = BT_OPEN;
1525
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001526 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001527 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301528 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001529 return NULL;
1530 }
1531
Mat Martineau61d6ef32012-04-27 16:50:50 -07001532 l2cap_chan_hold(chan);
1533
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001534 l2cap_pi(sk)->chan = chan;
1535
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001536 return sk;
1537}
1538
1539static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1540 int kern)
1541{
1542 struct sock *sk;
1543
1544 BT_DBG("sock %p", sock);
1545
1546 sock->state = SS_UNCONNECTED;
1547
1548 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001549 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001550 return -ESOCKTNOSUPPORT;
1551
1552 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1553 return -EPERM;
1554
1555 sock->ops = &l2cap_sock_ops;
1556
1557 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1558 if (!sk)
1559 return -ENOMEM;
1560
1561 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001562 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001563 return 0;
1564}
1565
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001566static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001567 .family = PF_BLUETOOTH,
1568 .owner = THIS_MODULE,
1569 .release = l2cap_sock_release,
1570 .bind = l2cap_sock_bind,
1571 .connect = l2cap_sock_connect,
1572 .listen = l2cap_sock_listen,
1573 .accept = l2cap_sock_accept,
1574 .getname = l2cap_sock_getname,
1575 .sendmsg = l2cap_sock_sendmsg,
1576 .recvmsg = l2cap_sock_recvmsg,
1577 .poll = bt_sock_poll,
1578 .ioctl = bt_sock_ioctl,
1579 .mmap = sock_no_mmap,
1580 .socketpair = sock_no_socketpair,
1581 .shutdown = l2cap_sock_shutdown,
1582 .setsockopt = l2cap_sock_setsockopt,
1583 .getsockopt = l2cap_sock_getsockopt
1584};
1585
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001586static const struct net_proto_family l2cap_sock_family_ops = {
1587 .family = PF_BLUETOOTH,
1588 .owner = THIS_MODULE,
1589 .create = l2cap_sock_create,
1590};
1591
1592int __init l2cap_init_sockets(void)
1593{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001594 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001595
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001596 err = proto_register(&l2cap_proto, 0);
1597 if (err < 0)
1598 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001599
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001600 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001601 if (err < 0) {
1602 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001603 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001604 }
1605
Al Virob0316612013-04-04 19:14:33 -04001606 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001607 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001608 if (err < 0) {
1609 BT_ERR("Failed to create L2CAP proc file");
1610 bt_sock_unregister(BTPROTO_L2CAP);
1611 goto error;
1612 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001613
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001614 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001615
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001616 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001617
1618error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001619 proto_unregister(&l2cap_proto);
1620 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001621}
1622
1623void l2cap_cleanup_sockets(void)
1624{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001625 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001626 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001627 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001628}