blob: f65caf41953f866fdea55b8eb342fafc9dc8a1c7 [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;
Johan Hedbergc16900c2014-08-15 21:17:06 +0300149 case L2CAP_CHAN_FIXED:
150 /* Fixed channels default to the L2CAP core not holding a
151 * hci_conn reference for them. For fixed channels mapping to
152 * L2CAP sockets we do want to hold a reference so set the
153 * appropriate flag to request it.
154 */
155 set_bit(FLAG_HOLD_HCI_CONN, &chan->flags);
156 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700157 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300158
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700159 bacpy(&chan->src, &la.l2_bdaddr);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700160 chan->src_type = la.l2_bdaddr_type;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300161
Johan Hedberg38319712013-05-17 12:49:23 +0300162 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200163 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300164
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300165 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300166 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200167
168done:
169 release_sock(sk);
170 return err;
171}
172
Gustavo Padovan2d792812012-10-06 10:07:01 +0100173static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
174 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200175{
176 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300177 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200178 struct sockaddr_l2 la;
179 int len, err = 0;
180
181 BT_DBG("sk %p", sk);
182
183 if (!addr || alen < sizeof(addr->sa_family) ||
184 addr->sa_family != AF_BLUETOOTH)
185 return -EINVAL;
186
187 memset(&la, 0, sizeof(la));
188 len = min_t(unsigned int, sizeof(la), alen);
189 memcpy(&la, addr, len);
190
Ville Tervoacd7d372011-02-10 22:38:49 -0300191 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200192 return -EINVAL;
193
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300194 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
195 return -EINVAL;
196
Johan Hedbergeb622492013-10-18 11:49:25 +0300197 /* Check that the socket wasn't bound to something that
198 * conflicts with the address given to connect(). If chan->src
199 * is BDADDR_ANY it means bind() was never used, in which case
200 * chan->src_type and la.l2_bdaddr_type do not need to match.
201 */
202 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
203 bdaddr_type_is_le(la.l2_bdaddr_type)) {
204 /* Old user space versions will try to incorrectly bind
205 * the ATT socket using BDADDR_BREDR. We need to accept
206 * this and fix up the source address type only when
207 * both the source CID and destination CID indicate
208 * ATT. Anything else is an invalid combination.
209 */
210 if (chan->scid != L2CAP_CID_ATT ||
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700211 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergeb622492013-10-18 11:49:25 +0300212 return -EINVAL;
213
214 /* We don't have the hdev available here to make a
215 * better decision on random vs public, but since all
216 * user space versions that exhibit this issue anyway do
217 * not support random local addresses assuming public
218 * here is good enough.
219 */
220 chan->src_type = BDADDR_LE_PUBLIC;
221 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300222
223 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
224 return -EINVAL;
225
Johan Hedbergbfe46552013-10-16 17:13:26 +0300226 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300227 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200228 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700229 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300230 return -EINVAL;
231 }
232
Johan Hedberg38319712013-05-17 12:49:23 +0300233 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200234 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300235
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530236 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300237 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200238 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200239 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200240
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200241 lock_sock(sk);
242
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200243 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100244 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200245
246 release_sock(sk);
247
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200248 return err;
249}
250
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200251static int l2cap_sock_listen(struct socket *sock, int backlog)
252{
253 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300254 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200255 int err = 0;
256
257 BT_DBG("sk %p backlog %d", sk, backlog);
258
259 lock_sock(sk);
260
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200261 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200262 err = -EBADFD;
263 goto done;
264 }
265
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200266 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
267 err = -EINVAL;
268 goto done;
269 }
270
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300271 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200272 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300273 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200274 break;
275 case L2CAP_MODE_ERTM:
276 case L2CAP_MODE_STREAMING:
277 if (!disable_ertm)
278 break;
279 /* fall through */
280 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300281 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200282 goto done;
283 }
284
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200285 sk->sk_max_ack_backlog = backlog;
286 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300287
Johan Hedbergabe84902014-11-12 22:22:21 +0200288 /* Listening channels need to use nested locking in order not to
289 * cause lockdep warnings when the created child channels end up
290 * being locked in the same thread as the parent channel.
291 */
292 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
293
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300294 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200295 sk->sk_state = BT_LISTEN;
296
297done:
298 release_sock(sk);
299 return err;
300}
301
Gustavo Padovan2d792812012-10-06 10:07:01 +0100302static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
303 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200304{
305 DECLARE_WAITQUEUE(wait, current);
306 struct sock *sk = sock->sk, *nsk;
307 long timeo;
308 int err = 0;
309
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200310 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200311
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200312 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
313
314 BT_DBG("sk %p timeo %ld", sk, timeo);
315
316 /* Wait for an incoming connection. (wake-one). */
317 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400318 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200319 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200320
321 if (sk->sk_state != BT_LISTEN) {
322 err = -EBADFD;
323 break;
324 }
325
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400326 nsk = bt_accept_dequeue(sk, newsock);
327 if (nsk)
328 break;
329
330 if (!timeo) {
331 err = -EAGAIN;
332 break;
333 }
334
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200335 if (signal_pending(current)) {
336 err = sock_intr_errno(timeo);
337 break;
338 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400339
340 release_sock(sk);
341 timeo = schedule_timeout(timeo);
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200342 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200343 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400344 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200345 remove_wait_queue(sk_sleep(sk), &wait);
346
347 if (err)
348 goto done;
349
350 newsock->state = SS_CONNECTED;
351
352 BT_DBG("new socket %p", nsk);
353
354done:
355 release_sock(sk);
356 return err;
357}
358
Gustavo Padovan2d792812012-10-06 10:07:01 +0100359static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
360 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200361{
362 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
363 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300364 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200365
366 BT_DBG("sock %p, sk %p", sock, sk);
367
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200368 if (peer && sk->sk_state != BT_CONNECTED &&
Johan Hedbergbf19d512014-07-01 12:07:23 +0300369 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
370 sk->sk_state != BT_CONFIG)
Johan Hedbergb783fbc2014-01-28 15:16:49 -0800371 return -ENOTCONN;
372
Mathias Krause792039c2012-08-15 11:31:51 +0000373 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200374 addr->sa_family = AF_BLUETOOTH;
375 *len = sizeof(struct sockaddr_l2);
376
Johan Hedbergd7e5e762014-01-28 15:16:51 -0800377 la->l2_psm = chan->psm;
378
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200379 if (peer) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700380 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300381 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700382 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200383 } else {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700384 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300385 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700386 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200387 }
388
389 return 0;
390}
391
Gustavo Padovan2d792812012-10-06 10:07:01 +0100392static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
393 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200394{
395 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300396 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200397 struct l2cap_options opts;
398 struct l2cap_conninfo cinfo;
399 int len, err = 0;
400 u32 opt;
401
402 BT_DBG("sk %p", sk);
403
404 if (get_user(len, optlen))
405 return -EFAULT;
406
407 lock_sock(sk);
408
409 switch (optname) {
410 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200411 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
412 * legacy ATT code depends on getsockopt for
413 * L2CAP_OPTIONS we need to let this pass.
414 */
415 if (bdaddr_type_is_le(chan->src_type) &&
416 chan->scid != L2CAP_CID_ATT) {
417 err = -EINVAL;
418 break;
419 }
420
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300421 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300422 opts.imtu = chan->imtu;
423 opts.omtu = chan->omtu;
424 opts.flush_to = chan->flush_to;
425 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300426 opts.fcs = chan->fcs;
427 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300428 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200429
430 len = min_t(unsigned int, len, sizeof(opts));
431 if (copy_to_user(optval, (char *) &opts, len))
432 err = -EFAULT;
433
434 break;
435
436 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300437 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200438 case BT_SECURITY_LOW:
439 opt = L2CAP_LM_AUTH;
440 break;
441 case BT_SECURITY_MEDIUM:
442 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
443 break;
444 case BT_SECURITY_HIGH:
445 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100446 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200447 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800448 case BT_SECURITY_FIPS:
449 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
450 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
451 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200452 default:
453 opt = 0;
454 break;
455 }
456
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300457 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200458 opt |= L2CAP_LM_MASTER;
459
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300460 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200461 opt |= L2CAP_LM_RELIABLE;
462
463 if (put_user(opt, (u32 __user *) optval))
464 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800465
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200466 break;
467
468 case L2CAP_CONNINFO:
469 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300470 !(sk->sk_state == BT_CONNECT2 &&
471 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200472 err = -ENOTCONN;
473 break;
474 }
475
Filip Palian8d03e972011-05-12 19:32:46 +0200476 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300477 cinfo.hci_handle = chan->conn->hcon->handle;
478 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200479
480 len = min_t(unsigned int, len, sizeof(cinfo));
481 if (copy_to_user(optval, (char *) &cinfo, len))
482 err = -EFAULT;
483
484 break;
485
486 default:
487 err = -ENOPROTOOPT;
488 break;
489 }
490
491 release_sock(sk);
492 return err;
493}
494
Gustavo Padovan2d792812012-10-06 10:07:01 +0100495static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
496 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200497{
498 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300499 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200500 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700501 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200502 int len, err = 0;
503
504 BT_DBG("sk %p", sk);
505
506 if (level == SOL_L2CAP)
507 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
508
509 if (level != SOL_BLUETOOTH)
510 return -ENOPROTOOPT;
511
512 if (get_user(len, optlen))
513 return -EFAULT;
514
515 lock_sock(sk);
516
517 switch (optname) {
518 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300519 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500520 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100521 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200522 err = -EINVAL;
523 break;
524 }
525
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300526 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300527 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300528 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200529
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300530 if (sk->sk_state == BT_CONNECTED)
531 sec.key_size = chan->conn->hcon->enc_key_size;
532 } else {
533 sec.level = chan->sec_level;
534 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300535
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200536 len = min_t(unsigned int, len, sizeof(sec));
537 if (copy_to_user(optval, (char *) &sec, len))
538 err = -EFAULT;
539
540 break;
541
542 case BT_DEFER_SETUP:
543 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
544 err = -EINVAL;
545 break;
546 }
547
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300548 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
549 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200550 err = -EFAULT;
551
552 break;
553
554 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300555 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100556 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200557 err = -EFAULT;
558
559 break;
560
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700561 case BT_POWER:
562 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100563 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700564 err = -EINVAL;
565 break;
566 }
567
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300568 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700569
570 len = min_t(unsigned int, len, sizeof(pwr));
571 if (copy_to_user(optval, (char *) &pwr, len))
572 err = -EFAULT;
573
574 break;
575
Mat Martineau2ea66482011-11-02 16:18:30 -0700576 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700577 if (put_user(chan->chan_policy, (u32 __user *) optval))
578 err = -EFAULT;
579 break;
580
Johan Hedberg1f435422013-12-02 16:34:18 +0200581 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200582 if (!bdaddr_type_is_le(chan->src_type)) {
583 err = -EINVAL;
584 break;
585 }
586
587 if (sk->sk_state != BT_CONNECTED) {
588 err = -ENOTCONN;
589 break;
590 }
591
592 if (put_user(chan->omtu, (u16 __user *) optval))
593 err = -EFAULT;
594 break;
595
596 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200597 if (!bdaddr_type_is_le(chan->src_type)) {
598 err = -EINVAL;
599 break;
600 }
601
602 if (put_user(chan->imtu, (u16 __user *) optval))
603 err = -EFAULT;
604 break;
605
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200606 default:
607 err = -ENOPROTOOPT;
608 break;
609 }
610
611 release_sock(sk);
612 return err;
613}
614
Andre Guedes682877c2012-05-31 17:01:34 -0300615static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
616{
617 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300618 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300619 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300620 return false;
621 break;
622
623 default:
624 if (mtu < L2CAP_DEFAULT_MIN_MTU)
625 return false;
626 }
627
628 return true;
629}
630
Gustavo Padovan2d792812012-10-06 10:07:01 +0100631static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
632 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200633{
634 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300635 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200636 struct l2cap_options opts;
637 int len, err = 0;
638 u32 opt;
639
640 BT_DBG("sk %p", sk);
641
642 lock_sock(sk);
643
644 switch (optname) {
645 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200646 if (bdaddr_type_is_le(chan->src_type)) {
647 err = -EINVAL;
648 break;
649 }
650
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200651 if (sk->sk_state == BT_CONNECTED) {
652 err = -EINVAL;
653 break;
654 }
655
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300656 opts.imtu = chan->imtu;
657 opts.omtu = chan->omtu;
658 opts.flush_to = chan->flush_to;
659 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300660 opts.fcs = chan->fcs;
661 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300662 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200663
664 len = min_t(unsigned int, sizeof(opts), optlen);
665 if (copy_from_user((char *) &opts, optval, len)) {
666 err = -EFAULT;
667 break;
668 }
669
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300670 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200671 err = -EINVAL;
672 break;
673 }
674
Andre Guedes682877c2012-05-31 17:01:34 -0300675 if (!l2cap_valid_mtu(chan, opts.imtu)) {
676 err = -EINVAL;
677 break;
678 }
679
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300680 chan->mode = opts.mode;
681 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +0300682 case L2CAP_MODE_LE_FLOWCTL:
683 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200684 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300685 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200686 break;
687 case L2CAP_MODE_ERTM:
688 case L2CAP_MODE_STREAMING:
689 if (!disable_ertm)
690 break;
691 /* fall through */
692 default:
693 err = -EINVAL;
694 break;
695 }
696
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300697 chan->imtu = opts.imtu;
698 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300699 chan->fcs = opts.fcs;
700 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300701 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300702 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200703 break;
704
705 case L2CAP_LM:
706 if (get_user(opt, (u32 __user *) optval)) {
707 err = -EFAULT;
708 break;
709 }
710
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800711 if (opt & L2CAP_LM_FIPS) {
712 err = -EINVAL;
713 break;
714 }
715
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200716 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300717 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200718 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300719 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200720 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300721 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200722
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300723 if (opt & L2CAP_LM_MASTER)
724 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
725 else
726 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300727
728 if (opt & L2CAP_LM_RELIABLE)
729 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
730 else
731 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200732 break;
733
734 default:
735 err = -ENOPROTOOPT;
736 break;
737 }
738
739 release_sock(sk);
740 return err;
741}
742
Gustavo Padovan2d792812012-10-06 10:07:01 +0100743static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
744 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200745{
746 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300747 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200748 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700749 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300750 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200751 int len, err = 0;
752 u32 opt;
753
754 BT_DBG("sk %p", sk);
755
756 if (level == SOL_L2CAP)
757 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
758
759 if (level != SOL_BLUETOOTH)
760 return -ENOPROTOOPT;
761
762 lock_sock(sk);
763
764 switch (optname) {
765 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300766 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500767 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100768 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200769 err = -EINVAL;
770 break;
771 }
772
773 sec.level = BT_SECURITY_LOW;
774
775 len = min_t(unsigned int, sizeof(sec), optlen);
776 if (copy_from_user((char *) &sec, optval, len)) {
777 err = -EFAULT;
778 break;
779 }
780
781 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100782 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200783 err = -EINVAL;
784 break;
785 }
786
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300787 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300788
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200789 if (!chan->conn)
790 break;
791
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300792 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200793
794 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300795 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300796 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300797 break;
Johan Hedbergd52deb12014-08-07 22:56:44 +0300798 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300799 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200800 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200801
Gustavo Padovana7d77232012-05-13 03:20:07 -0300802 /* or for ACL link */
803 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100804 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300805 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300806 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300807 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300808 else
809 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200810 } else {
811 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300812 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200813 break;
814
815 case BT_DEFER_SETUP:
816 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
817 err = -EINVAL;
818 break;
819 }
820
821 if (get_user(opt, (u32 __user *) optval)) {
822 err = -EFAULT;
823 break;
824 }
825
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700826 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300827 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700828 set_bit(FLAG_DEFER_SETUP, &chan->flags);
829 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300830 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700831 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
832 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200833 break;
834
835 case BT_FLUSHABLE:
836 if (get_user(opt, (u32 __user *) optval)) {
837 err = -EFAULT;
838 break;
839 }
840
841 if (opt > BT_FLUSHABLE_ON) {
842 err = -EINVAL;
843 break;
844 }
845
846 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200847 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300848 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200849 No Flush support in the LM */
850 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
851 err = -EINVAL;
852 break;
853 }
854 }
855
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300856 if (opt)
857 set_bit(FLAG_FLUSHABLE, &chan->flags);
858 else
859 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200860 break;
861
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700862 case BT_POWER:
863 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100864 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700865 err = -EINVAL;
866 break;
867 }
868
869 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
870
871 len = min_t(unsigned int, sizeof(pwr), optlen);
872 if (copy_from_user((char *) &pwr, optval, len)) {
873 err = -EFAULT;
874 break;
875 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300876
877 if (pwr.force_active)
878 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
879 else
880 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700881 break;
882
Mat Martineau2ea66482011-11-02 16:18:30 -0700883 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700884 if (get_user(opt, (u32 __user *) optval)) {
885 err = -EFAULT;
886 break;
887 }
888
889 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
890 err = -EINVAL;
891 break;
892 }
893
894 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100895 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700896 err = -EOPNOTSUPP;
897 break;
898 }
899
900 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700901
902 if (sk->sk_state == BT_CONNECTED &&
903 chan->move_role == L2CAP_MOVE_ROLE_NONE)
904 l2cap_move_start(chan);
905
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200906 break;
907
Johan Hedberg1f435422013-12-02 16:34:18 +0200908 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200909 if (!bdaddr_type_is_le(chan->src_type)) {
910 err = -EINVAL;
911 break;
912 }
913
914 /* Setting is not supported as it's the remote side that
915 * decides this.
916 */
917 err = -EPERM;
918 break;
919
920 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200921 if (!bdaddr_type_is_le(chan->src_type)) {
922 err = -EINVAL;
923 break;
924 }
925
926 if (sk->sk_state == BT_CONNECTED) {
927 err = -EISCONN;
928 break;
929 }
930
931 if (get_user(opt, (u32 __user *) optval)) {
932 err = -EFAULT;
933 break;
934 }
935
936 chan->imtu = opt;
937 break;
938
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200939 default:
940 err = -ENOPROTOOPT;
941 break;
942 }
943
944 release_sock(sk);
945 return err;
946}
947
Gustavo Padovan2d792812012-10-06 10:07:01 +0100948static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
949 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200950{
951 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300952 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200953 int err;
954
955 BT_DBG("sock %p, sk %p", sock, sk);
956
957 err = sock_error(sk);
958 if (err)
959 return err;
960
961 if (msg->msg_flags & MSG_OOB)
962 return -EOPNOTSUPP;
963
Mat Martineaua6a55682012-05-04 14:20:31 -0700964 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300965 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200966
Johan Hedberge793dcf2013-09-16 13:05:19 +0300967 lock_sock(sk);
968 err = bt_sock_wait_ready(sk, msg->msg_flags);
969 release_sock(sk);
970 if (err)
971 return err;
972
Mat Martineaua6a55682012-05-04 14:20:31 -0700973 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +0200974 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -0700975 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200976
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200977 return err;
978}
979
Gustavo Padovan2d792812012-10-06 10:07:01 +0100980static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
981 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200982{
983 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700984 struct l2cap_pinfo *pi = l2cap_pi(sk);
985 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200986
987 lock_sock(sk);
988
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300989 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
990 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +0300991 if (bdaddr_type_is_le(pi->chan->src_type)) {
992 sk->sk_state = BT_CONNECTED;
993 pi->chan->state = BT_CONNECTED;
994 __l2cap_le_connect_rsp_defer(pi->chan);
995 } else {
996 sk->sk_state = BT_CONFIG;
997 pi->chan->state = BT_CONFIG;
998 __l2cap_connect_rsp_defer(pi->chan);
999 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001000
Johan Hedberg970871b2013-09-25 13:26:05 +03001001 err = 0;
1002 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001003 }
1004
1005 release_sock(sk);
1006
1007 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -07001008 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
1009 else
1010 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001011
Mat Martineaue3281402011-07-07 09:39:02 -07001012 if (pi->chan->mode != L2CAP_MODE_ERTM)
1013 return err;
1014
1015 /* Attempt to put pending rx data in the socket buffer */
1016
1017 lock_sock(sk);
1018
1019 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1020 goto done;
1021
1022 if (pi->rx_busy_skb) {
1023 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
1024 pi->rx_busy_skb = NULL;
1025 else
1026 goto done;
1027 }
1028
1029 /* Restore data flow when half of the receive buffer is
1030 * available. This avoids resending large numbers of
1031 * frames.
1032 */
1033 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1034 l2cap_chan_busy(pi->chan, 0);
1035
1036done:
1037 release_sock(sk);
1038 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001039}
1040
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001041/* Kill socket (only if zapped and orphan)
1042 * Must be called on unlocked socket.
1043 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001044static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001045{
1046 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1047 return;
1048
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001049 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001050
1051 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001052
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301053 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001054 sock_set_flag(sk, SOCK_DEAD);
1055 sock_put(sk);
1056}
1057
Gustavo Padovandc253062013-10-15 19:24:49 -03001058static int __l2cap_wait_ack(struct sock *sk)
1059{
1060 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1061 DECLARE_WAITQUEUE(wait, current);
1062 int err = 0;
1063 int timeo = HZ/5;
1064
1065 add_wait_queue(sk_sleep(sk), &wait);
1066 set_current_state(TASK_INTERRUPTIBLE);
1067 while (chan->unacked_frames > 0 && chan->conn) {
1068 if (!timeo)
1069 timeo = HZ/5;
1070
1071 if (signal_pending(current)) {
1072 err = sock_intr_errno(timeo);
1073 break;
1074 }
1075
1076 release_sock(sk);
1077 timeo = schedule_timeout(timeo);
1078 lock_sock(sk);
1079 set_current_state(TASK_INTERRUPTIBLE);
1080
1081 err = sock_error(sk);
1082 if (err)
1083 break;
1084 }
1085 set_current_state(TASK_RUNNING);
1086 remove_wait_queue(sk_sleep(sk), &wait);
1087 return err;
1088}
1089
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001090static int l2cap_sock_shutdown(struct socket *sock, int how)
1091{
1092 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001093 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001094 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001095 int err = 0;
1096
1097 BT_DBG("sock %p, sk %p", sock, sk);
1098
1099 if (!sk)
1100 return 0;
1101
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001102 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001103 conn = chan->conn;
1104
Johan Hedberg49d11742014-11-13 14:37:50 +02001105 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1106
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001107 if (conn)
1108 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001109
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001110 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001111 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001112
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001113 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001114 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001115 err = __l2cap_wait_ack(sk);
1116
1117 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001118
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001119 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03001120 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001121 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001122
Vladimir Davydov093facf2014-07-15 12:25:28 +04001123 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1124 !(current->flags & PF_EXITING))
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001125 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001126 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001127 }
1128
1129 if (!err && sk->sk_err)
1130 err = -sk->sk_err;
1131
1132 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001133 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001134
1135 if (conn)
1136 mutex_unlock(&conn->chan_lock);
1137
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001138 return err;
1139}
1140
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001141static int l2cap_sock_release(struct socket *sock)
1142{
1143 struct sock *sk = sock->sk;
1144 int err;
1145
1146 BT_DBG("sock %p, sk %p", sock, sk);
1147
1148 if (!sk)
1149 return 0;
1150
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001151 bt_sock_unlink(&l2cap_sk_list, sk);
1152
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001153 err = l2cap_sock_shutdown(sock, 2);
1154
1155 sock_orphan(sk);
1156 l2cap_sock_kill(sk);
1157 return err;
1158}
1159
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001160static void l2cap_sock_cleanup_listen(struct sock *parent)
1161{
1162 struct sock *sk;
1163
Johan Hedberg49d11742014-11-13 14:37:50 +02001164 BT_DBG("parent %p state %s", parent,
1165 state_to_string(parent->sk_state));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001166
1167 /* Close not yet accepted channels */
1168 while ((sk = bt_accept_dequeue(parent, NULL))) {
1169 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1170
Johan Hedberg49d11742014-11-13 14:37:50 +02001171 BT_DBG("child chan %p state %s", chan,
1172 state_to_string(chan->state));
1173
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001174 l2cap_chan_lock(chan);
1175 __clear_chan_timer(chan);
1176 l2cap_chan_close(chan, ECONNRESET);
1177 l2cap_chan_unlock(chan);
1178
1179 l2cap_sock_kill(sk);
1180 }
1181}
1182
Gustavo Padovan80b98022012-05-27 22:27:51 -03001183static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001184{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001185 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001186
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001187 lock_sock(parent);
1188
Gustavo Padovan53826692012-05-27 22:27:55 -03001189 /* Check for backlog size */
1190 if (sk_acceptq_is_full(parent)) {
1191 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001192 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001193 return NULL;
1194 }
1195
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001196 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001197 GFP_ATOMIC);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001198 if (!sk) {
1199 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001200 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001201 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001202
Octavian Purdilad22015a2012-01-22 00:28:34 +02001203 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1204
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001205 l2cap_sock_init(sk, parent);
1206
Gustavo Padovan644912e2012-10-12 19:35:23 +08001207 bt_accept_enqueue(parent, sk);
1208
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001209 release_sock(parent);
1210
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001211 return l2cap_pi(sk)->chan;
1212}
1213
Gustavo Padovan80b98022012-05-27 22:27:51 -03001214static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001215{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001216 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001217 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001218
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001219 lock_sock(sk);
1220
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001221 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001222 err = -ENOMEM;
1223 goto done;
1224 }
Mat Martineaue3281402011-07-07 09:39:02 -07001225
1226 err = sock_queue_rcv_skb(sk, skb);
1227
1228 /* For ERTM, handle one skb that doesn't fit into the recv
1229 * buffer. This is important to do because the data frames
1230 * have already been acked, so the skb cannot be discarded.
1231 *
1232 * Notify the l2cap core that the buffer is full, so the
1233 * LOCAL_BUSY state is entered and no more frames are
1234 * acked and reassembled until there is buffer space
1235 * available.
1236 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001237 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1238 l2cap_pi(sk)->rx_busy_skb = skb;
1239 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001240 err = 0;
1241 }
1242
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001243done:
1244 release_sock(sk);
1245
Mat Martineaue3281402011-07-07 09:39:02 -07001246 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001247}
1248
Gustavo Padovan80b98022012-05-27 22:27:51 -03001249static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001250{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001251 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001252
1253 l2cap_sock_kill(sk);
1254}
1255
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001256static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1257{
1258 struct sock *sk = chan->data;
1259 struct sock *parent;
1260
Johan Hedberg49d11742014-11-13 14:37:50 +02001261 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1262
Johan Hedberg3b2ab392014-11-12 22:22:22 +02001263 /* This callback can be called both for server (BT_LISTEN)
1264 * sockets as well as "normal" ones. To avoid lockdep warnings
1265 * with child socket locking (through l2cap_sock_cleanup_listen)
1266 * we need separation into separate nesting levels. The simplest
1267 * way to accomplish this is to inherit the nesting level used
1268 * for the channel.
1269 */
1270 lock_sock_nested(sk, atomic_read(&chan->nesting));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001271
1272 parent = bt_sk(sk)->parent;
1273
1274 sock_set_flag(sk, SOCK_ZAPPED);
1275
1276 switch (chan->state) {
1277 case BT_OPEN:
1278 case BT_BOUND:
1279 case BT_CLOSED:
1280 break;
1281 case BT_LISTEN:
1282 l2cap_sock_cleanup_listen(sk);
1283 sk->sk_state = BT_CLOSED;
1284 chan->state = BT_CLOSED;
1285
1286 break;
1287 default:
1288 sk->sk_state = BT_CLOSED;
1289 chan->state = BT_CLOSED;
1290
1291 sk->sk_err = err;
1292
1293 if (parent) {
1294 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001295 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001296 } else {
1297 sk->sk_state_change(sk);
1298 }
1299
1300 break;
1301 }
1302
1303 release_sock(sk);
1304}
1305
Gustavo Padovan53f52122013-10-15 19:24:45 -03001306static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1307 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001308{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001309 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001310
1311 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001312
1313 if (err)
1314 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001315}
1316
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001317static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001318 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001319 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001320{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001321 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001322 struct sk_buff *skb;
1323 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001324
Mat Martineaua6a55682012-05-04 14:20:31 -07001325 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001326 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001327 l2cap_chan_lock(chan);
1328
Gustavo Padovan90338942012-04-06 20:15:47 -03001329 if (!skb)
1330 return ERR_PTR(err);
1331
Marcel Holtmann8d463212014-06-05 15:22:51 +02001332 skb->priority = sk->sk_priority;
1333
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001334 bt_cb(skb)->chan = chan;
1335
Gustavo Padovan90338942012-04-06 20:15:47 -03001336 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001337}
1338
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001339static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1340{
1341 struct sock *sk = chan->data;
1342 struct sock *parent;
1343
1344 lock_sock(sk);
1345
1346 parent = bt_sk(sk)->parent;
1347
1348 BT_DBG("sk %p, parent %p", sk, parent);
1349
1350 sk->sk_state = BT_CONNECTED;
1351 sk->sk_state_change(sk);
1352
1353 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001354 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001355
1356 release_sock(sk);
1357}
1358
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001359static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1360{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001361 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001362
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001363 lock_sock(sk);
1364
1365 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001366 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001367 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001368
1369 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001370}
1371
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001372static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1373{
1374 struct sock *sk = chan->data;
1375
Johan Hedbergd52deb12014-08-07 22:56:44 +03001376 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1377 sk->sk_state = BT_CONNECTED;
1378 chan->state = BT_CONNECTED;
1379 }
1380
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001381 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1382 sk->sk_state_change(sk);
1383}
1384
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001385static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1386{
1387 struct sock *sk = chan->data;
1388
1389 lock_sock(sk);
1390 sk->sk_shutdown = SHUTDOWN_MASK;
1391 release_sock(sk);
1392}
1393
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001394static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1395{
1396 struct sock *sk = chan->data;
1397
1398 return sk->sk_sndtimeo;
1399}
1400
Johan Hedberg837776f2013-10-15 11:03:18 +03001401static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1402{
1403 struct sock *sk = chan->data;
1404
1405 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1406 sk->sk_state_change(sk);
1407}
1408
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001409static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001410 .name = "L2CAP Socket Interface",
1411 .new_connection = l2cap_sock_new_connection_cb,
1412 .recv = l2cap_sock_recv_cb,
1413 .close = l2cap_sock_close_cb,
1414 .teardown = l2cap_sock_teardown_cb,
1415 .state_change = l2cap_sock_state_change_cb,
1416 .ready = l2cap_sock_ready_cb,
1417 .defer = l2cap_sock_defer_cb,
1418 .resume = l2cap_sock_resume_cb,
1419 .suspend = l2cap_sock_suspend_cb,
1420 .set_shutdown = l2cap_sock_set_shutdown_cb,
1421 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1422 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001423};
1424
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001425static void l2cap_sock_destruct(struct sock *sk)
1426{
1427 BT_DBG("sk %p", sk);
1428
Sasha Levin23d3a862012-10-08 16:48:32 -04001429 if (l2cap_pi(sk)->chan)
1430 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001431
Mat Martineaue3281402011-07-07 09:39:02 -07001432 if (l2cap_pi(sk)->rx_busy_skb) {
1433 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1434 l2cap_pi(sk)->rx_busy_skb = NULL;
1435 }
1436
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001437 skb_queue_purge(&sk->sk_receive_queue);
1438 skb_queue_purge(&sk->sk_write_queue);
1439}
1440
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001441static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1442 int *msg_namelen)
1443{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001444 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001445
1446 memset(la, 0, sizeof(struct sockaddr_l2));
1447 la->l2_family = AF_BLUETOOTH;
1448 la->l2_psm = bt_cb(skb)->psm;
1449 bacpy(&la->l2_bdaddr, &bt_cb(skb)->bdaddr);
1450
1451 *msg_namelen = sizeof(struct sockaddr_l2);
1452}
1453
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001454static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001455{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001456 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001457
1458 BT_DBG("sk %p", sk);
1459
1460 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001461 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1462
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001463 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001464 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001465
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001466 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001467 chan->imtu = pchan->imtu;
1468 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001469 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001470 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001471 chan->fcs = pchan->fcs;
1472 chan->max_tx = pchan->max_tx;
1473 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001474 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001475 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001476 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001477 chan->tx_credits = pchan->tx_credits;
1478 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001479
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001480 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1481 chan->scid = pchan->scid;
1482 chan->dcid = pchan->scid;
1483 }
1484
Paul Moore6230c9b2011-10-07 09:40:59 +00001485 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001486 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001487 switch (sk->sk_type) {
1488 case SOCK_RAW:
1489 chan->chan_type = L2CAP_CHAN_RAW;
1490 break;
1491 case SOCK_DGRAM:
1492 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001493 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001494 break;
1495 case SOCK_SEQPACKET:
1496 case SOCK_STREAM:
1497 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1498 break;
1499 }
1500
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001501 chan->imtu = L2CAP_DEFAULT_MTU;
1502 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001503 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001504 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001505 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001506 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001507 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001508 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001509
1510 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001511 }
1512
1513 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001514 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001515
1516 chan->data = sk;
1517 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001518}
1519
1520static struct proto l2cap_proto = {
1521 .name = "L2CAP",
1522 .owner = THIS_MODULE,
1523 .obj_size = sizeof(struct l2cap_pinfo)
1524};
1525
Gustavo Padovan2d792812012-10-06 10:07:01 +01001526static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1527 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001528{
1529 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001530 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001531
1532 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1533 if (!sk)
1534 return NULL;
1535
1536 sock_init_data(sock, sk);
1537 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1538
1539 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001540 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001541
1542 sock_reset_flag(sk, SOCK_ZAPPED);
1543
1544 sk->sk_protocol = proto;
1545 sk->sk_state = BT_OPEN;
1546
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001547 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001548 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301549 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001550 return NULL;
1551 }
1552
Mat Martineau61d6ef32012-04-27 16:50:50 -07001553 l2cap_chan_hold(chan);
1554
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001555 l2cap_pi(sk)->chan = chan;
1556
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001557 return sk;
1558}
1559
1560static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1561 int kern)
1562{
1563 struct sock *sk;
1564
1565 BT_DBG("sock %p", sock);
1566
1567 sock->state = SS_UNCONNECTED;
1568
1569 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001570 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001571 return -ESOCKTNOSUPPORT;
1572
1573 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1574 return -EPERM;
1575
1576 sock->ops = &l2cap_sock_ops;
1577
1578 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1579 if (!sk)
1580 return -ENOMEM;
1581
1582 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001583 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001584 return 0;
1585}
1586
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001587static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001588 .family = PF_BLUETOOTH,
1589 .owner = THIS_MODULE,
1590 .release = l2cap_sock_release,
1591 .bind = l2cap_sock_bind,
1592 .connect = l2cap_sock_connect,
1593 .listen = l2cap_sock_listen,
1594 .accept = l2cap_sock_accept,
1595 .getname = l2cap_sock_getname,
1596 .sendmsg = l2cap_sock_sendmsg,
1597 .recvmsg = l2cap_sock_recvmsg,
1598 .poll = bt_sock_poll,
1599 .ioctl = bt_sock_ioctl,
1600 .mmap = sock_no_mmap,
1601 .socketpair = sock_no_socketpair,
1602 .shutdown = l2cap_sock_shutdown,
1603 .setsockopt = l2cap_sock_setsockopt,
1604 .getsockopt = l2cap_sock_getsockopt
1605};
1606
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001607static const struct net_proto_family l2cap_sock_family_ops = {
1608 .family = PF_BLUETOOTH,
1609 .owner = THIS_MODULE,
1610 .create = l2cap_sock_create,
1611};
1612
1613int __init l2cap_init_sockets(void)
1614{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001615 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001616
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001617 err = proto_register(&l2cap_proto, 0);
1618 if (err < 0)
1619 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001620
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001621 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001622 if (err < 0) {
1623 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001624 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001625 }
1626
Al Virob0316612013-04-04 19:14:33 -04001627 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001628 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001629 if (err < 0) {
1630 BT_ERR("Failed to create L2CAP proc file");
1631 bt_sock_unregister(BTPROTO_L2CAP);
1632 goto error;
1633 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001634
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001635 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001636
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001637 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001638
1639error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001640 proto_unregister(&l2cap_proto);
1641 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001642}
1643
1644void l2cap_cleanup_sockets(void)
1645{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001646 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001647 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001648 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001649}