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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [net/] [bluetooth/] [rfcomm/] [core.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
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
   RPN support    -    Dirk Husemann <hud@zurich.ibm.com>
26
*/
27
 
28
/*
29
 * RFCOMM core.
30
 *
31
 * $Id: core.c,v 1.1.1.1 2004-04-15 01:17:12 phoenix Exp $
32
 */
33
 
34
#define __KERNEL_SYSCALLS__
35
 
36
#include <linux/config.h>
37
#include <linux/module.h>
38
#include <linux/errno.h>
39
#include <linux/kernel.h>
40
#include <linux/sched.h>
41
#include <linux/signal.h>
42
#include <linux/init.h>
43
#include <linux/wait.h>
44
#include <linux/net.h>
45
#include <linux/proc_fs.h>
46
#include <net/sock.h>
47
#include <asm/uaccess.h>
48
#include <asm/unaligned.h>
49
 
50
#include <net/bluetooth/bluetooth.h>
51
#include <net/bluetooth/l2cap.h>
52
#include <net/bluetooth/rfcomm.h>
53
 
54
#define VERSION "1.1"
55
 
56
#ifndef CONFIG_BLUEZ_RFCOMM_DEBUG
57
#undef  BT_DBG
58
#define BT_DBG(D...)
59
#endif
60
 
61
struct task_struct *rfcomm_thread;
62
DECLARE_MUTEX(rfcomm_sem);
63
unsigned long rfcomm_event;
64
 
65
static LIST_HEAD(session_list);
66
static atomic_t terminate, running;
67
 
68
static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len);
69
static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci);
70
static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci);
71
static int rfcomm_queue_disc(struct rfcomm_dlc *d);
72
static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type);
73
static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d);
74
static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig);
75
static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len);
76
static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits);
77
static void rfcomm_make_uih(struct sk_buff *skb, u8 addr);
78
 
79
static void rfcomm_process_connect(struct rfcomm_session *s);
80
 
81
/* ---- RFCOMM frame parsing macros ---- */
82
#define __get_dlci(b)     ((b & 0xfc) >> 2)
83
#define __get_channel(b)  ((b & 0xf8) >> 3)
84
#define __get_dir(b)      ((b & 0x04) >> 2)
85
#define __get_type(b)     ((b & 0xef))
86
 
87
#define __test_ea(b)      ((b & 0x01))
88
#define __test_cr(b)      ((b & 0x02))
89
#define __test_pf(b)      ((b & 0x10))
90
 
91
#define __addr(cr, dlci)       (((dlci & 0x3f) << 2) | (cr << 1) | 0x01)
92
#define __ctrl(type, pf)       (((type & 0xef) | (pf << 4)))
93
#define __dlci(dir, chn)       (((chn & 0x1f) << 1) | dir)
94
#define __srv_channel(dlci)    (dlci >> 1)
95
#define __dir(dlci)            (dlci & 0x01)
96
 
97
#define __len8(len)       (((len) << 1) | 1)
98
#define __len16(len)      ((len) << 1)
99
 
100
/* MCC macros */
101
#define __mcc_type(cr, type)   (((type << 2) | (cr << 1) | 0x01))
102
#define __get_mcc_type(b) ((b & 0xfc) >> 2)
103
#define __get_mcc_len(b)  ((b & 0xfe) >> 1)
104
 
105
/* RPN macros */
106
#define __rpn_line_settings(data, stop, parity)  ((data & 0x3) | ((stop & 0x1) << 2) | ((parity & 0x3) << 3))
107
#define __get_rpn_data_bits(line) ((line) & 0x3)
108
#define __get_rpn_stop_bits(line) (((line) >> 2) & 0x1)
109
#define __get_rpn_parity(line)    (((line) >> 3) & 0x3)
110
 
111
/* ---- RFCOMM FCS computation ---- */
112
 
113
/* CRC on 2 bytes */
114
#define __crc(data) (rfcomm_crc_table[rfcomm_crc_table[0xff ^ data[0]] ^ data[1]])
115
 
116
/* FCS on 2 bytes */
117
static inline u8 __fcs(u8 *data)
118
{
119
        return (0xff - __crc(data));
120
}
121
 
122
/* FCS on 3 bytes */
123
static inline u8 __fcs2(u8 *data)
124
{
125
        return (0xff - rfcomm_crc_table[__crc(data) ^ data[2]]);
126
}
127
 
128
/* Check FCS */
129
static inline int __check_fcs(u8 *data, int type, u8 fcs)
130
{
131
        u8 f = __crc(data);
132
 
133
        if (type != RFCOMM_UIH)
134
                f = rfcomm_crc_table[f ^ data[2]];
135
 
136
        return rfcomm_crc_table[f ^ fcs] != 0xcf;
137
}
138
 
139
/* ---- L2CAP callbacks ---- */
140
static void rfcomm_l2state_change(struct sock *sk)
141
{
142
        BT_DBG("%p state %d", sk, sk->state);
143
        rfcomm_schedule(RFCOMM_SCHED_STATE);
144
}
145
 
146
static void rfcomm_l2data_ready(struct sock *sk, int bytes)
147
{
148
        BT_DBG("%p bytes %d", sk, bytes);
149
        rfcomm_schedule(RFCOMM_SCHED_RX);
150
}
151
 
152
static int rfcomm_l2sock_create(struct socket **sock)
153
{
154
        int err;
155
 
156
        BT_DBG("");
157
 
158
        err = sock_create(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP, sock);
159
        if (!err) {
160
                struct sock *sk = (*sock)->sk;
161
                sk->data_ready   = rfcomm_l2data_ready;
162
                sk->state_change = rfcomm_l2state_change;
163
        }
164
        return err;
165
}
166
 
167
/* ---- RFCOMM DLCs ---- */
168
static void rfcomm_dlc_timeout(unsigned long arg)
169
{
170
        struct rfcomm_dlc *d = (void *) arg;
171
 
172
        BT_DBG("dlc %p state %ld", d, d->state);
173
 
174
        set_bit(RFCOMM_TIMED_OUT, &d->flags);
175
        rfcomm_dlc_put(d);
176
        rfcomm_schedule(RFCOMM_SCHED_TIMEO);
177
}
178
 
179
static void rfcomm_dlc_set_timer(struct rfcomm_dlc *d, long timeout)
180
{
181
        BT_DBG("dlc %p state %ld timeout %ld", d, d->state, timeout);
182
 
183
        if (!mod_timer(&d->timer, jiffies + timeout))
184
                rfcomm_dlc_hold(d);
185
}
186
 
187
static void rfcomm_dlc_clear_timer(struct rfcomm_dlc *d)
188
{
189
        BT_DBG("dlc %p state %ld", d, d->state);
190
 
191
        if (timer_pending(&d->timer) && del_timer(&d->timer))
192
                rfcomm_dlc_put(d);
193
}
194
 
195
static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
196
{
197
        BT_DBG("%p", d);
198
 
199
        d->state      = BT_OPEN;
200
        d->flags      = 0;
201
        d->mscex      = 0;
202
        d->mtu        = RFCOMM_DEFAULT_MTU;
203
        d->v24_sig    = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;
204
 
205
        d->cfc        = RFCOMM_CFC_DISABLED;
206
        d->rx_credits = RFCOMM_DEFAULT_CREDITS;
207
}
208
 
209
struct rfcomm_dlc *rfcomm_dlc_alloc(int prio)
210
{
211
        struct rfcomm_dlc *d = kmalloc(sizeof(*d), prio);
212
        if (!d)
213
                return NULL;
214
        memset(d, 0, sizeof(*d));
215
 
216
        init_timer(&d->timer);
217
        d->timer.function = rfcomm_dlc_timeout;
218
        d->timer.data = (unsigned long) d;
219
 
220
        skb_queue_head_init(&d->tx_queue);
221
        spin_lock_init(&d->lock);
222
        atomic_set(&d->refcnt, 1);
223
 
224
        rfcomm_dlc_clear_state(d);
225
 
226
        BT_DBG("%p", d);
227
        return d;
228
}
229
 
230
void rfcomm_dlc_free(struct rfcomm_dlc *d)
231
{
232
        BT_DBG("%p", d);
233
 
234
        skb_queue_purge(&d->tx_queue);
235
        kfree(d);
236
}
237
 
238
static void rfcomm_dlc_link(struct rfcomm_session *s, struct rfcomm_dlc *d)
239
{
240
        BT_DBG("dlc %p session %p", d, s);
241
 
242
        rfcomm_session_hold(s);
243
 
244
        rfcomm_dlc_hold(d);
245
        list_add(&d->list, &s->dlcs);
246
        d->session = s;
247
}
248
 
249
static void rfcomm_dlc_unlink(struct rfcomm_dlc *d)
250
{
251
        struct rfcomm_session *s = d->session;
252
 
253
        BT_DBG("dlc %p refcnt %d session %p", d, atomic_read(&d->refcnt), s);
254
 
255
        list_del(&d->list);
256
        d->session = NULL;
257
        rfcomm_dlc_put(d);
258
 
259
        rfcomm_session_put(s);
260
}
261
 
262
static struct rfcomm_dlc *rfcomm_dlc_get(struct rfcomm_session *s, u8 dlci)
263
{
264
        struct rfcomm_dlc *d;
265
        struct list_head *p;
266
 
267
        list_for_each(p, &s->dlcs) {
268
                d = list_entry(p, struct rfcomm_dlc, list);
269
                if (d->dlci == dlci)
270
                        return d;
271
        }
272
        return NULL;
273
}
274
 
275
static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
276
{
277
        struct rfcomm_session *s;
278
        int err = 0;
279
        u8 dlci;
280
 
281
        BT_DBG("dlc %p state %ld %s %s channel %d",
282
                        d, d->state, batostr(src), batostr(dst), channel);
283
 
284
        if (channel < 1 || channel > 30)
285
                return -EINVAL;
286
 
287
        if (d->state != BT_OPEN && d->state != BT_CLOSED)
288
                return 0;
289
 
290
        s = rfcomm_session_get(src, dst);
291
        if (!s) {
292
                s = rfcomm_session_create(src, dst, &err);
293
                if (!s)
294
                        return err;
295
        }
296
 
297
        dlci = __dlci(!s->initiator, channel);
298
 
299
        /* Check if DLCI already exists */
300
        if (rfcomm_dlc_get(s, dlci))
301
                return -EBUSY;
302
 
303
        rfcomm_dlc_clear_state(d);
304
 
305
        d->dlci     = dlci;
306
        d->addr     = __addr(s->initiator, dlci);
307
        d->priority = 7;
308
 
309
        d->state    = BT_CONFIG;
310
        rfcomm_dlc_link(s, d);
311
 
312
        d->mtu = s->mtu;
313
        d->cfc = (s->cfc == RFCOMM_CFC_UNKNOWN) ? 0 : s->cfc;
314
 
315
        if (s->state == BT_CONNECTED)
316
                rfcomm_send_pn(s, 1, d);
317
        rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
318
        return 0;
319
}
320
 
321
int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
322
{
323
        mm_segment_t fs;
324
        int r;
325
 
326
        rfcomm_lock();
327
 
328
        fs = get_fs(); set_fs(KERNEL_DS);
329
        r = __rfcomm_dlc_open(d, src, dst, channel);
330
        set_fs(fs);
331
 
332
        rfcomm_unlock();
333
        return r;
334
}
335
 
336
static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
337
{
338
        struct rfcomm_session *s = d->session;
339
        if (!s)
340
                return 0;
341
 
342
        BT_DBG("dlc %p state %ld dlci %d err %d session %p",
343
                        d, d->state, d->dlci, err, s);
344
 
345
        switch (d->state) {
346
        case BT_CONNECTED:
347
        case BT_CONFIG:
348
        case BT_CONNECT:
349
                d->state = BT_DISCONN;
350
                if (skb_queue_empty(&d->tx_queue)) {
351
                        rfcomm_send_disc(s, d->dlci);
352
                        rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT);
353
                } else {
354
                        rfcomm_queue_disc(d);
355
                        rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT * 2);
356
                }
357
                break;
358
 
359
        default:
360
                rfcomm_dlc_clear_timer(d);
361
 
362
                rfcomm_dlc_lock(d);
363
                d->state = BT_CLOSED;
364
                d->state_change(d, err);
365
                rfcomm_dlc_unlock(d);
366
 
367
                skb_queue_purge(&d->tx_queue);
368
                rfcomm_dlc_unlink(d);
369
        }
370
 
371
        return 0;
372
}
373
 
374
int rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
375
{
376
        mm_segment_t fs;
377
        int r;
378
 
379
        rfcomm_lock();
380
 
381
        fs = get_fs(); set_fs(KERNEL_DS);
382
        r = __rfcomm_dlc_close(d, err);
383
        set_fs(fs);
384
 
385
        rfcomm_unlock();
386
        return r;
387
}
388
 
389
int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb)
390
{
391
        int len = skb->len;
392
 
393
        if (d->state != BT_CONNECTED)
394
                return -ENOTCONN;
395
 
396
        BT_DBG("dlc %p mtu %d len %d", d, d->mtu, len);
397
 
398
        if (len > d->mtu)
399
                return -EINVAL;
400
 
401
        rfcomm_make_uih(skb, d->addr);
402
        skb_queue_tail(&d->tx_queue, skb);
403
 
404
        if (!test_bit(RFCOMM_TX_THROTTLED, &d->flags))
405
                rfcomm_schedule(RFCOMM_SCHED_TX);
406
        return len;
407
}
408
 
409
void __rfcomm_dlc_throttle(struct rfcomm_dlc *d)
410
{
411
        BT_DBG("dlc %p state %ld", d, d->state);
412
 
413
        if (!d->cfc) {
414
                d->v24_sig |= RFCOMM_V24_FC;
415
                set_bit(RFCOMM_MSC_PENDING, &d->flags);
416
        }
417
        rfcomm_schedule(RFCOMM_SCHED_TX);
418
}
419
 
420
void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
421
{
422
        BT_DBG("dlc %p state %ld", d, d->state);
423
 
424
        if (!d->cfc) {
425
                d->v24_sig &= ~RFCOMM_V24_FC;
426
                set_bit(RFCOMM_MSC_PENDING, &d->flags);
427
        }
428
        rfcomm_schedule(RFCOMM_SCHED_TX);
429
}
430
 
431
/*
432
   Set/get modem status functions use _local_ status i.e. what we report
433
   to the other side.
434
   Remote status is provided by dlc->modem_status() callback.
435
 */
436
int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
437
{
438
        BT_DBG("dlc %p state %ld v24_sig 0x%x",
439
                        d, d->state, v24_sig);
440
 
441
        if (test_bit(RFCOMM_RX_THROTTLED, &d->flags))
442
                v24_sig |= RFCOMM_V24_FC;
443
        else
444
                v24_sig &= ~RFCOMM_V24_FC;
445
 
446
        d->v24_sig = v24_sig;
447
 
448
        if (!test_and_set_bit(RFCOMM_MSC_PENDING, &d->flags))
449
                rfcomm_schedule(RFCOMM_SCHED_TX);
450
 
451
        return 0;
452
}
453
 
454
int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig)
455
{
456
        BT_DBG("dlc %p state %ld v24_sig 0x%x",
457
                        d, d->state, d->v24_sig);
458
 
459
        *v24_sig = d->v24_sig;
460
        return 0;
461
}
462
 
463
/* ---- RFCOMM sessions ---- */
464
struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state)
465
{
466
        struct rfcomm_session *s = kmalloc(sizeof(*s), GFP_KERNEL);
467
        if (!s)
468
                return NULL;
469
        memset(s, 0, sizeof(*s));
470
 
471
        BT_DBG("session %p sock %p", s, sock);
472
 
473
        INIT_LIST_HEAD(&s->dlcs);
474
        s->state = state;
475
        s->sock  = sock;
476
 
477
        s->mtu   = RFCOMM_DEFAULT_MTU;
478
        s->cfc   = RFCOMM_CFC_UNKNOWN;
479
 
480
        list_add(&s->list, &session_list);
481
 
482
        /* Do not increment module usage count for listeting sessions.
483
         * Otherwise we won't be able to unload the module. */
484
        if (state != BT_LISTEN)
485
                MOD_INC_USE_COUNT;
486
        return s;
487
}
488
 
489
void rfcomm_session_del(struct rfcomm_session *s)
490
{
491
        int state = s->state;
492
 
493
        BT_DBG("session %p state %ld", s, s->state);
494
 
495
        list_del(&s->list);
496
 
497
        if (state == BT_CONNECTED)
498
                rfcomm_send_disc(s, 0);
499
 
500
        sock_release(s->sock);
501
        kfree(s);
502
 
503
        if (state != BT_LISTEN)
504
                MOD_DEC_USE_COUNT;
505
}
506
 
507
struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst)
508
{
509
        struct rfcomm_session *s;
510
        struct list_head *p, *n;
511
        struct bluez_pinfo *pi;
512
        list_for_each_safe(p, n, &session_list) {
513
                s = list_entry(p, struct rfcomm_session, list);
514
                pi = bluez_pi(s->sock->sk);
515
 
516
                if ((!bacmp(src, BDADDR_ANY) || !bacmp(&pi->src, src)) &&
517
                                !bacmp(&pi->dst, dst))
518
                        return s;
519
        }
520
        return NULL;
521
}
522
 
523
void rfcomm_session_close(struct rfcomm_session *s, int err)
524
{
525
        struct rfcomm_dlc *d;
526
        struct list_head *p, *n;
527
 
528
        BT_DBG("session %p state %ld err %d", s, s->state, err);
529
 
530
        rfcomm_session_hold(s);
531
 
532
        s->state = BT_CLOSED;
533
 
534
        /* Close all dlcs */
535
        list_for_each_safe(p, n, &s->dlcs) {
536
                d = list_entry(p, struct rfcomm_dlc, list);
537
                d->state = BT_CLOSED;
538
                __rfcomm_dlc_close(d, err);
539
        }
540
 
541
        rfcomm_session_put(s);
542
}
543
 
544
struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err)
545
{
546
        struct rfcomm_session *s = NULL;
547
        struct sockaddr_l2 addr;
548
        struct l2cap_options opts;
549
        struct socket *sock;
550
        int    size;
551
 
552
        BT_DBG("%s %s", batostr(src), batostr(dst));
553
 
554
        *err = rfcomm_l2sock_create(&sock);
555
        if (*err < 0)
556
                return NULL;
557
 
558
        bacpy(&addr.l2_bdaddr, src);
559
        addr.l2_family = AF_BLUETOOTH;
560
        addr.l2_psm    = 0;
561
        *err = sock->ops->bind(sock, (struct sockaddr *) &addr, sizeof(addr));
562
        if (*err < 0)
563
                goto failed;
564
 
565
        /* Set L2CAP options */
566
        size = sizeof(opts);
567
        sock->ops->getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, (void *)&opts, &size);
568
 
569
        opts.imtu = RFCOMM_MAX_L2CAP_MTU;
570
        sock->ops->setsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, (void *)&opts, size);
571
 
572
        s = rfcomm_session_add(sock, BT_BOUND);
573
        if (!s) {
574
                *err = -ENOMEM;
575
                goto failed;
576
        }
577
 
578
        s->initiator = 1;
579
 
580
        bacpy(&addr.l2_bdaddr, dst);
581
        addr.l2_family = AF_BLUETOOTH;
582
        addr.l2_psm    = htobs(RFCOMM_PSM);
583
        *err = sock->ops->connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
584
        if (*err == 0 || *err == -EAGAIN)
585
                return s;
586
 
587
        rfcomm_session_del(s);
588
        return NULL;
589
 
590
failed:
591
        sock_release(sock);
592
        return NULL;
593
}
594
 
595
void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst)
596
{
597
        struct sock *sk = s->sock->sk;
598
        if (src)
599
                bacpy(src, &bluez_pi(sk)->src);
600
        if (dst)
601
                bacpy(dst, &bluez_pi(sk)->dst);
602
}
603
 
604
/* ---- RFCOMM frame sending ---- */
605
static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len)
606
{
607
        struct socket *sock = s->sock;
608
        struct iovec iv = { data, len };
609
        struct msghdr msg;
610
        int err;
611
 
612
        BT_DBG("session %p len %d", s, len);
613
 
614
        memset(&msg, 0, sizeof(msg));
615
        msg.msg_iovlen = 1;
616
        msg.msg_iov = &iv;
617
 
618
        err = sock->ops->sendmsg(sock, &msg, len, 0);
619
        return err;
620
}
621
 
622
static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci)
623
{
624
        struct rfcomm_cmd cmd;
625
 
626
        BT_DBG("%p dlci %d", s, dlci);
627
 
628
        cmd.addr = __addr(s->initiator, dlci);
629
        cmd.ctrl = __ctrl(RFCOMM_SABM, 1);
630
        cmd.len  = __len8(0);
631
        cmd.fcs  = __fcs2((u8 *) &cmd);
632
 
633
        return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
634
}
635
 
636
static int rfcomm_send_ua(struct rfcomm_session *s, u8 dlci)
637
{
638
        struct rfcomm_cmd cmd;
639
 
640
        BT_DBG("%p dlci %d", s, dlci);
641
 
642
        cmd.addr = __addr(!s->initiator, dlci);
643
        cmd.ctrl = __ctrl(RFCOMM_UA, 1);
644
        cmd.len  = __len8(0);
645
        cmd.fcs  = __fcs2((u8 *) &cmd);
646
 
647
        return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
648
}
649
 
650
static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci)
651
{
652
        struct rfcomm_cmd cmd;
653
 
654
        BT_DBG("%p dlci %d", s, dlci);
655
 
656
        cmd.addr = __addr(s->initiator, dlci);
657
        cmd.ctrl = __ctrl(RFCOMM_DISC, 1);
658
        cmd.len  = __len8(0);
659
        cmd.fcs  = __fcs2((u8 *) &cmd);
660
 
661
        return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
662
}
663
 
664
static int rfcomm_queue_disc(struct rfcomm_dlc *d)
665
{
666
        struct rfcomm_cmd *cmd;
667
        struct sk_buff *skb;
668
 
669
        BT_DBG("dlc %p dlci %d", d, d->dlci);
670
 
671
        skb = alloc_skb(sizeof(*cmd), GFP_KERNEL);
672
        if (!skb)
673
                return -ENOMEM;
674
 
675
        cmd = (void *) __skb_put(skb, sizeof(*cmd));
676
        cmd->addr = d->addr;
677
        cmd->ctrl = __ctrl(RFCOMM_DISC, 1);
678
        cmd->len  = __len8(0);
679
        cmd->fcs  = __fcs2((u8 *) cmd);
680
 
681
        skb_queue_tail(&d->tx_queue, skb);
682
        rfcomm_schedule(RFCOMM_SCHED_TX);
683
        return 0;
684
}
685
 
686
static int rfcomm_send_dm(struct rfcomm_session *s, u8 dlci)
687
{
688
        struct rfcomm_cmd cmd;
689
 
690
        BT_DBG("%p dlci %d", s, dlci);
691
 
692
        cmd.addr = __addr(!s->initiator, dlci);
693
        cmd.ctrl = __ctrl(RFCOMM_DM, 1);
694
        cmd.len  = __len8(0);
695
        cmd.fcs  = __fcs2((u8 *) &cmd);
696
 
697
        return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
698
}
699
 
700
static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type)
701
{
702
        struct rfcomm_hdr *hdr;
703
        struct rfcomm_mcc *mcc;
704
        u8 buf[16], *ptr = buf;
705
 
706
        BT_DBG("%p cr %d type %d", s, cr, type);
707
 
708
        hdr = (void *) ptr; ptr += sizeof(*hdr);
709
        hdr->addr = __addr(s->initiator, 0);
710
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
711
        hdr->len  = __len8(sizeof(*mcc) + 1);
712
 
713
        mcc = (void *) ptr; ptr += sizeof(*mcc);
714
        mcc->type = __mcc_type(cr, RFCOMM_NSC);
715
        mcc->len  = __len8(1);
716
 
717
        /* Type that we didn't like */
718
        *ptr = __mcc_type(cr, type); ptr++;
719
 
720
        *ptr = __fcs(buf); ptr++;
721
 
722
        return rfcomm_send_frame(s, buf, ptr - buf);
723
}
724
 
725
static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d)
726
{
727
        struct rfcomm_hdr *hdr;
728
        struct rfcomm_mcc *mcc;
729
        struct rfcomm_pn  *pn;
730
        u8 buf[16], *ptr = buf;
731
 
732
        BT_DBG("%p cr %d dlci %d mtu %d", s, cr, d->dlci, d->mtu);
733
 
734
        hdr = (void *) ptr; ptr += sizeof(*hdr);
735
        hdr->addr = __addr(s->initiator, 0);
736
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
737
        hdr->len  = __len8(sizeof(*mcc) + sizeof(*pn));
738
 
739
        mcc = (void *) ptr; ptr += sizeof(*mcc);
740
        mcc->type = __mcc_type(cr, RFCOMM_PN);
741
        mcc->len  = __len8(sizeof(*pn));
742
 
743
        pn = (void *) ptr; ptr += sizeof(*pn);
744
        pn->dlci        = d->dlci;
745
        pn->priority    = d->priority;
746
        pn->ack_timer   = 0;
747
        pn->max_retrans = 0;
748
 
749
        if (s->cfc) {
750
                pn->flow_ctrl = cr ? 0xf0 : 0xe0;
751
                pn->credits = RFCOMM_DEFAULT_CREDITS;
752
        } else {
753
                pn->flow_ctrl = 0;
754
                pn->credits   = 0;
755
        }
756
 
757
        pn->mtu = htobs(d->mtu);
758
 
759
        *ptr = __fcs(buf); ptr++;
760
 
761
        return rfcomm_send_frame(s, buf, ptr - buf);
762
}
763
 
764
static int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
765
                           u8 bit_rate, u8 data_bits, u8 stop_bits,
766
                           u8 parity, u8 flow_ctrl_settings,
767
                           u8 xon_char, u8 xoff_char, u16 param_mask)
768
{
769
        struct rfcomm_hdr *hdr;
770
        struct rfcomm_mcc *mcc;
771
        struct rfcomm_rpn *rpn;
772
        u8 buf[16], *ptr = buf;
773
 
774
        BT_DBG("%p cr %d dlci %d bit_r 0x%x data_b 0x%x stop_b 0x%x parity 0x%x"
775
               "flwc_s 0x%x xon_c 0x%x xoff_c 0x%x p_mask 0x%x",
776
                        s, cr, dlci, bit_rate, data_bits, stop_bits, parity,
777
                        flow_ctrl_settings, xon_char, xoff_char, param_mask);
778
 
779
        hdr = (void *) ptr; ptr += sizeof(*hdr);
780
        hdr->addr = __addr(s->initiator, 0);
781
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
782
        hdr->len  = __len8(sizeof(*mcc) + sizeof(*rpn));
783
 
784
        mcc = (void *) ptr; ptr += sizeof(*mcc);
785
        mcc->type = __mcc_type(cr, RFCOMM_RPN);
786
        mcc->len  = __len8(sizeof(*rpn));
787
 
788
        rpn = (void *) ptr; ptr += sizeof(*rpn);
789
        rpn->dlci          = __addr(1, dlci);
790
        rpn->bit_rate      = bit_rate;
791
        rpn->line_settings = __rpn_line_settings(data_bits, stop_bits, parity);
792
        rpn->flow_ctrl     = flow_ctrl_settings;
793
        rpn->xon_char      = xon_char;
794
        rpn->xoff_char     = xoff_char;
795
        rpn->param_mask    = param_mask;
796
 
797
        *ptr = __fcs(buf); ptr++;
798
 
799
        return rfcomm_send_frame(s, buf, ptr - buf);
800
}
801
 
802
static int rfcomm_send_rls(struct rfcomm_session *s, int cr, u8 dlci, u8 status)
803
{
804
        struct rfcomm_hdr *hdr;
805
        struct rfcomm_mcc *mcc;
806
        struct rfcomm_rls *rls;
807
        u8 buf[16], *ptr = buf;
808
 
809
        BT_DBG("%p cr %d status 0x%x", s, cr, status);
810
 
811
        hdr = (void *) ptr; ptr += sizeof(*hdr);
812
        hdr->addr = __addr(s->initiator, 0);
813
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
814
        hdr->len  = __len8(sizeof(*mcc) + sizeof(*rls));
815
 
816
        mcc = (void *) ptr; ptr += sizeof(*mcc);
817
        mcc->type = __mcc_type(cr, RFCOMM_RLS);
818
        mcc->len  = __len8(sizeof(*rls));
819
 
820
        rls = (void *) ptr; ptr += sizeof(*rls);
821
        rls->dlci   = __addr(1, dlci);
822
        rls->status = status;
823
 
824
        *ptr = __fcs(buf); ptr++;
825
 
826
        return rfcomm_send_frame(s, buf, ptr - buf);
827
}
828
 
829
static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig)
830
{
831
        struct rfcomm_hdr *hdr;
832
        struct rfcomm_mcc *mcc;
833
        struct rfcomm_msc *msc;
834
        u8 buf[16], *ptr = buf;
835
 
836
        BT_DBG("%p cr %d v24 0x%x", s, cr, v24_sig);
837
 
838
        hdr = (void *) ptr; ptr += sizeof(*hdr);
839
        hdr->addr = __addr(s->initiator, 0);
840
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
841
        hdr->len  = __len8(sizeof(*mcc) + sizeof(*msc));
842
 
843
        mcc = (void *) ptr; ptr += sizeof(*mcc);
844
        mcc->type = __mcc_type(cr, RFCOMM_MSC);
845
        mcc->len  = __len8(sizeof(*msc));
846
 
847
        msc = (void *) ptr; ptr += sizeof(*msc);
848
        msc->dlci    = __addr(1, dlci);
849
        msc->v24_sig = v24_sig | 0x01;
850
 
851
        *ptr = __fcs(buf); ptr++;
852
 
853
        return rfcomm_send_frame(s, buf, ptr - buf);
854
}
855
 
856
static int rfcomm_send_fcoff(struct rfcomm_session *s, int cr)
857
{
858
        struct rfcomm_hdr *hdr;
859
        struct rfcomm_mcc *mcc;
860
        u8 buf[16], *ptr = buf;
861
 
862
        BT_DBG("%p cr %d", s, cr);
863
 
864
        hdr = (void *) ptr; ptr += sizeof(*hdr);
865
        hdr->addr = __addr(s->initiator, 0);
866
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
867
        hdr->len  = __len8(sizeof(*mcc));
868
 
869
        mcc = (void *) ptr; ptr += sizeof(*mcc);
870
        mcc->type = __mcc_type(cr, RFCOMM_FCOFF);
871
        mcc->len  = __len8(0);
872
 
873
        *ptr = __fcs(buf); ptr++;
874
 
875
        return rfcomm_send_frame(s, buf, ptr - buf);
876
}
877
 
878
static int rfcomm_send_fcon(struct rfcomm_session *s, int cr)
879
{
880
        struct rfcomm_hdr *hdr;
881
        struct rfcomm_mcc *mcc;
882
        u8 buf[16], *ptr = buf;
883
 
884
        BT_DBG("%p cr %d", s, cr);
885
 
886
        hdr = (void *) ptr; ptr += sizeof(*hdr);
887
        hdr->addr = __addr(s->initiator, 0);
888
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
889
        hdr->len  = __len8(sizeof(*mcc));
890
 
891
        mcc = (void *) ptr; ptr += sizeof(*mcc);
892
        mcc->type = __mcc_type(cr, RFCOMM_FCON);
893
        mcc->len  = __len8(0);
894
 
895
        *ptr = __fcs(buf); ptr++;
896
 
897
        return rfcomm_send_frame(s, buf, ptr - buf);
898
}
899
 
900
static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len)
901
{
902
        struct socket *sock = s->sock;
903
        struct iovec iv[3];
904
        struct msghdr msg;
905
        unsigned char hdr[5], crc[1];
906
 
907
        if (len > 125)
908
                return -EINVAL;
909
 
910
        BT_DBG("%p cr %d", s, cr);
911
 
912
        hdr[0] = __addr(s->initiator, 0);
913
        hdr[1] = __ctrl(RFCOMM_UIH, 0);
914
        hdr[2] = 0x01 | ((len + 2) << 1);
915
        hdr[3] = 0x01 | ((cr & 0x01) << 1) | (RFCOMM_TEST << 2);
916
        hdr[4] = 0x01 | (len << 1);
917
 
918
        crc[0] = __fcs(hdr);
919
 
920
        iv[0].iov_base = hdr;
921
        iv[0].iov_len  = 5;
922
        iv[1].iov_base = pattern;
923
        iv[1].iov_len  = len;
924
        iv[2].iov_base = crc;
925
        iv[2].iov_len  = 1;
926
 
927
        memset(&msg, 0, sizeof(msg));
928
        msg.msg_iovlen = 3;
929
        msg.msg_iov = iv;
930
        return sock->ops->sendmsg(sock, &msg, 6 + len, 0);
931
}
932
 
933
static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits)
934
{
935
        struct rfcomm_hdr *hdr;
936
        u8 buf[16], *ptr = buf;
937
 
938
        BT_DBG("%p addr %d credits %d", s, addr, credits);
939
 
940
        hdr = (void *) ptr; ptr += sizeof(*hdr);
941
        hdr->addr = addr;
942
        hdr->ctrl = __ctrl(RFCOMM_UIH, 1);
943
        hdr->len  = __len8(0);
944
 
945
        *ptr = credits; ptr++;
946
 
947
        *ptr = __fcs(buf); ptr++;
948
 
949
        return rfcomm_send_frame(s, buf, ptr - buf);
950
}
951
 
952
static void rfcomm_make_uih(struct sk_buff *skb, u8 addr)
953
{
954
        struct rfcomm_hdr *hdr;
955
        int len = skb->len;
956
        u8 *crc;
957
 
958
        if (len > 127) {
959
                hdr = (void *) skb_push(skb, 4);
960
                put_unaligned(htobs(__len16(len)), (u16 *) &hdr->len);
961
        } else {
962
                hdr = (void *) skb_push(skb, 3);
963
                hdr->len = __len8(len);
964
        }
965
        hdr->addr = addr;
966
        hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
967
 
968
        crc = skb_put(skb, 1);
969
        *crc = __fcs((void *) hdr);
970
}
971
 
972
/* ---- RFCOMM frame reception ---- */
973
static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
974
{
975
        BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
976
 
977
        if (dlci) {
978
                /* Data channel */
979
                struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
980
                if (!d) {
981
                        rfcomm_send_dm(s, dlci);
982
                        return 0;
983
                }
984
 
985
                switch (d->state) {
986
                case BT_CONNECT:
987
                        rfcomm_dlc_clear_timer(d);
988
 
989
                        rfcomm_dlc_lock(d);
990
                        d->state = BT_CONNECTED;
991
                        d->state_change(d, 0);
992
                        rfcomm_dlc_unlock(d);
993
 
994
                        rfcomm_send_msc(s, 1, dlci, d->v24_sig);
995
                        break;
996
 
997
                case BT_DISCONN:
998
                        d->state = BT_CLOSED;
999
                        __rfcomm_dlc_close(d, 0);
1000
                        break;
1001
                }
1002
        } else {
1003
                /* Control channel */
1004
                switch (s->state) {
1005
                case BT_CONNECT:
1006
                        s->state = BT_CONNECTED;
1007
                        rfcomm_process_connect(s);
1008
                        break;
1009
                }
1010
        }
1011
        return 0;
1012
}
1013
 
1014
static int rfcomm_recv_dm(struct rfcomm_session *s, u8 dlci)
1015
{
1016
        int err = 0;
1017
 
1018
        BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1019
 
1020
        if (dlci) {
1021
                /* Data DLC */
1022
                struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1023
                if (d) {
1024
                        if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1025
                                err = ECONNREFUSED;
1026
                        else
1027
                                err = ECONNRESET;
1028
 
1029
                        d->state = BT_CLOSED;
1030
                        __rfcomm_dlc_close(d, err);
1031
                }
1032
        } else {
1033
                if (s->state == BT_CONNECT)
1034
                        err = ECONNREFUSED;
1035
                else
1036
                        err = ECONNRESET;
1037
 
1038
                s->state = BT_CLOSED;
1039
                rfcomm_session_close(s, err);
1040
        }
1041
        return 0;
1042
}
1043
 
1044
static int rfcomm_recv_disc(struct rfcomm_session *s, u8 dlci)
1045
{
1046
        int err = 0;
1047
 
1048
        BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1049
 
1050
        if (dlci) {
1051
                struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1052
                if (d) {
1053
                        rfcomm_send_ua(s, dlci);
1054
 
1055
                        if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1056
                                err = ECONNREFUSED;
1057
                        else
1058
                                err = ECONNRESET;
1059
 
1060
                        d->state = BT_CLOSED;
1061
                        __rfcomm_dlc_close(d, err);
1062
                } else
1063
                        rfcomm_send_dm(s, dlci);
1064
 
1065
        } else {
1066
                rfcomm_send_ua(s, 0);
1067
 
1068
                if (s->state == BT_CONNECT)
1069
                        err = ECONNREFUSED;
1070
                else
1071
                        err = ECONNRESET;
1072
 
1073
                s->state = BT_CLOSED;
1074
                rfcomm_session_close(s, err);
1075
        }
1076
 
1077
        return 0;
1078
}
1079
 
1080
static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
1081
{
1082
        struct rfcomm_dlc *d;
1083
        u8 channel;
1084
 
1085
        BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1086
 
1087
        if (!dlci) {
1088
                rfcomm_send_ua(s, 0);
1089
 
1090
                if (s->state == BT_OPEN) {
1091
                        s->state = BT_CONNECTED;
1092
                        rfcomm_process_connect(s);
1093
                }
1094
                return 0;
1095
        }
1096
 
1097
        /* Check if DLC exists */
1098
        d = rfcomm_dlc_get(s, dlci);
1099
        if (d) {
1100
                if (d->state == BT_OPEN) {
1101
                        /* DLC was previously opened by PN request */
1102
                        rfcomm_send_ua(s, dlci);
1103
 
1104
                        rfcomm_dlc_lock(d);
1105
                        d->state = BT_CONNECTED;
1106
                        d->state_change(d, 0);
1107
                        rfcomm_dlc_unlock(d);
1108
 
1109
                        rfcomm_send_msc(s, 1, dlci, d->v24_sig);
1110
                }
1111
                return 0;
1112
        }
1113
 
1114
        /* Notify socket layer about incomming connection */
1115
        channel = __srv_channel(dlci);
1116
        if (rfcomm_connect_ind(s, channel, &d)) {
1117
                d->dlci = dlci;
1118
                d->addr = __addr(s->initiator, dlci);
1119
                rfcomm_dlc_link(s, d);
1120
 
1121
                rfcomm_send_ua(s, dlci);
1122
 
1123
                rfcomm_dlc_lock(d);
1124
                d->state = BT_CONNECTED;
1125
                d->state_change(d, 0);
1126
                rfcomm_dlc_unlock(d);
1127
 
1128
                rfcomm_send_msc(s, 1, dlci, d->v24_sig);
1129
        } else {
1130
                rfcomm_send_dm(s, dlci);
1131
        }
1132
 
1133
        return 0;
1134
}
1135
 
1136
static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)
1137
{
1138
        struct rfcomm_session *s = d->session;
1139
 
1140
        BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d",
1141
                        d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits);
1142
 
1143
        if (pn->flow_ctrl == 0xf0 || pn->flow_ctrl == 0xe0) {
1144
                d->cfc = s->cfc = RFCOMM_CFC_ENABLED;
1145
                d->tx_credits = pn->credits;
1146
        } else {
1147
                d->cfc = s->cfc = RFCOMM_CFC_DISABLED;
1148
                set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1149
        }
1150
 
1151
        d->priority = pn->priority;
1152
 
1153
        d->mtu = s->mtu = btohs(pn->mtu);
1154
 
1155
        return 0;
1156
}
1157
 
1158
static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1159
{
1160
        struct rfcomm_pn *pn = (void *) skb->data;
1161
        struct rfcomm_dlc *d;
1162
        u8 dlci = pn->dlci;
1163
 
1164
        BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1165
 
1166
        if (!dlci)
1167
                return 0;
1168
 
1169
        d = rfcomm_dlc_get(s, dlci);
1170
        if (d) {
1171
                if (cr) {
1172
                        /* PN request */
1173
                        rfcomm_apply_pn(d, cr, pn);
1174
                        rfcomm_send_pn(s, 0, d);
1175
                } else {
1176
                        /* PN response */
1177
                        switch (d->state) {
1178
                        case BT_CONFIG:
1179
                                rfcomm_apply_pn(d, cr, pn);
1180
 
1181
                                d->state = BT_CONNECT;
1182
                                rfcomm_send_sabm(s, d->dlci);
1183
                                break;
1184
                        }
1185
                }
1186
        } else {
1187
                u8 channel = __srv_channel(dlci);
1188
 
1189
                if (!cr)
1190
                        return 0;
1191
 
1192
                /* PN request for non existing DLC.
1193
                 * Assume incomming connection. */
1194
                if (rfcomm_connect_ind(s, channel, &d)) {
1195
                        d->dlci = dlci;
1196
                        d->addr = __addr(s->initiator, dlci);
1197
                        rfcomm_dlc_link(s, d);
1198
 
1199
                        rfcomm_apply_pn(d, cr, pn);
1200
 
1201
                        d->state = BT_OPEN;
1202
                        rfcomm_send_pn(s, 0, d);
1203
                } else {
1204
                        rfcomm_send_dm(s, dlci);
1205
                }
1206
        }
1207
        return 0;
1208
}
1209
 
1210
static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_buff *skb)
1211
{
1212
        struct rfcomm_rpn *rpn = (void *) skb->data;
1213
        u8 dlci = __get_dlci(rpn->dlci);
1214
 
1215
        u8 bit_rate  = 0;
1216
        u8 data_bits = 0;
1217
        u8 stop_bits = 0;
1218
        u8 parity    = 0;
1219
        u8 flow_ctrl = 0;
1220
        u8 xon_char  = 0;
1221
        u8 xoff_char = 0;
1222
        u16 rpn_mask = RFCOMM_RPN_PM_ALL;
1223
 
1224
        BT_DBG("dlci %d cr %d len 0x%x bitr 0x%x line 0x%x flow 0x%x xonc 0x%x xoffc 0x%x pm 0x%x",
1225
               dlci, cr, len, rpn->bit_rate, rpn->line_settings, rpn->flow_ctrl,
1226
               rpn->xon_char, rpn->xoff_char, rpn->param_mask);
1227
 
1228
        if (!cr)
1229
                return 0;
1230
 
1231
        if (len == 1) {
1232
                /* request: return default setting */
1233
                bit_rate  = RFCOMM_RPN_BR_115200;
1234
                data_bits = RFCOMM_RPN_DATA_8;
1235
                stop_bits = RFCOMM_RPN_STOP_1;
1236
                parity    = RFCOMM_RPN_PARITY_NONE;
1237
                flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1238
                xon_char  = RFCOMM_RPN_XON_CHAR;
1239
                xoff_char = RFCOMM_RPN_XOFF_CHAR;
1240
 
1241
                goto rpn_out;
1242
        }
1243
        /* check for sane values: ignore/accept bit_rate, 8 bits, 1 stop bit, no parity,
1244
                                  no flow control lines, normal XON/XOFF chars */
1245
        if (rpn->param_mask & RFCOMM_RPN_PM_BITRATE) {
1246
                bit_rate = rpn->bit_rate;
1247
                if (bit_rate != RFCOMM_RPN_BR_115200) {
1248
                        BT_DBG("RPN bit rate mismatch 0x%x", bit_rate);
1249
                        bit_rate = RFCOMM_RPN_BR_115200;
1250
                        rpn_mask ^= RFCOMM_RPN_PM_BITRATE;
1251
                }
1252
        }
1253
        if (rpn->param_mask & RFCOMM_RPN_PM_DATA) {
1254
                data_bits = __get_rpn_data_bits(rpn->line_settings);
1255
                if (data_bits != RFCOMM_RPN_DATA_8) {
1256
                        BT_DBG("RPN data bits mismatch 0x%x", data_bits);
1257
                        data_bits = RFCOMM_RPN_DATA_8;
1258
                        rpn_mask ^= RFCOMM_RPN_PM_DATA;
1259
                }
1260
        }
1261
        if (rpn->param_mask & RFCOMM_RPN_PM_STOP) {
1262
                stop_bits = __get_rpn_stop_bits(rpn->line_settings);
1263
                if (stop_bits != RFCOMM_RPN_STOP_1) {
1264
                        BT_DBG("RPN stop bits mismatch 0x%x", stop_bits);
1265
                        stop_bits = RFCOMM_RPN_STOP_1;
1266
                        rpn_mask ^= RFCOMM_RPN_PM_STOP;
1267
                }
1268
        }
1269
        if (rpn->param_mask & RFCOMM_RPN_PM_PARITY) {
1270
                parity = __get_rpn_parity(rpn->line_settings);
1271
                if (parity != RFCOMM_RPN_PARITY_NONE) {
1272
                        BT_DBG("RPN parity mismatch 0x%x", parity);
1273
                        parity = RFCOMM_RPN_PARITY_NONE;
1274
                        rpn_mask ^= RFCOMM_RPN_PM_PARITY;
1275
                }
1276
        }
1277
        if (rpn->param_mask & RFCOMM_RPN_PM_FLOW) {
1278
                flow_ctrl = rpn->flow_ctrl;
1279
                if (flow_ctrl != RFCOMM_RPN_FLOW_NONE) {
1280
                        BT_DBG("RPN flow ctrl mismatch 0x%x", flow_ctrl);
1281
                        flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1282
                        rpn_mask ^= RFCOMM_RPN_PM_FLOW;
1283
                }
1284
        }
1285
        if (rpn->param_mask & RFCOMM_RPN_PM_XON) {
1286
                xon_char = rpn->xon_char;
1287
                if (xon_char != RFCOMM_RPN_XON_CHAR) {
1288
                        BT_DBG("RPN XON char mismatch 0x%x", xon_char);
1289
                        xon_char = RFCOMM_RPN_XON_CHAR;
1290
                        rpn_mask ^= RFCOMM_RPN_PM_XON;
1291
                }
1292
        }
1293
        if (rpn->param_mask & RFCOMM_RPN_PM_XOFF) {
1294
                xoff_char = rpn->xoff_char;
1295
                if (xoff_char != RFCOMM_RPN_XOFF_CHAR) {
1296
                        BT_DBG("RPN XOFF char mismatch 0x%x", xoff_char);
1297
                        xoff_char = RFCOMM_RPN_XOFF_CHAR;
1298
                        rpn_mask ^= RFCOMM_RPN_PM_XOFF;
1299
                }
1300
        }
1301
 
1302
rpn_out:
1303
        rfcomm_send_rpn(s, 0, dlci,
1304
                        bit_rate, data_bits, stop_bits, parity, flow_ctrl,
1305
                        xon_char, xoff_char, rpn_mask);
1306
 
1307
        return 0;
1308
}
1309
 
1310
static int rfcomm_recv_rls(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1311
{
1312
        struct rfcomm_rls *rls = (void *) skb->data;
1313
        u8 dlci = __get_dlci(rls->dlci);
1314
 
1315
        BT_DBG("dlci %d cr %d status 0x%x", dlci, cr, rls->status);
1316
 
1317
        if (!cr)
1318
                return 0;
1319
 
1320
        /* FIXME: We should probably do something with this
1321
           information here. But for now it's sufficient just
1322
           to reply -- Bluetooth 1.1 says it's mandatory to
1323
           recognise and respond to RLS */
1324
 
1325
        rfcomm_send_rls(s, 0, dlci, rls->status);
1326
 
1327
        return 0;
1328
}
1329
 
1330
static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1331
{
1332
        struct rfcomm_msc *msc = (void *) skb->data;
1333
        struct rfcomm_dlc *d;
1334
        u8 dlci = __get_dlci(msc->dlci);
1335
 
1336
        BT_DBG("dlci %d cr %d v24 0x%x", dlci, cr, msc->v24_sig);
1337
 
1338
        d = rfcomm_dlc_get(s, dlci);
1339
        if (!d)
1340
                return 0;
1341
 
1342
        if (cr) {
1343
                if (msc->v24_sig & RFCOMM_V24_FC && !d->cfc)
1344
                        set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1345
                else
1346
                        clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
1347
 
1348
                rfcomm_dlc_lock(d);
1349
                if (d->modem_status)
1350
                        d->modem_status(d, msc->v24_sig);
1351
                rfcomm_dlc_unlock(d);
1352
 
1353
                rfcomm_send_msc(s, 0, dlci, msc->v24_sig);
1354
 
1355
                d->mscex |= RFCOMM_MSCEX_RX;
1356
        } else
1357
                d->mscex |= RFCOMM_MSCEX_TX;
1358
 
1359
        return 0;
1360
}
1361
 
1362
static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
1363
{
1364
        struct rfcomm_mcc *mcc = (void *) skb->data;
1365
        u8 type, cr, len;
1366
 
1367
        cr   = __test_cr(mcc->type);
1368
        type = __get_mcc_type(mcc->type);
1369
        len  = __get_mcc_len(mcc->len);
1370
 
1371
        BT_DBG("%p type 0x%x cr %d", s, type, cr);
1372
 
1373
        skb_pull(skb, 2);
1374
 
1375
        switch (type) {
1376
        case RFCOMM_PN:
1377
                rfcomm_recv_pn(s, cr, skb);
1378
                break;
1379
 
1380
        case RFCOMM_RPN:
1381
                rfcomm_recv_rpn(s, cr, len, skb);
1382
                break;
1383
 
1384
        case RFCOMM_RLS:
1385
                rfcomm_recv_rls(s, cr, skb);
1386
                break;
1387
 
1388
        case RFCOMM_MSC:
1389
                rfcomm_recv_msc(s, cr, skb);
1390
                break;
1391
 
1392
        case RFCOMM_FCOFF:
1393
                if (cr) {
1394
                        set_bit(RFCOMM_TX_THROTTLED, &s->flags);
1395
                        rfcomm_send_fcoff(s, 0);
1396
                }
1397
                break;
1398
 
1399
        case RFCOMM_FCON:
1400
                if (cr) {
1401
                        clear_bit(RFCOMM_TX_THROTTLED, &s->flags);
1402
                        rfcomm_send_fcon(s, 0);
1403
                }
1404
                break;
1405
 
1406
        case RFCOMM_TEST:
1407
                if (cr)
1408
                        rfcomm_send_test(s, 0, skb->data, skb->len);
1409
                break;
1410
 
1411
        case RFCOMM_NSC:
1412
                break;
1413
 
1414
        default:
1415
                BT_ERR("Unknown control type 0x%02x", type);
1416
                rfcomm_send_nsc(s, cr, type);
1417
                break;
1418
        }
1419
        return 0;
1420
}
1421
 
1422
static int rfcomm_recv_data(struct rfcomm_session *s, u8 dlci, int pf, struct sk_buff *skb)
1423
{
1424
        struct rfcomm_dlc *d;
1425
 
1426
        BT_DBG("session %p state %ld dlci %d pf %d", s, s->state, dlci, pf);
1427
 
1428
        d = rfcomm_dlc_get(s, dlci);
1429
        if (!d) {
1430
                rfcomm_send_dm(s, dlci);
1431
                goto drop;
1432
        }
1433
 
1434
        if (pf && d->cfc) {
1435
                u8 credits = *(u8 *) skb->data; skb_pull(skb, 1);
1436
 
1437
                d->tx_credits += credits;
1438
                if (d->tx_credits)
1439
                        clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
1440
        }
1441
 
1442
        if (skb->len && d->state == BT_CONNECTED) {
1443
                rfcomm_dlc_lock(d);
1444
                d->rx_credits--;
1445
                d->data_ready(d, skb);
1446
                rfcomm_dlc_unlock(d);
1447
                return 0;
1448
        }
1449
 
1450
drop:
1451
        kfree_skb(skb);
1452
        return 0;
1453
}
1454
 
1455
static int rfcomm_recv_frame(struct rfcomm_session *s, struct sk_buff *skb)
1456
{
1457
        struct rfcomm_hdr *hdr = (void *) skb->data;
1458
        u8 type, dlci, fcs;
1459
 
1460
        dlci = __get_dlci(hdr->addr);
1461
        type = __get_type(hdr->ctrl);
1462
 
1463
        /* Trim FCS */
1464
        skb->len--; skb->tail--;
1465
        fcs = *(u8 *) skb->tail;
1466
 
1467
        if (__check_fcs(skb->data, type, fcs)) {
1468
                BT_ERR("bad checksum in packet");
1469
                kfree_skb(skb);
1470
                return -EILSEQ;
1471
        }
1472
 
1473
        if (__test_ea(hdr->len))
1474
                skb_pull(skb, 3);
1475
        else
1476
                skb_pull(skb, 4);
1477
 
1478
        switch (type) {
1479
        case RFCOMM_SABM:
1480
                if (__test_pf(hdr->ctrl))
1481
                        rfcomm_recv_sabm(s, dlci);
1482
                break;
1483
 
1484
        case RFCOMM_DISC:
1485
                if (__test_pf(hdr->ctrl))
1486
                        rfcomm_recv_disc(s, dlci);
1487
                break;
1488
 
1489
        case RFCOMM_UA:
1490
                if (__test_pf(hdr->ctrl))
1491
                        rfcomm_recv_ua(s, dlci);
1492
                break;
1493
 
1494
        case RFCOMM_DM:
1495
                rfcomm_recv_dm(s, dlci);
1496
                break;
1497
 
1498
        case RFCOMM_UIH:
1499
                if (dlci)
1500
                        return rfcomm_recv_data(s, dlci, __test_pf(hdr->ctrl), skb);
1501
 
1502
                rfcomm_recv_mcc(s, skb);
1503
                break;
1504
 
1505
        default:
1506
                BT_ERR("Unknown packet type 0x%02x\n", type);
1507
                break;
1508
        }
1509
        kfree_skb(skb);
1510
        return 0;
1511
}
1512
 
1513
/* ---- Connection and data processing ---- */
1514
 
1515
static void rfcomm_process_connect(struct rfcomm_session *s)
1516
{
1517
        struct rfcomm_dlc *d;
1518
        struct list_head *p, *n;
1519
 
1520
        BT_DBG("session %p state %ld", s, s->state);
1521
 
1522
        list_for_each_safe(p, n, &s->dlcs) {
1523
                d = list_entry(p, struct rfcomm_dlc, list);
1524
                if (d->state == BT_CONFIG) {
1525
                        d->mtu = s->mtu;
1526
                        rfcomm_send_pn(s, 1, d);
1527
                }
1528
        }
1529
}
1530
 
1531
/* Send data queued for the DLC.
1532
 * Return number of frames left in the queue.
1533
 */
1534
static inline int rfcomm_process_tx(struct rfcomm_dlc *d)
1535
{
1536
        struct sk_buff *skb;
1537
        int err;
1538
 
1539
        BT_DBG("dlc %p state %ld cfc %d rx_credits %d tx_credits %d",
1540
                        d, d->state, d->cfc, d->rx_credits, d->tx_credits);
1541
 
1542
        /* Send pending MSC */
1543
        if (test_and_clear_bit(RFCOMM_MSC_PENDING, &d->flags))
1544
                rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
1545
 
1546
        if (d->cfc) {
1547
                /* CFC enabled.
1548
                 * Give them some credits */
1549
                if (!test_bit(RFCOMM_RX_THROTTLED, &d->flags) &&
1550
                                d->rx_credits <= (d->cfc >> 2)) {
1551
                        rfcomm_send_credits(d->session, d->addr, d->cfc - d->rx_credits);
1552
                        d->rx_credits = d->cfc;
1553
                }
1554
        } else {
1555
                /* CFC disabled.
1556
                 * Give ourselves some credits */
1557
                d->tx_credits = 5;
1558
        }
1559
 
1560
        if (test_bit(RFCOMM_TX_THROTTLED, &d->flags))
1561
                return skb_queue_len(&d->tx_queue);
1562
 
1563
        while (d->tx_credits && (skb = skb_dequeue(&d->tx_queue))) {
1564
                err = rfcomm_send_frame(d->session, skb->data, skb->len);
1565
                if (err < 0) {
1566
                        skb_queue_head(&d->tx_queue, skb);
1567
                        break;
1568
                }
1569
                kfree_skb(skb);
1570
                d->tx_credits--;
1571
        }
1572
 
1573
        if (d->cfc && !d->tx_credits) {
1574
                /* We're out of TX credits.
1575
                 * Set TX_THROTTLED flag to avoid unnesary wakeups by dlc_send. */
1576
                set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1577
        }
1578
 
1579
        return skb_queue_len(&d->tx_queue);
1580
}
1581
 
1582
static inline void rfcomm_process_dlcs(struct rfcomm_session *s)
1583
{
1584
        struct rfcomm_dlc *d;
1585
        struct list_head *p, *n;
1586
 
1587
        BT_DBG("session %p state %ld", s, s->state);
1588
 
1589
        list_for_each_safe(p, n, &s->dlcs) {
1590
                d = list_entry(p, struct rfcomm_dlc, list);
1591
                if (test_bit(RFCOMM_TIMED_OUT, &d->flags)) {
1592
                        __rfcomm_dlc_close(d, ETIMEDOUT);
1593
                        continue;
1594
                }
1595
 
1596
                if (test_bit(RFCOMM_TX_THROTTLED, &s->flags))
1597
                        continue;
1598
 
1599
                if ((d->state == BT_CONNECTED || d->state == BT_DISCONN) &&
1600
                                d->mscex == RFCOMM_MSCEX_OK)
1601
                        rfcomm_process_tx(d);
1602
        }
1603
}
1604
 
1605
static inline void rfcomm_process_rx(struct rfcomm_session *s)
1606
{
1607
        struct socket *sock = s->sock;
1608
        struct sock *sk = sock->sk;
1609
        struct sk_buff *skb;
1610
 
1611
        BT_DBG("session %p state %ld qlen %d", s, s->state, skb_queue_len(&sk->receive_queue));
1612
 
1613
        /* Get data directly from socket receive queue without copying it. */
1614
        while ((skb = skb_dequeue(&sk->receive_queue))) {
1615
                skb_orphan(skb);
1616
                rfcomm_recv_frame(s, skb);
1617
        }
1618
 
1619
        if (sk->state == BT_CLOSED) {
1620
                if (!s->initiator)
1621
                        rfcomm_session_put(s);
1622
 
1623
                rfcomm_session_close(s, sk->err);
1624
        }
1625
}
1626
 
1627
static inline void rfcomm_accept_connection(struct rfcomm_session *s)
1628
{
1629
        struct socket *sock = s->sock, *nsock;
1630
        int err;
1631
 
1632
        /* Fast check for a new connection.
1633
         * Avoids unnesesary socket allocations. */
1634
        if (list_empty(&bluez_pi(sock->sk)->accept_q))
1635
                return;
1636
 
1637
        BT_DBG("session %p", s);
1638
 
1639
        nsock = sock_alloc();
1640
        if (!nsock)
1641
                return;
1642
 
1643
        nsock->type = sock->type;
1644
        nsock->ops  = sock->ops;
1645
 
1646
        err = sock->ops->accept(sock, nsock, O_NONBLOCK);
1647
        if (err < 0) {
1648
                sock_release(nsock);
1649
                return;
1650
        }
1651
 
1652
        /* Set our callbacks */
1653
        nsock->sk->data_ready   = rfcomm_l2data_ready;
1654
        nsock->sk->state_change = rfcomm_l2state_change;
1655
 
1656
        s = rfcomm_session_add(nsock, BT_OPEN);
1657
        if (s) {
1658
                rfcomm_session_hold(s);
1659
                rfcomm_schedule(RFCOMM_SCHED_RX);
1660
        } else
1661
                sock_release(nsock);
1662
}
1663
 
1664
static inline void rfcomm_check_connection(struct rfcomm_session *s)
1665
{
1666
        struct sock *sk = s->sock->sk;
1667
 
1668
        BT_DBG("%p state %ld", s, s->state);
1669
 
1670
        switch(sk->state) {
1671
        case BT_CONNECTED:
1672
                s->state = BT_CONNECT;
1673
 
1674
                /* We can adjust MTU on outgoing sessions.
1675
                 * L2CAP MTU minus UIH header and FCS. */
1676
                s->mtu = min(l2cap_pi(sk)->omtu, l2cap_pi(sk)->imtu) - 5;
1677
 
1678
                rfcomm_send_sabm(s, 0);
1679
                break;
1680
 
1681
        case BT_CLOSED:
1682
                s->state = BT_CLOSED;
1683
                rfcomm_session_close(s, sk->err);
1684
                break;
1685
        }
1686
}
1687
 
1688
static inline void rfcomm_process_sessions(void)
1689
{
1690
        struct list_head *p, *n;
1691
 
1692
        rfcomm_lock();
1693
 
1694
        list_for_each_safe(p, n, &session_list) {
1695
                struct rfcomm_session *s;
1696
                s = list_entry(p, struct rfcomm_session, list);
1697
 
1698
                if (s->state == BT_LISTEN) {
1699
                        rfcomm_accept_connection(s);
1700
                        continue;
1701
                }
1702
 
1703
                rfcomm_session_hold(s);
1704
 
1705
                switch (s->state) {
1706
                case BT_BOUND:
1707
                        rfcomm_check_connection(s);
1708
                        break;
1709
 
1710
                default:
1711
                        rfcomm_process_rx(s);
1712
                        break;
1713
                }
1714
 
1715
                rfcomm_process_dlcs(s);
1716
 
1717
                rfcomm_session_put(s);
1718
        }
1719
 
1720
        rfcomm_unlock();
1721
}
1722
 
1723
static void rfcomm_worker(void)
1724
{
1725
        BT_DBG("");
1726
 
1727
        daemonize(); reparent_to_init();
1728
        set_fs(KERNEL_DS);
1729
 
1730
        while (!atomic_read(&terminate)) {
1731
                BT_DBG("worker loop event 0x%lx", rfcomm_event);
1732
 
1733
                if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) {
1734
                        /* No pending events. Let's sleep.
1735
                         * Incomming connections and data will wake us up. */
1736
                        set_current_state(TASK_INTERRUPTIBLE);
1737
                        schedule();
1738
                }
1739
 
1740
                /* Process stuff */
1741
                clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event);
1742
                rfcomm_process_sessions();
1743
        }
1744
        set_current_state(TASK_RUNNING);
1745
        return;
1746
}
1747
 
1748
static int rfcomm_add_listener(bdaddr_t *ba)
1749
{
1750
        struct sockaddr_l2 addr;
1751
        struct l2cap_options opts;
1752
        struct socket *sock;
1753
        struct rfcomm_session *s;
1754
        int    size, err = 0;
1755
 
1756
        /* Create socket */
1757
        err = rfcomm_l2sock_create(&sock);
1758
        if (err < 0) {
1759
                BT_ERR("Create socket failed %d", err);
1760
                return err;
1761
        }
1762
 
1763
        /* Bind socket */
1764
        bacpy(&addr.l2_bdaddr, ba);
1765
        addr.l2_family = AF_BLUETOOTH;
1766
        addr.l2_psm    = htobs(RFCOMM_PSM);
1767
        err = sock->ops->bind(sock, (struct sockaddr *) &addr, sizeof(addr));
1768
        if (err < 0) {
1769
                BT_ERR("Bind failed %d", err);
1770
                goto failed;
1771
        }
1772
 
1773
        /* Set L2CAP options */
1774
        size = sizeof(opts);
1775
        sock->ops->getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, (void *)&opts, &size);
1776
 
1777
        opts.imtu = RFCOMM_MAX_L2CAP_MTU;
1778
        sock->ops->setsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, (void *)&opts, size);
1779
 
1780
        /* Start listening on the socket */
1781
        err = sock->ops->listen(sock, 10);
1782
        if (err) {
1783
                BT_ERR("Listen failed %d", err);
1784
                goto failed;
1785
        }
1786
 
1787
        /* Add listening session */
1788
        s = rfcomm_session_add(sock, BT_LISTEN);
1789
        if (!s)
1790
                goto failed;
1791
 
1792
        rfcomm_session_hold(s);
1793
        return 0;
1794
failed:
1795
        sock_release(sock);
1796
        return err;
1797
}
1798
 
1799
static void rfcomm_kill_listener(void)
1800
{
1801
        struct rfcomm_session *s;
1802
        struct list_head *p, *n;
1803
 
1804
        BT_DBG("");
1805
 
1806
        list_for_each_safe(p, n, &session_list) {
1807
                s = list_entry(p, struct rfcomm_session, list);
1808
                rfcomm_session_del(s);
1809
        }
1810
}
1811
 
1812
static int rfcomm_run(void *unused)
1813
{
1814
        rfcomm_thread = current;
1815
 
1816
        atomic_inc(&running);
1817
 
1818
        daemonize(); reparent_to_init();
1819
 
1820
        sigfillset(&current->blocked);
1821
        set_fs(KERNEL_DS);
1822
 
1823
        sprintf(current->comm, "krfcommd");
1824
 
1825
        BT_DBG("");
1826
 
1827
        rfcomm_add_listener(BDADDR_ANY);
1828
 
1829
        rfcomm_worker();
1830
 
1831
        rfcomm_kill_listener();
1832
 
1833
        atomic_dec(&running);
1834
        return 0;
1835
}
1836
 
1837
/* ---- Proc fs support ---- */
1838
static int rfcomm_dlc_dump(char *buf)
1839
{
1840
        struct rfcomm_session *s;
1841
        struct sock *sk;
1842
        struct list_head *p, *pp;
1843
        char *ptr = buf;
1844
 
1845
        rfcomm_lock();
1846
 
1847
        list_for_each(p, &session_list) {
1848
                s = list_entry(p, struct rfcomm_session, list);
1849
                sk = s->sock->sk;
1850
 
1851
                list_for_each(pp, &s->dlcs) {
1852
                struct rfcomm_dlc *d;
1853
                        d = list_entry(pp, struct rfcomm_dlc, list);
1854
 
1855
                        ptr += sprintf(ptr, "dlc %s %s %ld %d %d %d %d\n",
1856
                                batostr(&bluez_pi(sk)->src), batostr(&bluez_pi(sk)->dst),
1857
                                d->state, d->dlci, d->mtu, d->rx_credits, d->tx_credits);
1858
                }
1859
        }
1860
 
1861
        rfcomm_unlock();
1862
 
1863
        return ptr - buf;
1864
}
1865
 
1866
extern int rfcomm_sock_dump(char *buf);
1867
 
1868
static int rfcomm_read_proc(char *buf, char **start, off_t offset, int count, int *eof, void *priv)
1869
{
1870
        char *ptr = buf;
1871
        int len;
1872
 
1873
        BT_DBG("count %d, offset %ld", count, offset);
1874
 
1875
        ptr += rfcomm_dlc_dump(ptr);
1876
        ptr += rfcomm_sock_dump(ptr);
1877
        len  = ptr - buf;
1878
 
1879
        if (len <= count + offset)
1880
                *eof = 1;
1881
 
1882
        *start = buf + offset;
1883
        len -= offset;
1884
 
1885
        if (len > count)
1886
                len = count;
1887
        if (len < 0)
1888
                len = 0;
1889
 
1890
        return len;
1891
}
1892
 
1893
/* ---- Initialization ---- */
1894
int __init rfcomm_init(void)
1895
{
1896
        l2cap_load();
1897
 
1898
        kernel_thread(rfcomm_run, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
1899
 
1900
        rfcomm_init_sockets();
1901
 
1902
#ifdef CONFIG_BLUEZ_RFCOMM_TTY
1903
        rfcomm_init_ttys();
1904
#endif
1905
 
1906
        create_proc_read_entry("bluetooth/rfcomm", 0, 0, rfcomm_read_proc, NULL);
1907
 
1908
        BT_INFO("BlueZ RFCOMM ver %s", VERSION);
1909
        BT_INFO("Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>");
1910
        BT_INFO("Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>");
1911
        return 0;
1912
}
1913
 
1914
void rfcomm_cleanup(void)
1915
{
1916
        /* Terminate working thread.
1917
         * ie. Set terminate flag and wake it up */
1918
        atomic_inc(&terminate);
1919
        rfcomm_schedule(RFCOMM_SCHED_STATE);
1920
 
1921
        /* Wait until thread is running */
1922
        while (atomic_read(&running))
1923
                schedule();
1924
 
1925
        remove_proc_entry("bluetooth/rfcomm", NULL);
1926
 
1927
#ifdef CONFIG_BLUEZ_RFCOMM_TTY
1928
        rfcomm_cleanup_ttys();
1929
#endif
1930
 
1931
        rfcomm_cleanup_sockets();
1932
        return;
1933
}
1934
 
1935
module_init(rfcomm_init);
1936
module_exit(rfcomm_cleanup);
1937
 
1938
MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
1939
MODULE_DESCRIPTION("BlueZ RFCOMM ver " VERSION);
1940
MODULE_LICENSE("GPL");

powered by: WebSVN 2.1.0

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