blob: 36fed40c162cff5361c9dbdf9cfd5f313e47743a [file] [log] [blame]
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001/*
2 BlueZ - Bluetooth protocol stack for Linux
flintman9892c402015-09-23 06:14:10 -04003 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
5 Copyright (C) 2010 Google Inc.
flintman9892c402015-09-23 06:14:10 -04006 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
flintman9892c402015-09-23 06:14:10 -040030#include <linux/export.h>
Paul Moore6230c9b2011-10-07 09:40:59 +000031
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020032#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020033#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020034#include <net/bluetooth/l2cap.h>
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -030035#include <net/bluetooth/smp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020036
flintman9892c402015-09-23 06:14:10 -040037static struct bt_sock_list l2cap_sk_list = {
38 .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
39};
40
41static const struct proto_ops l2cap_sock_ops;
42static void l2cap_sock_init(struct sock *sk, struct sock *parent);
43static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
44 int proto, gfp_t prio);
45
46bool l2cap_is_socket(struct socket *sock)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070047{
flintman9892c402015-09-23 06:14:10 -040048 return sock && sock->ops == &l2cap_sock_ops;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070049}
flintman9892c402015-09-23 06:14:10 -040050EXPORT_SYMBOL(l2cap_is_socket);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030051
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020052static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
53{
54 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -040055 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020056 struct sockaddr_l2 la;
57 int len, err = 0;
58
59 BT_DBG("sk %p", sk);
60
61 if (!addr || addr->sa_family != AF_BLUETOOTH)
62 return -EINVAL;
63
64 memset(&la, 0, sizeof(la));
65 len = min_t(unsigned int, sizeof(la), alen);
66 memcpy(&la, addr, len);
67
Ville Tervob62f3282011-02-10 22:38:50 -030068 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020069 return -EINVAL;
70
71 lock_sock(sk);
72
73 if (sk->sk_state != BT_OPEN) {
74 err = -EBADFD;
75 goto done;
76 }
77
78 if (la.l2_psm) {
79 __u16 psm = __le16_to_cpu(la.l2_psm);
80
81 /* PSM must be odd and lsb of upper byte must be 0 */
82 if ((psm & 0x0101) != 0x0001) {
83 err = -EINVAL;
84 goto done;
85 }
86
87 /* Restrict usage of well-known PSMs */
88 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
89 err = -EACCES;
90 goto done;
91 }
92 }
93
Ville Tervob62f3282011-02-10 22:38:50 -030094 if (la.l2_cid)
flintman9892c402015-09-23 06:14:10 -040095 err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid));
96 else
97 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030098
flintman9892c402015-09-23 06:14:10 -040099 if (err < 0)
100 goto done;
101
102 if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP ||
103 __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM)
104 chan->sec_level = BT_SECURITY_SDP;
105
106 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
107
108 chan->state = BT_BOUND;
109 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200110
111done:
112 release_sock(sk);
113 return err;
114}
115
flintman9892c402015-09-23 06:14:10 -0400116static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
117 int alen, int flags)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200118{
119 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400120 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200121 struct sockaddr_l2 la;
122 int len, err = 0;
123
flintman9892c402015-09-23 06:14:10 -0400124 BT_DBG("sk %p", sk);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200125
126 if (!addr || alen < sizeof(addr->sa_family) ||
127 addr->sa_family != AF_BLUETOOTH)
128 return -EINVAL;
129
130 memset(&la, 0, sizeof(la));
131 len = min_t(unsigned int, sizeof(la), alen);
132 memcpy(&la, addr, len);
133
Ville Tervoacd7d372011-02-10 22:38:49 -0300134 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200135 return -EINVAL;
136
flintman9892c402015-09-23 06:14:10 -0400137 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
138 &la.l2_bdaddr, la.l2_bdaddr_type);
139 if (err)
140 return err;
141
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200142 lock_sock(sk);
143
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200144 err = bt_sock_wait_state(sk, BT_CONNECTED,
flintman9892c402015-09-23 06:14:10 -0400145 sock_sndtimeo(sk, flags & O_NONBLOCK));
146
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200147 release_sock(sk);
flintman9892c402015-09-23 06:14:10 -0400148
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200149 return err;
150}
151
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200152static int l2cap_sock_listen(struct socket *sock, int backlog)
153{
154 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400155 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200156 int err = 0;
157
158 BT_DBG("sk %p backlog %d", sk, backlog);
159
160 lock_sock(sk);
161
flintman9892c402015-09-23 06:14:10 -0400162 if (sk->sk_state != BT_BOUND) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200163 err = -EBADFD;
164 goto done;
165 }
166
flintman9892c402015-09-23 06:14:10 -0400167 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) {
168 err = -EINVAL;
169 goto done;
170 }
171
172 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200173 case L2CAP_MODE_BASIC:
174 break;
175 case L2CAP_MODE_ERTM:
176 case L2CAP_MODE_STREAMING:
177 if (!disable_ertm)
178 break;
179 /* fall through */
180 default:
181 err = -ENOTSUPP;
182 goto done;
183 }
184
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200185 sk->sk_max_ack_backlog = backlog;
186 sk->sk_ack_backlog = 0;
flintman9892c402015-09-23 06:14:10 -0400187
188 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200189 sk->sk_state = BT_LISTEN;
190
191done:
192 release_sock(sk);
193 return err;
194}
195
flintman9892c402015-09-23 06:14:10 -0400196static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
197 int flags)
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200198{
199 DECLARE_WAITQUEUE(wait, current);
200 struct sock *sk = sock->sk, *nsk;
201 long timeo;
202 int err = 0;
203
204 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
205
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200206 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
207
208 BT_DBG("sk %p timeo %ld", sk, timeo);
209
210 /* Wait for an incoming connection. (wake-one). */
211 add_wait_queue_exclusive(sk_sleep(sk), &wait);
flintman9892c402015-09-23 06:14:10 -0400212 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200213 set_current_state(TASK_INTERRUPTIBLE);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400214
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700215 if (sk->sk_state != BT_LISTEN) {
216 err = -EBADFD;
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400217 break;
218 }
219
flintman9892c402015-09-23 06:14:10 -0400220 nsk = bt_accept_dequeue(sk, newsock);
221 if (nsk)
222 break;
223
224 if (!timeo) {
225 err = -EAGAIN;
226 break;
227 }
228
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200229 if (signal_pending(current)) {
230 err = sock_intr_errno(timeo);
231 break;
232 }
flintman9892c402015-09-23 06:14:10 -0400233
234 release_sock(sk);
235 timeo = schedule_timeout(timeo);
236 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200237 }
flintman9892c402015-09-23 06:14:10 -0400238 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200239 remove_wait_queue(sk_sleep(sk), &wait);
240
241 if (err)
242 goto done;
243
244 newsock->state = SS_CONNECTED;
245
246 BT_DBG("new socket %p", nsk);
247
248done:
249 release_sock(sk);
250 return err;
251}
252
flintman9892c402015-09-23 06:14:10 -0400253static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
254 int *len, int peer)
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200255{
256 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
257 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400258 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200259
260 BT_DBG("sock %p, sk %p", sock, sk);
261
flintman9892c402015-09-23 06:14:10 -0400262 memset(la, 0, sizeof(struct sockaddr_l2));
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200263 addr->sa_family = AF_BLUETOOTH;
264 *len = sizeof(struct sockaddr_l2);
265
266 if (peer) {
flintman9892c402015-09-23 06:14:10 -0400267 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200268 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
flintman9892c402015-09-23 06:14:10 -0400269 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200270 } else {
flintman9892c402015-09-23 06:14:10 -0400271 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200272 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
flintman9892c402015-09-23 06:14:10 -0400273 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200274 }
275
276 return 0;
277}
278
flintman9892c402015-09-23 06:14:10 -0400279static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
280 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200281{
282 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400283 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200284 struct l2cap_options opts;
285 struct l2cap_conninfo cinfo;
286 int len, err = 0;
287 u32 opt;
288
289 BT_DBG("sk %p", sk);
290
291 if (get_user(len, optlen))
292 return -EFAULT;
293
294 lock_sock(sk);
295
296 switch (optname) {
297 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300298 memset(&opts, 0, sizeof(opts));
flintman9892c402015-09-23 06:14:10 -0400299 opts.imtu = chan->imtu;
300 opts.omtu = chan->omtu;
301 opts.flush_to = chan->flush_to;
302 opts.mode = chan->mode;
303 opts.fcs = chan->fcs;
304 opts.max_tx = chan->max_tx;
305 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200306
307 len = min_t(unsigned int, len, sizeof(opts));
308 if (copy_to_user(optval, (char *) &opts, len))
309 err = -EFAULT;
310
311 break;
312
313 case L2CAP_LM:
flintman9892c402015-09-23 06:14:10 -0400314 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200315 case BT_SECURITY_LOW:
316 opt = L2CAP_LM_AUTH;
317 break;
318 case BT_SECURITY_MEDIUM:
319 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
320 break;
321 case BT_SECURITY_HIGH:
322 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
flintman9892c402015-09-23 06:14:10 -0400323 L2CAP_LM_SECURE;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200324 break;
325 default:
326 opt = 0;
327 break;
328 }
329
flintman9892c402015-09-23 06:14:10 -0400330 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200331 opt |= L2CAP_LM_MASTER;
332
flintman9892c402015-09-23 06:14:10 -0400333 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200334 opt |= L2CAP_LM_RELIABLE;
335
336 if (put_user(opt, (u32 __user *) optval))
337 err = -EFAULT;
338 break;
339
340 case L2CAP_CONNINFO:
341 if (sk->sk_state != BT_CONNECTED &&
flintman9892c402015-09-23 06:14:10 -0400342 !(sk->sk_state == BT_CONNECT2 &&
343 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200344 err = -ENOTCONN;
345 break;
346 }
347
flintman9892c402015-09-23 06:14:10 -0400348 memset(&cinfo, 0, sizeof(cinfo));
349 cinfo.hci_handle = chan->conn->hcon->handle;
350 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200351
352 len = min_t(unsigned int, len, sizeof(cinfo));
353 if (copy_to_user(optval, (char *) &cinfo, len))
354 err = -EFAULT;
355
356 break;
357
358 default:
359 err = -ENOPROTOOPT;
360 break;
361 }
362
363 release_sock(sk);
364 return err;
365}
366
flintman9892c402015-09-23 06:14:10 -0400367static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
368 char __user *optval, int __user *optlen)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200369{
370 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400371 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200372 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700373 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200374 int len, err = 0;
375
376 BT_DBG("sk %p", sk);
377
378 if (level == SOL_L2CAP)
379 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
380
381 if (level != SOL_BLUETOOTH)
382 return -ENOPROTOOPT;
383
384 if (get_user(len, optlen))
385 return -EFAULT;
386
387 lock_sock(sk);
388
389 switch (optname) {
390 case BT_SECURITY:
flintman9892c402015-09-23 06:14:10 -0400391 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
392 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200393 err = -EINVAL;
394 break;
395 }
396
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300397 memset(&sec, 0, sizeof(sec));
flintman9892c402015-09-23 06:14:10 -0400398 if (chan->conn) {
399 sec.level = chan->conn->hcon->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200400
flintman9892c402015-09-23 06:14:10 -0400401 if (sk->sk_state == BT_CONNECTED)
402 sec.key_size = chan->conn->hcon->enc_key_size;
403 } else {
404 sec.level = chan->sec_level;
Brian Gix27a795c2012-04-19 11:05:06 -0700405 }
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300406
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200407 len = min_t(unsigned int, len, sizeof(sec));
408 if (copy_to_user(optval, (char *) &sec, len))
409 err = -EFAULT;
410
411 break;
412
413 case BT_DEFER_SETUP:
414 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
415 err = -EINVAL;
416 break;
417 }
418
flintman9892c402015-09-23 06:14:10 -0400419 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
420 (u32 __user *) optval))
421 err = -EFAULT;
422
423 break;
424
425 case BT_FLUSHABLE:
426 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags),
427 (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200428 err = -EFAULT;
429
430 break;
431
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700432 case BT_POWER:
433 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
flintman9892c402015-09-23 06:14:10 -0400434 && sk->sk_type != SOCK_RAW) {
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700435 err = -EINVAL;
436 break;
437 }
438
flintman9892c402015-09-23 06:14:10 -0400439 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700440
441 len = min_t(unsigned int, len, sizeof(pwr));
442 if (copy_to_user(optval, (char *) &pwr, len))
443 err = -EFAULT;
444
445 break;
446
flintman9892c402015-09-23 06:14:10 -0400447 case BT_CHANNEL_POLICY:
448 if (!enable_hs) {
449 err = -ENOPROTOOPT;
Mat Martineau2ea66482011-11-02 16:18:30 -0700450 break;
451 }
452
flintman9892c402015-09-23 06:14:10 -0400453 if (put_user(chan->chan_policy, (u32 __user *) optval))
Mat Martineau2ea66482011-11-02 16:18:30 -0700454 err = -EFAULT;
455 break;
456
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200457 default:
458 err = -ENOPROTOOPT;
459 break;
460 }
461
462 release_sock(sk);
463 return err;
464}
465
flintman9892c402015-09-23 06:14:10 -0400466static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu)
467{
468 switch (chan->scid) {
469 case L2CAP_CID_LE_DATA:
470 if (mtu < L2CAP_LE_MIN_MTU)
471 return false;
472 break;
473
474 default:
475 if (mtu < L2CAP_DEFAULT_MIN_MTU)
476 return false;
477 }
478
479 return true;
480}
481
482static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
483 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200484{
485 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400486 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200487 struct l2cap_options opts;
flintman9892c402015-09-23 06:14:10 -0400488 int len, err = 0;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200489 u32 opt;
490
491 BT_DBG("sk %p", sk);
492
493 lock_sock(sk);
494
495 switch (optname) {
496 case L2CAP_OPTIONS:
flintman9892c402015-09-23 06:14:10 -0400497 if (sk->sk_state == BT_CONNECTED) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200498 err = -EINVAL;
499 break;
500 }
501
flintman9892c402015-09-23 06:14:10 -0400502 opts.imtu = chan->imtu;
503 opts.omtu = chan->omtu;
504 opts.flush_to = chan->flush_to;
505 opts.mode = chan->mode;
506 opts.fcs = chan->fcs;
507 opts.max_tx = chan->max_tx;
508 opts.txwin_size = chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200509
510 len = min_t(unsigned int, sizeof(opts), optlen);
511 if (copy_from_user((char *) &opts, optval, len)) {
512 err = -EFAULT;
513 break;
514 }
515
flintman9892c402015-09-23 06:14:10 -0400516 if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200517 err = -EINVAL;
518 break;
519 }
520
flintman9892c402015-09-23 06:14:10 -0400521 if (!l2cap_valid_mtu(chan, opts.imtu)) {
522 err = -EINVAL;
523 break;
524 }
525
526 chan->mode = opts.mode;
527 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200528 case L2CAP_MODE_BASIC:
flintman9892c402015-09-23 06:14:10 -0400529 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200530 break;
531 case L2CAP_MODE_ERTM:
flintman9892c402015-09-23 06:14:10 -0400532 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200533 if (!disable_ertm)
534 break;
535 /* fall through */
536 default:
537 err = -EINVAL;
538 break;
539 }
540
flintman9892c402015-09-23 06:14:10 -0400541 chan->imtu = opts.imtu;
542 chan->omtu = opts.omtu;
543 chan->fcs = opts.fcs;
544 chan->max_tx = opts.max_tx;
545 chan->tx_win = opts.txwin_size;
546 chan->flush_to = opts.flush_to;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200547 break;
548
549 case L2CAP_LM:
550 if (get_user(opt, (u32 __user *) optval)) {
551 err = -EFAULT;
552 break;
553 }
554
555 if (opt & L2CAP_LM_AUTH)
flintman9892c402015-09-23 06:14:10 -0400556 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200557 if (opt & L2CAP_LM_ENCRYPT)
flintman9892c402015-09-23 06:14:10 -0400558 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200559 if (opt & L2CAP_LM_SECURE)
flintman9892c402015-09-23 06:14:10 -0400560 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200561
flintman9892c402015-09-23 06:14:10 -0400562 if (opt & L2CAP_LM_MASTER)
563 set_bit(FLAG_ROLE_SWITCH, &chan->flags);
564 else
565 clear_bit(FLAG_ROLE_SWITCH, &chan->flags);
566
567 if (opt & L2CAP_LM_RELIABLE)
568 set_bit(FLAG_FORCE_RELIABLE, &chan->flags);
569 else
570 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200571 break;
572
573 default:
574 err = -ENOPROTOOPT;
575 break;
576 }
577
578 release_sock(sk);
579 return err;
580}
581
flintman9892c402015-09-23 06:14:10 -0400582static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
583 char __user *optval, unsigned int optlen)
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200584{
585 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400586 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200587 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700588 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300589 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200590 int len, err = 0;
591 u32 opt;
592
593 BT_DBG("sk %p", sk);
594
595 if (level == SOL_L2CAP)
596 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
597
598 if (level != SOL_BLUETOOTH)
599 return -ENOPROTOOPT;
600
601 lock_sock(sk);
602
603 switch (optname) {
604 case BT_SECURITY:
flintman9892c402015-09-23 06:14:10 -0400605 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
606 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200607 err = -EINVAL;
608 break;
609 }
610
611 sec.level = BT_SECURITY_LOW;
612
613 len = min_t(unsigned int, sizeof(sec), optlen);
614 if (copy_from_user((char *) &sec, optval, len)) {
615 err = -EFAULT;
616 break;
617 }
618
619 if (sec.level < BT_SECURITY_LOW ||
flintman9892c402015-09-23 06:14:10 -0400620 sec.level > BT_SECURITY_HIGH) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200621 err = -EINVAL;
622 break;
623 }
624
flintman9892c402015-09-23 06:14:10 -0400625 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300626
flintman9892c402015-09-23 06:14:10 -0400627 if (!chan->conn)
628 break;
629
630 conn = chan->conn;
631
632 /*change security for LE channels */
633 if (chan->scid == L2CAP_CID_LE_DATA) {
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300634 if (!conn->hcon->out) {
635 err = -EINVAL;
636 break;
637 }
638
flintman9892c402015-09-23 06:14:10 -0400639 if (smp_conn_security(conn->hcon, sec.level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300640 break;
Vinicius Costa Gomesa5474a82011-01-26 21:42:57 -0300641 sk->sk_state = BT_CONFIG;
flintman9892c402015-09-23 06:14:10 -0400642 chan->state = BT_CONFIG;
643
644 /* or for ACL link */
645 } else if ((sk->sk_state == BT_CONNECT2 &&
646 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) ||
647 sk->sk_state == BT_CONNECTED) {
648 if (!l2cap_chan_check_security(chan))
649 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags);
650 else
651 sk->sk_state_change(sk);
652 } else {
653 err = -EINVAL;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300654 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200655 break;
656
657 case BT_DEFER_SETUP:
658 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
659 err = -EINVAL;
660 break;
661 }
662
663 if (get_user(opt, (u32 __user *) optval)) {
664 err = -EFAULT;
665 break;
666 }
667
flintman9892c402015-09-23 06:14:10 -0400668 if (opt)
669 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
670 else
671 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700672 break;
673
Srinivas Krovvidi10734192011-12-29 07:29:11 +0530674 case BT_FLUSHABLE:
675 if (get_user(opt, (u32 __user *) optval)) {
676 err = -EFAULT;
677 break;
678 }
Srinivas Krovvidi10734192011-12-29 07:29:11 +0530679
flintman9892c402015-09-23 06:14:10 -0400680 if (opt > BT_FLUSHABLE_ON) {
Brian Gixa94b6122012-02-23 16:07:10 -0800681 err = -EINVAL;
Mat Martineau2ea66482011-11-02 16:18:30 -0700682 break;
683 }
684
flintman9892c402015-09-23 06:14:10 -0400685 if (opt == BT_FLUSHABLE_OFF) {
686 struct l2cap_conn *conn = chan->conn;
687 /* proceed further only when we have l2cap_conn and
688 No Flush support in the LM */
689 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
690 err = -EINVAL;
691 break;
692 }
693 }
694
695 if (opt)
696 set_bit(FLAG_FLUSHABLE, &chan->flags);
697 else
698 clear_bit(FLAG_FLUSHABLE, &chan->flags);
699 break;
700
701 case BT_POWER:
702 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
703 chan->chan_type != L2CAP_CHAN_RAW) {
704 err = -EINVAL;
705 break;
706 }
707
708 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
709
710 len = min_t(unsigned int, sizeof(pwr), optlen);
711 if (copy_from_user((char *) &pwr, optval, len)) {
Brian Gixa94b6122012-02-23 16:07:10 -0800712 err = -EFAULT;
713 break;
714 }
715
flintman9892c402015-09-23 06:14:10 -0400716 if (pwr.force_active)
717 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
718 else
719 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags);
720 break;
721
722 case BT_CHANNEL_POLICY:
723 if (!enable_hs) {
724 err = -ENOPROTOOPT;
Brian Gixa94b6122012-02-23 16:07:10 -0800725 break;
726 }
727
flintman9892c402015-09-23 06:14:10 -0400728 if (get_user(opt, (u32 __user *) optval)) {
729 err = -EFAULT;
730 break;
731 }
732
733 if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) {
Brian Gixa94b6122012-02-23 16:07:10 -0800734 err = -EINVAL;
735 break;
736 }
737
flintman9892c402015-09-23 06:14:10 -0400738 if (chan->mode != L2CAP_MODE_ERTM &&
739 chan->mode != L2CAP_MODE_STREAMING) {
740 err = -EOPNOTSUPP;
741 break;
742 }
Brian Gixa94b6122012-02-23 16:07:10 -0800743
flintman9892c402015-09-23 06:14:10 -0400744 chan->chan_policy = (u8) opt;
745
746 if (sk->sk_state == BT_CONNECTED &&
747 chan->move_role == L2CAP_MOVE_ROLE_NONE)
748 l2cap_move_start(chan);
749
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700750 break;
751
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200752 default:
753 err = -ENOPROTOOPT;
754 break;
755 }
756
757 release_sock(sk);
758 return err;
759}
760
flintman9892c402015-09-23 06:14:10 -0400761static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
762 struct msghdr *msg, size_t len)
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200763{
764 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400765 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200766 int err;
767
768 BT_DBG("sock %p, sk %p", sock, sk);
769
770 err = sock_error(sk);
771 if (err)
772 return err;
773
774 if (msg->msg_flags & MSG_OOB)
775 return -EOPNOTSUPP;
776
flintman9892c402015-09-23 06:14:10 -0400777 if (sk->sk_state != BT_CONNECTED)
778 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200779
flintman9892c402015-09-23 06:14:10 -0400780 l2cap_chan_lock(chan);
781 err = l2cap_chan_send(chan, msg, len, sk->sk_priority);
782 l2cap_chan_unlock(chan);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200783
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200784 return err;
785}
786
flintman9892c402015-09-23 06:14:10 -0400787static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
788 struct msghdr *msg, size_t len, int flags)
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200789{
790 struct sock *sk = sock->sk;
flintman9892c402015-09-23 06:14:10 -0400791 struct l2cap_pinfo *pi = l2cap_pi(sk);
Mat Martineaue3281402011-07-07 09:39:02 -0700792 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200793
794 lock_sock(sk);
795
flintman9892c402015-09-23 06:14:10 -0400796 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
797 &bt_sk(sk)->flags)) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300798 sk->sk_state = BT_CONFIG;
flintman9892c402015-09-23 06:14:10 -0400799 pi->chan->state = BT_CONFIG;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300800
flintman9892c402015-09-23 06:14:10 -0400801 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200802 release_sock(sk);
803 return 0;
804 }
805
806 release_sock(sk);
807
808 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700809 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
810 else
811 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200812
flintman9892c402015-09-23 06:14:10 -0400813 if (pi->chan->mode != L2CAP_MODE_ERTM)
814 return err;
Mat Martineaue3281402011-07-07 09:39:02 -0700815
flintman9892c402015-09-23 06:14:10 -0400816 /* Attempt to put pending rx data in the socket buffer */
817
818 lock_sock(sk);
819
820 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
821 goto done;
822
823 if (pi->rx_busy_skb) {
824 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
825 pi->rx_busy_skb = NULL;
826 else
827 goto done;
828 }
829
830 /* Restore data flow when half of the receive buffer is
831 * available. This avoids resending large numbers of
832 * frames.
833 */
834 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
835 l2cap_chan_busy(pi->chan, 0);
836
837done:
838 release_sock(sk);
Mat Martineaue3281402011-07-07 09:39:02 -0700839 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200840}
841
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200842/* Kill socket (only if zapped and orphan)
843 * Must be called on unlocked socket.
844 */
flintman9892c402015-09-23 06:14:10 -0400845static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200846{
847 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
848 return;
849
flintman9892c402015-09-23 06:14:10 -0400850 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200851
852 /* Kill poor orphan */
flintman9892c402015-09-23 06:14:10 -0400853
854 l2cap_chan_put(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200855 sock_set_flag(sk, SOCK_DEAD);
856 sock_put(sk);
857}
858
flintman9892c402015-09-23 06:14:10 -0400859static int l2cap_sock_shutdown(struct socket *sock, int how)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700860{
flintman9892c402015-09-23 06:14:10 -0400861 struct sock *sk = sock->sk;
862 struct l2cap_chan *chan;
863 struct l2cap_conn *conn;
864 int err = 0;
865
866 BT_DBG("sock %p, sk %p", sock, sk);
867
868 if (!sk)
869 return 0;
870
871 chan = l2cap_pi(sk)->chan;
872 conn = chan->conn;
873
874 if (conn)
875 mutex_lock(&conn->chan_lock);
876
877 l2cap_chan_lock(chan);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700878 lock_sock(sk);
flintman9892c402015-09-23 06:14:10 -0400879
880 if (!sk->sk_shutdown) {
881 if (chan->mode == L2CAP_MODE_ERTM)
882 err = __l2cap_wait_ack(sk);
883
884 sk->sk_shutdown = SHUTDOWN_MASK;
885
886 release_sock(sk);
887 l2cap_chan_close(chan, 0);
888 lock_sock(sk);
889
890 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
891 err = bt_sock_wait_state(sk, BT_CLOSED,
892 sk->sk_lingertime);
893 }
894
895 if (!err && sk->sk_err)
896 err = -sk->sk_err;
897
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700898 release_sock(sk);
flintman9892c402015-09-23 06:14:10 -0400899 l2cap_chan_unlock(chan);
900
901 if (conn)
902 mutex_unlock(&conn->chan_lock);
903
904 return err;
905}
906
907static int l2cap_sock_release(struct socket *sock)
908{
909 struct sock *sk = sock->sk;
910 int err;
911
912 BT_DBG("sock %p, sk %p", sock, sk);
913
914 if (!sk)
915 return 0;
916
917 bt_sock_unlink(&l2cap_sk_list, sk);
918
919 err = l2cap_sock_shutdown(sock, 2);
920
921 sock_orphan(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700922 l2cap_sock_kill(sk);
flintman9892c402015-09-23 06:14:10 -0400923 return err;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700924}
925
926static void l2cap_sock_cleanup_listen(struct sock *parent)
927{
928 struct sock *sk;
929
930 BT_DBG("parent %p", parent);
931
932 /* Close not yet accepted channels */
flintman9892c402015-09-23 06:14:10 -0400933 while ((sk = bt_accept_dequeue(parent, NULL))) {
934 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700935
flintman9892c402015-09-23 06:14:10 -0400936 l2cap_chan_lock(chan);
937 __clear_chan_timer(chan);
938 l2cap_chan_close(chan, ECONNRESET);
939 l2cap_chan_unlock(chan);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700940
flintman9892c402015-09-23 06:14:10 -0400941 l2cap_sock_kill(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700942 }
943}
944
flintman9892c402015-09-23 06:14:10 -0400945static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200946{
flintman9892c402015-09-23 06:14:10 -0400947 struct sock *sk, *parent = chan->data;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200948
flintman9892c402015-09-23 06:14:10 -0400949 /* Check for backlog size */
950 if (sk_acceptq_is_full(parent)) {
951 BT_DBG("backlog full %d", parent->sk_ack_backlog);
952 return NULL;
953 }
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200954
flintman9892c402015-09-23 06:14:10 -0400955 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
956 GFP_ATOMIC);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200957 if (!sk)
flintman9892c402015-09-23 06:14:10 -0400958 return NULL;
959
960 bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
961
962 l2cap_sock_init(sk, parent);
963
964 bt_accept_enqueue(parent, sk);
965
966 return l2cap_pi(sk)->chan;
967}
968
969static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
970{
971 int err;
972 struct sock *sk = chan->data;
973 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200974
975 lock_sock(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700976
flintman9892c402015-09-23 06:14:10 -0400977 if (pi->rx_busy_skb) {
978 err = -ENOMEM;
979 goto done;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200980 }
981
flintman9892c402015-09-23 06:14:10 -0400982 err = sock_queue_rcv_skb(sk, skb);
983
984 /* For ERTM, handle one skb that doesn't fit into the recv
985 * buffer. This is important to do because the data frames
986 * have already been acked, so the skb cannot be discarded.
987 *
988 * Notify the l2cap core that the buffer is full, so the
989 * LOCAL_BUSY state is entered and no more frames are
990 * acked and reassembled until there is buffer space
991 * available.
992 */
993 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
994 pi->rx_busy_skb = skb;
995 l2cap_chan_busy(pi->chan, 1);
996 err = 0;
997 }
998
999done:
1000 release_sock(sk);
1001
1002 return err;
1003}
1004
1005static void l2cap_sock_close_cb(struct l2cap_chan *chan)
1006{
1007 struct sock *sk = chan->data;
1008
1009 l2cap_sock_kill(sk);
1010}
1011
1012static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
1013{
1014 struct sock *sk = chan->data;
1015 struct sock *parent;
1016
1017 lock_sock(sk);
1018
1019 parent = bt_sk(sk)->parent;
1020
1021 sock_set_flag(sk, SOCK_ZAPPED);
1022
1023 switch (chan->state) {
1024 case BT_OPEN:
1025 case BT_BOUND:
1026 case BT_CLOSED:
1027 break;
1028 case BT_LISTEN:
1029 l2cap_sock_cleanup_listen(sk);
1030 sk->sk_state = BT_CLOSED;
1031 chan->state = BT_CLOSED;
1032
1033 break;
1034 default:
1035 sk->sk_state = BT_CLOSED;
1036 chan->state = BT_CLOSED;
1037
1038 sk->sk_err = err;
1039
1040 if (parent) {
1041 bt_accept_unlink(sk);
1042 parent->sk_data_ready(parent, 0);
1043 } else {
1044 sk->sk_state_change(sk);
1045 }
1046
1047 break;
1048 }
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001049
1050 release_sock(sk);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -02001051}
1052
flintman9892c402015-09-23 06:14:10 -04001053static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state)
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001054{
flintman9892c402015-09-23 06:14:10 -04001055 struct sock *sk = chan->data;
1056
1057 sk->sk_state = state;
1058}
1059
1060static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
1061 unsigned long len, int nb)
1062{
1063 struct sk_buff *skb;
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001064 int err;
1065
flintman9892c402015-09-23 06:14:10 -04001066 l2cap_chan_unlock(chan);
1067 skb = bt_skb_send_alloc(chan->sk, len, nb, &err);
1068 l2cap_chan_lock(chan);
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001069
flintman9892c402015-09-23 06:14:10 -04001070 if (!skb)
1071 return ERR_PTR(err);
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001072
flintman9892c402015-09-23 06:14:10 -04001073 return skb;
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -02001074}
1075
flintman9892c402015-09-23 06:14:10 -04001076static void l2cap_sock_ready_cb(struct l2cap_chan *chan)
1077{
1078 struct sock *sk = chan->data;
1079 struct sock *parent;
1080
1081 lock_sock(sk);
1082
1083 parent = bt_sk(sk)->parent;
1084
1085 BT_DBG("sk %p, parent %p", sk, parent);
1086
1087 sk->sk_state = BT_CONNECTED;
1088 sk->sk_state_change(sk);
1089
1090 if (parent)
1091 parent->sk_data_ready(parent, 0);
1092
1093 release_sock(sk);
1094}
1095
1096static void l2cap_sock_defer_cb(struct l2cap_chan *chan)
1097{
1098 struct sock *sk = chan->data;
1099 struct sock *parent = bt_sk(sk)->parent;
1100
1101 if (parent)
1102 parent->sk_data_ready(parent, 0);
1103}
1104
1105static struct l2cap_ops l2cap_chan_ops = {
1106 .name = "L2CAP Socket Interface",
1107 .new_connection = l2cap_sock_new_connection_cb,
1108 .recv = l2cap_sock_recv_cb,
1109 .close = l2cap_sock_close_cb,
1110 .teardown = l2cap_sock_teardown_cb,
1111 .state_change = l2cap_sock_state_change_cb,
1112 .ready = l2cap_sock_ready_cb,
1113 .defer = l2cap_sock_defer_cb,
1114 .alloc_skb = l2cap_sock_alloc_skb_cb,
1115};
1116
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001117static void l2cap_sock_destruct(struct sock *sk)
1118{
1119 BT_DBG("sk %p", sk);
1120
flintman9892c402015-09-23 06:14:10 -04001121 if (l2cap_pi(sk)->chan)
1122 l2cap_chan_put(l2cap_pi(sk)->chan);
1123 if (l2cap_pi(sk)->rx_busy_skb) {
1124 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
1125 l2cap_pi(sk)->rx_busy_skb = NULL;
1126 }
1127
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001128 skb_queue_purge(&sk->sk_receive_queue);
1129 skb_queue_purge(&sk->sk_write_queue);
1130}
1131
flintman9892c402015-09-23 06:14:10 -04001132static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001133{
1134 struct l2cap_pinfo *pi = l2cap_pi(sk);
flintman9892c402015-09-23 06:14:10 -04001135 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001136
flintman9892c402015-09-23 06:14:10 -04001137 BT_DBG("sk %p", sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001138
1139 if (parent) {
flintman9892c402015-09-23 06:14:10 -04001140 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001141
flintman9892c402015-09-23 06:14:10 -04001142 sk->sk_type = parent->sk_type;
1143 bt_sk(sk)->flags = bt_sk(parent)->flags;
1144
1145 chan->chan_type = pchan->chan_type;
1146 chan->imtu = pchan->imtu;
1147 chan->omtu = pchan->omtu;
1148 chan->conf_state = pchan->conf_state;
1149 chan->mode = pchan->mode;
1150 chan->fcs = pchan->fcs;
1151 chan->max_tx = pchan->max_tx;
1152 chan->tx_win = pchan->tx_win;
1153 chan->tx_win_max = pchan->tx_win_max;
1154 chan->sec_level = pchan->sec_level;
1155 chan->flags = pchan->flags;
1156
1157 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001158 } else {
flintman9892c402015-09-23 06:14:10 -04001159
1160 switch (sk->sk_type) {
1161 case SOCK_RAW:
1162 chan->chan_type = L2CAP_CHAN_RAW;
1163 break;
1164 case SOCK_DGRAM:
1165 chan->chan_type = L2CAP_CHAN_CONN_LESS;
1166 break;
1167 case SOCK_SEQPACKET:
1168 case SOCK_STREAM:
1169 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
1170 break;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001171 }
flintman9892c402015-09-23 06:14:10 -04001172
1173 chan->imtu = L2CAP_DEFAULT_MTU;
1174 chan->omtu = 0;
1175 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
1176 chan->mode = L2CAP_MODE_ERTM;
1177 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
1178 } else {
1179 chan->mode = L2CAP_MODE_BASIC;
1180 }
1181
1182 l2cap_chan_set_defaults(chan);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001183 }
1184
1185 /* Default config options */
flintman9892c402015-09-23 06:14:10 -04001186 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03001187
flintman9892c402015-09-23 06:14:10 -04001188 chan->data = sk;
1189 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001190}
1191
1192static struct proto l2cap_proto = {
1193 .name = "L2CAP",
1194 .owner = THIS_MODULE,
1195 .obj_size = sizeof(struct l2cap_pinfo)
1196};
1197
flintman9892c402015-09-23 06:14:10 -04001198static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
1199 int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001200{
1201 struct sock *sk;
flintman9892c402015-09-23 06:14:10 -04001202 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001203
1204 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
1205 if (!sk)
1206 return NULL;
1207
1208 sock_init_data(sock, sk);
1209 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
1210
1211 sk->sk_destruct = l2cap_sock_destruct;
flintman9892c402015-09-23 06:14:10 -04001212 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001213
1214 sock_reset_flag(sk, SOCK_ZAPPED);
1215
1216 sk->sk_protocol = proto;
1217 sk->sk_state = BT_OPEN;
1218
flintman9892c402015-09-23 06:14:10 -04001219 chan = l2cap_chan_create();
1220 if (!chan) {
1221 sk_free(sk);
1222 return NULL;
1223 }
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001224
flintman9892c402015-09-23 06:14:10 -04001225 l2cap_chan_hold(chan);
1226
1227 chan->sk = sk;
1228
1229 l2cap_pi(sk)->chan = chan;
1230
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001231 return sk;
1232}
1233
1234static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1235 int kern)
1236{
1237 struct sock *sk;
1238
1239 BT_DBG("sock %p", sock);
1240
1241 sock->state = SS_UNCONNECTED;
1242
1243 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
flintman9892c402015-09-23 06:14:10 -04001244 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001245 return -ESOCKTNOSUPPORT;
1246
1247 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1248 return -EPERM;
1249
1250 sock->ops = &l2cap_sock_ops;
1251
1252 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1253 if (!sk)
1254 return -ENOMEM;
1255
1256 l2cap_sock_init(sk, NULL);
flintman9892c402015-09-23 06:14:10 -04001257 bt_sock_link(&l2cap_sk_list, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001258 return 0;
1259}
1260
flintman9892c402015-09-23 06:14:10 -04001261static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001262 .family = PF_BLUETOOTH,
1263 .owner = THIS_MODULE,
1264 .release = l2cap_sock_release,
1265 .bind = l2cap_sock_bind,
1266 .connect = l2cap_sock_connect,
1267 .listen = l2cap_sock_listen,
1268 .accept = l2cap_sock_accept,
1269 .getname = l2cap_sock_getname,
1270 .sendmsg = l2cap_sock_sendmsg,
1271 .recvmsg = l2cap_sock_recvmsg,
1272 .poll = bt_sock_poll,
1273 .ioctl = bt_sock_ioctl,
1274 .mmap = sock_no_mmap,
1275 .socketpair = sock_no_socketpair,
1276 .shutdown = l2cap_sock_shutdown,
1277 .setsockopt = l2cap_sock_setsockopt,
1278 .getsockopt = l2cap_sock_getsockopt
1279};
1280
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001281static const struct net_proto_family l2cap_sock_family_ops = {
1282 .family = PF_BLUETOOTH,
1283 .owner = THIS_MODULE,
1284 .create = l2cap_sock_create,
1285};
1286
1287int __init l2cap_init_sockets(void)
1288{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001289 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001290
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001291 err = proto_register(&l2cap_proto, 0);
1292 if (err < 0)
1293 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001294
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001295 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
flintman9892c402015-09-23 06:14:10 -04001296 if (err < 0) {
1297 BT_ERR("L2CAP socket registration failed");
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001298 goto error;
flintman9892c402015-09-23 06:14:10 -04001299 }
1300
1301 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
1302 NULL);
1303 if (err < 0) {
1304 BT_ERR("Failed to create L2CAP proc file");
1305 bt_sock_unregister(BTPROTO_L2CAP);
1306 goto error;
1307 }
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001308
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001309 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001310
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001311 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001312
1313error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001314 proto_unregister(&l2cap_proto);
1315 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001316}
1317
1318void l2cap_cleanup_sockets(void)
1319{
flintman9892c402015-09-23 06:14:10 -04001320 bt_procfs_cleanup(&init_net, "l2cap");
1321 bt_sock_unregister(BTPROTO_L2CAP);
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001322 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001323}