blob: fe086b4efc0c204d18200f8599cf7cf9f0f0e8d1 [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 Hedbergbfe46552013-10-16 17:13:26 +0300104 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedberg91497612013-12-02 11:20:20 +0200105 if (!enable_lecoc && la.l2_psm)
Johan Hedbergbfe46552013-10-16 17:13:26 +0300106 return -EINVAL;
107 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200108 if (la.l2_cid &&
109 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300110 return -EINVAL;
111 }
112
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200113 lock_sock(sk);
114
115 if (sk->sk_state != BT_OPEN) {
116 err = -EBADFD;
117 goto done;
118 }
119
120 if (la.l2_psm) {
121 __u16 psm = __le16_to_cpu(la.l2_psm);
122
Johan Hedberg49460962013-10-08 13:55:46 +0200123 if (la.l2_bdaddr_type == BDADDR_BREDR)
124 err = l2cap_validate_bredr_psm(psm);
125 else
126 err = l2cap_validate_le_psm(psm);
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200127
Johan Hedberg49460962013-10-08 13:55:46 +0200128 if (err)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200129 goto done;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200130 }
131
Ville Tervob62f3282011-02-10 22:38:50 -0300132 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530133 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300134 else
135 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300136
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300137 if (err < 0)
138 goto done;
139
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700140 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700141 case L2CAP_CHAN_CONN_LESS:
142 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
143 chan->sec_level = BT_SECURITY_SDP;
144 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700145 case L2CAP_CHAN_CONN_ORIENTED:
146 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
147 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
148 chan->sec_level = BT_SECURITY_SDP;
149 break;
Johan Hedbergcb6ca8e2014-01-06 18:27:02 +0200150 case L2CAP_CHAN_RAW:
151 chan->sec_level = BT_SECURITY_SDP;
152 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700153 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300154
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700155 bacpy(&chan->src, &la.l2_bdaddr);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700156 chan->src_type = la.l2_bdaddr_type;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300157
Johan Hedberg38319712013-05-17 12:49:23 +0300158 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200159 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300160
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300161 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300162 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200163
164done:
165 release_sock(sk);
166 return err;
167}
168
Gustavo Padovan2d792812012-10-06 10:07:01 +0100169static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
170 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200171{
172 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300173 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200174 struct sockaddr_l2 la;
175 int len, err = 0;
176
177 BT_DBG("sk %p", sk);
178
179 if (!addr || alen < sizeof(addr->sa_family) ||
180 addr->sa_family != AF_BLUETOOTH)
181 return -EINVAL;
182
183 memset(&la, 0, sizeof(la));
184 len = min_t(unsigned int, sizeof(la), alen);
185 memcpy(&la, addr, len);
186
Ville Tervoacd7d372011-02-10 22:38:49 -0300187 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200188 return -EINVAL;
189
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300190 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
191 return -EINVAL;
192
Johan Hedbergeb622492013-10-18 11:49:25 +0300193 /* Check that the socket wasn't bound to something that
194 * conflicts with the address given to connect(). If chan->src
195 * is BDADDR_ANY it means bind() was never used, in which case
196 * chan->src_type and la.l2_bdaddr_type do not need to match.
197 */
198 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
199 bdaddr_type_is_le(la.l2_bdaddr_type)) {
200 /* Old user space versions will try to incorrectly bind
201 * the ATT socket using BDADDR_BREDR. We need to accept
202 * this and fix up the source address type only when
203 * both the source CID and destination CID indicate
204 * ATT. Anything else is an invalid combination.
205 */
206 if (chan->scid != L2CAP_CID_ATT ||
207 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
208 return -EINVAL;
209
210 /* We don't have the hdev available here to make a
211 * better decision on random vs public, but since all
212 * user space versions that exhibit this issue anyway do
213 * not support random local addresses assuming public
214 * here is good enough.
215 */
216 chan->src_type = BDADDR_LE_PUBLIC;
217 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300218
219 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
220 return -EINVAL;
221
Johan Hedbergbfe46552013-10-16 17:13:26 +0300222 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedberg91497612013-12-02 11:20:20 +0200223 if (!enable_lecoc && la.l2_psm)
Johan Hedbergbfe46552013-10-16 17:13:26 +0300224 return -EINVAL;
225 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200226 if (la.l2_cid &&
227 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300228 return -EINVAL;
229 }
230
Johan Hedberg38319712013-05-17 12:49:23 +0300231 if (chan->psm && bdaddr_type_is_le(chan->src_type))
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200232 chan->mode = L2CAP_MODE_LE_FLOWCTL;
Johan Hedberg38319712013-05-17 12:49:23 +0300233
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530234 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300235 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200236 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200237 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200238
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200239 lock_sock(sk);
240
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200241 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100242 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200243
244 release_sock(sk);
245
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200246 return err;
247}
248
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200249static int l2cap_sock_listen(struct socket *sock, int backlog)
250{
251 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300252 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200253 int err = 0;
254
255 BT_DBG("sk %p backlog %d", sk, backlog);
256
257 lock_sock(sk);
258
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200259 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200260 err = -EBADFD;
261 goto done;
262 }
263
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200264 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
265 err = -EINVAL;
266 goto done;
267 }
268
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300269 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200270 case L2CAP_MODE_BASIC:
Johan Hedberg38319712013-05-17 12:49:23 +0300271 case L2CAP_MODE_LE_FLOWCTL:
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200272 break;
273 case L2CAP_MODE_ERTM:
274 case L2CAP_MODE_STREAMING:
275 if (!disable_ertm)
276 break;
277 /* fall through */
278 default:
279 err = -ENOTSUPP;
280 goto done;
281 }
282
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200283 sk->sk_max_ack_backlog = backlog;
284 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300285
286 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200287 sk->sk_state = BT_LISTEN;
288
289done:
290 release_sock(sk);
291 return err;
292}
293
Gustavo Padovan2d792812012-10-06 10:07:01 +0100294static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
295 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200296{
297 DECLARE_WAITQUEUE(wait, current);
298 struct sock *sk = sock->sk, *nsk;
299 long timeo;
300 int err = 0;
301
302 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
303
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200304 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
305
306 BT_DBG("sk %p timeo %ld", sk, timeo);
307
308 /* Wait for an incoming connection. (wake-one). */
309 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400310 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200311 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200312
313 if (sk->sk_state != BT_LISTEN) {
314 err = -EBADFD;
315 break;
316 }
317
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400318 nsk = bt_accept_dequeue(sk, newsock);
319 if (nsk)
320 break;
321
322 if (!timeo) {
323 err = -EAGAIN;
324 break;
325 }
326
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200327 if (signal_pending(current)) {
328 err = sock_intr_errno(timeo);
329 break;
330 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400331
332 release_sock(sk);
333 timeo = schedule_timeout(timeo);
334 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200335 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400336 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200337 remove_wait_queue(sk_sleep(sk), &wait);
338
339 if (err)
340 goto done;
341
342 newsock->state = SS_CONNECTED;
343
344 BT_DBG("new socket %p", nsk);
345
346done:
347 release_sock(sk);
348 return err;
349}
350
Gustavo Padovan2d792812012-10-06 10:07:01 +0100351static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
352 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200353{
354 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
355 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300356 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200357
358 BT_DBG("sock %p, sk %p", sock, sk);
359
Mathias Krause792039c2012-08-15 11:31:51 +0000360 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200361 addr->sa_family = AF_BLUETOOTH;
362 *len = sizeof(struct sockaddr_l2);
363
364 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300365 la->l2_psm = chan->psm;
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700366 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300367 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700368 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200369 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300370 la->l2_psm = chan->sport;
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700371 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300372 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700373 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200374 }
375
376 return 0;
377}
378
Gustavo Padovan2d792812012-10-06 10:07:01 +0100379static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
380 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200381{
382 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300383 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200384 struct l2cap_options opts;
385 struct l2cap_conninfo cinfo;
386 int len, err = 0;
387 u32 opt;
388
389 BT_DBG("sk %p", sk);
390
391 if (get_user(len, optlen))
392 return -EFAULT;
393
394 lock_sock(sk);
395
396 switch (optname) {
397 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200398 /* LE sockets should use BT_SNDMTU/BT_RCVMTU, but since
399 * legacy ATT code depends on getsockopt for
400 * L2CAP_OPTIONS we need to let this pass.
401 */
402 if (bdaddr_type_is_le(chan->src_type) &&
403 chan->scid != L2CAP_CID_ATT) {
404 err = -EINVAL;
405 break;
406 }
407
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300408 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300409 opts.imtu = chan->imtu;
410 opts.omtu = chan->omtu;
411 opts.flush_to = chan->flush_to;
412 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300413 opts.fcs = chan->fcs;
414 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300415 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200416
417 len = min_t(unsigned int, len, sizeof(opts));
418 if (copy_to_user(optval, (char *) &opts, len))
419 err = -EFAULT;
420
421 break;
422
423 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300424 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200425 case BT_SECURITY_LOW:
426 opt = L2CAP_LM_AUTH;
427 break;
428 case BT_SECURITY_MEDIUM:
429 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
430 break;
431 case BT_SECURITY_HIGH:
432 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100433 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200434 break;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800435 case BT_SECURITY_FIPS:
436 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
437 L2CAP_LM_SECURE | L2CAP_LM_FIPS;
438 break;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200439 default:
440 opt = 0;
441 break;
442 }
443
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300444 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200445 opt |= L2CAP_LM_MASTER;
446
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300447 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200448 opt |= L2CAP_LM_RELIABLE;
449
450 if (put_user(opt, (u32 __user *) optval))
451 err = -EFAULT;
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800452
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200453 break;
454
455 case L2CAP_CONNINFO:
456 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300457 !(sk->sk_state == BT_CONNECT2 &&
458 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200459 err = -ENOTCONN;
460 break;
461 }
462
Filip Palian8d03e972011-05-12 19:32:46 +0200463 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300464 cinfo.hci_handle = chan->conn->hcon->handle;
465 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200466
467 len = min_t(unsigned int, len, sizeof(cinfo));
468 if (copy_to_user(optval, (char *) &cinfo, len))
469 err = -EFAULT;
470
471 break;
472
473 default:
474 err = -ENOPROTOOPT;
475 break;
476 }
477
478 release_sock(sk);
479 return err;
480}
481
Gustavo Padovan2d792812012-10-06 10:07:01 +0100482static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
483 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200484{
485 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300486 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200487 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700488 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200489 int len, err = 0;
490
491 BT_DBG("sk %p", sk);
492
493 if (level == SOL_L2CAP)
494 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
495
496 if (level != SOL_BLUETOOTH)
497 return -ENOPROTOOPT;
498
499 if (get_user(len, optlen))
500 return -EFAULT;
501
502 lock_sock(sk);
503
504 switch (optname) {
505 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300506 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100507 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200508 err = -EINVAL;
509 break;
510 }
511
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300512 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300513 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300514 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200515
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300516 if (sk->sk_state == BT_CONNECTED)
517 sec.key_size = chan->conn->hcon->enc_key_size;
518 } else {
519 sec.level = chan->sec_level;
520 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300521
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200522 len = min_t(unsigned int, len, sizeof(sec));
523 if (copy_to_user(optval, (char *) &sec, len))
524 err = -EFAULT;
525
526 break;
527
528 case BT_DEFER_SETUP:
529 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
530 err = -EINVAL;
531 break;
532 }
533
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300534 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
535 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200536 err = -EFAULT;
537
538 break;
539
540 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300541 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100542 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200543 err = -EFAULT;
544
545 break;
546
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700547 case BT_POWER:
548 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100549 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700550 err = -EINVAL;
551 break;
552 }
553
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300554 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700555
556 len = min_t(unsigned int, len, sizeof(pwr));
557 if (copy_to_user(optval, (char *) &pwr, len))
558 err = -EFAULT;
559
560 break;
561
Mat Martineau2ea66482011-11-02 16:18:30 -0700562 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700563 if (put_user(chan->chan_policy, (u32 __user *) optval))
564 err = -EFAULT;
565 break;
566
Johan Hedberg1f435422013-12-02 16:34:18 +0200567 case BT_SNDMTU:
568 if (!enable_lecoc) {
569 err = -EPROTONOSUPPORT;
570 break;
571 }
572
573 if (!bdaddr_type_is_le(chan->src_type)) {
574 err = -EINVAL;
575 break;
576 }
577
578 if (sk->sk_state != BT_CONNECTED) {
579 err = -ENOTCONN;
580 break;
581 }
582
583 if (put_user(chan->omtu, (u16 __user *) optval))
584 err = -EFAULT;
585 break;
586
587 case BT_RCVMTU:
588 if (!enable_lecoc) {
589 err = -EPROTONOSUPPORT;
590 break;
591 }
592
593 if (!bdaddr_type_is_le(chan->src_type)) {
594 err = -EINVAL;
595 break;
596 }
597
598 if (put_user(chan->imtu, (u16 __user *) optval))
599 err = -EFAULT;
600 break;
601
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200602 default:
603 err = -ENOPROTOOPT;
604 break;
605 }
606
607 release_sock(sk);
608 return err;
609}
610
Andre Guedes682877c2012-05-31 17:01:34 -0300611static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
612{
613 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300614 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300615 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300616 return false;
617 break;
618
619 default:
620 if (mtu < L2CAP_DEFAULT_MIN_MTU)
621 return false;
622 }
623
624 return true;
625}
626
Gustavo Padovan2d792812012-10-06 10:07:01 +0100627static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
628 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200629{
630 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300631 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200632 struct l2cap_options opts;
633 int len, err = 0;
634 u32 opt;
635
636 BT_DBG("sk %p", sk);
637
638 lock_sock(sk);
639
640 switch (optname) {
641 case L2CAP_OPTIONS:
Johan Hedberg64b4f8d2013-12-02 16:02:03 +0200642 if (bdaddr_type_is_le(chan->src_type)) {
643 err = -EINVAL;
644 break;
645 }
646
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200647 if (sk->sk_state == BT_CONNECTED) {
648 err = -EINVAL;
649 break;
650 }
651
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300652 opts.imtu = chan->imtu;
653 opts.omtu = chan->omtu;
654 opts.flush_to = chan->flush_to;
655 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300656 opts.fcs = chan->fcs;
657 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300658 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200659
660 len = min_t(unsigned int, sizeof(opts), optlen);
661 if (copy_from_user((char *) &opts, optval, len)) {
662 err = -EFAULT;
663 break;
664 }
665
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300666 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200667 err = -EINVAL;
668 break;
669 }
670
Andre Guedes682877c2012-05-31 17:01:34 -0300671 if (!l2cap_valid_mtu(chan, opts.imtu)) {
672 err = -EINVAL;
673 break;
674 }
675
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300676 chan->mode = opts.mode;
677 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +0300678 case L2CAP_MODE_LE_FLOWCTL:
679 break;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200680 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300681 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200682 break;
683 case L2CAP_MODE_ERTM:
684 case L2CAP_MODE_STREAMING:
685 if (!disable_ertm)
686 break;
687 /* fall through */
688 default:
689 err = -EINVAL;
690 break;
691 }
692
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300693 chan->imtu = opts.imtu;
694 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300695 chan->fcs = opts.fcs;
696 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300697 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300698 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200699 break;
700
701 case L2CAP_LM:
702 if (get_user(opt, (u32 __user *) optval)) {
703 err = -EFAULT;
704 break;
705 }
706
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800707 if (opt & L2CAP_LM_FIPS) {
708 err = -EINVAL;
709 break;
710 }
711
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200712 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300713 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200714 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300715 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200716 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300717 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200718
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300719 if (opt & L2CAP_LM_MASTER)
720 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
721 else
722 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300723
724 if (opt & L2CAP_LM_RELIABLE)
725 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
726 else
727 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200728 break;
729
730 default:
731 err = -ENOPROTOOPT;
732 break;
733 }
734
735 release_sock(sk);
736 return err;
737}
738
Gustavo Padovan2d792812012-10-06 10:07:01 +0100739static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
740 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200741{
742 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300743 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200744 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700745 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300746 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200747 int len, err = 0;
748 u32 opt;
749
750 BT_DBG("sk %p", sk);
751
752 if (level == SOL_L2CAP)
753 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
754
755 if (level != SOL_BLUETOOTH)
756 return -ENOPROTOOPT;
757
758 lock_sock(sk);
759
760 switch (optname) {
761 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300762 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100763 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200764 err = -EINVAL;
765 break;
766 }
767
768 sec.level = BT_SECURITY_LOW;
769
770 len = min_t(unsigned int, sizeof(sec), optlen);
771 if (copy_from_user((char *) &sec, optval, len)) {
772 err = -EFAULT;
773 break;
774 }
775
776 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100777 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200778 err = -EINVAL;
779 break;
780 }
781
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300782 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300783
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200784 if (!chan->conn)
785 break;
786
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300787 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200788
789 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300790 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300791 if (!conn->hcon->out) {
792 err = -EINVAL;
793 break;
794 }
795
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300796 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300797 break;
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) {
805 if (!l2cap_chan_check_security(chan))
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:
908 if (!enable_lecoc) {
909 err = -EPROTONOSUPPORT;
910 break;
911 }
912
913 if (!bdaddr_type_is_le(chan->src_type)) {
914 err = -EINVAL;
915 break;
916 }
917
918 /* Setting is not supported as it's the remote side that
919 * decides this.
920 */
921 err = -EPERM;
922 break;
923
924 case BT_RCVMTU:
925 if (!enable_lecoc) {
926 err = -EPROTONOSUPPORT;
927 break;
928 }
929
930 if (!bdaddr_type_is_le(chan->src_type)) {
931 err = -EINVAL;
932 break;
933 }
934
935 if (sk->sk_state == BT_CONNECTED) {
936 err = -EISCONN;
937 break;
938 }
939
940 if (get_user(opt, (u32 __user *) optval)) {
941 err = -EFAULT;
942 break;
943 }
944
945 chan->imtu = opt;
946 break;
947
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200948 default:
949 err = -ENOPROTOOPT;
950 break;
951 }
952
953 release_sock(sk);
954 return err;
955}
956
Gustavo Padovan2d792812012-10-06 10:07:01 +0100957static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
958 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200959{
960 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300961 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200962 int err;
963
964 BT_DBG("sock %p, sk %p", sock, sk);
965
966 err = sock_error(sk);
967 if (err)
968 return err;
969
970 if (msg->msg_flags & MSG_OOB)
971 return -EOPNOTSUPP;
972
Mat Martineaua6a55682012-05-04 14:20:31 -0700973 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300974 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200975
Johan Hedberge793dcf2013-09-16 13:05:19 +0300976 lock_sock(sk);
977 err = bt_sock_wait_ready(sk, msg->msg_flags);
978 release_sock(sk);
979 if (err)
980 return err;
981
Mat Martineaua6a55682012-05-04 14:20:31 -0700982 l2cap_chan_lock(chan);
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200983 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Mat Martineaua6a55682012-05-04 14:20:31 -0700984 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200985
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200986 return err;
987}
988
Gustavo Padovan2d792812012-10-06 10:07:01 +0100989static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
990 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200991{
992 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700993 struct l2cap_pinfo *pi = l2cap_pi(sk);
994 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200995
996 lock_sock(sk);
997
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300998 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
999 &bt_sk(sk)->flags)) {
Johan Hedberg38319712013-05-17 12:49:23 +03001000 if (bdaddr_type_is_le(pi->chan->src_type)) {
1001 sk->sk_state = BT_CONNECTED;
1002 pi->chan->state = BT_CONNECTED;
1003 __l2cap_le_connect_rsp_defer(pi->chan);
1004 } else {
1005 sk->sk_state = BT_CONFIG;
1006 pi->chan->state = BT_CONFIG;
1007 __l2cap_connect_rsp_defer(pi->chan);
1008 }
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001009
Johan Hedberg970871b2013-09-25 13:26:05 +03001010 err = 0;
1011 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001012 }
1013
1014 release_sock(sk);
1015
1016 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -07001017 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
1018 else
1019 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001020
Mat Martineaue3281402011-07-07 09:39:02 -07001021 if (pi->chan->mode != L2CAP_MODE_ERTM)
1022 return err;
1023
1024 /* Attempt to put pending rx data in the socket buffer */
1025
1026 lock_sock(sk);
1027
1028 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
1029 goto done;
1030
1031 if (pi->rx_busy_skb) {
1032 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
1033 pi->rx_busy_skb = NULL;
1034 else
1035 goto done;
1036 }
1037
1038 /* Restore data flow when half of the receive buffer is
1039 * available. This avoids resending large numbers of
1040 * frames.
1041 */
1042 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
1043 l2cap_chan_busy(pi->chan, 0);
1044
1045done:
1046 release_sock(sk);
1047 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -02001048}
1049
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001050/* Kill socket (only if zapped and orphan)
1051 * Must be called on unlocked socket.
1052 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001053static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001054{
1055 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
1056 return;
1057
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +02001058 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001059
1060 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -03001061
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +05301062 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -02001063 sock_set_flag(sk, SOCK_DEAD);
1064 sock_put(sk);
1065}
1066
Gustavo Padovandc253062013-10-15 19:24:49 -03001067static int __l2cap_wait_ack(struct sock *sk)
1068{
1069 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1070 DECLARE_WAITQUEUE(wait, current);
1071 int err = 0;
1072 int timeo = HZ/5;
1073
1074 add_wait_queue(sk_sleep(sk), &wait);
1075 set_current_state(TASK_INTERRUPTIBLE);
1076 while (chan->unacked_frames > 0 && chan->conn) {
1077 if (!timeo)
1078 timeo = HZ/5;
1079
1080 if (signal_pending(current)) {
1081 err = sock_intr_errno(timeo);
1082 break;
1083 }
1084
1085 release_sock(sk);
1086 timeo = schedule_timeout(timeo);
1087 lock_sock(sk);
1088 set_current_state(TASK_INTERRUPTIBLE);
1089
1090 err = sock_error(sk);
1091 if (err)
1092 break;
1093 }
1094 set_current_state(TASK_RUNNING);
1095 remove_wait_queue(sk_sleep(sk), &wait);
1096 return err;
1097}
1098
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001099static int l2cap_sock_shutdown(struct socket *sock, int how)
1100{
1101 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001102 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001103 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001104 int err = 0;
1105
1106 BT_DBG("sock %p, sk %p", sock, sk);
1107
1108 if (!sk)
1109 return 0;
1110
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001111 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001112 conn = chan->conn;
1113
1114 if (conn)
1115 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +02001116
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001117 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001118 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001119
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001120 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001121 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001122 err = __l2cap_wait_ack(sk);
1123
1124 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001125
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001126 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03001127 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001128 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001129
1130 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
1131 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001132 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001133 }
1134
1135 if (!err && sk->sk_err)
1136 err = -sk->sk_err;
1137
1138 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001139 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001140
1141 if (conn)
1142 mutex_unlock(&conn->chan_lock);
1143
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001144 return err;
1145}
1146
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001147static int l2cap_sock_release(struct socket *sock)
1148{
1149 struct sock *sk = sock->sk;
1150 int err;
1151
1152 BT_DBG("sock %p, sk %p", sock, sk);
1153
1154 if (!sk)
1155 return 0;
1156
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001157 bt_sock_unlink(&l2cap_sk_list, sk);
1158
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001159 err = l2cap_sock_shutdown(sock, 2);
1160
1161 sock_orphan(sk);
1162 l2cap_sock_kill(sk);
1163 return err;
1164}
1165
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001166static void l2cap_sock_cleanup_listen(struct sock *parent)
1167{
1168 struct sock *sk;
1169
1170 BT_DBG("parent %p", parent);
1171
1172 /* Close not yet accepted channels */
1173 while ((sk = bt_accept_dequeue(parent, NULL))) {
1174 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1175
1176 l2cap_chan_lock(chan);
1177 __clear_chan_timer(chan);
1178 l2cap_chan_close(chan, ECONNRESET);
1179 l2cap_chan_unlock(chan);
1180
1181 l2cap_sock_kill(sk);
1182 }
1183}
1184
Gustavo Padovan80b98022012-05-27 22:27:51 -03001185static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001186{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001187 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001188
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001189 lock_sock(parent);
1190
Gustavo Padovan53826692012-05-27 22:27:55 -03001191 /* Check for backlog size */
1192 if (sk_acceptq_is_full(parent)) {
1193 BT_DBG("backlog full %d", parent->sk_ack_backlog);
1194 return NULL;
1195 }
1196
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001197 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001198 GFP_ATOMIC);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001199 if (!sk)
1200 return NULL;
1201
Octavian Purdilad22015a2012-01-22 00:28:34 +02001202 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1203
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001204 l2cap_sock_init(sk, parent);
1205
Gustavo Padovan644912e2012-10-12 19:35:23 +08001206 bt_accept_enqueue(parent, sk);
1207
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001208 release_sock(parent);
1209
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001210 return l2cap_pi(sk)->chan;
1211}
1212
Gustavo Padovan80b98022012-05-27 22:27:51 -03001213static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001214{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001215 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001216 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001217
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001218 lock_sock(sk);
1219
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001220 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001221 err = -ENOMEM;
1222 goto done;
1223 }
Mat Martineaue3281402011-07-07 09:39:02 -07001224
1225 err = sock_queue_rcv_skb(sk, skb);
1226
1227 /* For ERTM, handle one skb that doesn't fit into the recv
1228 * buffer. This is important to do because the data frames
1229 * have already been acked, so the skb cannot be discarded.
1230 *
1231 * Notify the l2cap core that the buffer is full, so the
1232 * LOCAL_BUSY state is entered and no more frames are
1233 * acked and reassembled until there is buffer space
1234 * available.
1235 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001236 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1237 l2cap_pi(sk)->rx_busy_skb = skb;
1238 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001239 err = 0;
1240 }
1241
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001242done:
1243 release_sock(sk);
1244
Mat Martineaue3281402011-07-07 09:39:02 -07001245 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001246}
1247
Gustavo Padovan80b98022012-05-27 22:27:51 -03001248static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001249{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001250 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001251
1252 l2cap_sock_kill(sk);
1253}
1254
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001255static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1256{
1257 struct sock *sk = chan->data;
1258 struct sock *parent;
1259
1260 lock_sock(sk);
1261
1262 parent = bt_sk(sk)->parent;
1263
1264 sock_set_flag(sk, SOCK_ZAPPED);
1265
1266 switch (chan->state) {
1267 case BT_OPEN:
1268 case BT_BOUND:
1269 case BT_CLOSED:
1270 break;
1271 case BT_LISTEN:
1272 l2cap_sock_cleanup_listen(sk);
1273 sk->sk_state = BT_CLOSED;
1274 chan->state = BT_CLOSED;
1275
1276 break;
1277 default:
1278 sk->sk_state = BT_CLOSED;
1279 chan->state = BT_CLOSED;
1280
1281 sk->sk_err = err;
1282
1283 if (parent) {
1284 bt_accept_unlink(sk);
1285 parent->sk_data_ready(parent, 0);
1286 } else {
1287 sk->sk_state_change(sk);
1288 }
1289
1290 break;
1291 }
1292
1293 release_sock(sk);
1294}
1295
Gustavo Padovan53f52122013-10-15 19:24:45 -03001296static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1297 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001298{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001299 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001300
1301 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001302
1303 if (err)
1304 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001305}
1306
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001307static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -03001308 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001309{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001310 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001311 struct sk_buff *skb;
1312 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001313
Mat Martineaua6a55682012-05-04 14:20:31 -07001314 l2cap_chan_unlock(chan);
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001315 skb = bt_skb_send_alloc(sk, len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001316 l2cap_chan_lock(chan);
1317
Gustavo Padovan90338942012-04-06 20:15:47 -03001318 if (!skb)
1319 return ERR_PTR(err);
1320
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001321 bt_cb(skb)->chan = chan;
1322
Gustavo Padovan90338942012-04-06 20:15:47 -03001323 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001324}
1325
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001326static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1327{
1328 struct sock *sk = chan->data;
1329 struct sock *parent;
1330
1331 lock_sock(sk);
1332
1333 parent = bt_sk(sk)->parent;
1334
1335 BT_DBG("sk %p, parent %p", sk, parent);
1336
1337 sk->sk_state = BT_CONNECTED;
1338 sk->sk_state_change(sk);
1339
1340 if (parent)
1341 parent->sk_data_ready(parent, 0);
1342
1343 release_sock(sk);
1344}
1345
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001346static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1347{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001348 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001349
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001350 lock_sock(sk);
1351
1352 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001353 if (parent)
1354 parent->sk_data_ready(parent, 0);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001355
1356 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001357}
1358
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001359static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1360{
1361 struct sock *sk = chan->data;
1362
1363 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1364 sk->sk_state_change(sk);
1365}
1366
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001367static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1368{
1369 struct sock *sk = chan->data;
1370
1371 lock_sock(sk);
1372 sk->sk_shutdown = SHUTDOWN_MASK;
1373 release_sock(sk);
1374}
1375
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001376static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1377{
1378 struct sock *sk = chan->data;
1379
1380 return sk->sk_sndtimeo;
1381}
1382
Johan Hedberg837776f2013-10-15 11:03:18 +03001383static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
1384{
1385 struct sock *sk = chan->data;
1386
1387 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1388 sk->sk_state_change(sk);
1389}
1390
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001391static struct l2cap_ops l2cap_chan_ops = {
1392 .name = "L2CAP Socket Interface",
1393 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001394 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001395 .close = l2cap_sock_close_cb,
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001396 .teardown = l2cap_sock_teardown_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001397 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001398 .ready = l2cap_sock_ready_cb,
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001399 .defer = l2cap_sock_defer_cb,
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001400 .resume = l2cap_sock_resume_cb,
Johan Hedberg837776f2013-10-15 11:03:18 +03001401 .suspend = l2cap_sock_suspend_cb,
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001402 .set_shutdown = l2cap_sock_set_shutdown_cb,
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001403 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001404 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001405};
1406
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001407static void l2cap_sock_destruct(struct sock *sk)
1408{
1409 BT_DBG("sk %p", sk);
1410
Sasha Levin23d3a862012-10-08 16:48:32 -04001411 if (l2cap_pi(sk)->chan)
1412 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001413
Mat Martineaue3281402011-07-07 09:39:02 -07001414 if (l2cap_pi(sk)->rx_busy_skb) {
1415 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1416 l2cap_pi(sk)->rx_busy_skb = NULL;
1417 }
1418
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001419 skb_queue_purge(&sk->sk_receive_queue);
1420 skb_queue_purge(&sk->sk_write_queue);
1421}
1422
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001423static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1424 int *msg_namelen)
1425{
Steffen Hurrle342dfc32014-01-17 22:53:15 +01001426 DECLARE_SOCKADDR(struct sockaddr_l2 *, la, msg_name);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001427
1428 memset(la, 0, sizeof(struct sockaddr_l2));
1429 la->l2_family = AF_BLUETOOTH;
1430 la->l2_psm = bt_cb(skb)->psm;
1431 bacpy(&la->l2_bdaddr, &bt_cb(skb)->bdaddr);
1432
1433 *msg_namelen = sizeof(struct sockaddr_l2);
1434}
1435
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001436static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001437{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001438 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001439
1440 BT_DBG("sk %p", sk);
1441
1442 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001443 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1444
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001445 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001446 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001447
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001448 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001449 chan->imtu = pchan->imtu;
1450 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001451 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001452 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001453 chan->fcs = pchan->fcs;
1454 chan->max_tx = pchan->max_tx;
1455 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001456 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001457 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001458 chan->flags = pchan->flags;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001459 chan->tx_credits = pchan->tx_credits;
1460 chan->rx_credits = pchan->rx_credits;
Paul Moore6230c9b2011-10-07 09:40:59 +00001461
1462 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001463 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001464 switch (sk->sk_type) {
1465 case SOCK_RAW:
1466 chan->chan_type = L2CAP_CHAN_RAW;
1467 break;
1468 case SOCK_DGRAM:
1469 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001470 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001471 break;
1472 case SOCK_SEQPACKET:
1473 case SOCK_STREAM:
1474 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1475 break;
1476 }
1477
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001478 chan->imtu = L2CAP_DEFAULT_MTU;
1479 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001480 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001481 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001482 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001483 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001484 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001485 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001486
1487 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001488 }
1489
1490 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001491 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001492
1493 chan->data = sk;
1494 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001495}
1496
1497static struct proto l2cap_proto = {
1498 .name = "L2CAP",
1499 .owner = THIS_MODULE,
1500 .obj_size = sizeof(struct l2cap_pinfo)
1501};
1502
Gustavo Padovan2d792812012-10-06 10:07:01 +01001503static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1504 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001505{
1506 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001507 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001508
1509 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1510 if (!sk)
1511 return NULL;
1512
1513 sock_init_data(sock, sk);
1514 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1515
1516 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001517 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001518
1519 sock_reset_flag(sk, SOCK_ZAPPED);
1520
1521 sk->sk_protocol = proto;
1522 sk->sk_state = BT_OPEN;
1523
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001524 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001525 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301526 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001527 return NULL;
1528 }
1529
Mat Martineau61d6ef32012-04-27 16:50:50 -07001530 l2cap_chan_hold(chan);
1531
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001532 l2cap_pi(sk)->chan = chan;
1533
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001534 return sk;
1535}
1536
1537static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1538 int kern)
1539{
1540 struct sock *sk;
1541
1542 BT_DBG("sock %p", sock);
1543
1544 sock->state = SS_UNCONNECTED;
1545
1546 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001547 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001548 return -ESOCKTNOSUPPORT;
1549
1550 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1551 return -EPERM;
1552
1553 sock->ops = &l2cap_sock_ops;
1554
1555 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1556 if (!sk)
1557 return -ENOMEM;
1558
1559 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001560 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001561 return 0;
1562}
1563
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001564static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001565 .family = PF_BLUETOOTH,
1566 .owner = THIS_MODULE,
1567 .release = l2cap_sock_release,
1568 .bind = l2cap_sock_bind,
1569 .connect = l2cap_sock_connect,
1570 .listen = l2cap_sock_listen,
1571 .accept = l2cap_sock_accept,
1572 .getname = l2cap_sock_getname,
1573 .sendmsg = l2cap_sock_sendmsg,
1574 .recvmsg = l2cap_sock_recvmsg,
1575 .poll = bt_sock_poll,
1576 .ioctl = bt_sock_ioctl,
1577 .mmap = sock_no_mmap,
1578 .socketpair = sock_no_socketpair,
1579 .shutdown = l2cap_sock_shutdown,
1580 .setsockopt = l2cap_sock_setsockopt,
1581 .getsockopt = l2cap_sock_getsockopt
1582};
1583
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001584static const struct net_proto_family l2cap_sock_family_ops = {
1585 .family = PF_BLUETOOTH,
1586 .owner = THIS_MODULE,
1587 .create = l2cap_sock_create,
1588};
1589
1590int __init l2cap_init_sockets(void)
1591{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001592 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001593
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001594 err = proto_register(&l2cap_proto, 0);
1595 if (err < 0)
1596 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001597
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001598 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001599 if (err < 0) {
1600 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001601 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001602 }
1603
Al Virob0316612013-04-04 19:14:33 -04001604 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001605 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001606 if (err < 0) {
1607 BT_ERR("Failed to create L2CAP proc file");
1608 bt_sock_unregister(BTPROTO_L2CAP);
1609 goto error;
1610 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001611
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001612 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001613
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001614 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001615
1616error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001617 proto_unregister(&l2cap_proto);
1618 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001619}
1620
1621void l2cap_cleanup_sockets(void)
1622{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001623 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001624 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001625 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001626}
Johan Hedberg91497612013-12-02 11:20:20 +02001627
1628module_param(enable_lecoc, bool, 0644);
1629MODULE_PARM_DESC(enable_lecoc, "Enable support for LE CoC");