blob: d606e9212291608ea2e266238c0f65ce18d0c311 [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
Reshetova, Elena41c6d652017-06-30 13:08:01 +0300200 BT_DBG("sk %p state %d refcnt %d", sk, sk->sk_state, refcount_read(&sk->sk_refcnt));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201
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);
Gustavo A. R. Silva9ea471322018-03-30 16:05:06 -0500224 /* fall through */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225
226 default:
227 sock_set_flag(sk, SOCK_ZAPPED);
228 break;
229 }
230}
231
232/* Close socket.
233 * Must be called on unlocked socket.
234 */
235static void rfcomm_sock_close(struct sock *sk)
236{
237 lock_sock(sk);
238 __rfcomm_sock_close(sk);
239 release_sock(sk);
240}
241
242static void rfcomm_sock_init(struct sock *sk, struct sock *parent)
243{
244 struct rfcomm_pinfo *pi = rfcomm_pi(sk);
245
246 BT_DBG("sk %p", sk);
247
248 if (parent) {
249 sk->sk_type = parent->sk_type;
Gustavo Padovanc5daa682012-05-16 12:17:10 -0300250 pi->dlc->defer_setup = test_bit(BT_SK_DEFER_SETUP,
251 &bt_sk(parent)->flags);
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100252
253 pi->sec_level = rfcomm_pi(parent)->sec_level;
254 pi->role_switch = rfcomm_pi(parent)->role_switch;
Paul Moore6230c9b2011-10-07 09:40:59 +0000255
256 security_sk_clone(parent, sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257 } else {
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100258 pi->dlc->defer_setup = 0;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100259
260 pi->sec_level = BT_SECURITY_LOW;
261 pi->role_switch = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262 }
263
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100264 pi->dlc->sec_level = pi->sec_level;
265 pi->dlc->role_switch = pi->role_switch;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700266}
267
268static struct proto rfcomm_proto = {
269 .name = "RFCOMM",
270 .owner = THIS_MODULE,
271 .obj_size = sizeof(struct rfcomm_pinfo)
272};
273
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500274static 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 -0700275{
276 struct rfcomm_dlc *d;
277 struct sock *sk;
278
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500279 sk = sk_alloc(net, PF_BLUETOOTH, prio, &rfcomm_proto, kern);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 if (!sk)
281 return NULL;
282
283 sock_init_data(sock, sk);
284 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
285
286 d = rfcomm_dlc_alloc(prio);
287 if (!d) {
288 sk_free(sk);
289 return NULL;
290 }
291
292 d->data_ready = rfcomm_sk_data_ready;
293 d->state_change = rfcomm_sk_state_change;
294
295 rfcomm_pi(sk)->dlc = d;
296 d->owner = sk;
297
298 sk->sk_destruct = rfcomm_sock_destruct;
299 sk->sk_sndtimeo = RFCOMM_CONN_TIMEOUT;
300
Marcel Holtmann77db1982008-07-14 20:13:45 +0200301 sk->sk_sndbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
302 sk->sk_rcvbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303
304 sock_reset_flag(sk, SOCK_ZAPPED);
305
306 sk->sk_protocol = proto;
Marcel Holtmann77db1982008-07-14 20:13:45 +0200307 sk->sk_state = BT_OPEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308
309 bt_sock_link(&rfcomm_sk_list, sk);
310
311 BT_DBG("sk %p", sk);
312 return sk;
313}
314
Eric Paris3f378b62009-11-05 22:18:14 -0800315static int rfcomm_sock_create(struct net *net, struct socket *sock,
316 int protocol, int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317{
318 struct sock *sk;
319
320 BT_DBG("sock %p", sock);
321
322 sock->state = SS_UNCONNECTED;
323
324 if (sock->type != SOCK_STREAM && sock->type != SOCK_RAW)
325 return -ESOCKTNOSUPPORT;
326
327 sock->ops = &rfcomm_sock_ops;
328
Eric W. Biederman11aa9c22015-05-08 21:09:13 -0500329 sk = rfcomm_sock_alloc(net, sock, protocol, GFP_ATOMIC, kern);
Marcel Holtmann74da6262006-10-15 17:31:14 +0200330 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 return -ENOMEM;
332
333 rfcomm_sock_init(sk, NULL);
334 return 0;
335}
336
337static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
338{
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530339 struct sockaddr_rc sa;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340 struct sock *sk = sock->sk;
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530341 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342
Mateusz Jurczykd2ecfa72017-06-29 14:04:59 +0200343 if (!addr || addr_len < offsetofend(struct sockaddr, sa_family) ||
344 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345 return -EINVAL;
346
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530347 memset(&sa, 0, sizeof(sa));
348 len = min_t(unsigned int, sizeof(sa), addr_len);
349 memcpy(&sa, addr, len);
350
351 BT_DBG("sk %p %pMR", sk, &sa.rc_bdaddr);
352
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353 lock_sock(sk);
354
355 if (sk->sk_state != BT_OPEN) {
356 err = -EBADFD;
357 goto done;
358 }
359
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200360 if (sk->sk_type != SOCK_STREAM) {
361 err = -EINVAL;
362 goto done;
363 }
364
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200365 write_lock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530367 if (sa.rc_channel &&
368 __rfcomm_get_listen_sock_by_addr(sa.rc_channel, &sa.rc_bdaddr)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369 err = -EADDRINUSE;
370 } else {
371 /* Save source address */
Jaganath Kanakkassery951b6a02015-05-14 12:58:08 +0530372 bacpy(&rfcomm_pi(sk)->src, &sa.rc_bdaddr);
373 rfcomm_pi(sk)->channel = sa.rc_channel;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 sk->sk_state = BT_BOUND;
375 }
376
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200377 write_unlock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378
379done:
380 release_sock(sk);
381 return err;
382}
383
384static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
385{
386 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
387 struct sock *sk = sock->sk;
388 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
389 int err = 0;
390
391 BT_DBG("sk %p", sk);
392
Changli Gao6503d962010-03-31 22:58:26 +0000393 if (alen < sizeof(struct sockaddr_rc) ||
394 addr->sa_family != AF_BLUETOOTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 return -EINVAL;
396
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397 lock_sock(sk);
398
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200399 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
400 err = -EBADFD;
401 goto done;
402 }
403
404 if (sk->sk_type != SOCK_STREAM) {
405 err = -EINVAL;
406 goto done;
407 }
408
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 sk->sk_state = BT_CONNECT;
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700410 bacpy(&rfcomm_pi(sk)->dst, &sa->rc_bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411 rfcomm_pi(sk)->channel = sa->rc_channel;
412
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100413 d->sec_level = rfcomm_pi(sk)->sec_level;
414 d->role_switch = rfcomm_pi(sk)->role_switch;
Marcel Holtmann77db1982008-07-14 20:13:45 +0200415
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700416 err = rfcomm_dlc_open(d, &rfcomm_pi(sk)->src, &sa->rc_bdaddr,
417 sa->rc_channel);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418 if (!err)
419 err = bt_sock_wait_state(sk, BT_CONNECTED,
420 sock_sndtimeo(sk, flags & O_NONBLOCK));
421
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200422done:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423 release_sock(sk);
424 return err;
425}
426
427static int rfcomm_sock_listen(struct socket *sock, int backlog)
428{
429 struct sock *sk = sock->sk;
430 int err = 0;
431
432 BT_DBG("sk %p backlog %d", sk, backlog);
433
434 lock_sock(sk);
435
436 if (sk->sk_state != BT_BOUND) {
437 err = -EBADFD;
438 goto done;
439 }
440
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200441 if (sk->sk_type != SOCK_STREAM) {
442 err = -EINVAL;
443 goto done;
444 }
445
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446 if (!rfcomm_pi(sk)->channel) {
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700447 bdaddr_t *src = &rfcomm_pi(sk)->src;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448 u8 channel;
449
450 err = -EINVAL;
451
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200452 write_lock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453
454 for (channel = 1; channel < 31; channel++)
Andrzej Kaczmarekb1765e72014-02-20 16:42:01 +0100455 if (!__rfcomm_get_listen_sock_by_addr(channel, src)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 rfcomm_pi(sk)->channel = channel;
457 err = 0;
458 break;
459 }
460
Gustavo F. Padovan95ca83f2011-12-27 15:28:44 -0200461 write_unlock(&rfcomm_sk_list.lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462
463 if (err < 0)
464 goto done;
465 }
466
467 sk->sk_max_ack_backlog = backlog;
468 sk->sk_ack_backlog = 0;
469 sk->sk_state = BT_LISTEN;
470
471done:
472 release_sock(sk);
473 return err;
474}
475
David Howellscdfbabf2017-03-09 08:09:05 +0000476static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int flags,
477 bool kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478{
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500479 DEFINE_WAIT_FUNC(wait, woken_wake_function);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480 struct sock *sk = sock->sk, *nsk;
481 long timeo;
482 int err = 0;
483
Gustavo Padovandc2a0e22012-11-20 23:25:54 -0200484 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200486 if (sk->sk_type != SOCK_STREAM) {
487 err = -EINVAL;
488 goto done;
489 }
490
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491 timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
492
493 BT_DBG("sk %p timeo %ld", sk, timeo);
494
495 /* Wait for an incoming connection. (wake-one). */
Eric Dumazetaa395142010-04-20 13:03:51 +0000496 add_wait_queue_exclusive(sk_sleep(sk), &wait);
Peter Hurley950e2d52011-07-24 00:10:41 -0400497 while (1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498 if (sk->sk_state != BT_LISTEN) {
499 err = -EBADFD;
500 break;
501 }
502
Peter Hurley950e2d52011-07-24 00:10:41 -0400503 nsk = bt_accept_dequeue(sk, newsock);
504 if (nsk)
505 break;
506
507 if (!timeo) {
508 err = -EAGAIN;
509 break;
510 }
511
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 if (signal_pending(current)) {
513 err = sock_intr_errno(timeo);
514 break;
515 }
Peter Hurley950e2d52011-07-24 00:10:41 -0400516
517 release_sock(sk);
Peter Hurleydfb2fae2015-01-23 12:16:53 -0500518
519 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
520
Gustavo Padovandc2a0e22012-11-20 23:25:54 -0200521 lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 }
Eric Dumazetaa395142010-04-20 13:03:51 +0000523 remove_wait_queue(sk_sleep(sk), &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700524
525 if (err)
526 goto done;
527
528 newsock->state = SS_CONNECTED;
529
530 BT_DBG("new socket %p", nsk);
531
532done:
533 release_sock(sk);
534 return err;
535}
536
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100537static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int peer)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538{
539 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
540 struct sock *sk = sock->sk;
541
542 BT_DBG("sock %p, sk %p", sock, sk);
543
Johan Hedberge8b1ab92014-03-26 15:49:18 +0200544 if (peer && sk->sk_state != BT_CONNECTED &&
545 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2)
Johan Hedberg35364c92014-01-28 15:16:50 -0800546 return -ENOTCONN;
547
Mathias Krause9344a972012-08-15 11:31:50 +0000548 memset(sa, 0, sizeof(*sa));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549 sa->rc_family = AF_BLUETOOTH;
550 sa->rc_channel = rfcomm_pi(sk)->channel;
551 if (peer)
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700552 bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 else
Marcel Holtmann94a86df2013-10-13 10:34:02 -0700554 bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555
Denys Vlasenko9b2c45d2018-02-12 20:00:20 +0100556 return sizeof(struct sockaddr_rc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557}
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,
Linus Torvaldsa11e1d42018-06-28 09:43:44 -07001052 .poll = bt_sock_poll,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 .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}