blob: 67a8642f57ea7c8ceadc1d379019ea6135877068 [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>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010032#include <linux/sched/signal.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000033
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020034#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020035#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020036#include <net/bluetooth/l2cap.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070037
38#include "smp.h"
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020039
Masatake YAMATO5b28d952012-07-26 01:29:25 +090040static struct bt_sock_list l2cap_sk_list = {
41 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
42};
43
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030044static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030045static void l2cap_sock_init(struct sock *sk, struct sock *parent);
Gustavo Padovan2d792812012-10-06 10:07:01 +010046static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -050047 int proto, gfp_t prio, int kern);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030048
David Herrmannb3916db2013-04-05 14:57:34 +020049bool l2cap_is_socket(struct socket *sock)
50{
51 return sock && sock->ops == &l2cap_sock_ops;
52}
53EXPORT_SYMBOL(l2cap_is_socket);
54
Johan Hedberg49460962013-10-08 13:55:46 +020055static int l2cap_validate_bredr_psm(u16 psm)
56{
57 /* PSM must be odd and lsb of upper byte must be 0 */
58 if ((psm & 0x0101) != 0x0001)
59 return -EINVAL;
60
61 /* Restrict usage of well-known PSMs */
Johan Hedberg114f9f12016-01-26 17:19:09 -050062 if (psm < L2CAP_PSM_DYN_START && !capable(CAP_NET_BIND_SERVICE))
Johan Hedberg49460962013-10-08 13:55:46 +020063 return -EACCES;
64
65 return 0;
66}
67
68static int l2cap_validate_le_psm(u16 psm)
69{
70 /* Valid LE_PSM ranges are defined only until 0x00ff */
Johan Hedberg114f9f12016-01-26 17:19:09 -050071 if (psm > L2CAP_PSM_LE_DYN_END)
Johan Hedberg49460962013-10-08 13:55:46 +020072 return -EINVAL;
73
74 /* Restrict fixed, SIG assigned PSM values to CAP_NET_BIND_SERVICE */
Johan Hedberg114f9f12016-01-26 17:19:09 -050075 if (psm < L2CAP_PSM_LE_DYN_START && !capable(CAP_NET_BIND_SERVICE))
Johan Hedberg49460962013-10-08 13:55:46 +020076 return -EACCES;
77
78 return 0;
79}
80
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020081static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
82{
83 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030084 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020085 struct sockaddr_l2 la;
86 int len, err = 0;
87
88 BT_DBG("sk %p", sk);
89
Mateusz Jurczykd2ecfa72017-06-29 14:04:59 +020090 if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
91 addr->sa_family != AF_BLUETOOTH)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020092 return -EINVAL;
93
94 memset(&la, 0, sizeof(la));
95 len = min_t(unsigned int, sizeof(la), alen);
96 memcpy(&la, addr, len);
97
Ville Tervob62f3282011-02-10 22:38:50 -030098 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020099 return -EINVAL;
100
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300101 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
102 return -EINVAL;
103
Johan Hedbergbfe46552013-10-16 17:13:26 +0300104 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300105 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200106 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700107 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300108 return -EINVAL;
109 }
110
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200111 lock_sock(sk);
112
113 if (sk->sk_state != BT_OPEN) {
114 err = -EBADFD;
115 goto done;
116 }
117
118 if (la.l2_psm) {
119 __u16 psm = __le16_to_cpu(la.l2_psm);
120
Johan Hedberg49460962013-10-08 13:55:46 +0200121 if (la.l2_bdaddr_type == BDADDR_BREDR)
122 err = l2cap_validate_bredr_psm(psm);
123 else
124 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200125
Johan Hedberg49460962013-10-08 13:55:46 +0200126 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200127 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200128 }
129
Johan Hedberga2342c52016-01-26 17:19:11 -0500130 bacpy(&chan->src, &la.l2_bdaddr);
131 chan->src_type = la.l2_bdaddr_type;
132
Ville Tervob62f3282011-02-10 22:38:50 -0300133 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530134 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300135 else
136 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300137
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300138 if (err < 0)
139 goto done;
140
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700141 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700142 case L2CAP_CHAN_CONN_LESS:
143 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
144 chan->sec_level = BT_SECURITY_SDP;
145 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700146 case L2CAP_CHAN_CONN_ORIENTED:
147 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
148 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
149 chan->sec_level = BT_SECURITY_SDP;
150 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200151 case L2CAP_CHAN_RAW:
152 chan->sec_level = BT_SECURITY_SDP;
153 break;
Johan Hedbergc16900c2014-08-15 21:17:06 +0300154 case L2CAP_CHAN_FIXED:
155 /* Fixed channels default to the L2CAP core not holding a
156 * hci_conn reference for them. For fixed channels mapping to
157 * L2CAP sockets we do want to hold a reference so set the
158 * appropriate flag to request it.
159 */
160 set_bit(FLAG_HOLD_HCI_CONN, &chan->flags);
161 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700162 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300163
Johan Hedberg38319712013-05-17 12:49:23 +0300164 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200165 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300166
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300167 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300168 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200169
170done:
171 release_sock(sk);
172 return err;
173}
174
Gustavo Padovan2d792812012-10-06 10:07:01 +0100175static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
176 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200177{
178 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300179 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200180 struct sockaddr_l2 la;
181 int len, err = 0;
182
183 BT_DBG("sk %p", sk);
184
Mateusz Jurczykd2ecfa72017-06-29 14:04:59 +0200185 if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200186 addr->sa_family != AF_BLUETOOTH)
187 return -EINVAL;
188
189 memset(&la, 0, sizeof(la));
190 len = min_t(unsigned int, sizeof(la), alen);
191 memcpy(&la, addr, len);
192
Ville Tervoacd7d372011-02-10 22:38:49 -0300193 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200194 return -EINVAL;
195
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300196 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
197 return -EINVAL;
198
Johan Hedbergeb622492013-10-18 11:49:25 +0300199 /* Check that the socket wasn't bound to something that
200 * conflicts with the address given to connect(). If chan->src
201 * is BDADDR_ANY it means bind() was never used, in which case
202 * chan->src_type and la.l2_bdaddr_type do not need to match.
203 */
204 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
205 bdaddr_type_is_le(la.l2_bdaddr_type)) {
206 /* Old user space versions will try to incorrectly bind
207 * the ATT socket using BDADDR_BREDR. We need to accept
208 * this and fix up the source address type only when
209 * both the source CID and destination CID indicate
210 * ATT. Anything else is an invalid combination.
211 */
212 if (chan->scid != L2CAP_CID_ATT ||
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700213 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergeb622492013-10-18 11:49:25 +0300214 return -EINVAL;
215
216 /* We don't have the hdev available here to make a
217 * better decision on random vs public, but since all
218 * user space versions that exhibit this issue anyway do
219 * not support random local addresses assuming public
220 * here is good enough.
221 */
222 chan->src_type = BDADDR_LE_PUBLIC;
223 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300224
225 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
226 return -EINVAL;
227
Johan Hedbergbfe46552013-10-16 17:13:26 +0300228 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300229 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200230 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700231 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300232 return -EINVAL;
233 }
234
Johan Hedberg38319712013-05-17 12:49:23 +0300235 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200236 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300237
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530238 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300239 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200240 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200241 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200242
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200243 lock_sock(sk);
244
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200245 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100246 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200247
248 release_sock(sk);
249
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200250 return err;
251}
252
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200253static int l2cap_sock_listen(struct socket *sock, int backlog)
254{
255 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300256 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200257 int err = 0;
258
259 BT_DBG("sk %p backlog %d", sk, backlog);
260
261 lock_sock(sk);
262
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200263 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200264 err = -EBADFD;
265 goto done;
266 }
267
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200268 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
269 err = -EINVAL;
270 goto done;
271 }
272
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300273 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200274 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300275 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200276 break;
277 case L2CAP_MODE_ERTM:
278 case L2CAP_MODE_STREAMING:
279 if (!disable_ertm)
280 break;
281 /* fall through */
282 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300283 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200284 goto done;
285 }
286
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200287 sk->sk_max_ack_backlog = backlog;
288 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300289
Johan Hedbergabe84902014-11-12 22:22:21 +0200290 /* Listening channels need to use nested locking in order not to
291 * cause lockdep warnings when the created child channels end up
292 * being locked in the same thread as the parent channel.
293 */
294 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
295
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300296 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200297 sk->sk_state = BT_LISTEN;
298
299done:
300 release_sock(sk);
301 return err;
302}
303
Gustavo Padovan2d792812012-10-06 10:07:01 +0100304static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
David Howellscdfbabf2017-03-09 08:09:05 +0000305 int flags, bool kern)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200306{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500307 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200308 struct sock *sk = sock->sk, *nsk;
309 long timeo;
310 int err = 0;
311
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200312 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200313
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200314 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
315
316 BT_DBG("sk %p timeo %ld", sk, timeo);
317
318 /* Wait for an incoming connection. (wake-one). */
319 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400320 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200321 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);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500341
342 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
343
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200344 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200345 }
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200346 remove_wait_queue(sk_sleep(sk), &wait);
347
348 if (err)
349 goto done;
350
351 newsock->state = SS_CONNECTED;
352
353 BT_DBG("new socket %p", nsk);
354
355done:
356 release_sock(sk);
357 return err;
358}
359
Gustavo Padovan2d792812012-10-06 10:07:01 +0100360static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
361 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200362{
363 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
364 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300365 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200366
367 BT_DBG("sock %p, sk %p", sock, sk);
368
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200369 if (peer && sk->sk_state != BT_CONNECTED &&
Johan Hedbergbf19d512014-07-01 12:07:23 +0300370 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
371 sk->sk_state != BT_CONFIG)
Johan Hedbergb783fbc2014-01-28 15:16:49 -0800372 return -ENOTCONN;
373
Mathias Krause792039c2012-08-15 11:31:51 +0000374 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200375 addr->sa_family = AF_BLUETOOTH;
376 *len = sizeof(struct sockaddr_l2);
377
Johan Hedbergd7e5e762014-01-28 15:16:51 -0800378 la->l2_psm = chan->psm;
379
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200380 if (peer) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700381 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300382 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700383 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200384 } else {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700385 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300386 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700387 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200388 }
389
390 return 0;
391}
392
Gustavo Padovan2d792812012-10-06 10:07:01 +0100393static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
394 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200395{
396 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300397 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200398 struct l2cap_options opts;
399 struct l2cap_conninfo cinfo;
400 int len, err = 0;
401 u32 opt;
402
403 BT_DBG("sk %p", sk);
404
405 if (get_user(len, optlen))
406 return -EFAULT;
407
408 lock_sock(sk);
409
410 switch (optname) {
411 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200412 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
413 * legacy ATT code depends on getsockopt for
414 * L2CAP_OPTIONS we need to let this pass.
415 */
416 if (bdaddr_type_is_le(chan->src_type) &&
417 chan->scid != L2CAP_CID_ATT) {
418 err = -EINVAL;
419 break;
420 }
421
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300422 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300423 opts.imtu = chan->imtu;
424 opts.omtu = chan->omtu;
425 opts.flush_to = chan->flush_to;
426 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300427 opts.fcs = chan->fcs;
428 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300429 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200430
431 len = min_t(unsigned int, len, sizeof(opts));
432 if (copy_to_user(optval, (char *) &opts, len))
433 err = -EFAULT;
434
435 break;
436
437 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300438 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200439 case BT_SECURITY_LOW:
440 opt = L2CAP_LM_AUTH;
441 break;
442 case BT_SECURITY_MEDIUM:
443 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
444 break;
445 case BT_SECURITY_HIGH:
446 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100447 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200448 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800449 case BT_SECURITY_FIPS:
450 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
451 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
452 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200453 default:
454 opt = 0;
455 break;
456 }
457
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300458 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200459 opt |= L2CAP_LM_MASTER;
460
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300461 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200462 opt |= L2CAP_LM_RELIABLE;
463
464 if (put_user(opt, (u32 __user *) optval))
465 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800466
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200467 break;
468
469 case L2CAP_CONNINFO:
470 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300471 !(sk->sk_state == BT_CONNECT2 &&
472 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200473 err = -ENOTCONN;
474 break;
475 }
476
Filip Palian8d03e972011-05-12 19:32:46 +0200477 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300478 cinfo.hci_handle = chan->conn->hcon->handle;
479 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200480
481 len = min_t(unsigned int, len, sizeof(cinfo));
482 if (copy_to_user(optval, (char *) &cinfo, len))
483 err = -EFAULT;
484
485 break;
486
487 default:
488 err = -ENOPROTOOPT;
489 break;
490 }
491
492 release_sock(sk);
493 return err;
494}
495
Gustavo Padovan2d792812012-10-06 10:07:01 +0100496static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
497 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200498{
499 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300500 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200501 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700502 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200503 int len, err = 0;
504
505 BT_DBG("sk %p", sk);
506
507 if (level == SOL_L2CAP)
508 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
509
510 if (level != SOL_BLUETOOTH)
511 return -ENOPROTOOPT;
512
513 if (get_user(len, optlen))
514 return -EFAULT;
515
516 lock_sock(sk);
517
518 switch (optname) {
519 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300520 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500521 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100522 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200523 err = -EINVAL;
524 break;
525 }
526
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300527 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300528 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300529 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200530
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300531 if (sk->sk_state == BT_CONNECTED)
532 sec.key_size = chan->conn->hcon->enc_key_size;
533 } else {
534 sec.level = chan->sec_level;
535 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300536
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200537 len = min_t(unsigned int, len, sizeof(sec));
538 if (copy_to_user(optval, (char *) &sec, len))
539 err = -EFAULT;
540
541 break;
542
543 case BT_DEFER_SETUP:
544 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
545 err = -EINVAL;
546 break;
547 }
548
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300549 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
550 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200551 err = -EFAULT;
552
553 break;
554
555 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300556 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100557 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200558 err = -EFAULT;
559
560 break;
561
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700562 case BT_POWER:
563 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100564 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700565 err = -EINVAL;
566 break;
567 }
568
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300569 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700570
571 len = min_t(unsigned int, len, sizeof(pwr));
572 if (copy_to_user(optval, (char *) &pwr, len))
573 err = -EFAULT;
574
575 break;
576
Mat Martineau2ea66482011-11-02 16:18:30 -0700577 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700578 if (put_user(chan->chan_policy, (u32 __user *) optval))
579 err = -EFAULT;
580 break;
581
Johan Hedberg1f435422013-12-02 16:34:18 +0200582 case BT_SNDMTU:
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 (sk->sk_state != BT_CONNECTED) {
589 err = -ENOTCONN;
590 break;
591 }
592
593 if (put_user(chan->omtu, (u16 __user *) optval))
594 err = -EFAULT;
595 break;
596
597 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200598 if (!bdaddr_type_is_le(chan->src_type)) {
599 err = -EINVAL;
600 break;
601 }
602
603 if (put_user(chan->imtu, (u16 __user *) optval))
604 err = -EFAULT;
605 break;
606
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200607 default:
608 err = -ENOPROTOOPT;
609 break;
610 }
611
612 release_sock(sk);
613 return err;
614}
615
Andre Guedes682877c2012-05-31 17:01:34 -0300616static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
617{
618 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300619 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300620 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300621 return false;
622 break;
623
624 default:
625 if (mtu < L2CAP_DEFAULT_MIN_MTU)
626 return false;
627 }
628
629 return true;
630}
631
Gustavo Padovan2d792812012-10-06 10:07:01 +0100632static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
633 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200634{
635 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300636 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200637 struct l2cap_options opts;
638 int len, err = 0;
639 u32 opt;
640
641 BT_DBG("sk %p", sk);
642
643 lock_sock(sk);
644
645 switch (optname) {
646 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200647 if (bdaddr_type_is_le(chan->src_type)) {
648 err = -EINVAL;
649 break;
650 }
651
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200652 if (sk->sk_state == BT_CONNECTED) {
653 err = -EINVAL;
654 break;
655 }
656
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300657 opts.imtu = chan->imtu;
658 opts.omtu = chan->omtu;
659 opts.flush_to = chan->flush_to;
660 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300661 opts.fcs = chan->fcs;
662 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300663 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200664
665 len = min_t(unsigned int, sizeof(opts), optlen);
666 if (copy_from_user((char *) &opts, optval, len)) {
667 err = -EFAULT;
668 break;
669 }
670
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300671 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200672 err = -EINVAL;
673 break;
674 }
675
Andre Guedes682877c2012-05-31 17:01:34 -0300676 if (!l2cap_valid_mtu(chan, opts.imtu)) {
677 err = -EINVAL;
678 break;
679 }
680
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300681 chan->mode = opts.mode;
682 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +0300683 case L2CAP_MODE_LE_FLOWCTL:
684 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200685 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300686 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200687 break;
688 case L2CAP_MODE_ERTM:
689 case L2CAP_MODE_STREAMING:
690 if (!disable_ertm)
691 break;
692 /* fall through */
693 default:
694 err = -EINVAL;
695 break;
696 }
697
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300698 chan->imtu = opts.imtu;
699 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300700 chan->fcs = opts.fcs;
701 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300702 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300703 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200704 break;
705
706 case L2CAP_LM:
707 if (get_user(opt, (u32 __user *) optval)) {
708 err = -EFAULT;
709 break;
710 }
711
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800712 if (opt & L2CAP_LM_FIPS) {
713 err = -EINVAL;
714 break;
715 }
716
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200717 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300718 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200719 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300720 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200721 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300722 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200723
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300724 if (opt & L2CAP_LM_MASTER)
725 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
726 else
727 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300728
729 if (opt & L2CAP_LM_RELIABLE)
730 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
731 else
732 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200733 break;
734
735 default:
736 err = -ENOPROTOOPT;
737 break;
738 }
739
740 release_sock(sk);
741 return err;
742}
743
Gustavo Padovan2d792812012-10-06 10:07:01 +0100744static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
745 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200746{
747 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300748 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200749 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700750 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300751 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200752 int len, err = 0;
753 u32 opt;
754
755 BT_DBG("sk %p", sk);
756
757 if (level == SOL_L2CAP)
758 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
759
760 if (level != SOL_BLUETOOTH)
761 return -ENOPROTOOPT;
762
763 lock_sock(sk);
764
765 switch (optname) {
766 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300767 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500768 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100769 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200770 err = -EINVAL;
771 break;
772 }
773
774 sec.level = BT_SECURITY_LOW;
775
776 len = min_t(unsigned int, sizeof(sec), optlen);
777 if (copy_from_user((char *) &sec, optval, len)) {
778 err = -EFAULT;
779 break;
780 }
781
782 if (sec.level < BT_SECURITY_LOW ||
Patrik Flykta164cee2016-03-24 16:04:15 +0200783 sec.level > BT_SECURITY_FIPS) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200784 err = -EINVAL;
785 break;
786 }
787
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300788 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300789
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200790 if (!chan->conn)
791 break;
792
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300793 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200794
795 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300796 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300797 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300798 break;
Johan Hedbergd52deb12014-08-07 22:56:44 +0300799 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300800 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200801 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200802
Gustavo Padovana7d77232012-05-13 03:20:07 -0300803 /* or for ACL link */
804 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100805 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300806 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300807 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300808 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300809 else
810 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200811 } else {
812 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300813 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200814 break;
815
816 case BT_DEFER_SETUP:
817 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
818 err = -EINVAL;
819 break;
820 }
821
822 if (get_user(opt, (u32 __user *) optval)) {
823 err = -EFAULT;
824 break;
825 }
826
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700827 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300828 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700829 set_bit(FLAG_DEFER_SETUP, &chan->flags);
830 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300831 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700832 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
833 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200834 break;
835
836 case BT_FLUSHABLE:
837 if (get_user(opt, (u32 __user *) optval)) {
838 err = -EFAULT;
839 break;
840 }
841
842 if (opt > BT_FLUSHABLE_ON) {
843 err = -EINVAL;
844 break;
845 }
846
847 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200848 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300849 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200850 No Flush support in the LM */
851 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
852 err = -EINVAL;
853 break;
854 }
855 }
856
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300857 if (opt)
858 set_bit(FLAG_FLUSHABLE, &chan->flags);
859 else
860 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200861 break;
862
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700863 case BT_POWER:
864 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100865 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700866 err = -EINVAL;
867 break;
868 }
869
870 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
871
872 len = min_t(unsigned int, sizeof(pwr), optlen);
873 if (copy_from_user((char *) &pwr, optval, len)) {
874 err = -EFAULT;
875 break;
876 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300877
878 if (pwr.force_active)
879 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
880 else
881 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700882 break;
883
Mat Martineau2ea66482011-11-02 16:18:30 -0700884 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700885 if (get_user(opt, (u32 __user *) optval)) {
886 err = -EFAULT;
887 break;
888 }
889
890 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
891 err = -EINVAL;
892 break;
893 }
894
895 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100896 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700897 err = -EOPNOTSUPP;
898 break;
899 }
900
901 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700902
903 if (sk->sk_state == BT_CONNECTED &&
904 chan->move_role == L2CAP_MOVE_ROLE_NONE)
905 l2cap_move_start(chan);
906
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200907 break;
908
Johan Hedberg1f435422013-12-02 16:34:18 +0200909 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200910 if (!bdaddr_type_is_le(chan->src_type)) {
911 err = -EINVAL;
912 break;
913 }
914
915 /* Setting is not supported as it's the remote side that
916 * decides this.
917 */
918 err = -EPERM;
919 break;
920
921 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200922 if (!bdaddr_type_is_le(chan->src_type)) {
923 err = -EINVAL;
924 break;
925 }
926
927 if (sk->sk_state == BT_CONNECTED) {
928 err = -EISCONN;
929 break;
930 }
931
Amadeusz Sławiński23bc6ab2016-07-14 10:50:23 +0200932 if (get_user(opt, (u16 __user *) optval)) {
Johan Hedberg1f435422013-12-02 16:34:18 +0200933 err = -EFAULT;
934 break;
935 }
936
937 chan->imtu = opt;
938 break;
939
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200940 default:
941 err = -ENOPROTOOPT;
942 break;
943 }
944
945 release_sock(sk);
946 return err;
947}
948
Ying Xue1b784142015-03-02 15:37:48 +0800949static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg,
950 size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200951{
952 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300953 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200954 int err;
955
956 BT_DBG("sock %p, sk %p", sock, sk);
957
958 err = sock_error(sk);
959 if (err)
960 return err;
961
962 if (msg->msg_flags & MSG_OOB)
963 return -EOPNOTSUPP;
964
Mat Martineaua6a55682012-05-04 14:20:31 -0700965 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300966 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200967
Johan Hedberge793dcf2013-09-16 13:05:19 +0300968 lock_sock(sk);
969 err = bt_sock_wait_ready(sk, msg->msg_flags);
970 release_sock(sk);
971 if (err)
972 return err;
973
Mat Martineaua6a55682012-05-04 14:20:31 -0700974 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +0200975 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -0700976 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200977
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200978 return err;
979}
980
Ying Xue1b784142015-03-02 15:37:48 +0800981static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,
982 size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200983{
984 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700985 struct l2cap_pinfo *pi = l2cap_pi(sk);
986 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200987
988 lock_sock(sk);
989
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300990 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
991 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +0300992 if (bdaddr_type_is_le(pi->chan->src_type)) {
993 sk->sk_state = BT_CONNECTED;
994 pi->chan->state = BT_CONNECTED;
995 __l2cap_le_connect_rsp_defer(pi->chan);
996 } else {
997 sk->sk_state = BT_CONFIG;
998 pi->chan->state = BT_CONFIG;
999 __l2cap_connect_rsp_defer(pi->chan);
1000 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001001
Johan Hedberg970871b2013-09-25 13:26:05 +03001002 err = 0;
1003 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001004 }
1005
1006 release_sock(sk);
1007
1008 if (sock->type == SOCK_STREAM)
Ying Xue1b784142015-03-02 15:37:48 +08001009 err = bt_sock_stream_recvmsg(sock, msg, len, flags);
Mat Martineaue3281402011-07-07 09:39:02 -07001010 else
Ying Xue1b784142015-03-02 15:37:48 +08001011 err = bt_sock_recvmsg(sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001012
Mat Martineaue3281402011-07-07 09:39:02 -07001013 if (pi->chan->mode != L2CAP_MODE_ERTM)
1014 return err;
1015
1016 /* Attempt to put pending rx data in the socket buffer */
1017
1018 lock_sock(sk);
1019
1020 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1021 goto done;
1022
1023 if (pi->rx_busy_skb) {
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001024 if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))
Mat Martineaue3281402011-07-07 09:39:02 -07001025 pi->rx_busy_skb = NULL;
1026 else
1027 goto done;
1028 }
1029
1030 /* Restore data flow when half of the receive buffer is
1031 * available. This avoids resending large numbers of
1032 * frames.
1033 */
1034 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1035 l2cap_chan_busy(pi->chan, 0);
1036
1037done:
1038 release_sock(sk);
1039 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001040}
1041
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001042/* Kill socket (only if zapped and orphan)
1043 * Must be called on unlocked socket.
1044 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001045static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001046{
1047 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1048 return;
1049
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001050 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001051
1052 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001053
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301054 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001055 sock_set_flag(sk, SOCK_DEAD);
1056 sock_put(sk);
1057}
1058
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001059static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
Gustavo Padovandc253062013-10-15 19:24:49 -03001060{
Gustavo Padovandc253062013-10-15 19:24:49 -03001061 DECLARE_WAITQUEUE(wait, current);
1062 int err = 0;
Dean Jenkinscb02a252015-06-23 17:59:38 +01001063 int timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Dean Jenkinse432c722015-06-23 17:59:39 +01001064 /* Timeout to prevent infinite loop */
1065 unsigned long timeout = jiffies + L2CAP_WAIT_ACK_TIMEOUT;
Gustavo Padovandc253062013-10-15 19:24:49 -03001066
1067 add_wait_queue(sk_sleep(sk), &wait);
1068 set_current_state(TASK_INTERRUPTIBLE);
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001069 do {
Dean Jenkinse432c722015-06-23 17:59:39 +01001070 BT_DBG("Waiting for %d ACKs, timeout %04d ms",
1071 chan->unacked_frames, time_after(jiffies, timeout) ? 0 :
1072 jiffies_to_msecs(timeout - jiffies));
Dean Jenkins451e4c62015-06-23 17:59:37 +01001073
Gustavo Padovandc253062013-10-15 19:24:49 -03001074 if (!timeo)
Dean Jenkinscb02a252015-06-23 17:59:38 +01001075 timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Gustavo Padovandc253062013-10-15 19:24:49 -03001076
1077 if (signal_pending(current)) {
1078 err = sock_intr_errno(timeo);
1079 break;
1080 }
1081
1082 release_sock(sk);
1083 timeo = schedule_timeout(timeo);
1084 lock_sock(sk);
1085 set_current_state(TASK_INTERRUPTIBLE);
1086
1087 err = sock_error(sk);
1088 if (err)
1089 break;
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001090
Dean Jenkinse432c722015-06-23 17:59:39 +01001091 if (time_after(jiffies, timeout)) {
1092 err = -ENOLINK;
1093 break;
1094 }
1095
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001096 } while (chan->unacked_frames > 0 &&
1097 chan->state == BT_CONNECTED);
1098
Gustavo Padovandc253062013-10-15 19:24:49 -03001099 set_current_state(TASK_RUNNING);
1100 remove_wait_queue(sk_sleep(sk), &wait);
1101 return err;
1102}
1103
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001104static int l2cap_sock_shutdown(struct socket *sock, int how)
1105{
1106 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001107 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001108 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001109 int err = 0;
1110
1111 BT_DBG("sock %p, sk %p", sock, sk);
1112
1113 if (!sk)
1114 return 0;
1115
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001116 lock_sock(sk);
1117
Dean Jenkinse7456432015-10-14 12:18:45 +02001118 if (sk->sk_shutdown)
1119 goto shutdown_already;
1120
1121 BT_DBG("Handling sock shutdown");
1122
Dean Jenkins2baea852015-06-23 17:59:32 +01001123 /* prevent sk structure from being freed whilst unlocked */
1124 sock_hold(sk);
1125
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001126 chan = l2cap_pi(sk)->chan;
Dean Jenkins2baea852015-06-23 17:59:32 +01001127 /* prevent chan structure from being freed whilst unlocked */
1128 l2cap_chan_hold(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001129
Johan Hedberg49d11742014-11-13 14:37:50 +02001130 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1131
Dean Jenkinse7456432015-10-14 12:18:45 +02001132 if (chan->mode == L2CAP_MODE_ERTM &&
1133 chan->unacked_frames > 0 &&
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001134 chan->state == BT_CONNECTED) {
Dean Jenkinse7456432015-10-14 12:18:45 +02001135 err = __l2cap_wait_ack(sk, chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001136
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001137 /* After waiting for ACKs, check whether shutdown
1138 * has already been actioned to close the L2CAP
1139 * link such as by l2cap_disconnection_req().
1140 */
1141 if (sk->sk_shutdown)
1142 goto has_shutdown;
1143 }
1144
Dean Jenkinse7456432015-10-14 12:18:45 +02001145 sk->sk_shutdown = SHUTDOWN_MASK;
Dean Jenkinse7456432015-10-14 12:18:45 +02001146 release_sock(sk);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001147
1148 l2cap_chan_lock(chan);
1149 conn = chan->conn;
1150 if (conn)
1151 /* prevent conn structure from being freed */
1152 l2cap_conn_get(conn);
1153 l2cap_chan_unlock(chan);
1154
1155 if (conn)
1156 /* mutex lock must be taken before l2cap_chan_lock() */
1157 mutex_lock(&conn->chan_lock);
1158
1159 l2cap_chan_lock(chan);
Dean Jenkinse7456432015-10-14 12:18:45 +02001160 l2cap_chan_close(chan, 0);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001161 l2cap_chan_unlock(chan);
1162
1163 if (conn) {
1164 mutex_unlock(&conn->chan_lock);
1165 l2cap_conn_put(conn);
1166 }
1167
Dean Jenkinse7456432015-10-14 12:18:45 +02001168 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001169
Dean Jenkinse7456432015-10-14 12:18:45 +02001170 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1171 !(current->flags & PF_EXITING))
1172 err = bt_sock_wait_state(sk, BT_CLOSED,
1173 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001174
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001175has_shutdown:
Dean Jenkins2baea852015-06-23 17:59:32 +01001176 l2cap_chan_put(chan);
1177 sock_put(sk);
1178
Dean Jenkinse7456432015-10-14 12:18:45 +02001179shutdown_already:
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001180 if (!err && sk->sk_err)
1181 err = -sk->sk_err;
1182
1183 release_sock(sk);
1184
1185 BT_DBG("Sock shutdown complete err: %d", err);
Dean Jenkins451e4c62015-06-23 17:59:37 +01001186
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001187 return err;
1188}
1189
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001190static int l2cap_sock_release(struct socket *sock)
1191{
1192 struct sock *sk = sock->sk;
1193 int err;
1194
1195 BT_DBG("sock %p, sk %p", sock, sk);
1196
1197 if (!sk)
1198 return 0;
1199
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001200 bt_sock_unlink(&l2cap_sk_list, sk);
1201
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001202 err = l2cap_sock_shutdown(sock, 2);
1203
1204 sock_orphan(sk);
1205 l2cap_sock_kill(sk);
1206 return err;
1207}
1208
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001209static void l2cap_sock_cleanup_listen(struct sock *parent)
1210{
1211 struct sock *sk;
1212
Johan Hedberg49d11742014-11-13 14:37:50 +02001213 BT_DBG("parent %p state %s", parent,
1214 state_to_string(parent->sk_state));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001215
1216 /* Close not yet accepted channels */
1217 while ((sk = bt_accept_dequeue(parent, NULL))) {
1218 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1219
Johan Hedberg49d11742014-11-13 14:37:50 +02001220 BT_DBG("child chan %p state %s", chan,
1221 state_to_string(chan->state));
1222
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001223 l2cap_chan_lock(chan);
1224 __clear_chan_timer(chan);
1225 l2cap_chan_close(chan, ECONNRESET);
1226 l2cap_chan_unlock(chan);
1227
1228 l2cap_sock_kill(sk);
1229 }
1230}
1231
Gustavo Padovan80b98022012-05-27 22:27:51 -03001232static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001233{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001234 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001235
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001236 lock_sock(parent);
1237
Gustavo Padovan53826692012-05-27 22:27:55 -03001238 /* Check for backlog size */
1239 if (sk_acceptq_is_full(parent)) {
1240 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001241 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001242 return NULL;
1243 }
1244
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001245 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001246 GFP_ATOMIC, 0);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001247 if (!sk) {
1248 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001249 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001250 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001251
Octavian Purdilad22015a2012-01-22 00:28:34 +02001252 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1253
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001254 l2cap_sock_init(sk, parent);
1255
Gustavo Padovan644912e2012-10-12 19:35:23 +08001256 bt_accept_enqueue(parent, sk);
1257
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001258 release_sock(parent);
1259
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001260 return l2cap_pi(sk)->chan;
1261}
1262
Gustavo Padovan80b98022012-05-27 22:27:51 -03001263static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001264{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001265 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001266 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001267
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001268 lock_sock(sk);
1269
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001270 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001271 err = -ENOMEM;
1272 goto done;
1273 }
Mat Martineaue3281402011-07-07 09:39:02 -07001274
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001275 if (chan->mode != L2CAP_MODE_ERTM &&
1276 chan->mode != L2CAP_MODE_STREAMING) {
1277 /* Even if no filter is attached, we could potentially
1278 * get errors from security modules, etc.
1279 */
1280 err = sk_filter(sk, skb);
1281 if (err)
1282 goto done;
1283 }
1284
1285 err = __sock_queue_rcv_skb(sk, skb);
Mat Martineaue3281402011-07-07 09:39:02 -07001286
1287 /* For ERTM, handle one skb that doesn't fit into the recv
1288 * buffer. This is important to do because the data frames
1289 * have already been acked, so the skb cannot be discarded.
1290 *
1291 * Notify the l2cap core that the buffer is full, so the
1292 * LOCAL_BUSY state is entered and no more frames are
1293 * acked and reassembled until there is buffer space
1294 * available.
1295 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001296 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1297 l2cap_pi(sk)->rx_busy_skb = skb;
1298 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001299 err = 0;
1300 }
1301
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001302done:
1303 release_sock(sk);
1304
Mat Martineaue3281402011-07-07 09:39:02 -07001305 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001306}
1307
Gustavo Padovan80b98022012-05-27 22:27:51 -03001308static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001309{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001310 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001311
1312 l2cap_sock_kill(sk);
1313}
1314
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001315static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1316{
1317 struct sock *sk = chan->data;
1318 struct sock *parent;
1319
Johan Hedberg49d11742014-11-13 14:37:50 +02001320 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1321
Johan Hedberg3b2ab392014-11-12 22:22:22 +02001322 /* This callback can be called both for server (BT_LISTEN)
1323 * sockets as well as "normal" ones. To avoid lockdep warnings
1324 * with child socket locking (through l2cap_sock_cleanup_listen)
1325 * we need separation into separate nesting levels. The simplest
1326 * way to accomplish this is to inherit the nesting level used
1327 * for the channel.
1328 */
1329 lock_sock_nested(sk, atomic_read(&chan->nesting));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001330
1331 parent = bt_sk(sk)->parent;
1332
1333 sock_set_flag(sk, SOCK_ZAPPED);
1334
1335 switch (chan->state) {
1336 case BT_OPEN:
1337 case BT_BOUND:
1338 case BT_CLOSED:
1339 break;
1340 case BT_LISTEN:
1341 l2cap_sock_cleanup_listen(sk);
1342 sk->sk_state = BT_CLOSED;
1343 chan->state = BT_CLOSED;
1344
1345 break;
1346 default:
1347 sk->sk_state = BT_CLOSED;
1348 chan->state = BT_CLOSED;
1349
1350 sk->sk_err = err;
1351
1352 if (parent) {
1353 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001354 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001355 } else {
1356 sk->sk_state_change(sk);
1357 }
1358
1359 break;
1360 }
1361
1362 release_sock(sk);
1363}
1364
Gustavo Padovan53f52122013-10-15 19:24:45 -03001365static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1366 int err)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001367{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001368 struct sock *sk = chan->data;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001369
1370 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001371
1372 if (err)
1373 sk->sk_err = err;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001374}
1375
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001376static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001377 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001378 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001379{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001380 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001381 struct sk_buff *skb;
1382 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001383
Mat Martineaua6a55682012-05-04 14:20:31 -07001384 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001385 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001386 l2cap_chan_lock(chan);
1387
Gustavo Padovan90338942012-04-06 20:15:47 -03001388 if (!skb)
1389 return ERR_PTR(err);
1390
Marcel Holtmann8d463212014-06-05 15:22:51 +02001391 skb->priority = sk->sk_priority;
1392
Johan Hedberga4368ff2015-03-30 23:21:01 +03001393 bt_cb(skb)->l2cap.chan = chan;
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001394
Gustavo Padovan90338942012-04-06 20:15:47 -03001395 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001396}
1397
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001398static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1399{
1400 struct sock *sk = chan->data;
1401 struct sock *parent;
1402
1403 lock_sock(sk);
1404
1405 parent = bt_sk(sk)->parent;
1406
1407 BT_DBG("sk %p, parent %p", sk, parent);
1408
1409 sk->sk_state = BT_CONNECTED;
1410 sk->sk_state_change(sk);
1411
1412 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001413 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001414
1415 release_sock(sk);
1416}
1417
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001418static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1419{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001420 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001421
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001422 lock_sock(sk);
1423
1424 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001425 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001426 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001427
1428 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001429}
1430
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001431static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1432{
1433 struct sock *sk = chan->data;
1434
Johan Hedbergd52deb12014-08-07 22:56:44 +03001435 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1436 sk->sk_state = BT_CONNECTED;
1437 chan->state = BT_CONNECTED;
1438 }
1439
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001440 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1441 sk->sk_state_change(sk);
1442}
1443
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001444static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1445{
1446 struct sock *sk = chan->data;
1447
1448 lock_sock(sk);
1449 sk->sk_shutdown = SHUTDOWN_MASK;
1450 release_sock(sk);
1451}
1452
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001453static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1454{
1455 struct sock *sk = chan->data;
1456
1457 return sk->sk_sndtimeo;
1458}
1459
Johan Hedberg837776f2013-10-15 11:03:18 +03001460static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1461{
1462 struct sock *sk = chan->data;
1463
1464 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1465 sk->sk_state_change(sk);
1466}
1467
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001468static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001469 .name = "L2CAP Socket Interface",
1470 .new_connection = l2cap_sock_new_connection_cb,
1471 .recv = l2cap_sock_recv_cb,
1472 .close = l2cap_sock_close_cb,
1473 .teardown = l2cap_sock_teardown_cb,
1474 .state_change = l2cap_sock_state_change_cb,
1475 .ready = l2cap_sock_ready_cb,
1476 .defer = l2cap_sock_defer_cb,
1477 .resume = l2cap_sock_resume_cb,
1478 .suspend = l2cap_sock_suspend_cb,
1479 .set_shutdown = l2cap_sock_set_shutdown_cb,
1480 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1481 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001482};
1483
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001484static void l2cap_sock_destruct(struct sock *sk)
1485{
1486 BT_DBG("sk %p", sk);
1487
Sasha Levin23d3a862012-10-08 16:48:32 -04001488 if (l2cap_pi(sk)->chan)
1489 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001490
Mat Martineaue3281402011-07-07 09:39:02 -07001491 if (l2cap_pi(sk)->rx_busy_skb) {
1492 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1493 l2cap_pi(sk)->rx_busy_skb = NULL;
1494 }
1495
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001496 skb_queue_purge(&sk->sk_receive_queue);
1497 skb_queue_purge(&sk->sk_write_queue);
1498}
1499
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001500static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1501 int *msg_namelen)
1502{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001503 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001504
1505 memset(la, 0, sizeof(struct sockaddr_l2));
1506 la->l2_family = AF_BLUETOOTH;
Johan Hedberga4368ff2015-03-30 23:21:01 +03001507 la->l2_psm = bt_cb(skb)->l2cap.psm;
1508 bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001509
1510 *msg_namelen = sizeof(struct sockaddr_l2);
1511}
1512
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001513static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001514{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001515 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001516
1517 BT_DBG("sk %p", sk);
1518
1519 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001520 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1521
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001522 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001523 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001524
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001525 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001526 chan->imtu = pchan->imtu;
1527 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001528 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001529 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001530 chan->fcs = pchan->fcs;
1531 chan->max_tx = pchan->max_tx;
1532 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001533 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001534 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001535 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001536 chan->tx_credits = pchan->tx_credits;
1537 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001538
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001539 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1540 chan->scid = pchan->scid;
1541 chan->dcid = pchan->scid;
1542 }
1543
Paul Moore6230c9b2011-10-07 09:40:59 +00001544 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001545 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001546 switch (sk->sk_type) {
1547 case SOCK_RAW:
1548 chan->chan_type = L2CAP_CHAN_RAW;
1549 break;
1550 case SOCK_DGRAM:
1551 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001552 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001553 break;
1554 case SOCK_SEQPACKET:
1555 case SOCK_STREAM:
1556 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1557 break;
1558 }
1559
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001560 chan->imtu = L2CAP_DEFAULT_MTU;
1561 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001562 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001563 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001564 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001565 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001566 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001567 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001568
1569 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001570 }
1571
1572 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001573 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001574
1575 chan->data = sk;
1576 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001577}
1578
1579static struct proto l2cap_proto = {
1580 .name = "L2CAP",
1581 .owner = THIS_MODULE,
1582 .obj_size = sizeof(struct l2cap_pinfo)
1583};
1584
Gustavo Padovan2d792812012-10-06 10:07:01 +01001585static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001586 int proto, gfp_t prio, int kern)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001587{
1588 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001589 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001590
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001591 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001592 if (!sk)
1593 return NULL;
1594
1595 sock_init_data(sock, sk);
1596 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1597
1598 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001599 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001600
1601 sock_reset_flag(sk, SOCK_ZAPPED);
1602
1603 sk->sk_protocol = proto;
1604 sk->sk_state = BT_OPEN;
1605
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001606 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001607 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301608 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001609 return NULL;
1610 }
1611
Mat Martineau61d6ef32012-04-27 16:50:50 -07001612 l2cap_chan_hold(chan);
1613
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001614 l2cap_pi(sk)->chan = chan;
1615
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001616 return sk;
1617}
1618
1619static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1620 int kern)
1621{
1622 struct sock *sk;
1623
1624 BT_DBG("sock %p", sock);
1625
1626 sock->state = SS_UNCONNECTED;
1627
1628 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001629 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001630 return -ESOCKTNOSUPPORT;
1631
1632 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1633 return -EPERM;
1634
1635 sock->ops = &l2cap_sock_ops;
1636
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001637 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001638 if (!sk)
1639 return -ENOMEM;
1640
1641 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001642 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001643 return 0;
1644}
1645
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001646static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001647 .family = PF_BLUETOOTH,
1648 .owner = THIS_MODULE,
1649 .release = l2cap_sock_release,
1650 .bind = l2cap_sock_bind,
1651 .connect = l2cap_sock_connect,
1652 .listen = l2cap_sock_listen,
1653 .accept = l2cap_sock_accept,
1654 .getname = l2cap_sock_getname,
1655 .sendmsg = l2cap_sock_sendmsg,
1656 .recvmsg = l2cap_sock_recvmsg,
1657 .poll = bt_sock_poll,
1658 .ioctl = bt_sock_ioctl,
1659 .mmap = sock_no_mmap,
1660 .socketpair = sock_no_socketpair,
1661 .shutdown = l2cap_sock_shutdown,
1662 .setsockopt = l2cap_sock_setsockopt,
1663 .getsockopt = l2cap_sock_getsockopt
1664};
1665
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001666static const struct net_proto_family l2cap_sock_family_ops = {
1667 .family = PF_BLUETOOTH,
1668 .owner = THIS_MODULE,
1669 .create = l2cap_sock_create,
1670};
1671
1672int __init l2cap_init_sockets(void)
1673{
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001674 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001675
Marcel Holtmanndd625552015-01-11 15:18:19 -08001676 BUILD_BUG_ON(sizeof(struct sockaddr_l2) > sizeof(struct sockaddr));
1677
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001678 err = proto_register(&l2cap_proto, 0);
1679 if (err < 0)
1680 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001681
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001682 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001683 if (err < 0) {
1684 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001685 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001686 }
1687
Al Virob0316612013-04-04 19:14:33 -04001688 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001689 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001690 if (err < 0) {
1691 BT_ERR("Failed to create L2CAP proc file");
1692 bt_sock_unregister(BTPROTO_L2CAP);
1693 goto error;
1694 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001695
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001696 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001697
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001698 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001699
1700error:
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001701 proto_unregister(&l2cap_proto);
1702 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001703}
1704
1705void l2cap_cleanup_sockets(void)
1706{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001707 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001708 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001709 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001710}