blob: 5a1d0cb0b8d50f294fed06b8d8d60363e7c7f90c [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
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020056static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
57{
58 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030059 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020060 struct sockaddr_l2 la;
61 int len, err = 0;
62
63 BT_DBG("sk %p", sk);
64
65 if (!addr || addr->sa_family != AF_BLUETOOTH)
66 return -EINVAL;
67
68 memset(&la, 0, sizeof(la));
69 len = min_t(unsigned int, sizeof(la), alen);
70 memcpy(&la, addr, len);
71
Ville Tervob62f3282011-02-10 22:38:50 -030072 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020073 return -EINVAL;
74
Johan Hedberg80c1a2e2013-10-14 21:17:52 +030075 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
76 return -EINVAL;
77
Johan Hedbergbfe46552013-10-16 17:13:26 +030078 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedberg91497612013-12-02 11:20:20 +020079 if (!enable_lecoc && la.l2_psm)
Johan Hedbergbfe46552013-10-16 17:13:26 +030080 return -EINVAL;
81 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +020082 if (la.l2_cid &&
83 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +030084 return -EINVAL;
85 }
86
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020087 lock_sock(sk);
88
89 if (sk->sk_state != BT_OPEN) {
90 err = -EBADFD;
91 goto done;
92 }
93
94 if (la.l2_psm) {
95 __u16 psm = __le16_to_cpu(la.l2_psm);
96
97 /* PSM must be odd and lsb of upper byte must be 0 */
98 if ((psm & 0x0101) != 0x0001) {
99 err = -EINVAL;
100 goto done;
101 }
102
103 /* Restrict usage of well-known PSMs */
104 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
105 err = -EACCES;
106 goto done;
107 }
108 }
109
Ville Tervob62f3282011-02-10 22:38:50 -0300110 if (la.l2_cid)
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530111 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300112 else
113 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -0300114
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300115 if (err < 0)
116 goto done;
117
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700118 switch (chan->chan_type) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700119 case L2CAP_CHAN_CONN_LESS:
120 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_3DSP)
121 chan->sec_level = BT_SECURITY_SDP;
122 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700123 case L2CAP_CHAN_CONN_ORIENTED:
124 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
125 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
126 chan->sec_level = BT_SECURITY_SDP;
127 break;
128 }
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300129
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700130 bacpy(&chan->src, &la.l2_bdaddr);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700131 chan->src_type = la.l2_bdaddr_type;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300132
133 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300134 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200135
136done:
137 release_sock(sk);
138 return err;
139}
140
Gustavo Padovan2d792812012-10-06 10:07:01 +0100141static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
142 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200143{
144 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300145 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200146 struct sockaddr_l2 la;
147 int len, err = 0;
148
149 BT_DBG("sk %p", sk);
150
151 if (!addr || alen < sizeof(addr->sa_family) ||
152 addr->sa_family != AF_BLUETOOTH)
153 return -EINVAL;
154
155 memset(&la, 0, sizeof(la));
156 len = min_t(unsigned int, sizeof(la), alen);
157 memcpy(&la, addr, len);
158
Ville Tervoacd7d372011-02-10 22:38:49 -0300159 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200160 return -EINVAL;
161
Johan Hedberg80c1a2e2013-10-14 21:17:52 +0300162 if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
163 return -EINVAL;
164
Johan Hedbergeb622492013-10-18 11:49:25 +0300165 /* Check that the socket wasn't bound to something that
166 * conflicts with the address given to connect(). If chan->src
167 * is BDADDR_ANY it means bind() was never used, in which case
168 * chan->src_type and la.l2_bdaddr_type do not need to match.
169 */
170 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) &&
171 bdaddr_type_is_le(la.l2_bdaddr_type)) {
172 /* Old user space versions will try to incorrectly bind
173 * the ATT socket using BDADDR_BREDR. We need to accept
174 * this and fix up the source address type only when
175 * both the source CID and destination CID indicate
176 * ATT. Anything else is an invalid combination.
177 */
178 if (chan->scid != L2CAP_CID_ATT ||
179 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
180 return -EINVAL;
181
182 /* We don't have the hdev available here to make a
183 * better decision on random vs public, but since all
184 * user space versions that exhibit this issue anyway do
185 * not support random local addresses assuming public
186 * here is good enough.
187 */
188 chan->src_type = BDADDR_LE_PUBLIC;
189 }
Johan Hedberg1f209382013-10-14 21:17:53 +0300190
191 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR)
192 return -EINVAL;
193
Johan Hedbergbfe46552013-10-16 17:13:26 +0300194 if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
Johan Hedberg91497612013-12-02 11:20:20 +0200195 if (!enable_lecoc && la.l2_psm)
Johan Hedbergbfe46552013-10-16 17:13:26 +0300196 return -EINVAL;
197 /* We only allow ATT user space socket */
Johan Hedberg91497612013-12-02 11:20:20 +0200198 if (la.l2_cid &&
199 la.l2_cid != __constant_cpu_to_le16(L2CAP_CID_ATT))
Johan Hedbergbfe46552013-10-16 17:13:26 +0300200 return -EINVAL;
201 }
202
Santosh Nayak6e4aff12012-03-01 22:46:36 +0530203 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
Andre Guedes8e9f9892012-04-24 21:02:55 -0300204 &la.l2_bdaddr, la.l2_bdaddr_type);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200205 if (err)
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200206 return err;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200207
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200208 lock_sock(sk);
209
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200210 err = bt_sock_wait_state(sk, BT_CONNECTED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100211 sock_sndtimeo(sk, flags & O_NONBLOCK));
Andrei Emeltchenkob3fb6112012-02-22 17:11:57 +0200212
213 release_sock(sk);
214
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200215 return err;
216}
217
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200218static int l2cap_sock_listen(struct socket *sock, int backlog)
219{
220 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300221 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200222 int err = 0;
223
224 BT_DBG("sk %p backlog %d", sk, backlog);
225
226 lock_sock(sk);
227
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200228 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200229 err = -EBADFD;
230 goto done;
231 }
232
Marcel Holtmann6b3af732012-04-19 13:43:51 +0200233 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
234 err = -EINVAL;
235 goto done;
236 }
237
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300238 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200239 case L2CAP_MODE_BASIC:
240 break;
241 case L2CAP_MODE_ERTM:
242 case L2CAP_MODE_STREAMING:
243 if (!disable_ertm)
244 break;
245 /* fall through */
246 default:
247 err = -ENOTSUPP;
248 goto done;
249 }
250
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200251 sk->sk_max_ack_backlog = backlog;
252 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300253
254 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200255 sk->sk_state = BT_LISTEN;
256
257done:
258 release_sock(sk);
259 return err;
260}
261
Gustavo Padovan2d792812012-10-06 10:07:01 +0100262static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
263 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200264{
265 DECLARE_WAITQUEUE(wait, current);
266 struct sock *sk = sock->sk, *nsk;
267 long timeo;
268 int err = 0;
269
270 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
271
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200272 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
273
274 BT_DBG("sk %p timeo %ld", sk, timeo);
275
276 /* Wait for an incoming connection. (wake-one). */
277 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400278 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200279 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200280
281 if (sk->sk_state != BT_LISTEN) {
282 err = -EBADFD;
283 break;
284 }
285
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400286 nsk = bt_accept_dequeue(sk, newsock);
287 if (nsk)
288 break;
289
290 if (!timeo) {
291 err = -EAGAIN;
292 break;
293 }
294
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200295 if (signal_pending(current)) {
296 err = sock_intr_errno(timeo);
297 break;
298 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400299
300 release_sock(sk);
301 timeo = schedule_timeout(timeo);
302 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200303 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400304 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200305 remove_wait_queue(sk_sleep(sk), &wait);
306
307 if (err)
308 goto done;
309
310 newsock->state = SS_CONNECTED;
311
312 BT_DBG("new socket %p", nsk);
313
314done:
315 release_sock(sk);
316 return err;
317}
318
Gustavo Padovan2d792812012-10-06 10:07:01 +0100319static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
320 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200321{
322 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
323 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300324 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200325
326 BT_DBG("sock %p, sk %p", sock, sk);
327
Mathias Krause792039c2012-08-15 11:31:51 +0000328 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200329 addr->sa_family = AF_BLUETOOTH;
330 *len = sizeof(struct sockaddr_l2);
331
332 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300333 la->l2_psm = chan->psm;
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700334 bacpy(&la->l2_bdaddr, &chan->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300335 la->l2_cid = cpu_to_le16(chan->dcid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700336 la->l2_bdaddr_type = chan->dst_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200337 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300338 la->l2_psm = chan->sport;
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700339 bacpy(&la->l2_bdaddr, &chan->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300340 la->l2_cid = cpu_to_le16(chan->scid);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -0700341 la->l2_bdaddr_type = chan->src_type;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200342 }
343
344 return 0;
345}
346
Gustavo Padovan2d792812012-10-06 10:07:01 +0100347static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
348 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200349{
350 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300351 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200352 struct l2cap_options opts;
353 struct l2cap_conninfo cinfo;
354 int len, err = 0;
355 u32 opt;
356
357 BT_DBG("sk %p", sk);
358
359 if (get_user(len, optlen))
360 return -EFAULT;
361
362 lock_sock(sk);
363
364 switch (optname) {
365 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300366 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300367 opts.imtu = chan->imtu;
368 opts.omtu = chan->omtu;
369 opts.flush_to = chan->flush_to;
370 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300371 opts.fcs = chan->fcs;
372 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300373 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200374
375 len = min_t(unsigned int, len, sizeof(opts));
376 if (copy_to_user(optval, (char *) &opts, len))
377 err = -EFAULT;
378
379 break;
380
381 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300382 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200383 case BT_SECURITY_LOW:
384 opt = L2CAP_LM_AUTH;
385 break;
386 case BT_SECURITY_MEDIUM:
387 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
388 break;
389 case BT_SECURITY_HIGH:
390 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
Gustavo Padovan2d792812012-10-06 10:07:01 +0100391 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200392 break;
393 default:
394 opt = 0;
395 break;
396 }
397
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300398 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200399 opt |= L2CAP_LM_MASTER;
400
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300401 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200402 opt |= L2CAP_LM_RELIABLE;
403
404 if (put_user(opt, (u32 __user *) optval))
405 err = -EFAULT;
406 break;
407
408 case L2CAP_CONNINFO:
409 if (sk->sk_state != BT_CONNECTED &&
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300410 !(sk->sk_state == BT_CONNECT2 &&
411 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200412 err = -ENOTCONN;
413 break;
414 }
415
Filip Palian8d03e972011-05-12 19:32:46 +0200416 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300417 cinfo.hci_handle = chan->conn->hcon->handle;
418 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200419
420 len = min_t(unsigned int, len, sizeof(cinfo));
421 if (copy_to_user(optval, (char *) &cinfo, len))
422 err = -EFAULT;
423
424 break;
425
426 default:
427 err = -ENOPROTOOPT;
428 break;
429 }
430
431 release_sock(sk);
432 return err;
433}
434
Gustavo Padovan2d792812012-10-06 10:07:01 +0100435static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
436 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200437{
438 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300439 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200440 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700441 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200442 int len, err = 0;
443
444 BT_DBG("sk %p", sk);
445
446 if (level == SOL_L2CAP)
447 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
448
449 if (level != SOL_BLUETOOTH)
450 return -ENOPROTOOPT;
451
452 if (get_user(len, optlen))
453 return -EFAULT;
454
455 lock_sock(sk);
456
457 switch (optname) {
458 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300459 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100460 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200461 err = -EINVAL;
462 break;
463 }
464
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300465 memset(&sec, 0, sizeof(sec));
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300466 if (chan->conn) {
Gustavo Padovanc6585a42012-05-07 03:07:26 -0300467 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200468
Andrei Emeltchenko85e34362012-10-05 16:56:54 +0300469 if (sk->sk_state == BT_CONNECTED)
470 sec.key_size = chan->conn->hcon->enc_key_size;
471 } else {
472 sec.level = chan->sec_level;
473 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300474
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200475 len = min_t(unsigned int, len, sizeof(sec));
476 if (copy_to_user(optval, (char *) &sec, len))
477 err = -EFAULT;
478
479 break;
480
481 case BT_DEFER_SETUP:
482 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
483 err = -EINVAL;
484 break;
485 }
486
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300487 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
488 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200489 err = -EFAULT;
490
491 break;
492
493 case BT_FLUSHABLE:
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300494 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100495 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200496 err = -EFAULT;
497
498 break;
499
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700500 case BT_POWER:
501 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
Gustavo Padovan2d792812012-10-06 10:07:01 +0100502 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700503 err = -EINVAL;
504 break;
505 }
506
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300507 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700508
509 len = min_t(unsigned int, len, sizeof(pwr));
510 if (copy_to_user(optval, (char *) &pwr, len))
511 err = -EFAULT;
512
513 break;
514
Mat Martineau2ea66482011-11-02 16:18:30 -0700515 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700516 if (put_user(chan->chan_policy, (u32 __user *) optval))
517 err = -EFAULT;
518 break;
519
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200520 default:
521 err = -ENOPROTOOPT;
522 break;
523 }
524
525 release_sock(sk);
526 return err;
527}
528
Andre Guedes682877c2012-05-31 17:01:34 -0300529static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
530{
531 switch (chan->scid) {
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300532 case L2CAP_CID_ATT:
Andre Guedes8c3a4f02012-05-31 17:01:35 -0300533 if (mtu < L2CAP_LE_MIN_MTU)
Andre Guedes682877c2012-05-31 17:01:34 -0300534 return false;
535 break;
536
537 default:
538 if (mtu < L2CAP_DEFAULT_MIN_MTU)
539 return false;
540 }
541
542 return true;
543}
544
Gustavo Padovan2d792812012-10-06 10:07:01 +0100545static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
546 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200547{
548 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300549 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200550 struct l2cap_options opts;
551 int len, err = 0;
552 u32 opt;
553
554 BT_DBG("sk %p", sk);
555
556 lock_sock(sk);
557
558 switch (optname) {
559 case L2CAP_OPTIONS:
560 if (sk->sk_state == BT_CONNECTED) {
561 err = -EINVAL;
562 break;
563 }
564
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300565 opts.imtu = chan->imtu;
566 opts.omtu = chan->omtu;
567 opts.flush_to = chan->flush_to;
568 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300569 opts.fcs = chan->fcs;
570 opts.max_tx = chan->max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300571 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200572
573 len = min_t(unsigned int, sizeof(opts), optlen);
574 if (copy_from_user((char *) &opts, optval, len)) {
575 err = -EFAULT;
576 break;
577 }
578
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300579 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200580 err = -EINVAL;
581 break;
582 }
583
Andre Guedes682877c2012-05-31 17:01:34 -0300584 if (!l2cap_valid_mtu(chan, opts.imtu)) {
585 err = -EINVAL;
586 break;
587 }
588
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300589 chan->mode = opts.mode;
590 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200591 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300592 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200593 break;
594 case L2CAP_MODE_ERTM:
595 case L2CAP_MODE_STREAMING:
596 if (!disable_ertm)
597 break;
598 /* fall through */
599 default:
600 err = -EINVAL;
601 break;
602 }
603
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300604 chan->imtu = opts.imtu;
605 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300606 chan->fcs = opts.fcs;
607 chan->max_tx = opts.max_tx;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +0300608 chan->tx_win = opts.txwin_size;
Andrei Emeltchenko12d59782012-10-10 17:38:26 +0300609 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200610 break;
611
612 case L2CAP_LM:
613 if (get_user(opt, (u32 __user *) optval)) {
614 err = -EFAULT;
615 break;
616 }
617
618 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300619 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200620 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300621 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200622 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300623 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200624
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +0300625 if (opt & L2CAP_LM_MASTER)
626 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
627 else
628 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +0300629
630 if (opt & L2CAP_LM_RELIABLE)
631 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
632 else
633 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200634 break;
635
636 default:
637 err = -ENOPROTOOPT;
638 break;
639 }
640
641 release_sock(sk);
642 return err;
643}
644
Gustavo Padovan2d792812012-10-06 10:07:01 +0100645static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
646 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200647{
648 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300649 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200650 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700651 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300652 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200653 int len, err = 0;
654 u32 opt;
655
656 BT_DBG("sk %p", sk);
657
658 if (level == SOL_L2CAP)
659 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
660
661 if (level != SOL_BLUETOOTH)
662 return -ENOPROTOOPT;
663
664 lock_sock(sk);
665
666 switch (optname) {
667 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300668 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100669 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200670 err = -EINVAL;
671 break;
672 }
673
674 sec.level = BT_SECURITY_LOW;
675
676 len = min_t(unsigned int, sizeof(sec), optlen);
677 if (copy_from_user((char *) &sec, optval, len)) {
678 err = -EFAULT;
679 break;
680 }
681
682 if (sec.level < BT_SECURITY_LOW ||
Gustavo Padovan2d792812012-10-06 10:07:01 +0100683 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200684 err = -EINVAL;
685 break;
686 }
687
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300688 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300689
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200690 if (!chan->conn)
691 break;
692
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300693 conn = chan->conn;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200694
695 /*change security for LE channels */
Johan Hedberg073d1cf2013-04-29 19:35:35 +0300696 if (chan->scid == L2CAP_CID_ATT) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300697 if (!conn->hcon->out) {
698 err = -EINVAL;
699 break;
700 }
701
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300702 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300703 break;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300704 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200705 chan->state = BT_CONFIG;
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200706
Gustavo Padovana7d77232012-05-13 03:20:07 -0300707 /* or for ACL link */
708 } else if ((sk->sk_state == BT_CONNECT2 &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100709 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
Gustavo Padovana7d77232012-05-13 03:20:07 -0300710 sk->sk_state == BT_CONNECTED) {
711 if (!l2cap_chan_check_security(chan))
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300712 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
Gustavo Padovana7d77232012-05-13 03:20:07 -0300713 else
714 sk->sk_state_change(sk);
Gustavo F. Padovan0bee1d62011-11-05 19:58:31 -0200715 } else {
716 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300717 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200718 break;
719
720 case BT_DEFER_SETUP:
721 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
722 err = -EINVAL;
723 break;
724 }
725
726 if (get_user(opt, (u32 __user *) optval)) {
727 err = -EFAULT;
728 break;
729 }
730
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700731 if (opt) {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300732 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700733 set_bit(FLAG_DEFER_SETUP, &chan->flags);
734 } else {
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300735 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Marcel Holtmannbdc25782013-10-14 02:45:34 -0700736 clear_bit(FLAG_DEFER_SETUP, &chan->flags);
737 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200738 break;
739
740 case BT_FLUSHABLE:
741 if (get_user(opt, (u32 __user *) optval)) {
742 err = -EFAULT;
743 break;
744 }
745
746 if (opt > BT_FLUSHABLE_ON) {
747 err = -EINVAL;
748 break;
749 }
750
751 if (opt == BT_FLUSHABLE_OFF) {
Johannes Bergc1f23a22013-10-07 18:19:16 +0200752 conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300753 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200754 No Flush support in the LM */
755 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
756 err = -EINVAL;
757 break;
758 }
759 }
760
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +0300761 if (opt)
762 set_bit(FLAG_FLUSHABLE, &chan->flags);
763 else
764 clear_bit(FLAG_FLUSHABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200765 break;
766
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700767 case BT_POWER:
768 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100769 chan->chan_type != L2CAP_CHAN_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700770 err = -EINVAL;
771 break;
772 }
773
774 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
775
776 len = min_t(unsigned int, sizeof(pwr), optlen);
777 if (copy_from_user((char *) &pwr, optval, len)) {
778 err = -EFAULT;
779 break;
780 }
Andrei Emeltchenko15770b12011-10-11 14:04:33 +0300781
782 if (pwr.force_active)
783 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
784 else
785 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700786 break;
787
Mat Martineau2ea66482011-11-02 16:18:30 -0700788 case BT_CHANNEL_POLICY:
Mat Martineau2ea66482011-11-02 16:18:30 -0700789 if (get_user(opt, (u32 __user *) optval)) {
790 err = -EFAULT;
791 break;
792 }
793
794 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
795 err = -EINVAL;
796 break;
797 }
798
799 if (chan->mode != L2CAP_MODE_ERTM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100800 chan->mode != L2CAP_MODE_STREAMING) {
Mat Martineau2ea66482011-11-02 16:18:30 -0700801 err = -EOPNOTSUPP;
802 break;
803 }
804
805 chan->chan_policy = (u8) opt;
Mat Martineau3f7a56c2012-10-23 15:24:23 -0700806
807 if (sk->sk_state == BT_CONNECTED &&
808 chan->move_role == L2CAP_MOVE_ROLE_NONE)
809 l2cap_move_start(chan);
810
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200811 break;
812
813 default:
814 err = -ENOPROTOOPT;
815 break;
816 }
817
818 release_sock(sk);
819 return err;
820}
821
Gustavo Padovan2d792812012-10-06 10:07:01 +0100822static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
823 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200824{
825 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300826 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200827 int err;
828
829 BT_DBG("sock %p, sk %p", sock, sk);
830
831 err = sock_error(sk);
832 if (err)
833 return err;
834
835 if (msg->msg_flags & MSG_OOB)
836 return -EOPNOTSUPP;
837
Mat Martineaua6a55682012-05-04 14:20:31 -0700838 if (sk->sk_state != BT_CONNECTED)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300839 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200840
Johan Hedberge793dcf2013-09-16 13:05:19 +0300841 lock_sock(sk);
842 err = bt_sock_wait_ready(sk, msg->msg_flags);
843 release_sock(sk);
844 if (err)
845 return err;
846
Mat Martineaua6a55682012-05-04 14:20:31 -0700847 l2cap_chan_lock(chan);
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200848 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
Mat Martineaua6a55682012-05-04 14:20:31 -0700849 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200850
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200851 return err;
852}
853
Gustavo Padovan2d792812012-10-06 10:07:01 +0100854static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
855 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200856{
857 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700858 struct l2cap_pinfo *pi = l2cap_pi(sk);
859 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200860
861 lock_sock(sk);
862
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300863 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
864 &bt_sk(sk)->flags)) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300865 sk->sk_state = BT_CONFIG;
Gustavo F. Padovan3542b8542011-12-28 13:54:17 -0200866 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300867
Mat Martineaue3281402011-07-07 09:39:02 -0700868 __l2cap_connect_rsp_defer(pi->chan);
Johan Hedberg970871b2013-09-25 13:26:05 +0300869 err = 0;
870 goto done;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200871 }
872
873 release_sock(sk);
874
875 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700876 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
877 else
878 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200879
Mat Martineaue3281402011-07-07 09:39:02 -0700880 if (pi->chan->mode != L2CAP_MODE_ERTM)
881 return err;
882
883 /* Attempt to put pending rx data in the socket buffer */
884
885 lock_sock(sk);
886
887 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
888 goto done;
889
890 if (pi->rx_busy_skb) {
891 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
892 pi->rx_busy_skb = NULL;
893 else
894 goto done;
895 }
896
897 /* Restore data flow when half of the receive buffer is
898 * available. This avoids resending large numbers of
899 * frames.
900 */
901 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
902 l2cap_chan_busy(pi->chan, 0);
903
904done:
905 release_sock(sk);
906 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200907}
908
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200909/* Kill socket (only if zapped and orphan)
910 * Must be called on unlocked socket.
911 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300912static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200913{
914 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
915 return;
916
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200917 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200918
919 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300920
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530921 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200922 sock_set_flag(sk, SOCK_DEAD);
923 sock_put(sk);
924}
925
Gustavo Padovandc253062013-10-15 19:24:49 -0300926static int __l2cap_wait_ack(struct sock *sk)
927{
928 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
929 DECLARE_WAITQUEUE(wait, current);
930 int err = 0;
931 int timeo = HZ/5;
932
933 add_wait_queue(sk_sleep(sk), &wait);
934 set_current_state(TASK_INTERRUPTIBLE);
935 while (chan->unacked_frames > 0 && chan->conn) {
936 if (!timeo)
937 timeo = HZ/5;
938
939 if (signal_pending(current)) {
940 err = sock_intr_errno(timeo);
941 break;
942 }
943
944 release_sock(sk);
945 timeo = schedule_timeout(timeo);
946 lock_sock(sk);
947 set_current_state(TASK_INTERRUPTIBLE);
948
949 err = sock_error(sk);
950 if (err)
951 break;
952 }
953 set_current_state(TASK_RUNNING);
954 remove_wait_queue(sk_sleep(sk), &wait);
955 return err;
956}
957
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200958static int l2cap_sock_shutdown(struct socket *sock, int how)
959{
960 struct sock *sk = sock->sk;
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200961 struct l2cap_chan *chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200962 struct l2cap_conn *conn;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200963 int err = 0;
964
965 BT_DBG("sock %p, sk %p", sock, sk);
966
967 if (!sk)
968 return 0;
969
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200970 chan = l2cap_pi(sk)->chan;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200971 conn = chan->conn;
972
973 if (conn)
974 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko7ddb6e02012-02-14 15:12:57 +0200975
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200976 l2cap_chan_lock(chan);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200977 lock_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200978
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200979 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300980 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200981 err = __l2cap_wait_ack(sk);
982
983 sk->sk_shutdown = SHUTDOWN_MASK;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200984
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200985 release_sock(sk);
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300986 l2cap_chan_close(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200987 lock_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200988
989 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
990 err = bt_sock_wait_state(sk, BT_CLOSED,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100991 sk->sk_lingertime);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200992 }
993
994 if (!err && sk->sk_err)
995 err = -sk->sk_err;
996
997 release_sock(sk);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200998 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200999
1000 if (conn)
1001 mutex_unlock(&conn->chan_lock);
1002
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001003 return err;
1004}
1005
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001006static int l2cap_sock_release(struct socket *sock)
1007{
1008 struct sock *sk = sock->sk;
1009 int err;
1010
1011 BT_DBG("sock %p, sk %p", sock, sk);
1012
1013 if (!sk)
1014 return 0;
1015
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001016 bt_sock_unlink(&l2cap_sk_list, sk);
1017
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001018 err = l2cap_sock_shutdown(sock, 2);
1019
1020 sock_orphan(sk);
1021 l2cap_sock_kill(sk);
1022 return err;
1023}
1024
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001025static void l2cap_sock_cleanup_listen(struct sock *parent)
1026{
1027 struct sock *sk;
1028
1029 BT_DBG("parent %p", parent);
1030
1031 /* Close not yet accepted channels */
1032 while ((sk = bt_accept_dequeue(parent, NULL))) {
1033 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
1034
1035 l2cap_chan_lock(chan);
1036 __clear_chan_timer(chan);
1037 l2cap_chan_close(chan, ECONNRESET);
1038 l2cap_chan_unlock(chan);
1039
1040 l2cap_sock_kill(sk);
1041 }
1042}
1043
Gustavo Padovan80b98022012-05-27 22:27:51 -03001044static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001045{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001046 struct sock *sk, *parent = chan->data;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001047
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001048 lock_sock(parent);
1049
Gustavo Padovan53826692012-05-27 22:27:55 -03001050 /* Check for backlog size */
1051 if (sk_acceptq_is_full(parent)) {
1052 BT_DBG("backlog full %d", parent->sk_ack_backlog);
1053 return NULL;
1054 }
1055
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001056 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001057 GFP_ATOMIC);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001058 if (!sk)
1059 return NULL;
1060
Octavian Purdilad22015a2012-01-22 00:28:34 +02001061 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
1062
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001063 l2cap_sock_init(sk, parent);
1064
Gustavo Padovan644912e2012-10-12 19:35:23 +08001065 bt_accept_enqueue(parent, sk);
1066
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02001067 release_sock(parent);
1068
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001069 return l2cap_pi(sk)->chan;
1070}
1071
Gustavo Padovan80b98022012-05-27 22:27:51 -03001072static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001073{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001074 struct sock *sk = chan->data;
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001075 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001076
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001077 lock_sock(sk);
1078
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001079 if (l2cap_pi(sk)->rx_busy_skb) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001080 err = -ENOMEM;
1081 goto done;
1082 }
Mat Martineaue3281402011-07-07 09:39:02 -07001083
1084 err = sock_queue_rcv_skb(sk, skb);
1085
1086 /* For ERTM, handle one skb that doesn't fit into the recv
1087 * buffer. This is important to do because the data frames
1088 * have already been acked, so the skb cannot be discarded.
1089 *
1090 * Notify the l2cap core that the buffer is full, so the
1091 * LOCAL_BUSY state is entered and no more frames are
1092 * acked and reassembled until there is buffer space
1093 * available.
1094 */
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001095 if (err < 0 && chan->mode == L2CAP_MODE_ERTM) {
1096 l2cap_pi(sk)->rx_busy_skb = skb;
1097 l2cap_chan_busy(chan, 1);
Mat Martineaue3281402011-07-07 09:39:02 -07001098 err = 0;
1099 }
1100
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001101done:
1102 release_sock(sk);
1103
Mat Martineaue3281402011-07-07 09:39:02 -07001104 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001105}
1106
Gustavo Padovan80b98022012-05-27 22:27:51 -03001107static void l2cap_sock_close_cb(struct l2cap_chan *chan)
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001108{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001109 struct sock *sk = chan->data;
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001110
1111 l2cap_sock_kill(sk);
1112}
1113
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001114static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1115{
1116 struct sock *sk = chan->data;
1117 struct sock *parent;
1118
1119 lock_sock(sk);
1120
1121 parent = bt_sk(sk)->parent;
1122
1123 sock_set_flag(sk, SOCK_ZAPPED);
1124
1125 switch (chan->state) {
1126 case BT_OPEN:
1127 case BT_BOUND:
1128 case BT_CLOSED:
1129 break;
1130 case BT_LISTEN:
1131 l2cap_sock_cleanup_listen(sk);
1132 sk->sk_state = BT_CLOSED;
1133 chan->state = BT_CLOSED;
1134
1135 break;
1136 default:
1137 sk->sk_state = BT_CLOSED;
1138 chan->state = BT_CLOSED;
1139
1140 sk->sk_err = err;
1141
1142 if (parent) {
1143 bt_accept_unlink(sk);
1144 parent->sk_data_ready(parent, 0);
1145 } else {
1146 sk->sk_state_change(sk);
1147 }
1148
1149 break;
1150 }
1151
1152 release_sock(sk);
1153}
1154
Gustavo Padovan53f52122013-10-15 19:24:45 -03001155static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state,
1156 int err)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001157{
Gustavo Padovan80b98022012-05-27 22:27:51 -03001158 struct sock *sk = chan->data;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001159
1160 sk->sk_state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -03001161
1162 if (err)
1163 sk->sk_err = err;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001164}
1165
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001166static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
Gustavo Padovan90338942012-04-06 20:15:47 -03001167 unsigned long len, int nb)
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001168{
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001169 struct sock *sk = chan->data;
Gustavo Padovan90338942012-04-06 20:15:47 -03001170 struct sk_buff *skb;
1171 int err;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001172
Mat Martineaua6a55682012-05-04 14:20:31 -07001173 l2cap_chan_unlock(chan);
Gustavo Padovan0f2c6152013-10-21 14:21:38 -02001174 skb = bt_skb_send_alloc(sk, len, nb, &err);
Mat Martineaua6a55682012-05-04 14:20:31 -07001175 l2cap_chan_lock(chan);
1176
Gustavo Padovan90338942012-04-06 20:15:47 -03001177 if (!skb)
1178 return ERR_PTR(err);
1179
Gustavo Padovan0e790c62013-10-21 18:22:24 -02001180 bt_cb(skb)->chan = chan;
1181
Gustavo Padovan90338942012-04-06 20:15:47 -03001182 return skb;
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001183}
1184
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001185static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1186{
1187 struct sock *sk = chan->data;
1188 struct sock *parent;
1189
1190 lock_sock(sk);
1191
1192 parent = bt_sk(sk)->parent;
1193
1194 BT_DBG("sk %p, parent %p", sk, parent);
1195
1196 sk->sk_state = BT_CONNECTED;
1197 sk->sk_state_change(sk);
1198
1199 if (parent)
1200 parent->sk_data_ready(parent, 0);
1201
1202 release_sock(sk);
1203}
1204
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001205static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1206{
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001207 struct sock *parent, *sk = chan->data;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001208
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001209 lock_sock(sk);
1210
1211 parent = bt_sk(sk)->parent;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001212 if (parent)
1213 parent->sk_data_ready(parent, 0);
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001214
1215 release_sock(sk);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001216}
1217
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001218static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1219{
1220 struct sock *sk = chan->data;
1221
1222 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
1223 sk->sk_state_change(sk);
1224}
1225
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001226static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1227{
1228 struct sock *sk = chan->data;
1229
1230 lock_sock(sk);
1231 sk->sk_shutdown = SHUTDOWN_MASK;
1232 release_sock(sk);
1233}
1234
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001235static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1236{
1237 struct sock *sk = chan->data;
1238
1239 return sk->sk_sndtimeo;
1240}
1241
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001242static struct l2cap_ops l2cap_chan_ops = {
1243 .name = "L2CAP Socket Interface",
1244 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -03001245 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -03001246 .close = l2cap_sock_close_cb,
Andrei Emeltchenkoc0df7f62012-05-27 22:27:52 -03001247 .teardown = l2cap_sock_teardown_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001248 .state_change = l2cap_sock_state_change_cb,
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001249 .ready = l2cap_sock_ready_cb,
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001250 .defer = l2cap_sock_defer_cb,
Marcel Holtmannd97c8992013-10-14 02:53:54 -07001251 .resume = l2cap_sock_resume_cb,
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03001252 .set_shutdown = l2cap_sock_set_shutdown_cb,
Gustavo Padovan8d836d72013-10-15 19:24:47 -03001253 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02001254 .alloc_skb = l2cap_sock_alloc_skb_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001255};
1256
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001257static void l2cap_sock_destruct(struct sock *sk)
1258{
1259 BT_DBG("sk %p", sk);
1260
Sasha Levin23d3a862012-10-08 16:48:32 -04001261 if (l2cap_pi(sk)->chan)
1262 l2cap_chan_put(l2cap_pi(sk)->chan);
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001263
Mat Martineaue3281402011-07-07 09:39:02 -07001264 if (l2cap_pi(sk)->rx_busy_skb) {
1265 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1266 l2cap_pi(sk)->rx_busy_skb = NULL;
1267 }
1268
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001269 skb_queue_purge(&sk->sk_receive_queue);
1270 skb_queue_purge(&sk->sk_write_queue);
1271}
1272
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001273static void l2cap_skb_msg_name(struct sk_buff *skb, void *msg_name,
1274 int *msg_namelen)
1275{
1276 struct sockaddr_l2 *la = (struct sockaddr_l2 *) msg_name;
1277
1278 memset(la, 0, sizeof(struct sockaddr_l2));
1279 la->l2_family = AF_BLUETOOTH;
1280 la->l2_psm = bt_cb(skb)->psm;
1281 bacpy(&la->l2_bdaddr, &bt_cb(skb)->bdaddr);
1282
1283 *msg_namelen = sizeof(struct sockaddr_l2);
1284}
1285
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001286static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001287{
Marcel Holtmann84b34d92013-10-13 11:36:07 -07001288 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001289
1290 BT_DBG("sk %p", sk);
1291
1292 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001293 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
1294
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001295 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001296 bt_sk(sk)->flags = bt_sk(parent)->flags;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001297
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001298 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001299 chan->imtu = pchan->imtu;
1300 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001301 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001302 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001303 chan->fcs = pchan->fcs;
1304 chan->max_tx = pchan->max_tx;
1305 chan->tx_win = pchan->tx_win;
Andrei Emeltchenko6b3c7102011-11-02 09:57:10 +02001306 chan->tx_win_max = pchan->tx_win_max;
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001307 chan->sec_level = pchan->sec_level;
Andrei Emeltchenkod57b0e82011-10-11 14:04:31 +03001308 chan->flags = pchan->flags;
Paul Moore6230c9b2011-10-07 09:40:59 +00001309
1310 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001311 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001312 switch (sk->sk_type) {
1313 case SOCK_RAW:
1314 chan->chan_type = L2CAP_CHAN_RAW;
1315 break;
1316 case SOCK_DGRAM:
1317 chan->chan_type = L2CAP_CHAN_CONN_LESS;
Marcel Holtmann2edf8702013-10-13 12:55:29 -07001318 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name;
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001319 break;
1320 case SOCK_SEQPACKET:
1321 case SOCK_STREAM:
1322 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1323 break;
1324 }
1325
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001326 chan->imtu = L2CAP_DEFAULT_MTU;
1327 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001328 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001329 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001330 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001331 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001332 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001333 }
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +03001334
1335 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001336 }
1337
1338 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001339 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001340
1341 chan->data = sk;
1342 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001343}
1344
1345static struct proto l2cap_proto = {
1346 .name = "L2CAP",
1347 .owner = THIS_MODULE,
1348 .obj_size = sizeof(struct l2cap_pinfo)
1349};
1350
Gustavo Padovan2d792812012-10-06 10:07:01 +01001351static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1352 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001353{
1354 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001355 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001356
1357 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1358 if (!sk)
1359 return NULL;
1360
1361 sock_init_data(sock, sk);
1362 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1363
1364 sk->sk_destruct = l2cap_sock_destruct;
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001365 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001366
1367 sock_reset_flag(sk, SOCK_ZAPPED);
1368
1369 sk->sk_protocol = proto;
1370 sk->sk_state = BT_OPEN;
1371
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -03001372 chan = l2cap_chan_create();
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001373 if (!chan) {
Jaganath Kanakkassery49dfbb92012-07-19 12:54:04 +05301374 sk_free(sk);
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001375 return NULL;
1376 }
1377
Mat Martineau61d6ef32012-04-27 16:50:50 -07001378 l2cap_chan_hold(chan);
1379
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001380 l2cap_pi(sk)->chan = chan;
1381
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001382 return sk;
1383}
1384
1385static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1386 int kern)
1387{
1388 struct sock *sk;
1389
1390 BT_DBG("sock %p", sock);
1391
1392 sock->state = SS_UNCONNECTED;
1393
1394 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001395 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001396 return -ESOCKTNOSUPPORT;
1397
1398 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1399 return -EPERM;
1400
1401 sock->ops = &l2cap_sock_ops;
1402
1403 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1404 if (!sk)
1405 return -ENOMEM;
1406
1407 l2cap_sock_init(sk, NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001408 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001409 return 0;
1410}
1411
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001412static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001413 .family = PF_BLUETOOTH,
1414 .owner = THIS_MODULE,
1415 .release = l2cap_sock_release,
1416 .bind = l2cap_sock_bind,
1417 .connect = l2cap_sock_connect,
1418 .listen = l2cap_sock_listen,
1419 .accept = l2cap_sock_accept,
1420 .getname = l2cap_sock_getname,
1421 .sendmsg = l2cap_sock_sendmsg,
1422 .recvmsg = l2cap_sock_recvmsg,
1423 .poll = bt_sock_poll,
1424 .ioctl = bt_sock_ioctl,
1425 .mmap = sock_no_mmap,
1426 .socketpair = sock_no_socketpair,
1427 .shutdown = l2cap_sock_shutdown,
1428 .setsockopt = l2cap_sock_setsockopt,
1429 .getsockopt = l2cap_sock_getsockopt
1430};
1431
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001432static const struct net_proto_family l2cap_sock_family_ops = {
1433 .family = PF_BLUETOOTH,
1434 .owner = THIS_MODULE,
1435 .create = l2cap_sock_create,
1436};
1437
1438int __init l2cap_init_sockets(void)
1439{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001440 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001441
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001442 err = proto_register(&l2cap_proto, 0);
1443 if (err < 0)
1444 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001445
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001446 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001447 if (err < 0) {
1448 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001449 goto error;
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001450 }
1451
Al Virob0316612013-04-04 19:14:33 -04001452 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001453 NULL);
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001454 if (err < 0) {
1455 BT_ERR("Failed to create L2CAP proc file");
1456 bt_sock_unregister(BTPROTO_L2CAP);
1457 goto error;
1458 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001459
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001460 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001461
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001462 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001463
1464error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001465 proto_unregister(&l2cap_proto);
1466 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001467}
1468
1469void l2cap_cleanup_sockets(void)
1470{
Masatake YAMATO5b28d952012-07-26 01:29:25 +09001471 bt_procfs_cleanup(&init_net, "l2cap");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001472 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001473 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001474}
Johan Hedberg91497612013-12-02 11:20:20 +02001475
1476module_param(enable_lecoc, bool, 0644);
1477MODULE_PARM_DESC(enable_lecoc, "Enable support for LE CoC");