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/] [sco.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
   BlueZ - Bluetooth protocol stack for Linux
3
   Copyright (C) 2000-2001 Qualcomm Incorporated
4
 
5
   Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License version 2 as
9
   published by the Free Software Foundation;
10
 
11
   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14
   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15
   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
 
20
   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22
   SOFTWARE IS DISCLAIMED.
23
*/
24
 
25
/* Bluetooth SCO sockets. */
26
 
27
#include <linux/module.h>
28
 
29
#include <linux/types.h>
30
#include <linux/errno.h>
31
#include <linux/kernel.h>
32
#include <linux/sched.h>
33
#include <linux/slab.h>
34
#include <linux/poll.h>
35
#include <linux/fcntl.h>
36
#include <linux/init.h>
37
#include <linux/interrupt.h>
38
#include <linux/socket.h>
39
#include <linux/skbuff.h>
40
#include <linux/device.h>
41
#include <linux/list.h>
42
#include <net/sock.h>
43
 
44
#include <asm/system.h>
45
#include <asm/uaccess.h>
46
 
47
#include <net/bluetooth/bluetooth.h>
48
#include <net/bluetooth/hci_core.h>
49
#include <net/bluetooth/sco.h>
50
 
51
#ifndef CONFIG_BT_SCO_DEBUG
52
#undef  BT_DBG
53
#define BT_DBG(D...)
54
#endif
55
 
56
#define VERSION "0.5"
57
 
58
static const struct proto_ops sco_sock_ops;
59
 
60
static struct bt_sock_list sco_sk_list = {
61
        .lock = RW_LOCK_UNLOCKED
62
};
63
 
64
static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent);
65
static void sco_chan_del(struct sock *sk, int err);
66
 
67
static int  sco_conn_del(struct hci_conn *conn, int err);
68
 
69
static void sco_sock_close(struct sock *sk);
70
static void sco_sock_kill(struct sock *sk);
71
 
72
/* ---- SCO timers ---- */
73
static void sco_sock_timeout(unsigned long arg)
74
{
75
        struct sock *sk = (struct sock *) arg;
76
 
77
        BT_DBG("sock %p state %d", sk, sk->sk_state);
78
 
79
        bh_lock_sock(sk);
80
        sk->sk_err = ETIMEDOUT;
81
        sk->sk_state_change(sk);
82
        bh_unlock_sock(sk);
83
 
84
        sco_sock_kill(sk);
85
        sock_put(sk);
86
}
87
 
88
static void sco_sock_set_timer(struct sock *sk, long timeout)
89
{
90
        BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
91
        sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
92
}
93
 
94
static void sco_sock_clear_timer(struct sock *sk)
95
{
96
        BT_DBG("sock %p state %d", sk, sk->sk_state);
97
        sk_stop_timer(sk, &sk->sk_timer);
98
}
99
 
100
static void sco_sock_init_timer(struct sock *sk)
101
{
102
        init_timer(&sk->sk_timer);
103
        sk->sk_timer.function = sco_sock_timeout;
104
        sk->sk_timer.data = (unsigned long)sk;
105
}
106
 
107
/* ---- SCO connections ---- */
108
static struct sco_conn *sco_conn_add(struct hci_conn *hcon, __u8 status)
109
{
110
        struct hci_dev *hdev = hcon->hdev;
111
        struct sco_conn *conn = hcon->sco_data;
112
 
113
        if (conn || status)
114
                return conn;
115
 
116
        conn = kzalloc(sizeof(struct sco_conn), GFP_ATOMIC);
117
        if (!conn)
118
                return NULL;
119
 
120
        spin_lock_init(&conn->lock);
121
 
122
        hcon->sco_data = conn;
123
        conn->hcon = hcon;
124
 
125
        conn->src = &hdev->bdaddr;
126
        conn->dst = &hcon->dst;
127
 
128
        if (hdev->sco_mtu > 0)
129
                conn->mtu = hdev->sco_mtu;
130
        else
131
                conn->mtu = 60;
132
 
133
        BT_DBG("hcon %p conn %p", hcon, conn);
134
 
135
        return conn;
136
}
137
 
138
static inline struct sock *sco_chan_get(struct sco_conn *conn)
139
{
140
        struct sock *sk = NULL;
141
        sco_conn_lock(conn);
142
        sk = conn->sk;
143
        sco_conn_unlock(conn);
144
        return sk;
145
}
146
 
147
static int sco_conn_del(struct hci_conn *hcon, int err)
148
{
149
        struct sco_conn *conn;
150
        struct sock *sk;
151
 
152
        if (!(conn = hcon->sco_data))
153
                return 0;
154
 
155
        BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
156
 
157
        /* Kill socket */
158
        if ((sk = sco_chan_get(conn))) {
159
                bh_lock_sock(sk);
160
                sco_sock_clear_timer(sk);
161
                sco_chan_del(sk, err);
162
                bh_unlock_sock(sk);
163
                sco_sock_kill(sk);
164
        }
165
 
166
        hcon->sco_data = NULL;
167
        kfree(conn);
168
        return 0;
169
}
170
 
171
static inline int sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
172
{
173
        int err = 0;
174
 
175
        sco_conn_lock(conn);
176
        if (conn->sk) {
177
                err = -EBUSY;
178
        } else {
179
                __sco_chan_add(conn, sk, parent);
180
        }
181
        sco_conn_unlock(conn);
182
        return err;
183
}
184
 
185
static int sco_connect(struct sock *sk)
186
{
187
        bdaddr_t *src = &bt_sk(sk)->src;
188
        bdaddr_t *dst = &bt_sk(sk)->dst;
189
        struct sco_conn *conn;
190
        struct hci_conn *hcon;
191
        struct hci_dev  *hdev;
192
        int err, type;
193
 
194
        BT_DBG("%s -> %s", batostr(src), batostr(dst));
195
 
196
        if (!(hdev = hci_get_route(dst, src)))
197
                return -EHOSTUNREACH;
198
 
199
        hci_dev_lock_bh(hdev);
200
 
201
        err = -ENOMEM;
202
 
203
        type = lmp_esco_capable(hdev) ? ESCO_LINK : SCO_LINK;
204
 
205
        hcon = hci_connect(hdev, type, dst);
206
        if (!hcon)
207
                goto done;
208
 
209
        conn = sco_conn_add(hcon, 0);
210
        if (!conn) {
211
                hci_conn_put(hcon);
212
                goto done;
213
        }
214
 
215
        /* Update source addr of the socket */
216
        bacpy(src, conn->src);
217
 
218
        err = sco_chan_add(conn, sk, NULL);
219
        if (err)
220
                goto done;
221
 
222
        if (hcon->state == BT_CONNECTED) {
223
                sco_sock_clear_timer(sk);
224
                sk->sk_state = BT_CONNECTED;
225
        } else {
226
                sk->sk_state = BT_CONNECT;
227
                sco_sock_set_timer(sk, sk->sk_sndtimeo);
228
        }
229
 
230
done:
231
        hci_dev_unlock_bh(hdev);
232
        hci_dev_put(hdev);
233
        return err;
234
}
235
 
236
static inline int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
237
{
238
        struct sco_conn *conn = sco_pi(sk)->conn;
239
        struct sk_buff *skb;
240
        int err, count;
241
 
242
        /* Check outgoing MTU */
243
        if (len > conn->mtu)
244
                return -EINVAL;
245
 
246
        BT_DBG("sk %p len %d", sk, len);
247
 
248
        count = min_t(unsigned int, conn->mtu, len);
249
        if (!(skb = bt_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err)))
250
                return err;
251
 
252
        if (memcpy_fromiovec(skb_put(skb, count), msg->msg_iov, count)) {
253
                err = -EFAULT;
254
                goto fail;
255
        }
256
 
257
        if ((err = hci_send_sco(conn->hcon, skb)) < 0)
258
                return err;
259
 
260
        return count;
261
 
262
fail:
263
        kfree_skb(skb);
264
        return err;
265
}
266
 
267
static inline void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
268
{
269
        struct sock *sk = sco_chan_get(conn);
270
 
271
        if (!sk)
272
                goto drop;
273
 
274
        BT_DBG("sk %p len %d", sk, skb->len);
275
 
276
        if (sk->sk_state != BT_CONNECTED)
277
                goto drop;
278
 
279
        if (!sock_queue_rcv_skb(sk, skb))
280
                return;
281
 
282
drop:
283
        kfree_skb(skb);
284
        return;
285
}
286
 
287
/* -------- Socket interface ---------- */
288
static struct sock *__sco_get_sock_by_addr(bdaddr_t *ba)
289
{
290
        struct sock *sk;
291
        struct hlist_node *node;
292
 
293
        sk_for_each(sk, node, &sco_sk_list.head)
294
                if (!bacmp(&bt_sk(sk)->src, ba))
295
                        goto found;
296
        sk = NULL;
297
found:
298
        return sk;
299
}
300
 
301
/* Find socket listening on source bdaddr.
302
 * Returns closest match.
303
 */
304
static struct sock *sco_get_sock_listen(bdaddr_t *src)
305
{
306
        struct sock *sk = NULL, *sk1 = NULL;
307
        struct hlist_node *node;
308
 
309
        read_lock(&sco_sk_list.lock);
310
 
311
        sk_for_each(sk, node, &sco_sk_list.head) {
312
                if (sk->sk_state != BT_LISTEN)
313
                        continue;
314
 
315
                /* Exact match. */
316
                if (!bacmp(&bt_sk(sk)->src, src))
317
                        break;
318
 
319
                /* Closest match */
320
                if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY))
321
                        sk1 = sk;
322
        }
323
 
324
        read_unlock(&sco_sk_list.lock);
325
 
326
        return node ? sk : sk1;
327
}
328
 
329
static void sco_sock_destruct(struct sock *sk)
330
{
331
        BT_DBG("sk %p", sk);
332
 
333
        skb_queue_purge(&sk->sk_receive_queue);
334
        skb_queue_purge(&sk->sk_write_queue);
335
}
336
 
337
static void sco_sock_cleanup_listen(struct sock *parent)
338
{
339
        struct sock *sk;
340
 
341
        BT_DBG("parent %p", parent);
342
 
343
        /* Close not yet accepted channels */
344
        while ((sk = bt_accept_dequeue(parent, NULL))) {
345
                sco_sock_close(sk);
346
                sco_sock_kill(sk);
347
        }
348
 
349
        parent->sk_state  = BT_CLOSED;
350
        sock_set_flag(parent, SOCK_ZAPPED);
351
}
352
 
353
/* Kill socket (only if zapped and orphan)
354
 * Must be called on unlocked socket.
355
 */
356
static void sco_sock_kill(struct sock *sk)
357
{
358
        if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
359
                return;
360
 
361
        BT_DBG("sk %p state %d", sk, sk->sk_state);
362
 
363
        /* Kill poor orphan */
364
        bt_sock_unlink(&sco_sk_list, sk);
365
        sock_set_flag(sk, SOCK_DEAD);
366
        sock_put(sk);
367
}
368
 
369
/* Close socket.
370
 * Must be called on unlocked socket.
371
 */
372
static void sco_sock_close(struct sock *sk)
373
{
374
        struct sco_conn *conn;
375
 
376
        sco_sock_clear_timer(sk);
377
 
378
        lock_sock(sk);
379
 
380
        conn = sco_pi(sk)->conn;
381
 
382
        BT_DBG("sk %p state %d conn %p socket %p", sk, sk->sk_state, conn, sk->sk_socket);
383
 
384
        switch (sk->sk_state) {
385
        case BT_LISTEN:
386
                sco_sock_cleanup_listen(sk);
387
                break;
388
 
389
        case BT_CONNECTED:
390
        case BT_CONFIG:
391
        case BT_CONNECT:
392
        case BT_DISCONN:
393
                sco_chan_del(sk, ECONNRESET);
394
                break;
395
 
396
        default:
397
                sock_set_flag(sk, SOCK_ZAPPED);
398
                break;
399
        }
400
 
401
        release_sock(sk);
402
 
403
        sco_sock_kill(sk);
404
}
405
 
406
static void sco_sock_init(struct sock *sk, struct sock *parent)
407
{
408
        BT_DBG("sk %p", sk);
409
 
410
        if (parent)
411
                sk->sk_type = parent->sk_type;
412
}
413
 
414
static struct proto sco_proto = {
415
        .name           = "SCO",
416
        .owner          = THIS_MODULE,
417
        .obj_size       = sizeof(struct sco_pinfo)
418
};
419
 
420
static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio)
421
{
422
        struct sock *sk;
423
 
424
        sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto);
425
        if (!sk)
426
                return NULL;
427
 
428
        sock_init_data(sock, sk);
429
        INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
430
 
431
        sk->sk_destruct = sco_sock_destruct;
432
        sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
433
 
434
        sock_reset_flag(sk, SOCK_ZAPPED);
435
 
436
        sk->sk_protocol = proto;
437
        sk->sk_state    = BT_OPEN;
438
 
439
        sco_sock_init_timer(sk);
440
 
441
        bt_sock_link(&sco_sk_list, sk);
442
        return sk;
443
}
444
 
445
static int sco_sock_create(struct net *net, struct socket *sock, int protocol)
446
{
447
        struct sock *sk;
448
 
449
        BT_DBG("sock %p", sock);
450
 
451
        sock->state = SS_UNCONNECTED;
452
 
453
        if (sock->type != SOCK_SEQPACKET)
454
                return -ESOCKTNOSUPPORT;
455
 
456
        sock->ops = &sco_sock_ops;
457
 
458
        sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC);
459
        if (!sk)
460
                return -ENOMEM;
461
 
462
        sco_sock_init(sk, NULL);
463
        return 0;
464
}
465
 
466
static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
467
{
468
        struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
469
        struct sock *sk = sock->sk;
470
        bdaddr_t *src = &sa->sco_bdaddr;
471
        int err = 0;
472
 
473
        BT_DBG("sk %p %s", sk, batostr(&sa->sco_bdaddr));
474
 
475
        if (!addr || addr->sa_family != AF_BLUETOOTH)
476
                return -EINVAL;
477
 
478
        lock_sock(sk);
479
 
480
        if (sk->sk_state != BT_OPEN) {
481
                err = -EBADFD;
482
                goto done;
483
        }
484
 
485
        write_lock_bh(&sco_sk_list.lock);
486
 
487
        if (bacmp(src, BDADDR_ANY) && __sco_get_sock_by_addr(src)) {
488
                err = -EADDRINUSE;
489
        } else {
490
                /* Save source address */
491
                bacpy(&bt_sk(sk)->src, &sa->sco_bdaddr);
492
                sk->sk_state = BT_BOUND;
493
        }
494
 
495
        write_unlock_bh(&sco_sk_list.lock);
496
 
497
done:
498
        release_sock(sk);
499
        return err;
500
}
501
 
502
static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags)
503
{
504
        struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
505
        struct sock *sk = sock->sk;
506
        int err = 0;
507
 
508
 
509
        BT_DBG("sk %p", sk);
510
 
511
        if (addr->sa_family != AF_BLUETOOTH || alen < sizeof(struct sockaddr_sco))
512
                return -EINVAL;
513
 
514
        if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
515
                return -EBADFD;
516
 
517
        if (sk->sk_type != SOCK_SEQPACKET)
518
                return -EINVAL;
519
 
520
        lock_sock(sk);
521
 
522
        /* Set destination address and psm */
523
        bacpy(&bt_sk(sk)->dst, &sa->sco_bdaddr);
524
 
525
        if ((err = sco_connect(sk)))
526
                goto done;
527
 
528
        err = bt_sock_wait_state(sk, BT_CONNECTED,
529
                        sock_sndtimeo(sk, flags & O_NONBLOCK));
530
 
531
done:
532
        release_sock(sk);
533
        return err;
534
}
535
 
536
static int sco_sock_listen(struct socket *sock, int backlog)
537
{
538
        struct sock *sk = sock->sk;
539
        int err = 0;
540
 
541
        BT_DBG("sk %p backlog %d", sk, backlog);
542
 
543
        lock_sock(sk);
544
 
545
        if (sk->sk_state != BT_BOUND || sock->type != SOCK_SEQPACKET) {
546
                err = -EBADFD;
547
                goto done;
548
        }
549
 
550
        sk->sk_max_ack_backlog = backlog;
551
        sk->sk_ack_backlog = 0;
552
        sk->sk_state = BT_LISTEN;
553
 
554
done:
555
        release_sock(sk);
556
        return err;
557
}
558
 
559
static int sco_sock_accept(struct socket *sock, struct socket *newsock, int flags)
560
{
561
        DECLARE_WAITQUEUE(wait, current);
562
        struct sock *sk = sock->sk, *ch;
563
        long timeo;
564
        int err = 0;
565
 
566
        lock_sock(sk);
567
 
568
        if (sk->sk_state != BT_LISTEN) {
569
                err = -EBADFD;
570
                goto done;
571
        }
572
 
573
        timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
574
 
575
        BT_DBG("sk %p timeo %ld", sk, timeo);
576
 
577
        /* Wait for an incoming connection. (wake-one). */
578
        add_wait_queue_exclusive(sk->sk_sleep, &wait);
579
        while (!(ch = bt_accept_dequeue(sk, newsock))) {
580
                set_current_state(TASK_INTERRUPTIBLE);
581
                if (!timeo) {
582
                        err = -EAGAIN;
583
                        break;
584
                }
585
 
586
                release_sock(sk);
587
                timeo = schedule_timeout(timeo);
588
                lock_sock(sk);
589
 
590
                if (sk->sk_state != BT_LISTEN) {
591
                        err = -EBADFD;
592
                        break;
593
                }
594
 
595
                if (signal_pending(current)) {
596
                        err = sock_intr_errno(timeo);
597
                        break;
598
                }
599
        }
600
        set_current_state(TASK_RUNNING);
601
        remove_wait_queue(sk->sk_sleep, &wait);
602
 
603
        if (err)
604
                goto done;
605
 
606
        newsock->state = SS_CONNECTED;
607
 
608
        BT_DBG("new socket %p", ch);
609
 
610
done:
611
        release_sock(sk);
612
        return err;
613
}
614
 
615
static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer)
616
{
617
        struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
618
        struct sock *sk = sock->sk;
619
 
620
        BT_DBG("sock %p, sk %p", sock, sk);
621
 
622
        addr->sa_family = AF_BLUETOOTH;
623
        *len = sizeof(struct sockaddr_sco);
624
 
625
        if (peer)
626
                bacpy(&sa->sco_bdaddr, &bt_sk(sk)->dst);
627
        else
628
                bacpy(&sa->sco_bdaddr, &bt_sk(sk)->src);
629
 
630
        return 0;
631
}
632
 
633
static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
634
                            struct msghdr *msg, size_t len)
635
{
636
        struct sock *sk = sock->sk;
637
        int err = 0;
638
 
639
        BT_DBG("sock %p, sk %p", sock, sk);
640
 
641
        err = sock_error(sk);
642
        if (err)
643
                return err;
644
 
645
        if (msg->msg_flags & MSG_OOB)
646
                return -EOPNOTSUPP;
647
 
648
        lock_sock(sk);
649
 
650
        if (sk->sk_state == BT_CONNECTED)
651
                err = sco_send_frame(sk, msg, len);
652
        else
653
                err = -ENOTCONN;
654
 
655
        release_sock(sk);
656
        return err;
657
}
658
 
659
static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
660
{
661
        struct sock *sk = sock->sk;
662
        int err = 0;
663
 
664
        BT_DBG("sk %p", sk);
665
 
666
        lock_sock(sk);
667
 
668
        switch (optname) {
669
        default:
670
                err = -ENOPROTOOPT;
671
                break;
672
        }
673
 
674
        release_sock(sk);
675
        return err;
676
}
677
 
678
static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen)
679
{
680
        struct sock *sk = sock->sk;
681
        struct sco_options opts;
682
        struct sco_conninfo cinfo;
683
        int len, err = 0;
684
 
685
        BT_DBG("sk %p", sk);
686
 
687
        if (get_user(len, optlen))
688
                return -EFAULT;
689
 
690
        lock_sock(sk);
691
 
692
        switch (optname) {
693
        case SCO_OPTIONS:
694
                if (sk->sk_state != BT_CONNECTED) {
695
                        err = -ENOTCONN;
696
                        break;
697
                }
698
 
699
                opts.mtu = sco_pi(sk)->conn->mtu;
700
 
701
                BT_DBG("mtu %d", opts.mtu);
702
 
703
                len = min_t(unsigned int, len, sizeof(opts));
704
                if (copy_to_user(optval, (char *)&opts, len))
705
                        err = -EFAULT;
706
 
707
                break;
708
 
709
        case SCO_CONNINFO:
710
                if (sk->sk_state != BT_CONNECTED) {
711
                        err = -ENOTCONN;
712
                        break;
713
                }
714
 
715
                cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle;
716
                memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3);
717
 
718
                len = min_t(unsigned int, len, sizeof(cinfo));
719
                if (copy_to_user(optval, (char *)&cinfo, len))
720
                        err = -EFAULT;
721
 
722
                break;
723
 
724
        default:
725
                err = -ENOPROTOOPT;
726
                break;
727
        }
728
 
729
        release_sock(sk);
730
        return err;
731
}
732
 
733
static int sco_sock_release(struct socket *sock)
734
{
735
        struct sock *sk = sock->sk;
736
        int err = 0;
737
 
738
        BT_DBG("sock %p, sk %p", sock, sk);
739
 
740
        if (!sk)
741
                return 0;
742
 
743
        sco_sock_close(sk);
744
 
745
        if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) {
746
                lock_sock(sk);
747
                err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
748
                release_sock(sk);
749
        }
750
 
751
        sock_orphan(sk);
752
        sco_sock_kill(sk);
753
        return err;
754
}
755
 
756
static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent)
757
{
758
        BT_DBG("conn %p", conn);
759
 
760
        sco_pi(sk)->conn = conn;
761
        conn->sk = sk;
762
 
763
        if (parent)
764
                bt_accept_enqueue(parent, sk);
765
}
766
 
767
/* Delete channel.
768
 * Must be called on the locked socket. */
769
static void sco_chan_del(struct sock *sk, int err)
770
{
771
        struct sco_conn *conn;
772
 
773
        conn = sco_pi(sk)->conn;
774
 
775
        BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
776
 
777
        if (conn) {
778
                sco_conn_lock(conn);
779
                conn->sk = NULL;
780
                sco_pi(sk)->conn = NULL;
781
                sco_conn_unlock(conn);
782
                hci_conn_put(conn->hcon);
783
        }
784
 
785
        sk->sk_state = BT_CLOSED;
786
        sk->sk_err   = err;
787
        sk->sk_state_change(sk);
788
 
789
        sock_set_flag(sk, SOCK_ZAPPED);
790
}
791
 
792
static void sco_conn_ready(struct sco_conn *conn)
793
{
794
        struct sock *parent, *sk;
795
 
796
        BT_DBG("conn %p", conn);
797
 
798
        sco_conn_lock(conn);
799
 
800
        if ((sk = conn->sk)) {
801
                sco_sock_clear_timer(sk);
802
                bh_lock_sock(sk);
803
                sk->sk_state = BT_CONNECTED;
804
                sk->sk_state_change(sk);
805
                bh_unlock_sock(sk);
806
        } else {
807
                parent = sco_get_sock_listen(conn->src);
808
                if (!parent)
809
                        goto done;
810
 
811
                bh_lock_sock(parent);
812
 
813
                sk = sco_sock_alloc(parent->sk_net, NULL, BTPROTO_SCO, GFP_ATOMIC);
814
                if (!sk) {
815
                        bh_unlock_sock(parent);
816
                        goto done;
817
                }
818
 
819
                sco_sock_init(sk, parent);
820
 
821
                bacpy(&bt_sk(sk)->src, conn->src);
822
                bacpy(&bt_sk(sk)->dst, conn->dst);
823
 
824
                hci_conn_hold(conn->hcon);
825
                __sco_chan_add(conn, sk, parent);
826
 
827
                sk->sk_state = BT_CONNECTED;
828
 
829
                /* Wake up parent */
830
                parent->sk_data_ready(parent, 1);
831
 
832
                bh_unlock_sock(parent);
833
        }
834
 
835
done:
836
        sco_conn_unlock(conn);
837
}
838
 
839
/* ----- SCO interface with lower layer (HCI) ----- */
840
static int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
841
{
842
        BT_DBG("hdev %s, bdaddr %s", hdev->name, batostr(bdaddr));
843
 
844
        /* Always accept connection */
845
        return HCI_LM_ACCEPT;
846
}
847
 
848
static int sco_connect_cfm(struct hci_conn *hcon, __u8 status)
849
{
850
        BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status);
851
 
852
        if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
853
                return 0;
854
 
855
        if (!status) {
856
                struct sco_conn *conn;
857
 
858
                conn = sco_conn_add(hcon, status);
859
                if (conn)
860
                        sco_conn_ready(conn);
861
        } else
862
                sco_conn_del(hcon, bt_err(status));
863
 
864
        return 0;
865
}
866
 
867
static int sco_disconn_ind(struct hci_conn *hcon, __u8 reason)
868
{
869
        BT_DBG("hcon %p reason %d", hcon, reason);
870
 
871
        if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK)
872
                return 0;
873
 
874
        sco_conn_del(hcon, bt_err(reason));
875
 
876
        return 0;
877
}
878
 
879
static int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
880
{
881
        struct sco_conn *conn = hcon->sco_data;
882
 
883
        if (!conn)
884
                goto drop;
885
 
886
        BT_DBG("conn %p len %d", conn, skb->len);
887
 
888
        if (skb->len) {
889
                sco_recv_frame(conn, skb);
890
                return 0;
891
        }
892
 
893
drop:
894
        kfree_skb(skb);
895
        return 0;
896
}
897
 
898
static ssize_t sco_sysfs_show(struct class *dev, char *buf)
899
{
900
        struct sock *sk;
901
        struct hlist_node *node;
902
        char *str = buf;
903
 
904
        read_lock_bh(&sco_sk_list.lock);
905
 
906
        sk_for_each(sk, node, &sco_sk_list.head) {
907
                str += sprintf(str, "%s %s %d\n",
908
                                batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
909
                                sk->sk_state);
910
        }
911
 
912
        read_unlock_bh(&sco_sk_list.lock);
913
 
914
        return (str - buf);
915
}
916
 
917
static CLASS_ATTR(sco, S_IRUGO, sco_sysfs_show, NULL);
918
 
919
static const struct proto_ops sco_sock_ops = {
920
        .family         = PF_BLUETOOTH,
921
        .owner          = THIS_MODULE,
922
        .release        = sco_sock_release,
923
        .bind           = sco_sock_bind,
924
        .connect        = sco_sock_connect,
925
        .listen         = sco_sock_listen,
926
        .accept         = sco_sock_accept,
927
        .getname        = sco_sock_getname,
928
        .sendmsg        = sco_sock_sendmsg,
929
        .recvmsg        = bt_sock_recvmsg,
930
        .poll           = bt_sock_poll,
931
        .ioctl          = sock_no_ioctl,
932
        .mmap           = sock_no_mmap,
933
        .socketpair     = sock_no_socketpair,
934
        .shutdown       = sock_no_shutdown,
935
        .setsockopt     = sco_sock_setsockopt,
936
        .getsockopt     = sco_sock_getsockopt
937
};
938
 
939
static struct net_proto_family sco_sock_family_ops = {
940
        .family = PF_BLUETOOTH,
941
        .owner  = THIS_MODULE,
942
        .create = sco_sock_create,
943
};
944
 
945
static struct hci_proto sco_hci_proto = {
946
        .name           = "SCO",
947
        .id             = HCI_PROTO_SCO,
948
        .connect_ind    = sco_connect_ind,
949
        .connect_cfm    = sco_connect_cfm,
950
        .disconn_ind    = sco_disconn_ind,
951
        .recv_scodata   = sco_recv_scodata
952
};
953
 
954
static int __init sco_init(void)
955
{
956
        int err;
957
 
958
        err = proto_register(&sco_proto, 0);
959
        if (err < 0)
960
                return err;
961
 
962
        err = bt_sock_register(BTPROTO_SCO, &sco_sock_family_ops);
963
        if (err < 0) {
964
                BT_ERR("SCO socket registration failed");
965
                goto error;
966
        }
967
 
968
        err = hci_register_proto(&sco_hci_proto);
969
        if (err < 0) {
970
                BT_ERR("SCO protocol registration failed");
971
                bt_sock_unregister(BTPROTO_SCO);
972
                goto error;
973
        }
974
 
975
        if (class_create_file(bt_class, &class_attr_sco) < 0)
976
                BT_ERR("Failed to create SCO info file");
977
 
978
        BT_INFO("SCO (Voice Link) ver %s", VERSION);
979
        BT_INFO("SCO socket layer initialized");
980
 
981
        return 0;
982
 
983
error:
984
        proto_unregister(&sco_proto);
985
        return err;
986
}
987
 
988
static void __exit sco_exit(void)
989
{
990
        class_remove_file(bt_class, &class_attr_sco);
991
 
992
        if (bt_sock_unregister(BTPROTO_SCO) < 0)
993
                BT_ERR("SCO socket unregistration failed");
994
 
995
        if (hci_unregister_proto(&sco_hci_proto) < 0)
996
                BT_ERR("SCO protocol unregistration failed");
997
 
998
        proto_unregister(&sco_proto);
999
}
1000
 
1001
module_init(sco_init);
1002
module_exit(sco_exit);
1003
 
1004
MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
1005
MODULE_DESCRIPTION("Bluetooth SCO ver " VERSION);
1006
MODULE_VERSION(VERSION);
1007
MODULE_LICENSE("GPL");
1008
MODULE_ALIAS("bt-proto-2");

powered by: WebSVN 2.1.0

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