blob: ae4f6b593fc015def2ea684220daddfbd4050fb4 [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
Johan Hedberg91497612013-12-02 11:20:20 +020039bool enable_lecoc;
40
Masatake YAMATO5b28d952012-07-26 01:29:25 +090041static struct bt_sock_list l2cap_sk_list = {
42 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
43};
44
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030045static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030046static void l2cap_sock_init(struct sock *sk, struct sock *parent);
Gustavo Padovan2d792812012-10-06 10:07:01 +010047static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
48 int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030049
David Herrmannb3916db2013-04-05 14:57:34 +020050bool l2cap_is_socket(struct socket *sock)
51{
52 return sock && sock->ops == &l2cap_sock_ops;
53}
54EXPORT_SYMBOL(l2cap_is_socket);
55
Johan Hedberg49460962013-10-08 13:55:46 +020056static int l2cap_validate_bredr_psm(u16 psm)
57{
58 /* PSM must be odd and lsb of upper byte must be 0 */
59 if ((psm & 0x0101) != 0x0001)
60 return -EINVAL;
61
62 /* Restrict usage of well-known PSMs */
63 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE))
64 return -EACCES;
65
66 return 0;
67}
68
69static int l2cap_validate_le_psm(u16 psm)
70{
71 /* Valid LE_PSM ranges are defined only until 0x00ff */
72 if (psm > 0x00ff)
73 return -EINVAL;
74
75 /* Restrict fixed, SIG assigned PSM values to CAP_NET_BIND_SERVICE */
76 if (psm <= 0x007f && !capable(CAP_NET_BIND_SERVICE))
77 return -EACCES;
78
79 return 0;
80}
81
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020082static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
83{
84 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030085 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020086 struct sockaddr_l2 la;
87 int len, err = 0;
88
89 BT_DBG("sk %p", sk);
90
91 if (!addr || addr->sa_family != AF_BLUETOOTH)
92 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 Hedberg21626e62014-01-24 10:35:41 +0200104 if (la.l2_cid) {
105 /* When the socket gets created it defaults to
106 * CHAN_CONN_ORIENTED, so we need to overwrite the
107 * default here.
108 */
109 chan->chan_type = L2CAP_CHAN_FIXED;
110 chan->omtu = L2CAP_DEFAULT_MTU;
111 }
112
Johan Hedbergbfe46552013-10-16 17:13:26 +0300113 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedberg91497612013-12-02 11:20:20 +0200114 if (!enable_lecoc && la.l2_psm)
Johan Hedbergbfe46552013-10-16 17:13:26 +0300115 return -EINVAL;
116 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200117 if (la.l2_cid &&
118 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300119 return -EINVAL;
120 }
121
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200122 lock_sock(sk);
123
124 if (sk->sk_state != BT_OPEN) {
125 err = -EBADFD;
126 goto done;
127 }
128
129 if (la.l2_psm) {
130 __u16 psm = __le16_to_cpu(la.l2_psm);
131
Johan Hedberg49460962013-10-08 13:55:46 +0200132 if (la.l2_bdaddr_type == BDADDR_BREDR)
133 err = l2cap_validate_bredr_psm(psm);
134 else
135 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200136
Johan Hedberg49460962013-10-08 13:55:46 +0200137 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200138 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200139 }
140
Ville Tervob62f3282011-02-10 22:38:50 -0300141 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530142 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300143 else
144 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300145
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300146 if (err < 0)
147 goto done;
148
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700149 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700150 case L2CAP_CHAN_CONN_LESS:
151 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
152 chan->sec_level = BT_SECURITY_SDP;
153 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700154 case L2CAP_CHAN_CONN_ORIENTED:
155 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
156 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
157 chan->sec_level = BT_SECURITY_SDP;
158 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200159 case L2CAP_CHAN_RAW:
160 chan->sec_level = BT_SECURITY_SDP;
161 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700162 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300163
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700164 bacpy(&chan->src, &la.l2_bdaddr);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700165 chan->src_type = la.l2_bdaddr_type;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300166
Johan Hedberg38319712013-05-17 12:49:23 +0300167 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200168 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300169
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300170 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200172
173done:
174 release_sock(sk);
175 return err;
176}
177
Gustavo Padovan2d792812012-10-06 10:07:01 +0100178static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
179 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200180{
181 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300182 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200183 struct sockaddr_l2 la;
184 int len, err = 0;
185
186 BT_DBG("sk %p", sk);
187
188 if (!addr || alen < sizeof(addr->sa_family) ||
189 addr->sa_family != AF_BLUETOOTH)
190 return -EINVAL;
191
192 memset(&la, 0, sizeof(la));
193 len = min_t(unsigned int, sizeof(la), alen);
194 memcpy(&la, addr, len);
195
Ville Tervoacd7d372011-02-10 22:38:49 -0300196 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200197 return -EINVAL;
198
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300199 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
200 return -EINVAL;
201
Johan Hedbergeb622492013-10-18 11:49:25 +0300202 /* Check that the socket wasn't bound to something that
203 * conflicts with the address given to connect(). If chan->src
204 * is BDADDR_ANY it means bind() was never used, in which case
205 * chan->src_type and la.l2_bdaddr_type do not need to match.
206 */
207 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
208 bdaddr_type_is_le(la.l2_bdaddr_type)) {
209 /* Old user space versions will try to incorrectly bind
210 * the ATT socket using BDADDR_BREDR. We need to accept
211 * this and fix up the source address type only when
212 * both the source CID and destination CID indicate
213 * ATT. Anything else is an invalid combination.
214 */
215 if (chan->scid != L2CAP_CID_ATT ||
216 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
217 return -EINVAL;
218
219 /* We don't have the hdev available here to make a
220 * better decision on random vs public, but since all
221 * user space versions that exhibit this issue anyway do
222 * not support random local addresses assuming public
223 * here is good enough.
224 */
225 chan->src_type = BDADDR_LE_PUBLIC;
226 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300227
228 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
229 return -EINVAL;
230
Johan Hedbergbfe46552013-10-16 17:13:26 +0300231 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedberg91497612013-12-02 11:20:20 +0200232 if (!enable_lecoc && la.l2_psm)
Johan Hedbergbfe46552013-10-16 17:13:26 +0300233 return -EINVAL;
234 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200235 if (la.l2_cid &&
236 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300237 return -EINVAL;
238 }
239
Johan Hedberg38319712013-05-17 12:49:23 +0300240 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200241 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300242
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530243 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300244 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200245 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200246 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200247
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200248 lock_sock(sk);
249
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200250 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100251 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200252
253 release_sock(sk);
254
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200255 return err;
256}
257
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200258static int l2cap_sock_listen(struct socket *sock, int backlog)
259{
260 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300261 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200262 int err = 0;
263
264 BT_DBG("sk %p backlog %d", sk, backlog);
265
266 lock_sock(sk);
267
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200268 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200269 err = -EBADFD;
270 goto done;
271 }
272
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200273 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
274 err = -EINVAL;
275 goto done;
276 }
277
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300278 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200279 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300280 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200281 break;
282 case L2CAP_MODE_ERTM:
283 case L2CAP_MODE_STREAMING:
284 if (!disable_ertm)
285 break;
286 /* fall through */
287 default:
288 err = -ENOTSUPP;
289 goto done;
290 }
291
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200292 sk->sk_max_ack_backlog = backlog;
293 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300294
295 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200296 sk->sk_state = BT_LISTEN;
297
298done:
299 release_sock(sk);
300 return err;
301}
302
Gustavo Padovan2d792812012-10-06 10:07:01 +0100303static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
304 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200305{
306 DECLARE_WAITQUEUE(wait, current);
307 struct sock *sk = sock->sk, *nsk;
308 long timeo;
309 int err = 0;
310
311 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
312
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200313 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
314
315 BT_DBG("sk %p timeo %ld", sk, timeo);
316
317 /* Wait for an incoming connection. (wake-one). */
318 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400319 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200320 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200321
322 if (sk->sk_state != BT_LISTEN) {
323 err = -EBADFD;
324 break;
325 }
326
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400327 nsk = bt_accept_dequeue(sk, newsock);
328 if (nsk)
329 break;
330
331 if (!timeo) {
332 err = -EAGAIN;
333 break;
334 }
335
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200336 if (signal_pending(current)) {
337 err = sock_intr_errno(timeo);
338 break;
339 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400340
341 release_sock(sk);
342 timeo = schedule_timeout(timeo);
343 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200344 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400345 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200346 remove_wait_queue(sk_sleep(sk), &wait);
347
348 if (err)
349 goto done;
350
351 newsock->state = SS_CONNECTED;
352
353 BT_DBG("new socket %p", nsk);
354
355done:
356 release_sock(sk);
357 return err;
358}
359
Gustavo Padovan2d792812012-10-06 10:07:01 +0100360static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
361 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200362{
363 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
364 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300365 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200366
367 BT_DBG("sock %p, sk %p", sock, sk);
368
Mathias Krause792039c2012-08-15 11:31:51 +0000369 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200370 addr->sa_family = AF_BLUETOOTH;
371 *len = sizeof(struct sockaddr_l2);
372
373 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300374 la->l2_psm = chan->psm;
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700375 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300376 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700377 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200378 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300379 la->l2_psm = chan->sport;
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700380 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300381 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700382 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200383 }
384
385 return 0;
386}
387
Gustavo Padovan2d792812012-10-06 10:07:01 +0100388static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
389 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200390{
391 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300392 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200393 struct l2cap_options opts;
394 struct l2cap_conninfo cinfo;
395 int len, err = 0;
396 u32 opt;
397
398 BT_DBG("sk %p", sk);
399
400 if (get_user(len, optlen))
401 return -EFAULT;
402
403 lock_sock(sk);
404
405 switch (optname) {
406 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200407 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
408 * legacy ATT code depends on getsockopt for
409 * L2CAP_OPTIONS we need to let this pass.
410 */
411 if (bdaddr_type_is_le(chan->src_type) &&
412 chan->scid != L2CAP_CID_ATT) {
413 err = -EINVAL;
414 break;
415 }
416
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300417 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300418 opts.imtu = chan->imtu;
419 opts.omtu = chan->omtu;
420 opts.flush_to = chan->flush_to;
421 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300422 opts.fcs = chan->fcs;
423 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300424 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200425
426 len = min_t(unsigned int, len, sizeof(opts));
427 if (copy_to_user(optval, (char *) &opts, len))
428 err = -EFAULT;
429
430 break;
431
432 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300433 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200434 case BT_SECURITY_LOW:
435 opt = L2CAP_LM_AUTH;
436 break;
437 case BT_SECURITY_MEDIUM:
438 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
439 break;
440 case BT_SECURITY_HIGH:
441 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100442 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200443 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800444 case BT_SECURITY_FIPS:
445 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
446 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
447 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200448 default:
449 opt = 0;
450 break;
451 }
452
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300453 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200454 opt |= L2CAP_LM_MASTER;
455
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300456 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200457 opt |= L2CAP_LM_RELIABLE;
458
459 if (put_user(opt, (u32 __user *) optval))
460 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800461
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200462 break;
463
464 case L2CAP_CONNINFO:
465 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300466 !(sk->sk_state == BT_CONNECT2 &&
467 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200468 err = -ENOTCONN;
469 break;
470 }
471
Filip Palian8d03e972011-05-12 19:32:46 +0200472 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300473 cinfo.hci_handle = chan->conn->hcon->handle;
474 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200475
476 len = min_t(unsigned int, len, sizeof(cinfo));
477 if (copy_to_user(optval, (char *) &cinfo, len))
478 err = -EFAULT;
479
480 break;
481
482 default:
483 err = -ENOPROTOOPT;
484 break;
485 }
486
487 release_sock(sk);
488 return err;
489}
490
Gustavo Padovan2d792812012-10-06 10:07:01 +0100491static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
492 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200493{
494 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300495 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200496 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700497 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200498 int len, err = 0;
499
500 BT_DBG("sk %p", sk);
501
502 if (level == SOL_L2CAP)
503 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
504
505 if (level != SOL_BLUETOOTH)
506 return -ENOPROTOOPT;
507
508 if (get_user(len, optlen))
509 return -EFAULT;
510
511 lock_sock(sk);
512
513 switch (optname) {
514 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300515 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500516 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100517 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200518 err = -EINVAL;
519 break;
520 }
521
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300522 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300523 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300524 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200525
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300526 if (sk->sk_state == BT_CONNECTED)
527 sec.key_size = chan->conn->hcon->enc_key_size;
528 } else {
529 sec.level = chan->sec_level;
530 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300531
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200532 len = min_t(unsigned int, len, sizeof(sec));
533 if (copy_to_user(optval, (char *) &sec, len))
534 err = -EFAULT;
535
536 break;
537
538 case BT_DEFER_SETUP:
539 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
540 err = -EINVAL;
541 break;
542 }
543
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300544 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
545 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200546 err = -EFAULT;
547
548 break;
549
550 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300551 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100552 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200553 err = -EFAULT;
554
555 break;
556
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700557 case BT_POWER:
558 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100559 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700560 err = -EINVAL;
561 break;
562 }
563
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300564 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700565
566 len = min_t(unsigned int, len, sizeof(pwr));
567 if (copy_to_user(optval, (char *) &pwr, len))
568 err = -EFAULT;
569
570 break;
571
Mat Martineau2ea66482011-11-02 16:18:30 -0700572 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700573 if (put_user(chan->chan_policy, (u32 __user *) optval))
574 err = -EFAULT;
575 break;
576
Johan Hedberg1f435422013-12-02 16:34:18 +0200577 case BT_SNDMTU:
578 if (!enable_lecoc) {
579 err = -EPROTONOSUPPORT;
580 break;
581 }
582
583 if (!bdaddr_type_is_le(chan->src_type)) {
584 err = -EINVAL;
585 break;
586 }
587
588 if (sk->sk_state != BT_CONNECTED) {
589 err = -ENOTCONN;
590 break;
591 }
592
593 if (put_user(chan->omtu, (u16 __user *) optval))
594 err = -EFAULT;
595 break;
596
597 case BT_RCVMTU:
598 if (!enable_lecoc) {
599 err = -EPROTONOSUPPORT;
600 break;
601 }
602
603 if (!bdaddr_type_is_le(chan->src_type)) {
604 err = -EINVAL;
605 break;
606 }
607
608 if (put_user(chan->imtu, (u16 __user *) optval))
609 err = -EFAULT;
610 break;
611
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200612 default:
613 err = -ENOPROTOOPT;
614 break;
615 }
616
617 release_sock(sk);
618 return err;
619}
620
Andre Guedes682877c2012-05-31 17:01:34 -0300621static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
622{
623 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300624 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300625 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300626 return false;
627 break;
628
629 default:
630 if (mtu < L2CAP_DEFAULT_MIN_MTU)
631 return false;
632 }
633
634 return true;
635}
636
Gustavo Padovan2d792812012-10-06 10:07:01 +0100637static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
638 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200639{
640 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300641 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200642 struct l2cap_options opts;
643 int len, err = 0;
644 u32 opt;
645
646 BT_DBG("sk %p", sk);
647
648 lock_sock(sk);
649
650 switch (optname) {
651 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200652 if (bdaddr_type_is_le(chan->src_type)) {
653 err = -EINVAL;
654 break;
655 }
656
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200657 if (sk->sk_state == BT_CONNECTED) {
658 err = -EINVAL;
659 break;
660 }
661
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300662 opts.imtu = chan->imtu;
663 opts.omtu = chan->omtu;
664 opts.flush_to = chan->flush_to;
665 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300666 opts.fcs = chan->fcs;
667 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300668 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200669
670 len = min_t(unsigned int, sizeof(opts), optlen);
671 if (copy_from_user((char *) &opts, optval, len)) {
672 err = -EFAULT;
673 break;
674 }
675
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300676 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200677 err = -EINVAL;
678 break;
679 }
680
Andre Guedes682877c2012-05-31 17:01:34 -0300681 if (!l2cap_valid_mtu(chan, opts.imtu)) {
682 err = -EINVAL;
683 break;
684 }
685
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300686 chan->mode = opts.mode;
687 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +0300688 case L2CAP_MODE_LE_FLOWCTL:
689 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200690 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300691 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200692 break;
693 case L2CAP_MODE_ERTM:
694 case L2CAP_MODE_STREAMING:
695 if (!disable_ertm)
696 break;
697 /* fall through */
698 default:
699 err = -EINVAL;
700 break;
701 }
702
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300703 chan->imtu = opts.imtu;
704 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300705 chan->fcs = opts.fcs;
706 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300707 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300708 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200709 break;
710
711 case L2CAP_LM:
712 if (get_user(opt, (u32 __user *) optval)) {
713 err = -EFAULT;
714 break;
715 }
716
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800717 if (opt & L2CAP_LM_FIPS) {
718 err = -EINVAL;
719 break;
720 }
721
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200722 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300723 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200724 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300725 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200726 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300727 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200728
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300729 if (opt & L2CAP_LM_MASTER)
730 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
731 else
732 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300733
734 if (opt & L2CAP_LM_RELIABLE)
735 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
736 else
737 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200738 break;
739
740 default:
741 err = -ENOPROTOOPT;
742 break;
743 }
744
745 release_sock(sk);
746 return err;
747}
748
Gustavo Padovan2d792812012-10-06 10:07:01 +0100749static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
750 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200751{
752 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300753 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200754 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700755 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300756 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200757 int len, err = 0;
758 u32 opt;
759
760 BT_DBG("sk %p", sk);
761
762 if (level == SOL_L2CAP)
763 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
764
765 if (level != SOL_BLUETOOTH)
766 return -ENOPROTOOPT;
767
768 lock_sock(sk);
769
770 switch (optname) {
771 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300772 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Johan Hedberge0c888a2014-01-25 17:10:07 -0500773 chan->chan_type != L2CAP_CHAN_FIXED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100774 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200775 err = -EINVAL;
776 break;
777 }
778
779 sec.level = BT_SECURITY_LOW;
780
781 len = min_t(unsigned int, sizeof(sec), optlen);
782 if (copy_from_user((char *) &sec, optval, len)) {
783 err = -EFAULT;
784 break;
785 }
786
787 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100788 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200789 err = -EINVAL;
790 break;
791 }
792
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300793 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300794
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200795 if (!chan->conn)
796 break;
797
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300798 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200799
800 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300801 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300802 if (!conn->hcon->out) {
803 err = -EINVAL;
804 break;
805 }
806
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300807 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300808 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300809 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200810 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200811
Gustavo Padovana7d77232012-05-13 03:20:07 -0300812 /* or for ACL link */
813 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100814 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300815 sk->sk_state == BT_CONNECTED) {
816 if (!l2cap_chan_check_security(chan))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300817 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300818 else
819 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200820 } else {
821 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300822 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200823 break;
824
825 case BT_DEFER_SETUP:
826 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
827 err = -EINVAL;
828 break;
829 }
830
831 if (get_user(opt, (u32 __user *) optval)) {
832 err = -EFAULT;
833 break;
834 }
835
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700836 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300837 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700838 set_bit(FLAG_DEFER_SETUP, &chan->flags);
839 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300840 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700841 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
842 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200843 break;
844
845 case BT_FLUSHABLE:
846 if (get_user(opt, (u32 __user *) optval)) {
847 err = -EFAULT;
848 break;
849 }
850
851 if (opt > BT_FLUSHABLE_ON) {
852 err = -EINVAL;
853 break;
854 }
855
856 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200857 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300858 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200859 No Flush support in the LM */
860 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
861 err = -EINVAL;
862 break;
863 }
864 }
865
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300866 if (opt)
867 set_bit(FLAG_FLUSHABLE, &chan->flags);
868 else
869 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200870 break;
871
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700872 case BT_POWER:
873 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100874 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700875 err = -EINVAL;
876 break;
877 }
878
879 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
880
881 len = min_t(unsigned int, sizeof(pwr), optlen);
882 if (copy_from_user((char *) &pwr, optval, len)) {
883 err = -EFAULT;
884 break;
885 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300886
887 if (pwr.force_active)
888 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
889 else
890 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700891 break;
892
Mat Martineau2ea66482011-11-02 16:18:30 -0700893 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700894 if (get_user(opt, (u32 __user *) optval)) {
895 err = -EFAULT;
896 break;
897 }
898
899 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
900 err = -EINVAL;
901 break;
902 }
903
904 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100905 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700906 err = -EOPNOTSUPP;
907 break;
908 }
909
910 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700911
912 if (sk->sk_state == BT_CONNECTED &&
913 chan->move_role == L2CAP_MOVE_ROLE_NONE)
914 l2cap_move_start(chan);
915
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200916 break;
917
Johan Hedberg1f435422013-12-02 16:34:18 +0200918 case BT_SNDMTU:
919 if (!enable_lecoc) {
920 err = -EPROTONOSUPPORT;
921 break;
922 }
923
924 if (!bdaddr_type_is_le(chan->src_type)) {
925 err = -EINVAL;
926 break;
927 }
928
929 /* Setting is not supported as it's the remote side that
930 * decides this.
931 */
932 err = -EPERM;
933 break;
934
935 case BT_RCVMTU:
936 if (!enable_lecoc) {
937 err = -EPROTONOSUPPORT;
938 break;
939 }
940
941 if (!bdaddr_type_is_le(chan->src_type)) {
942 err = -EINVAL;
943 break;
944 }
945
946 if (sk->sk_state == BT_CONNECTED) {
947 err = -EISCONN;
948 break;
949 }
950
951 if (get_user(opt, (u32 __user *) optval)) {
952 err = -EFAULT;
953 break;
954 }
955
956 chan->imtu = opt;
957 break;
958
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200959 default:
960 err = -ENOPROTOOPT;
961 break;
962 }
963
964 release_sock(sk);
965 return err;
966}
967
Gustavo Padovan2d792812012-10-06 10:07:01 +0100968static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
969 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200970{
971 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300972 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200973 int err;
974
975 BT_DBG("sock %p, sk %p", sock, sk);
976
977 err = sock_error(sk);
978 if (err)
979 return err;
980
981 if (msg->msg_flags & MSG_OOB)
982 return -EOPNOTSUPP;
983
Mat Martineaua6a55682012-05-04 14:20:31 -0700984 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300985 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200986
Johan Hedberge793dcf2013-09-16 13:05:19 +0300987 lock_sock(sk);
988 err = bt_sock_wait_ready(sk, msg->msg_flags);
989 release_sock(sk);
990 if (err)
991 return err;
992
Mat Martineaua6a55682012-05-04 14:20:31 -0700993 l2cap_chan_lock(chan);
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200994 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Mat Martineaua6a55682012-05-04 14:20:31 -0700995 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200996
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200997 return err;
998}
999
Gustavo Padovan2d792812012-10-06 10:07:01 +01001000static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
1001 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001002{
1003 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -07001004 struct l2cap_pinfo *pi = l2cap_pi(sk);
1005 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001006
1007 lock_sock(sk);
1008
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001009 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
1010 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +03001011 if (bdaddr_type_is_le(pi->chan->src_type)) {
1012 sk->sk_state = BT_CONNECTED;
1013 pi->chan->state = BT_CONNECTED;
1014 __l2cap_le_connect_rsp_defer(pi->chan);
1015 } else {
1016 sk->sk_state = BT_CONFIG;
1017 pi->chan->state = BT_CONFIG;
1018 __l2cap_connect_rsp_defer(pi->chan);
1019 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001020
Johan Hedberg970871b2013-09-25 13:26:05 +03001021 err = 0;
1022 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001023 }
1024
1025 release_sock(sk);
1026
1027 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -07001028 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
1029 else
1030 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001031
Mat Martineaue3281402011-07-07 09:39:02 -07001032 if (pi->chan->mode != L2CAP_MODE_ERTM)
1033 return err;
1034
1035 /* Attempt to put pending rx data in the socket buffer */
1036
1037 lock_sock(sk);
1038
1039 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1040 goto done;
1041
1042 if (pi->rx_busy_skb) {
1043 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
1044 pi->rx_busy_skb = NULL;
1045 else
1046 goto done;
1047 }
1048
1049 /* Restore data flow when half of the receive buffer is
1050 * available. This avoids resending large numbers of
1051 * frames.
1052 */
1053 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1054 l2cap_chan_busy(pi->chan, 0);
1055
1056done:
1057 release_sock(sk);
1058 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001059}
1060
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001061/* Kill socket (only if zapped and orphan)
1062 * Must be called on unlocked socket.
1063 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001064static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001065{
1066 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1067 return;
1068
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001069 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001070
1071 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001072
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301073 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001074 sock_set_flag(sk, SOCK_DEAD);
1075 sock_put(sk);
1076}
1077
Gustavo Padovandc253062013-10-15 19:24:49 -03001078static int __l2cap_wait_ack(struct sock *sk)
1079{
1080 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1081 DECLARE_WAITQUEUE(wait, current);
1082 int err = 0;
1083 int timeo = HZ/5;
1084
1085 add_wait_queue(sk_sleep(sk), &wait);
1086 set_current_state(TASK_INTERRUPTIBLE);
1087 while (chan->unacked_frames > 0 && chan->conn) {
1088 if (!timeo)
1089 timeo = HZ/5;
1090
1091 if (signal_pending(current)) {
1092 err = sock_intr_errno(timeo);
1093 break;
1094 }
1095
1096 release_sock(sk);
1097 timeo = schedule_timeout(timeo);
1098 lock_sock(sk);
1099 set_current_state(TASK_INTERRUPTIBLE);
1100
1101 err = sock_error(sk);
1102 if (err)
1103 break;
1104 }
1105 set_current_state(TASK_RUNNING);
1106 remove_wait_queue(sk_sleep(sk), &wait);
1107 return err;
1108}
1109
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001110static int l2cap_sock_shutdown(struct socket *sock, int how)
1111{
1112 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001113 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001114 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001115 int err = 0;
1116
1117 BT_DBG("sock %p, sk %p", sock, sk);
1118
1119 if (!sk)
1120 return 0;
1121
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001122 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001123 conn = chan->conn;
1124
1125 if (conn)
1126 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001127
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001128 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001129 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001130
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001131 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001132 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001133 err = __l2cap_wait_ack(sk);
1134
1135 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001136
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001137 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03001138 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001139 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001140
1141 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
1142 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001143 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001144 }
1145
1146 if (!err && sk->sk_err)
1147 err = -sk->sk_err;
1148
1149 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001150 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001151
1152 if (conn)
1153 mutex_unlock(&conn->chan_lock);
1154
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001155 return err;
1156}
1157
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001158static int l2cap_sock_release(struct socket *sock)
1159{
1160 struct sock *sk = sock->sk;
1161 int err;
1162
1163 BT_DBG("sock %p, sk %p", sock, sk);
1164
1165 if (!sk)
1166 return 0;
1167
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001168 bt_sock_unlink(&l2cap_sk_list, sk);
1169
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001170 err = l2cap_sock_shutdown(sock, 2);
1171
1172 sock_orphan(sk);
1173 l2cap_sock_kill(sk);
1174 return err;
1175}
1176
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001177static void l2cap_sock_cleanup_listen(struct sock *parent)
1178{
1179 struct sock *sk;
1180
1181 BT_DBG("parent %p", parent);
1182
1183 /* Close not yet accepted channels */
1184 while ((sk = bt_accept_dequeue(parent, NULL))) {
1185 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1186
1187 l2cap_chan_lock(chan);
1188 __clear_chan_timer(chan);
1189 l2cap_chan_close(chan, ECONNRESET);
1190 l2cap_chan_unlock(chan);
1191
1192 l2cap_sock_kill(sk);
1193 }
1194}
1195
Gustavo Padovan80b98022012-05-27 22:27:51 -03001196static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001197{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001198 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001199
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001200 lock_sock(parent);
1201
Gustavo Padovan53826692012-05-27 22:27:55 -03001202 /* Check for backlog size */
1203 if (sk_acceptq_is_full(parent)) {
1204 BT_DBG("backlog full %d", parent->sk_ack_backlog);
1205 return NULL;
1206 }
1207
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001208 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001209 GFP_ATOMIC);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001210 if (!sk)
1211 return NULL;
1212
Octavian Purdilad22015a2012-01-22 00:28:34 +02001213 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1214
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001215 l2cap_sock_init(sk, parent);
1216
Gustavo Padovan644912e2012-10-12 19:35:23 +08001217 bt_accept_enqueue(parent, sk);
1218
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001219 release_sock(parent);
1220
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001221 return l2cap_pi(sk)->chan;
1222}
1223
Gustavo Padovan80b98022012-05-27 22:27:51 -03001224static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001225{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001226 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001227 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001228
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001229 lock_sock(sk);
1230
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001231 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001232 err = -ENOMEM;
1233 goto done;
1234 }
Mat Martineaue3281402011-07-07 09:39:02 -07001235
1236 err = sock_queue_rcv_skb(sk, skb);
1237
1238 /* For ERTM, handle one skb that doesn't fit into the recv
1239 * buffer. This is important to do because the data frames
1240 * have already been acked, so the skb cannot be discarded.
1241 *
1242 * Notify the l2cap core that the buffer is full, so the
1243 * LOCAL_BUSY state is entered and no more frames are
1244 * acked and reassembled until there is buffer space
1245 * available.
1246 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001247 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1248 l2cap_pi(sk)->rx_busy_skb = skb;
1249 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001250 err = 0;
1251 }
1252
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001253done:
1254 release_sock(sk);
1255
Mat Martineaue3281402011-07-07 09:39:02 -07001256 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001257}
1258
Gustavo Padovan80b98022012-05-27 22:27:51 -03001259static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001260{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001261 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001262
1263 l2cap_sock_kill(sk);
1264}
1265
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001266static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1267{
1268 struct sock *sk = chan->data;
1269 struct sock *parent;
1270
1271 lock_sock(sk);
1272
1273 parent = bt_sk(sk)->parent;
1274
1275 sock_set_flag(sk, SOCK_ZAPPED);
1276
1277 switch (chan->state) {
1278 case BT_OPEN:
1279 case BT_BOUND:
1280 case BT_CLOSED:
1281 break;
1282 case BT_LISTEN:
1283 l2cap_sock_cleanup_listen(sk);
1284 sk->sk_state = BT_CLOSED;
1285 chan->state = BT_CLOSED;
1286
1287 break;
1288 default:
1289 sk->sk_state = BT_CLOSED;
1290 chan->state = BT_CLOSED;
1291
1292 sk->sk_err = err;
1293
1294 if (parent) {
1295 bt_accept_unlink(sk);
1296 parent->sk_data_ready(parent, 0);
1297 } else {
1298 sk->sk_state_change(sk);
1299 }
1300
1301 break;
1302 }
1303
1304 release_sock(sk);
1305}
1306
Gustavo Padovan53f52122013-10-15 19:24:45 -03001307static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1308 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001309{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001310 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001311
1312 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001313
1314 if (err)
1315 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001316}
1317
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001318static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -03001319 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001320{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001321 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001322 struct sk_buff *skb;
1323 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001324
Mat Martineaua6a55682012-05-04 14:20:31 -07001325 l2cap_chan_unlock(chan);
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001326 skb = bt_skb_send_alloc(sk, len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001327 l2cap_chan_lock(chan);
1328
Gustavo Padovan90338942012-04-06 20:15:47 -03001329 if (!skb)
1330 return ERR_PTR(err);
1331
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001332 bt_cb(skb)->chan = chan;
1333
Gustavo Padovan90338942012-04-06 20:15:47 -03001334 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001335}
1336
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001337static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1338{
1339 struct sock *sk = chan->data;
1340 struct sock *parent;
1341
1342 lock_sock(sk);
1343
1344 parent = bt_sk(sk)->parent;
1345
1346 BT_DBG("sk %p, parent %p", sk, parent);
1347
1348 sk->sk_state = BT_CONNECTED;
1349 sk->sk_state_change(sk);
1350
1351 if (parent)
1352 parent->sk_data_ready(parent, 0);
1353
1354 release_sock(sk);
1355}
1356
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001357static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1358{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001359 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001360
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001361 lock_sock(sk);
1362
1363 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001364 if (parent)
1365 parent->sk_data_ready(parent, 0);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001366
1367 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001368}
1369
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001370static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1371{
1372 struct sock *sk = chan->data;
1373
1374 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1375 sk->sk_state_change(sk);
1376}
1377
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001378static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1379{
1380 struct sock *sk = chan->data;
1381
1382 lock_sock(sk);
1383 sk->sk_shutdown = SHUTDOWN_MASK;
1384 release_sock(sk);
1385}
1386
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001387static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1388{
1389 struct sock *sk = chan->data;
1390
1391 return sk->sk_sndtimeo;
1392}
1393
Johan Hedberg837776f2013-10-15 11:03:18 +03001394static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1395{
1396 struct sock *sk = chan->data;
1397
1398 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1399 sk->sk_state_change(sk);
1400}
1401
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001402static struct l2cap_ops l2cap_chan_ops = {
1403 .name = "L2CAP Socket Interface",
1404 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001405 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001406 .close = l2cap_sock_close_cb,
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001407 .teardown = l2cap_sock_teardown_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001408 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001409 .ready = l2cap_sock_ready_cb,
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001410 .defer = l2cap_sock_defer_cb,
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001411 .resume = l2cap_sock_resume_cb,
Johan Hedberg837776f2013-10-15 11:03:18 +03001412 .suspend = l2cap_sock_suspend_cb,
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001413 .set_shutdown = l2cap_sock_set_shutdown_cb,
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001414 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001415 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001416};
1417
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001418static void l2cap_sock_destruct(struct sock *sk)
1419{
1420 BT_DBG("sk %p", sk);
1421
Sasha Levin23d3a862012-10-08 16:48:32 -04001422 if (l2cap_pi(sk)->chan)
1423 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001424
Mat Martineaue3281402011-07-07 09:39:02 -07001425 if (l2cap_pi(sk)->rx_busy_skb) {
1426 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1427 l2cap_pi(sk)->rx_busy_skb = NULL;
1428 }
1429
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001430 skb_queue_purge(&sk->sk_receive_queue);
1431 skb_queue_purge(&sk->sk_write_queue);
1432}
1433
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001434static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1435 int *msg_namelen)
1436{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001437 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001438
1439 memset(la, 0, sizeof(struct sockaddr_l2));
1440 la->l2_family = AF_BLUETOOTH;
1441 la->l2_psm = bt_cb(skb)->psm;
1442 bacpy(&la->l2_bdaddr, &bt_cb(skb)->bdaddr);
1443
1444 *msg_namelen = sizeof(struct sockaddr_l2);
1445}
1446
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001447static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001448{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001449 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001450
1451 BT_DBG("sk %p", sk);
1452
1453 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001454 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1455
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001456 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001457 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001458
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001459 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001460 chan->imtu = pchan->imtu;
1461 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001462 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001463 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001464 chan->fcs = pchan->fcs;
1465 chan->max_tx = pchan->max_tx;
1466 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001467 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001468 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001469 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001470 chan->tx_credits = pchan->tx_credits;
1471 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001472
Johan Hedberg7a8e5a32014-01-25 17:10:09 -05001473 if (chan->chan_type == L2CAP_CHAN_FIXED) {
1474 chan->scid = pchan->scid;
1475 chan->dcid = pchan->scid;
1476 }
1477
Paul Moore6230c9b2011-10-07 09:40:59 +00001478 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001479 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001480 switch (sk->sk_type) {
1481 case SOCK_RAW:
1482 chan->chan_type = L2CAP_CHAN_RAW;
1483 break;
1484 case SOCK_DGRAM:
1485 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001486 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001487 break;
1488 case SOCK_SEQPACKET:
1489 case SOCK_STREAM:
1490 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1491 break;
1492 }
1493
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001494 chan->imtu = L2CAP_DEFAULT_MTU;
1495 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001496 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001497 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001498 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001499 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001500 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001501 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001502
1503 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001504 }
1505
1506 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001507 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001508
1509 chan->data = sk;
1510 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001511}
1512
1513static struct proto l2cap_proto = {
1514 .name = "L2CAP",
1515 .owner = THIS_MODULE,
1516 .obj_size = sizeof(struct l2cap_pinfo)
1517};
1518
Gustavo Padovan2d792812012-10-06 10:07:01 +01001519static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1520 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001521{
1522 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001523 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001524
1525 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1526 if (!sk)
1527 return NULL;
1528
1529 sock_init_data(sock, sk);
1530 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1531
1532 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001533 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001534
1535 sock_reset_flag(sk, SOCK_ZAPPED);
1536
1537 sk->sk_protocol = proto;
1538 sk->sk_state = BT_OPEN;
1539
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001540 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001541 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301542 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001543 return NULL;
1544 }
1545
Mat Martineau61d6ef32012-04-27 16:50:50 -07001546 l2cap_chan_hold(chan);
1547
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001548 l2cap_pi(sk)->chan = chan;
1549
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001550 return sk;
1551}
1552
1553static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1554 int kern)
1555{
1556 struct sock *sk;
1557
1558 BT_DBG("sock %p", sock);
1559
1560 sock->state = SS_UNCONNECTED;
1561
1562 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001563 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001564 return -ESOCKTNOSUPPORT;
1565
1566 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1567 return -EPERM;
1568
1569 sock->ops = &l2cap_sock_ops;
1570
1571 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1572 if (!sk)
1573 return -ENOMEM;
1574
1575 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001576 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001577 return 0;
1578}
1579
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001580static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001581 .family = PF_BLUETOOTH,
1582 .owner = THIS_MODULE,
1583 .release = l2cap_sock_release,
1584 .bind = l2cap_sock_bind,
1585 .connect = l2cap_sock_connect,
1586 .listen = l2cap_sock_listen,
1587 .accept = l2cap_sock_accept,
1588 .getname = l2cap_sock_getname,
1589 .sendmsg = l2cap_sock_sendmsg,
1590 .recvmsg = l2cap_sock_recvmsg,
1591 .poll = bt_sock_poll,
1592 .ioctl = bt_sock_ioctl,
1593 .mmap = sock_no_mmap,
1594 .socketpair = sock_no_socketpair,
1595 .shutdown = l2cap_sock_shutdown,
1596 .setsockopt = l2cap_sock_setsockopt,
1597 .getsockopt = l2cap_sock_getsockopt
1598};
1599
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001600static const struct net_proto_family l2cap_sock_family_ops = {
1601 .family = PF_BLUETOOTH,
1602 .owner = THIS_MODULE,
1603 .create = l2cap_sock_create,
1604};
1605
1606int __init l2cap_init_sockets(void)
1607{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001608 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001609
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001610 err = proto_register(&l2cap_proto, 0);
1611 if (err < 0)
1612 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001613
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001614 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001615 if (err < 0) {
1616 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001617 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001618 }
1619
Al Virob0316612013-04-04 19:14:33 -04001620 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001621 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001622 if (err < 0) {
1623 BT_ERR("Failed to create L2CAP proc file");
1624 bt_sock_unregister(BTPROTO_L2CAP);
1625 goto error;
1626 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001627
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001628 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001629
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001630 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001631
1632error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001633 proto_unregister(&l2cap_proto);
1634 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001635}
1636
1637void l2cap_cleanup_sockets(void)
1638{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001639 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001640 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001641 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001642}
Johan Hedberg91497612013-12-02 11:20:20 +02001643
1644module_param(enable_lecoc, bool, 0644);
1645MODULE_PARM_DESC(enable_lecoc, "Enable support for LE CoC");