blob: a7be8b59b3c280de738ec808534635265ee35169 [file] [log] [blame]
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
5 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007
8 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License version 2 as
12 published by the Free Software Foundation;
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
17 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
18 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
24 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
25 SOFTWARE IS DISCLAIMED.
26*/
27
28/* Bluetooth L2CAP sockets. */
29
Johan Hedberg91497612013-12-02 11:20:20 +020030#include <linux/module.h>
Paul Gortmakerbc3b2d72011-07-15 11:47:34 -040031#include <linux/export.h>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010032#include <linux/sched/signal.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000033
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020034#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020035#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020036#include <net/bluetooth/l2cap.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070037
38#include "smp.h"
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020039
Masatake YAMATO5b28d952012-07-26 01:29:25 +090040static struct bt_sock_list l2cap_sk_list = {
41 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
42};
43
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030044static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030045static void l2cap_sock_init(struct sock *sk, struct sock *parent);
Gustavo Padovan2d792812012-10-06 10:07:01 +010046static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -050047 int proto, gfp_t prio, int kern);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030048
David Herrmannb3916db2013-04-05 14:57:34 +020049bool l2cap_is_socket(struct socket *sock)
50{
51 return sock && sock->ops == &l2cap_sock_ops;
52}
53EXPORT_SYMBOL(l2cap_is_socket);
54
Johan Hedberg49460962013-10-08 13:55:46 +020055static int l2cap_validate_bredr_psm(u16 psm)
56{
57 /* PSM must be odd and lsb of upper byte must be 0 */
58 if ((psm & 0x0101) != 0x0001)
59 return -EINVAL;
60
61 /* Restrict usage of well-known PSMs */
Johan Hedberg114f9f12016-01-26 17:19:09 -050062 if (psm < L2CAP_PSM_DYN_START && !capable(CAP_NET_BIND_SERVICE))
Johan Hedberg49460962013-10-08 13:55:46 +020063 return -EACCES;
64
65 return 0;
66}
67
68static int l2cap_validate_le_psm(u16 psm)
69{
70 /* Valid LE_PSM ranges are defined only until 0x00ff */
Johan Hedberg114f9f12016-01-26 17:19:09 -050071 if (psm > L2CAP_PSM_LE_DYN_END)
Johan Hedberg49460962013-10-08 13:55:46 +020072 return -EINVAL;
73
74 /* Restrict fixed, SIG assigned PSM values to CAP_NET_BIND_SERVICE */
Johan Hedberg114f9f12016-01-26 17:19:09 -050075 if (psm < L2CAP_PSM_LE_DYN_START && !capable(CAP_NET_BIND_SERVICE))
Johan Hedberg49460962013-10-08 13:55:46 +020076 return -EACCES;
77
78 return 0;
79}
80
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020081static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
82{
83 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030084 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020085 struct sockaddr_l2 la;
86 int len, err = 0;
87
88 BT_DBG("sk %p", sk);
89
Mateusz Jurczykd2ecfa72017-06-29 14:04:59 +020090 if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
91 addr->sa_family != AF_BLUETOOTH)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020092 return -EINVAL;
93
94 memset(&la, 0, sizeof(la));
95 len = min_t(unsigned int, sizeof(la), alen);
96 memcpy(&la, addr, len);
97
Ville Tervob62f3282011-02-10 22:38:50 -030098 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020099 return -EINVAL;
100
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300101 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
102 return -EINVAL;
103
Johan Hedbergbfe46552013-10-16 17:13:26 +0300104 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300105 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200106 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700107 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300108 return -EINVAL;
109 }
110
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200111 lock_sock(sk);
112
113 if (sk->sk_state != BT_OPEN) {
114 err = -EBADFD;
115 goto done;
116 }
117
118 if (la.l2_psm) {
119 __u16 psm = __le16_to_cpu(la.l2_psm);
120
Johan Hedberg49460962013-10-08 13:55:46 +0200121 if (la.l2_bdaddr_type == BDADDR_BREDR)
122 err = l2cap_validate_bredr_psm(psm);
123 else
124 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200125
Johan Hedberg49460962013-10-08 13:55:46 +0200126 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200127 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200128 }
129
Johan Hedberga2342c52016-01-26 17:19:11 -0500130 bacpy(&chan->src, &la.l2_bdaddr);
131 chan->src_type = la.l2_bdaddr_type;
132
Ville Tervob62f3282011-02-10 22:38:50 -0300133 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530134 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300135 else
136 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300137
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300138 if (err < 0)
139 goto done;
140
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700141 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700142 case L2CAP_CHAN_CONN_LESS:
143 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
144 chan->sec_level = BT_SECURITY_SDP;
145 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700146 case L2CAP_CHAN_CONN_ORIENTED:
147 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
148 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
149 chan->sec_level = BT_SECURITY_SDP;
150 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200151 case L2CAP_CHAN_RAW:
152 chan->sec_level = BT_SECURITY_SDP;
153 break;
Johan Hedbergc16900c2014-08-15 21:17:06 +0300154 case L2CAP_CHAN_FIXED:
155 /* Fixed channels default to the L2CAP core not holding a
156 * hci_conn reference for them. For fixed channels mapping to
157 * L2CAP sockets we do want to hold a reference so set the
158 * appropriate flag to request it.
159 */
160 set_bit(FLAG_HOLD_HCI_CONN, &chan->flags);
161 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700162 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300163
Johan Hedberg38319712013-05-17 12:49:23 +0300164 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200165 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300166
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300167 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300168 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200169
170done:
171 release_sock(sk);
172 return err;
173}
174
Gustavo Padovan2d792812012-10-06 10:07:01 +0100175static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
176 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200177{
178 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300179 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200180 struct sockaddr_l2 la;
181 int len, err = 0;
182
183 BT_DBG("sk %p", sk);
184
Mateusz Jurczykd2ecfa72017-06-29 14:04:59 +0200185 if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200186 addr->sa_family != AF_BLUETOOTH)
187 return -EINVAL;
188
189 memset(&la, 0, sizeof(la));
190 len = min_t(unsigned int, sizeof(la), alen);
191 memcpy(&la, addr, len);
192
Ville Tervoacd7d372011-02-10 22:38:49 -0300193 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200194 return -EINVAL;
195
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300196 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
197 return -EINVAL;
198
Johan Hedbergeb622492013-10-18 11:49:25 +0300199 /* Check that the socket wasn't bound to something that
200 * conflicts with the address given to connect(). If chan->src
201 * is BDADDR_ANY it means bind() was never used, in which case
202 * chan->src_type and la.l2_bdaddr_type do not need to match.
203 */
204 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
205 bdaddr_type_is_le(la.l2_bdaddr_type)) {
206 /* Old user space versions will try to incorrectly bind
207 * the ATT socket using BDADDR_BREDR. We need to accept
208 * this and fix up the source address type only when
209 * both the source CID and destination CID indicate
210 * ATT. Anything else is an invalid combination.
211 */
212 if (chan->scid != L2CAP_CID_ATT ||
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700213 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergeb622492013-10-18 11:49:25 +0300214 return -EINVAL;
215
216 /* We don't have the hdev available here to make a
217 * better decision on random vs public, but since all
218 * user space versions that exhibit this issue anyway do
219 * not support random local addresses assuming public
220 * here is good enough.
221 */
222 chan->src_type = BDADDR_LE_PUBLIC;
223 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300224
225 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
226 return -EINVAL;
227
Johan Hedbergbfe46552013-10-16 17:13:26 +0300228 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300229 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200230 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700231 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300232 return -EINVAL;
233 }
234
Johan Hedberg38319712013-05-17 12:49:23 +0300235 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200236 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300237
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530238 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300239 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200240 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200241 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200242
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200243 lock_sock(sk);
244
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200245 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100246 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200247
248 release_sock(sk);
249
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200250 return err;
251}
252
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200253static int l2cap_sock_listen(struct socket *sock, int backlog)
254{
255 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300256 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200257 int err = 0;
258
259 BT_DBG("sk %p backlog %d", sk, backlog);
260
261 lock_sock(sk);
262
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200263 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200264 err = -EBADFD;
265 goto done;
266 }
267
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200268 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
269 err = -EINVAL;
270 goto done;
271 }
272
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300273 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200274 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300275 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200276 break;
277 case L2CAP_MODE_ERTM:
278 case L2CAP_MODE_STREAMING:
279 if (!disable_ertm)
280 break;
281 /* fall through */
282 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300283 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200284 goto done;
285 }
286
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200287 sk->sk_max_ack_backlog = backlog;
288 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300289
Johan Hedbergabe84902014-11-12 22:22:21 +0200290 /* Listening channels need to use nested locking in order not to
291 * cause lockdep warnings when the created child channels end up
292 * being locked in the same thread as the parent channel.
293 */
294 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
295
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -0300296 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200297 sk->sk_state = BT_LISTEN;
298
299done:
300 release_sock(sk);
301 return err;
302}
303
Gustavo Padovan2d792812012-10-06 10:07:01 +0100304static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
David Howellscdfbabf2017-03-09 08:09:05 +0000305 int flags, bool kern)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200306{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500307 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200308 struct sock *sk = sock->sk, *nsk;
309 long timeo;
310 int err = 0;
311
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200312 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200313
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200314 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
315
316 BT_DBG("sk %p timeo %ld", sk, timeo);
317
318 /* Wait for an incoming connection. (wake-one). */
319 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400320 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200321 if (sk->sk_state != BT_LISTEN) {
322 err = -EBADFD;
323 break;
324 }
325
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400326 nsk = bt_accept_dequeue(sk, newsock);
327 if (nsk)
328 break;
329
330 if (!timeo) {
331 err = -EAGAIN;
332 break;
333 }
334
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200335 if (signal_pending(current)) {
336 err = sock_intr_errno(timeo);
337 break;
338 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400339
340 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500341
342 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
343
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200344 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200345 }
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200346 remove_wait_queue(sk_sleep(sk), &wait);
347
348 if (err)
349 goto done;
350
351 newsock->state = SS_CONNECTED;
352
353 BT_DBG("new socket %p", nsk);
354
355done:
356 release_sock(sk);
357 return err;
358}
359
Gustavo Padovan2d792812012-10-06 10:07:01 +0100360static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100361 int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200362{
363 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
364 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300365 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200366
367 BT_DBG("sock %p, sk %p", sock, sk);
368
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200369 if (peer && sk->sk_state != BT_CONNECTED &&
Johan Hedbergbf19d512014-07-01 12:07:23 +0300370 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
371 sk->sk_state != BT_CONFIG)
Johan Hedbergb783fbc2014-01-28 15:16:49 -0800372 return -ENOTCONN;
373
Mathias Krause792039c2012-08-15 11:31:51 +0000374 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200375 addr->sa_family = AF_BLUETOOTH;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200376
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
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100389 return sizeof(struct sockaddr_l2);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200390}
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
Fugang Duanbbb69b32019-03-15 03:17:28 +0000794 /* change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300795 if (chan->scid == L2CAP_CID_ATT) {
Fugang Duanbbb69b32019-03-15 03:17:28 +0000796 if (smp_conn_security(conn->hcon, sec.level)) {
797 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300798 break;
Fugang Duanbbb69b32019-03-15 03:17:28 +0000799 }
800
Johan Hedbergd52deb12014-08-07 22:56:44 +0300801 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300802 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200803 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200804
Gustavo Padovana7d77232012-05-13 03:20:07 -0300805 /* or for ACL link */
806 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100807 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300808 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300809 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300810 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300811 else
812 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200813 } else {
814 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300815 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200816 break;
817
818 case BT_DEFER_SETUP:
819 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
820 err = -EINVAL;
821 break;
822 }
823
824 if (get_user(opt, (u32 __user *) optval)) {
825 err = -EFAULT;
826 break;
827 }
828
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700829 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300830 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700831 set_bit(FLAG_DEFER_SETUP, &chan->flags);
832 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300833 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700834 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
835 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200836 break;
837
838 case BT_FLUSHABLE:
839 if (get_user(opt, (u32 __user *) optval)) {
840 err = -EFAULT;
841 break;
842 }
843
844 if (opt > BT_FLUSHABLE_ON) {
845 err = -EINVAL;
846 break;
847 }
848
849 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200850 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300851 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200852 No Flush support in the LM */
853 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
854 err = -EINVAL;
855 break;
856 }
857 }
858
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300859 if (opt)
860 set_bit(FLAG_FLUSHABLE, &chan->flags);
861 else
862 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200863 break;
864
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700865 case BT_POWER:
866 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100867 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700868 err = -EINVAL;
869 break;
870 }
871
872 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
873
874 len = min_t(unsigned int, sizeof(pwr), optlen);
875 if (copy_from_user((char *) &pwr, optval, len)) {
876 err = -EFAULT;
877 break;
878 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300879
880 if (pwr.force_active)
881 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
882 else
883 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700884 break;
885
Mat Martineau2ea66482011-11-02 16:18:30 -0700886 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700887 if (get_user(opt, (u32 __user *) optval)) {
888 err = -EFAULT;
889 break;
890 }
891
892 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
893 err = -EINVAL;
894 break;
895 }
896
897 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100898 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700899 err = -EOPNOTSUPP;
900 break;
901 }
902
903 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700904
905 if (sk->sk_state == BT_CONNECTED &&
906 chan->move_role == L2CAP_MOVE_ROLE_NONE)
907 l2cap_move_start(chan);
908
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200909 break;
910
Johan Hedberg1f435422013-12-02 16:34:18 +0200911 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200912 if (!bdaddr_type_is_le(chan->src_type)) {
913 err = -EINVAL;
914 break;
915 }
916
917 /* Setting is not supported as it's the remote side that
918 * decides this.
919 */
920 err = -EPERM;
921 break;
922
923 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200924 if (!bdaddr_type_is_le(chan->src_type)) {
925 err = -EINVAL;
926 break;
927 }
928
929 if (sk->sk_state == BT_CONNECTED) {
930 err = -EISCONN;
931 break;
932 }
933
Amadeusz Sławiński23bc6ab2016-07-14 10:50:23 +0200934 if (get_user(opt, (u16 __user *) optval)) {
Johan Hedberg1f435422013-12-02 16:34:18 +0200935 err = -EFAULT;
936 break;
937 }
938
939 chan->imtu = opt;
940 break;
941
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200942 default:
943 err = -ENOPROTOOPT;
944 break;
945 }
946
947 release_sock(sk);
948 return err;
949}
950
Ying Xue1b784142015-03-02 15:37:48 +0800951static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg,
952 size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200953{
954 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300955 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200956 int err;
957
958 BT_DBG("sock %p, sk %p", sock, sk);
959
960 err = sock_error(sk);
961 if (err)
962 return err;
963
964 if (msg->msg_flags & MSG_OOB)
965 return -EOPNOTSUPP;
966
Mat Martineaua6a55682012-05-04 14:20:31 -0700967 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300968 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200969
Johan Hedberge793dcf2013-09-16 13:05:19 +0300970 lock_sock(sk);
971 err = bt_sock_wait_ready(sk, msg->msg_flags);
972 release_sock(sk);
973 if (err)
974 return err;
975
Mat Martineaua6a55682012-05-04 14:20:31 -0700976 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +0200977 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -0700978 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200979
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200980 return err;
981}
982
Ying Xue1b784142015-03-02 15:37:48 +0800983static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,
984 size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200985{
986 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700987 struct l2cap_pinfo *pi = l2cap_pi(sk);
988 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200989
990 lock_sock(sk);
991
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300992 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
993 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +0300994 if (bdaddr_type_is_le(pi->chan->src_type)) {
995 sk->sk_state = BT_CONNECTED;
996 pi->chan->state = BT_CONNECTED;
997 __l2cap_le_connect_rsp_defer(pi->chan);
998 } else {
999 sk->sk_state = BT_CONFIG;
1000 pi->chan->state = BT_CONFIG;
1001 __l2cap_connect_rsp_defer(pi->chan);
1002 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001003
Johan Hedberg970871b2013-09-25 13:26:05 +03001004 err = 0;
1005 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001006 }
1007
1008 release_sock(sk);
1009
1010 if (sock->type == SOCK_STREAM)
Ying Xue1b784142015-03-02 15:37:48 +08001011 err = bt_sock_stream_recvmsg(sock, msg, len, flags);
Mat Martineaue3281402011-07-07 09:39:02 -07001012 else
Ying Xue1b784142015-03-02 15:37:48 +08001013 err = bt_sock_recvmsg(sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001014
Mat Martineaue3281402011-07-07 09:39:02 -07001015 if (pi->chan->mode != L2CAP_MODE_ERTM)
1016 return err;
1017
1018 /* Attempt to put pending rx data in the socket buffer */
1019
1020 lock_sock(sk);
1021
1022 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1023 goto done;
1024
1025 if (pi->rx_busy_skb) {
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001026 if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))
Mat Martineaue3281402011-07-07 09:39:02 -07001027 pi->rx_busy_skb = NULL;
1028 else
1029 goto done;
1030 }
1031
1032 /* Restore data flow when half of the receive buffer is
1033 * available. This avoids resending large numbers of
1034 * frames.
1035 */
1036 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1037 l2cap_chan_busy(pi->chan, 0);
1038
1039done:
1040 release_sock(sk);
1041 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001042}
1043
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001044/* Kill socket (only if zapped and orphan)
1045 * Must be called on unlocked socket.
1046 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001047static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001048{
1049 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1050 return;
1051
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001052 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001053
1054 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001055
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301056 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001057 sock_set_flag(sk, SOCK_DEAD);
1058 sock_put(sk);
1059}
1060
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001061static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
Gustavo Padovandc253062013-10-15 19:24:49 -03001062{
Gustavo Padovandc253062013-10-15 19:24:49 -03001063 DECLARE_WAITQUEUE(wait, current);
1064 int err = 0;
Dean Jenkinscb02a252015-06-23 17:59:38 +01001065 int timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Dean Jenkinse432c722015-06-23 17:59:39 +01001066 /* Timeout to prevent infinite loop */
1067 unsigned long timeout = jiffies + L2CAP_WAIT_ACK_TIMEOUT;
Gustavo Padovandc253062013-10-15 19:24:49 -03001068
1069 add_wait_queue(sk_sleep(sk), &wait);
1070 set_current_state(TASK_INTERRUPTIBLE);
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001071 do {
Dean Jenkinse432c722015-06-23 17:59:39 +01001072 BT_DBG("Waiting for %d ACKs, timeout %04d ms",
1073 chan->unacked_frames, time_after(jiffies, timeout) ? 0 :
1074 jiffies_to_msecs(timeout - jiffies));
Dean Jenkins451e4c62015-06-23 17:59:37 +01001075
Gustavo Padovandc253062013-10-15 19:24:49 -03001076 if (!timeo)
Dean Jenkinscb02a252015-06-23 17:59:38 +01001077 timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Gustavo Padovandc253062013-10-15 19:24:49 -03001078
1079 if (signal_pending(current)) {
1080 err = sock_intr_errno(timeo);
1081 break;
1082 }
1083
1084 release_sock(sk);
1085 timeo = schedule_timeout(timeo);
1086 lock_sock(sk);
1087 set_current_state(TASK_INTERRUPTIBLE);
1088
1089 err = sock_error(sk);
1090 if (err)
1091 break;
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001092
Dean Jenkinse432c722015-06-23 17:59:39 +01001093 if (time_after(jiffies, timeout)) {
1094 err = -ENOLINK;
1095 break;
1096 }
1097
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001098 } while (chan->unacked_frames > 0 &&
1099 chan->state == BT_CONNECTED);
1100
Gustavo Padovandc253062013-10-15 19:24:49 -03001101 set_current_state(TASK_RUNNING);
1102 remove_wait_queue(sk_sleep(sk), &wait);
1103 return err;
1104}
1105
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001106static int l2cap_sock_shutdown(struct socket *sock, int how)
1107{
1108 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001109 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001110 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001111 int err = 0;
1112
1113 BT_DBG("sock %p, sk %p", sock, sk);
1114
1115 if (!sk)
1116 return 0;
1117
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001118 lock_sock(sk);
1119
Dean Jenkinse7456432015-10-14 12:18:45 +02001120 if (sk->sk_shutdown)
1121 goto shutdown_already;
1122
1123 BT_DBG("Handling sock shutdown");
1124
Dean Jenkins2baea852015-06-23 17:59:32 +01001125 /* prevent sk structure from being freed whilst unlocked */
1126 sock_hold(sk);
1127
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001128 chan = l2cap_pi(sk)->chan;
Dean Jenkins2baea852015-06-23 17:59:32 +01001129 /* prevent chan structure from being freed whilst unlocked */
1130 l2cap_chan_hold(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001131
Johan Hedberg49d11742014-11-13 14:37:50 +02001132 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1133
Dean Jenkinse7456432015-10-14 12:18:45 +02001134 if (chan->mode == L2CAP_MODE_ERTM &&
1135 chan->unacked_frames > 0 &&
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001136 chan->state == BT_CONNECTED) {
Dean Jenkinse7456432015-10-14 12:18:45 +02001137 err = __l2cap_wait_ack(sk, chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001138
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001139 /* After waiting for ACKs, check whether shutdown
1140 * has already been actioned to close the L2CAP
1141 * link such as by l2cap_disconnection_req().
1142 */
1143 if (sk->sk_shutdown)
1144 goto has_shutdown;
1145 }
1146
Dean Jenkinse7456432015-10-14 12:18:45 +02001147 sk->sk_shutdown = SHUTDOWN_MASK;
Dean Jenkinse7456432015-10-14 12:18:45 +02001148 release_sock(sk);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001149
1150 l2cap_chan_lock(chan);
1151 conn = chan->conn;
1152 if (conn)
1153 /* prevent conn structure from being freed */
1154 l2cap_conn_get(conn);
1155 l2cap_chan_unlock(chan);
1156
1157 if (conn)
1158 /* mutex lock must be taken before l2cap_chan_lock() */
1159 mutex_lock(&conn->chan_lock);
1160
1161 l2cap_chan_lock(chan);
Dean Jenkinse7456432015-10-14 12:18:45 +02001162 l2cap_chan_close(chan, 0);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001163 l2cap_chan_unlock(chan);
1164
1165 if (conn) {
1166 mutex_unlock(&conn->chan_lock);
1167 l2cap_conn_put(conn);
1168 }
1169
Dean Jenkinse7456432015-10-14 12:18:45 +02001170 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001171
Dean Jenkinse7456432015-10-14 12:18:45 +02001172 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1173 !(current->flags & PF_EXITING))
1174 err = bt_sock_wait_state(sk, BT_CLOSED,
1175 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001176
Dean Jenkins9f7378a92015-10-14 12:18:47 +02001177has_shutdown:
Dean Jenkins2baea852015-06-23 17:59:32 +01001178 l2cap_chan_put(chan);
1179 sock_put(sk);
1180
Dean Jenkinse7456432015-10-14 12:18:45 +02001181shutdown_already:
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001182 if (!err && sk->sk_err)
1183 err = -sk->sk_err;
1184
1185 release_sock(sk);
1186
1187 BT_DBG("Sock shutdown complete err: %d", err);
Dean Jenkins451e4c62015-06-23 17:59:37 +01001188
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001189 return err;
1190}
1191
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001192static int l2cap_sock_release(struct socket *sock)
1193{
1194 struct sock *sk = sock->sk;
1195 int err;
1196
1197 BT_DBG("sock %p, sk %p", sock, sk);
1198
1199 if (!sk)
1200 return 0;
1201
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001202 bt_sock_unlink(&l2cap_sk_list, sk);
1203
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001204 err = l2cap_sock_shutdown(sock, 2);
1205
1206 sock_orphan(sk);
1207 l2cap_sock_kill(sk);
1208 return err;
1209}
1210
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001211static void l2cap_sock_cleanup_listen(struct sock *parent)
1212{
1213 struct sock *sk;
1214
Johan Hedberg49d11742014-11-13 14:37:50 +02001215 BT_DBG("parent %p state %s", parent,
1216 state_to_string(parent->sk_state));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001217
1218 /* Close not yet accepted channels */
1219 while ((sk = bt_accept_dequeue(parent, NULL))) {
1220 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1221
Johan Hedberg49d11742014-11-13 14:37:50 +02001222 BT_DBG("child chan %p state %s", chan,
1223 state_to_string(chan->state));
1224
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001225 l2cap_chan_lock(chan);
1226 __clear_chan_timer(chan);
1227 l2cap_chan_close(chan, ECONNRESET);
1228 l2cap_chan_unlock(chan);
1229
1230 l2cap_sock_kill(sk);
1231 }
1232}
1233
Gustavo Padovan80b98022012-05-27 22:27:51 -03001234static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001235{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001236 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001237
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001238 lock_sock(parent);
1239
Gustavo Padovan53826692012-05-27 22:27:55 -03001240 /* Check for backlog size */
1241 if (sk_acceptq_is_full(parent)) {
1242 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001243 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001244 return NULL;
1245 }
1246
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001247 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001248 GFP_ATOMIC, 0);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001249 if (!sk) {
1250 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001251 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001252 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001253
Octavian Purdilad22015a2012-01-22 00:28:34 +02001254 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1255
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001256 l2cap_sock_init(sk, parent);
1257
Matthias Kaehlckec4f56272019-01-02 16:11:20 -08001258 bt_accept_enqueue(parent, sk, false);
Gustavo Padovan644912e2012-10-12 19:35:23 +08001259
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001260 release_sock(parent);
1261
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001262 return l2cap_pi(sk)->chan;
1263}
1264
Gustavo Padovan80b98022012-05-27 22:27:51 -03001265static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001266{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001267 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001268 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001269
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001270 lock_sock(sk);
1271
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001272 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001273 err = -ENOMEM;
1274 goto done;
1275 }
Mat Martineaue3281402011-07-07 09:39:02 -07001276
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001277 if (chan->mode != L2CAP_MODE_ERTM &&
1278 chan->mode != L2CAP_MODE_STREAMING) {
1279 /* Even if no filter is attached, we could potentially
1280 * get errors from security modules, etc.
1281 */
1282 err = sk_filter(sk, skb);
1283 if (err)
1284 goto done;
1285 }
1286
1287 err = __sock_queue_rcv_skb(sk, skb);
Mat Martineaue3281402011-07-07 09:39:02 -07001288
1289 /* For ERTM, handle one skb that doesn't fit into the recv
1290 * buffer. This is important to do because the data frames
1291 * have already been acked, so the skb cannot be discarded.
1292 *
1293 * Notify the l2cap core that the buffer is full, so the
1294 * LOCAL_BUSY state is entered and no more frames are
1295 * acked and reassembled until there is buffer space
1296 * available.
1297 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001298 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1299 l2cap_pi(sk)->rx_busy_skb = skb;
1300 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001301 err = 0;
1302 }
1303
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001304done:
1305 release_sock(sk);
1306
Mat Martineaue3281402011-07-07 09:39:02 -07001307 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001308}
1309
Gustavo Padovan80b98022012-05-27 22:27:51 -03001310static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001311{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001312 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001313
1314 l2cap_sock_kill(sk);
1315}
1316
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001317static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1318{
1319 struct sock *sk = chan->data;
1320 struct sock *parent;
1321
Johan Hedberg49d11742014-11-13 14:37:50 +02001322 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1323
Johan Hedberg3b2ab392014-11-12 22:22:22 +02001324 /* This callback can be called both for server (BT_LISTEN)
1325 * sockets as well as "normal" ones. To avoid lockdep warnings
1326 * with child socket locking (through l2cap_sock_cleanup_listen)
1327 * we need separation into separate nesting levels. The simplest
1328 * way to accomplish this is to inherit the nesting level used
1329 * for the channel.
1330 */
1331 lock_sock_nested(sk, atomic_read(&chan->nesting));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001332
1333 parent = bt_sk(sk)->parent;
1334
1335 sock_set_flag(sk, SOCK_ZAPPED);
1336
1337 switch (chan->state) {
1338 case BT_OPEN:
1339 case BT_BOUND:
1340 case BT_CLOSED:
1341 break;
1342 case BT_LISTEN:
1343 l2cap_sock_cleanup_listen(sk);
1344 sk->sk_state = BT_CLOSED;
1345 chan->state = BT_CLOSED;
1346
1347 break;
1348 default:
1349 sk->sk_state = BT_CLOSED;
1350 chan->state = BT_CLOSED;
1351
1352 sk->sk_err = err;
1353
1354 if (parent) {
1355 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001356 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001357 } else {
1358 sk->sk_state_change(sk);
1359 }
1360
1361 break;
1362 }
1363
1364 release_sock(sk);
1365}
1366
Gustavo Padovan53f52122013-10-15 19:24:45 -03001367static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1368 int err)
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001369{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001370 struct sock *sk = chan->data;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001371
1372 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001373
1374 if (err)
1375 sk->sk_err = err;
Gustavo F. Padovan89bc500e2011-06-03 00:19:47 -03001376}
1377
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001378static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001379 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001380 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001381{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001382 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001383 struct sk_buff *skb;
1384 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001385
Mat Martineaua6a55682012-05-04 14:20:31 -07001386 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001387 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001388 l2cap_chan_lock(chan);
1389
Gustavo Padovan90338942012-04-06 20:15:47 -03001390 if (!skb)
1391 return ERR_PTR(err);
1392
Marcel Holtmann8d463212014-06-05 15:22:51 +02001393 skb->priority = sk->sk_priority;
1394
Johan Hedberga4368ff2015-03-30 23:21:01 +03001395 bt_cb(skb)->l2cap.chan = chan;
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001396
Gustavo Padovan90338942012-04-06 20:15:47 -03001397 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001398}
1399
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001400static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1401{
1402 struct sock *sk = chan->data;
1403 struct sock *parent;
1404
1405 lock_sock(sk);
1406
1407 parent = bt_sk(sk)->parent;
1408
1409 BT_DBG("sk %p, parent %p", sk, parent);
1410
1411 sk->sk_state = BT_CONNECTED;
1412 sk->sk_state_change(sk);
1413
1414 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001415 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001416
1417 release_sock(sk);
1418}
1419
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001420static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1421{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001422 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001423
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001424 lock_sock(sk);
1425
1426 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001427 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001428 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001429
1430 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001431}
1432
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001433static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1434{
1435 struct sock *sk = chan->data;
1436
Johan Hedbergd52deb12014-08-07 22:56:44 +03001437 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1438 sk->sk_state = BT_CONNECTED;
1439 chan->state = BT_CONNECTED;
1440 }
1441
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001442 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1443 sk->sk_state_change(sk);
1444}
1445
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001446static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1447{
1448 struct sock *sk = chan->data;
1449
1450 lock_sock(sk);
1451 sk->sk_shutdown = SHUTDOWN_MASK;
1452 release_sock(sk);
1453}
1454
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001455static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1456{
1457 struct sock *sk = chan->data;
1458
1459 return sk->sk_sndtimeo;
1460}
1461
Johan Hedberg837776f2013-10-15 11:03:18 +03001462static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1463{
1464 struct sock *sk = chan->data;
1465
1466 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1467 sk->sk_state_change(sk);
1468}
1469
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001470static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001471 .name = "L2CAP Socket Interface",
1472 .new_connection = l2cap_sock_new_connection_cb,
1473 .recv = l2cap_sock_recv_cb,
1474 .close = l2cap_sock_close_cb,
1475 .teardown = l2cap_sock_teardown_cb,
1476 .state_change = l2cap_sock_state_change_cb,
1477 .ready = l2cap_sock_ready_cb,
1478 .defer = l2cap_sock_defer_cb,
1479 .resume = l2cap_sock_resume_cb,
1480 .suspend = l2cap_sock_suspend_cb,
1481 .set_shutdown = l2cap_sock_set_shutdown_cb,
1482 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1483 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001484};
1485
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001486static void l2cap_sock_destruct(struct sock *sk)
1487{
1488 BT_DBG("sk %p", sk);
1489
Sasha Levin23d3a862012-10-08 16:48:32 -04001490 if (l2cap_pi(sk)->chan)
1491 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001492
Mat Martineaue3281402011-07-07 09:39:02 -07001493 if (l2cap_pi(sk)->rx_busy_skb) {
1494 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1495 l2cap_pi(sk)->rx_busy_skb = NULL;
1496 }
1497
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001498 skb_queue_purge(&sk->sk_receive_queue);
1499 skb_queue_purge(&sk->sk_write_queue);
1500}
1501
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001502static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1503 int *msg_namelen)
1504{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001505 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001506
1507 memset(la, 0, sizeof(struct sockaddr_l2));
1508 la->l2_family = AF_BLUETOOTH;
Johan Hedberga4368ff2015-03-30 23:21:01 +03001509 la->l2_psm = bt_cb(skb)->l2cap.psm;
1510 bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001511
1512 *msg_namelen = sizeof(struct sockaddr_l2);
1513}
1514
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001515static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001516{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001517 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001518
1519 BT_DBG("sk %p", sk);
1520
1521 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001522 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1523
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001524 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001525 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001526
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001527 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001528 chan->imtu = pchan->imtu;
1529 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001530 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001531 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001532 chan->fcs = pchan->fcs;
1533 chan->max_tx = pchan->max_tx;
1534 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001535 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001536 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001537 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001538 chan->tx_credits = pchan->tx_credits;
1539 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001540
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001541 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1542 chan->scid = pchan->scid;
1543 chan->dcid = pchan->scid;
1544 }
1545
Paul Moore6230c9b2011-10-07 09:40:59 +00001546 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001547 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001548 switch (sk->sk_type) {
1549 case SOCK_RAW:
1550 chan->chan_type = L2CAP_CHAN_RAW;
1551 break;
1552 case SOCK_DGRAM:
1553 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001554 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001555 break;
1556 case SOCK_SEQPACKET:
1557 case SOCK_STREAM:
1558 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1559 break;
1560 }
1561
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001562 chan->imtu = L2CAP_DEFAULT_MTU;
1563 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001564 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001565 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001566 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001567 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001568 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001569 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001570
1571 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001572 }
1573
1574 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001575 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001576
1577 chan->data = sk;
1578 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001579}
1580
1581static struct proto l2cap_proto = {
1582 .name = "L2CAP",
1583 .owner = THIS_MODULE,
1584 .obj_size = sizeof(struct l2cap_pinfo)
1585};
1586
Gustavo Padovan2d792812012-10-06 10:07:01 +01001587static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001588 int proto, gfp_t prio, int kern)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001589{
1590 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001591 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001592
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001593 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001594 if (!sk)
1595 return NULL;
1596
1597 sock_init_data(sock, sk);
1598 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1599
1600 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001601 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001602
1603 sock_reset_flag(sk, SOCK_ZAPPED);
1604
1605 sk->sk_protocol = proto;
1606 sk->sk_state = BT_OPEN;
1607
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001608 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001609 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301610 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001611 return NULL;
1612 }
1613
Mat Martineau61d6ef32012-04-27 16:50:50 -07001614 l2cap_chan_hold(chan);
1615
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001616 l2cap_pi(sk)->chan = chan;
1617
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001618 return sk;
1619}
1620
1621static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1622 int kern)
1623{
1624 struct sock *sk;
1625
1626 BT_DBG("sock %p", sock);
1627
1628 sock->state = SS_UNCONNECTED;
1629
1630 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001631 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001632 return -ESOCKTNOSUPPORT;
1633
1634 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1635 return -EPERM;
1636
1637 sock->ops = &l2cap_sock_ops;
1638
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001639 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001640 if (!sk)
1641 return -ENOMEM;
1642
1643 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001644 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001645 return 0;
1646}
1647
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001648static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001649 .family = PF_BLUETOOTH,
1650 .owner = THIS_MODULE,
1651 .release = l2cap_sock_release,
1652 .bind = l2cap_sock_bind,
1653 .connect = l2cap_sock_connect,
1654 .listen = l2cap_sock_listen,
1655 .accept = l2cap_sock_accept,
1656 .getname = l2cap_sock_getname,
1657 .sendmsg = l2cap_sock_sendmsg,
1658 .recvmsg = l2cap_sock_recvmsg,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07001659 .poll = bt_sock_poll,
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001660 .ioctl = bt_sock_ioctl,
Arnd Bergmannc7cbdbf2019-04-17 22:51:48 +02001661 .gettstamp = sock_gettstamp,
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001662 .mmap = sock_no_mmap,
1663 .socketpair = sock_no_socketpair,
1664 .shutdown = l2cap_sock_shutdown,
1665 .setsockopt = l2cap_sock_setsockopt,
1666 .getsockopt = l2cap_sock_getsockopt
1667};
1668
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001669static const struct net_proto_family l2cap_sock_family_ops = {
1670 .family = PF_BLUETOOTH,
1671 .owner = THIS_MODULE,
1672 .create = l2cap_sock_create,
1673};
1674
1675int __init l2cap_init_sockets(void)
1676{
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001677 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001678
Marcel Holtmanndd625552015-01-11 15:18:19 -08001679 BUILD_BUG_ON(sizeof(struct sockaddr_l2) > sizeof(struct sockaddr));
1680
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001681 err = proto_register(&l2cap_proto, 0);
1682 if (err < 0)
1683 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001684
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001685 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001686 if (err < 0) {
1687 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001688 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001689 }
1690
Al Virob0316612013-04-04 19:14:33 -04001691 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001692 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001693 if (err < 0) {
1694 BT_ERR("Failed to create L2CAP proc file");
1695 bt_sock_unregister(BTPROTO_L2CAP);
1696 goto error;
1697 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001698
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001699 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001700
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001701 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001702
1703error:
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001704 proto_unregister(&l2cap_proto);
1705 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001706}
1707
1708void l2cap_cleanup_sockets(void)
1709{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001710 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001711 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca42011-02-17 19:16:55 -03001712 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001713}