blob: a47430d843dcf1a1356f6c20c81345f21a84918c [file] [log] [blame]
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
5 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007
8 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License version 2 as
12 published by the Free Software Foundation;
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
17 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
18 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
24 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
25 SOFTWARE IS DISCLAIMED.
26*/
27
28/* Bluetooth L2CAP sockets. */
29
Johan Hedberg91497612013-12-02 11:20:20 +020030#include <linux/module.h>
Paul Gortmakerbc3b2d72011-07-15 11:47:34 -040031#include <linux/export.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000032
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020033#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020034#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020035#include <net/bluetooth/l2cap.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070036
37#include "smp.h"
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020038
Masatake YAMATO5b28d952012-07-26 01:29:25 +090039static struct bt_sock_list l2cap_sk_list = {
40 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
41};
42
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030043static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030044static void l2cap_sock_init(struct sock *sk, struct sock *parent);
Gustavo Padovan2d792812012-10-06 10:07:01 +010045static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -050046 int proto, gfp_t prio, int kern);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030047
David Herrmannb3916db2013-04-05 14:57:34 +020048bool l2cap_is_socket(struct socket *sock)
49{
50 return sock && sock->ops == &l2cap_sock_ops;
51}
52EXPORT_SYMBOL(l2cap_is_socket);
53
Johan Hedberg49460962013-10-08 13:55:46 +020054static int l2cap_validate_bredr_psm(u16 psm)
55{
56 /* PSM must be odd and lsb of upper byte must be 0 */
57 if ((psm & 0x0101) != 0x0001)
58 return -EINVAL;
59
60 /* Restrict usage of well-known PSMs */
Johan Hedberg114f9f12016-01-26 17:19:09 -050061 if (psm < L2CAP_PSM_DYN_START && !capable(CAP_NET_BIND_SERVICE))
Johan Hedberg49460962013-10-08 13:55:46 +020062 return -EACCES;
63
64 return 0;
65}
66
67static int l2cap_validate_le_psm(u16 psm)
68{
69 /* Valid LE_PSM ranges are defined only until 0x00ff */
Johan Hedberg114f9f12016-01-26 17:19:09 -050070 if (psm > L2CAP_PSM_LE_DYN_END)
Johan Hedberg49460962013-10-08 13:55:46 +020071 return -EINVAL;
72
73 /* Restrict fixed, SIG assigned PSM values to CAP_NET_BIND_SERVICE */
Johan Hedberg114f9f12016-01-26 17:19:09 -050074 if (psm < L2CAP_PSM_LE_DYN_START && !capable(CAP_NET_BIND_SERVICE))
Johan Hedberg49460962013-10-08 13:55:46 +020075 return -EACCES;
76
77 return 0;
78}
79
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020080static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
81{
82 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030083 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020084 struct sockaddr_l2 la;
85 int len, err = 0;
86
87 BT_DBG("sk %p", sk);
88
89 if (!addr || addr->sa_family != AF_BLUETOOTH)
90 return -EINVAL;
91
92 memset(&la, 0, sizeof(la));
93 len = min_t(unsigned int, sizeof(la), alen);
94 memcpy(&la, addr, len);
95
Ville Tervob62f3282011-02-10 22:38:50 -030096 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020097 return -EINVAL;
98
Johan Hedberg80c1a2e2013-10-14 21:17:52 +030099 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
100 return -EINVAL;
101
Johan Hedbergbfe46552013-10-16 17:13:26 +0300102 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300103 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200104 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700105 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300106 return -EINVAL;
107 }
108
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200109 lock_sock(sk);
110
111 if (sk->sk_state != BT_OPEN) {
112 err = -EBADFD;
113 goto done;
114 }
115
116 if (la.l2_psm) {
117 __u16 psm = __le16_to_cpu(la.l2_psm);
118
Johan Hedberg49460962013-10-08 13:55:46 +0200119 if (la.l2_bdaddr_type == BDADDR_BREDR)
120 err = l2cap_validate_bredr_psm(psm);
121 else
122 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200123
Johan Hedberg49460962013-10-08 13:55:46 +0200124 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200125 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200126 }
127
Johan Hedberga2342c52016-01-26 17:19:11 -0500128 bacpy(&chan->src, &la.l2_bdaddr);
129 chan->src_type = la.l2_bdaddr_type;
130
Ville Tervob62f3282011-02-10 22:38:50 -0300131 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530132 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300133 else
134 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300135
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300136 if (err < 0)
137 goto done;
138
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700139 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700140 case L2CAP_CHAN_CONN_LESS:
141 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
142 chan->sec_level = BT_SECURITY_SDP;
143 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700144 case L2CAP_CHAN_CONN_ORIENTED:
145 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
146 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
147 chan->sec_level = BT_SECURITY_SDP;
148 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200149 case L2CAP_CHAN_RAW:
150 chan->sec_level = BT_SECURITY_SDP;
151 break;
Johan Hedbergc16900c2014-08-15 21:17:06 +0300152 case L2CAP_CHAN_FIXED:
153 /* Fixed channels default to the L2CAP core not holding a
154 * hci_conn reference for them. For fixed channels mapping to
155 * L2CAP sockets we do want to hold a reference so set the
156 * appropriate flag to request it.
157 */
158 set_bit(FLAG_HOLD_HCI_CONN, &chan->flags);
159 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700160 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300161
Johan Hedberg38319712013-05-17 12:49:23 +0300162 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200163 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300164
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300165 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300166 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200167
168done:
169 release_sock(sk);
170 return err;
171}
172
Gustavo Padovan2d792812012-10-06 10:07:01 +0100173static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
174 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200175{
176 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300177 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200178 struct sockaddr_l2 la;
179 int len, err = 0;
180
181 BT_DBG("sk %p", sk);
182
183 if (!addr || alen < sizeof(addr->sa_family) ||
184 addr->sa_family != AF_BLUETOOTH)
185 return -EINVAL;
186
187 memset(&la, 0, sizeof(la));
188 len = min_t(unsigned int, sizeof(la), alen);
189 memcpy(&la, addr, len);
190
Ville Tervoacd7d372011-02-10 22:38:49 -0300191 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200192 return -EINVAL;
193
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300194 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
195 return -EINVAL;
196
Johan Hedbergeb622492013-10-18 11:49:25 +0300197 /* Check that the socket wasn't bound to something that
198 * conflicts with the address given to connect(). If chan->src
199 * is BDADDR_ANY it means bind() was never used, in which case
200 * chan->src_type and la.l2_bdaddr_type do not need to match.
201 */
202 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
203 bdaddr_type_is_le(la.l2_bdaddr_type)) {
204 /* Old user space versions will try to incorrectly bind
205 * the ATT socket using BDADDR_BREDR. We need to accept
206 * this and fix up the source address type only when
207 * both the source CID and destination CID indicate
208 * ATT. Anything else is an invalid combination.
209 */
210 if (chan->scid != L2CAP_CID_ATT ||
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700211 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergeb622492013-10-18 11:49:25 +0300212 return -EINVAL;
213
214 /* We don't have the hdev available here to make a
215 * better decision on random vs public, but since all
216 * user space versions that exhibit this issue anyway do
217 * not support random local addresses assuming public
218 * here is good enough.
219 */
220 chan->src_type = BDADDR_LE_PUBLIC;
221 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300222
223 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
224 return -EINVAL;
225
Johan Hedbergbfe46552013-10-16 17:13:26 +0300226 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedbergbfe46552013-10-16 17:13:26 +0300227 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200228 if (la.l2_cid &&
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700229 la.l2_cid != cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300230 return -EINVAL;
231 }
232
Johan Hedberg38319712013-05-17 12:49:23 +0300233 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200234 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300235
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530236 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300237 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200238 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200239 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200240
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200241 lock_sock(sk);
242
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200243 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100244 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200245
246 release_sock(sk);
247
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200248 return err;
249}
250
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200251static int l2cap_sock_listen(struct socket *sock, int backlog)
252{
253 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300254 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200255 int err = 0;
256
257 BT_DBG("sk %p backlog %d", sk, backlog);
258
259 lock_sock(sk);
260
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200261 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200262 err = -EBADFD;
263 goto done;
264 }
265
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200266 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
267 err = -EINVAL;
268 goto done;
269 }
270
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300271 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200272 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300273 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200274 break;
275 case L2CAP_MODE_ERTM:
276 case L2CAP_MODE_STREAMING:
277 if (!disable_ertm)
278 break;
279 /* fall through */
280 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +0300281 err = -EOPNOTSUPP;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200282 goto done;
283 }
284
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200285 sk->sk_max_ack_backlog = backlog;
286 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300287
Johan Hedbergabe84902014-11-12 22:22:21 +0200288 /* Listening channels need to use nested locking in order not to
289 * cause lockdep warnings when the created child channels end up
290 * being locked in the same thread as the parent channel.
291 */
292 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
293
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300294 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200295 sk->sk_state = BT_LISTEN;
296
297done:
298 release_sock(sk);
299 return err;
300}
301
Gustavo Padovan2d792812012-10-06 10:07:01 +0100302static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
303 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200304{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500305 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200306 struct sock *sk = sock->sk, *nsk;
307 long timeo;
308 int err = 0;
309
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200310 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200311
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200312 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
313
314 BT_DBG("sk %p timeo %ld", sk, timeo);
315
316 /* Wait for an incoming connection. (wake-one). */
317 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400318 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200319 if (sk->sk_state != BT_LISTEN) {
320 err = -EBADFD;
321 break;
322 }
323
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400324 nsk = bt_accept_dequeue(sk, newsock);
325 if (nsk)
326 break;
327
328 if (!timeo) {
329 err = -EAGAIN;
330 break;
331 }
332
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200333 if (signal_pending(current)) {
334 err = sock_intr_errno(timeo);
335 break;
336 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400337
338 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500339
340 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
341
Johan Hedberg3b2ab392014-11-12 22:22:22 +0200342 lock_sock_nested(sk, L2CAP_NESTING_PARENT);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200343 }
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200344 remove_wait_queue(sk_sleep(sk), &wait);
345
346 if (err)
347 goto done;
348
349 newsock->state = SS_CONNECTED;
350
351 BT_DBG("new socket %p", nsk);
352
353done:
354 release_sock(sk);
355 return err;
356}
357
Gustavo Padovan2d792812012-10-06 10:07:01 +0100358static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
359 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200360{
361 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
362 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300363 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200364
365 BT_DBG("sock %p, sk %p", sock, sk);
366
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200367 if (peer && sk->sk_state != BT_CONNECTED &&
Johan Hedbergbf19d512014-07-01 12:07:23 +0300368 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 &&
369 sk->sk_state != BT_CONFIG)
Johan Hedbergb783fbc2014-01-28 15:16:49 -0800370 return -ENOTCONN;
371
Mathias Krause792039c2012-08-15 11:31:51 +0000372 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200373 addr->sa_family = AF_BLUETOOTH;
374 *len = sizeof(struct sockaddr_l2);
375
Johan Hedbergd7e5e762014-01-28 15:16:51 -0800376 la->l2_psm = chan->psm;
377
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200378 if (peer) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700379 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300380 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700381 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200382 } else {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700383 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300384 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700385 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200386 }
387
388 return 0;
389}
390
Gustavo Padovan2d792812012-10-06 10:07:01 +0100391static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
392 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200393{
394 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300395 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200396 struct l2cap_options opts;
397 struct l2cap_conninfo cinfo;
398 int len, err = 0;
399 u32 opt;
400
401 BT_DBG("sk %p", sk);
402
403 if (get_user(len, optlen))
404 return -EFAULT;
405
406 lock_sock(sk);
407
408 switch (optname) {
409 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200410 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
411 * legacy ATT code depends on getsockopt for
412 * L2CAP_OPTIONS we need to let this pass.
413 */
414 if (bdaddr_type_is_le(chan->src_type) &&
415 chan->scid != L2CAP_CID_ATT) {
416 err = -EINVAL;
417 break;
418 }
419
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300420 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300421 opts.imtu = chan->imtu;
422 opts.omtu = chan->omtu;
423 opts.flush_to = chan->flush_to;
424 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300425 opts.fcs = chan->fcs;
426 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300427 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200428
429 len = min_t(unsigned int, len, sizeof(opts));
430 if (copy_to_user(optval, (char *) &opts, len))
431 err = -EFAULT;
432
433 break;
434
435 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300436 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200437 case BT_SECURITY_LOW:
438 opt = L2CAP_LM_AUTH;
439 break;
440 case BT_SECURITY_MEDIUM:
441 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
442 break;
443 case BT_SECURITY_HIGH:
444 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100445 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200446 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800447 case BT_SECURITY_FIPS:
448 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
449 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
450 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200451 default:
452 opt = 0;
453 break;
454 }
455
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300456 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200457 opt |= L2CAP_LM_MASTER;
458
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300459 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200460 opt |= L2CAP_LM_RELIABLE;
461
462 if (put_user(opt, (u32 __user *) optval))
463 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800464
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200465 break;
466
467 case L2CAP_CONNINFO:
468 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300469 !(sk->sk_state == BT_CONNECT2 &&
470 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200471 err = -ENOTCONN;
472 break;
473 }
474
Filip Palian8d03e972011-05-12 19:32:46 +0200475 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300476 cinfo.hci_handle = chan->conn->hcon->handle;
477 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200478
479 len = min_t(unsigned int, len, sizeof(cinfo));
480 if (copy_to_user(optval, (char *) &cinfo, len))
481 err = -EFAULT;
482
483 break;
484
485 default:
486 err = -ENOPROTOOPT;
487 break;
488 }
489
490 release_sock(sk);
491 return err;
492}
493
Gustavo Padovan2d792812012-10-06 10:07:01 +0100494static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
495 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200496{
497 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300498 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200499 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700500 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200501 int len, err = 0;
502
503 BT_DBG("sk %p", sk);
504
505 if (level == SOL_L2CAP)
506 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
507
508 if (level != SOL_BLUETOOTH)
509 return -ENOPROTOOPT;
510
511 if (get_user(len, optlen))
512 return -EFAULT;
513
514 lock_sock(sk);
515
516 switch (optname) {
517 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300518 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500519 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100520 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200521 err = -EINVAL;
522 break;
523 }
524
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300525 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300526 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300527 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200528
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300529 if (sk->sk_state == BT_CONNECTED)
530 sec.key_size = chan->conn->hcon->enc_key_size;
531 } else {
532 sec.level = chan->sec_level;
533 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300534
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200535 len = min_t(unsigned int, len, sizeof(sec));
536 if (copy_to_user(optval, (char *) &sec, len))
537 err = -EFAULT;
538
539 break;
540
541 case BT_DEFER_SETUP:
542 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
543 err = -EINVAL;
544 break;
545 }
546
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300547 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
548 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200549 err = -EFAULT;
550
551 break;
552
553 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300554 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100555 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200556 err = -EFAULT;
557
558 break;
559
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700560 case BT_POWER:
561 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100562 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700563 err = -EINVAL;
564 break;
565 }
566
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300567 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700568
569 len = min_t(unsigned int, len, sizeof(pwr));
570 if (copy_to_user(optval, (char *) &pwr, len))
571 err = -EFAULT;
572
573 break;
574
Mat Martineau2ea66482011-11-02 16:18:30 -0700575 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700576 if (put_user(chan->chan_policy, (u32 __user *) optval))
577 err = -EFAULT;
578 break;
579
Johan Hedberg1f435422013-12-02 16:34:18 +0200580 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200581 if (!bdaddr_type_is_le(chan->src_type)) {
582 err = -EINVAL;
583 break;
584 }
585
586 if (sk->sk_state != BT_CONNECTED) {
587 err = -ENOTCONN;
588 break;
589 }
590
591 if (put_user(chan->omtu, (u16 __user *) optval))
592 err = -EFAULT;
593 break;
594
595 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200596 if (!bdaddr_type_is_le(chan->src_type)) {
597 err = -EINVAL;
598 break;
599 }
600
601 if (put_user(chan->imtu, (u16 __user *) optval))
602 err = -EFAULT;
603 break;
604
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200605 default:
606 err = -ENOPROTOOPT;
607 break;
608 }
609
610 release_sock(sk);
611 return err;
612}
613
Andre Guedes682877c2012-05-31 17:01:34 -0300614static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
615{
616 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300617 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300618 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300619 return false;
620 break;
621
622 default:
623 if (mtu < L2CAP_DEFAULT_MIN_MTU)
624 return false;
625 }
626
627 return true;
628}
629
Gustavo Padovan2d792812012-10-06 10:07:01 +0100630static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
631 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200632{
633 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300634 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200635 struct l2cap_options opts;
636 int len, err = 0;
637 u32 opt;
638
639 BT_DBG("sk %p", sk);
640
641 lock_sock(sk);
642
643 switch (optname) {
644 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200645 if (bdaddr_type_is_le(chan->src_type)) {
646 err = -EINVAL;
647 break;
648 }
649
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200650 if (sk->sk_state == BT_CONNECTED) {
651 err = -EINVAL;
652 break;
653 }
654
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300655 opts.imtu = chan->imtu;
656 opts.omtu = chan->omtu;
657 opts.flush_to = chan->flush_to;
658 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300659 opts.fcs = chan->fcs;
660 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300661 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200662
663 len = min_t(unsigned int, sizeof(opts), optlen);
664 if (copy_from_user((char *) &opts, optval, len)) {
665 err = -EFAULT;
666 break;
667 }
668
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300669 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200670 err = -EINVAL;
671 break;
672 }
673
Andre Guedes682877c2012-05-31 17:01:34 -0300674 if (!l2cap_valid_mtu(chan, opts.imtu)) {
675 err = -EINVAL;
676 break;
677 }
678
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300679 chan->mode = opts.mode;
680 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +0300681 case L2CAP_MODE_LE_FLOWCTL:
682 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200683 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300684 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200685 break;
686 case L2CAP_MODE_ERTM:
687 case L2CAP_MODE_STREAMING:
688 if (!disable_ertm)
689 break;
690 /* fall through */
691 default:
692 err = -EINVAL;
693 break;
694 }
695
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300696 chan->imtu = opts.imtu;
697 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300698 chan->fcs = opts.fcs;
699 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300700 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300701 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200702 break;
703
704 case L2CAP_LM:
705 if (get_user(opt, (u32 __user *) optval)) {
706 err = -EFAULT;
707 break;
708 }
709
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800710 if (opt & L2CAP_LM_FIPS) {
711 err = -EINVAL;
712 break;
713 }
714
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200715 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300716 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200717 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300718 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200719 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300720 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200721
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300722 if (opt & L2CAP_LM_MASTER)
723 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
724 else
725 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300726
727 if (opt & L2CAP_LM_RELIABLE)
728 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
729 else
730 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200731 break;
732
733 default:
734 err = -ENOPROTOOPT;
735 break;
736 }
737
738 release_sock(sk);
739 return err;
740}
741
Gustavo Padovan2d792812012-10-06 10:07:01 +0100742static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
743 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200744{
745 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300746 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200747 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700748 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300749 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200750 int len, err = 0;
751 u32 opt;
752
753 BT_DBG("sk %p", sk);
754
755 if (level == SOL_L2CAP)
756 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
757
758 if (level != SOL_BLUETOOTH)
759 return -ENOPROTOOPT;
760
761 lock_sock(sk);
762
763 switch (optname) {
764 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300765 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500766 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100767 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200768 err = -EINVAL;
769 break;
770 }
771
772 sec.level = BT_SECURITY_LOW;
773
774 len = min_t(unsigned int, sizeof(sec), optlen);
775 if (copy_from_user((char *) &sec, optval, len)) {
776 err = -EFAULT;
777 break;
778 }
779
780 if (sec.level < BT_SECURITY_LOW ||
Patrik Flykta164cee2016-03-24 16:04:15 +0200781 sec.level > BT_SECURITY_FIPS) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200782 err = -EINVAL;
783 break;
784 }
785
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300786 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300787
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200788 if (!chan->conn)
789 break;
790
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300791 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200792
793 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300794 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300795 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300796 break;
Johan Hedbergd52deb12014-08-07 22:56:44 +0300797 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300798 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200799 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200800
Gustavo Padovana7d77232012-05-13 03:20:07 -0300801 /* or for ACL link */
802 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100803 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300804 sk->sk_state == BT_CONNECTED) {
Johan Hedberge7cafc42014-07-17 15:35:38 +0300805 if (!l2cap_chan_check_security(chan, true))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300806 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300807 else
808 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200809 } else {
810 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300811 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200812 break;
813
814 case BT_DEFER_SETUP:
815 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
816 err = -EINVAL;
817 break;
818 }
819
820 if (get_user(opt, (u32 __user *) optval)) {
821 err = -EFAULT;
822 break;
823 }
824
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700825 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300826 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700827 set_bit(FLAG_DEFER_SETUP, &chan->flags);
828 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300829 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700830 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
831 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200832 break;
833
834 case BT_FLUSHABLE:
835 if (get_user(opt, (u32 __user *) optval)) {
836 err = -EFAULT;
837 break;
838 }
839
840 if (opt > BT_FLUSHABLE_ON) {
841 err = -EINVAL;
842 break;
843 }
844
845 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200846 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300847 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200848 No Flush support in the LM */
849 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
850 err = -EINVAL;
851 break;
852 }
853 }
854
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300855 if (opt)
856 set_bit(FLAG_FLUSHABLE, &chan->flags);
857 else
858 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200859 break;
860
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700861 case BT_POWER:
862 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100863 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700864 err = -EINVAL;
865 break;
866 }
867
868 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
869
870 len = min_t(unsigned int, sizeof(pwr), optlen);
871 if (copy_from_user((char *) &pwr, optval, len)) {
872 err = -EFAULT;
873 break;
874 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300875
876 if (pwr.force_active)
877 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
878 else
879 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700880 break;
881
Mat Martineau2ea66482011-11-02 16:18:30 -0700882 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700883 if (get_user(opt, (u32 __user *) optval)) {
884 err = -EFAULT;
885 break;
886 }
887
888 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
889 err = -EINVAL;
890 break;
891 }
892
893 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100894 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700895 err = -EOPNOTSUPP;
896 break;
897 }
898
899 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700900
901 if (sk->sk_state == BT_CONNECTED &&
902 chan->move_role == L2CAP_MOVE_ROLE_NONE)
903 l2cap_move_start(chan);
904
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200905 break;
906
Johan Hedberg1f435422013-12-02 16:34:18 +0200907 case BT_SNDMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200908 if (!bdaddr_type_is_le(chan->src_type)) {
909 err = -EINVAL;
910 break;
911 }
912
913 /* Setting is not supported as it's the remote side that
914 * decides this.
915 */
916 err = -EPERM;
917 break;
918
919 case BT_RCVMTU:
Johan Hedberg1f435422013-12-02 16:34:18 +0200920 if (!bdaddr_type_is_le(chan->src_type)) {
921 err = -EINVAL;
922 break;
923 }
924
925 if (sk->sk_state == BT_CONNECTED) {
926 err = -EISCONN;
927 break;
928 }
929
Amadeusz Sławiński23bc6ab2016-07-14 10:50:23 +0200930 if (get_user(opt, (u16 __user *) optval)) {
Johan Hedberg1f435422013-12-02 16:34:18 +0200931 err = -EFAULT;
932 break;
933 }
934
935 chan->imtu = opt;
936 break;
937
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200938 default:
939 err = -ENOPROTOOPT;
940 break;
941 }
942
943 release_sock(sk);
944 return err;
945}
946
Ying Xue1b784142015-03-02 15:37:48 +0800947static int l2cap_sock_sendmsg(struct socket *sock, struct msghdr *msg,
948 size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200949{
950 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300951 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200952 int err;
953
954 BT_DBG("sock %p, sk %p", sock, sk);
955
956 err = sock_error(sk);
957 if (err)
958 return err;
959
960 if (msg->msg_flags & MSG_OOB)
961 return -EOPNOTSUPP;
962
Mat Martineaua6a55682012-05-04 14:20:31 -0700963 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300964 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200965
Johan Hedberge793dcf2013-09-16 13:05:19 +0300966 lock_sock(sk);
967 err = bt_sock_wait_ready(sk, msg->msg_flags);
968 release_sock(sk);
969 if (err)
970 return err;
971
Mat Martineaua6a55682012-05-04 14:20:31 -0700972 l2cap_chan_lock(chan);
Marcel Holtmann8d463212014-06-05 15:22:51 +0200973 err = l2cap_chan_send(chan, msg, len);
Mat Martineaua6a55682012-05-04 14:20:31 -0700974 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200975
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200976 return err;
977}
978
Ying Xue1b784142015-03-02 15:37:48 +0800979static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,
980 size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200981{
982 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700983 struct l2cap_pinfo *pi = l2cap_pi(sk);
984 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200985
986 lock_sock(sk);
987
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300988 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
989 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +0300990 if (bdaddr_type_is_le(pi->chan->src_type)) {
991 sk->sk_state = BT_CONNECTED;
992 pi->chan->state = BT_CONNECTED;
993 __l2cap_le_connect_rsp_defer(pi->chan);
994 } else {
995 sk->sk_state = BT_CONFIG;
996 pi->chan->state = BT_CONFIG;
997 __l2cap_connect_rsp_defer(pi->chan);
998 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300999
Johan Hedberg970871b2013-09-25 13:26:05 +03001000 err = 0;
1001 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001002 }
1003
1004 release_sock(sk);
1005
1006 if (sock->type == SOCK_STREAM)
Ying Xue1b784142015-03-02 15:37:48 +08001007 err = bt_sock_stream_recvmsg(sock, msg, len, flags);
Mat Martineaue3281402011-07-07 09:39:02 -07001008 else
Ying Xue1b784142015-03-02 15:37:48 +08001009 err = bt_sock_recvmsg(sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001010
Mat Martineaue3281402011-07-07 09:39:02 -07001011 if (pi->chan->mode != L2CAP_MODE_ERTM)
1012 return err;
1013
1014 /* Attempt to put pending rx data in the socket buffer */
1015
1016 lock_sock(sk);
1017
1018 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1019 goto done;
1020
1021 if (pi->rx_busy_skb) {
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001022 if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))
Mat Martineaue3281402011-07-07 09:39:02 -07001023 pi->rx_busy_skb = NULL;
1024 else
1025 goto done;
1026 }
1027
1028 /* Restore data flow when half of the receive buffer is
1029 * available. This avoids resending large numbers of
1030 * frames.
1031 */
1032 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1033 l2cap_chan_busy(pi->chan, 0);
1034
1035done:
1036 release_sock(sk);
1037 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001038}
1039
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001040/* Kill socket (only if zapped and orphan)
Manish Mandlikc6fed5f2020-01-28 10:54:14 -08001041 * Must be called on unlocked socket, with l2cap channel lock.
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001042 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001043static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001044{
1045 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1046 return;
1047
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001048 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001049
1050 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001051
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301052 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001053 sock_set_flag(sk, SOCK_DEAD);
1054 sock_put(sk);
1055}
1056
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001057static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
Gustavo Padovandc253062013-10-15 19:24:49 -03001058{
Gustavo Padovandc253062013-10-15 19:24:49 -03001059 DECLARE_WAITQUEUE(wait, current);
1060 int err = 0;
Dean Jenkinscb02a252015-06-23 17:59:38 +01001061 int timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Dean Jenkinse432c722015-06-23 17:59:39 +01001062 /* Timeout to prevent infinite loop */
1063 unsigned long timeout = jiffies + L2CAP_WAIT_ACK_TIMEOUT;
Gustavo Padovandc253062013-10-15 19:24:49 -03001064
1065 add_wait_queue(sk_sleep(sk), &wait);
1066 set_current_state(TASK_INTERRUPTIBLE);
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001067 do {
Dean Jenkinse432c722015-06-23 17:59:39 +01001068 BT_DBG("Waiting for %d ACKs, timeout %04d ms",
1069 chan->unacked_frames, time_after(jiffies, timeout) ? 0 :
1070 jiffies_to_msecs(timeout - jiffies));
Dean Jenkins451e4c62015-06-23 17:59:37 +01001071
Gustavo Padovandc253062013-10-15 19:24:49 -03001072 if (!timeo)
Dean Jenkinscb02a252015-06-23 17:59:38 +01001073 timeo = L2CAP_WAIT_ACK_POLL_PERIOD;
Gustavo Padovandc253062013-10-15 19:24:49 -03001074
1075 if (signal_pending(current)) {
1076 err = sock_intr_errno(timeo);
1077 break;
1078 }
1079
1080 release_sock(sk);
1081 timeo = schedule_timeout(timeo);
1082 lock_sock(sk);
1083 set_current_state(TASK_INTERRUPTIBLE);
1084
1085 err = sock_error(sk);
1086 if (err)
1087 break;
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001088
Dean Jenkinse432c722015-06-23 17:59:39 +01001089 if (time_after(jiffies, timeout)) {
1090 err = -ENOLINK;
1091 break;
1092 }
1093
Dean Jenkinsf65468f2015-06-23 17:59:33 +01001094 } while (chan->unacked_frames > 0 &&
1095 chan->state == BT_CONNECTED);
1096
Gustavo Padovandc253062013-10-15 19:24:49 -03001097 set_current_state(TASK_RUNNING);
1098 remove_wait_queue(sk_sleep(sk), &wait);
1099 return err;
1100}
1101
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001102static int l2cap_sock_shutdown(struct socket *sock, int how)
1103{
1104 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001105 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001106 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001107 int err = 0;
1108
1109 BT_DBG("sock %p, sk %p", sock, sk);
1110
1111 if (!sk)
1112 return 0;
1113
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001114 lock_sock(sk);
1115
Dean Jenkinse7456432015-10-14 12:18:45 +02001116 if (sk->sk_shutdown)
1117 goto shutdown_already;
1118
1119 BT_DBG("Handling sock shutdown");
1120
Dean Jenkins2baea852015-06-23 17:59:32 +01001121 /* prevent sk structure from being freed whilst unlocked */
1122 sock_hold(sk);
1123
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001124 chan = l2cap_pi(sk)->chan;
Dean Jenkins2baea852015-06-23 17:59:32 +01001125 /* prevent chan structure from being freed whilst unlocked */
1126 l2cap_chan_hold(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001127
Johan Hedberg49d11742014-11-13 14:37:50 +02001128 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1129
Dean Jenkinse7456432015-10-14 12:18:45 +02001130 if (chan->mode == L2CAP_MODE_ERTM &&
1131 chan->unacked_frames > 0 &&
Dean Jenkins9f7378a2015-10-14 12:18:47 +02001132 chan->state == BT_CONNECTED) {
Dean Jenkinse7456432015-10-14 12:18:45 +02001133 err = __l2cap_wait_ack(sk, chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001134
Dean Jenkins9f7378a2015-10-14 12:18:47 +02001135 /* After waiting for ACKs, check whether shutdown
1136 * has already been actioned to close the L2CAP
1137 * link such as by l2cap_disconnection_req().
1138 */
1139 if (sk->sk_shutdown)
1140 goto has_shutdown;
1141 }
1142
Dean Jenkinse7456432015-10-14 12:18:45 +02001143 sk->sk_shutdown = SHUTDOWN_MASK;
Dean Jenkinse7456432015-10-14 12:18:45 +02001144 release_sock(sk);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001145
1146 l2cap_chan_lock(chan);
1147 conn = chan->conn;
1148 if (conn)
1149 /* prevent conn structure from being freed */
1150 l2cap_conn_get(conn);
1151 l2cap_chan_unlock(chan);
1152
1153 if (conn)
1154 /* mutex lock must be taken before l2cap_chan_lock() */
1155 mutex_lock(&conn->chan_lock);
1156
1157 l2cap_chan_lock(chan);
Dean Jenkinse7456432015-10-14 12:18:45 +02001158 l2cap_chan_close(chan, 0);
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001159 l2cap_chan_unlock(chan);
1160
1161 if (conn) {
1162 mutex_unlock(&conn->chan_lock);
1163 l2cap_conn_put(conn);
1164 }
1165
Dean Jenkinse7456432015-10-14 12:18:45 +02001166 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001167
Dean Jenkinse7456432015-10-14 12:18:45 +02001168 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
1169 !(current->flags & PF_EXITING))
1170 err = bt_sock_wait_state(sk, BT_CLOSED,
1171 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001172
Dean Jenkins9f7378a2015-10-14 12:18:47 +02001173has_shutdown:
Dean Jenkins2baea852015-06-23 17:59:32 +01001174 l2cap_chan_put(chan);
1175 sock_put(sk);
1176
Dean Jenkinse7456432015-10-14 12:18:45 +02001177shutdown_already:
Dean Jenkins04ba72e2015-10-14 12:18:46 +02001178 if (!err && sk->sk_err)
1179 err = -sk->sk_err;
1180
1181 release_sock(sk);
1182
1183 BT_DBG("Sock shutdown complete err: %d", err);
Dean Jenkins451e4c62015-06-23 17:59:37 +01001184
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001185 return err;
1186}
1187
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001188static int l2cap_sock_release(struct socket *sock)
1189{
1190 struct sock *sk = sock->sk;
1191 int err;
Hillf Dantonf708f142020-02-05 10:31:59 +08001192 struct l2cap_chan *chan;
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001193
1194 BT_DBG("sock %p, sk %p", sock, sk);
1195
1196 if (!sk)
1197 return 0;
1198
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001199 bt_sock_unlink(&l2cap_sk_list, sk);
1200
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001201 err = l2cap_sock_shutdown(sock, 2);
Hillf Dantonf708f142020-02-05 10:31:59 +08001202 chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001203
Hillf Dantonf708f142020-02-05 10:31:59 +08001204 l2cap_chan_hold(chan);
1205 l2cap_chan_lock(chan);
Manish Mandlikc6fed5f2020-01-28 10:54:14 -08001206
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001207 sock_orphan(sk);
1208 l2cap_sock_kill(sk);
Manish Mandlikc6fed5f2020-01-28 10:54:14 -08001209
Hillf Dantonf708f142020-02-05 10:31:59 +08001210 l2cap_chan_unlock(chan);
1211 l2cap_chan_put(chan);
Manish Mandlikc6fed5f2020-01-28 10:54:14 -08001212
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001213 return err;
1214}
1215
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001216static void l2cap_sock_cleanup_listen(struct sock *parent)
1217{
1218 struct sock *sk;
1219
Johan Hedberg49d11742014-11-13 14:37:50 +02001220 BT_DBG("parent %p state %s", parent,
1221 state_to_string(parent->sk_state));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001222
1223 /* Close not yet accepted channels */
1224 while ((sk = bt_accept_dequeue(parent, NULL))) {
1225 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1226
Johan Hedberg49d11742014-11-13 14:37:50 +02001227 BT_DBG("child chan %p state %s", chan,
1228 state_to_string(chan->state));
1229
Manish Mandlikc6fed5f2020-01-28 10:54:14 -08001230 l2cap_chan_hold(chan);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001231 l2cap_chan_lock(chan);
Manish Mandlikc6fed5f2020-01-28 10:54:14 -08001232
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001233 __clear_chan_timer(chan);
1234 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001235 l2cap_sock_kill(sk);
Manish Mandlikc6fed5f2020-01-28 10:54:14 -08001236
1237 l2cap_chan_unlock(chan);
1238 l2cap_chan_put(chan);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001239 }
1240}
1241
Gustavo Padovan80b98022012-05-27 22:27:51 -03001242static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001243{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001244 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001245
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001246 lock_sock(parent);
1247
Gustavo Padovan53826692012-05-27 22:27:55 -03001248 /* Check for backlog size */
1249 if (sk_acceptq_is_full(parent)) {
1250 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001251 release_sock(parent);
Gustavo Padovan53826692012-05-27 22:27:55 -03001252 return NULL;
1253 }
1254
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001255 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001256 GFP_ATOMIC, 0);
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001257 if (!sk) {
1258 release_sock(parent);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001259 return NULL;
Jukka Taimisto8a96f3c2014-05-22 10:02:39 +00001260 }
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001261
Octavian Purdilad22015a2012-01-22 00:28:34 +02001262 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1263
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001264 l2cap_sock_init(sk, parent);
1265
Gustavo Padovan644912e2012-10-12 19:35:23 +08001266 bt_accept_enqueue(parent, sk);
1267
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001268 release_sock(parent);
1269
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001270 return l2cap_pi(sk)->chan;
1271}
1272
Gustavo Padovan80b98022012-05-27 22:27:51 -03001273static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001274{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001275 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001276 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001277
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001278 lock_sock(sk);
1279
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001280 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001281 err = -ENOMEM;
1282 goto done;
1283 }
Mat Martineaue3281402011-07-07 09:39:02 -07001284
Daniel Borkmanndbb50882016-07-27 11:40:14 -07001285 if (chan->mode != L2CAP_MODE_ERTM &&
1286 chan->mode != L2CAP_MODE_STREAMING) {
1287 /* Even if no filter is attached, we could potentially
1288 * get errors from security modules, etc.
1289 */
1290 err = sk_filter(sk, skb);
1291 if (err)
1292 goto done;
1293 }
1294
1295 err = __sock_queue_rcv_skb(sk, skb);
Mat Martineaue3281402011-07-07 09:39:02 -07001296
1297 /* For ERTM, handle one skb that doesn't fit into the recv
1298 * buffer. This is important to do because the data frames
1299 * have already been acked, so the skb cannot be discarded.
1300 *
1301 * Notify the l2cap core that the buffer is full, so the
1302 * LOCAL_BUSY state is entered and no more frames are
1303 * acked and reassembled until there is buffer space
1304 * available.
1305 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001306 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1307 l2cap_pi(sk)->rx_busy_skb = skb;
1308 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001309 err = 0;
1310 }
1311
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001312done:
1313 release_sock(sk);
1314
Mat Martineaue3281402011-07-07 09:39:02 -07001315 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001316}
1317
Gustavo Padovan80b98022012-05-27 22:27:51 -03001318static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001319{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001320 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001321
Wang ShaoBod19ea7d2021-08-31 17:35:37 -07001322 if (!sk)
1323 return;
1324
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001325 l2cap_sock_kill(sk);
1326}
1327
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001328static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1329{
1330 struct sock *sk = chan->data;
1331 struct sock *parent;
1332
Wang ShaoBod19ea7d2021-08-31 17:35:37 -07001333 if (!sk)
1334 return;
1335
Johan Hedberg49d11742014-11-13 14:37:50 +02001336 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
1337
Johan Hedberg3b2ab392014-11-12 22:22:22 +02001338 /* This callback can be called both for server (BT_LISTEN)
1339 * sockets as well as "normal" ones. To avoid lockdep warnings
1340 * with child socket locking (through l2cap_sock_cleanup_listen)
1341 * we need separation into separate nesting levels. The simplest
1342 * way to accomplish this is to inherit the nesting level used
1343 * for the channel.
1344 */
1345 lock_sock_nested(sk, atomic_read(&chan->nesting));
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001346
1347 parent = bt_sk(sk)->parent;
1348
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001349 switch (chan->state) {
1350 case BT_OPEN:
1351 case BT_BOUND:
1352 case BT_CLOSED:
1353 break;
1354 case BT_LISTEN:
1355 l2cap_sock_cleanup_listen(sk);
1356 sk->sk_state = BT_CLOSED;
1357 chan->state = BT_CLOSED;
1358
1359 break;
1360 default:
1361 sk->sk_state = BT_CLOSED;
1362 chan->state = BT_CLOSED;
1363
1364 sk->sk_err = err;
1365
1366 if (parent) {
1367 bt_accept_unlink(sk);
David S. Miller676d2362014-04-11 16:15:36 -04001368 parent->sk_data_ready(parent);
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001369 } else {
1370 sk->sk_state_change(sk);
1371 }
1372
1373 break;
1374 }
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001375 release_sock(sk);
Abhishek Pandit-Subedi13971db2020-09-11 15:33:18 -07001376
1377 /* Only zap after cleanup to avoid use after free race */
1378 sock_set_flag(sk, SOCK_ZAPPED);
1379
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001380}
1381
Gustavo Padovan53f52122013-10-15 19:24:45 -03001382static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1383 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001384{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001385 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001386
1387 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001388
1389 if (err)
1390 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001391}
1392
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001393static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001394 unsigned long hdr_len,
Gustavo Padovan90338942012-04-06 20:15:47 -03001395 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001396{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001397 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001398 struct sk_buff *skb;
1399 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001400
Mat Martineaua6a55682012-05-04 14:20:31 -07001401 l2cap_chan_unlock(chan);
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02001402 skb = bt_skb_send_alloc(sk, hdr_len + len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001403 l2cap_chan_lock(chan);
1404
Gustavo Padovan90338942012-04-06 20:15:47 -03001405 if (!skb)
1406 return ERR_PTR(err);
1407
Marcel Holtmann8d463212014-06-05 15:22:51 +02001408 skb->priority = sk->sk_priority;
1409
Johan Hedberga4368ff2015-03-30 23:21:01 +03001410 bt_cb(skb)->l2cap.chan = chan;
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001411
Gustavo Padovan90338942012-04-06 20:15:47 -03001412 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001413}
1414
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001415static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1416{
1417 struct sock *sk = chan->data;
1418 struct sock *parent;
1419
1420 lock_sock(sk);
1421
1422 parent = bt_sk(sk)->parent;
1423
1424 BT_DBG("sk %p, parent %p", sk, parent);
1425
1426 sk->sk_state = BT_CONNECTED;
1427 sk->sk_state_change(sk);
1428
1429 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001430 parent->sk_data_ready(parent);
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001431
1432 release_sock(sk);
1433}
1434
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001435static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1436{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001437 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001438
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001439 lock_sock(sk);
1440
1441 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001442 if (parent)
David S. Miller676d2362014-04-11 16:15:36 -04001443 parent->sk_data_ready(parent);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001444
1445 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001446}
1447
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001448static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1449{
1450 struct sock *sk = chan->data;
1451
Johan Hedbergd52deb12014-08-07 22:56:44 +03001452 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) {
1453 sk->sk_state = BT_CONNECTED;
1454 chan->state = BT_CONNECTED;
1455 }
1456
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001457 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1458 sk->sk_state_change(sk);
1459}
1460
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001461static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1462{
1463 struct sock *sk = chan->data;
1464
1465 lock_sock(sk);
1466 sk->sk_shutdown = SHUTDOWN_MASK;
1467 release_sock(sk);
1468}
1469
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001470static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1471{
1472 struct sock *sk = chan->data;
1473
1474 return sk->sk_sndtimeo;
1475}
1476
Johan Hedberg837776f2013-10-15 11:03:18 +03001477static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1478{
1479 struct sock *sk = chan->data;
1480
1481 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1482 sk->sk_state_change(sk);
1483}
1484
Luiz Augusto von Dentz72036962020-08-06 11:17:12 -07001485static int l2cap_sock_filter(struct l2cap_chan *chan, struct sk_buff *skb)
1486{
1487 struct sock *sk = chan->data;
1488
1489 switch (chan->mode) {
1490 case L2CAP_MODE_ERTM:
1491 case L2CAP_MODE_STREAMING:
1492 return sk_filter(sk, skb);
1493 }
1494
1495 return 0;
1496}
1497
Marcel Holtmann67f86a42014-06-08 10:05:31 +02001498static const struct l2cap_ops l2cap_chan_ops = {
Jukka Rissanen04988782014-06-18 16:37:07 +03001499 .name = "L2CAP Socket Interface",
1500 .new_connection = l2cap_sock_new_connection_cb,
1501 .recv = l2cap_sock_recv_cb,
1502 .close = l2cap_sock_close_cb,
1503 .teardown = l2cap_sock_teardown_cb,
1504 .state_change = l2cap_sock_state_change_cb,
1505 .ready = l2cap_sock_ready_cb,
1506 .defer = l2cap_sock_defer_cb,
1507 .resume = l2cap_sock_resume_cb,
1508 .suspend = l2cap_sock_suspend_cb,
1509 .set_shutdown = l2cap_sock_set_shutdown_cb,
1510 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1511 .alloc_skb = l2cap_sock_alloc_skb_cb,
Luiz Augusto von Dentz72036962020-08-06 11:17:12 -07001512 .filter = l2cap_sock_filter,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001513};
1514
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001515static void l2cap_sock_destruct(struct sock *sk)
1516{
1517 BT_DBG("sk %p", sk);
1518
Wang ShaoBod19ea7d2021-08-31 17:35:37 -07001519 if (l2cap_pi(sk)->chan) {
1520 l2cap_pi(sk)->chan->data = NULL;
Sasha Levin23d3a862012-10-08 16:48:32 -04001521 l2cap_chan_put(l2cap_pi(sk)->chan);
Wang ShaoBod19ea7d2021-08-31 17:35:37 -07001522 }
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001523
Mat Martineaue3281402011-07-07 09:39:02 -07001524 if (l2cap_pi(sk)->rx_busy_skb) {
1525 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1526 l2cap_pi(sk)->rx_busy_skb = NULL;
1527 }
1528
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001529 skb_queue_purge(&sk->sk_receive_queue);
1530 skb_queue_purge(&sk->sk_write_queue);
1531}
1532
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001533static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1534 int *msg_namelen)
1535{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001536 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001537
1538 memset(la, 0, sizeof(struct sockaddr_l2));
1539 la->l2_family = AF_BLUETOOTH;
Johan Hedberga4368ff2015-03-30 23:21:01 +03001540 la->l2_psm = bt_cb(skb)->l2cap.psm;
1541 bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001542
1543 *msg_namelen = sizeof(struct sockaddr_l2);
1544}
1545
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001546static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001547{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001548 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001549
1550 BT_DBG("sk %p", sk);
1551
1552 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001553 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1554
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001555 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001556 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001557
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001558 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001559 chan->imtu = pchan->imtu;
1560 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001561 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001562 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001563 chan->fcs = pchan->fcs;
1564 chan->max_tx = pchan->max_tx;
1565 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001566 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001567 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001568 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001569 chan->tx_credits = pchan->tx_credits;
1570 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001571
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001572 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1573 chan->scid = pchan->scid;
1574 chan->dcid = pchan->scid;
1575 }
1576
Paul Moore6230c9b2011-10-07 09:40:59 +00001577 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001578 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001579 switch (sk->sk_type) {
1580 case SOCK_RAW:
1581 chan->chan_type = L2CAP_CHAN_RAW;
1582 break;
1583 case SOCK_DGRAM:
1584 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001585 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001586 break;
1587 case SOCK_SEQPACKET:
1588 case SOCK_STREAM:
1589 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1590 break;
1591 }
1592
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001593 chan->imtu = L2CAP_DEFAULT_MTU;
1594 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001595 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001596 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001597 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001598 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001599 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001600 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001601
1602 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001603 }
1604
1605 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001606 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001607
1608 chan->data = sk;
1609 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001610}
1611
1612static struct proto l2cap_proto = {
1613 .name = "L2CAP",
1614 .owner = THIS_MODULE,
1615 .obj_size = sizeof(struct l2cap_pinfo)
1616};
1617
Gustavo Padovan2d792812012-10-06 10:07:01 +01001618static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001619 int proto, gfp_t prio, int kern)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001620{
1621 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001622 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001623
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001624 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001625 if (!sk)
1626 return NULL;
1627
1628 sock_init_data(sock, sk);
1629 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1630
1631 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001632 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001633
1634 sock_reset_flag(sk, SOCK_ZAPPED);
1635
1636 sk->sk_protocol = proto;
1637 sk->sk_state = BT_OPEN;
1638
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001639 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001640 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301641 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001642 return NULL;
1643 }
1644
Mat Martineau61d6ef32012-04-27 16:50:50 -07001645 l2cap_chan_hold(chan);
1646
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001647 l2cap_pi(sk)->chan = chan;
1648
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001649 return sk;
1650}
1651
1652static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1653 int kern)
1654{
1655 struct sock *sk;
1656
1657 BT_DBG("sock %p", sock);
1658
1659 sock->state = SS_UNCONNECTED;
1660
1661 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001662 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001663 return -ESOCKTNOSUPPORT;
1664
1665 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1666 return -EPERM;
1667
1668 sock->ops = &l2cap_sock_ops;
1669
Eric W. Biederman11aa9c22015-05-08 21:09:13 -05001670 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001671 if (!sk)
1672 return -ENOMEM;
1673
1674 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001675 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001676 return 0;
1677}
1678
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001679static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001680 .family = PF_BLUETOOTH,
1681 .owner = THIS_MODULE,
1682 .release = l2cap_sock_release,
1683 .bind = l2cap_sock_bind,
1684 .connect = l2cap_sock_connect,
1685 .listen = l2cap_sock_listen,
1686 .accept = l2cap_sock_accept,
1687 .getname = l2cap_sock_getname,
1688 .sendmsg = l2cap_sock_sendmsg,
1689 .recvmsg = l2cap_sock_recvmsg,
1690 .poll = bt_sock_poll,
1691 .ioctl = bt_sock_ioctl,
1692 .mmap = sock_no_mmap,
1693 .socketpair = sock_no_socketpair,
1694 .shutdown = l2cap_sock_shutdown,
1695 .setsockopt = l2cap_sock_setsockopt,
1696 .getsockopt = l2cap_sock_getsockopt
1697};
1698
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001699static const struct net_proto_family l2cap_sock_family_ops = {
1700 .family = PF_BLUETOOTH,
1701 .owner = THIS_MODULE,
1702 .create = l2cap_sock_create,
1703};
1704
1705int __init l2cap_init_sockets(void)
1706{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001707 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001708
Marcel Holtmanndd625552015-01-11 15:18:19 -08001709 BUILD_BUG_ON(sizeof(struct sockaddr_l2) > sizeof(struct sockaddr));
1710
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001711 err = proto_register(&l2cap_proto, 0);
1712 if (err < 0)
1713 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001714
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001715 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001716 if (err < 0) {
1717 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001718 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001719 }
1720
Al Virob0316612013-04-04 19:14:33 -04001721 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001722 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001723 if (err < 0) {
1724 BT_ERR("Failed to create L2CAP proc file");
1725 bt_sock_unregister(BTPROTO_L2CAP);
1726 goto error;
1727 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001728
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001729 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001730
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001731 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001732
1733error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001734 proto_unregister(&l2cap_proto);
1735 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001736}
1737
1738void l2cap_cleanup_sockets(void)
1739{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001740 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001741 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001742 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001743}