OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [net/] [bluetooth/] [rfcomm/] [sock.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
   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
14
   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
17
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
 
19
   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
20
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
21
   SOFTWARE IS DISCLAIMED.
22
*/
23
 
24
/*
25
 * RFCOMM sockets.
26
 *
27
 * $Id: sock.c,v 1.24 2002/10/03 01:00:34 maxk Exp $
28
 */
29
 
30
#include <linux/module.h>
31
 
32
#include <linux/types.h>
33
#include <linux/errno.h>
34
#include <linux/kernel.h>
35
#include <linux/sched.h>
36
#include <linux/slab.h>
37
#include <linux/poll.h>
38
#include <linux/fcntl.h>
39
#include <linux/init.h>
40
#include <linux/interrupt.h>
41
#include <linux/socket.h>
42
#include <linux/skbuff.h>
43
#include <linux/list.h>
44
#include <linux/device.h>
45
#include <net/sock.h>
46
 
47
#include <asm/system.h>
48
#include <asm/uaccess.h>
49
 
50
#include <net/bluetooth/bluetooth.h>
51
#include <net/bluetooth/hci_core.h>
52
#include <net/bluetooth/l2cap.h>
53
#include <net/bluetooth/rfcomm.h>
54
 
55
#ifndef CONFIG_BT_RFCOMM_DEBUG
56
#undef  BT_DBG
57
#define BT_DBG(D...)
58
#endif
59
 
60
static const struct proto_ops rfcomm_sock_ops;
61
 
62
static struct bt_sock_list rfcomm_sk_list = {
63
        .lock = RW_LOCK_UNLOCKED
64
};
65
 
66
static void rfcomm_sock_close(struct sock *sk);
67
static void rfcomm_sock_kill(struct sock *sk);
68
 
69
/* ---- DLC callbacks ----
70
 *
71
 * called under rfcomm_dlc_lock()
72
 */
73
static void rfcomm_sk_data_ready(struct rfcomm_dlc *d, struct sk_buff *skb)
74
{
75
        struct sock *sk = d->owner;
76
        if (!sk)
77
                return;
78
 
79
        atomic_add(skb->len, &sk->sk_rmem_alloc);
80
        skb_queue_tail(&sk->sk_receive_queue, skb);
81
        sk->sk_data_ready(sk, skb->len);
82
 
83
        if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf)
84
                rfcomm_dlc_throttle(d);
85
}
86
 
87
static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
88
{
89
        struct sock *sk = d->owner, *parent;
90
        if (!sk)
91
                return;
92
 
93
        BT_DBG("dlc %p state %ld err %d", d, d->state, err);
94
 
95
        bh_lock_sock(sk);
96
 
97
        if (err)
98
                sk->sk_err = err;
99
 
100
        sk->sk_state = d->state;
101
 
102
        parent = bt_sk(sk)->parent;
103
        if (parent) {
104
                if (d->state == BT_CLOSED) {
105
                        sock_set_flag(sk, SOCK_ZAPPED);
106
                        bt_accept_unlink(sk);
107
                }
108
                parent->sk_data_ready(parent, 0);
109
        } else {
110
                if (d->state == BT_CONNECTED)
111
                        rfcomm_session_getaddr(d->session, &bt_sk(sk)->src, NULL);
112
                sk->sk_state_change(sk);
113
        }
114
 
115
        bh_unlock_sock(sk);
116
 
117
        if (parent && sock_flag(sk, SOCK_ZAPPED)) {
118
                /* We have to drop DLC lock here, otherwise
119
                 * rfcomm_sock_destruct() will dead lock. */
120
                rfcomm_dlc_unlock(d);
121
                rfcomm_sock_kill(sk);
122
                rfcomm_dlc_lock(d);
123
        }
124
}
125
 
126
/* ---- Socket functions ---- */
127
static struct sock *__rfcomm_get_sock_by_addr(u8 channel, bdaddr_t *src)
128
{
129
        struct sock *sk = NULL;
130
        struct hlist_node *node;
131
 
132
        sk_for_each(sk, node, &rfcomm_sk_list.head) {
133
                if (rfcomm_pi(sk)->channel == channel &&
134
                                !bacmp(&bt_sk(sk)->src, src))
135
                        break;
136
        }
137
 
138
        return node ? sk : NULL;
139
}
140
 
141
/* Find socket with channel and source bdaddr.
142
 * Returns closest match.
143
 */
144
static struct sock *__rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src)
145
{
146
        struct sock *sk = NULL, *sk1 = NULL;
147
        struct hlist_node *node;
148
 
149
        sk_for_each(sk, node, &rfcomm_sk_list.head) {
150
                if (state && sk->sk_state != state)
151
                        continue;
152
 
153
                if (rfcomm_pi(sk)->channel == channel) {
154
                        /* Exact match. */
155
                        if (!bacmp(&bt_sk(sk)->src, src))
156
                                break;
157
 
158
                        /* Closest match */
159
                        if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
160
                                sk1 = sk;
161
                }
162
        }
163
        return node ? sk : sk1;
164
}
165
 
166
/* Find socket with given address (channel, src).
167
 * Returns locked socket */
168
static inline struct sock *rfcomm_get_sock_by_channel(int state, u8 channel, bdaddr_t *src)
169
{
170
        struct sock *s;
171
        read_lock(&rfcomm_sk_list.lock);
172
        s = __rfcomm_get_sock_by_channel(state, channel, src);
173
        if (s) bh_lock_sock(s);
174
        read_unlock(&rfcomm_sk_list.lock);
175
        return s;
176
}
177
 
178
static void rfcomm_sock_destruct(struct sock *sk)
179
{
180
        struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
181
 
182
        BT_DBG("sk %p dlc %p", sk, d);
183
 
184
        skb_queue_purge(&sk->sk_receive_queue);
185
        skb_queue_purge(&sk->sk_write_queue);
186
 
187
        rfcomm_dlc_lock(d);
188
        rfcomm_pi(sk)->dlc = NULL;
189
 
190
        /* Detach DLC if it's owned by this socket */
191
        if (d->owner == sk)
192
                d->owner = NULL;
193
        rfcomm_dlc_unlock(d);
194
 
195
        rfcomm_dlc_put(d);
196
}
197
 
198
static void rfcomm_sock_cleanup_listen(struct sock *parent)
199
{
200
        struct sock *sk;
201
 
202
        BT_DBG("parent %p", parent);
203
 
204
        /* Close not yet accepted dlcs */
205
        while ((sk = bt_accept_dequeue(parent, NULL))) {
206
                rfcomm_sock_close(sk);
207
                rfcomm_sock_kill(sk);
208
        }
209
 
210
        parent->sk_state  = BT_CLOSED;
211
        sock_set_flag(parent, SOCK_ZAPPED);
212
}
213
 
214
/* Kill socket (only if zapped and orphan)
215
 * Must be called on unlocked socket.
216
 */
217
static void rfcomm_sock_kill(struct sock *sk)
218
{
219
        if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
220
                return;
221
 
222
        BT_DBG("sk %p state %d refcnt %d", sk, sk->sk_state, atomic_read(&sk->sk_refcnt));
223
 
224
        /* Kill poor orphan */
225
        bt_sock_unlink(&rfcomm_sk_list, sk);
226
        sock_set_flag(sk, SOCK_DEAD);
227
        sock_put(sk);
228
}
229
 
230
static void __rfcomm_sock_close(struct sock *sk)
231
{
232
        struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
233
 
234
        BT_DBG("sk %p state %d socket %p", sk, sk->sk_state, sk->sk_socket);
235
 
236
        switch (sk->sk_state) {
237
        case BT_LISTEN:
238
                rfcomm_sock_cleanup_listen(sk);
239
                break;
240
 
241
        case BT_CONNECT:
242
        case BT_CONNECT2:
243
        case BT_CONFIG:
244
        case BT_CONNECTED:
245
                rfcomm_dlc_close(d, 0);
246
 
247
        default:
248
                sock_set_flag(sk, SOCK_ZAPPED);
249
                break;
250
        }
251
}
252
 
253
/* Close socket.
254
 * Must be called on unlocked socket.
255
 */
256
static void rfcomm_sock_close(struct sock *sk)
257
{
258
        lock_sock(sk);
259
        __rfcomm_sock_close(sk);
260
        release_sock(sk);
261
}
262
 
263
static void rfcomm_sock_init(struct sock *sk, struct sock *parent)
264
{
265
        struct rfcomm_pinfo *pi = rfcomm_pi(sk);
266
 
267
        BT_DBG("sk %p", sk);
268
 
269
        if (parent) {
270
                sk->sk_type = parent->sk_type;
271
                pi->link_mode = rfcomm_pi(parent)->link_mode;
272
        } else {
273
                pi->link_mode = 0;
274
        }
275
 
276
        pi->dlc->link_mode = pi->link_mode;
277
}
278
 
279
static struct proto rfcomm_proto = {
280
        .name           = "RFCOMM",
281
        .owner          = THIS_MODULE,
282
        .obj_size       = sizeof(struct rfcomm_pinfo)
283
};
284
 
285
static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
286
{
287
        struct rfcomm_dlc *d;
288
        struct sock *sk;
289
 
290
        sk = sk_alloc(net, PF_BLUETOOTH, prio, &rfcomm_proto);
291
        if (!sk)
292
                return NULL;
293
 
294
        sock_init_data(sock, sk);
295
        INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
296
 
297
        d = rfcomm_dlc_alloc(prio);
298
        if (!d) {
299
                sk_free(sk);
300
                return NULL;
301
        }
302
 
303
        d->data_ready   = rfcomm_sk_data_ready;
304
        d->state_change = rfcomm_sk_state_change;
305
 
306
        rfcomm_pi(sk)->dlc = d;
307
        d->owner = sk;
308
 
309
        sk->sk_destruct = rfcomm_sock_destruct;
310
        sk->sk_sndtimeo = RFCOMM_CONN_TIMEOUT;
311
 
312
        sk->sk_sndbuf   = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
313
        sk->sk_rcvbuf   = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
314
 
315
        sock_reset_flag(sk, SOCK_ZAPPED);
316
 
317
        sk->sk_protocol = proto;
318
        sk->sk_state    = BT_OPEN;
319
 
320
        bt_sock_link(&rfcomm_sk_list, sk);
321
 
322
        BT_DBG("sk %p", sk);
323
        return sk;
324
}
325
 
326
static int rfcomm_sock_create(struct net *net, struct socket *sock, int protocol)
327
{
328
        struct sock *sk;
329
 
330
        BT_DBG("sock %p", sock);
331
 
332
        sock->state = SS_UNCONNECTED;
333
 
334
        if (sock->type != SOCK_STREAM && sock->type != SOCK_RAW)
335
                return -ESOCKTNOSUPPORT;
336
 
337
        sock->ops = &rfcomm_sock_ops;
338
 
339
        sk = rfcomm_sock_alloc(net, sock, protocol, GFP_ATOMIC);
340
        if (!sk)
341
                return -ENOMEM;
342
 
343
        rfcomm_sock_init(sk, NULL);
344
        return 0;
345
}
346
 
347
static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
348
{
349
        struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
350
        struct sock *sk = sock->sk;
351
        int err = 0;
352
 
353
        BT_DBG("sk %p %s", sk, batostr(&sa->rc_bdaddr));
354
 
355
        if (!addr || addr->sa_family != AF_BLUETOOTH)
356
                return -EINVAL;
357
 
358
        lock_sock(sk);
359
 
360
        if (sk->sk_state != BT_OPEN) {
361
                err = -EBADFD;
362
                goto done;
363
        }
364
 
365
        if (sk->sk_type != SOCK_STREAM) {
366
                err = -EINVAL;
367
                goto done;
368
        }
369
 
370
        write_lock_bh(&rfcomm_sk_list.lock);
371
 
372
        if (sa->rc_channel && __rfcomm_get_sock_by_addr(sa->rc_channel, &sa->rc_bdaddr)) {
373
                err = -EADDRINUSE;
374
        } else {
375
                /* Save source address */
376
                bacpy(&bt_sk(sk)->src, &sa->rc_bdaddr);
377
                rfcomm_pi(sk)->channel = sa->rc_channel;
378
                sk->sk_state = BT_BOUND;
379
        }
380
 
381
        write_unlock_bh(&rfcomm_sk_list.lock);
382
 
383
done:
384
        release_sock(sk);
385
        return err;
386
}
387
 
388
static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
389
{
390
        struct sockaddr_rc *sa = (struct sockaddr_rc *) addr;
391
        struct sock *sk = sock->sk;
392
        struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
393
        int err = 0;
394
 
395
        BT_DBG("sk %p", sk);
396
 
397
        if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_rc))
398
                return -EINVAL;
399
 
400
        lock_sock(sk);
401
 
402
        if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) {
403
                err = -EBADFD;
404
                goto done;
405
        }
406
 
407
        if (sk->sk_type != SOCK_STREAM) {
408
                err = -EINVAL;
409
                goto done;
410
        }
411
 
412
        sk->sk_state = BT_CONNECT;
413
        bacpy(&bt_sk(sk)->dst, &sa->rc_bdaddr);
414
        rfcomm_pi(sk)->channel = sa->rc_channel;
415
 
416
        err = rfcomm_dlc_open(d, &bt_sk(sk)->src, &sa->rc_bdaddr, sa->rc_channel);
417
        if (!err)
418
                err = bt_sock_wait_state(sk, BT_CONNECTED,
419
                                sock_sndtimeo(sk, flags & O_NONBLOCK));
420
 
421
done:
422
        release_sock(sk);
423
        return err;
424
}
425
 
426
static 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
 
440
        if (sk->sk_type != SOCK_STREAM) {
441
                err = -EINVAL;
442
                goto done;
443
        }
444
 
445
        if (!rfcomm_pi(sk)->channel) {
446
                bdaddr_t *src = &bt_sk(sk)->src;
447
                u8 channel;
448
 
449
                err = -EINVAL;
450
 
451
                write_lock_bh(&rfcomm_sk_list.lock);
452
 
453
                for (channel = 1; channel < 31; channel++)
454
                        if (!__rfcomm_get_sock_by_addr(channel, src)) {
455
                                rfcomm_pi(sk)->channel = channel;
456
                                err = 0;
457
                                break;
458
                        }
459
 
460
                write_unlock_bh(&rfcomm_sk_list.lock);
461
 
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
 
470
done:
471
        release_sock(sk);
472
        return err;
473
}
474
 
475
static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int flags)
476
{
477
        DECLARE_WAITQUEUE(wait, current);
478
        struct sock *sk = sock->sk, *nsk;
479
        long timeo;
480
        int err = 0;
481
 
482
        lock_sock(sk);
483
 
484
        if (sk->sk_state != BT_LISTEN) {
485
                err = -EBADFD;
486
                goto done;
487
        }
488
 
489
        if (sk->sk_type != SOCK_STREAM) {
490
                err = -EINVAL;
491
                goto done;
492
        }
493
 
494
        timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
495
 
496
        BT_DBG("sk %p timeo %ld", sk, timeo);
497
 
498
        /* Wait for an incoming connection. (wake-one). */
499
        add_wait_queue_exclusive(sk->sk_sleep, &wait);
500
        while (!(nsk = bt_accept_dequeue(sk, newsock))) {
501
                set_current_state(TASK_INTERRUPTIBLE);
502
                if (!timeo) {
503
                        err = -EAGAIN;
504
                        break;
505
                }
506
 
507
                release_sock(sk);
508
                timeo = schedule_timeout(timeo);
509
                lock_sock(sk);
510
 
511
                if (sk->sk_state != BT_LISTEN) {
512
                        err = -EBADFD;
513
                        break;
514
                }
515
 
516
                if (signal_pending(current)) {
517
                        err = sock_intr_errno(timeo);
518
                        break;
519
                }
520
        }
521
        set_current_state(TASK_RUNNING);
522
        remove_wait_queue(sk->sk_sleep, &wait);
523
 
524
        if (err)
525
                goto done;
526
 
527
        newsock->state = SS_CONNECTED;
528
 
529
        BT_DBG("new socket %p", nsk);
530
 
531
done:
532
        release_sock(sk);
533
        return err;
534
}
535
 
536
static 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
 
543
        sa->rc_family  = AF_BLUETOOTH;
544
        sa->rc_channel = rfcomm_pi(sk)->channel;
545
        if (peer)
546
                bacpy(&sa->rc_bdaddr, &bt_sk(sk)->dst);
547
        else
548
                bacpy(&sa->rc_bdaddr, &bt_sk(sk)->src);
549
 
550
        *len = sizeof(struct sockaddr_rc);
551
        return 0;
552
}
553
 
554
static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
555
                               struct msghdr *msg, size_t len)
556
{
557
        struct sock *sk = sock->sk;
558
        struct rfcomm_dlc *d = rfcomm_pi(sk)->dlc;
559
        struct sk_buff *skb;
560
        int sent = 0;
561
 
562
        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);
574
                int err;
575
 
576
                skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
577
                                msg->msg_flags & MSG_DONTWAIT, &err);
578
                if (!skb)
579
                        break;
580
                skb_reserve(skb, RFCOMM_SKB_HEAD_RESERVE);
581
 
582
                err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
583
                if (err) {
584
                        kfree_skb(skb);
585
                        if (sent == 0)
586
                                sent = err;
587
                        break;
588
                }
589
 
590
                err = rfcomm_dlc_send(d, skb);
591
                if (err < 0) {
592
                        kfree_skb(skb);
593
                        if (sent == 0)
594
                                sent = err;
595
                        break;
596
                }
597
 
598
                sent += size;
599
                len  -= size;
600
        }
601
 
602
        release_sock(sk);
603
 
604
        return sent;
605
}
606
 
607
static long rfcomm_sock_data_wait(struct sock *sk, long timeo)
608
{
609
        DECLARE_WAITQUEUE(wait, current);
610
 
611
        add_wait_queue(sk->sk_sleep, &wait);
612
        for (;;) {
613
                set_current_state(TASK_INTERRUPTIBLE);
614
 
615
                if (!skb_queue_empty(&sk->sk_receive_queue) ||
616
                    sk->sk_err ||
617
                    (sk->sk_shutdown & RCV_SHUTDOWN) ||
618
                    signal_pending(current) ||
619
                    !timeo)
620
                        break;
621
 
622
                set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
623
                release_sock(sk);
624
                timeo = schedule_timeout(timeo);
625
                lock_sock(sk);
626
                clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
627
        }
628
 
629
        __set_current_state(TASK_RUNNING);
630
        remove_wait_queue(sk->sk_sleep, &wait);
631
        return timeo;
632
}
633
 
634
static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
635
                               struct msghdr *msg, size_t size, int flags)
636
{
637
        struct sock *sk = sock->sk;
638
        int err = 0;
639
        size_t target, copied = 0;
640
        long timeo;
641
 
642
        if (flags & MSG_OOB)
643
                return -EOPNOTSUPP;
644
 
645
        msg->msg_namelen = 0;
646
 
647
        BT_DBG("sk %p size %d", sk, size);
648
 
649
        lock_sock(sk);
650
 
651
        target = sock_rcvlowat(sk, flags & MSG_WAITALL, size);
652
        timeo  = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
653
 
654
        do {
655
                struct sk_buff *skb;
656
                int chunk;
657
 
658
                skb = skb_dequeue(&sk->sk_receive_queue);
659
                if (!skb) {
660
                        if (copied >= target)
661
                                break;
662
 
663
                        if ((err = sock_error(sk)) != 0)
664
                                break;
665
                        if (sk->sk_shutdown & RCV_SHUTDOWN)
666
                                break;
667
 
668
                        err = -EAGAIN;
669
                        if (!timeo)
670
                                break;
671
 
672
                        timeo = rfcomm_sock_data_wait(sk, timeo);
673
 
674
                        if (signal_pending(current)) {
675
                                err = sock_intr_errno(timeo);
676
                                goto out;
677
                        }
678
                        continue;
679
                }
680
 
681
                chunk = min_t(unsigned int, skb->len, size);
682
                if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) {
683
                        skb_queue_head(&sk->sk_receive_queue, skb);
684
                        if (!copied)
685
                                copied = -EFAULT;
686
                        break;
687
                }
688
                copied += chunk;
689
                size   -= chunk;
690
 
691
                if (!(flags & MSG_PEEK)) {
692
                        atomic_sub(chunk, &sk->sk_rmem_alloc);
693
 
694
                        skb_pull(skb, chunk);
695
                        if (skb->len) {
696
                                skb_queue_head(&sk->sk_receive_queue, skb);
697
                                break;
698
                        }
699
                        kfree_skb(skb);
700
 
701
                } else {
702
                        /* put message back and return */
703
                        skb_queue_head(&sk->sk_receive_queue, skb);
704
                        break;
705
                }
706
        } while (size);
707
 
708
out:
709
        if (atomic_read(&sk->sk_rmem_alloc) <= (sk->sk_rcvbuf >> 2))
710
                rfcomm_dlc_unthrottle(rfcomm_pi(sk)->dlc);
711
 
712
        release_sock(sk);
713
        return copied ? : err;
714
}
715
 
716
static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
717
{
718
        struct sock *sk = sock->sk;
719
        int err = 0;
720
        u32 opt;
721
 
722
        BT_DBG("sk %p", sk);
723
 
724
        lock_sock(sk);
725
 
726
        switch (optname) {
727
        case RFCOMM_LM:
728
                if (get_user(opt, (u32 __user *) optval)) {
729
                        err = -EFAULT;
730
                        break;
731
                }
732
 
733
                rfcomm_pi(sk)->link_mode = opt;
734
                break;
735
 
736
        default:
737
                err = -ENOPROTOOPT;
738
                break;
739
        }
740
 
741
        release_sock(sk);
742
        return err;
743
}
744
 
745
static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
746
{
747
        struct sock *sk = sock->sk;
748
        struct sock *l2cap_sk;
749
        struct rfcomm_conninfo cinfo;
750
        int len, err = 0;
751
 
752
        BT_DBG("sk %p", sk);
753
 
754
        if (get_user(len, optlen))
755
                return -EFAULT;
756
 
757
        lock_sock(sk);
758
 
759
        switch (optname) {
760
        case RFCOMM_LM:
761
                if (put_user(rfcomm_pi(sk)->link_mode, (u32 __user *) optval))
762
                        err = -EFAULT;
763
                break;
764
 
765
        case RFCOMM_CONNINFO:
766
                if (sk->sk_state != BT_CONNECTED) {
767
                        err = -ENOTCONN;
768
                        break;
769
                }
770
 
771
                l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk;
772
 
773
                cinfo.hci_handle = l2cap_pi(l2cap_sk)->conn->hcon->handle;
774
                memcpy(cinfo.dev_class, l2cap_pi(l2cap_sk)->conn->hcon->dev_class, 3);
775
 
776
                len = min_t(unsigned int, len, sizeof(cinfo));
777
                if (copy_to_user(optval, (char *) &cinfo, len))
778
                        err = -EFAULT;
779
 
780
                break;
781
 
782
        default:
783
                err = -ENOPROTOOPT;
784
                break;
785
        }
786
 
787
        release_sock(sk);
788
        return err;
789
}
790
 
791
static int rfcomm_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
792
{
793
        struct sock *sk = sock->sk;
794
        int err;
795
 
796
        lock_sock(sk);
797
 
798
#ifdef CONFIG_BT_RFCOMM_TTY
799
        err = rfcomm_dev_ioctl(sk, cmd, (void __user *)arg);
800
#else
801
        err = -EOPNOTSUPP;
802
#endif
803
 
804
        release_sock(sk);
805
        return err;
806
}
807
 
808
static int rfcomm_sock_shutdown(struct socket *sock, int how)
809
{
810
        struct sock *sk = sock->sk;
811
        int err = 0;
812
 
813
        BT_DBG("sock %p, sk %p", sock, sk);
814
 
815
        if (!sk) return 0;
816
 
817
        lock_sock(sk);
818
        if (!sk->sk_shutdown) {
819
                sk->sk_shutdown = SHUTDOWN_MASK;
820
                __rfcomm_sock_close(sk);
821
 
822
                if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
823
                        err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
824
        }
825
        release_sock(sk);
826
        return err;
827
}
828
 
829
static int rfcomm_sock_release(struct socket *sock)
830
{
831
        struct sock *sk = sock->sk;
832
        int err;
833
 
834
        BT_DBG("sock %p, sk %p", sock, sk);
835
 
836
        if (!sk)
837
                return 0;
838
 
839
        err = rfcomm_sock_shutdown(sock, 2);
840
 
841
        sock_orphan(sk);
842
        rfcomm_sock_kill(sk);
843
        return err;
844
}
845
 
846
/* ---- RFCOMM core layer callbacks ----
847
 *
848
 * called under rfcomm_lock()
849
 */
850
int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc **d)
851
{
852
        struct sock *sk, *parent;
853
        bdaddr_t src, dst;
854
        int result = 0;
855
 
856
        BT_DBG("session %p channel %d", s, channel);
857
 
858
        rfcomm_session_getaddr(s, &src, &dst);
859
 
860
        /* Check if we have socket listening on channel */
861
        parent = rfcomm_get_sock_by_channel(BT_LISTEN, channel, &src);
862
        if (!parent)
863
                return 0;
864
 
865
        /* Check for backlog size */
866
        if (sk_acceptq_is_full(parent)) {
867
                BT_DBG("backlog full %d", parent->sk_ack_backlog);
868
                goto done;
869
        }
870
 
871
        sk = rfcomm_sock_alloc(parent->sk_net, NULL, BTPROTO_RFCOMM, GFP_ATOMIC);
872
        if (!sk)
873
                goto done;
874
 
875
        rfcomm_sock_init(sk, parent);
876
        bacpy(&bt_sk(sk)->src, &src);
877
        bacpy(&bt_sk(sk)->dst, &dst);
878
        rfcomm_pi(sk)->channel = channel;
879
 
880
        sk->sk_state = BT_CONFIG;
881
        bt_accept_enqueue(parent, sk);
882
 
883
        /* Accept connection and return socket DLC */
884
        *d = rfcomm_pi(sk)->dlc;
885
        result = 1;
886
 
887
done:
888
        bh_unlock_sock(parent);
889
        return result;
890
}
891
 
892
static ssize_t rfcomm_sock_sysfs_show(struct class *dev, char *buf)
893
{
894
        struct sock *sk;
895
        struct hlist_node *node;
896
        char *str = buf;
897
 
898
        read_lock_bh(&rfcomm_sk_list.lock);
899
 
900
        sk_for_each(sk, node, &rfcomm_sk_list.head) {
901
                str += sprintf(str, "%s %s %d %d\n",
902
                                batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
903
                                sk->sk_state, rfcomm_pi(sk)->channel);
904
        }
905
 
906
        read_unlock_bh(&rfcomm_sk_list.lock);
907
 
908
        return (str - buf);
909
}
910
 
911
static CLASS_ATTR(rfcomm, S_IRUGO, rfcomm_sock_sysfs_show, NULL);
912
 
913
static const struct proto_ops rfcomm_sock_ops = {
914
        .family         = PF_BLUETOOTH,
915
        .owner          = THIS_MODULE,
916
        .release        = rfcomm_sock_release,
917
        .bind           = rfcomm_sock_bind,
918
        .connect        = rfcomm_sock_connect,
919
        .listen         = rfcomm_sock_listen,
920
        .accept         = rfcomm_sock_accept,
921
        .getname        = rfcomm_sock_getname,
922
        .sendmsg        = rfcomm_sock_sendmsg,
923
        .recvmsg        = rfcomm_sock_recvmsg,
924
        .shutdown       = rfcomm_sock_shutdown,
925
        .setsockopt     = rfcomm_sock_setsockopt,
926
        .getsockopt     = rfcomm_sock_getsockopt,
927
        .ioctl          = rfcomm_sock_ioctl,
928
        .poll           = bt_sock_poll,
929
        .socketpair     = sock_no_socketpair,
930
        .mmap           = sock_no_mmap
931
};
932
 
933
static struct net_proto_family rfcomm_sock_family_ops = {
934
        .family         = PF_BLUETOOTH,
935
        .owner          = THIS_MODULE,
936
        .create         = rfcomm_sock_create
937
};
938
 
939
int __init rfcomm_init_sockets(void)
940
{
941
        int err;
942
 
943
        err = proto_register(&rfcomm_proto, 0);
944
        if (err < 0)
945
                return err;
946
 
947
        err = bt_sock_register(BTPROTO_RFCOMM, &rfcomm_sock_family_ops);
948
        if (err < 0)
949
                goto error;
950
 
951
        if (class_create_file(bt_class, &class_attr_rfcomm) < 0)
952
                BT_ERR("Failed to create RFCOMM info file");
953
 
954
        BT_INFO("RFCOMM socket layer initialized");
955
 
956
        return 0;
957
 
958
error:
959
        BT_ERR("RFCOMM socket layer registration failed");
960
        proto_unregister(&rfcomm_proto);
961
        return err;
962
}
963
 
964
void __exit rfcomm_cleanup_sockets(void)
965
{
966
        class_remove_file(bt_class, &class_attr_rfcomm);
967
 
968
        if (bt_sock_unregister(BTPROTO_RFCOMM) < 0)
969
                BT_ERR("RFCOMM socket layer unregistration failed");
970
 
971
        proto_unregister(&rfcomm_proto);
972
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.