blob: e1a3e66b17540211a48a925ac820ab8c89648734 [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
Luiz Augusto von Dentz15f02b92020-03-02 16:56:20 -0800235 if (chan->psm && bdaddr_type_is_le(chan->src_type) && !chan->mode)
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:
Luiz Augusto von Dentz4be5ca62020-03-02 16:56:21 -0800276 break;
Luiz Augusto von Dentz15f02b92020-03-02 16:56:20 -0800277 case L2CAP_MODE_EXT_FLOWCTL:
Luiz Augusto von Dentz4be5ca62020-03-02 16:56:21 -0800278 if (!enable_ecred) {
279 err = -EOPNOTSUPP;
280 goto done;
281 }
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200282 break;
283 case L2CAP_MODE_ERTM:
284 case L2CAP_MODE_STREAMING:
285 if (!disable_ertm)
286 break;
Gustavo A. R. Silva19186c72020-07-08 15:18:23 -0500287 fallthrough;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200288 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300289 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200290 goto done;
291 }
292
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200293 sk->sk_max_ack_backlog = backlog;
294 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300295
Johan Hedbergabe84902014-11-12 22:22:21 +0200296 /* Listening channels need to use nested locking in order not to
297 * cause lockdep warnings when the created child channels end up
298 * being locked in the same thread as the parent channel.
299 */
300 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
301
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300302 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200303 sk->sk_state = BT_LISTEN;
304
305done:
306 release_sock(sk);
307 return err;
308}
309
Gustavo Padovan2d792812012-10-06 10:07:01 +0100310static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
David Howellscdfbabf2017-03-09 08:09:05 +0000311 int flags, bool kern)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200312{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500313 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200314 struct sock *sk = sock->sk, *nsk;
315 long timeo;
316 int err = 0;
317
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200318 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200319
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200320 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
321
322 BT_DBG("sk %p timeo %ld", sk, timeo);
323
324 /* Wait for an incoming connection. (wake-one). */
325 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400326 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200327 if (sk->sk_state != BT_LISTEN) {
328 err = -EBADFD;
329 break;
330 }
331
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400332 nsk = bt_accept_dequeue(sk, newsock);
333 if (nsk)
334 break;
335
336 if (!timeo) {
337 err = -EAGAIN;
338 break;
339 }
340
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200341 if (signal_pending(current)) {
342 err = sock_intr_errno(timeo);
343 break;
344 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400345
346 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500347
348 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
349
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200350 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200351 }
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200352 remove_wait_queue(sk_sleep(sk), &wait);
353
354 if (err)
355 goto done;
356
357 newsock->state = SS_CONNECTED;
358
359 BT_DBG("new socket %p", nsk);
360
361done:
362 release_sock(sk);
363 return err;
364}
365
Gustavo Padovan2d792812012-10-06 10:07:01 +0100366static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100367 int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200368{
369 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
370 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300371 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200372
373 BT_DBG("sock %p, sk %p", sock, sk);
374
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200375 if (peer && sk->sk_state != BT_CONNECTED &&
Johan Hedbergbf19d512014-07-01 12:07:23 +0300376 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
377 sk->sk_state != BT_CONFIG)
Johan Hedbergb783fbc2014-01-28 15:16:49 -0800378 return -ENOTCONN;
379
Mathias Krause792039c2012-08-15 11:31:51 +0000380 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200381 addr->sa_family = AF_BLUETOOTH;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200382
Johan Hedbergd7e5e762014-01-28 15:16:51 -0800383 la->l2_psm = chan->psm;
384
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200385 if (peer) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700386 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300387 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700388 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200389 } else {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700390 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300391 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700392 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200393 }
394
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100395 return sizeof(struct sockaddr_l2);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200396}
397
Luiz Augusto von Dentz3ee7b7c2020-03-27 11:32:15 -0700398static int l2cap_get_mode(struct l2cap_chan *chan)
399{
400 switch (chan->mode) {
401 case L2CAP_MODE_BASIC:
402 return BT_MODE_BASIC;
403 case L2CAP_MODE_ERTM:
404 return BT_MODE_ERTM;
405 case L2CAP_MODE_STREAMING:
406 return BT_MODE_STREAMING;
407 case L2CAP_MODE_LE_FLOWCTL:
408 return BT_MODE_LE_FLOWCTL;
409 case L2CAP_MODE_EXT_FLOWCTL:
410 return BT_MODE_EXT_FLOWCTL;
411 }
412
413 return -EINVAL;
414}
415
Gustavo Padovan2d792812012-10-06 10:07:01 +0100416static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
417 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200418{
419 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300420 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200421 struct l2cap_options opts;
422 struct l2cap_conninfo cinfo;
423 int len, err = 0;
424 u32 opt;
425
426 BT_DBG("sk %p", sk);
427
428 if (get_user(len, optlen))
429 return -EFAULT;
430
431 lock_sock(sk);
432
433 switch (optname) {
434 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200435 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
436 * legacy ATT code depends on getsockopt for
437 * L2CAP_OPTIONS we need to let this pass.
438 */
439 if (bdaddr_type_is_le(chan->src_type) &&
440 chan->scid != L2CAP_CID_ATT) {
441 err = -EINVAL;
442 break;
443 }
444
Luiz Augusto von Dentzb86b0b12020-03-27 11:32:14 -0700445 /* Only BR/EDR modes are supported here */
446 switch (chan->mode) {
447 case L2CAP_MODE_BASIC:
448 case L2CAP_MODE_ERTM:
449 case L2CAP_MODE_STREAMING:
450 break;
451 default:
452 err = -EINVAL;
453 break;
454 }
455
456 if (err < 0)
457 break;
458
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300459 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300460 opts.imtu = chan->imtu;
461 opts.omtu = chan->omtu;
462 opts.flush_to = chan->flush_to;
463 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300464 opts.fcs = chan->fcs;
465 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300466 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200467
Luiz Augusto von Dentz15f02b92020-03-02 16:56:20 -0800468 BT_DBG("mode 0x%2.2x", chan->mode);
469
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200470 len = min_t(unsigned int, len, sizeof(opts));
471 if (copy_to_user(optval, (char *) &opts, len))
472 err = -EFAULT;
473
474 break;
475
476 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300477 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200478 case BT_SECURITY_LOW:
479 opt = L2CAP_LM_AUTH;
480 break;
481 case BT_SECURITY_MEDIUM:
482 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
483 break;
484 case BT_SECURITY_HIGH:
485 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100486 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200487 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800488 case BT_SECURITY_FIPS:
489 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
490 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
491 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200492 default:
493 opt = 0;
494 break;
495 }
496
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300497 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200498 opt |= L2CAP_LM_MASTER;
499
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300500 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200501 opt |= L2CAP_LM_RELIABLE;
502
503 if (put_user(opt, (u32 __user *) optval))
504 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800505
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200506 break;
507
508 case L2CAP_CONNINFO:
509 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300510 !(sk->sk_state == BT_CONNECT2 &&
511 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200512 err = -ENOTCONN;
513 break;
514 }
515
Filip Palian8d03e972011-05-12 19:32:46 +0200516 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300517 cinfo.hci_handle = chan->conn->hcon->handle;
518 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200519
520 len = min_t(unsigned int, len, sizeof(cinfo));
521 if (copy_to_user(optval, (char *) &cinfo, len))
522 err = -EFAULT;
523
524 break;
525
526 default:
527 err = -ENOPROTOOPT;
528 break;
529 }
530
531 release_sock(sk);
532 return err;
533}
534
Gustavo Padovan2d792812012-10-06 10:07:01 +0100535static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
536 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200537{
538 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300539 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200540 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700541 struct bt_power pwr;
Luiz Augusto von Dentzeab24042020-02-14 10:08:57 -0800542 u32 phys;
Luiz Augusto von Dentz3ee7b7c2020-03-27 11:32:15 -0700543 int len, mode, err = 0;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200544
545 BT_DBG("sk %p", sk);
546
547 if (level == SOL_L2CAP)
548 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
549
550 if (level != SOL_BLUETOOTH)
551 return -ENOPROTOOPT;
552
553 if (get_user(len, optlen))
554 return -EFAULT;
555
556 lock_sock(sk);
557
558 switch (optname) {
559 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300560 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500561 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100562 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200563 err = -EINVAL;
564 break;
565 }
566
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300567 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300568 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300569 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200570
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300571 if (sk->sk_state == BT_CONNECTED)
572 sec.key_size = chan->conn->hcon->enc_key_size;
573 } else {
574 sec.level = chan->sec_level;
575 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300576
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200577 len = min_t(unsigned int, len, sizeof(sec));
578 if (copy_to_user(optval, (char *) &sec, len))
579 err = -EFAULT;
580
581 break;
582
583 case BT_DEFER_SETUP:
584 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
585 err = -EINVAL;
586 break;
587 }
588
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300589 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
590 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200591 err = -EFAULT;
592
593 break;
594
595 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300596 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100597 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200598 err = -EFAULT;
599
600 break;
601
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700602 case BT_POWER:
603 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100604 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700605 err = -EINVAL;
606 break;
607 }
608
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300609 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700610
611 len = min_t(unsigned int, len, sizeof(pwr));
612 if (copy_to_user(optval, (char *) &pwr, len))
613 err = -EFAULT;
614
615 break;
616
Mat Martineau2ea66482011-11-02 16:18:30 -0700617 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700618 if (put_user(chan->chan_policy, (u32 __user *) optval))
619 err = -EFAULT;
620 break;
621
Johan Hedberg1f435422013-12-02 16:34:18 +0200622 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200623 if (!bdaddr_type_is_le(chan->src_type)) {
624 err = -EINVAL;
625 break;
626 }
627
628 if (sk->sk_state != BT_CONNECTED) {
629 err = -ENOTCONN;
630 break;
631 }
632
633 if (put_user(chan->omtu, (u16 __user *) optval))
634 err = -EFAULT;
635 break;
636
637 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200638 if (!bdaddr_type_is_le(chan->src_type)) {
639 err = -EINVAL;
640 break;
641 }
642
643 if (put_user(chan->imtu, (u16 __user *) optval))
644 err = -EFAULT;
645 break;
646
Luiz Augusto von Dentzeab24042020-02-14 10:08:57 -0800647 case BT_PHY:
Luiz Augusto von Dentza2a8b0b2020-02-18 10:33:20 -0800648 if (sk->sk_state != BT_CONNECTED) {
Luiz Augusto von Dentzeab24042020-02-14 10:08:57 -0800649 err = -ENOTCONN;
650 break;
651 }
652
653 phys = hci_conn_get_phy(chan->conn->hcon);
654
655 if (put_user(phys, (u32 __user *) optval))
656 err = -EFAULT;
657 break;
658
Luiz Augusto von Dentz3ee7b7c2020-03-27 11:32:15 -0700659 case BT_MODE:
660 if (!enable_ecred) {
661 err = -ENOPROTOOPT;
662 break;
663 }
664
665 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
666 err = -EINVAL;
667 break;
668 }
669
670 mode = l2cap_get_mode(chan);
671 if (mode < 0) {
672 err = mode;
673 break;
674 }
675
676 if (put_user(mode, (u8 __user *) optval))
677 err = -EFAULT;
678 break;
679
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200680 default:
681 err = -ENOPROTOOPT;
682 break;
683 }
684
685 release_sock(sk);
686 return err;
687}
688
Andre Guedes682877c2012-05-31 17:01:34 -0300689static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
690{
691 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300692 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300693 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300694 return false;
695 break;
696
697 default:
698 if (mtu < L2CAP_DEFAULT_MIN_MTU)
699 return false;
700 }
701
702 return true;
703}
704
Gustavo Padovan2d792812012-10-06 10:07:01 +0100705static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200706 sockptr_t optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200707{
708 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300709 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200710 struct l2cap_options opts;
711 int len, err = 0;
712 u32 opt;
713
714 BT_DBG("sk %p", sk);
715
716 lock_sock(sk);
717
718 switch (optname) {
719 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200720 if (bdaddr_type_is_le(chan->src_type)) {
721 err = -EINVAL;
722 break;
723 }
724
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200725 if (sk->sk_state == BT_CONNECTED) {
726 err = -EINVAL;
727 break;
728 }
729
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300730 opts.imtu = chan->imtu;
731 opts.omtu = chan->omtu;
732 opts.flush_to = chan->flush_to;
733 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300734 opts.fcs = chan->fcs;
735 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300736 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200737
738 len = min_t(unsigned int, sizeof(opts), optlen);
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200739 if (copy_from_sockptr(&opts, optval, len)) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200740 err = -EFAULT;
741 break;
742 }
743
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300744 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200745 err = -EINVAL;
746 break;
747 }
748
Andre Guedes682877c2012-05-31 17:01:34 -0300749 if (!l2cap_valid_mtu(chan, opts.imtu)) {
750 err = -EINVAL;
751 break;
752 }
753
Luiz Augusto von Dentzb86b0b12020-03-27 11:32:14 -0700754 /* Only BR/EDR modes are supported here */
755 switch (opts.mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200756 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300757 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200758 break;
759 case L2CAP_MODE_ERTM:
760 case L2CAP_MODE_STREAMING:
761 if (!disable_ertm)
762 break;
Gustavo A. R. Silva19186c72020-07-08 15:18:23 -0500763 fallthrough;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200764 default:
765 err = -EINVAL;
766 break;
767 }
768
Luiz Augusto von Dentzb86b0b12020-03-27 11:32:14 -0700769 if (err < 0)
770 break;
771
772 chan->mode = opts.mode;
773
Luiz Augusto von Dentz15f02b92020-03-02 16:56:20 -0800774 BT_DBG("mode 0x%2.2x", chan->mode);
775
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300776 chan->imtu = opts.imtu;
777 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300778 chan->fcs = opts.fcs;
779 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300780 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300781 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200782 break;
783
784 case L2CAP_LM:
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200785 if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200786 err = -EFAULT;
787 break;
788 }
789
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800790 if (opt & L2CAP_LM_FIPS) {
791 err = -EINVAL;
792 break;
793 }
794
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200795 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300796 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200797 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300798 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200799 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300800 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200801
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300802 if (opt & L2CAP_LM_MASTER)
803 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
804 else
805 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300806
807 if (opt & L2CAP_LM_RELIABLE)
808 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
809 else
810 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200811 break;
812
813 default:
814 err = -ENOPROTOOPT;
815 break;
816 }
817
818 release_sock(sk);
819 return err;
820}
821
Luiz Augusto von Dentz3ee7b7c2020-03-27 11:32:15 -0700822static int l2cap_set_mode(struct l2cap_chan *chan, u8 mode)
823{
824 switch (mode) {
825 case BT_MODE_BASIC:
826 if (bdaddr_type_is_le(chan->src_type))
827 return -EINVAL;
828 mode = L2CAP_MODE_BASIC;
829 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
830 break;
831 case BT_MODE_ERTM:
832 if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
833 return -EINVAL;
834 mode = L2CAP_MODE_ERTM;
835 break;
836 case BT_MODE_STREAMING:
837 if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
838 return -EINVAL;
839 mode = L2CAP_MODE_STREAMING;
840 break;
841 case BT_MODE_LE_FLOWCTL:
842 if (!bdaddr_type_is_le(chan->src_type))
843 return -EINVAL;
844 mode = L2CAP_MODE_LE_FLOWCTL;
845 break;
846 case BT_MODE_EXT_FLOWCTL:
847 /* TODO: Add support for ECRED PDUs to BR/EDR */
848 if (!bdaddr_type_is_le(chan->src_type))
849 return -EINVAL;
850 mode = L2CAP_MODE_EXT_FLOWCTL;
851 break;
852 default:
853 return -EINVAL;
854 }
855
856 chan->mode = mode;
857
858 return 0;
859}
860
Gustavo Padovan2d792812012-10-06 10:07:01 +0100861static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200862 sockptr_t optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200863{
864 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300865 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200866 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700867 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300868 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200869 int len, err = 0;
870 u32 opt;
871
872 BT_DBG("sk %p", sk);
873
874 if (level == SOL_L2CAP)
875 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
876
877 if (level != SOL_BLUETOOTH)
878 return -ENOPROTOOPT;
879
880 lock_sock(sk);
881
882 switch (optname) {
883 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300884 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500885 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100886 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200887 err = -EINVAL;
888 break;
889 }
890
891 sec.level = BT_SECURITY_LOW;
892
893 len = min_t(unsigned int, sizeof(sec), optlen);
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200894 if (copy_from_sockptr(&sec, optval, len)) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200895 err = -EFAULT;
896 break;
897 }
898
899 if (sec.level < BT_SECURITY_LOW ||
Patrik Flykta164cee2016-03-24 16:04:15 +0200900 sec.level > BT_SECURITY_FIPS) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200901 err = -EINVAL;
902 break;
903 }
904
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300905 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300906
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200907 if (!chan->conn)
908 break;
909
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300910 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200911
Fugang Duanbbb69b32019-03-15 03:17:28 +0000912 /* change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300913 if (chan->scid == L2CAP_CID_ATT) {
Fugang Duanbbb69b32019-03-15 03:17:28 +0000914 if (smp_conn_security(conn->hcon, sec.level)) {
915 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300916 break;
Fugang Duanbbb69b32019-03-15 03:17:28 +0000917 }
918
Johan Hedbergd52deb12014-08-07 22:56:44 +0300919 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300920 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200921 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200922
Gustavo Padovana7d77232012-05-13 03:20:07 -0300923 /* or for ACL link */
924 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100925 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300926 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300927 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300928 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300929 else
930 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200931 } else {
932 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300933 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200934 break;
935
936 case BT_DEFER_SETUP:
937 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
938 err = -EINVAL;
939 break;
940 }
941
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200942 if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200943 err = -EFAULT;
944 break;
945 }
946
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700947 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300948 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700949 set_bit(FLAG_DEFER_SETUP, &chan->flags);
950 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300951 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700952 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
953 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200954 break;
955
956 case BT_FLUSHABLE:
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200957 if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200958 err = -EFAULT;
959 break;
960 }
961
962 if (opt > BT_FLUSHABLE_ON) {
963 err = -EINVAL;
964 break;
965 }
966
967 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200968 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300969 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200970 No Flush support in the LM */
971 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
972 err = -EINVAL;
973 break;
974 }
975 }
976
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300977 if (opt)
978 set_bit(FLAG_FLUSHABLE, &chan->flags);
979 else
980 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200981 break;
982
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700983 case BT_POWER:
984 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100985 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700986 err = -EINVAL;
987 break;
988 }
989
990 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
991
992 len = min_t(unsigned int, sizeof(pwr), optlen);
Christoph Hellwiga7b75c52020-07-23 08:09:07 +0200993 if (copy_from_sockptr(&pwr, optval, len)) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700994 err = -EFAULT;
995 break;
996 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300997
998 if (pwr.force_active)
999 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
1000 else
1001 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -07001002 break;
1003
Mat Martineau2ea66482011-11-02 16:18:30 -07001004 case BT_CHANNEL_POLICY:
Christoph Hellwiga7b75c52020-07-23 08:09:07 +02001005 if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
Mat Martineau2ea66482011-11-02 16:18:30 -07001006 err = -EFAULT;
1007 break;
1008 }
1009
1010 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
1011 err = -EINVAL;
1012 break;
1013 }
1014
1015 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001016 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -07001017 err = -EOPNOTSUPP;
1018 break;
1019 }
1020
1021 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -07001022
1023 if (sk->sk_state == BT_CONNECTED &&
1024 chan->move_role == L2CAP_MOVE_ROLE_NONE)
1025 l2cap_move_start(chan);
1026
Gustavo F. Padovan33575df2011-02-04 02:48:48 -02001027 break;
1028
Johan Hedberg1f435422013-12-02 16:34:18 +02001029 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +02001030 if (!bdaddr_type_is_le(chan->src_type)) {
1031 err = -EINVAL;
1032 break;
1033 }
1034
1035 /* Setting is not supported as it's the remote side that
1036 * decides this.
1037 */
1038 err = -EPERM;
1039 break;
1040
1041 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +02001042 if (!bdaddr_type_is_le(chan->src_type)) {
1043 err = -EINVAL;
1044 break;
1045 }
1046
Luiz Augusto von Dentz15f02b92020-03-02 16:56:20 -08001047 if (chan->mode == L2CAP_MODE_LE_FLOWCTL &&
1048 sk->sk_state == BT_CONNECTED) {
Johan Hedberg1f435422013-12-02 16:34:18 +02001049 err = -EISCONN;
1050 break;
1051 }
1052
Christoph Hellwiga7b75c52020-07-23 08:09:07 +02001053 if (copy_from_sockptr(&opt, optval, sizeof(u16))) {
Johan Hedberg1f435422013-12-02 16:34:18 +02001054 err = -EFAULT;
1055 break;
1056 }
1057
Luiz Augusto von Dentz15f02b92020-03-02 16:56:20 -08001058 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL &&
1059 sk->sk_state == BT_CONNECTED)
1060 err = l2cap_chan_reconfigure(chan, opt);
1061 else
1062 chan->imtu = opt;
1063
Johan Hedberg1f435422013-12-02 16:34:18 +02001064 break;
1065
Luiz Augusto von Dentz3ee7b7c2020-03-27 11:32:15 -07001066 case BT_MODE:
1067 if (!enable_ecred) {
1068 err = -ENOPROTOOPT;
1069 break;
1070 }
1071
1072 BT_DBG("sk->sk_state %u", sk->sk_state);
1073
1074 if (sk->sk_state != BT_BOUND) {
1075 err = -EINVAL;
1076 break;
1077 }
1078
1079 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
1080 err = -EINVAL;
1081 break;
1082 }
1083
Christoph Hellwiga7b75c52020-07-23 08:09:07 +02001084 if (copy_from_sockptr(&opt, optval, sizeof(u8))) {
Luiz Augusto von Dentz3ee7b7c2020-03-27 11:32:15 -07001085 err = -EFAULT;
1086 break;
1087 }
1088
1089 BT_DBG("opt %u", opt);
1090
1091 err = l2cap_set_mode(chan, opt);
1092 if (err)
1093 break;
1094
1095 BT_DBG("mode 0x%2.2x", chan->mode);
1096
1097 break;
1098
Gustavo F. Padovan33575df2011-02-04 02:48:48 -02001099 default:
1100 err = -ENOPROTOOPT;
1101 break;
1102 }
1103
1104 release_sock(sk);
1105 return err;
1106}
1107
Ying Xue1b784142015-03-02 15:37:48 +08001108static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg,
1109 size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -02001110{
1111 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001112 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -02001113 int err;
1114
1115 BT_DBG("sock %p, sk %p", sock, sk);
1116
1117 err = sock_error(sk);
1118 if (err)
1119 return err;
1120
1121 if (msg->msg_flags & MSG_OOB)
1122 return -EOPNOTSUPP;
1123
Mat Martineaua6a55682012-05-04 14:20:31 -07001124 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03001125 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -02001126
Johan Hedberge793dcf2013-09-16 13:05:19 +03001127 lock_sock(sk);
1128 err = bt_sock_wait_ready(sk, msg->msg_flags);
1129 release_sock(sk);
1130 if (err)
1131 return err;
1132
Mat Martineaua6a55682012-05-04 14:20:31 -07001133 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +02001134 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -07001135 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -02001136
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -02001137 return err;
1138}
1139
Ying Xue1b784142015-03-02 15:37:48 +08001140static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,
1141 size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001142{
1143 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -07001144 struct l2cap_pinfo *pi = l2cap_pi(sk);
1145 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001146
1147 lock_sock(sk);
1148
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001149 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
1150 &bt_sk(sk)->flags)) {
Luiz Augusto von Dentz15f02b92020-03-02 16:56:20 -08001151 if (pi->chan->mode == L2CAP_MODE_EXT_FLOWCTL) {
1152 sk->sk_state = BT_CONNECTED;
1153 pi->chan->state = BT_CONNECTED;
1154 __l2cap_ecred_conn_rsp_defer(pi->chan);
Dan Carpenterb354e6c2020-03-12 14:33:09 +03001155 } else if (bdaddr_type_is_le(pi->chan->src_type)) {
Johan Hedberg38319712013-05-17 12:49:23 +03001156 sk->sk_state = BT_CONNECTED;
1157 pi->chan->state = BT_CONNECTED;
1158 __l2cap_le_connect_rsp_defer(pi->chan);
1159 } else {
1160 sk->sk_state = BT_CONFIG;
1161 pi->chan->state = BT_CONFIG;
1162 __l2cap_connect_rsp_defer(pi->chan);
1163 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001164
Johan Hedberg970871b2013-09-25 13:26:05 +03001165 err = 0;
1166 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001167 }
1168
1169 release_sock(sk);
1170
1171 if (sock->type == SOCK_STREAM)
Ying Xue1b784142015-03-02 15:37:48 +08001172 err = bt_sock_stream_recvmsg(sock, msg, len, flags);
Mat Martineaue3281402011-07-07 09:39:02 -07001173 else
Ying Xue1b784142015-03-02 15:37:48 +08001174 err = bt_sock_recvmsg(sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001175
Mat Martineaue3281402011-07-07 09:39:02 -07001176 if (pi->chan->mode != L2CAP_MODE_ERTM)
1177 return err;
1178
1179 /* Attempt to put pending rx data in the socket buffer */
1180
1181 lock_sock(sk);
1182
1183 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1184 goto done;
1185
1186 if (pi->rx_busy_skb) {
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001187 if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))
Mat Martineaue3281402011-07-07 09:39:02 -07001188 pi->rx_busy_skb = NULL;
1189 else
1190 goto done;
1191 }
1192
1193 /* Restore data flow when half of the receive buffer is
1194 * available. This avoids resending large numbers of
1195 * frames.
1196 */
1197 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1198 l2cap_chan_busy(pi->chan, 0);
1199
1200done:
1201 release_sock(sk);
1202 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001203}
1204
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001205/* Kill socket (only if zapped and orphan)
Manish Mandlik6c08fc82020-01-28 10:54:14 -08001206 * Must be called on unlocked socket, with l2cap channel lock.
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001207 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001208static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001209{
1210 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1211 return;
1212
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001213 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001214
1215 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001216
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301217 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001218 sock_set_flag(sk, SOCK_DEAD);
1219 sock_put(sk);
1220}
1221
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001222static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
Gustavo Padovandc253062013-10-15 19:24:49 -03001223{
Gustavo Padovandc253062013-10-15 19:24:49 -03001224 DECLARE_WAITQUEUE(wait, current);
1225 int err = 0;
Dean Jenkinscb02a252015-06-23 17:59:38 +01001226 int timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Dean Jenkinse432c722015-06-23 17:59:39 +01001227 /* Timeout to prevent infinite loop */
1228 unsigned long timeout = jiffies + L2CAP_WAIT_ACK_TIMEOUT;
Gustavo Padovandc253062013-10-15 19:24:49 -03001229
1230 add_wait_queue(sk_sleep(sk), &wait);
1231 set_current_state(TASK_INTERRUPTIBLE);
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001232 do {
Dean Jenkinse432c722015-06-23 17:59:39 +01001233 BT_DBG("Waiting for %d ACKs, timeout %04d ms",
1234 chan->unacked_frames, time_after(jiffies, timeout) ? 0 :
1235 jiffies_to_msecs(timeout - jiffies));
Dean Jenkins451e4c62015-06-23 17:59:37 +01001236
Gustavo Padovandc253062013-10-15 19:24:49 -03001237 if (!timeo)
Dean Jenkinscb02a252015-06-23 17:59:38 +01001238 timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Gustavo Padovandc253062013-10-15 19:24:49 -03001239
1240 if (signal_pending(current)) {
1241 err = sock_intr_errno(timeo);
1242 break;
1243 }
1244
1245 release_sock(sk);
1246 timeo = schedule_timeout(timeo);
1247 lock_sock(sk);
1248 set_current_state(TASK_INTERRUPTIBLE);
1249
1250 err = sock_error(sk);
1251 if (err)
1252 break;
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001253
Dean Jenkinse432c722015-06-23 17:59:39 +01001254 if (time_after(jiffies, timeout)) {
1255 err = -ENOLINK;
1256 break;
1257 }
1258
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001259 } while (chan->unacked_frames > 0 &&
1260 chan->state == BT_CONNECTED);
1261
Gustavo Padovandc253062013-10-15 19:24:49 -03001262 set_current_state(TASK_RUNNING);
1263 remove_wait_queue(sk_sleep(sk), &wait);
1264 return err;
1265}
1266
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001267static int l2cap_sock_shutdown(struct socket *sock, int how)
1268{
1269 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001270 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001271 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001272 int err = 0;
1273
Archie Pusaka5b440672020-04-14 16:08:40 +08001274 BT_DBG("sock %p, sk %p, how %d", sock, sk, how);
1275
1276 /* 'how' parameter is mapped to sk_shutdown as follows:
1277 * SHUT_RD (0) --> RCV_SHUTDOWN (1)
1278 * SHUT_WR (1) --> SEND_SHUTDOWN (2)
1279 * SHUT_RDWR (2) --> SHUTDOWN_MASK (3)
1280 */
1281 how++;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001282
1283 if (!sk)
1284 return 0;
1285
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001286 lock_sock(sk);
1287
Archie Pusaka5b440672020-04-14 16:08:40 +08001288 if ((sk->sk_shutdown & how) == how)
Dean Jenkinse7456432015-10-14 12:18:45 +02001289 goto shutdown_already;
1290
1291 BT_DBG("Handling sock shutdown");
1292
Dean Jenkins2baea852015-06-23 17:59:32 +01001293 /* prevent sk structure from being freed whilst unlocked */
1294 sock_hold(sk);
1295
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001296 chan = l2cap_pi(sk)->chan;
Dean Jenkins2baea852015-06-23 17:59:32 +01001297 /* prevent chan structure from being freed whilst unlocked */
1298 l2cap_chan_hold(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001299
Johan Hedberg49d11742014-11-13 14:37:50 +02001300 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1301
Dean Jenkinse7456432015-10-14 12:18:45 +02001302 if (chan->mode == L2CAP_MODE_ERTM &&
1303 chan->unacked_frames > 0 &&
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001304 chan->state == BT_CONNECTED) {
Dean Jenkinse7456432015-10-14 12:18:45 +02001305 err = __l2cap_wait_ack(sk, chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001306
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001307 /* After waiting for ACKs, check whether shutdown
1308 * has already been actioned to close the L2CAP
1309 * link such as by l2cap_disconnection_req().
1310 */
Archie Pusaka5b440672020-04-14 16:08:40 +08001311 if ((sk->sk_shutdown & how) == how)
1312 goto shutdown_matched;
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001313 }
1314
Archie Pusaka5b440672020-04-14 16:08:40 +08001315 /* Try setting the RCV_SHUTDOWN bit, return early if SEND_SHUTDOWN
1316 * is already set
1317 */
1318 if ((how & RCV_SHUTDOWN) && !(sk->sk_shutdown & RCV_SHUTDOWN)) {
1319 sk->sk_shutdown |= RCV_SHUTDOWN;
1320 if ((sk->sk_shutdown & how) == how)
1321 goto shutdown_matched;
1322 }
1323
1324 sk->sk_shutdown |= SEND_SHUTDOWN;
Dean Jenkinse7456432015-10-14 12:18:45 +02001325 release_sock(sk);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001326
1327 l2cap_chan_lock(chan);
1328 conn = chan->conn;
1329 if (conn)
1330 /* prevent conn structure from being freed */
1331 l2cap_conn_get(conn);
1332 l2cap_chan_unlock(chan);
1333
1334 if (conn)
1335 /* mutex lock must be taken before l2cap_chan_lock() */
1336 mutex_lock(&conn->chan_lock);
1337
1338 l2cap_chan_lock(chan);
Dean Jenkinse7456432015-10-14 12:18:45 +02001339 l2cap_chan_close(chan, 0);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001340 l2cap_chan_unlock(chan);
1341
1342 if (conn) {
1343 mutex_unlock(&conn->chan_lock);
1344 l2cap_conn_put(conn);
1345 }
1346
Dean Jenkinse7456432015-10-14 12:18:45 +02001347 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001348
Dean Jenkinse7456432015-10-14 12:18:45 +02001349 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1350 !(current->flags & PF_EXITING))
1351 err = bt_sock_wait_state(sk, BT_CLOSED,
1352 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001353
Archie Pusaka5b440672020-04-14 16:08:40 +08001354shutdown_matched:
Dean Jenkins2baea852015-06-23 17:59:32 +01001355 l2cap_chan_put(chan);
1356 sock_put(sk);
1357
Dean Jenkinse7456432015-10-14 12:18:45 +02001358shutdown_already:
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001359 if (!err && sk->sk_err)
1360 err = -sk->sk_err;
1361
1362 release_sock(sk);
1363
1364 BT_DBG("Sock shutdown complete err: %d", err);
Dean Jenkins451e4c62015-06-23 17:59:37 +01001365
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001366 return err;
1367}
1368
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001369static int l2cap_sock_release(struct socket *sock)
1370{
1371 struct sock *sk = sock->sk;
1372 int err;
Hillf Danton2a154902020-02-05 10:31:59 +08001373 struct l2cap_chan *chan;
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001374
1375 BT_DBG("sock %p, sk %p", sock, sk);
1376
1377 if (!sk)
1378 return 0;
1379
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001380 bt_sock_unlink(&l2cap_sk_list, sk);
1381
Archie Pusaka5b440672020-04-14 16:08:40 +08001382 err = l2cap_sock_shutdown(sock, SHUT_RDWR);
Hillf Danton2a154902020-02-05 10:31:59 +08001383 chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001384
Hillf Danton2a154902020-02-05 10:31:59 +08001385 l2cap_chan_hold(chan);
1386 l2cap_chan_lock(chan);
Manish Mandlik6c08fc82020-01-28 10:54:14 -08001387
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001388 sock_orphan(sk);
1389 l2cap_sock_kill(sk);
Manish Mandlik6c08fc82020-01-28 10:54:14 -08001390
Hillf Danton2a154902020-02-05 10:31:59 +08001391 l2cap_chan_unlock(chan);
1392 l2cap_chan_put(chan);
Manish Mandlik6c08fc82020-01-28 10:54:14 -08001393
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001394 return err;
1395}
1396
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001397static void l2cap_sock_cleanup_listen(struct sock *parent)
1398{
1399 struct sock *sk;
1400
Johan Hedberg49d11742014-11-13 14:37:50 +02001401 BT_DBG("parent %p state %s", parent,
1402 state_to_string(parent->sk_state));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001403
1404 /* Close not yet accepted channels */
1405 while ((sk = bt_accept_dequeue(parent, NULL))) {
1406 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1407
Johan Hedberg49d11742014-11-13 14:37:50 +02001408 BT_DBG("child chan %p state %s", chan,
1409 state_to_string(chan->state));
1410
Manish Mandlik6c08fc82020-01-28 10:54:14 -08001411 l2cap_chan_hold(chan);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001412 l2cap_chan_lock(chan);
Manish Mandlik6c08fc82020-01-28 10:54:14 -08001413
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001414 __clear_chan_timer(chan);
1415 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001416 l2cap_sock_kill(sk);
Manish Mandlik6c08fc82020-01-28 10:54:14 -08001417
1418 l2cap_chan_unlock(chan);
1419 l2cap_chan_put(chan);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001420 }
1421}
1422
Gustavo Padovan80b98022012-05-27 22:27:51 -03001423static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001424{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001425 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001426
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001427 lock_sock(parent);
1428
Gustavo Padovan53826692012-05-27 22:27:55 -03001429 /* Check for backlog size */
1430 if (sk_acceptq_is_full(parent)) {
1431 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001432 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001433 return NULL;
1434 }
1435
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001436 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001437 GFP_ATOMIC, 0);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001438 if (!sk) {
1439 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001440 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001441 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001442
Octavian Purdilad22015a2012-01-22 00:28:34 +02001443 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1444
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001445 l2cap_sock_init(sk, parent);
1446
Matthias Kaehlckec4f56272019-01-02 16:11:20 -08001447 bt_accept_enqueue(parent, sk, false);
Gustavo Padovan644912e2012-10-12 19:35:23 +08001448
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001449 release_sock(parent);
1450
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001451 return l2cap_pi(sk)->chan;
1452}
1453
Gustavo Padovan80b98022012-05-27 22:27:51 -03001454static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001455{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001456 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001457 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001458
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001459 lock_sock(sk);
1460
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001461 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001462 err = -ENOMEM;
1463 goto done;
1464 }
Mat Martineaue3281402011-07-07 09:39:02 -07001465
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001466 if (chan->mode != L2CAP_MODE_ERTM &&
1467 chan->mode != L2CAP_MODE_STREAMING) {
1468 /* Even if no filter is attached, we could potentially
1469 * get errors from security modules, etc.
1470 */
1471 err = sk_filter(sk, skb);
1472 if (err)
1473 goto done;
1474 }
1475
1476 err = __sock_queue_rcv_skb(sk, skb);
Mat Martineaue3281402011-07-07 09:39:02 -07001477
1478 /* For ERTM, handle one skb that doesn't fit into the recv
1479 * buffer. This is important to do because the data frames
1480 * have already been acked, so the skb cannot be discarded.
1481 *
1482 * Notify the l2cap core that the buffer is full, so the
1483 * LOCAL_BUSY state is entered and no more frames are
1484 * acked and reassembled until there is buffer space
1485 * available.
1486 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001487 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1488 l2cap_pi(sk)->rx_busy_skb = skb;
1489 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001490 err = 0;
1491 }
1492
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001493done:
1494 release_sock(sk);
1495
Mat Martineaue3281402011-07-07 09:39:02 -07001496 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001497}
1498
Gustavo Padovan80b98022012-05-27 22:27:51 -03001499static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001500{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001501 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001502
1503 l2cap_sock_kill(sk);
1504}
1505
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001506static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1507{
1508 struct sock *sk = chan->data;
1509 struct sock *parent;
1510
Johan Hedberg49d11742014-11-13 14:37:50 +02001511 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1512
Johan Hedberg3b2ab392014-11-12 22:22:22 +02001513 /* This callback can be called both for server (BT_LISTEN)
1514 * sockets as well as "normal" ones. To avoid lockdep warnings
1515 * with child socket locking (through l2cap_sock_cleanup_listen)
1516 * we need separation into separate nesting levels. The simplest
1517 * way to accomplish this is to inherit the nesting level used
1518 * for the channel.
1519 */
1520 lock_sock_nested(sk, atomic_read(&chan->nesting));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001521
1522 parent = bt_sk(sk)->parent;
1523
1524 sock_set_flag(sk, SOCK_ZAPPED);
1525
1526 switch (chan->state) {
1527 case BT_OPEN:
1528 case BT_BOUND:
1529 case BT_CLOSED:
1530 break;
1531 case BT_LISTEN:
1532 l2cap_sock_cleanup_listen(sk);
1533 sk->sk_state = BT_CLOSED;
1534 chan->state = BT_CLOSED;
1535
1536 break;
1537 default:
1538 sk->sk_state = BT_CLOSED;
1539 chan->state = BT_CLOSED;
1540
1541 sk->sk_err = err;
1542
1543 if (parent) {
1544 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001545 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001546 } else {
1547 sk->sk_state_change(sk);
1548 }
1549
1550 break;
1551 }
1552
1553 release_sock(sk);
1554}
1555
Gustavo Padovan53f52122013-10-15 19:24:45 -03001556static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1557 int err)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001558{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001559 struct sock *sk = chan->data;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001560
1561 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001562
1563 if (err)
1564 sk->sk_err = err;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001565}
1566
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001567static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001568 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001569 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001570{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001571 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001572 struct sk_buff *skb;
1573 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001574
Mat Martineaua6a55682012-05-04 14:20:31 -07001575 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001576 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001577 l2cap_chan_lock(chan);
1578
Gustavo Padovan90338942012-04-06 20:15:47 -03001579 if (!skb)
1580 return ERR_PTR(err);
1581
Marcel Holtmann8d463212014-06-05 15:22:51 +02001582 skb->priority = sk->sk_priority;
1583
Johan Hedberga4368ff2015-03-30 23:21:01 +03001584 bt_cb(skb)->l2cap.chan = chan;
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001585
Gustavo Padovan90338942012-04-06 20:15:47 -03001586 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001587}
1588
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001589static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1590{
1591 struct sock *sk = chan->data;
1592 struct sock *parent;
1593
1594 lock_sock(sk);
1595
1596 parent = bt_sk(sk)->parent;
1597
1598 BT_DBG("sk %p, parent %p", sk, parent);
1599
1600 sk->sk_state = BT_CONNECTED;
1601 sk->sk_state_change(sk);
1602
1603 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001604 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001605
1606 release_sock(sk);
1607}
1608
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001609static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1610{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001611 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001612
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001613 lock_sock(sk);
1614
1615 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001616 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001617 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001618
1619 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001620}
1621
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001622static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1623{
1624 struct sock *sk = chan->data;
1625
Johan Hedbergd52deb12014-08-07 22:56:44 +03001626 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1627 sk->sk_state = BT_CONNECTED;
1628 chan->state = BT_CONNECTED;
1629 }
1630
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001631 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1632 sk->sk_state_change(sk);
1633}
1634
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001635static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1636{
1637 struct sock *sk = chan->data;
1638
1639 lock_sock(sk);
1640 sk->sk_shutdown = SHUTDOWN_MASK;
1641 release_sock(sk);
1642}
1643
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001644static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1645{
1646 struct sock *sk = chan->data;
1647
1648 return sk->sk_sndtimeo;
1649}
1650
Luiz Augusto von Dentzb48596d2020-03-23 13:34:56 -07001651static struct pid *l2cap_sock_get_peer_pid_cb(struct l2cap_chan *chan)
1652{
1653 struct sock *sk = chan->data;
1654
1655 return sk->sk_peer_pid;
1656}
1657
Johan Hedberg837776f2013-10-15 11:03:18 +03001658static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1659{
1660 struct sock *sk = chan->data;
1661
1662 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1663 sk->sk_state_change(sk);
1664}
1665
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001666static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001667 .name = "L2CAP Socket Interface",
1668 .new_connection = l2cap_sock_new_connection_cb,
1669 .recv = l2cap_sock_recv_cb,
1670 .close = l2cap_sock_close_cb,
1671 .teardown = l2cap_sock_teardown_cb,
1672 .state_change = l2cap_sock_state_change_cb,
1673 .ready = l2cap_sock_ready_cb,
1674 .defer = l2cap_sock_defer_cb,
1675 .resume = l2cap_sock_resume_cb,
1676 .suspend = l2cap_sock_suspend_cb,
1677 .set_shutdown = l2cap_sock_set_shutdown_cb,
1678 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
Luiz Augusto von Dentzb48596d2020-03-23 13:34:56 -07001679 .get_peer_pid = l2cap_sock_get_peer_pid_cb,
Jukka Rissanen04988782014-06-18 16:37:07 +03001680 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001681};
1682
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001683static void l2cap_sock_destruct(struct sock *sk)
1684{
1685 BT_DBG("sk %p", sk);
1686
Sasha Levin23d3a862012-10-08 16:48:32 -04001687 if (l2cap_pi(sk)->chan)
1688 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001689
Mat Martineaue3281402011-07-07 09:39:02 -07001690 if (l2cap_pi(sk)->rx_busy_skb) {
1691 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1692 l2cap_pi(sk)->rx_busy_skb = NULL;
1693 }
1694
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001695 skb_queue_purge(&sk->sk_receive_queue);
1696 skb_queue_purge(&sk->sk_write_queue);
1697}
1698
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001699static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1700 int *msg_namelen)
1701{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001702 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001703
1704 memset(la, 0, sizeof(struct sockaddr_l2));
1705 la->l2_family = AF_BLUETOOTH;
Johan Hedberga4368ff2015-03-30 23:21:01 +03001706 la->l2_psm = bt_cb(skb)->l2cap.psm;
1707 bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001708
1709 *msg_namelen = sizeof(struct sockaddr_l2);
1710}
1711
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001712static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001713{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001714 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001715
1716 BT_DBG("sk %p", sk);
1717
1718 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001719 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1720
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001721 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001722 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001723
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001724 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001725 chan->imtu = pchan->imtu;
1726 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001727 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001728 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001729 chan->fcs = pchan->fcs;
1730 chan->max_tx = pchan->max_tx;
1731 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001732 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001733 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001734 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001735 chan->tx_credits = pchan->tx_credits;
1736 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001737
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001738 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1739 chan->scid = pchan->scid;
1740 chan->dcid = pchan->scid;
1741 }
1742
Paul Moore6230c9b2011-10-07 09:40:59 +00001743 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001744 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001745 switch (sk->sk_type) {
1746 case SOCK_RAW:
1747 chan->chan_type = L2CAP_CHAN_RAW;
1748 break;
1749 case SOCK_DGRAM:
1750 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001751 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001752 break;
1753 case SOCK_SEQPACKET:
1754 case SOCK_STREAM:
1755 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1756 break;
1757 }
1758
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001759 chan->imtu = L2CAP_DEFAULT_MTU;
1760 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001761 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001762 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001763 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001764 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001765 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001766 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001767
1768 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001769 }
1770
1771 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001772 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001773
1774 chan->data = sk;
1775 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001776}
1777
1778static struct proto l2cap_proto = {
1779 .name = "L2CAP",
1780 .owner = THIS_MODULE,
1781 .obj_size = sizeof(struct l2cap_pinfo)
1782};
1783
Gustavo Padovan2d792812012-10-06 10:07:01 +01001784static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001785 int proto, gfp_t prio, int kern)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001786{
1787 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001788 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001789
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001790 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001791 if (!sk)
1792 return NULL;
1793
1794 sock_init_data(sock, sk);
1795 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1796
1797 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001798 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001799
1800 sock_reset_flag(sk, SOCK_ZAPPED);
1801
1802 sk->sk_protocol = proto;
1803 sk->sk_state = BT_OPEN;
1804
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001805 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001806 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301807 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001808 return NULL;
1809 }
1810
Mat Martineau61d6ef32012-04-27 16:50:50 -07001811 l2cap_chan_hold(chan);
1812
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001813 l2cap_pi(sk)->chan = chan;
1814
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001815 return sk;
1816}
1817
1818static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1819 int kern)
1820{
1821 struct sock *sk;
1822
1823 BT_DBG("sock %p", sock);
1824
1825 sock->state = SS_UNCONNECTED;
1826
1827 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001828 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001829 return -ESOCKTNOSUPPORT;
1830
1831 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1832 return -EPERM;
1833
1834 sock->ops = &l2cap_sock_ops;
1835
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001836 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001837 if (!sk)
1838 return -ENOMEM;
1839
1840 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001841 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001842 return 0;
1843}
1844
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001845static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001846 .family = PF_BLUETOOTH,
1847 .owner = THIS_MODULE,
1848 .release = l2cap_sock_release,
1849 .bind = l2cap_sock_bind,
1850 .connect = l2cap_sock_connect,
1851 .listen = l2cap_sock_listen,
1852 .accept = l2cap_sock_accept,
1853 .getname = l2cap_sock_getname,
1854 .sendmsg = l2cap_sock_sendmsg,
1855 .recvmsg = l2cap_sock_recvmsg,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07001856 .poll = bt_sock_poll,
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001857 .ioctl = bt_sock_ioctl,
Arnd Bergmannc7cbdbf2019-04-17 22:51:48 +02001858 .gettstamp = sock_gettstamp,
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001859 .mmap = sock_no_mmap,
1860 .socketpair = sock_no_socketpair,
1861 .shutdown = l2cap_sock_shutdown,
1862 .setsockopt = l2cap_sock_setsockopt,
1863 .getsockopt = l2cap_sock_getsockopt
1864};
1865
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001866static const struct net_proto_family l2cap_sock_family_ops = {
1867 .family = PF_BLUETOOTH,
1868 .owner = THIS_MODULE,
1869 .create = l2cap_sock_create,
1870};
1871
1872int __init l2cap_init_sockets(void)
1873{
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001874 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001875
Marcel Holtmanndd625552015-01-11 15:18:19 -08001876 BUILD_BUG_ON(sizeof(struct sockaddr_l2) > sizeof(struct sockaddr));
1877
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001878 err = proto_register(&l2cap_proto, 0);
1879 if (err < 0)
1880 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001881
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001882 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001883 if (err < 0) {
1884 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001885 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001886 }
1887
Al Virob0316612013-04-04 19:14:33 -04001888 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001889 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001890 if (err < 0) {
1891 BT_ERR("Failed to create L2CAP proc file");
1892 bt_sock_unregister(BTPROTO_L2CAP);
1893 goto error;
1894 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001895
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001896 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001897
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001898 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001899
1900error:
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001901 proto_unregister(&l2cap_proto);
1902 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001903}
1904
1905void l2cap_cleanup_sockets(void)
1906{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001907 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001908 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001909 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001910}