blob: d37a829a81e47d3dc3e41788d74955c9222fe72f [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
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <linux/module.h>
29
30#include <linux/types.h>
31#include <linux/errno.h>
32#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/sched.h>
34#include <linux/slab.h>
35#include <linux/poll.h>
36#include <linux/fcntl.h>
37#include <linux/init.h>
38#include <linux/interrupt.h>
39#include <linux/socket.h>
40#include <linux/skbuff.h>
41#include <linux/list.h>
Marcel Holtmannbe9d1222005-11-08 09:57:38 -080042#include <linux/device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#include <net/sock.h>
44
45#include <asm/system.h>
46#include <asm/uaccess.h>
47
48#include <net/bluetooth/bluetooth.h>
49#include <net/bluetooth/hci_core.h>
50#include <net/bluetooth/l2cap.h>
51#include <net/bluetooth/rfcomm.h>
52
Eric Dumazet90ddc4f2005-12-22 12:49:22 -080053static const struct proto_ops rfcomm_sock_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070054
55static struct bt_sock_list rfcomm_sk_list = {
Robert P. J. Dayd5fb2962008-03-28 16:17:38 -070056 .lock = __RW_LOCK_UNLOCKED(rfcomm_sk_list.lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -070057};
58
59static void rfcomm_sock_close(struct sock *sk);
60static void rfcomm_sock_kill(struct sock *sk);
61
62/* ---- DLC callbacks ----
63 *
64 * called under rfcomm_dlc_lock()
65 */
66static void rfcomm_sk_data_ready(struct rfcomm_dlc *d, struct sk_buff *skb)
67{
68 struct sock *sk = d->owner;
69 if (!sk)
70 return;
71
72 atomic_add(skb->len, &sk->sk_rmem_alloc);
73 skb_queue_tail(&sk->sk_receive_queue, skb);
74 sk->sk_data_ready(sk, skb->len);
75
76 if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
77 rfcomm_dlc_throttle(d);
78}
79
80static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
81{
82 struct sock *sk = d->owner, *parent;
83 if (!sk)
84 return;
85
86 BT_DBG("dlc %p state %ld err %d", d, d->state, err);
87
88 bh_lock_sock(sk);
89
90 if (err)
91 sk->sk_err = err;
92
93 sk->sk_state = d->state;
94
95 parent = bt_sk(sk)->parent;
96 if (parent) {
97 if (d->state == BT_CLOSED) {
98 sock_set_flag(sk, SOCK_ZAPPED);
99 bt_accept_unlink(sk);
100 }
101 parent->sk_data_ready(parent, 0);
102 } else {
103 if (d->state == BT_CONNECTED)
104 rfcomm_session_getaddr(d->session, &bt_sk(sk)->src, NULL);
105 sk->sk_state_change(sk);
106 }
107
108 bh_unlock_sock(sk);
109
110 if (parent && sock_flag(sk, SOCK_ZAPPED)) {
111 /* We have to drop DLC lock here, otherwise
112 * rfcomm_sock_destruct() will dead lock. */
113 rfcomm_dlc_unlock(d);
114 rfcomm_sock_kill(sk);
115 rfcomm_dlc_lock(d);
116 }
117}
118
119/* ---- Socket functions ---- */
120static struct sock *__rfcomm_get_sock_by_addr(u8 channel, bdaddr_t *src)
121{
122 struct sock *sk = NULL;
123 struct hlist_node *node;
124
125 sk_for_each(sk, node, &rfcomm_sk_list.head) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900126 if (rfcomm_pi(sk)->channel == channel &&
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127 !bacmp(&bt_sk(sk)->src, src))
128 break;
129 }
130
131 return node ? sk : NULL;
132}
133
134/* Find socket with channel and source bdaddr.
135 * Returns closest match.
136 */
137static struct sock *__rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src)
138{
139 struct sock *sk = NULL, *sk1 = NULL;
140 struct hlist_node *node;
141
142 sk_for_each(sk, node, &rfcomm_sk_list.head) {
143 if (state && sk->sk_state != state)
144 continue;
145
146 if (rfcomm_pi(sk)->channel == channel) {
147 /* Exact match. */
148 if (!bacmp(&bt_sk(sk)->src, src))
149 break;
150
151 /* Closest match */
152 if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
153 sk1 = sk;
154 }
155 }
156 return node ? sk : sk1;
157}
158
159/* Find socket with given address (channel, src).
160 * Returns locked socket */
161static inline struct sock *rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src)
162{
163 struct sock *s;
164 read_lock(&rfcomm_sk_list.lock);
165 s = __rfcomm_get_sock_by_channel(state, channel, src);
166 if (s) bh_lock_sock(s);
167 read_unlock(&rfcomm_sk_list.lock);
168 return s;
169}
170
171static void rfcomm_sock_destruct(struct sock *sk)
172{
173 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
174
175 BT_DBG("sk %p dlc %p", sk, d);
176
177 skb_queue_purge(&sk->sk_receive_queue);
178 skb_queue_purge(&sk->sk_write_queue);
179
180 rfcomm_dlc_lock(d);
181 rfcomm_pi(sk)->dlc = NULL;
182
183 /* Detach DLC if it's owned by this socket */
184 if (d->owner == sk)
185 d->owner = NULL;
186 rfcomm_dlc_unlock(d);
187
188 rfcomm_dlc_put(d);
189}
190
191static void rfcomm_sock_cleanup_listen(struct sock *parent)
192{
193 struct sock *sk;
194
195 BT_DBG("parent %p", parent);
196
197 /* Close not yet accepted dlcs */
198 while ((sk = bt_accept_dequeue(parent, NULL))) {
199 rfcomm_sock_close(sk);
200 rfcomm_sock_kill(sk);
201 }
202
203 parent->sk_state = BT_CLOSED;
204 sock_set_flag(parent, SOCK_ZAPPED);
205}
206
207/* Kill socket (only if zapped and orphan)
208 * Must be called on unlocked socket.
209 */
210static void rfcomm_sock_kill(struct sock *sk)
211{
212 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
213 return;
214
215 BT_DBG("sk %p state %d refcnt %d", sk, sk->sk_state, atomic_read(&sk->sk_refcnt));
216
217 /* Kill poor orphan */
218 bt_sock_unlink(&rfcomm_sk_list, sk);
219 sock_set_flag(sk, SOCK_DEAD);
220 sock_put(sk);
221}
222
223static void __rfcomm_sock_close(struct sock *sk)
224{
225 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
226
227 BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
228
229 switch (sk->sk_state) {
230 case BT_LISTEN:
231 rfcomm_sock_cleanup_listen(sk);
232 break;
233
234 case BT_CONNECT:
235 case BT_CONNECT2:
236 case BT_CONFIG:
237 case BT_CONNECTED:
238 rfcomm_dlc_close(d, 0);
239
240 default:
241 sock_set_flag(sk, SOCK_ZAPPED);
242 break;
243 }
244}
245
246/* Close socket.
247 * Must be called on unlocked socket.
248 */
249static void rfcomm_sock_close(struct sock *sk)
250{
251 lock_sock(sk);
252 __rfcomm_sock_close(sk);
253 release_sock(sk);
254}
255
256static void rfcomm_sock_init(struct sock *sk, struct sock *parent)
257{
258 struct rfcomm_pinfo *pi = rfcomm_pi(sk);
259
260 BT_DBG("sk %p", sk);
261
262 if (parent) {
263 sk->sk_type = parent->sk_type;
264 pi->link_mode = rfcomm_pi(parent)->link_mode;
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100265 pi->dlc->defer_setup = bt_sk(parent)->defer_setup;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700266 } else {
267 pi->link_mode = 0;
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100268 pi->dlc->defer_setup = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 }
270
271 pi->dlc->link_mode = pi->link_mode;
272}
273
274static struct proto rfcomm_proto = {
275 .name = "RFCOMM",
276 .owner = THIS_MODULE,
277 .obj_size = sizeof(struct rfcomm_pinfo)
278};
279
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700280static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281{
282 struct rfcomm_dlc *d;
283 struct sock *sk;
284
Pavel Emelyanov6257ff22007-11-01 00:39:31 -0700285 sk = sk_alloc(net, PF_BLUETOOTH, prio, &rfcomm_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286 if (!sk)
287 return NULL;
288
289 sock_init_data(sock, sk);
290 INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
291
292 d = rfcomm_dlc_alloc(prio);
293 if (!d) {
294 sk_free(sk);
295 return NULL;
296 }
297
298 d->data_ready = rfcomm_sk_data_ready;
299 d->state_change = rfcomm_sk_state_change;
300
301 rfcomm_pi(sk)->dlc = d;
302 d->owner = sk;
303
304 sk->sk_destruct = rfcomm_sock_destruct;
305 sk->sk_sndtimeo = RFCOMM_CONN_TIMEOUT;
306
Marcel Holtmann77db1982008-07-14 20:13:45 +0200307 sk->sk_sndbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
308 sk->sk_rcvbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309
310 sock_reset_flag(sk, SOCK_ZAPPED);
311
312 sk->sk_protocol = proto;
Marcel Holtmann77db1982008-07-14 20:13:45 +0200313 sk->sk_state = BT_OPEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314
315 bt_sock_link(&rfcomm_sk_list, sk);
316
317 BT_DBG("sk %p", sk);
318 return sk;
319}
320
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700321static int rfcomm_sock_create(struct net *net, struct socket *sock, int protocol)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322{
323 struct sock *sk;
324
325 BT_DBG("sock %p", sock);
326
327 sock->state = SS_UNCONNECTED;
328
329 if (sock->type != SOCK_STREAM && sock->type != SOCK_RAW)
330 return -ESOCKTNOSUPPORT;
331
332 sock->ops = &rfcomm_sock_ops;
333
Eric W. Biederman1b8d7ae2007-10-08 23:24:22 -0700334 sk = rfcomm_sock_alloc(net, sock, protocol, GFP_ATOMIC);
Marcel Holtmann74da6262006-10-15 17:31:14 +0200335 if (!sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336 return -ENOMEM;
337
338 rfcomm_sock_init(sk, NULL);
339 return 0;
340}
341
342static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
343{
344 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
345 struct sock *sk = sock->sk;
346 int err = 0;
347
348 BT_DBG("sk %p %s", sk, batostr(&sa->rc_bdaddr));
349
350 if (!addr || addr->sa_family != AF_BLUETOOTH)
351 return -EINVAL;
352
353 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
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 write_lock_bh(&rfcomm_sk_list.lock);
366
367 if (sa->rc_channel && __rfcomm_get_sock_by_addr(sa->rc_channel, &sa->rc_bdaddr)) {
368 err = -EADDRINUSE;
369 } else {
370 /* Save source address */
371 bacpy(&bt_sk(sk)->src, &sa->rc_bdaddr);
372 rfcomm_pi(sk)->channel = sa->rc_channel;
373 sk->sk_state = BT_BOUND;
374 }
375
376 write_unlock_bh(&rfcomm_sk_list.lock);
377
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
392 if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_rc))
393 return -EINVAL;
394
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 lock_sock(sk);
396
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200397 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
398 err = -EBADFD;
399 goto done;
400 }
401
402 if (sk->sk_type != SOCK_STREAM) {
403 err = -EINVAL;
404 goto done;
405 }
406
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407 sk->sk_state = BT_CONNECT;
408 bacpy(&bt_sk(sk)->dst, &sa->rc_bdaddr);
409 rfcomm_pi(sk)->channel = sa->rc_channel;
410
Marcel Holtmann77db1982008-07-14 20:13:45 +0200411 d->link_mode = rfcomm_pi(sk)->link_mode;
412
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 err = rfcomm_dlc_open(d, &bt_sk(sk)->src, &sa->rc_bdaddr, sa->rc_channel);
414 if (!err)
415 err = bt_sock_wait_state(sk, BT_CONNECTED,
416 sock_sndtimeo(sk, flags & O_NONBLOCK));
417
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200418done:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 release_sock(sk);
420 return err;
421}
422
423static int rfcomm_sock_listen(struct socket *sock, int backlog)
424{
425 struct sock *sk = sock->sk;
426 int err = 0;
427
428 BT_DBG("sk %p backlog %d", sk, backlog);
429
430 lock_sock(sk);
431
432 if (sk->sk_state != BT_BOUND) {
433 err = -EBADFD;
434 goto done;
435 }
436
Marcel Holtmann354d28d2005-09-13 01:32:31 +0200437 if (sk->sk_type != SOCK_STREAM) {
438 err = -EINVAL;
439 goto done;
440 }
441
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 if (!rfcomm_pi(sk)->channel) {
443 bdaddr_t *src = &bt_sk(sk)->src;
444 u8 channel;
445
446 err = -EINVAL;
447
448 write_lock_bh(&rfcomm_sk_list.lock);
449
450 for (channel = 1; channel < 31; channel++)
451 if (!__rfcomm_get_sock_by_addr(channel, src)) {
452 rfcomm_pi(sk)->channel = channel;
453 err = 0;
454 break;
455 }
456
457 write_unlock_bh(&rfcomm_sk_list.lock);
458
459 if (err < 0)
460 goto done;
461 }
462
463 sk->sk_max_ack_backlog = backlog;
464 sk->sk_ack_backlog = 0;
465 sk->sk_state = BT_LISTEN;
466
467done:
468 release_sock(sk);
469 return err;
470}
471
472static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int flags)
473{
474 DECLARE_WAITQUEUE(wait, current);
475 struct sock *sk = sock->sk, *nsk;
476 long timeo;
477 int err = 0;
478
479 lock_sock(sk);
480
481 if (sk->sk_state != BT_LISTEN) {
482 err = -EBADFD;
483 goto done;
484 }
485
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). */
496 add_wait_queue_exclusive(sk->sk_sleep, &wait);
497 while (!(nsk = bt_accept_dequeue(sk, newsock))) {
498 set_current_state(TASK_INTERRUPTIBLE);
499 if (!timeo) {
500 err = -EAGAIN;
501 break;
502 }
503
504 release_sock(sk);
505 timeo = schedule_timeout(timeo);
506 lock_sock(sk);
507
508 if (sk->sk_state != BT_LISTEN) {
509 err = -EBADFD;
510 break;
511 }
512
513 if (signal_pending(current)) {
514 err = sock_intr_errno(timeo);
515 break;
516 }
517 }
518 set_current_state(TASK_RUNNING);
519 remove_wait_queue(sk->sk_sleep, &wait);
520
521 if (err)
522 goto done;
523
524 newsock->state = SS_CONNECTED;
525
526 BT_DBG("new socket %p", nsk);
527
528done:
529 release_sock(sk);
530 return err;
531}
532
533static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
534{
535 struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
536 struct sock *sk = sock->sk;
537
538 BT_DBG("sock %p, sk %p", sock, sk);
539
540 sa->rc_family = AF_BLUETOOTH;
541 sa->rc_channel = rfcomm_pi(sk)->channel;
542 if (peer)
543 bacpy(&sa->rc_bdaddr, &bt_sk(sk)->dst);
544 else
545 bacpy(&sa->rc_bdaddr, &bt_sk(sk)->src);
546
547 *len = sizeof(struct sockaddr_rc);
548 return 0;
549}
550
551static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
552 struct msghdr *msg, size_t len)
553{
554 struct sock *sk = sock->sk;
555 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
556 struct sk_buff *skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557 int sent = 0;
558
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100559 if (test_bit(RFCOMM_DEFER_SETUP, &d->flags))
560 return -ENOTCONN;
561
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 if (msg->msg_flags & MSG_OOB)
563 return -EOPNOTSUPP;
564
565 if (sk->sk_shutdown & SEND_SHUTDOWN)
566 return -EPIPE;
567
568 BT_DBG("sock %p, sk %p", sock, sk);
569
570 lock_sock(sk);
571
572 while (len) {
573 size_t size = min_t(size_t, len, d->mtu);
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100574 int err;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900575
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576 skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
577 msg->msg_flags & MSG_DONTWAIT, &err);
Victor Shcherbatyuk91aa35a2009-01-15 21:52:12 +0100578 if (!skb) {
579 if (sent == 0)
580 sent = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581 break;
Victor Shcherbatyuk91aa35a2009-01-15 21:52:12 +0100582 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583 skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
584
585 err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
586 if (err) {
587 kfree_skb(skb);
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100588 if (sent == 0)
589 sent = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590 break;
591 }
592
593 err = rfcomm_dlc_send(d, skb);
594 if (err < 0) {
595 kfree_skb(skb);
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100596 if (sent == 0)
597 sent = err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 break;
599 }
600
601 sent += size;
602 len -= size;
603 }
604
605 release_sock(sk);
606
Marcel Holtmann4d6a2182007-01-08 02:16:31 +0100607 return sent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608}
609
610static long rfcomm_sock_data_wait(struct sock *sk, long timeo)
611{
612 DECLARE_WAITQUEUE(wait, current);
613
614 add_wait_queue(sk->sk_sleep, &wait);
615 for (;;) {
616 set_current_state(TASK_INTERRUPTIBLE);
617
David S. Millerb03efcf2005-07-08 14:57:23 -0700618 if (!skb_queue_empty(&sk->sk_receive_queue) ||
619 sk->sk_err ||
620 (sk->sk_shutdown & RCV_SHUTDOWN) ||
621 signal_pending(current) ||
622 !timeo)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 break;
624
625 set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
626 release_sock(sk);
627 timeo = schedule_timeout(timeo);
628 lock_sock(sk);
629 clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
630 }
631
632 __set_current_state(TASK_RUNNING);
633 remove_wait_queue(sk->sk_sleep, &wait);
634 return timeo;
635}
636
637static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
638 struct msghdr *msg, size_t size, int flags)
639{
640 struct sock *sk = sock->sk;
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100641 struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700642 int err = 0;
643 size_t target, copied = 0;
644 long timeo;
645
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100646 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
647 rfcomm_dlc_accept(d);
648 return 0;
649 }
650
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 if (flags & MSG_OOB)
652 return -EOPNOTSUPP;
653
654 msg->msg_namelen = 0;
655
Marcel Holtmanna418b892008-11-30 12:17:28 +0100656 BT_DBG("sk %p size %zu", sk, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700657
658 lock_sock(sk);
659
660 target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
661 timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
662
663 do {
664 struct sk_buff *skb;
665 int chunk;
666
667 skb = skb_dequeue(&sk->sk_receive_queue);
668 if (!skb) {
669 if (copied >= target)
670 break;
671
672 if ((err = sock_error(sk)) != 0)
673 break;
674 if (sk->sk_shutdown & RCV_SHUTDOWN)
675 break;
676
677 err = -EAGAIN;
678 if (!timeo)
679 break;
680
681 timeo = rfcomm_sock_data_wait(sk, timeo);
682
683 if (signal_pending(current)) {
684 err = sock_intr_errno(timeo);
685 goto out;
686 }
687 continue;
688 }
689
690 chunk = min_t(unsigned int, skb->len, size);
691 if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) {
692 skb_queue_head(&sk->sk_receive_queue, skb);
693 if (!copied)
694 copied = -EFAULT;
695 break;
696 }
697 copied += chunk;
698 size -= chunk;
699
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200700 sock_recv_timestamp(msg, sk, skb);
701
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 if (!(flags & MSG_PEEK)) {
703 atomic_sub(chunk, &sk->sk_rmem_alloc);
704
705 skb_pull(skb, chunk);
706 if (skb->len) {
707 skb_queue_head(&sk->sk_receive_queue, skb);
708 break;
709 }
710 kfree_skb(skb);
711
712 } else {
713 /* put message back and return */
714 skb_queue_head(&sk->sk_receive_queue, skb);
715 break;
716 }
717 } while (size);
718
719out:
720 if (atomic_read(&sk->sk_rmem_alloc) <= (sk->sk_rcvbuf >> 2))
721 rfcomm_dlc_unthrottle(rfcomm_pi(sk)->dlc);
722
723 release_sock(sk);
724 return copied ? : err;
725}
726
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100727static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, int optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728{
729 struct sock *sk = sock->sk;
730 int err = 0;
731 u32 opt;
732
733 BT_DBG("sk %p", sk);
734
735 lock_sock(sk);
736
737 switch (optname) {
738 case RFCOMM_LM:
739 if (get_user(opt, (u32 __user *) optval)) {
740 err = -EFAULT;
741 break;
742 }
743
744 rfcomm_pi(sk)->link_mode = opt;
745 break;
746
747 default:
748 err = -ENOPROTOOPT;
749 break;
750 }
751
752 release_sock(sk);
753 return err;
754}
755
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100756static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
757{
758 struct sock *sk = sock->sk;
759 int err = 0;
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100760 u32 opt;
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100761
762 BT_DBG("sk %p", sk);
763
764 if (level == SOL_RFCOMM)
765 return rfcomm_sock_setsockopt_old(sock, optname, optval, optlen);
766
767 lock_sock(sk);
768
769 switch (optname) {
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100770 case BT_DEFER_SETUP:
771 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
772 err = -EINVAL;
773 break;
774 }
775
776 if (get_user(opt, (u32 __user *) optval)) {
777 err = -EFAULT;
778 break;
779 }
780
781 bt_sk(sk)->defer_setup = opt;
782 break;
783
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100784 default:
785 err = -ENOPROTOOPT;
786 break;
787 }
788
789 release_sock(sk);
790 return err;
791}
792
793static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794{
795 struct sock *sk = sock->sk;
796 struct sock *l2cap_sk;
797 struct rfcomm_conninfo cinfo;
798 int len, err = 0;
799
800 BT_DBG("sk %p", sk);
801
802 if (get_user(len, optlen))
803 return -EFAULT;
804
805 lock_sock(sk);
806
807 switch (optname) {
808 case RFCOMM_LM:
809 if (put_user(rfcomm_pi(sk)->link_mode, (u32 __user *) optval))
810 err = -EFAULT;
811 break;
812
813 case RFCOMM_CONNINFO:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100814 if (sk->sk_state != BT_CONNECTED &&
815 !rfcomm_pi(sk)->dlc->defer_setup) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816 err = -ENOTCONN;
817 break;
818 }
819
820 l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk;
821
822 cinfo.hci_handle = l2cap_pi(l2cap_sk)->conn->hcon->handle;
823 memcpy(cinfo.dev_class, l2cap_pi(l2cap_sk)->conn->hcon->dev_class, 3);
824
825 len = min_t(unsigned int, len, sizeof(cinfo));
826 if (copy_to_user(optval, (char *) &cinfo, len))
827 err = -EFAULT;
828
829 break;
830
831 default:
832 err = -ENOPROTOOPT;
833 break;
834 }
835
836 release_sock(sk);
837 return err;
838}
839
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100840static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
841{
842 struct sock *sk = sock->sk;
843 int len, err = 0;
844
845 BT_DBG("sk %p", sk);
846
847 if (level == SOL_RFCOMM)
848 return rfcomm_sock_getsockopt_old(sock, optname, optval, optlen);
849
850 if (get_user(len, optlen))
851 return -EFAULT;
852
853 lock_sock(sk);
854
855 switch (optname) {
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100856 case BT_DEFER_SETUP:
857 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
858 err = -EINVAL;
859 break;
860 }
861
862 if (put_user(bt_sk(sk)->defer_setup, (u32 __user *) optval))
863 err = -EFAULT;
864
865 break;
866
Marcel Holtmannd58daf42009-01-15 21:52:14 +0100867 default:
868 err = -ENOPROTOOPT;
869 break;
870 }
871
872 release_sock(sk);
873 return err;
874}
875
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876static int rfcomm_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
877{
David S. Millere19caae2008-12-09 01:04:27 -0800878 struct sock *sk __maybe_unused = sock->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879 int err;
880
David S. Millere19caae2008-12-09 01:04:27 -0800881 BT_DBG("sk %p cmd %x arg %lx", sk, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200883 err = bt_sock_ioctl(sock, cmd, arg);
884
885 if (err == -ENOIOCTLCMD) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886#ifdef CONFIG_BT_RFCOMM_TTY
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200887 lock_sock(sk);
888 err = rfcomm_dev_ioctl(sk, cmd, (void __user *) arg);
889 release_sock(sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890#else
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200891 err = -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892#endif
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200893 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 return err;
896}
897
898static int rfcomm_sock_shutdown(struct socket *sock, int how)
899{
900 struct sock *sk = sock->sk;
901 int err = 0;
902
903 BT_DBG("sock %p, sk %p", sock, sk);
904
905 if (!sk) return 0;
906
907 lock_sock(sk);
908 if (!sk->sk_shutdown) {
909 sk->sk_shutdown = SHUTDOWN_MASK;
910 __rfcomm_sock_close(sk);
911
912 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
913 err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
914 }
915 release_sock(sk);
916 return err;
917}
918
919static int rfcomm_sock_release(struct socket *sock)
920{
921 struct sock *sk = sock->sk;
922 int err;
923
924 BT_DBG("sock %p, sk %p", sock, sk);
925
926 if (!sk)
927 return 0;
928
929 err = rfcomm_sock_shutdown(sock, 2);
930
931 sock_orphan(sk);
932 rfcomm_sock_kill(sk);
933 return err;
934}
935
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900936/* ---- RFCOMM core layer callbacks ----
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937 *
938 * called under rfcomm_lock()
939 */
940int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc **d)
941{
942 struct sock *sk, *parent;
943 bdaddr_t src, dst;
944 int result = 0;
945
946 BT_DBG("session %p channel %d", s, channel);
947
948 rfcomm_session_getaddr(s, &src, &dst);
949
950 /* Check if we have socket listening on channel */
951 parent = rfcomm_get_sock_by_channel(BT_LISTEN, channel, &src);
952 if (!parent)
953 return 0;
954
955 /* Check for backlog size */
956 if (sk_acceptq_is_full(parent)) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900957 BT_DBG("backlog full %d", parent->sk_ack_backlog);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700958 goto done;
959 }
960
YOSHIFUJI Hideaki3b1e0a62008-03-26 02:26:21 +0900961 sk = rfcomm_sock_alloc(sock_net(parent), NULL, BTPROTO_RFCOMM, GFP_ATOMIC);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700962 if (!sk)
963 goto done;
964
965 rfcomm_sock_init(sk, parent);
966 bacpy(&bt_sk(sk)->src, &src);
967 bacpy(&bt_sk(sk)->dst, &dst);
968 rfcomm_pi(sk)->channel = channel;
969
970 sk->sk_state = BT_CONFIG;
971 bt_accept_enqueue(parent, sk);
972
973 /* Accept connection and return socket DLC */
974 *d = rfcomm_pi(sk)->dlc;
975 result = 1;
976
977done:
978 bh_unlock_sock(parent);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100979
980 if (bt_sk(parent)->defer_setup)
981 parent->sk_state_change(parent);
982
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983 return result;
984}
985
Marcel Holtmannbe9d1222005-11-08 09:57:38 -0800986static ssize_t rfcomm_sock_sysfs_show(struct class *dev, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700987{
988 struct sock *sk;
989 struct hlist_node *node;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -0800990 char *str = buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991
992 read_lock_bh(&rfcomm_sk_list.lock);
993
Marcel Holtmannbe9d1222005-11-08 09:57:38 -0800994 sk_for_each(sk, node, &rfcomm_sk_list.head) {
995 str += sprintf(str, "%s %s %d %d\n",
996 batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
997 sk->sk_state, rfcomm_pi(sk)->channel);
998 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000 read_unlock_bh(&rfcomm_sk_list.lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001001
1002 return (str - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003}
1004
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001005static CLASS_ATTR(rfcomm, S_IRUGO, rfcomm_sock_sysfs_show, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001007static const struct proto_ops rfcomm_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 .family = PF_BLUETOOTH,
1009 .owner = THIS_MODULE,
1010 .release = rfcomm_sock_release,
1011 .bind = rfcomm_sock_bind,
1012 .connect = rfcomm_sock_connect,
1013 .listen = rfcomm_sock_listen,
1014 .accept = rfcomm_sock_accept,
1015 .getname = rfcomm_sock_getname,
1016 .sendmsg = rfcomm_sock_sendmsg,
1017 .recvmsg = rfcomm_sock_recvmsg,
1018 .shutdown = rfcomm_sock_shutdown,
1019 .setsockopt = rfcomm_sock_setsockopt,
1020 .getsockopt = rfcomm_sock_getsockopt,
1021 .ioctl = rfcomm_sock_ioctl,
1022 .poll = bt_sock_poll,
1023 .socketpair = sock_no_socketpair,
1024 .mmap = sock_no_mmap
1025};
1026
1027static struct net_proto_family rfcomm_sock_family_ops = {
1028 .family = PF_BLUETOOTH,
1029 .owner = THIS_MODULE,
1030 .create = rfcomm_sock_create
1031};
1032
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08001033int __init rfcomm_init_sockets(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034{
1035 int err;
1036
1037 err = proto_register(&rfcomm_proto, 0);
1038 if (err < 0)
1039 return err;
1040
1041 err = bt_sock_register(BTPROTO_RFCOMM, &rfcomm_sock_family_ops);
1042 if (err < 0)
1043 goto error;
1044
Marcel Holtmanndf5c37e2006-10-15 17:30:45 +02001045 if (class_create_file(bt_class, &class_attr_rfcomm) < 0)
1046 BT_ERR("Failed to create RFCOMM info file");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047
1048 BT_INFO("RFCOMM socket layer initialized");
1049
1050 return 0;
1051
1052error:
1053 BT_ERR("RFCOMM socket layer registration failed");
1054 proto_unregister(&rfcomm_proto);
1055 return err;
1056}
1057
1058void __exit rfcomm_cleanup_sockets(void)
1059{
Marcel Holtmanna91f2e32006-07-03 10:02:41 +02001060 class_remove_file(bt_class, &class_attr_rfcomm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061
1062 if (bt_sock_unregister(BTPROTO_RFCOMM) < 0)
1063 BT_ERR("RFCOMM socket layer unregistration failed");
1064
1065 proto_unregister(&rfcomm_proto);
1066}