blob: 507b80d59dec4fd3b0eb3c50ed1cd95a78adfcb7 [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
90 if (!addr || addr->sa_family != AF_BLUETOOTH)
91 return -EINVAL;
92
93 memset(&la, 0, sizeof(la));
94 len = min_t(unsigned int, sizeof(la), alen);
95 memcpy(&la, addr, len);
96
Ville Tervob62f3282011-02-10 22:38:50 -030097 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020098 return -EINVAL;
99
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300100 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
101 return -EINVAL;
102
Johan Hedbergbfe46552013-10-16 17:13:26 +0300103 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300104 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200105 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700106 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300107 return -EINVAL;
108 }
109
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200110 lock_sock(sk);
111
112 if (sk->sk_state != BT_OPEN) {
113 err = -EBADFD;
114 goto done;
115 }
116
117 if (la.l2_psm) {
118 __u16 psm = __le16_to_cpu(la.l2_psm);
119
Johan Hedberg49460962013-10-08 13:55:46 +0200120 if (la.l2_bdaddr_type == BDADDR_BREDR)
121 err = l2cap_validate_bredr_psm(psm);
122 else
123 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200124
Johan Hedberg49460962013-10-08 13:55:46 +0200125 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200126 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200127 }
128
Johan Hedberga2342c52016-01-26 17:19:11 -0500129 bacpy(&chan->src, &la.l2_bdaddr);
130 chan->src_type = la.l2_bdaddr_type;
131
Ville Tervob62f3282011-02-10 22:38:50 -0300132 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530133 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300134 else
135 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300136
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300137 if (err < 0)
138 goto done;
139
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700140 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700141 case L2CAP_CHAN_CONN_LESS:
142 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
143 chan->sec_level = BT_SECURITY_SDP;
144 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700145 case L2CAP_CHAN_CONN_ORIENTED:
146 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
147 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
148 chan->sec_level = BT_SECURITY_SDP;
149 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200150 case L2CAP_CHAN_RAW:
151 chan->sec_level = BT_SECURITY_SDP;
152 break;
Johan Hedbergc16900c2014-08-15 21:17:06 +0300153 case L2CAP_CHAN_FIXED:
154 /* Fixed channels default to the L2CAP core not holding a
155 * hci_conn reference for them. For fixed channels mapping to
156 * L2CAP sockets we do want to hold a reference so set the
157 * appropriate flag to request it.
158 */
159 set_bit(FLAG_HOLD_HCI_CONN, &chan->flags);
160 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700161 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300162
Johan Hedberg38319712013-05-17 12:49:23 +0300163 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200164 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300165
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300166 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200168
169done:
170 release_sock(sk);
171 return err;
172}
173
Gustavo Padovan2d792812012-10-06 10:07:01 +0100174static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
175 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200176{
177 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300178 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200179 struct sockaddr_l2 la;
180 int len, err = 0;
181
182 BT_DBG("sk %p", sk);
183
184 if (!addr || alen < sizeof(addr->sa_family) ||
185 addr->sa_family != AF_BLUETOOTH)
186 return -EINVAL;
187
188 memset(&la, 0, sizeof(la));
189 len = min_t(unsigned int, sizeof(la), alen);
190 memcpy(&la, addr, len);
191
Ville Tervoacd7d372011-02-10 22:38:49 -0300192 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200193 return -EINVAL;
194
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300195 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
196 return -EINVAL;
197
Johan Hedbergeb622492013-10-18 11:49:25 +0300198 /* Check that the socket wasn't bound to something that
199 * conflicts with the address given to connect(). If chan->src
200 * is BDADDR_ANY it means bind() was never used, in which case
201 * chan->src_type and la.l2_bdaddr_type do not need to match.
202 */
203 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
204 bdaddr_type_is_le(la.l2_bdaddr_type)) {
205 /* Old user space versions will try to incorrectly bind
206 * the ATT socket using BDADDR_BREDR. We need to accept
207 * this and fix up the source address type only when
208 * both the source CID and destination CID indicate
209 * ATT. Anything else is an invalid combination.
210 */
211 if (chan->scid != L2CAP_CID_ATT ||
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700212 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergeb622492013-10-18 11:49:25 +0300213 return -EINVAL;
214
215 /* We don't have the hdev available here to make a
216 * better decision on random vs public, but since all
217 * user space versions that exhibit this issue anyway do
218 * not support random local addresses assuming public
219 * here is good enough.
220 */
221 chan->src_type = BDADDR_LE_PUBLIC;
222 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300223
224 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
225 return -EINVAL;
226
Johan Hedbergbfe46552013-10-16 17:13:26 +0300227 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300228 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200229 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700230 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300231 return -EINVAL;
232 }
233
Johan Hedberg38319712013-05-17 12:49:23 +0300234 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200235 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300236
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530237 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300238 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200239 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200240 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200241
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200242 lock_sock(sk);
243
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200244 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100245 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200246
247 release_sock(sk);
248
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200249 return err;
250}
251
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200252static int l2cap_sock_listen(struct socket *sock, int backlog)
253{
254 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300255 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200256 int err = 0;
257
258 BT_DBG("sk %p backlog %d", sk, backlog);
259
260 lock_sock(sk);
261
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200262 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200263 err = -EBADFD;
264 goto done;
265 }
266
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200267 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
268 err = -EINVAL;
269 goto done;
270 }
271
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300272 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200273 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300274 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200275 break;
276 case L2CAP_MODE_ERTM:
277 case L2CAP_MODE_STREAMING:
278 if (!disable_ertm)
279 break;
280 /* fall through */
281 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300282 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200283 goto done;
284 }
285
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200286 sk->sk_max_ack_backlog = backlog;
287 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300288
Johan Hedbergabe84902014-11-12 22:22:21 +0200289 /* Listening channels need to use nested locking in order not to
290 * cause lockdep warnings when the created child channels end up
291 * being locked in the same thread as the parent channel.
292 */
293 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
294
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300295 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200296 sk->sk_state = BT_LISTEN;
297
298done:
299 release_sock(sk);
300 return err;
301}
302
Gustavo Padovan2d792812012-10-06 10:07:01 +0100303static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
David Howellscdfbabf2017-03-09 08:09:05 +0000304 int flags, bool kern)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200305{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500306 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200307 struct sock *sk = sock->sk, *nsk;
308 long timeo;
309 int err = 0;
310
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200311 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200312
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200313 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
314
315 BT_DBG("sk %p timeo %ld", sk, timeo);
316
317 /* Wait for an incoming connection. (wake-one). */
318 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400319 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200320 if (sk->sk_state != BT_LISTEN) {
321 err = -EBADFD;
322 break;
323 }
324
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400325 nsk = bt_accept_dequeue(sk, newsock);
326 if (nsk)
327 break;
328
329 if (!timeo) {
330 err = -EAGAIN;
331 break;
332 }
333
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200334 if (signal_pending(current)) {
335 err = sock_intr_errno(timeo);
336 break;
337 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400338
339 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500340
341 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
342
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200343 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200344 }
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 ||
Patrik Flykta164cee2016-03-24 16:04:15 +0200782 sec.level > BT_SECURITY_FIPS) {
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
Amadeusz Sławiński23bc6ab2016-07-14 10:50:23 +0200931 if (get_user(opt, (u16 __user *) optval)) {
Johan Hedberg1f435422013-12-02 16:34:18 +0200932 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
Ying Xue1b784142015-03-02 15:37:48 +0800948static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg,
949 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
Ying Xue1b784142015-03-02 15:37:48 +0800980static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,
981 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)
Ying Xue1b784142015-03-02 15:37:48 +08001008 err = bt_sock_stream_recvmsg(sock, msg, len, flags);
Mat Martineaue3281402011-07-07 09:39:02 -07001009 else
Ying Xue1b784142015-03-02 15:37:48 +08001010 err = bt_sock_recvmsg(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) {
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001023 if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))
Mat Martineaue3281402011-07-07 09:39:02 -07001024 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
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001058static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
Gustavo Padovandc253062013-10-15 19:24:49 -03001059{
Gustavo Padovandc253062013-10-15 19:24:49 -03001060 DECLARE_WAITQUEUE(wait, current);
1061 int err = 0;
Dean Jenkinscb02a252015-06-23 17:59:38 +01001062 int timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Dean Jenkinse432c722015-06-23 17:59:39 +01001063 /* Timeout to prevent infinite loop */
1064 unsigned long timeout = jiffies + L2CAP_WAIT_ACK_TIMEOUT;
Gustavo Padovandc253062013-10-15 19:24:49 -03001065
1066 add_wait_queue(sk_sleep(sk), &wait);
1067 set_current_state(TASK_INTERRUPTIBLE);
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001068 do {
Dean Jenkinse432c722015-06-23 17:59:39 +01001069 BT_DBG("Waiting for %d ACKs, timeout %04d ms",
1070 chan->unacked_frames, time_after(jiffies, timeout) ? 0 :
1071 jiffies_to_msecs(timeout - jiffies));
Dean Jenkins451e4c62015-06-23 17:59:37 +01001072
Gustavo Padovandc253062013-10-15 19:24:49 -03001073 if (!timeo)
Dean Jenkinscb02a252015-06-23 17:59:38 +01001074 timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Gustavo Padovandc253062013-10-15 19:24:49 -03001075
1076 if (signal_pending(current)) {
1077 err = sock_intr_errno(timeo);
1078 break;
1079 }
1080
1081 release_sock(sk);
1082 timeo = schedule_timeout(timeo);
1083 lock_sock(sk);
1084 set_current_state(TASK_INTERRUPTIBLE);
1085
1086 err = sock_error(sk);
1087 if (err)
1088 break;
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001089
Dean Jenkinse432c722015-06-23 17:59:39 +01001090 if (time_after(jiffies, timeout)) {
1091 err = -ENOLINK;
1092 break;
1093 }
1094
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001095 } while (chan->unacked_frames > 0 &&
1096 chan->state == BT_CONNECTED);
1097
Gustavo Padovandc253062013-10-15 19:24:49 -03001098 set_current_state(TASK_RUNNING);
1099 remove_wait_queue(sk_sleep(sk), &wait);
1100 return err;
1101}
1102
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001103static int l2cap_sock_shutdown(struct socket *sock, int how)
1104{
1105 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001106 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001107 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001108 int err = 0;
1109
1110 BT_DBG("sock %p, sk %p", sock, sk);
1111
1112 if (!sk)
1113 return 0;
1114
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001115 lock_sock(sk);
1116
Dean Jenkinse7456432015-10-14 12:18:45 +02001117 if (sk->sk_shutdown)
1118 goto shutdown_already;
1119
1120 BT_DBG("Handling sock shutdown");
1121
Dean Jenkins2baea852015-06-23 17:59:32 +01001122 /* prevent sk structure from being freed whilst unlocked */
1123 sock_hold(sk);
1124
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001125 chan = l2cap_pi(sk)->chan;
Dean Jenkins2baea852015-06-23 17:59:32 +01001126 /* prevent chan structure from being freed whilst unlocked */
1127 l2cap_chan_hold(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001128
Johan Hedberg49d11742014-11-13 14:37:50 +02001129 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1130
Dean Jenkinse7456432015-10-14 12:18:45 +02001131 if (chan->mode == L2CAP_MODE_ERTM &&
1132 chan->unacked_frames > 0 &&
Dean Jenkins9f7378a2015-10-14 12:18:47 +02001133 chan->state == BT_CONNECTED) {
Dean Jenkinse7456432015-10-14 12:18:45 +02001134 err = __l2cap_wait_ack(sk, chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001135
Dean Jenkins9f7378a2015-10-14 12:18:47 +02001136 /* After waiting for ACKs, check whether shutdown
1137 * has already been actioned to close the L2CAP
1138 * link such as by l2cap_disconnection_req().
1139 */
1140 if (sk->sk_shutdown)
1141 goto has_shutdown;
1142 }
1143
Dean Jenkinse7456432015-10-14 12:18:45 +02001144 sk->sk_shutdown = SHUTDOWN_MASK;
Dean Jenkinse7456432015-10-14 12:18:45 +02001145 release_sock(sk);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001146
1147 l2cap_chan_lock(chan);
1148 conn = chan->conn;
1149 if (conn)
1150 /* prevent conn structure from being freed */
1151 l2cap_conn_get(conn);
1152 l2cap_chan_unlock(chan);
1153
1154 if (conn)
1155 /* mutex lock must be taken before l2cap_chan_lock() */
1156 mutex_lock(&conn->chan_lock);
1157
1158 l2cap_chan_lock(chan);
Dean Jenkinse7456432015-10-14 12:18:45 +02001159 l2cap_chan_close(chan, 0);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001160 l2cap_chan_unlock(chan);
1161
1162 if (conn) {
1163 mutex_unlock(&conn->chan_lock);
1164 l2cap_conn_put(conn);
1165 }
1166
Dean Jenkinse7456432015-10-14 12:18:45 +02001167 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001168
Dean Jenkinse7456432015-10-14 12:18:45 +02001169 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1170 !(current->flags & PF_EXITING))
1171 err = bt_sock_wait_state(sk, BT_CLOSED,
1172 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001173
Dean Jenkins9f7378a2015-10-14 12:18:47 +02001174has_shutdown:
Dean Jenkins2baea852015-06-23 17:59:32 +01001175 l2cap_chan_put(chan);
1176 sock_put(sk);
1177
Dean Jenkinse7456432015-10-14 12:18:45 +02001178shutdown_already:
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001179 if (!err && sk->sk_err)
1180 err = -sk->sk_err;
1181
1182 release_sock(sk);
1183
1184 BT_DBG("Sock shutdown complete err: %d", err);
Dean Jenkins451e4c62015-06-23 17:59:37 +01001185
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001186 return err;
1187}
1188
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001189static int l2cap_sock_release(struct socket *sock)
1190{
1191 struct sock *sk = sock->sk;
1192 int err;
1193
1194 BT_DBG("sock %p, sk %p", sock, sk);
1195
1196 if (!sk)
1197 return 0;
1198
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001199 bt_sock_unlink(&l2cap_sk_list, sk);
1200
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001201 err = l2cap_sock_shutdown(sock, 2);
1202
1203 sock_orphan(sk);
1204 l2cap_sock_kill(sk);
1205 return err;
1206}
1207
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001208static void l2cap_sock_cleanup_listen(struct sock *parent)
1209{
1210 struct sock *sk;
1211
Johan Hedberg49d11742014-11-13 14:37:50 +02001212 BT_DBG("parent %p state %s", parent,
1213 state_to_string(parent->sk_state));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001214
1215 /* Close not yet accepted channels */
1216 while ((sk = bt_accept_dequeue(parent, NULL))) {
1217 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1218
Johan Hedberg49d11742014-11-13 14:37:50 +02001219 BT_DBG("child chan %p state %s", chan,
1220 state_to_string(chan->state));
1221
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001222 l2cap_chan_lock(chan);
1223 __clear_chan_timer(chan);
1224 l2cap_chan_close(chan, ECONNRESET);
1225 l2cap_chan_unlock(chan);
1226
1227 l2cap_sock_kill(sk);
1228 }
1229}
1230
Gustavo Padovan80b98022012-05-27 22:27:51 -03001231static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001232{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001233 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001234
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001235 lock_sock(parent);
1236
Gustavo Padovan53826692012-05-27 22:27:55 -03001237 /* Check for backlog size */
1238 if (sk_acceptq_is_full(parent)) {
1239 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001240 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001241 return NULL;
1242 }
1243
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001244 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001245 GFP_ATOMIC, 0);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001246 if (!sk) {
1247 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001248 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001249 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001250
Octavian Purdilad22015a2012-01-22 00:28:34 +02001251 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1252
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001253 l2cap_sock_init(sk, parent);
1254
Gustavo Padovan644912e2012-10-12 19:35:23 +08001255 bt_accept_enqueue(parent, sk);
1256
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001257 release_sock(parent);
1258
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001259 return l2cap_pi(sk)->chan;
1260}
1261
Gustavo Padovan80b98022012-05-27 22:27:51 -03001262static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001263{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001264 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001265 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001266
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001267 lock_sock(sk);
1268
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001269 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001270 err = -ENOMEM;
1271 goto done;
1272 }
Mat Martineaue3281402011-07-07 09:39:02 -07001273
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001274 if (chan->mode != L2CAP_MODE_ERTM &&
1275 chan->mode != L2CAP_MODE_STREAMING) {
1276 /* Even if no filter is attached, we could potentially
1277 * get errors from security modules, etc.
1278 */
1279 err = sk_filter(sk, skb);
1280 if (err)
1281 goto done;
1282 }
1283
1284 err = __sock_queue_rcv_skb(sk, skb);
Mat Martineaue3281402011-07-07 09:39:02 -07001285
1286 /* For ERTM, handle one skb that doesn't fit into the recv
1287 * buffer. This is important to do because the data frames
1288 * have already been acked, so the skb cannot be discarded.
1289 *
1290 * Notify the l2cap core that the buffer is full, so the
1291 * LOCAL_BUSY state is entered and no more frames are
1292 * acked and reassembled until there is buffer space
1293 * available.
1294 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001295 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1296 l2cap_pi(sk)->rx_busy_skb = skb;
1297 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001298 err = 0;
1299 }
1300
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001301done:
1302 release_sock(sk);
1303
Mat Martineaue3281402011-07-07 09:39:02 -07001304 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001305}
1306
Gustavo Padovan80b98022012-05-27 22:27:51 -03001307static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001308{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001309 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001310
1311 l2cap_sock_kill(sk);
1312}
1313
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001314static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1315{
1316 struct sock *sk = chan->data;
1317 struct sock *parent;
1318
Johan Hedberg49d11742014-11-13 14:37:50 +02001319 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1320
Johan Hedberg3b2ab392014-11-12 22:22:22 +02001321 /* This callback can be called both for server (BT_LISTEN)
1322 * sockets as well as "normal" ones. To avoid lockdep warnings
1323 * with child socket locking (through l2cap_sock_cleanup_listen)
1324 * we need separation into separate nesting levels. The simplest
1325 * way to accomplish this is to inherit the nesting level used
1326 * for the channel.
1327 */
1328 lock_sock_nested(sk, atomic_read(&chan->nesting));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001329
1330 parent = bt_sk(sk)->parent;
1331
1332 sock_set_flag(sk, SOCK_ZAPPED);
1333
1334 switch (chan->state) {
1335 case BT_OPEN:
1336 case BT_BOUND:
1337 case BT_CLOSED:
1338 break;
1339 case BT_LISTEN:
1340 l2cap_sock_cleanup_listen(sk);
1341 sk->sk_state = BT_CLOSED;
1342 chan->state = BT_CLOSED;
1343
1344 break;
1345 default:
1346 sk->sk_state = BT_CLOSED;
1347 chan->state = BT_CLOSED;
1348
1349 sk->sk_err = err;
1350
1351 if (parent) {
1352 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001353 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001354 } else {
1355 sk->sk_state_change(sk);
1356 }
1357
1358 break;
1359 }
1360
1361 release_sock(sk);
1362}
1363
Gustavo Padovan53f52122013-10-15 19:24:45 -03001364static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1365 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001366{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001367 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001368
1369 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001370
1371 if (err)
1372 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001373}
1374
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001375static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001376 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001377 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001378{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001379 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001380 struct sk_buff *skb;
1381 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001382
Mat Martineaua6a55682012-05-04 14:20:31 -07001383 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001384 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001385 l2cap_chan_lock(chan);
1386
Gustavo Padovan90338942012-04-06 20:15:47 -03001387 if (!skb)
1388 return ERR_PTR(err);
1389
Marcel Holtmann8d463212014-06-05 15:22:51 +02001390 skb->priority = sk->sk_priority;
1391
Johan Hedberga4368ff2015-03-30 23:21:01 +03001392 bt_cb(skb)->l2cap.chan = chan;
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001393
Gustavo Padovan90338942012-04-06 20:15:47 -03001394 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001395}
1396
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001397static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1398{
1399 struct sock *sk = chan->data;
1400 struct sock *parent;
1401
1402 lock_sock(sk);
1403
1404 parent = bt_sk(sk)->parent;
1405
1406 BT_DBG("sk %p, parent %p", sk, parent);
1407
1408 sk->sk_state = BT_CONNECTED;
1409 sk->sk_state_change(sk);
1410
1411 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001412 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001413
1414 release_sock(sk);
1415}
1416
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001417static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1418{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001419 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001420
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001421 lock_sock(sk);
1422
1423 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001424 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001425 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001426
1427 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001428}
1429
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001430static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1431{
1432 struct sock *sk = chan->data;
1433
Johan Hedbergd52deb12014-08-07 22:56:44 +03001434 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1435 sk->sk_state = BT_CONNECTED;
1436 chan->state = BT_CONNECTED;
1437 }
1438
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001439 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1440 sk->sk_state_change(sk);
1441}
1442
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001443static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1444{
1445 struct sock *sk = chan->data;
1446
1447 lock_sock(sk);
1448 sk->sk_shutdown = SHUTDOWN_MASK;
1449 release_sock(sk);
1450}
1451
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001452static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1453{
1454 struct sock *sk = chan->data;
1455
1456 return sk->sk_sndtimeo;
1457}
1458
Johan Hedberg837776f2013-10-15 11:03:18 +03001459static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1460{
1461 struct sock *sk = chan->data;
1462
1463 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1464 sk->sk_state_change(sk);
1465}
1466
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001467static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001468 .name = "L2CAP Socket Interface",
1469 .new_connection = l2cap_sock_new_connection_cb,
1470 .recv = l2cap_sock_recv_cb,
1471 .close = l2cap_sock_close_cb,
1472 .teardown = l2cap_sock_teardown_cb,
1473 .state_change = l2cap_sock_state_change_cb,
1474 .ready = l2cap_sock_ready_cb,
1475 .defer = l2cap_sock_defer_cb,
1476 .resume = l2cap_sock_resume_cb,
1477 .suspend = l2cap_sock_suspend_cb,
1478 .set_shutdown = l2cap_sock_set_shutdown_cb,
1479 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1480 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001481};
1482
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001483static void l2cap_sock_destruct(struct sock *sk)
1484{
1485 BT_DBG("sk %p", sk);
1486
Sasha Levin23d3a862012-10-08 16:48:32 -04001487 if (l2cap_pi(sk)->chan)
1488 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001489
Mat Martineaue3281402011-07-07 09:39:02 -07001490 if (l2cap_pi(sk)->rx_busy_skb) {
1491 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1492 l2cap_pi(sk)->rx_busy_skb = NULL;
1493 }
1494
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001495 skb_queue_purge(&sk->sk_receive_queue);
1496 skb_queue_purge(&sk->sk_write_queue);
1497}
1498
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001499static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1500 int *msg_namelen)
1501{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001502 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001503
1504 memset(la, 0, sizeof(struct sockaddr_l2));
1505 la->l2_family = AF_BLUETOOTH;
Johan Hedberga4368ff2015-03-30 23:21:01 +03001506 la->l2_psm = bt_cb(skb)->l2cap.psm;
1507 bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001508
1509 *msg_namelen = sizeof(struct sockaddr_l2);
1510}
1511
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001512static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001513{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001514 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001515
1516 BT_DBG("sk %p", sk);
1517
1518 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001519 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1520
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001521 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001522 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001523
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001524 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001525 chan->imtu = pchan->imtu;
1526 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001527 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001528 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001529 chan->fcs = pchan->fcs;
1530 chan->max_tx = pchan->max_tx;
1531 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001532 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001533 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001534 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001535 chan->tx_credits = pchan->tx_credits;
1536 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001537
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001538 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1539 chan->scid = pchan->scid;
1540 chan->dcid = pchan->scid;
1541 }
1542
Paul Moore6230c9b2011-10-07 09:40:59 +00001543 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001544 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001545 switch (sk->sk_type) {
1546 case SOCK_RAW:
1547 chan->chan_type = L2CAP_CHAN_RAW;
1548 break;
1549 case SOCK_DGRAM:
1550 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001551 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001552 break;
1553 case SOCK_SEQPACKET:
1554 case SOCK_STREAM:
1555 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1556 break;
1557 }
1558
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001559 chan->imtu = L2CAP_DEFAULT_MTU;
1560 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001561 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001562 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001563 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001564 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001565 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001566 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001567
1568 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001569 }
1570
1571 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001572 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001573
1574 chan->data = sk;
1575 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001576}
1577
1578static struct proto l2cap_proto = {
1579 .name = "L2CAP",
1580 .owner = THIS_MODULE,
1581 .obj_size = sizeof(struct l2cap_pinfo)
1582};
1583
Gustavo Padovan2d792812012-10-06 10:07:01 +01001584static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001585 int proto, gfp_t prio, int kern)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001586{
1587 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001588 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001589
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001590 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001591 if (!sk)
1592 return NULL;
1593
1594 sock_init_data(sock, sk);
1595 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1596
1597 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001598 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001599
1600 sock_reset_flag(sk, SOCK_ZAPPED);
1601
1602 sk->sk_protocol = proto;
1603 sk->sk_state = BT_OPEN;
1604
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001605 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001606 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301607 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001608 return NULL;
1609 }
1610
Mat Martineau61d6ef32012-04-27 16:50:50 -07001611 l2cap_chan_hold(chan);
1612
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001613 l2cap_pi(sk)->chan = chan;
1614
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001615 return sk;
1616}
1617
1618static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1619 int kern)
1620{
1621 struct sock *sk;
1622
1623 BT_DBG("sock %p", sock);
1624
1625 sock->state = SS_UNCONNECTED;
1626
1627 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001628 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001629 return -ESOCKTNOSUPPORT;
1630
1631 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1632 return -EPERM;
1633
1634 sock->ops = &l2cap_sock_ops;
1635
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001636 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001637 if (!sk)
1638 return -ENOMEM;
1639
1640 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001641 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001642 return 0;
1643}
1644
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001645static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001646 .family = PF_BLUETOOTH,
1647 .owner = THIS_MODULE,
1648 .release = l2cap_sock_release,
1649 .bind = l2cap_sock_bind,
1650 .connect = l2cap_sock_connect,
1651 .listen = l2cap_sock_listen,
1652 .accept = l2cap_sock_accept,
1653 .getname = l2cap_sock_getname,
1654 .sendmsg = l2cap_sock_sendmsg,
1655 .recvmsg = l2cap_sock_recvmsg,
1656 .poll = bt_sock_poll,
1657 .ioctl = bt_sock_ioctl,
1658 .mmap = sock_no_mmap,
1659 .socketpair = sock_no_socketpair,
1660 .shutdown = l2cap_sock_shutdown,
1661 .setsockopt = l2cap_sock_setsockopt,
1662 .getsockopt = l2cap_sock_getsockopt
1663};
1664
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001665static const struct net_proto_family l2cap_sock_family_ops = {
1666 .family = PF_BLUETOOTH,
1667 .owner = THIS_MODULE,
1668 .create = l2cap_sock_create,
1669};
1670
1671int __init l2cap_init_sockets(void)
1672{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001673 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001674
Marcel Holtmanndd625552015-01-11 15:18:19 -08001675 BUILD_BUG_ON(sizeof(struct sockaddr_l2) > sizeof(struct sockaddr));
1676
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001677 err = proto_register(&l2cap_proto, 0);
1678 if (err < 0)
1679 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001680
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001681 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001682 if (err < 0) {
1683 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001684 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001685 }
1686
Al Virob0316612013-04-04 19:14:33 -04001687 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001688 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001689 if (err < 0) {
1690 BT_ERR("Failed to create L2CAP proc file");
1691 bt_sock_unregister(BTPROTO_L2CAP);
1692 goto error;
1693 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001694
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001695 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001696
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001697 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001698
1699error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001700 proto_unregister(&l2cap_proto);
1701 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001702}
1703
1704void l2cap_cleanup_sockets(void)
1705{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001706 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001707 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001708 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001709}