blob: edee49e00fbfa4054ce8cba4c1434a1b1cec978b [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 RFCOMM implementation for Linux Bluetooth stack (BlueZ).
3 Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
4 Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License version 2 as
8 published by the Free Software Foundation;
9
10 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
11 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
13 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090014 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
15 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070017 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
20 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070021 SOFTWARE IS DISCLAIMED.
22*/
23
Linus Torvalds1da177e2005-04-16 15:20:36 -070024/*
25 * Bluetooth RFCOMM core.
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 */
27
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <linux/module.h>
29#include <linux/errno.h>
30#include <linux/kernel.h>
31#include <linux/sched.h>
32#include <linux/signal.h>
33#include <linux/init.h>
34#include <linux/wait.h>
Marcel Holtmannbe9d1222005-11-08 09:57:38 -080035#include <linux/device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#include <linux/net.h>
Arjan van de Ven4a3e2f72006-03-20 22:33:17 -080037#include <linux/mutex.h>
Marcel Holtmanna524ecc2007-10-20 21:37:20 +020038#include <linux/kthread.h>
Arjan van de Ven4a3e2f72006-03-20 22:33:17 -080039
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include <net/sock.h>
41#include <asm/uaccess.h>
42#include <asm/unaligned.h>
43
44#include <net/bluetooth/bluetooth.h>
45#include <net/bluetooth/hci_core.h>
46#include <net/bluetooth/l2cap.h>
47#include <net/bluetooth/rfcomm.h>
48
Marcel Holtmanna0c22f22008-07-14 20:13:52 +020049#define VERSION "1.10"
Marcel Holtmann56f3a402006-02-13 11:39:57 +010050
Marcel Holtmann7c2660b2006-07-03 10:02:51 +020051static int disable_cfc = 0;
Marcel Holtmann98bcd082006-07-14 11:42:12 +020052static int channel_mtu = -1;
Marcel Holtmann56f3a402006-02-13 11:39:57 +010053static unsigned int l2cap_mtu = RFCOMM_MAX_L2CAP_MTU;
54
Linus Torvalds1da177e2005-04-16 15:20:36 -070055static struct task_struct *rfcomm_thread;
56
Arjan van de Ven4a3e2f72006-03-20 22:33:17 -080057static DEFINE_MUTEX(rfcomm_mutex);
58#define rfcomm_lock() mutex_lock(&rfcomm_mutex)
59#define rfcomm_unlock() mutex_unlock(&rfcomm_mutex)
Linus Torvalds1da177e2005-04-16 15:20:36 -070060
61static unsigned long rfcomm_event;
62
63static LIST_HEAD(session_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -070064
65static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len);
66static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci);
67static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci);
68static int rfcomm_queue_disc(struct rfcomm_dlc *d);
69static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type);
70static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d);
71static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig);
72static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len);
73static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits);
74static void rfcomm_make_uih(struct sk_buff *skb, u8 addr);
75
76static void rfcomm_process_connect(struct rfcomm_session *s);
77
78static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err);
79static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst);
80static void rfcomm_session_del(struct rfcomm_session *s);
81
82/* ---- RFCOMM frame parsing macros ---- */
83#define __get_dlci(b) ((b & 0xfc) >> 2)
84#define __get_channel(b) ((b & 0xf8) >> 3)
85#define __get_dir(b) ((b & 0x04) >> 2)
86#define __get_type(b) ((b & 0xef))
87
88#define __test_ea(b) ((b & 0x01))
89#define __test_cr(b) ((b & 0x02))
90#define __test_pf(b) ((b & 0x10))
91
92#define __addr(cr, dlci) (((dlci & 0x3f) << 2) | (cr << 1) | 0x01)
93#define __ctrl(type, pf) (((type & 0xef) | (pf << 4)))
94#define __dlci(dir, chn) (((chn & 0x1f) << 1) | dir)
95#define __srv_channel(dlci) (dlci >> 1)
96#define __dir(dlci) (dlci & 0x01)
97
98#define __len8(len) (((len) << 1) | 1)
99#define __len16(len) ((len) << 1)
100
101/* MCC macros */
102#define __mcc_type(cr, type) (((type << 2) | (cr << 1) | 0x01))
103#define __get_mcc_type(b) ((b & 0xfc) >> 2)
104#define __get_mcc_len(b) ((b & 0xfe) >> 1)
105
106/* RPN macros */
J. Suter3a5e9032005-08-09 20:28:46 -0700107#define __rpn_line_settings(data, stop, parity) ((data & 0x3) | ((stop & 0x1) << 2) | ((parity & 0x7) << 3))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108#define __get_rpn_data_bits(line) ((line) & 0x3)
109#define __get_rpn_stop_bits(line) (((line) >> 2) & 0x1)
J. Suter3a5e9032005-08-09 20:28:46 -0700110#define __get_rpn_parity(line) (((line) >> 3) & 0x7)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111
112static inline void rfcomm_schedule(uint event)
113{
114 if (!rfcomm_thread)
115 return;
116 //set_bit(event, &rfcomm_event);
117 set_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event);
118 wake_up_process(rfcomm_thread);
119}
120
121static inline void rfcomm_session_put(struct rfcomm_session *s)
122{
123 if (atomic_dec_and_test(&s->refcnt))
124 rfcomm_session_del(s);
125}
126
127/* ---- RFCOMM FCS computation ---- */
128
Marcel Holtmann408c1ce2005-10-28 19:20:36 +0200129/* reversed, 8-bit, poly=0x07 */
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900130static unsigned char rfcomm_crc_table[256] = {
Marcel Holtmann408c1ce2005-10-28 19:20:36 +0200131 0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75,
132 0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,
133 0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69,
134 0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67,
135
136 0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d,
137 0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43,
138 0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51,
139 0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f,
140
141 0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05,
142 0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b,
143 0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19,
144 0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17,
145
146 0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d,
147 0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33,
148 0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21,
149 0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f,
150
151 0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95,
152 0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b,
153 0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89,
154 0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87,
155
156 0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad,
157 0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3,
158 0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1,
159 0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf,
160
161 0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5,
162 0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb,
163 0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9,
164 0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7,
165
166 0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd,
167 0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3,
168 0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1,
169 0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf
170};
171
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172/* CRC on 2 bytes */
173#define __crc(data) (rfcomm_crc_table[rfcomm_crc_table[0xff ^ data[0]] ^ data[1]])
174
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900175/* FCS on 2 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176static inline u8 __fcs(u8 *data)
177{
178 return (0xff - __crc(data));
179}
180
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900181/* FCS on 3 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182static inline u8 __fcs2(u8 *data)
183{
184 return (0xff - rfcomm_crc_table[__crc(data) ^ data[2]]);
185}
186
187/* Check FCS */
188static inline int __check_fcs(u8 *data, int type, u8 fcs)
189{
190 u8 f = __crc(data);
191
192 if (type != RFCOMM_UIH)
193 f = rfcomm_crc_table[f ^ data[2]];
194
195 return rfcomm_crc_table[f ^ fcs] != 0xcf;
196}
197
198/* ---- L2CAP callbacks ---- */
199static void rfcomm_l2state_change(struct sock *sk)
200{
201 BT_DBG("%p state %d", sk, sk->sk_state);
202 rfcomm_schedule(RFCOMM_SCHED_STATE);
203}
204
205static void rfcomm_l2data_ready(struct sock *sk, int bytes)
206{
207 BT_DBG("%p bytes %d", sk, bytes);
208 rfcomm_schedule(RFCOMM_SCHED_RX);
209}
210
211static int rfcomm_l2sock_create(struct socket **sock)
212{
213 int err;
214
215 BT_DBG("");
216
217 err = sock_create_kern(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP, sock);
218 if (!err) {
219 struct sock *sk = (*sock)->sk;
220 sk->sk_data_ready = rfcomm_l2data_ready;
221 sk->sk_state_change = rfcomm_l2state_change;
222 }
223 return err;
224}
225
Marcel Holtmann77db1982008-07-14 20:13:45 +0200226static inline int rfcomm_check_link_mode(struct rfcomm_dlc *d)
227{
228 struct sock *sk = d->session->sock->sk;
229
230 if (d->link_mode & (RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE)) {
231 if (!hci_conn_encrypt(l2cap_pi(sk)->conn->hcon))
232 return 1;
233 } else if (d->link_mode & RFCOMM_LM_AUTH) {
234 if (!hci_conn_auth(l2cap_pi(sk)->conn->hcon))
235 return 1;
236 }
237
238 return 0;
239}
240
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241/* ---- RFCOMM DLCs ---- */
242static void rfcomm_dlc_timeout(unsigned long arg)
243{
244 struct rfcomm_dlc *d = (void *) arg;
245
246 BT_DBG("dlc %p state %ld", d, d->state);
247
248 set_bit(RFCOMM_TIMED_OUT, &d->flags);
249 rfcomm_dlc_put(d);
250 rfcomm_schedule(RFCOMM_SCHED_TIMEO);
251}
252
253static void rfcomm_dlc_set_timer(struct rfcomm_dlc *d, long timeout)
254{
255 BT_DBG("dlc %p state %ld timeout %ld", d, d->state, timeout);
256
257 if (!mod_timer(&d->timer, jiffies + timeout))
258 rfcomm_dlc_hold(d);
259}
260
261static void rfcomm_dlc_clear_timer(struct rfcomm_dlc *d)
262{
263 BT_DBG("dlc %p state %ld", d, d->state);
264
265 if (timer_pending(&d->timer) && del_timer(&d->timer))
266 rfcomm_dlc_put(d);
267}
268
269static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
270{
271 BT_DBG("%p", d);
272
273 d->state = BT_OPEN;
274 d->flags = 0;
275 d->mscex = 0;
276 d->mtu = RFCOMM_DEFAULT_MTU;
277 d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;
278
279 d->cfc = RFCOMM_CFC_DISABLED;
280 d->rx_credits = RFCOMM_DEFAULT_CREDITS;
281}
282
Al Virodd0fc662005-10-07 07:46:04 +0100283struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284{
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200285 struct rfcomm_dlc *d = kzalloc(sizeof(*d), prio);
286
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 if (!d)
288 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800290 setup_timer(&d->timer, rfcomm_dlc_timeout, (unsigned long)d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291
292 skb_queue_head_init(&d->tx_queue);
293 spin_lock_init(&d->lock);
294 atomic_set(&d->refcnt, 1);
295
296 rfcomm_dlc_clear_state(d);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900297
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298 BT_DBG("%p", d);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200299
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300 return d;
301}
302
303void rfcomm_dlc_free(struct rfcomm_dlc *d)
304{
305 BT_DBG("%p", d);
306
307 skb_queue_purge(&d->tx_queue);
308 kfree(d);
309}
310
311static void rfcomm_dlc_link(struct rfcomm_session *s, struct rfcomm_dlc *d)
312{
313 BT_DBG("dlc %p session %p", d, s);
314
315 rfcomm_session_hold(s);
316
317 rfcomm_dlc_hold(d);
318 list_add(&d->list, &s->dlcs);
319 d->session = s;
320}
321
322static void rfcomm_dlc_unlink(struct rfcomm_dlc *d)
323{
324 struct rfcomm_session *s = d->session;
325
326 BT_DBG("dlc %p refcnt %d session %p", d, atomic_read(&d->refcnt), s);
327
328 list_del(&d->list);
329 d->session = NULL;
330 rfcomm_dlc_put(d);
331
332 rfcomm_session_put(s);
333}
334
335static struct rfcomm_dlc *rfcomm_dlc_get(struct rfcomm_session *s, u8 dlci)
336{
337 struct rfcomm_dlc *d;
338 struct list_head *p;
339
340 list_for_each(p, &s->dlcs) {
341 d = list_entry(p, struct rfcomm_dlc, list);
342 if (d->dlci == dlci)
343 return d;
344 }
345 return NULL;
346}
347
348static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
349{
350 struct rfcomm_session *s;
351 int err = 0;
352 u8 dlci;
353
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900354 BT_DBG("dlc %p state %ld %s %s channel %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355 d, d->state, batostr(src), batostr(dst), channel);
356
357 if (channel < 1 || channel > 30)
358 return -EINVAL;
359
360 if (d->state != BT_OPEN && d->state != BT_CLOSED)
361 return 0;
362
363 s = rfcomm_session_get(src, dst);
364 if (!s) {
365 s = rfcomm_session_create(src, dst, &err);
366 if (!s)
367 return err;
368 }
369
370 dlci = __dlci(!s->initiator, channel);
371
372 /* Check if DLCI already exists */
373 if (rfcomm_dlc_get(s, dlci))
374 return -EBUSY;
375
376 rfcomm_dlc_clear_state(d);
377
378 d->dlci = dlci;
379 d->addr = __addr(s->initiator, dlci);
380 d->priority = 7;
381
Marcel Holtmann77db1982008-07-14 20:13:45 +0200382 d->state = BT_CONFIG;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383 rfcomm_dlc_link(s, d);
384
Marcel Holtmann77db1982008-07-14 20:13:45 +0200385 d->out = 1;
386
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 d->mtu = s->mtu;
388 d->cfc = (s->cfc == RFCOMM_CFC_UNKNOWN) ? 0 : s->cfc;
389
Marcel Holtmann77db1982008-07-14 20:13:45 +0200390 if (s->state == BT_CONNECTED) {
391 if (rfcomm_check_link_mode(d))
392 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
393 else
394 rfcomm_send_pn(s, 1, d);
395 }
396
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397 rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
Marcel Holtmann77db1982008-07-14 20:13:45 +0200398
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399 return 0;
400}
401
402int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
403{
404 int r;
405
406 rfcomm_lock();
407
408 r = __rfcomm_dlc_open(d, src, dst, channel);
409
410 rfcomm_unlock();
411 return r;
412}
413
414static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
415{
416 struct rfcomm_session *s = d->session;
417 if (!s)
418 return 0;
419
420 BT_DBG("dlc %p state %ld dlci %d err %d session %p",
421 d, d->state, d->dlci, err, s);
422
423 switch (d->state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424 case BT_CONNECT:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100425 case BT_CONFIG:
426 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
427 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
428 rfcomm_schedule(RFCOMM_SCHED_AUTH);
429 break;
430 }
431 /* Fall through */
432
433 case BT_CONNECTED:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700434 d->state = BT_DISCONN;
435 if (skb_queue_empty(&d->tx_queue)) {
436 rfcomm_send_disc(s, d->dlci);
437 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT);
438 } else {
439 rfcomm_queue_disc(d);
440 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT * 2);
441 }
442 break;
443
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100444 case BT_OPEN:
445 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
446 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
447 rfcomm_schedule(RFCOMM_SCHED_AUTH);
448 break;
449 }
450 /* Fall through */
451
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 default:
453 rfcomm_dlc_clear_timer(d);
454
455 rfcomm_dlc_lock(d);
456 d->state = BT_CLOSED;
Dave Young1905f6c2008-04-01 23:59:06 -0700457 d->state_change(d, err);
Arjan van de Ven4c8411f2008-05-29 01:32:47 -0700458 rfcomm_dlc_unlock(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459
460 skb_queue_purge(&d->tx_queue);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 rfcomm_dlc_unlink(d);
462 }
463
464 return 0;
465}
466
467int rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
468{
469 int r;
470
471 rfcomm_lock();
472
473 r = __rfcomm_dlc_close(d, err);
474
475 rfcomm_unlock();
476 return r;
477}
478
479int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb)
480{
481 int len = skb->len;
482
483 if (d->state != BT_CONNECTED)
484 return -ENOTCONN;
485
486 BT_DBG("dlc %p mtu %d len %d", d, d->mtu, len);
487
488 if (len > d->mtu)
489 return -EINVAL;
490
491 rfcomm_make_uih(skb, d->addr);
492 skb_queue_tail(&d->tx_queue, skb);
493
494 if (!test_bit(RFCOMM_TX_THROTTLED, &d->flags))
495 rfcomm_schedule(RFCOMM_SCHED_TX);
496 return len;
497}
498
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800499void __rfcomm_dlc_throttle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500{
501 BT_DBG("dlc %p state %ld", d, d->state);
502
503 if (!d->cfc) {
504 d->v24_sig |= RFCOMM_V24_FC;
505 set_bit(RFCOMM_MSC_PENDING, &d->flags);
506 }
507 rfcomm_schedule(RFCOMM_SCHED_TX);
508}
509
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800510void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511{
512 BT_DBG("dlc %p state %ld", d, d->state);
513
514 if (!d->cfc) {
515 d->v24_sig &= ~RFCOMM_V24_FC;
516 set_bit(RFCOMM_MSC_PENDING, &d->flags);
517 }
518 rfcomm_schedule(RFCOMM_SCHED_TX);
519}
520
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900521/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 Set/get modem status functions use _local_ status i.e. what we report
523 to the other side.
524 Remote status is provided by dlc->modem_status() callback.
525 */
526int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
527{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900528 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 d, d->state, v24_sig);
530
531 if (test_bit(RFCOMM_RX_THROTTLED, &d->flags))
532 v24_sig |= RFCOMM_V24_FC;
533 else
534 v24_sig &= ~RFCOMM_V24_FC;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900535
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 d->v24_sig = v24_sig;
537
538 if (!test_and_set_bit(RFCOMM_MSC_PENDING, &d->flags))
539 rfcomm_schedule(RFCOMM_SCHED_TX);
540
541 return 0;
542}
543
544int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig)
545{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900546 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 d, d->state, d->v24_sig);
548
549 *v24_sig = d->v24_sig;
550 return 0;
551}
552
553/* ---- RFCOMM sessions ---- */
554static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state)
555{
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200556 struct rfcomm_session *s = kzalloc(sizeof(*s), GFP_KERNEL);
557
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 if (!s)
559 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560
561 BT_DBG("session %p sock %p", s, sock);
562
563 INIT_LIST_HEAD(&s->dlcs);
564 s->state = state;
565 s->sock = sock;
566
567 s->mtu = RFCOMM_DEFAULT_MTU;
Marcel Holtmann7c2660b2006-07-03 10:02:51 +0200568 s->cfc = disable_cfc ? RFCOMM_CFC_DISABLED : RFCOMM_CFC_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
570 /* Do not increment module usage count for listening sessions.
571 * Otherwise we won't be able to unload the module. */
572 if (state != BT_LISTEN)
573 if (!try_module_get(THIS_MODULE)) {
574 kfree(s);
575 return NULL;
576 }
577
578 list_add(&s->list, &session_list);
579
580 return s;
581}
582
583static void rfcomm_session_del(struct rfcomm_session *s)
584{
585 int state = s->state;
586
587 BT_DBG("session %p state %ld", s, s->state);
588
589 list_del(&s->list);
590
591 if (state == BT_CONNECTED)
592 rfcomm_send_disc(s, 0);
593
594 sock_release(s->sock);
595 kfree(s);
596
597 if (state != BT_LISTEN)
598 module_put(THIS_MODULE);
599}
600
601static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst)
602{
603 struct rfcomm_session *s;
604 struct list_head *p, *n;
605 struct bt_sock *sk;
606 list_for_each_safe(p, n, &session_list) {
607 s = list_entry(p, struct rfcomm_session, list);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900608 sk = bt_sk(s->sock->sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609
610 if ((!bacmp(src, BDADDR_ANY) || !bacmp(&sk->src, src)) &&
611 !bacmp(&sk->dst, dst))
612 return s;
613 }
614 return NULL;
615}
616
617static void rfcomm_session_close(struct rfcomm_session *s, int err)
618{
619 struct rfcomm_dlc *d;
620 struct list_head *p, *n;
621
622 BT_DBG("session %p state %ld err %d", s, s->state, err);
623
624 rfcomm_session_hold(s);
625
626 s->state = BT_CLOSED;
627
628 /* Close all dlcs */
629 list_for_each_safe(p, n, &s->dlcs) {
630 d = list_entry(p, struct rfcomm_dlc, list);
631 d->state = BT_CLOSED;
632 __rfcomm_dlc_close(d, err);
633 }
634
635 rfcomm_session_put(s);
636}
637
638static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err)
639{
640 struct rfcomm_session *s = NULL;
641 struct sockaddr_l2 addr;
642 struct socket *sock;
643 struct sock *sk;
644
645 BT_DBG("%s %s", batostr(src), batostr(dst));
646
647 *err = rfcomm_l2sock_create(&sock);
648 if (*err < 0)
649 return NULL;
650
651 bacpy(&addr.l2_bdaddr, src);
652 addr.l2_family = AF_BLUETOOTH;
653 addr.l2_psm = 0;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200654 *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 if (*err < 0)
656 goto failed;
657
658 /* Set L2CAP options */
659 sk = sock->sk;
660 lock_sock(sk);
Marcel Holtmann56f3a402006-02-13 11:39:57 +0100661 l2cap_pi(sk)->imtu = l2cap_mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 release_sock(sk);
663
664 s = rfcomm_session_add(sock, BT_BOUND);
665 if (!s) {
666 *err = -ENOMEM;
667 goto failed;
668 }
669
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 s->initiator = 1;
671
672 bacpy(&addr.l2_bdaddr, dst);
673 addr.l2_family = AF_BLUETOOTH;
674 addr.l2_psm = htobs(RFCOMM_PSM);
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200675 *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
Marcel Holtmannb4c612a2006-09-23 09:54:38 +0200676 if (*err == 0 || *err == -EINPROGRESS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 return s;
678
679 rfcomm_session_del(s);
680 return NULL;
681
682failed:
683 sock_release(sock);
684 return NULL;
685}
686
687void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst)
688{
689 struct sock *sk = s->sock->sk;
690 if (src)
691 bacpy(src, &bt_sk(sk)->src);
692 if (dst)
693 bacpy(dst, &bt_sk(sk)->dst);
694}
695
696/* ---- RFCOMM frame sending ---- */
697static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len)
698{
699 struct socket *sock = s->sock;
700 struct kvec iv = { data, len };
701 struct msghdr msg;
702
703 BT_DBG("session %p len %d", s, len);
704
705 memset(&msg, 0, sizeof(msg));
706
707 return kernel_sendmsg(sock, &msg, &iv, 1, len);
708}
709
710static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci)
711{
712 struct rfcomm_cmd cmd;
713
714 BT_DBG("%p dlci %d", s, dlci);
715
716 cmd.addr = __addr(s->initiator, dlci);
717 cmd.ctrl = __ctrl(RFCOMM_SABM, 1);
718 cmd.len = __len8(0);
719 cmd.fcs = __fcs2((u8 *) &cmd);
720
721 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
722}
723
724static int rfcomm_send_ua(struct rfcomm_session *s, u8 dlci)
725{
726 struct rfcomm_cmd cmd;
727
728 BT_DBG("%p dlci %d", s, dlci);
729
730 cmd.addr = __addr(!s->initiator, dlci);
731 cmd.ctrl = __ctrl(RFCOMM_UA, 1);
732 cmd.len = __len8(0);
733 cmd.fcs = __fcs2((u8 *) &cmd);
734
735 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
736}
737
738static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci)
739{
740 struct rfcomm_cmd cmd;
741
742 BT_DBG("%p dlci %d", s, dlci);
743
744 cmd.addr = __addr(s->initiator, dlci);
745 cmd.ctrl = __ctrl(RFCOMM_DISC, 1);
746 cmd.len = __len8(0);
747 cmd.fcs = __fcs2((u8 *) &cmd);
748
749 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
750}
751
752static int rfcomm_queue_disc(struct rfcomm_dlc *d)
753{
754 struct rfcomm_cmd *cmd;
755 struct sk_buff *skb;
756
757 BT_DBG("dlc %p dlci %d", d, d->dlci);
758
759 skb = alloc_skb(sizeof(*cmd), GFP_KERNEL);
760 if (!skb)
761 return -ENOMEM;
762
763 cmd = (void *) __skb_put(skb, sizeof(*cmd));
764 cmd->addr = d->addr;
765 cmd->ctrl = __ctrl(RFCOMM_DISC, 1);
766 cmd->len = __len8(0);
767 cmd->fcs = __fcs2((u8 *) cmd);
768
769 skb_queue_tail(&d->tx_queue, skb);
770 rfcomm_schedule(RFCOMM_SCHED_TX);
771 return 0;
772}
773
774static int rfcomm_send_dm(struct rfcomm_session *s, u8 dlci)
775{
776 struct rfcomm_cmd cmd;
777
778 BT_DBG("%p dlci %d", s, dlci);
779
780 cmd.addr = __addr(!s->initiator, dlci);
781 cmd.ctrl = __ctrl(RFCOMM_DM, 1);
782 cmd.len = __len8(0);
783 cmd.fcs = __fcs2((u8 *) &cmd);
784
785 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
786}
787
788static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type)
789{
790 struct rfcomm_hdr *hdr;
791 struct rfcomm_mcc *mcc;
792 u8 buf[16], *ptr = buf;
793
794 BT_DBG("%p cr %d type %d", s, cr, type);
795
796 hdr = (void *) ptr; ptr += sizeof(*hdr);
797 hdr->addr = __addr(s->initiator, 0);
798 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
799 hdr->len = __len8(sizeof(*mcc) + 1);
800
801 mcc = (void *) ptr; ptr += sizeof(*mcc);
802 mcc->type = __mcc_type(cr, RFCOMM_NSC);
803 mcc->len = __len8(1);
804
805 /* Type that we didn't like */
806 *ptr = __mcc_type(cr, type); ptr++;
807
808 *ptr = __fcs(buf); ptr++;
809
810 return rfcomm_send_frame(s, buf, ptr - buf);
811}
812
813static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d)
814{
815 struct rfcomm_hdr *hdr;
816 struct rfcomm_mcc *mcc;
817 struct rfcomm_pn *pn;
818 u8 buf[16], *ptr = buf;
819
820 BT_DBG("%p cr %d dlci %d mtu %d", s, cr, d->dlci, d->mtu);
821
822 hdr = (void *) ptr; ptr += sizeof(*hdr);
823 hdr->addr = __addr(s->initiator, 0);
824 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
825 hdr->len = __len8(sizeof(*mcc) + sizeof(*pn));
826
827 mcc = (void *) ptr; ptr += sizeof(*mcc);
828 mcc->type = __mcc_type(cr, RFCOMM_PN);
829 mcc->len = __len8(sizeof(*pn));
830
831 pn = (void *) ptr; ptr += sizeof(*pn);
832 pn->dlci = d->dlci;
833 pn->priority = d->priority;
834 pn->ack_timer = 0;
835 pn->max_retrans = 0;
836
837 if (s->cfc) {
838 pn->flow_ctrl = cr ? 0xf0 : 0xe0;
839 pn->credits = RFCOMM_DEFAULT_CREDITS;
840 } else {
841 pn->flow_ctrl = 0;
842 pn->credits = 0;
843 }
844
Marcel Holtmann98bcd082006-07-14 11:42:12 +0200845 if (cr && channel_mtu >= 0)
846 pn->mtu = htobs(channel_mtu);
847 else
848 pn->mtu = htobs(d->mtu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849
850 *ptr = __fcs(buf); ptr++;
851
852 return rfcomm_send_frame(s, buf, ptr - buf);
853}
854
J. Suter3a5e9032005-08-09 20:28:46 -0700855int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
856 u8 bit_rate, u8 data_bits, u8 stop_bits,
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900857 u8 parity, u8 flow_ctrl_settings,
J. Suter3a5e9032005-08-09 20:28:46 -0700858 u8 xon_char, u8 xoff_char, u16 param_mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859{
860 struct rfcomm_hdr *hdr;
861 struct rfcomm_mcc *mcc;
862 struct rfcomm_rpn *rpn;
863 u8 buf[16], *ptr = buf;
864
865 BT_DBG("%p cr %d dlci %d bit_r 0x%x data_b 0x%x stop_b 0x%x parity 0x%x"
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900866 " flwc_s 0x%x xon_c 0x%x xoff_c 0x%x p_mask 0x%x",
867 s, cr, dlci, bit_rate, data_bits, stop_bits, parity,
J. Suter3a5e9032005-08-09 20:28:46 -0700868 flow_ctrl_settings, xon_char, xoff_char, param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869
870 hdr = (void *) ptr; ptr += sizeof(*hdr);
871 hdr->addr = __addr(s->initiator, 0);
872 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
873 hdr->len = __len8(sizeof(*mcc) + sizeof(*rpn));
874
875 mcc = (void *) ptr; ptr += sizeof(*mcc);
876 mcc->type = __mcc_type(cr, RFCOMM_RPN);
877 mcc->len = __len8(sizeof(*rpn));
878
879 rpn = (void *) ptr; ptr += sizeof(*rpn);
880 rpn->dlci = __addr(1, dlci);
881 rpn->bit_rate = bit_rate;
882 rpn->line_settings = __rpn_line_settings(data_bits, stop_bits, parity);
883 rpn->flow_ctrl = flow_ctrl_settings;
884 rpn->xon_char = xon_char;
885 rpn->xoff_char = xoff_char;
Al Viroe8db8c92006-11-08 00:28:44 -0800886 rpn->param_mask = cpu_to_le16(param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887
888 *ptr = __fcs(buf); ptr++;
889
890 return rfcomm_send_frame(s, buf, ptr - buf);
891}
892
893static int rfcomm_send_rls(struct rfcomm_session *s, int cr, u8 dlci, u8 status)
894{
895 struct rfcomm_hdr *hdr;
896 struct rfcomm_mcc *mcc;
897 struct rfcomm_rls *rls;
898 u8 buf[16], *ptr = buf;
899
900 BT_DBG("%p cr %d status 0x%x", s, cr, status);
901
902 hdr = (void *) ptr; ptr += sizeof(*hdr);
903 hdr->addr = __addr(s->initiator, 0);
904 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
905 hdr->len = __len8(sizeof(*mcc) + sizeof(*rls));
906
907 mcc = (void *) ptr; ptr += sizeof(*mcc);
908 mcc->type = __mcc_type(cr, RFCOMM_RLS);
909 mcc->len = __len8(sizeof(*rls));
910
911 rls = (void *) ptr; ptr += sizeof(*rls);
912 rls->dlci = __addr(1, dlci);
913 rls->status = status;
914
915 *ptr = __fcs(buf); ptr++;
916
917 return rfcomm_send_frame(s, buf, ptr - buf);
918}
919
920static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig)
921{
922 struct rfcomm_hdr *hdr;
923 struct rfcomm_mcc *mcc;
924 struct rfcomm_msc *msc;
925 u8 buf[16], *ptr = buf;
926
927 BT_DBG("%p cr %d v24 0x%x", s, cr, v24_sig);
928
929 hdr = (void *) ptr; ptr += sizeof(*hdr);
930 hdr->addr = __addr(s->initiator, 0);
931 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
932 hdr->len = __len8(sizeof(*mcc) + sizeof(*msc));
933
934 mcc = (void *) ptr; ptr += sizeof(*mcc);
935 mcc->type = __mcc_type(cr, RFCOMM_MSC);
936 mcc->len = __len8(sizeof(*msc));
937
938 msc = (void *) ptr; ptr += sizeof(*msc);
939 msc->dlci = __addr(1, dlci);
940 msc->v24_sig = v24_sig | 0x01;
941
942 *ptr = __fcs(buf); ptr++;
943
944 return rfcomm_send_frame(s, buf, ptr - buf);
945}
946
947static int rfcomm_send_fcoff(struct rfcomm_session *s, int cr)
948{
949 struct rfcomm_hdr *hdr;
950 struct rfcomm_mcc *mcc;
951 u8 buf[16], *ptr = buf;
952
953 BT_DBG("%p cr %d", s, cr);
954
955 hdr = (void *) ptr; ptr += sizeof(*hdr);
956 hdr->addr = __addr(s->initiator, 0);
957 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
958 hdr->len = __len8(sizeof(*mcc));
959
960 mcc = (void *) ptr; ptr += sizeof(*mcc);
961 mcc->type = __mcc_type(cr, RFCOMM_FCOFF);
962 mcc->len = __len8(0);
963
964 *ptr = __fcs(buf); ptr++;
965
966 return rfcomm_send_frame(s, buf, ptr - buf);
967}
968
969static int rfcomm_send_fcon(struct rfcomm_session *s, int cr)
970{
971 struct rfcomm_hdr *hdr;
972 struct rfcomm_mcc *mcc;
973 u8 buf[16], *ptr = buf;
974
975 BT_DBG("%p cr %d", s, cr);
976
977 hdr = (void *) ptr; ptr += sizeof(*hdr);
978 hdr->addr = __addr(s->initiator, 0);
979 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
980 hdr->len = __len8(sizeof(*mcc));
981
982 mcc = (void *) ptr; ptr += sizeof(*mcc);
983 mcc->type = __mcc_type(cr, RFCOMM_FCON);
984 mcc->len = __len8(0);
985
986 *ptr = __fcs(buf); ptr++;
987
988 return rfcomm_send_frame(s, buf, ptr - buf);
989}
990
991static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len)
992{
993 struct socket *sock = s->sock;
994 struct kvec iv[3];
995 struct msghdr msg;
996 unsigned char hdr[5], crc[1];
997
998 if (len > 125)
999 return -EINVAL;
1000
1001 BT_DBG("%p cr %d", s, cr);
1002
1003 hdr[0] = __addr(s->initiator, 0);
1004 hdr[1] = __ctrl(RFCOMM_UIH, 0);
1005 hdr[2] = 0x01 | ((len + 2) << 1);
1006 hdr[3] = 0x01 | ((cr & 0x01) << 1) | (RFCOMM_TEST << 2);
1007 hdr[4] = 0x01 | (len << 1);
1008
1009 crc[0] = __fcs(hdr);
1010
1011 iv[0].iov_base = hdr;
1012 iv[0].iov_len = 5;
1013 iv[1].iov_base = pattern;
1014 iv[1].iov_len = len;
1015 iv[2].iov_base = crc;
1016 iv[2].iov_len = 1;
1017
1018 memset(&msg, 0, sizeof(msg));
1019
1020 return kernel_sendmsg(sock, &msg, iv, 3, 6 + len);
1021}
1022
1023static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits)
1024{
1025 struct rfcomm_hdr *hdr;
1026 u8 buf[16], *ptr = buf;
1027
1028 BT_DBG("%p addr %d credits %d", s, addr, credits);
1029
1030 hdr = (void *) ptr; ptr += sizeof(*hdr);
1031 hdr->addr = addr;
1032 hdr->ctrl = __ctrl(RFCOMM_UIH, 1);
1033 hdr->len = __len8(0);
1034
1035 *ptr = credits; ptr++;
1036
1037 *ptr = __fcs(buf); ptr++;
1038
1039 return rfcomm_send_frame(s, buf, ptr - buf);
1040}
1041
1042static void rfcomm_make_uih(struct sk_buff *skb, u8 addr)
1043{
1044 struct rfcomm_hdr *hdr;
1045 int len = skb->len;
1046 u8 *crc;
1047
1048 if (len > 127) {
1049 hdr = (void *) skb_push(skb, 4);
Al Viro6ba9c752006-11-08 00:28:19 -08001050 put_unaligned(htobs(__len16(len)), (__le16 *) &hdr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 } else {
1052 hdr = (void *) skb_push(skb, 3);
1053 hdr->len = __len8(len);
1054 }
1055 hdr->addr = addr;
1056 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1057
1058 crc = skb_put(skb, 1);
1059 *crc = __fcs((void *) hdr);
1060}
1061
1062/* ---- RFCOMM frame reception ---- */
1063static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
1064{
1065 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1066
1067 if (dlci) {
1068 /* Data channel */
1069 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1070 if (!d) {
1071 rfcomm_send_dm(s, dlci);
1072 return 0;
1073 }
1074
1075 switch (d->state) {
1076 case BT_CONNECT:
1077 rfcomm_dlc_clear_timer(d);
1078
1079 rfcomm_dlc_lock(d);
1080 d->state = BT_CONNECTED;
1081 d->state_change(d, 0);
1082 rfcomm_dlc_unlock(d);
1083
1084 rfcomm_send_msc(s, 1, dlci, d->v24_sig);
1085 break;
1086
1087 case BT_DISCONN:
1088 d->state = BT_CLOSED;
1089 __rfcomm_dlc_close(d, 0);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001090
1091 if (list_empty(&s->dlcs)) {
1092 s->state = BT_DISCONN;
1093 rfcomm_send_disc(s, 0);
1094 }
1095
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 break;
1097 }
1098 } else {
1099 /* Control channel */
1100 switch (s->state) {
1101 case BT_CONNECT:
1102 s->state = BT_CONNECTED;
1103 rfcomm_process_connect(s);
1104 break;
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001105
1106 case BT_DISCONN:
1107 rfcomm_session_put(s);
1108 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109 }
1110 }
1111 return 0;
1112}
1113
1114static int rfcomm_recv_dm(struct rfcomm_session *s, u8 dlci)
1115{
1116 int err = 0;
1117
1118 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1119
1120 if (dlci) {
1121 /* Data DLC */
1122 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1123 if (d) {
1124 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1125 err = ECONNREFUSED;
1126 else
1127 err = ECONNRESET;
1128
1129 d->state = BT_CLOSED;
1130 __rfcomm_dlc_close(d, err);
1131 }
1132 } else {
1133 if (s->state == BT_CONNECT)
1134 err = ECONNREFUSED;
1135 else
1136 err = ECONNRESET;
1137
1138 s->state = BT_CLOSED;
1139 rfcomm_session_close(s, err);
1140 }
1141 return 0;
1142}
1143
1144static int rfcomm_recv_disc(struct rfcomm_session *s, u8 dlci)
1145{
1146 int err = 0;
1147
1148 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1149
1150 if (dlci) {
1151 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1152 if (d) {
1153 rfcomm_send_ua(s, dlci);
1154
1155 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1156 err = ECONNREFUSED;
1157 else
1158 err = ECONNRESET;
1159
1160 d->state = BT_CLOSED;
1161 __rfcomm_dlc_close(d, err);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001162 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 rfcomm_send_dm(s, dlci);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001164
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 } else {
1166 rfcomm_send_ua(s, 0);
1167
1168 if (s->state == BT_CONNECT)
1169 err = ECONNREFUSED;
1170 else
1171 err = ECONNRESET;
1172
1173 s->state = BT_CLOSED;
1174 rfcomm_session_close(s, err);
1175 }
1176
1177 return 0;
1178}
1179
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001180void rfcomm_dlc_accept(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181{
Marcel Holtmann300b9392006-07-03 10:37:55 +02001182 struct sock *sk = d->session->sock->sk;
1183
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184 BT_DBG("dlc %p", d);
1185
1186 rfcomm_send_ua(d->session, d->dlci);
1187
1188 rfcomm_dlc_lock(d);
1189 d->state = BT_CONNECTED;
1190 d->state_change(d, 0);
1191 rfcomm_dlc_unlock(d);
1192
Marcel Holtmann300b9392006-07-03 10:37:55 +02001193 if (d->link_mode & RFCOMM_LM_MASTER)
1194 hci_conn_switch_role(l2cap_pi(sk)->conn->hcon, 0x00);
1195
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
1197}
1198
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001199static void rfcomm_check_accept(struct rfcomm_dlc *d)
1200{
1201 if (rfcomm_check_link_mode(d)) {
1202 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1203 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1204 } else {
1205 if (d->defer_setup) {
1206 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1207 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1208 } else
1209 rfcomm_dlc_accept(d);
1210 }
1211}
1212
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
1214{
1215 struct rfcomm_dlc *d;
1216 u8 channel;
1217
1218 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1219
1220 if (!dlci) {
1221 rfcomm_send_ua(s, 0);
1222
1223 if (s->state == BT_OPEN) {
1224 s->state = BT_CONNECTED;
1225 rfcomm_process_connect(s);
1226 }
1227 return 0;
1228 }
1229
1230 /* Check if DLC exists */
1231 d = rfcomm_dlc_get(s, dlci);
1232 if (d) {
1233 if (d->state == BT_OPEN) {
1234 /* DLC was previously opened by PN request */
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001235 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001236 }
1237 return 0;
1238 }
1239
1240 /* Notify socket layer about incoming connection */
1241 channel = __srv_channel(dlci);
1242 if (rfcomm_connect_ind(s, channel, &d)) {
1243 d->dlci = dlci;
1244 d->addr = __addr(s->initiator, dlci);
1245 rfcomm_dlc_link(s, d);
1246
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001247 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 } else {
1249 rfcomm_send_dm(s, dlci);
1250 }
1251
1252 return 0;
1253}
1254
1255static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)
1256{
1257 struct rfcomm_session *s = d->session;
1258
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001259 BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260 d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits);
1261
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001262 if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) ||
1263 pn->flow_ctrl == 0xe0) {
1264 d->cfc = RFCOMM_CFC_ENABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 d->tx_credits = pn->credits;
1266 } else {
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001267 d->cfc = RFCOMM_CFC_DISABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1269 }
1270
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001271 if (s->cfc == RFCOMM_CFC_UNKNOWN)
1272 s->cfc = d->cfc;
1273
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274 d->priority = pn->priority;
1275
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001276 d->mtu = btohs(pn->mtu);
1277
1278 if (cr && d->mtu > s->mtu)
1279 d->mtu = s->mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280
1281 return 0;
1282}
1283
1284static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1285{
1286 struct rfcomm_pn *pn = (void *) skb->data;
1287 struct rfcomm_dlc *d;
1288 u8 dlci = pn->dlci;
1289
1290 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1291
1292 if (!dlci)
1293 return 0;
1294
1295 d = rfcomm_dlc_get(s, dlci);
1296 if (d) {
1297 if (cr) {
1298 /* PN request */
1299 rfcomm_apply_pn(d, cr, pn);
1300 rfcomm_send_pn(s, 0, d);
1301 } else {
1302 /* PN response */
1303 switch (d->state) {
1304 case BT_CONFIG:
1305 rfcomm_apply_pn(d, cr, pn);
1306
1307 d->state = BT_CONNECT;
1308 rfcomm_send_sabm(s, d->dlci);
1309 break;
1310 }
1311 }
1312 } else {
1313 u8 channel = __srv_channel(dlci);
1314
1315 if (!cr)
1316 return 0;
1317
1318 /* PN request for non existing DLC.
1319 * Assume incoming connection. */
1320 if (rfcomm_connect_ind(s, channel, &d)) {
1321 d->dlci = dlci;
1322 d->addr = __addr(s->initiator, dlci);
1323 rfcomm_dlc_link(s, d);
1324
1325 rfcomm_apply_pn(d, cr, pn);
1326
1327 d->state = BT_OPEN;
1328 rfcomm_send_pn(s, 0, d);
1329 } else {
1330 rfcomm_send_dm(s, dlci);
1331 }
1332 }
1333 return 0;
1334}
1335
1336static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_buff *skb)
1337{
1338 struct rfcomm_rpn *rpn = (void *) skb->data;
1339 u8 dlci = __get_dlci(rpn->dlci);
1340
1341 u8 bit_rate = 0;
1342 u8 data_bits = 0;
1343 u8 stop_bits = 0;
1344 u8 parity = 0;
1345 u8 flow_ctrl = 0;
1346 u8 xon_char = 0;
1347 u8 xoff_char = 0;
1348 u16 rpn_mask = RFCOMM_RPN_PM_ALL;
J. Suter3a5e9032005-08-09 20:28:46 -07001349
1350 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",
1351 dlci, cr, len, rpn->bit_rate, rpn->line_settings, rpn->flow_ctrl,
1352 rpn->xon_char, rpn->xoff_char, rpn->param_mask);
1353
1354 if (!cr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355 return 0;
J. Suter3a5e9032005-08-09 20:28:46 -07001356
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 if (len == 1) {
J. Suter3a5e9032005-08-09 20:28:46 -07001358 /* This is a request, return default settings */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 bit_rate = RFCOMM_RPN_BR_115200;
1360 data_bits = RFCOMM_RPN_DATA_8;
1361 stop_bits = RFCOMM_RPN_STOP_1;
1362 parity = RFCOMM_RPN_PARITY_NONE;
1363 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1364 xon_char = RFCOMM_RPN_XON_CHAR;
1365 xoff_char = RFCOMM_RPN_XOFF_CHAR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366 goto rpn_out;
1367 }
J. Suter3a5e9032005-08-09 20:28:46 -07001368
1369 /* Check for sane values, ignore/accept bit_rate, 8 bits, 1 stop bit,
1370 * no parity, no flow control lines, normal XON/XOFF chars */
1371
Al Viroe8db8c92006-11-08 00:28:44 -08001372 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_BITRATE)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373 bit_rate = rpn->bit_rate;
1374 if (bit_rate != RFCOMM_RPN_BR_115200) {
1375 BT_DBG("RPN bit rate mismatch 0x%x", bit_rate);
1376 bit_rate = RFCOMM_RPN_BR_115200;
1377 rpn_mask ^= RFCOMM_RPN_PM_BITRATE;
1378 }
1379 }
J. Suter3a5e9032005-08-09 20:28:46 -07001380
Al Viroe8db8c92006-11-08 00:28:44 -08001381 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_DATA)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 data_bits = __get_rpn_data_bits(rpn->line_settings);
1383 if (data_bits != RFCOMM_RPN_DATA_8) {
1384 BT_DBG("RPN data bits mismatch 0x%x", data_bits);
1385 data_bits = RFCOMM_RPN_DATA_8;
1386 rpn_mask ^= RFCOMM_RPN_PM_DATA;
1387 }
1388 }
J. Suter3a5e9032005-08-09 20:28:46 -07001389
Al Viroe8db8c92006-11-08 00:28:44 -08001390 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_STOP)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391 stop_bits = __get_rpn_stop_bits(rpn->line_settings);
1392 if (stop_bits != RFCOMM_RPN_STOP_1) {
1393 BT_DBG("RPN stop bits mismatch 0x%x", stop_bits);
1394 stop_bits = RFCOMM_RPN_STOP_1;
1395 rpn_mask ^= RFCOMM_RPN_PM_STOP;
1396 }
1397 }
J. Suter3a5e9032005-08-09 20:28:46 -07001398
Al Viroe8db8c92006-11-08 00:28:44 -08001399 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_PARITY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400 parity = __get_rpn_parity(rpn->line_settings);
1401 if (parity != RFCOMM_RPN_PARITY_NONE) {
1402 BT_DBG("RPN parity mismatch 0x%x", parity);
1403 parity = RFCOMM_RPN_PARITY_NONE;
1404 rpn_mask ^= RFCOMM_RPN_PM_PARITY;
1405 }
1406 }
J. Suter3a5e9032005-08-09 20:28:46 -07001407
Al Viroe8db8c92006-11-08 00:28:44 -08001408 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_FLOW)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409 flow_ctrl = rpn->flow_ctrl;
1410 if (flow_ctrl != RFCOMM_RPN_FLOW_NONE) {
1411 BT_DBG("RPN flow ctrl mismatch 0x%x", flow_ctrl);
1412 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1413 rpn_mask ^= RFCOMM_RPN_PM_FLOW;
1414 }
1415 }
J. Suter3a5e9032005-08-09 20:28:46 -07001416
Al Viroe8db8c92006-11-08 00:28:44 -08001417 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XON)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418 xon_char = rpn->xon_char;
1419 if (xon_char != RFCOMM_RPN_XON_CHAR) {
1420 BT_DBG("RPN XON char mismatch 0x%x", xon_char);
1421 xon_char = RFCOMM_RPN_XON_CHAR;
1422 rpn_mask ^= RFCOMM_RPN_PM_XON;
1423 }
1424 }
J. Suter3a5e9032005-08-09 20:28:46 -07001425
Al Viroe8db8c92006-11-08 00:28:44 -08001426 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XOFF)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427 xoff_char = rpn->xoff_char;
1428 if (xoff_char != RFCOMM_RPN_XOFF_CHAR) {
1429 BT_DBG("RPN XOFF char mismatch 0x%x", xoff_char);
1430 xoff_char = RFCOMM_RPN_XOFF_CHAR;
1431 rpn_mask ^= RFCOMM_RPN_PM_XOFF;
1432 }
1433 }
1434
1435rpn_out:
J. Suter3a5e9032005-08-09 20:28:46 -07001436 rfcomm_send_rpn(s, 0, dlci, bit_rate, data_bits, stop_bits,
1437 parity, flow_ctrl, xon_char, xoff_char, rpn_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438
1439 return 0;
1440}
1441
1442static int rfcomm_recv_rls(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1443{
1444 struct rfcomm_rls *rls = (void *) skb->data;
1445 u8 dlci = __get_dlci(rls->dlci);
1446
1447 BT_DBG("dlci %d cr %d status 0x%x", dlci, cr, rls->status);
J. Suter3a5e9032005-08-09 20:28:46 -07001448
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 if (!cr)
1450 return 0;
1451
J. Suter3a5e9032005-08-09 20:28:46 -07001452 /* We should probably do something with this information here. But
1453 * for now it's sufficient just to reply -- Bluetooth 1.1 says it's
1454 * mandatory to recognise and respond to RLS */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455
1456 rfcomm_send_rls(s, 0, dlci, rls->status);
1457
1458 return 0;
1459}
1460
1461static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1462{
1463 struct rfcomm_msc *msc = (void *) skb->data;
1464 struct rfcomm_dlc *d;
1465 u8 dlci = __get_dlci(msc->dlci);
1466
1467 BT_DBG("dlci %d cr %d v24 0x%x", dlci, cr, msc->v24_sig);
1468
1469 d = rfcomm_dlc_get(s, dlci);
J. Suter3a5e9032005-08-09 20:28:46 -07001470 if (!d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471 return 0;
1472
1473 if (cr) {
1474 if (msc->v24_sig & RFCOMM_V24_FC && !d->cfc)
1475 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1476 else
1477 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
J. Suter3a5e9032005-08-09 20:28:46 -07001478
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 rfcomm_dlc_lock(d);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001480
1481 d->remote_v24_sig = msc->v24_sig;
1482
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483 if (d->modem_status)
1484 d->modem_status(d, msc->v24_sig);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001485
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486 rfcomm_dlc_unlock(d);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001487
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488 rfcomm_send_msc(s, 0, dlci, msc->v24_sig);
1489
1490 d->mscex |= RFCOMM_MSCEX_RX;
J. Suter3a5e9032005-08-09 20:28:46 -07001491 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492 d->mscex |= RFCOMM_MSCEX_TX;
1493
1494 return 0;
1495}
1496
1497static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
1498{
1499 struct rfcomm_mcc *mcc = (void *) skb->data;
1500 u8 type, cr, len;
1501
1502 cr = __test_cr(mcc->type);
1503 type = __get_mcc_type(mcc->type);
1504 len = __get_mcc_len(mcc->len);
1505
1506 BT_DBG("%p type 0x%x cr %d", s, type, cr);
1507
1508 skb_pull(skb, 2);
1509
1510 switch (type) {
1511 case RFCOMM_PN:
1512 rfcomm_recv_pn(s, cr, skb);
1513 break;
1514
1515 case RFCOMM_RPN:
1516 rfcomm_recv_rpn(s, cr, len, skb);
1517 break;
1518
1519 case RFCOMM_RLS:
1520 rfcomm_recv_rls(s, cr, skb);
1521 break;
1522
1523 case RFCOMM_MSC:
1524 rfcomm_recv_msc(s, cr, skb);
1525 break;
1526
1527 case RFCOMM_FCOFF:
1528 if (cr) {
1529 set_bit(RFCOMM_TX_THROTTLED, &s->flags);
1530 rfcomm_send_fcoff(s, 0);
1531 }
1532 break;
1533
1534 case RFCOMM_FCON:
1535 if (cr) {
1536 clear_bit(RFCOMM_TX_THROTTLED, &s->flags);
1537 rfcomm_send_fcon(s, 0);
1538 }
1539 break;
1540
1541 case RFCOMM_TEST:
1542 if (cr)
1543 rfcomm_send_test(s, 0, skb->data, skb->len);
1544 break;
1545
1546 case RFCOMM_NSC:
1547 break;
1548
1549 default:
1550 BT_ERR("Unknown control type 0x%02x", type);
1551 rfcomm_send_nsc(s, cr, type);
1552 break;
1553 }
1554 return 0;
1555}
1556
1557static int rfcomm_recv_data(struct rfcomm_session *s, u8 dlci, int pf, struct sk_buff *skb)
1558{
1559 struct rfcomm_dlc *d;
1560
1561 BT_DBG("session %p state %ld dlci %d pf %d", s, s->state, dlci, pf);
1562
1563 d = rfcomm_dlc_get(s, dlci);
1564 if (!d) {
1565 rfcomm_send_dm(s, dlci);
1566 goto drop;
1567 }
1568
1569 if (pf && d->cfc) {
1570 u8 credits = *(u8 *) skb->data; skb_pull(skb, 1);
1571
1572 d->tx_credits += credits;
1573 if (d->tx_credits)
1574 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
1575 }
1576
1577 if (skb->len && d->state == BT_CONNECTED) {
1578 rfcomm_dlc_lock(d);
1579 d->rx_credits--;
1580 d->data_ready(d, skb);
1581 rfcomm_dlc_unlock(d);
1582 return 0;
1583 }
1584
1585drop:
1586 kfree_skb(skb);
1587 return 0;
1588}
1589
1590static int rfcomm_recv_frame(struct rfcomm_session *s, struct sk_buff *skb)
1591{
1592 struct rfcomm_hdr *hdr = (void *) skb->data;
1593 u8 type, dlci, fcs;
1594
1595 dlci = __get_dlci(hdr->addr);
1596 type = __get_type(hdr->ctrl);
1597
1598 /* Trim FCS */
1599 skb->len--; skb->tail--;
Arnaldo Carvalho de Melo27a884d2007-04-19 20:29:13 -07001600 fcs = *(u8 *)skb_tail_pointer(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601
1602 if (__check_fcs(skb->data, type, fcs)) {
1603 BT_ERR("bad checksum in packet");
1604 kfree_skb(skb);
1605 return -EILSEQ;
1606 }
1607
1608 if (__test_ea(hdr->len))
1609 skb_pull(skb, 3);
1610 else
1611 skb_pull(skb, 4);
1612
1613 switch (type) {
1614 case RFCOMM_SABM:
1615 if (__test_pf(hdr->ctrl))
1616 rfcomm_recv_sabm(s, dlci);
1617 break;
1618
1619 case RFCOMM_DISC:
1620 if (__test_pf(hdr->ctrl))
1621 rfcomm_recv_disc(s, dlci);
1622 break;
1623
1624 case RFCOMM_UA:
1625 if (__test_pf(hdr->ctrl))
1626 rfcomm_recv_ua(s, dlci);
1627 break;
1628
1629 case RFCOMM_DM:
1630 rfcomm_recv_dm(s, dlci);
1631 break;
1632
1633 case RFCOMM_UIH:
1634 if (dlci)
1635 return rfcomm_recv_data(s, dlci, __test_pf(hdr->ctrl), skb);
1636
1637 rfcomm_recv_mcc(s, skb);
1638 break;
1639
1640 default:
1641 BT_ERR("Unknown packet type 0x%02x\n", type);
1642 break;
1643 }
1644 kfree_skb(skb);
1645 return 0;
1646}
1647
1648/* ---- Connection and data processing ---- */
1649
1650static void rfcomm_process_connect(struct rfcomm_session *s)
1651{
1652 struct rfcomm_dlc *d;
1653 struct list_head *p, *n;
1654
1655 BT_DBG("session %p state %ld", s, s->state);
1656
1657 list_for_each_safe(p, n, &s->dlcs) {
1658 d = list_entry(p, struct rfcomm_dlc, list);
1659 if (d->state == BT_CONFIG) {
1660 d->mtu = s->mtu;
Marcel Holtmann77db1982008-07-14 20:13:45 +02001661 if (rfcomm_check_link_mode(d)) {
1662 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1663 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1664 } else
1665 rfcomm_send_pn(s, 1, d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666 }
1667 }
1668}
1669
1670/* Send data queued for the DLC.
1671 * Return number of frames left in the queue.
1672 */
1673static inline int rfcomm_process_tx(struct rfcomm_dlc *d)
1674{
1675 struct sk_buff *skb;
1676 int err;
1677
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001678 BT_DBG("dlc %p state %ld cfc %d rx_credits %d tx_credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001679 d, d->state, d->cfc, d->rx_credits, d->tx_credits);
1680
1681 /* Send pending MSC */
1682 if (test_and_clear_bit(RFCOMM_MSC_PENDING, &d->flags))
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001683 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001684
1685 if (d->cfc) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001686 /* CFC enabled.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001687 * Give them some credits */
1688 if (!test_bit(RFCOMM_RX_THROTTLED, &d->flags) &&
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001689 d->rx_credits <= (d->cfc >> 2)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 rfcomm_send_credits(d->session, d->addr, d->cfc - d->rx_credits);
1691 d->rx_credits = d->cfc;
1692 }
1693 } else {
1694 /* CFC disabled.
1695 * Give ourselves some credits */
1696 d->tx_credits = 5;
1697 }
1698
1699 if (test_bit(RFCOMM_TX_THROTTLED, &d->flags))
1700 return skb_queue_len(&d->tx_queue);
1701
1702 while (d->tx_credits && (skb = skb_dequeue(&d->tx_queue))) {
1703 err = rfcomm_send_frame(d->session, skb->data, skb->len);
1704 if (err < 0) {
1705 skb_queue_head(&d->tx_queue, skb);
1706 break;
1707 }
1708 kfree_skb(skb);
1709 d->tx_credits--;
1710 }
1711
1712 if (d->cfc && !d->tx_credits) {
1713 /* We're out of TX credits.
1714 * Set TX_THROTTLED flag to avoid unnesary wakeups by dlc_send. */
1715 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1716 }
1717
1718 return skb_queue_len(&d->tx_queue);
1719}
1720
1721static inline void rfcomm_process_dlcs(struct rfcomm_session *s)
1722{
1723 struct rfcomm_dlc *d;
1724 struct list_head *p, *n;
1725
1726 BT_DBG("session %p state %ld", s, s->state);
1727
1728 list_for_each_safe(p, n, &s->dlcs) {
1729 d = list_entry(p, struct rfcomm_dlc, list);
1730
1731 if (test_bit(RFCOMM_TIMED_OUT, &d->flags)) {
1732 __rfcomm_dlc_close(d, ETIMEDOUT);
1733 continue;
1734 }
1735
1736 if (test_and_clear_bit(RFCOMM_AUTH_ACCEPT, &d->flags)) {
1737 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001738 if (d->out) {
1739 rfcomm_send_pn(s, 1, d);
1740 rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001741 } else {
1742 if (d->defer_setup) {
1743 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1744 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1745 } else
1746 rfcomm_dlc_accept(d);
1747 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748 if (d->link_mode & RFCOMM_LM_SECURE) {
1749 struct sock *sk = s->sock->sk;
1750 hci_conn_change_link_key(l2cap_pi(sk)->conn->hcon);
1751 }
1752 continue;
1753 } else if (test_and_clear_bit(RFCOMM_AUTH_REJECT, &d->flags)) {
1754 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001755 if (!d->out)
1756 rfcomm_send_dm(s, d->dlci);
1757 else
1758 d->state = BT_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759 __rfcomm_dlc_close(d, ECONNREFUSED);
1760 continue;
1761 }
1762
1763 if (test_bit(RFCOMM_TX_THROTTLED, &s->flags))
1764 continue;
1765
1766 if ((d->state == BT_CONNECTED || d->state == BT_DISCONN) &&
Marcel Holtmann77db1982008-07-14 20:13:45 +02001767 d->mscex == RFCOMM_MSCEX_OK)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 rfcomm_process_tx(d);
1769 }
1770}
1771
1772static inline void rfcomm_process_rx(struct rfcomm_session *s)
1773{
1774 struct socket *sock = s->sock;
1775 struct sock *sk = sock->sk;
1776 struct sk_buff *skb;
1777
1778 BT_DBG("session %p state %ld qlen %d", s, s->state, skb_queue_len(&sk->sk_receive_queue));
1779
1780 /* Get data directly from socket receive queue without copying it. */
1781 while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
1782 skb_orphan(skb);
1783 rfcomm_recv_frame(s, skb);
1784 }
1785
1786 if (sk->sk_state == BT_CLOSED) {
1787 if (!s->initiator)
1788 rfcomm_session_put(s);
1789
1790 rfcomm_session_close(s, sk->sk_err);
1791 }
1792}
1793
1794static inline void rfcomm_accept_connection(struct rfcomm_session *s)
1795{
1796 struct socket *sock = s->sock, *nsock;
1797 int err;
1798
1799 /* Fast check for a new connection.
1800 * Avoids unnesesary socket allocations. */
1801 if (list_empty(&bt_sk(sock->sk)->accept_q))
1802 return;
1803
1804 BT_DBG("session %p", s);
1805
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001806 err = kernel_accept(sock, &nsock, O_NONBLOCK);
1807 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808 return;
1809
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810 /* Set our callbacks */
1811 nsock->sk->sk_data_ready = rfcomm_l2data_ready;
1812 nsock->sk->sk_state_change = rfcomm_l2state_change;
1813
1814 s = rfcomm_session_add(nsock, BT_OPEN);
1815 if (s) {
1816 rfcomm_session_hold(s);
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001817
1818 /* We should adjust MTU on incoming sessions.
1819 * L2CAP MTU minus UIH header and FCS. */
1820 s->mtu = min(l2cap_pi(nsock->sk)->omtu, l2cap_pi(nsock->sk)->imtu) - 5;
1821
Linus Torvalds1da177e2005-04-16 15:20:36 -07001822 rfcomm_schedule(RFCOMM_SCHED_RX);
1823 } else
1824 sock_release(nsock);
1825}
1826
1827static inline void rfcomm_check_connection(struct rfcomm_session *s)
1828{
1829 struct sock *sk = s->sock->sk;
1830
1831 BT_DBG("%p state %ld", s, s->state);
1832
1833 switch(sk->sk_state) {
1834 case BT_CONNECTED:
1835 s->state = BT_CONNECT;
1836
1837 /* We can adjust MTU on outgoing sessions.
1838 * L2CAP MTU minus UIH header and FCS. */
1839 s->mtu = min(l2cap_pi(sk)->omtu, l2cap_pi(sk)->imtu) - 5;
1840
1841 rfcomm_send_sabm(s, 0);
1842 break;
1843
1844 case BT_CLOSED:
1845 s->state = BT_CLOSED;
1846 rfcomm_session_close(s, sk->sk_err);
1847 break;
1848 }
1849}
1850
1851static inline void rfcomm_process_sessions(void)
1852{
1853 struct list_head *p, *n;
1854
1855 rfcomm_lock();
1856
1857 list_for_each_safe(p, n, &session_list) {
1858 struct rfcomm_session *s;
1859 s = list_entry(p, struct rfcomm_session, list);
1860
1861 if (s->state == BT_LISTEN) {
1862 rfcomm_accept_connection(s);
1863 continue;
1864 }
1865
1866 rfcomm_session_hold(s);
1867
1868 switch (s->state) {
1869 case BT_BOUND:
1870 rfcomm_check_connection(s);
1871 break;
1872
1873 default:
1874 rfcomm_process_rx(s);
1875 break;
1876 }
1877
1878 rfcomm_process_dlcs(s);
1879
1880 rfcomm_session_put(s);
1881 }
1882
1883 rfcomm_unlock();
1884}
1885
Linus Torvalds1da177e2005-04-16 15:20:36 -07001886static int rfcomm_add_listener(bdaddr_t *ba)
1887{
1888 struct sockaddr_l2 addr;
1889 struct socket *sock;
1890 struct sock *sk;
1891 struct rfcomm_session *s;
1892 int err = 0;
1893
1894 /* Create socket */
1895 err = rfcomm_l2sock_create(&sock);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001896 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 BT_ERR("Create socket failed %d", err);
1898 return err;
1899 }
1900
1901 /* Bind socket */
1902 bacpy(&addr.l2_bdaddr, ba);
1903 addr.l2_family = AF_BLUETOOTH;
1904 addr.l2_psm = htobs(RFCOMM_PSM);
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001905 err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001906 if (err < 0) {
1907 BT_ERR("Bind failed %d", err);
1908 goto failed;
1909 }
1910
1911 /* Set L2CAP options */
1912 sk = sock->sk;
1913 lock_sock(sk);
Marcel Holtmann56f3a402006-02-13 11:39:57 +01001914 l2cap_pi(sk)->imtu = l2cap_mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001915 release_sock(sk);
1916
1917 /* Start listening on the socket */
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001918 err = kernel_listen(sock, 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001919 if (err) {
1920 BT_ERR("Listen failed %d", err);
1921 goto failed;
1922 }
1923
1924 /* Add listening session */
1925 s = rfcomm_session_add(sock, BT_LISTEN);
1926 if (!s)
1927 goto failed;
1928
1929 rfcomm_session_hold(s);
1930 return 0;
1931failed:
1932 sock_release(sock);
1933 return err;
1934}
1935
1936static void rfcomm_kill_listener(void)
1937{
1938 struct rfcomm_session *s;
1939 struct list_head *p, *n;
1940
1941 BT_DBG("");
1942
1943 list_for_each_safe(p, n, &session_list) {
1944 s = list_entry(p, struct rfcomm_session, list);
1945 rfcomm_session_del(s);
1946 }
1947}
1948
1949static int rfcomm_run(void *unused)
1950{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 BT_DBG("");
1952
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02001953 set_user_nice(current, -10);
1954
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 rfcomm_add_listener(BDADDR_ANY);
1956
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02001957 while (!kthread_should_stop()) {
1958 set_current_state(TASK_INTERRUPTIBLE);
1959 if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) {
1960 /* No pending events. Let's sleep.
1961 * Incoming connections and data will wake us up. */
1962 schedule();
1963 }
1964 set_current_state(TASK_RUNNING);
1965
1966 /* Process stuff */
1967 clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event);
1968 rfcomm_process_sessions();
1969 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001970
1971 rfcomm_kill_listener();
1972
Linus Torvalds1da177e2005-04-16 15:20:36 -07001973 return 0;
1974}
1975
1976static void rfcomm_auth_cfm(struct hci_conn *conn, u8 status)
1977{
1978 struct rfcomm_session *s;
1979 struct rfcomm_dlc *d;
1980 struct list_head *p, *n;
1981
1982 BT_DBG("conn %p status 0x%02x", conn, status);
1983
1984 s = rfcomm_session_get(&conn->hdev->bdaddr, &conn->dst);
1985 if (!s)
1986 return;
1987
1988 rfcomm_session_hold(s);
1989
1990 list_for_each_safe(p, n, &s->dlcs) {
1991 d = list_entry(p, struct rfcomm_dlc, list);
1992
Marcel Holtmann40be4922008-07-14 20:13:50 +02001993 if ((d->link_mode & (RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE)) &&
1994 !(conn->link_mode & HCI_LM_ENCRYPT) && !status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001995 continue;
1996
1997 if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags))
1998 continue;
1999
2000 if (!status)
2001 set_bit(RFCOMM_AUTH_ACCEPT, &d->flags);
2002 else
2003 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
2004 }
2005
2006 rfcomm_session_put(s);
2007
2008 rfcomm_schedule(RFCOMM_SCHED_AUTH);
2009}
2010
2011static void rfcomm_encrypt_cfm(struct hci_conn *conn, u8 status, u8 encrypt)
2012{
2013 struct rfcomm_session *s;
2014 struct rfcomm_dlc *d;
2015 struct list_head *p, *n;
2016
2017 BT_DBG("conn %p status 0x%02x encrypt 0x%02x", conn, status, encrypt);
2018
2019 s = rfcomm_session_get(&conn->hdev->bdaddr, &conn->dst);
2020 if (!s)
2021 return;
2022
2023 rfcomm_session_hold(s);
2024
2025 list_for_each_safe(p, n, &s->dlcs) {
2026 d = list_entry(p, struct rfcomm_dlc, list);
2027
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02002028 if ((d->link_mode & (RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE)) &&
2029 (d->state == BT_CONNECTED ||
2030 d->state == BT_CONFIG) &&
2031 !status && encrypt == 0x00) {
2032 __rfcomm_dlc_close(d, ECONNREFUSED);
2033 continue;
2034 }
2035
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036 if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags))
2037 continue;
2038
2039 if (!status && encrypt)
2040 set_bit(RFCOMM_AUTH_ACCEPT, &d->flags);
2041 else
2042 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
2043 }
2044
2045 rfcomm_session_put(s);
2046
2047 rfcomm_schedule(RFCOMM_SCHED_AUTH);
2048}
2049
2050static struct hci_cb rfcomm_cb = {
2051 .name = "RFCOMM",
2052 .auth_cfm = rfcomm_auth_cfm,
2053 .encrypt_cfm = rfcomm_encrypt_cfm
2054};
2055
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002056static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002057{
2058 struct rfcomm_session *s;
2059 struct list_head *pp, *p;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002060 char *str = buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061
2062 rfcomm_lock();
2063
2064 list_for_each(p, &session_list) {
2065 s = list_entry(p, struct rfcomm_session, list);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002066 list_for_each(pp, &s->dlcs) {
2067 struct sock *sk = s->sock->sk;
2068 struct rfcomm_dlc *d = list_entry(pp, struct rfcomm_dlc, list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002070 str += sprintf(str, "%s %s %ld %d %d %d %d\n",
2071 batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
2072 d->state, d->dlci, d->mtu, d->rx_credits, d->tx_credits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073 }
2074 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075
Linus Torvalds1da177e2005-04-16 15:20:36 -07002076 rfcomm_unlock();
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002077
2078 return (str - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079}
2080
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002081static CLASS_ATTR(rfcomm_dlc, S_IRUGO, rfcomm_dlc_sysfs_show, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082
2083/* ---- Initialization ---- */
2084static int __init rfcomm_init(void)
2085{
2086 l2cap_load();
2087
2088 hci_register_cb(&rfcomm_cb);
2089
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002090 rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd");
2091 if (IS_ERR(rfcomm_thread)) {
2092 hci_unregister_cb(&rfcomm_cb);
2093 return PTR_ERR(rfcomm_thread);
2094 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095
Marcel Holtmanndf5c37e2006-10-15 17:30:45 +02002096 if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0)
2097 BT_ERR("Failed to create RFCOMM info file");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098
2099 rfcomm_init_sockets();
2100
2101#ifdef CONFIG_BT_RFCOMM_TTY
2102 rfcomm_init_ttys();
2103#endif
2104
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002105 BT_INFO("RFCOMM ver %s", VERSION);
2106
Linus Torvalds1da177e2005-04-16 15:20:36 -07002107 return 0;
2108}
2109
2110static void __exit rfcomm_exit(void)
2111{
Marcel Holtmanna91f2e32006-07-03 10:02:41 +02002112 class_remove_file(bt_class, &class_attr_rfcomm_dlc);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002113
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114 hci_unregister_cb(&rfcomm_cb);
2115
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002116 kthread_stop(rfcomm_thread);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117
2118#ifdef CONFIG_BT_RFCOMM_TTY
2119 rfcomm_cleanup_ttys();
2120#endif
2121
2122 rfcomm_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123}
2124
2125module_init(rfcomm_init);
2126module_exit(rfcomm_exit);
2127
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02002128module_param(disable_cfc, bool, 0644);
2129MODULE_PARM_DESC(disable_cfc, "Disable credit based flow control");
2130
Marcel Holtmann98bcd082006-07-14 11:42:12 +02002131module_param(channel_mtu, int, 0644);
2132MODULE_PARM_DESC(channel_mtu, "Default MTU for the RFCOMM channel");
2133
Marcel Holtmann56f3a402006-02-13 11:39:57 +01002134module_param(l2cap_mtu, uint, 0644);
2135MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection");
2136
Marcel Holtmann63fbd242008-08-18 13:23:53 +02002137MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138MODULE_DESCRIPTION("Bluetooth RFCOMM ver " VERSION);
2139MODULE_VERSION(VERSION);
2140MODULE_LICENSE("GPL");
2141MODULE_ALIAS("bt-proto-3");