blob: e8292369cdcf68981b4a59969b2c4af41b703f90 [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.
6
7 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 2 as
11 published by the Free Software Foundation;
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
16 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
17 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
18 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21
22 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
23 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
24 SOFTWARE IS DISCLAIMED.
25*/
26
27/* Bluetooth L2CAP sockets. */
28
Paul Moore6230c9b2011-10-07 09:40:59 +000029#include <linux/security.h>
30
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020031#include <net/bluetooth/bluetooth.h>
Gustavo F. Padovan33575df2011-02-04 02:48:48 -020032#include <net/bluetooth/hci_core.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020033#include <net/bluetooth/l2cap.h>
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -030034#include <net/bluetooth/smp.h>
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020035
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030036static const struct proto_ops l2cap_sock_ops;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -030037static void l2cap_sock_init(struct sock *sk, struct sock *parent);
38static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio);
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -030039
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020040static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
41{
42 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -030043 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020044 struct sockaddr_l2 la;
45 int len, err = 0;
46
47 BT_DBG("sk %p", sk);
48
49 if (!addr || addr->sa_family != AF_BLUETOOTH)
50 return -EINVAL;
51
52 memset(&la, 0, sizeof(la));
53 len = min_t(unsigned int, sizeof(la), alen);
54 memcpy(&la, addr, len);
55
Ville Tervob62f3282011-02-10 22:38:50 -030056 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020057 return -EINVAL;
58
59 lock_sock(sk);
60
61 if (sk->sk_state != BT_OPEN) {
62 err = -EBADFD;
63 goto done;
64 }
65
66 if (la.l2_psm) {
67 __u16 psm = __le16_to_cpu(la.l2_psm);
68
69 /* PSM must be odd and lsb of upper byte must be 0 */
70 if ((psm & 0x0101) != 0x0001) {
71 err = -EINVAL;
72 goto done;
73 }
74
75 /* Restrict usage of well-known PSMs */
76 if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) {
77 err = -EACCES;
78 goto done;
79 }
80 }
81
Ville Tervob62f3282011-02-10 22:38:50 -030082 if (la.l2_cid)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030083 err = l2cap_add_scid(chan, la.l2_cid);
84 else
85 err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm);
Ville Tervob62f3282011-02-10 22:38:50 -030086
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030087 if (err < 0)
88 goto done;
89
90 if (__le16_to_cpu(la.l2_psm) == 0x0001 ||
91 __le16_to_cpu(la.l2_psm) == 0x0003)
92 chan->sec_level = BT_SECURITY_SDP;
93
94 bacpy(&bt_sk(sk)->src, &la.l2_bdaddr);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -030095
96 chan->state = BT_BOUND;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -030097 sk->sk_state = BT_BOUND;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -020098
99done:
100 release_sock(sk);
101 return err;
102}
103
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200104static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
105{
106 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300107 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200108 struct sockaddr_l2 la;
109 int len, err = 0;
110
111 BT_DBG("sk %p", sk);
112
113 if (!addr || alen < sizeof(addr->sa_family) ||
114 addr->sa_family != AF_BLUETOOTH)
115 return -EINVAL;
116
117 memset(&la, 0, sizeof(la));
118 len = min_t(unsigned int, sizeof(la), alen);
119 memcpy(&la, addr, len);
120
Ville Tervoacd7d372011-02-10 22:38:49 -0300121 if (la.l2_cid && la.l2_psm)
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200122 return -EINVAL;
123
124 lock_sock(sk);
125
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300126 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED
Ville Tervoacd7d372011-02-10 22:38:49 -0300127 && !(la.l2_psm || la.l2_cid)) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200128 err = -EINVAL;
129 goto done;
130 }
131
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300132 switch (chan->mode) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200133 case L2CAP_MODE_BASIC:
134 break;
135 case L2CAP_MODE_ERTM:
136 case L2CAP_MODE_STREAMING:
137 if (!disable_ertm)
138 break;
139 /* fall through */
140 default:
141 err = -ENOTSUPP;
142 goto done;
143 }
144
145 switch (sk->sk_state) {
146 case BT_CONNECT:
147 case BT_CONNECT2:
148 case BT_CONFIG:
149 /* Already connecting */
150 goto wait;
151
152 case BT_CONNECTED:
153 /* Already connected */
154 err = -EISCONN;
155 goto done;
156
157 case BT_OPEN:
158 case BT_BOUND:
159 /* Can connect */
160 break;
161
162 default:
163 err = -EBADFD;
164 goto done;
165 }
166
167 /* PSM must be odd and lsb of upper byte must be 0 */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300168 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid &&
169 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200170 err = -EINVAL;
171 goto done;
172 }
173
174 /* Set destination address and psm */
175 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300176 chan->psm = la.l2_psm;
177 chan->dcid = la.l2_cid;
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200178
Gustavo F. Padovan77a74c72011-04-12 18:17:14 -0300179 err = l2cap_chan_connect(l2cap_pi(sk)->chan);
Gustavo F. Padovan4e34c502011-02-04 02:56:13 -0200180 if (err)
181 goto done;
182
183wait:
184 err = bt_sock_wait_state(sk, BT_CONNECTED,
185 sock_sndtimeo(sk, flags & O_NONBLOCK));
186done:
187 release_sock(sk);
188 return err;
189}
190
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200191static int l2cap_sock_listen(struct socket *sock, int backlog)
192{
193 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300194 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200195 int err = 0;
196
197 BT_DBG("sk %p backlog %d", sk, backlog);
198
199 lock_sock(sk);
200
201 if ((sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM)
202 || sk->sk_state != BT_BOUND) {
203 err = -EBADFD;
204 goto done;
205 }
206
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300207 switch (chan->mode) {
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200208 case L2CAP_MODE_BASIC:
209 break;
210 case L2CAP_MODE_ERTM:
211 case L2CAP_MODE_STREAMING:
212 if (!disable_ertm)
213 break;
214 /* fall through */
215 default:
216 err = -ENOTSUPP;
217 goto done;
218 }
219
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200220 sk->sk_max_ack_backlog = backlog;
221 sk->sk_ack_backlog = 0;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300222
223 chan->state = BT_LISTEN;
Gustavo F. Padovanaf6bcd82011-02-04 02:40:28 -0200224 sk->sk_state = BT_LISTEN;
225
226done:
227 release_sock(sk);
228 return err;
229}
230
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200231static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags)
232{
233 DECLARE_WAITQUEUE(wait, current);
234 struct sock *sk = sock->sk, *nsk;
235 long timeo;
236 int err = 0;
237
238 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
239
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200240 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
241
242 BT_DBG("sk %p timeo %ld", sk, timeo);
243
244 /* Wait for an incoming connection. (wake-one). */
245 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400246 while (1) {
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200247 set_current_state(TASK_INTERRUPTIBLE);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200248
249 if (sk->sk_state != BT_LISTEN) {
250 err = -EBADFD;
251 break;
252 }
253
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400254 nsk = bt_accept_dequeue(sk, newsock);
255 if (nsk)
256 break;
257
258 if (!timeo) {
259 err = -EAGAIN;
260 break;
261 }
262
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200263 if (signal_pending(current)) {
264 err = sock_intr_errno(timeo);
265 break;
266 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400267
268 release_sock(sk);
269 timeo = schedule_timeout(timeo);
270 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200271 }
Peter Hurleyf9a3c202011-07-24 00:10:52 -0400272 __set_current_state(TASK_RUNNING);
Gustavo F. Padovanc47b7c72011-02-04 02:42:23 -0200273 remove_wait_queue(sk_sleep(sk), &wait);
274
275 if (err)
276 goto done;
277
278 newsock->state = SS_CONNECTED;
279
280 BT_DBG("new socket %p", nsk);
281
282done:
283 release_sock(sk);
284 return err;
285}
286
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200287static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
288{
289 struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr;
290 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300291 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200292
293 BT_DBG("sock %p, sk %p", sock, sk);
294
295 addr->sa_family = AF_BLUETOOTH;
296 *len = sizeof(struct sockaddr_l2);
297
298 if (peer) {
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300299 la->l2_psm = chan->psm;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200300 bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300301 la->l2_cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200302 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300303 la->l2_psm = chan->sport;
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200304 bacpy(&la->l2_bdaddr, &bt_sk(sk)->src);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300305 la->l2_cid = cpu_to_le16(chan->scid);
Gustavo F. Padovand7175d52011-02-04 02:43:46 -0200306 }
307
308 return 0;
309}
310
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200311static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
312{
313 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300314 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200315 struct l2cap_options opts;
316 struct l2cap_conninfo cinfo;
317 int len, err = 0;
318 u32 opt;
319
320 BT_DBG("sk %p", sk);
321
322 if (get_user(len, optlen))
323 return -EFAULT;
324
325 lock_sock(sk);
326
327 switch (optname) {
328 case L2CAP_OPTIONS:
Vasiliy Kulikove3fb5922011-02-10 20:59:42 +0300329 memset(&opts, 0, sizeof(opts));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300330 opts.imtu = chan->imtu;
331 opts.omtu = chan->omtu;
332 opts.flush_to = chan->flush_to;
333 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300334 opts.fcs = chan->fcs;
335 opts.max_tx = chan->max_tx;
336 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200337
338 len = min_t(unsigned int, len, sizeof(opts));
339 if (copy_to_user(optval, (char *) &opts, len))
340 err = -EFAULT;
341
342 break;
343
344 case L2CAP_LM:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300345 switch (chan->sec_level) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200346 case BT_SECURITY_LOW:
347 opt = L2CAP_LM_AUTH;
348 break;
349 case BT_SECURITY_MEDIUM:
350 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT;
351 break;
352 case BT_SECURITY_HIGH:
353 opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT |
354 L2CAP_LM_SECURE;
355 break;
356 default:
357 opt = 0;
358 break;
359 }
360
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300361 if (chan->role_switch)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200362 opt |= L2CAP_LM_MASTER;
363
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300364 if (chan->force_reliable)
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200365 opt |= L2CAP_LM_RELIABLE;
366
367 if (put_user(opt, (u32 __user *) optval))
368 err = -EFAULT;
369 break;
370
371 case L2CAP_CONNINFO:
372 if (sk->sk_state != BT_CONNECTED &&
373 !(sk->sk_state == BT_CONNECT2 &&
374 bt_sk(sk)->defer_setup)) {
375 err = -ENOTCONN;
376 break;
377 }
378
Filip Palian8d03e972011-05-12 19:32:46 +0200379 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300380 cinfo.hci_handle = chan->conn->hcon->handle;
381 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3);
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200382
383 len = min_t(unsigned int, len, sizeof(cinfo));
384 if (copy_to_user(optval, (char *) &cinfo, len))
385 err = -EFAULT;
386
387 break;
388
389 default:
390 err = -ENOPROTOOPT;
391 break;
392 }
393
394 release_sock(sk);
395 return err;
396}
397
398static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
399{
400 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300401 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200402 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700403 struct bt_power pwr;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200404 int len, err = 0;
405
406 BT_DBG("sk %p", sk);
407
408 if (level == SOL_L2CAP)
409 return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
410
411 if (level != SOL_BLUETOOTH)
412 return -ENOPROTOOPT;
413
414 if (get_user(len, optlen))
415 return -EFAULT;
416
417 lock_sock(sk);
418
419 switch (optname) {
420 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300421 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
422 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200423 err = -EINVAL;
424 break;
425 }
426
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300427 memset(&sec, 0, sizeof(sec));
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300428 sec.level = chan->sec_level;
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200429
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -0300430 if (sk->sk_state == BT_CONNECTED)
431 sec.key_size = chan->conn->hcon->enc_key_size;
432
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200433 len = min_t(unsigned int, len, sizeof(sec));
434 if (copy_to_user(optval, (char *) &sec, len))
435 err = -EFAULT;
436
437 break;
438
439 case BT_DEFER_SETUP:
440 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
441 err = -EINVAL;
442 break;
443 }
444
445 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
446 err = -EFAULT;
447
448 break;
449
450 case BT_FLUSHABLE:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300451 if (put_user(chan->flushable, (u32 __user *) optval))
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200452 err = -EFAULT;
453
454 break;
455
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700456 case BT_POWER:
457 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
458 && sk->sk_type != SOCK_RAW) {
459 err = -EINVAL;
460 break;
461 }
462
463 pwr.force_active = chan->force_active;
464
465 len = min_t(unsigned int, len, sizeof(pwr));
466 if (copy_to_user(optval, (char *) &pwr, len))
467 err = -EFAULT;
468
469 break;
470
Gustavo F. Padovan99f48082011-02-04 02:52:55 -0200471 default:
472 err = -ENOPROTOOPT;
473 break;
474 }
475
476 release_sock(sk);
477 return err;
478}
479
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200480static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
481{
482 struct sock *sk = sock->sk;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300483 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200484 struct l2cap_options opts;
485 int len, err = 0;
486 u32 opt;
487
488 BT_DBG("sk %p", sk);
489
490 lock_sock(sk);
491
492 switch (optname) {
493 case L2CAP_OPTIONS:
494 if (sk->sk_state == BT_CONNECTED) {
495 err = -EINVAL;
496 break;
497 }
498
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300499 opts.imtu = chan->imtu;
500 opts.omtu = chan->omtu;
501 opts.flush_to = chan->flush_to;
502 opts.mode = chan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300503 opts.fcs = chan->fcs;
504 opts.max_tx = chan->max_tx;
505 opts.txwin_size = (__u16)chan->tx_win;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200506
507 len = min_t(unsigned int, sizeof(opts), optlen);
508 if (copy_from_user((char *) &opts, optval, len)) {
509 err = -EFAULT;
510 break;
511 }
512
513 if (opts.txwin_size > L2CAP_DEFAULT_TX_WINDOW) {
514 err = -EINVAL;
515 break;
516 }
517
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300518 chan->mode = opts.mode;
519 switch (chan->mode) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200520 case L2CAP_MODE_BASIC:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300521 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200522 break;
523 case L2CAP_MODE_ERTM:
524 case L2CAP_MODE_STREAMING:
525 if (!disable_ertm)
526 break;
527 /* fall through */
528 default:
529 err = -EINVAL;
530 break;
531 }
532
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300533 chan->imtu = opts.imtu;
534 chan->omtu = opts.omtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300535 chan->fcs = opts.fcs;
536 chan->max_tx = opts.max_tx;
537 chan->tx_win = (__u8)opts.txwin_size;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200538 break;
539
540 case L2CAP_LM:
541 if (get_user(opt, (u32 __user *) optval)) {
542 err = -EFAULT;
543 break;
544 }
545
546 if (opt & L2CAP_LM_AUTH)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300547 chan->sec_level = BT_SECURITY_LOW;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200548 if (opt & L2CAP_LM_ENCRYPT)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300549 chan->sec_level = BT_SECURITY_MEDIUM;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200550 if (opt & L2CAP_LM_SECURE)
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300551 chan->sec_level = BT_SECURITY_HIGH;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200552
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300553 chan->role_switch = (opt & L2CAP_LM_MASTER);
554 chan->force_reliable = (opt & L2CAP_LM_RELIABLE);
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200555 break;
556
557 default:
558 err = -ENOPROTOOPT;
559 break;
560 }
561
562 release_sock(sk);
563 return err;
564}
565
566static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
567{
568 struct sock *sk = sock->sk;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300569 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200570 struct bt_security sec;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700571 struct bt_power pwr;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300572 struct l2cap_conn *conn;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200573 int len, err = 0;
574 u32 opt;
575
576 BT_DBG("sk %p", sk);
577
578 if (level == SOL_L2CAP)
579 return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
580
581 if (level != SOL_BLUETOOTH)
582 return -ENOPROTOOPT;
583
584 lock_sock(sk);
585
586 switch (optname) {
587 case BT_SECURITY:
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300588 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
589 chan->chan_type != L2CAP_CHAN_RAW) {
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200590 err = -EINVAL;
591 break;
592 }
593
594 sec.level = BT_SECURITY_LOW;
595
596 len = min_t(unsigned int, sizeof(sec), optlen);
597 if (copy_from_user((char *) &sec, optval, len)) {
598 err = -EFAULT;
599 break;
600 }
601
602 if (sec.level < BT_SECURITY_LOW ||
603 sec.level > BT_SECURITY_HIGH) {
604 err = -EINVAL;
605 break;
606 }
607
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300608 chan->sec_level = sec.level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300609
610 conn = chan->conn;
611 if (conn && chan->scid == L2CAP_CID_LE_DATA) {
612 if (!conn->hcon->out) {
613 err = -EINVAL;
614 break;
615 }
616
617 if (smp_conn_security(conn, sec.level))
618 break;
619
620 err = 0;
621 sk->sk_state = BT_CONFIG;
622 }
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200623 break;
624
625 case BT_DEFER_SETUP:
626 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
627 err = -EINVAL;
628 break;
629 }
630
631 if (get_user(opt, (u32 __user *) optval)) {
632 err = -EFAULT;
633 break;
634 }
635
636 bt_sk(sk)->defer_setup = opt;
637 break;
638
639 case BT_FLUSHABLE:
640 if (get_user(opt, (u32 __user *) optval)) {
641 err = -EFAULT;
642 break;
643 }
644
645 if (opt > BT_FLUSHABLE_ON) {
646 err = -EINVAL;
647 break;
648 }
649
650 if (opt == BT_FLUSHABLE_OFF) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300651 struct l2cap_conn *conn = chan->conn;
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300652 /* proceed further only when we have l2cap_conn and
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200653 No Flush support in the LM */
654 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
655 err = -EINVAL;
656 break;
657 }
658 }
659
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300660 chan->flushable = opt;
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200661 break;
662
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700663 case BT_POWER:
664 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
665 chan->chan_type != L2CAP_CHAN_RAW) {
666 err = -EINVAL;
667 break;
668 }
669
670 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
671
672 len = min_t(unsigned int, sizeof(pwr), optlen);
673 if (copy_from_user((char *) &pwr, optval, len)) {
674 err = -EFAULT;
675 break;
676 }
677 chan->force_active = pwr.force_active;
678 break;
679
Gustavo F. Padovan33575df2011-02-04 02:48:48 -0200680 default:
681 err = -ENOPROTOOPT;
682 break;
683 }
684
685 release_sock(sk);
686 return err;
687}
688
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200689static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len)
690{
691 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300692 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200693 int err;
694
695 BT_DBG("sock %p, sk %p", sock, sk);
696
697 err = sock_error(sk);
698 if (err)
699 return err;
700
701 if (msg->msg_flags & MSG_OOB)
702 return -EOPNOTSUPP;
703
704 lock_sock(sk);
705
706 if (sk->sk_state != BT_CONNECTED) {
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300707 release_sock(sk);
708 return -ENOTCONN;
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200709 }
710
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -0300711 err = l2cap_chan_send(chan, msg, len);
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200712
Gustavo F. Padovanfd83ccd2011-02-04 03:20:52 -0200713 release_sock(sk);
714 return err;
715}
716
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200717static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags)
718{
719 struct sock *sk = sock->sk;
Mat Martineaue3281402011-07-07 09:39:02 -0700720 struct l2cap_pinfo *pi = l2cap_pi(sk);
721 int err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200722
723 lock_sock(sk);
724
725 if (sk->sk_state == BT_CONNECT2 && bt_sk(sk)->defer_setup) {
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300726 sk->sk_state = BT_CONFIG;
727
Mat Martineaue3281402011-07-07 09:39:02 -0700728 __l2cap_connect_rsp_defer(pi->chan);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200729 release_sock(sk);
730 return 0;
731 }
732
733 release_sock(sk);
734
735 if (sock->type == SOCK_STREAM)
Mat Martineaue3281402011-07-07 09:39:02 -0700736 err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags);
737 else
738 err = bt_sock_recvmsg(iocb, sock, msg, len, flags);
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200739
Mat Martineaue3281402011-07-07 09:39:02 -0700740 if (pi->chan->mode != L2CAP_MODE_ERTM)
741 return err;
742
743 /* Attempt to put pending rx data in the socket buffer */
744
745 lock_sock(sk);
746
747 if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state))
748 goto done;
749
750 if (pi->rx_busy_skb) {
751 if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb))
752 pi->rx_busy_skb = NULL;
753 else
754 goto done;
755 }
756
757 /* Restore data flow when half of the receive buffer is
758 * available. This avoids resending large numbers of
759 * frames.
760 */
761 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1)
762 l2cap_chan_busy(pi->chan, 0);
763
764done:
765 release_sock(sk);
766 return err;
Gustavo F. Padovan68983252011-02-04 03:02:31 -0200767}
768
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200769/* Kill socket (only if zapped and orphan)
770 * Must be called on unlocked socket.
771 */
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300772static void l2cap_sock_kill(struct sock *sk)
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200773{
774 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
775 return;
776
777 BT_DBG("sk %p state %d", sk, sk->sk_state);
778
779 /* Kill poor orphan */
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300780
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300781 l2cap_chan_destroy(l2cap_pi(sk)->chan);
Gustavo F. Padovan05fc1572011-02-04 03:26:01 -0200782 sock_set_flag(sk, SOCK_DEAD);
783 sock_put(sk);
784}
785
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200786static int l2cap_sock_shutdown(struct socket *sock, int how)
787{
788 struct sock *sk = sock->sk;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300789 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200790 int err = 0;
791
792 BT_DBG("sock %p, sk %p", sock, sk);
793
794 if (!sk)
795 return 0;
796
797 lock_sock(sk);
798 if (!sk->sk_shutdown) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300799 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200800 err = __l2cap_wait_ack(sk);
801
802 sk->sk_shutdown = SHUTDOWN_MASK;
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300803 l2cap_chan_close(chan, 0);
Gustavo F. Padovandcba0db2011-02-04 03:08:36 -0200804
805 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
806 err = bt_sock_wait_state(sk, BT_CLOSED,
807 sk->sk_lingertime);
808 }
809
810 if (!err && sk->sk_err)
811 err = -sk->sk_err;
812
813 release_sock(sk);
814 return err;
815}
816
Gustavo F. Padovan554f05b2011-02-04 02:36:42 -0200817static int l2cap_sock_release(struct socket *sock)
818{
819 struct sock *sk = sock->sk;
820 int err;
821
822 BT_DBG("sock %p, sk %p", sock, sk);
823
824 if (!sk)
825 return 0;
826
827 err = l2cap_sock_shutdown(sock, 2);
828
829 sock_orphan(sk);
830 l2cap_sock_kill(sk);
831 return err;
832}
833
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300834static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
835{
836 struct sock *sk, *parent = data;
837
838 sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP,
839 GFP_ATOMIC);
840 if (!sk)
841 return NULL;
842
843 l2cap_sock_init(sk, parent);
844
845 return l2cap_pi(sk)->chan;
846}
847
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300848static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
849{
Mat Martineaue3281402011-07-07 09:39:02 -0700850 int err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300851 struct sock *sk = data;
Mat Martineaue3281402011-07-07 09:39:02 -0700852 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300853
Mat Martineaue3281402011-07-07 09:39:02 -0700854 if (pi->rx_busy_skb)
855 return -ENOMEM;
856
857 err = sock_queue_rcv_skb(sk, skb);
858
859 /* For ERTM, handle one skb that doesn't fit into the recv
860 * buffer. This is important to do because the data frames
861 * have already been acked, so the skb cannot be discarded.
862 *
863 * Notify the l2cap core that the buffer is full, so the
864 * LOCAL_BUSY state is entered and no more frames are
865 * acked and reassembled until there is buffer space
866 * available.
867 */
868 if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) {
869 pi->rx_busy_skb = skb;
870 l2cap_chan_busy(pi->chan, 1);
871 err = 0;
872 }
873
874 return err;
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300875}
876
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300877static void l2cap_sock_close_cb(void *data)
878{
879 struct sock *sk = data;
880
881 l2cap_sock_kill(sk);
882}
883
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300884static void l2cap_sock_state_change_cb(void *data, int state)
885{
886 struct sock *sk = data;
887
888 sk->sk_state = state;
889}
890
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300891static struct l2cap_ops l2cap_chan_ops = {
892 .name = "L2CAP Socket Interface",
893 .new_connection = l2cap_sock_new_connection_cb,
Gustavo F. Padovan23070492011-05-16 17:57:22 -0300894 .recv = l2cap_sock_recv_cb,
Gustavo F. Padovanba3bd0e2011-05-16 18:23:24 -0300895 .close = l2cap_sock_close_cb,
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300896 .state_change = l2cap_sock_state_change_cb,
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300897};
898
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200899static void l2cap_sock_destruct(struct sock *sk)
900{
901 BT_DBG("sk %p", sk);
902
Mat Martineaue3281402011-07-07 09:39:02 -0700903 if (l2cap_pi(sk)->rx_busy_skb) {
904 kfree_skb(l2cap_pi(sk)->rx_busy_skb);
905 l2cap_pi(sk)->rx_busy_skb = NULL;
906 }
907
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200908 skb_queue_purge(&sk->sk_receive_queue);
909 skb_queue_purge(&sk->sk_write_queue);
910}
911
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300912static void l2cap_sock_init(struct sock *sk, struct sock *parent)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200913{
914 struct l2cap_pinfo *pi = l2cap_pi(sk);
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300915 struct l2cap_chan *chan = pi->chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200916
917 BT_DBG("sk %p", sk);
918
919 if (parent) {
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300920 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
921
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200922 sk->sk_type = parent->sk_type;
923 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
924
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300925 chan->chan_type = pchan->chan_type;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300926 chan->imtu = pchan->imtu;
927 chan->omtu = pchan->omtu;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -0300928 chan->conf_state = pchan->conf_state;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300929 chan->mode = pchan->mode;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300930 chan->fcs = pchan->fcs;
931 chan->max_tx = pchan->max_tx;
932 chan->tx_win = pchan->tx_win;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300933 chan->sec_level = pchan->sec_level;
934 chan->role_switch = pchan->role_switch;
935 chan->force_reliable = pchan->force_reliable;
936 chan->flushable = pchan->flushable;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700937 chan->force_active = pchan->force_active;
Paul Moore6230c9b2011-10-07 09:40:59 +0000938
939 security_sk_clone(parent, sk);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200940 } else {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -0300941
942 switch (sk->sk_type) {
943 case SOCK_RAW:
944 chan->chan_type = L2CAP_CHAN_RAW;
945 break;
946 case SOCK_DGRAM:
947 chan->chan_type = L2CAP_CHAN_CONN_LESS;
948 break;
949 case SOCK_SEQPACKET:
950 case SOCK_STREAM:
951 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
952 break;
953 }
954
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300955 chan->imtu = L2CAP_DEFAULT_MTU;
956 chan->omtu = 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200957 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300958 chan->mode = L2CAP_MODE_ERTM;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -0300959 set_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200960 } else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300961 chan->mode = L2CAP_MODE_BASIC;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200962 }
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300963 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
964 chan->fcs = L2CAP_FCS_CRC16;
965 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300966 chan->sec_level = BT_SECURITY_LOW;
967 chan->role_switch = 0;
968 chan->force_reliable = 0;
969 chan->flushable = BT_FLUSHABLE_OFF;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700970 chan->force_active = BT_POWER_FORCE_ACTIVE_ON;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300971
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200972 }
973
974 /* Default config options */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300975 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300976
977 chan->data = sk;
978 chan->ops = &l2cap_chan_ops;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200979}
980
981static struct proto l2cap_proto = {
982 .name = "L2CAP",
983 .owner = THIS_MODULE,
984 .obj_size = sizeof(struct l2cap_pinfo)
985};
986
Gustavo F. Padovan80808e42011-05-16 17:24:37 -0300987static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200988{
989 struct sock *sk;
Gustavo F. Padovandc50a062011-05-16 16:42:01 -0300990 struct l2cap_chan *chan;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -0200991
992 sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto);
993 if (!sk)
994 return NULL;
995
996 sock_init_data(sock, sk);
997 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
998
999 sk->sk_destruct = l2cap_sock_destruct;
Chen Ganir6be6b112011-07-28 15:42:09 +03001000 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001001
1002 sock_reset_flag(sk, SOCK_ZAPPED);
1003
1004 sk->sk_protocol = proto;
1005 sk->sk_state = BT_OPEN;
1006
Gustavo F. Padovandc50a062011-05-16 16:42:01 -03001007 chan = l2cap_chan_create(sk);
1008 if (!chan) {
1009 l2cap_sock_kill(sk);
1010 return NULL;
1011 }
1012
1013 l2cap_pi(sk)->chan = chan;
1014
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001015 return sk;
1016}
1017
1018static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol,
1019 int kern)
1020{
1021 struct sock *sk;
1022
1023 BT_DBG("sock %p", sock);
1024
1025 sock->state = SS_UNCONNECTED;
1026
1027 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM &&
1028 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW)
1029 return -ESOCKTNOSUPPORT;
1030
1031 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
1032 return -EPERM;
1033
1034 sock->ops = &l2cap_sock_ops;
1035
1036 sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC);
1037 if (!sk)
1038 return -ENOMEM;
1039
1040 l2cap_sock_init(sk, NULL);
1041 return 0;
1042}
1043
Gustavo F. Padovancf2f90f2011-04-27 18:40:39 -03001044static const struct proto_ops l2cap_sock_ops = {
Gustavo F. Padovan65390582011-02-04 02:33:56 -02001045 .family = PF_BLUETOOTH,
1046 .owner = THIS_MODULE,
1047 .release = l2cap_sock_release,
1048 .bind = l2cap_sock_bind,
1049 .connect = l2cap_sock_connect,
1050 .listen = l2cap_sock_listen,
1051 .accept = l2cap_sock_accept,
1052 .getname = l2cap_sock_getname,
1053 .sendmsg = l2cap_sock_sendmsg,
1054 .recvmsg = l2cap_sock_recvmsg,
1055 .poll = bt_sock_poll,
1056 .ioctl = bt_sock_ioctl,
1057 .mmap = sock_no_mmap,
1058 .socketpair = sock_no_socketpair,
1059 .shutdown = l2cap_sock_shutdown,
1060 .setsockopt = l2cap_sock_setsockopt,
1061 .getsockopt = l2cap_sock_getsockopt
1062};
1063
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001064static const struct net_proto_family l2cap_sock_family_ops = {
1065 .family = PF_BLUETOOTH,
1066 .owner = THIS_MODULE,
1067 .create = l2cap_sock_create,
1068};
1069
1070int __init l2cap_init_sockets(void)
1071{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001072 int err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001073
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001074 err = proto_register(&l2cap_proto, 0);
1075 if (err < 0)
1076 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001077
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001078 err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops);
1079 if (err < 0)
1080 goto error;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001081
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001082 BT_INFO("L2CAP socket layer initialized");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001083
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001084 return 0;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001085
1086error:
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001087 BT_ERR("L2CAP socket registration failed");
1088 proto_unregister(&l2cap_proto);
1089 return err;
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001090}
1091
1092void l2cap_cleanup_sockets(void)
1093{
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001094 if (bt_sock_unregister(BTPROTO_L2CAP) < 0)
1095 BT_ERR("L2CAP socket unregistration failed");
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001096
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03001097 proto_unregister(&l2cap_proto);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02001098}