blob: 2025b45a8bf8f1aac530385c331983514b44b337 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 RFCOMM implementation for Linux Bluetooth stack (BlueZ).
3 Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
4 Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License version 2 as
8 published by the Free Software Foundation;
9
10 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
13 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090014 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
15 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070017 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
20 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070021 SOFTWARE IS DISCLAIMED.
22*/
23
24/*
25 * RFCOMM sockets.
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 */
27
Gustavo Padovan8c520a52012-05-23 04:04:22 -030028#include <linux/export.h>
Marcel Holtmannaef7d972010-03-21 05:27:45 +010029#include <linux/debugfs.h>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010030#include <linux/sched/signal.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031
32#include <net/bluetooth/bluetooth.h>
33#include <net/bluetooth/hci_core.h>
34#include <net/bluetooth/l2cap.h>
35#include <net/bluetooth/rfcomm.h>
36
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080037static const struct proto_ops rfcomm_sock_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39static struct bt_sock_list rfcomm_sk_list = {
Robert P. J. Dayd5fb2962008-03-28 16:17:38 -070040 .lock = __RW_LOCK_UNLOCKED(rfcomm_sk_list.lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -070041};
42
43static void rfcomm_sock_close(struct sock *sk);
44static void rfcomm_sock_kill(struct sock *sk);
45
46/* ---- DLC callbacks ----
47 *
48 * called under rfcomm_dlc_lock()
49 */
50static void rfcomm_sk_data_ready(struct rfcomm_dlc *d, struct sk_buff *skb)
51{
52 struct sock *sk = d->owner;
53 if (!sk)
54 return;
55
56 atomic_add(skb->len, &sk->sk_rmem_alloc);
57 skb_queue_tail(&sk->sk_receive_queue, skb);
David S. Miller676d2362014-04-11 16:15:36 -040058 sk->sk_data_ready(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -070059
60 if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
61 rfcomm_dlc_throttle(d);
62}
63
64static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
65{
66 struct sock *sk = d->owner, *parent;
Gustavo F. Padovanfad003b2010-08-14 00:48:07 -030067 unsigned long flags;
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069 if (!sk)
70 return;
71
72 BT_DBG("dlc %p state %ld err %d", d, d->state, err);
73
Gustavo F. Padovanfad003b2010-08-14 00:48:07 -030074 local_irq_save(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070075 bh_lock_sock(sk);
76
77 if (err)
78 sk->sk_err = err;
79
80 sk->sk_state = d->state;
81
82 parent = bt_sk(sk)->parent;
83 if (parent) {
84 if (d->state == BT_CLOSED) {
85 sock_set_flag(sk, SOCK_ZAPPED);
86 bt_accept_unlink(sk);
87 }
David S. Miller676d2362014-04-11 16:15:36 -040088 parent->sk_data_ready(parent);
Linus Torvalds1da177e2005-04-16 15:20:36 -070089 } else {
90 if (d->state == BT_CONNECTED)
Marcel Holtmann94a86df2013-10-13 10:34:02 -070091 rfcomm_session_getaddr(d->session,
92 &rfcomm_pi(sk)->src, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -070093 sk->sk_state_change(sk);
94 }
95
96 bh_unlock_sock(sk);
Gustavo F. Padovanfad003b2010-08-14 00:48:07 -030097 local_irq_restore(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -070098
99 if (parent && sock_flag(sk, SOCK_ZAPPED)) {
100 /* We have to drop DLC lock here, otherwise
101 * rfcomm_sock_destruct() will dead lock. */
102 rfcomm_dlc_unlock(d);
103 rfcomm_sock_kill(sk);
104 rfcomm_dlc_lock(d);
105 }
106}
107
108/* ---- Socket functions ---- */
Andrzej Kaczmarekb1765e72014-02-20 16:42:01 +0100109static struct sock *__rfcomm_get_listen_sock_by_addr(u8 channel, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110{
111 struct sock *sk = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112
Sasha Levinb67bfe02013-02-27 17:06:00 -0800113 sk_for_each(sk, &rfcomm_sk_list.head) {
Andrzej Kaczmarekb1765e72014-02-20 16:42:01 +0100114 if (rfcomm_pi(sk)->channel != channel)
115 continue;
116
117 if (bacmp(&rfcomm_pi(sk)->src, src))
118 continue;
119
120 if (sk->sk_state == BT_BOUND || sk->sk_state == BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 break;
122 }
123
Sasha Levinb67bfe02013-02-27 17:06:00 -0800124 return sk ? sk : NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125}
126
127/* Find socket with channel and source bdaddr.
128 * Returns closest match.
129 */
Gustavo F. Padovaneeb36652010-11-01 18:43:53 +0000130static struct sock *rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131{
132 struct sock *sk = NULL, *sk1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
Gustavo F. Padovaneeb36652010-11-01 18:43:53 +0000134 read_lock(&rfcomm_sk_list.lock);
135
Sasha Levinb67bfe02013-02-27 17:06:00 -0800136 sk_for_each(sk, &rfcomm_sk_list.head) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137 if (state && sk->sk_state != state)
138 continue;
139
140 if (rfcomm_pi(sk)->channel == channel) {
141 /* Exact match. */
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700142 if (!bacmp(&rfcomm_pi(sk)->src, src))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143 break;
144
145 /* Closest match */
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700146 if (!bacmp(&rfcomm_pi(sk)->src, BDADDR_ANY))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147 sk1 = sk;
148 }
149 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151 read_unlock(&rfcomm_sk_list.lock);
Gustavo F. Padovaneeb36652010-11-01 18:43:53 +0000152
Sasha Levinb67bfe02013-02-27 17:06:00 -0800153 return sk ? sk : sk1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700154}
155
156static void rfcomm_sock_destruct(struct sock *sk)
157{
158 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
159
160 BT_DBG("sk %p dlc %p", sk, d);
161
162 skb_queue_purge(&sk->sk_receive_queue);
163 skb_queue_purge(&sk->sk_write_queue);
164
165 rfcomm_dlc_lock(d);
166 rfcomm_pi(sk)->dlc = NULL;
167
168 /* Detach DLC if it's owned by this socket */
169 if (d->owner == sk)
170 d->owner = NULL;
171 rfcomm_dlc_unlock(d);
172
173 rfcomm_dlc_put(d);
174}
175
176static void rfcomm_sock_cleanup_listen(struct sock *parent)
177{
178 struct sock *sk;
179
180 BT_DBG("parent %p", parent);
181
182 /* Close not yet accepted dlcs */
183 while ((sk = bt_accept_dequeue(parent, NULL))) {
184 rfcomm_sock_close(sk);
185 rfcomm_sock_kill(sk);
186 }
187
188 parent->sk_state = BT_CLOSED;
189 sock_set_flag(parent, SOCK_ZAPPED);
190}
191
192/* Kill socket (only if zapped and orphan)
193 * Must be called on unlocked socket.
194 */
195static void rfcomm_sock_kill(struct sock *sk)
196{
197 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
198 return;
199
200 BT_DBG("sk %p state %d refcnt %d", sk, sk->sk_state, atomic_read(&sk->sk_refcnt));
201
202 /* Kill poor orphan */
203 bt_sock_unlink(&rfcomm_sk_list, sk);
204 sock_set_flag(sk, SOCK_DEAD);
205 sock_put(sk);
206}
207
208static void __rfcomm_sock_close(struct sock *sk)
209{
210 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
211
212 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
213
214 switch (sk->sk_state) {
215 case BT_LISTEN:
216 rfcomm_sock_cleanup_listen(sk);
217 break;
218
219 case BT_CONNECT:
220 case BT_CONNECT2:
221 case BT_CONFIG:
222 case BT_CONNECTED:
223 rfcomm_dlc_close(d, 0);
224
225 default:
226 sock_set_flag(sk, SOCK_ZAPPED);
227 break;
228 }
229}
230
231/* Close socket.
232 * Must be called on unlocked socket.
233 */
234static void rfcomm_sock_close(struct sock *sk)
235{
236 lock_sock(sk);
237 __rfcomm_sock_close(sk);
238 release_sock(sk);
239}
240
241static void rfcomm_sock_init(struct sock *sk, struct sock *parent)
242{
243 struct rfcomm_pinfo *pi = rfcomm_pi(sk);
244
245 BT_DBG("sk %p", sk);
246
247 if (parent) {
248 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300249 pi->dlc->defer_setup = test_bit(BT_SK_DEFER_SETUP,
250 &bt_sk(parent)->flags);
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100251
252 pi->sec_level = rfcomm_pi(parent)->sec_level;
253 pi->role_switch = rfcomm_pi(parent)->role_switch;
Paul Moore6230c9b2011-10-07 09:40:59 +0000254
255 security_sk_clone(parent, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 } else {
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100257 pi->dlc->defer_setup = 0;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100258
259 pi->sec_level = BT_SECURITY_LOW;
260 pi->role_switch = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261 }
262
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100263 pi->dlc->sec_level = pi->sec_level;
264 pi->dlc->role_switch = pi->role_switch;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265}
266
267static struct proto rfcomm_proto = {
268 .name = "RFCOMM",
269 .owner = THIS_MODULE,
270 .obj_size = sizeof(struct rfcomm_pinfo)
271};
272
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500273static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274{
275 struct rfcomm_dlc *d;
276 struct sock *sk;
277
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500278 sk = sk_alloc(net, PF_BLUETOOTH, prio, &rfcomm_proto, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279 if (!sk)
280 return NULL;
281
282 sock_init_data(sock, sk);
283 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
284
285 d = rfcomm_dlc_alloc(prio);
286 if (!d) {
287 sk_free(sk);
288 return NULL;
289 }
290
291 d->data_ready = rfcomm_sk_data_ready;
292 d->state_change = rfcomm_sk_state_change;
293
294 rfcomm_pi(sk)->dlc = d;
295 d->owner = sk;
296
297 sk->sk_destruct = rfcomm_sock_destruct;
298 sk->sk_sndtimeo = RFCOMM_CONN_TIMEOUT;
299
Marcel Holtmann77db1982008-07-14 20:13:45 +0200300 sk->sk_sndbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
301 sk->sk_rcvbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302
303 sock_reset_flag(sk, SOCK_ZAPPED);
304
305 sk->sk_protocol = proto;
Marcel Holtmann77db1982008-07-14 20:13:45 +0200306 sk->sk_state = BT_OPEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307
308 bt_sock_link(&rfcomm_sk_list, sk);
309
310 BT_DBG("sk %p", sk);
311 return sk;
312}
313
Eric Paris3f378b62009-11-05 22:18:14 -0800314static int rfcomm_sock_create(struct net *net, struct socket *sock,
315 int protocol, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316{
317 struct sock *sk;
318
319 BT_DBG("sock %p", sock);
320
321 sock->state = SS_UNCONNECTED;
322
323 if (sock->type != SOCK_STREAM && sock->type != SOCK_RAW)
324 return -ESOCKTNOSUPPORT;
325
326 sock->ops = &rfcomm_sock_ops;
327
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500328 sk = rfcomm_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Marcel Holtmann74da6262006-10-15 17:31:14 +0200329 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330 return -ENOMEM;
331
332 rfcomm_sock_init(sk, NULL);
333 return 0;
334}
335
336static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
337{
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530338 struct sockaddr_rc sa;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 struct sock *sk = sock->sk;
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530340 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341
Mateusz Jurczykd2ecfa72017-06-29 14:04:59 +0200342 if (!addr || addr_len < offsetofend(struct sockaddr, sa_family) ||
343 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344 return -EINVAL;
345
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530346 memset(&sa, 0, sizeof(sa));
347 len = min_t(unsigned int, sizeof(sa), addr_len);
348 memcpy(&sa, addr, len);
349
350 BT_DBG("sk %p %pMR", sk, &sa.rc_bdaddr);
351
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 lock_sock(sk);
353
354 if (sk->sk_state != BT_OPEN) {
355 err = -EBADFD;
356 goto done;
357 }
358
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200359 if (sk->sk_type != SOCK_STREAM) {
360 err = -EINVAL;
361 goto done;
362 }
363
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200364 write_lock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530366 if (sa.rc_channel &&
367 __rfcomm_get_listen_sock_by_addr(sa.rc_channel, &sa.rc_bdaddr)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368 err = -EADDRINUSE;
369 } else {
370 /* Save source address */
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530371 bacpy(&rfcomm_pi(sk)->src, &sa.rc_bdaddr);
372 rfcomm_pi(sk)->channel = sa.rc_channel;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 sk->sk_state = BT_BOUND;
374 }
375
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200376 write_unlock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377
378done:
379 release_sock(sk);
380 return err;
381}
382
383static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
384{
385 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
386 struct sock *sk = sock->sk;
387 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
388 int err = 0;
389
390 BT_DBG("sk %p", sk);
391
Changli Gao6503d962010-03-31 22:58:26 +0000392 if (alen < sizeof(struct sockaddr_rc) ||
393 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394 return -EINVAL;
395
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 lock_sock(sk);
397
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200398 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
399 err = -EBADFD;
400 goto done;
401 }
402
403 if (sk->sk_type != SOCK_STREAM) {
404 err = -EINVAL;
405 goto done;
406 }
407
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408 sk->sk_state = BT_CONNECT;
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700409 bacpy(&rfcomm_pi(sk)->dst, &sa->rc_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410 rfcomm_pi(sk)->channel = sa->rc_channel;
411
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100412 d->sec_level = rfcomm_pi(sk)->sec_level;
413 d->role_switch = rfcomm_pi(sk)->role_switch;
Marcel Holtmann77db1982008-07-14 20:13:45 +0200414
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700415 err = rfcomm_dlc_open(d, &rfcomm_pi(sk)->src, &sa->rc_bdaddr,
416 sa->rc_channel);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 if (!err)
418 err = bt_sock_wait_state(sk, BT_CONNECTED,
419 sock_sndtimeo(sk, flags & O_NONBLOCK));
420
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200421done:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 release_sock(sk);
423 return err;
424}
425
426static int rfcomm_sock_listen(struct socket *sock, int backlog)
427{
428 struct sock *sk = sock->sk;
429 int err = 0;
430
431 BT_DBG("sk %p backlog %d", sk, backlog);
432
433 lock_sock(sk);
434
435 if (sk->sk_state != BT_BOUND) {
436 err = -EBADFD;
437 goto done;
438 }
439
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200440 if (sk->sk_type != SOCK_STREAM) {
441 err = -EINVAL;
442 goto done;
443 }
444
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445 if (!rfcomm_pi(sk)->channel) {
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700446 bdaddr_t *src = &rfcomm_pi(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 u8 channel;
448
449 err = -EINVAL;
450
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200451 write_lock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452
453 for (channel = 1; channel < 31; channel++)
Andrzej Kaczmarekb1765e72014-02-20 16:42:01 +0100454 if (!__rfcomm_get_listen_sock_by_addr(channel, src)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 rfcomm_pi(sk)->channel = channel;
456 err = 0;
457 break;
458 }
459
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200460 write_unlock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461
462 if (err < 0)
463 goto done;
464 }
465
466 sk->sk_max_ack_backlog = backlog;
467 sk->sk_ack_backlog = 0;
468 sk->sk_state = BT_LISTEN;
469
470done:
471 release_sock(sk);
472 return err;
473}
474
David Howellscdfbabf2017-03-09 08:09:05 +0000475static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int flags,
476 bool kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500478 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 struct sock *sk = sock->sk, *nsk;
480 long timeo;
481 int err = 0;
482
Gustavo Padovandc2a0e22012-11-20 23:25:54 -0200483 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200485 if (sk->sk_type != SOCK_STREAM) {
486 err = -EINVAL;
487 goto done;
488 }
489
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
491
492 BT_DBG("sk %p timeo %ld", sk, timeo);
493
494 /* Wait for an incoming connection. (wake-one). */
Eric Dumazetaa395142010-04-20 13:03:51 +0000495 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurley950e2d52011-07-24 00:10:41 -0400496 while (1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 if (sk->sk_state != BT_LISTEN) {
498 err = -EBADFD;
499 break;
500 }
501
Peter Hurley950e2d52011-07-24 00:10:41 -0400502 nsk = bt_accept_dequeue(sk, newsock);
503 if (nsk)
504 break;
505
506 if (!timeo) {
507 err = -EAGAIN;
508 break;
509 }
510
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 if (signal_pending(current)) {
512 err = sock_intr_errno(timeo);
513 break;
514 }
Peter Hurley950e2d52011-07-24 00:10:41 -0400515
516 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500517
518 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
519
Gustavo Padovandc2a0e22012-11-20 23:25:54 -0200520 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521 }
Eric Dumazetaa395142010-04-20 13:03:51 +0000522 remove_wait_queue(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700523
524 if (err)
525 goto done;
526
527 newsock->state = SS_CONNECTED;
528
529 BT_DBG("new socket %p", nsk);
530
531done:
532 release_sock(sk);
533 return err;
534}
535
536static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
537{
538 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
539 struct sock *sk = sock->sk;
540
541 BT_DBG("sock %p, sk %p", sock, sk);
542
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200543 if (peer && sk->sk_state != BT_CONNECTED &&
544 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2)
Johan Hedberg35364c92014-01-28 15:16:50 -0800545 return -ENOTCONN;
546
Mathias Krause9344a972012-08-15 11:31:50 +0000547 memset(sa, 0, sizeof(*sa));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 sa->rc_family = AF_BLUETOOTH;
549 sa->rc_channel = rfcomm_pi(sk)->channel;
550 if (peer)
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700551 bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552 else
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700553 bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554
555 *len = sizeof(struct sockaddr_rc);
556 return 0;
557}
558
Ying Xue1b784142015-03-02 15:37:48 +0800559static int rfcomm_sock_sendmsg(struct socket *sock, struct msghdr *msg,
560 size_t len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561{
562 struct sock *sk = sock->sk;
563 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
564 struct sk_buff *skb;
Johan Hedberge793dcf2013-09-16 13:05:19 +0300565 int sent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100567 if (test_bit(RFCOMM_DEFER_SETUP, &d->flags))
568 return -ENOTCONN;
569
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 if (msg->msg_flags & MSG_OOB)
571 return -EOPNOTSUPP;
572
573 if (sk->sk_shutdown & SEND_SHUTDOWN)
574 return -EPIPE;
575
576 BT_DBG("sock %p, sk %p", sock, sk);
577
578 lock_sock(sk);
579
Johan Hedberge793dcf2013-09-16 13:05:19 +0300580 sent = bt_sock_wait_ready(sk, msg->msg_flags);
581 if (sent)
582 goto done;
583
Linus Torvalds1da177e2005-04-16 15:20:36 -0700584 while (len) {
585 size_t size = min_t(size_t, len, d->mtu);
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100586 int err;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900587
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588 skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
589 msg->msg_flags & MSG_DONTWAIT, &err);
Victor Shcherbatyuk91aa35a2009-01-15 21:52:12 +0100590 if (!skb) {
591 if (sent == 0)
592 sent = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593 break;
Victor Shcherbatyuk91aa35a2009-01-15 21:52:12 +0100594 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
596
Al Viro6ce8e9c2014-04-06 21:25:44 -0400597 err = memcpy_from_msg(skb_put(skb, size), msg, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 if (err) {
599 kfree_skb(skb);
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100600 if (sent == 0)
601 sent = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602 break;
603 }
604
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200605 skb->priority = sk->sk_priority;
606
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 err = rfcomm_dlc_send(d, skb);
608 if (err < 0) {
609 kfree_skb(skb);
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100610 if (sent == 0)
611 sent = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612 break;
613 }
614
615 sent += size;
616 len -= size;
617 }
618
Johan Hedberge793dcf2013-09-16 13:05:19 +0300619done:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 release_sock(sk);
621
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100622 return sent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623}
624
Ying Xue1b784142015-03-02 15:37:48 +0800625static int rfcomm_sock_recvmsg(struct socket *sock, struct msghdr *msg,
626 size_t size, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627{
628 struct sock *sk = sock->sk;
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100629 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
Mat Martineau3d7d01d2010-09-08 10:05:28 -0700630 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700631
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100632 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
633 rfcomm_dlc_accept(d);
634 return 0;
635 }
636
Ying Xue1b784142015-03-02 15:37:48 +0800637 len = bt_sock_stream_recvmsg(sock, msg, size, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638
639 lock_sock(sk);
Mat Martineau3d7d01d2010-09-08 10:05:28 -0700640 if (!(flags & MSG_PEEK) && len > 0)
641 atomic_sub(len, &sk->sk_rmem_alloc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700642
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643 if (atomic_read(&sk->sk_rmem_alloc) <= (sk->sk_rcvbuf >> 2))
644 rfcomm_dlc_unthrottle(rfcomm_pi(sk)->dlc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645 release_sock(sk);
Mat Martineau3d7d01d2010-09-08 10:05:28 -0700646
647 return len;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648}
649
David S. Millerb7058842009-09-30 16:12:20 -0700650static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651{
652 struct sock *sk = sock->sk;
653 int err = 0;
654 u32 opt;
655
656 BT_DBG("sk %p", sk);
657
658 lock_sock(sk);
659
660 switch (optname) {
661 case RFCOMM_LM:
662 if (get_user(opt, (u32 __user *) optval)) {
663 err = -EFAULT;
664 break;
665 }
666
Marcel Holtmann2c068e02014-01-15 22:37:41 -0800667 if (opt & RFCOMM_LM_FIPS) {
668 err = -EINVAL;
669 break;
670 }
671
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100672 if (opt & RFCOMM_LM_AUTH)
673 rfcomm_pi(sk)->sec_level = BT_SECURITY_LOW;
674 if (opt & RFCOMM_LM_ENCRYPT)
675 rfcomm_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
676 if (opt & RFCOMM_LM_SECURE)
677 rfcomm_pi(sk)->sec_level = BT_SECURITY_HIGH;
678
679 rfcomm_pi(sk)->role_switch = (opt & RFCOMM_LM_MASTER);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 break;
681
682 default:
683 err = -ENOPROTOOPT;
684 break;
685 }
686
687 release_sock(sk);
688 return err;
689}
690
David S. Millerb7058842009-09-30 16:12:20 -0700691static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100692{
693 struct sock *sk = sock->sk;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100694 struct bt_security sec;
Stephen Boydd0fad892011-05-12 16:50:09 -0700695 int err = 0;
696 size_t len;
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100697 u32 opt;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100698
699 BT_DBG("sk %p", sk);
700
701 if (level == SOL_RFCOMM)
702 return rfcomm_sock_setsockopt_old(sock, optname, optval, optlen);
703
Marcel Holtmann0588d942009-01-16 10:06:13 +0100704 if (level != SOL_BLUETOOTH)
705 return -ENOPROTOOPT;
706
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100707 lock_sock(sk);
708
709 switch (optname) {
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100710 case BT_SECURITY:
Marcel Holtmann0588d942009-01-16 10:06:13 +0100711 if (sk->sk_type != SOCK_STREAM) {
712 err = -EINVAL;
713 break;
714 }
715
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100716 sec.level = BT_SECURITY_LOW;
717
718 len = min_t(unsigned int, sizeof(sec), optlen);
719 if (copy_from_user((char *) &sec, optval, len)) {
720 err = -EFAULT;
721 break;
722 }
723
724 if (sec.level > BT_SECURITY_HIGH) {
725 err = -EINVAL;
726 break;
727 }
728
729 rfcomm_pi(sk)->sec_level = sec.level;
730 break;
731
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100732 case BT_DEFER_SETUP:
733 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
734 err = -EINVAL;
735 break;
736 }
737
738 if (get_user(opt, (u32 __user *) optval)) {
739 err = -EFAULT;
740 break;
741 }
742
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300743 if (opt)
744 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
745 else
746 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
747
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100748 break;
749
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100750 default:
751 err = -ENOPROTOOPT;
752 break;
753 }
754
755 release_sock(sk);
756 return err;
757}
758
759static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760{
761 struct sock *sk = sock->sk;
Marcel Holtmann60c7a3c92013-11-02 02:36:31 -0700762 struct sock *l2cap_sk;
763 struct l2cap_conn *conn;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764 struct rfcomm_conninfo cinfo;
765 int len, err = 0;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100766 u32 opt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767
768 BT_DBG("sk %p", sk);
769
770 if (get_user(len, optlen))
771 return -EFAULT;
772
773 lock_sock(sk);
774
775 switch (optname) {
776 case RFCOMM_LM:
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100777 switch (rfcomm_pi(sk)->sec_level) {
778 case BT_SECURITY_LOW:
779 opt = RFCOMM_LM_AUTH;
780 break;
781 case BT_SECURITY_MEDIUM:
782 opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT;
783 break;
784 case BT_SECURITY_HIGH:
785 opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT |
Marcel Holtmann2c068e02014-01-15 22:37:41 -0800786 RFCOMM_LM_SECURE;
787 break;
788 case BT_SECURITY_FIPS:
789 opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT |
790 RFCOMM_LM_SECURE | RFCOMM_LM_FIPS;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100791 break;
792 default:
793 opt = 0;
794 break;
795 }
796
797 if (rfcomm_pi(sk)->role_switch)
798 opt |= RFCOMM_LM_MASTER;
799
800 if (put_user(opt, (u32 __user *) optval))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 err = -EFAULT;
Marcel Holtmann2c068e02014-01-15 22:37:41 -0800802
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 break;
804
805 case RFCOMM_CONNINFO:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100806 if (sk->sk_state != BT_CONNECTED &&
807 !rfcomm_pi(sk)->dlc->defer_setup) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 err = -ENOTCONN;
809 break;
810 }
811
Marcel Holtmann60c7a3c92013-11-02 02:36:31 -0700812 l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk;
813 conn = l2cap_pi(l2cap_sk)->chan->conn;
814
Filip Palian8d03e972011-05-12 19:32:46 +0200815 memset(&cinfo, 0, sizeof(cinfo));
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300816 cinfo.hci_handle = conn->hcon->handle;
817 memcpy(cinfo.dev_class, conn->hcon->dev_class, 3);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818
819 len = min_t(unsigned int, len, sizeof(cinfo));
820 if (copy_to_user(optval, (char *) &cinfo, len))
821 err = -EFAULT;
822
823 break;
824
825 default:
826 err = -ENOPROTOOPT;
827 break;
828 }
829
830 release_sock(sk);
831 return err;
832}
833
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100834static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
835{
836 struct sock *sk = sock->sk;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100837 struct bt_security sec;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100838 int len, err = 0;
839
840 BT_DBG("sk %p", sk);
841
842 if (level == SOL_RFCOMM)
843 return rfcomm_sock_getsockopt_old(sock, optname, optval, optlen);
844
Marcel Holtmann0588d942009-01-16 10:06:13 +0100845 if (level != SOL_BLUETOOTH)
846 return -ENOPROTOOPT;
847
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100848 if (get_user(len, optlen))
849 return -EFAULT;
850
851 lock_sock(sk);
852
853 switch (optname) {
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100854 case BT_SECURITY:
Marcel Holtmann0588d942009-01-16 10:06:13 +0100855 if (sk->sk_type != SOCK_STREAM) {
856 err = -EINVAL;
857 break;
858 }
859
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100860 sec.level = rfcomm_pi(sk)->sec_level;
Mathias Krause9ad2de42012-08-15 11:31:48 +0000861 sec.key_size = 0;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100862
863 len = min_t(unsigned int, len, sizeof(sec));
864 if (copy_to_user(optval, (char *) &sec, len))
865 err = -EFAULT;
866
867 break;
868
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100869 case BT_DEFER_SETUP:
870 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
871 err = -EINVAL;
872 break;
873 }
874
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300875 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags),
876 (u32 __user *) optval))
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100877 err = -EFAULT;
878
879 break;
880
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100881 default:
882 err = -ENOPROTOOPT;
883 break;
884 }
885
886 release_sock(sk);
887 return err;
888}
889
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890static int rfcomm_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
891{
David S. Millere19caae2008-12-09 01:04:27 -0800892 struct sock *sk __maybe_unused = sock->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 int err;
894
David S. Millere19caae2008-12-09 01:04:27 -0800895 BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200897 err = bt_sock_ioctl(sock, cmd, arg);
898
899 if (err == -ENOIOCTLCMD) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900#ifdef CONFIG_BT_RFCOMM_TTY
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200901 lock_sock(sk);
902 err = rfcomm_dev_ioctl(sk, cmd, (void __user *) arg);
903 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904#else
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200905 err = -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906#endif
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200907 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 return err;
910}
911
912static int rfcomm_sock_shutdown(struct socket *sock, int how)
913{
914 struct sock *sk = sock->sk;
915 int err = 0;
916
917 BT_DBG("sock %p, sk %p", sock, sk);
918
Andrei Emeltchenko285b4e92010-12-01 16:58:23 +0200919 if (!sk)
920 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921
922 lock_sock(sk);
923 if (!sk->sk_shutdown) {
924 sk->sk_shutdown = SHUTDOWN_MASK;
925 __rfcomm_sock_close(sk);
926
Vladimir Davydov093facf2014-07-15 12:25:28 +0400927 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
928 !(current->flags & PF_EXITING))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700929 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
930 }
931 release_sock(sk);
932 return err;
933}
934
935static int rfcomm_sock_release(struct socket *sock)
936{
937 struct sock *sk = sock->sk;
938 int err;
939
940 BT_DBG("sock %p, sk %p", sock, sk);
941
942 if (!sk)
943 return 0;
944
945 err = rfcomm_sock_shutdown(sock, 2);
946
947 sock_orphan(sk);
948 rfcomm_sock_kill(sk);
949 return err;
950}
951
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900952/* ---- RFCOMM core layer callbacks ----
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953 *
954 * called under rfcomm_lock()
955 */
956int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc **d)
957{
958 struct sock *sk, *parent;
959 bdaddr_t src, dst;
960 int result = 0;
961
962 BT_DBG("session %p channel %d", s, channel);
963
964 rfcomm_session_getaddr(s, &src, &dst);
965
966 /* Check if we have socket listening on channel */
967 parent = rfcomm_get_sock_by_channel(BT_LISTEN, channel, &src);
968 if (!parent)
969 return 0;
970
Gustavo F. Padovaneeb36652010-11-01 18:43:53 +0000971 bh_lock_sock(parent);
972
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 /* Check for backlog size */
974 if (sk_acceptq_is_full(parent)) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900975 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 goto done;
977 }
978
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500979 sk = rfcomm_sock_alloc(sock_net(parent), NULL, BTPROTO_RFCOMM, GFP_ATOMIC, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 if (!sk)
981 goto done;
982
Octavian Purdilab5a30dd2012-01-22 00:28:34 +0200983 bt_sock_reclassify_lock(sk, BTPROTO_RFCOMM);
984
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985 rfcomm_sock_init(sk, parent);
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700986 bacpy(&rfcomm_pi(sk)->src, &src);
987 bacpy(&rfcomm_pi(sk)->dst, &dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 rfcomm_pi(sk)->channel = channel;
989
990 sk->sk_state = BT_CONFIG;
991 bt_accept_enqueue(parent, sk);
992
993 /* Accept connection and return socket DLC */
994 *d = rfcomm_pi(sk)->dlc;
995 result = 1;
996
997done:
998 bh_unlock_sock(parent);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100999
Gustavo Padovanc5daa682012-05-16 12:17:10 -03001000 if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags))
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001001 parent->sk_state_change(parent);
1002
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 return result;
1004}
1005
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001006static int rfcomm_sock_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007{
1008 struct sock *sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -02001010 read_lock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011
Sasha Levinb67bfe02013-02-27 17:06:00 -08001012 sk_for_each(sk, &rfcomm_sk_list.head) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03001013 seq_printf(f, "%pMR %pMR %d %d\n",
Marcel Holtmann94a86df2013-10-13 10:34:02 -07001014 &rfcomm_pi(sk)->src, &rfcomm_pi(sk)->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03001015 sk->sk_state, rfcomm_pi(sk)->channel);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001016 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -02001018 read_unlock(&rfcomm_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001019
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001020 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021}
1022
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001023static int rfcomm_sock_debugfs_open(struct inode *inode, struct file *file)
1024{
1025 return single_open(file, rfcomm_sock_debugfs_show, inode->i_private);
1026}
1027
1028static const struct file_operations rfcomm_sock_debugfs_fops = {
1029 .open = rfcomm_sock_debugfs_open,
1030 .read = seq_read,
1031 .llseek = seq_lseek,
1032 .release = single_release,
1033};
1034
1035static struct dentry *rfcomm_sock_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001037static const struct proto_ops rfcomm_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038 .family = PF_BLUETOOTH,
1039 .owner = THIS_MODULE,
1040 .release = rfcomm_sock_release,
1041 .bind = rfcomm_sock_bind,
1042 .connect = rfcomm_sock_connect,
1043 .listen = rfcomm_sock_listen,
1044 .accept = rfcomm_sock_accept,
1045 .getname = rfcomm_sock_getname,
1046 .sendmsg = rfcomm_sock_sendmsg,
1047 .recvmsg = rfcomm_sock_recvmsg,
1048 .shutdown = rfcomm_sock_shutdown,
1049 .setsockopt = rfcomm_sock_setsockopt,
1050 .getsockopt = rfcomm_sock_getsockopt,
1051 .ioctl = rfcomm_sock_ioctl,
1052 .poll = bt_sock_poll,
1053 .socketpair = sock_no_socketpair,
1054 .mmap = sock_no_mmap
1055};
1056
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001057static const struct net_proto_family rfcomm_sock_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 .family = PF_BLUETOOTH,
1059 .owner = THIS_MODULE,
1060 .create = rfcomm_sock_create
1061};
1062
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001063int __init rfcomm_init_sockets(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064{
1065 int err;
1066
Marcel Holtmann74b3fb82015-01-11 15:18:20 -08001067 BUILD_BUG_ON(sizeof(struct sockaddr_rc) > sizeof(struct sockaddr));
1068
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 err = proto_register(&rfcomm_proto, 0);
1070 if (err < 0)
1071 return err;
1072
1073 err = bt_sock_register(BTPROTO_RFCOMM, &rfcomm_sock_family_ops);
Masatake YAMATOc6f5df162012-07-26 01:29:49 +09001074 if (err < 0) {
1075 BT_ERR("RFCOMM socket layer registration failed");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 goto error;
Masatake YAMATOc6f5df162012-07-26 01:29:49 +09001077 }
1078
Al Virob0316612013-04-04 19:14:33 -04001079 err = bt_procfs_init(&init_net, "rfcomm", &rfcomm_sk_list, NULL);
Masatake YAMATOc6f5df162012-07-26 01:29:49 +09001080 if (err < 0) {
1081 BT_ERR("Failed to create RFCOMM proc file");
1082 bt_sock_unregister(BTPROTO_RFCOMM);
1083 goto error;
1084 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086 BT_INFO("RFCOMM socket layer initialized");
1087
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07001088 if (IS_ERR_OR_NULL(bt_debugfs))
1089 return 0;
1090
1091 rfcomm_sock_debugfs = debugfs_create_file("rfcomm", 0444,
1092 bt_debugfs, NULL,
1093 &rfcomm_sock_debugfs_fops);
1094
Linus Torvalds1da177e2005-04-16 15:20:36 -07001095 return 0;
1096
1097error:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098 proto_unregister(&rfcomm_proto);
1099 return err;
1100}
1101
Gustavo F. Padovan2f8362a2010-07-24 02:04:45 -03001102void __exit rfcomm_cleanup_sockets(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103{
Masatake YAMATOc6f5df162012-07-26 01:29:49 +09001104 bt_procfs_cleanup(&init_net, "rfcomm");
1105
Marcel Holtmannaef7d972010-03-21 05:27:45 +01001106 debugfs_remove(rfcomm_sock_debugfs);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107
David Herrmann5e9d7f82013-02-24 19:36:51 +01001108 bt_sock_unregister(BTPROTO_RFCOMM);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109
1110 proto_unregister(&rfcomm_proto);
1111}