blob: 3717c25ba33a1d94d1ef63c4e40e79a1d766410e [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 Holtmann5f9018a2009-01-16 10:09:50 +010049#define VERSION "1.11"
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 Holtmann9f2c8a02009-01-15 21:58:40 +0100226static inline int rfcomm_check_security(struct rfcomm_dlc *d)
Marcel Holtmann77db1982008-07-14 20:13:45 +0200227{
228 struct sock *sk = d->session->sock->sk;
229
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100230 return hci_conn_security(l2cap_pi(sk)->conn->hcon, d->sec_level);
Marcel Holtmann77db1982008-07-14 20:13:45 +0200231}
232
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233/* ---- RFCOMM DLCs ---- */
234static void rfcomm_dlc_timeout(unsigned long arg)
235{
236 struct rfcomm_dlc *d = (void *) arg;
237
238 BT_DBG("dlc %p state %ld", d, d->state);
239
240 set_bit(RFCOMM_TIMED_OUT, &d->flags);
241 rfcomm_dlc_put(d);
242 rfcomm_schedule(RFCOMM_SCHED_TIMEO);
243}
244
245static void rfcomm_dlc_set_timer(struct rfcomm_dlc *d, long timeout)
246{
247 BT_DBG("dlc %p state %ld timeout %ld", d, d->state, timeout);
248
249 if (!mod_timer(&d->timer, jiffies + timeout))
250 rfcomm_dlc_hold(d);
251}
252
253static void rfcomm_dlc_clear_timer(struct rfcomm_dlc *d)
254{
255 BT_DBG("dlc %p state %ld", d, d->state);
256
257 if (timer_pending(&d->timer) && del_timer(&d->timer))
258 rfcomm_dlc_put(d);
259}
260
261static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
262{
263 BT_DBG("%p", d);
264
265 d->state = BT_OPEN;
266 d->flags = 0;
267 d->mscex = 0;
268 d->mtu = RFCOMM_DEFAULT_MTU;
269 d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;
270
271 d->cfc = RFCOMM_CFC_DISABLED;
272 d->rx_credits = RFCOMM_DEFAULT_CREDITS;
273}
274
Al Virodd0fc662005-10-07 07:46:04 +0100275struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276{
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200277 struct rfcomm_dlc *d = kzalloc(sizeof(*d), prio);
278
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279 if (!d)
280 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800282 setup_timer(&d->timer, rfcomm_dlc_timeout, (unsigned long)d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283
284 skb_queue_head_init(&d->tx_queue);
285 spin_lock_init(&d->lock);
286 atomic_set(&d->refcnt, 1);
287
288 rfcomm_dlc_clear_state(d);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900289
Linus Torvalds1da177e2005-04-16 15:20:36 -0700290 BT_DBG("%p", d);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200291
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292 return d;
293}
294
295void rfcomm_dlc_free(struct rfcomm_dlc *d)
296{
297 BT_DBG("%p", d);
298
299 skb_queue_purge(&d->tx_queue);
300 kfree(d);
301}
302
303static void rfcomm_dlc_link(struct rfcomm_session *s, struct rfcomm_dlc *d)
304{
305 BT_DBG("dlc %p session %p", d, s);
306
307 rfcomm_session_hold(s);
308
309 rfcomm_dlc_hold(d);
310 list_add(&d->list, &s->dlcs);
311 d->session = s;
312}
313
314static void rfcomm_dlc_unlink(struct rfcomm_dlc *d)
315{
316 struct rfcomm_session *s = d->session;
317
318 BT_DBG("dlc %p refcnt %d session %p", d, atomic_read(&d->refcnt), s);
319
320 list_del(&d->list);
321 d->session = NULL;
322 rfcomm_dlc_put(d);
323
324 rfcomm_session_put(s);
325}
326
327static struct rfcomm_dlc *rfcomm_dlc_get(struct rfcomm_session *s, u8 dlci)
328{
329 struct rfcomm_dlc *d;
330 struct list_head *p;
331
332 list_for_each(p, &s->dlcs) {
333 d = list_entry(p, struct rfcomm_dlc, list);
334 if (d->dlci == dlci)
335 return d;
336 }
337 return NULL;
338}
339
340static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
341{
342 struct rfcomm_session *s;
343 int err = 0;
344 u8 dlci;
345
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900346 BT_DBG("dlc %p state %ld %s %s channel %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700347 d, d->state, batostr(src), batostr(dst), channel);
348
349 if (channel < 1 || channel > 30)
350 return -EINVAL;
351
352 if (d->state != BT_OPEN && d->state != BT_CLOSED)
353 return 0;
354
355 s = rfcomm_session_get(src, dst);
356 if (!s) {
357 s = rfcomm_session_create(src, dst, &err);
358 if (!s)
359 return err;
360 }
361
362 dlci = __dlci(!s->initiator, channel);
363
364 /* Check if DLCI already exists */
365 if (rfcomm_dlc_get(s, dlci))
366 return -EBUSY;
367
368 rfcomm_dlc_clear_state(d);
369
370 d->dlci = dlci;
371 d->addr = __addr(s->initiator, dlci);
372 d->priority = 7;
373
Marcel Holtmann77db1982008-07-14 20:13:45 +0200374 d->state = BT_CONFIG;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375 rfcomm_dlc_link(s, d);
376
Marcel Holtmann77db1982008-07-14 20:13:45 +0200377 d->out = 1;
378
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 d->mtu = s->mtu;
380 d->cfc = (s->cfc == RFCOMM_CFC_UNKNOWN) ? 0 : s->cfc;
381
Marcel Holtmann77db1982008-07-14 20:13:45 +0200382 if (s->state == BT_CONNECTED) {
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100383 if (rfcomm_check_security(d))
Marcel Holtmann77db1982008-07-14 20:13:45 +0200384 rfcomm_send_pn(s, 1, d);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100385 else
386 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
Marcel Holtmann77db1982008-07-14 20:13:45 +0200387 }
388
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389 rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
Marcel Holtmann77db1982008-07-14 20:13:45 +0200390
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 return 0;
392}
393
394int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
395{
396 int r;
397
398 rfcomm_lock();
399
400 r = __rfcomm_dlc_open(d, src, dst, channel);
401
402 rfcomm_unlock();
403 return r;
404}
405
406static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
407{
408 struct rfcomm_session *s = d->session;
409 if (!s)
410 return 0;
411
412 BT_DBG("dlc %p state %ld dlci %d err %d session %p",
413 d, d->state, d->dlci, err, s);
414
415 switch (d->state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416 case BT_CONNECT:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100417 case BT_CONFIG:
418 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
419 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
420 rfcomm_schedule(RFCOMM_SCHED_AUTH);
421 break;
422 }
423 /* Fall through */
424
425 case BT_CONNECTED:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426 d->state = BT_DISCONN;
427 if (skb_queue_empty(&d->tx_queue)) {
428 rfcomm_send_disc(s, d->dlci);
429 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT);
430 } else {
431 rfcomm_queue_disc(d);
432 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT * 2);
433 }
434 break;
435
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100436 case BT_OPEN:
437 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
438 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
439 rfcomm_schedule(RFCOMM_SCHED_AUTH);
440 break;
441 }
442 /* Fall through */
443
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 default:
445 rfcomm_dlc_clear_timer(d);
446
447 rfcomm_dlc_lock(d);
448 d->state = BT_CLOSED;
Dave Young1905f6c2008-04-01 23:59:06 -0700449 d->state_change(d, err);
Arjan van de Ven4c8411f2008-05-29 01:32:47 -0700450 rfcomm_dlc_unlock(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451
452 skb_queue_purge(&d->tx_queue);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453 rfcomm_dlc_unlink(d);
454 }
455
456 return 0;
457}
458
459int rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
460{
461 int r;
462
463 rfcomm_lock();
464
465 r = __rfcomm_dlc_close(d, err);
466
467 rfcomm_unlock();
468 return r;
469}
470
471int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb)
472{
473 int len = skb->len;
474
475 if (d->state != BT_CONNECTED)
476 return -ENOTCONN;
477
478 BT_DBG("dlc %p mtu %d len %d", d, d->mtu, len);
479
480 if (len > d->mtu)
481 return -EINVAL;
482
483 rfcomm_make_uih(skb, d->addr);
484 skb_queue_tail(&d->tx_queue, skb);
485
486 if (!test_bit(RFCOMM_TX_THROTTLED, &d->flags))
487 rfcomm_schedule(RFCOMM_SCHED_TX);
488 return len;
489}
490
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800491void __rfcomm_dlc_throttle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492{
493 BT_DBG("dlc %p state %ld", d, d->state);
494
495 if (!d->cfc) {
496 d->v24_sig |= RFCOMM_V24_FC;
497 set_bit(RFCOMM_MSC_PENDING, &d->flags);
498 }
499 rfcomm_schedule(RFCOMM_SCHED_TX);
500}
501
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800502void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503{
504 BT_DBG("dlc %p state %ld", d, d->state);
505
506 if (!d->cfc) {
507 d->v24_sig &= ~RFCOMM_V24_FC;
508 set_bit(RFCOMM_MSC_PENDING, &d->flags);
509 }
510 rfcomm_schedule(RFCOMM_SCHED_TX);
511}
512
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900513/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514 Set/get modem status functions use _local_ status i.e. what we report
515 to the other side.
516 Remote status is provided by dlc->modem_status() callback.
517 */
518int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
519{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900520 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521 d, d->state, v24_sig);
522
523 if (test_bit(RFCOMM_RX_THROTTLED, &d->flags))
524 v24_sig |= RFCOMM_V24_FC;
525 else
526 v24_sig &= ~RFCOMM_V24_FC;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900527
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528 d->v24_sig = v24_sig;
529
530 if (!test_and_set_bit(RFCOMM_MSC_PENDING, &d->flags))
531 rfcomm_schedule(RFCOMM_SCHED_TX);
532
533 return 0;
534}
535
536int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig)
537{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900538 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 d, d->state, d->v24_sig);
540
541 *v24_sig = d->v24_sig;
542 return 0;
543}
544
545/* ---- RFCOMM sessions ---- */
546static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state)
547{
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200548 struct rfcomm_session *s = kzalloc(sizeof(*s), GFP_KERNEL);
549
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 if (!s)
551 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552
553 BT_DBG("session %p sock %p", s, sock);
554
555 INIT_LIST_HEAD(&s->dlcs);
556 s->state = state;
557 s->sock = sock;
558
559 s->mtu = RFCOMM_DEFAULT_MTU;
Marcel Holtmann7c2660b2006-07-03 10:02:51 +0200560 s->cfc = disable_cfc ? RFCOMM_CFC_DISABLED : RFCOMM_CFC_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561
562 /* Do not increment module usage count for listening sessions.
563 * Otherwise we won't be able to unload the module. */
564 if (state != BT_LISTEN)
565 if (!try_module_get(THIS_MODULE)) {
566 kfree(s);
567 return NULL;
568 }
569
570 list_add(&s->list, &session_list);
571
572 return s;
573}
574
575static void rfcomm_session_del(struct rfcomm_session *s)
576{
577 int state = s->state;
578
579 BT_DBG("session %p state %ld", s, s->state);
580
581 list_del(&s->list);
582
583 if (state == BT_CONNECTED)
584 rfcomm_send_disc(s, 0);
585
586 sock_release(s->sock);
587 kfree(s);
588
589 if (state != BT_LISTEN)
590 module_put(THIS_MODULE);
591}
592
593static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst)
594{
595 struct rfcomm_session *s;
596 struct list_head *p, *n;
597 struct bt_sock *sk;
598 list_for_each_safe(p, n, &session_list) {
599 s = list_entry(p, struct rfcomm_session, list);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900600 sk = bt_sk(s->sock->sk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601
602 if ((!bacmp(src, BDADDR_ANY) || !bacmp(&sk->src, src)) &&
603 !bacmp(&sk->dst, dst))
604 return s;
605 }
606 return NULL;
607}
608
609static void rfcomm_session_close(struct rfcomm_session *s, int err)
610{
611 struct rfcomm_dlc *d;
612 struct list_head *p, *n;
613
614 BT_DBG("session %p state %ld err %d", s, s->state, err);
615
616 rfcomm_session_hold(s);
617
618 s->state = BT_CLOSED;
619
620 /* Close all dlcs */
621 list_for_each_safe(p, n, &s->dlcs) {
622 d = list_entry(p, struct rfcomm_dlc, list);
623 d->state = BT_CLOSED;
624 __rfcomm_dlc_close(d, err);
625 }
626
627 rfcomm_session_put(s);
628}
629
630static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err)
631{
632 struct rfcomm_session *s = NULL;
633 struct sockaddr_l2 addr;
634 struct socket *sock;
635 struct sock *sk;
636
637 BT_DBG("%s %s", batostr(src), batostr(dst));
638
639 *err = rfcomm_l2sock_create(&sock);
640 if (*err < 0)
641 return NULL;
642
643 bacpy(&addr.l2_bdaddr, src);
644 addr.l2_family = AF_BLUETOOTH;
645 addr.l2_psm = 0;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200646 *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647 if (*err < 0)
648 goto failed;
649
650 /* Set L2CAP options */
651 sk = sock->sk;
652 lock_sock(sk);
Marcel Holtmann56f3a402006-02-13 11:39:57 +0100653 l2cap_pi(sk)->imtu = l2cap_mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654 release_sock(sk);
655
656 s = rfcomm_session_add(sock, BT_BOUND);
657 if (!s) {
658 *err = -ENOMEM;
659 goto failed;
660 }
661
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 s->initiator = 1;
663
664 bacpy(&addr.l2_bdaddr, dst);
665 addr.l2_family = AF_BLUETOOTH;
666 addr.l2_psm = htobs(RFCOMM_PSM);
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200667 *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
Marcel Holtmannb4c612a2006-09-23 09:54:38 +0200668 if (*err == 0 || *err == -EINPROGRESS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 return s;
670
671 rfcomm_session_del(s);
672 return NULL;
673
674failed:
675 sock_release(sock);
676 return NULL;
677}
678
679void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst)
680{
681 struct sock *sk = s->sock->sk;
682 if (src)
683 bacpy(src, &bt_sk(sk)->src);
684 if (dst)
685 bacpy(dst, &bt_sk(sk)->dst);
686}
687
688/* ---- RFCOMM frame sending ---- */
689static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len)
690{
691 struct socket *sock = s->sock;
692 struct kvec iv = { data, len };
693 struct msghdr msg;
694
695 BT_DBG("session %p len %d", s, len);
696
697 memset(&msg, 0, sizeof(msg));
698
699 return kernel_sendmsg(sock, &msg, &iv, 1, len);
700}
701
702static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci)
703{
704 struct rfcomm_cmd cmd;
705
706 BT_DBG("%p dlci %d", s, dlci);
707
708 cmd.addr = __addr(s->initiator, dlci);
709 cmd.ctrl = __ctrl(RFCOMM_SABM, 1);
710 cmd.len = __len8(0);
711 cmd.fcs = __fcs2((u8 *) &cmd);
712
713 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
714}
715
716static int rfcomm_send_ua(struct rfcomm_session *s, u8 dlci)
717{
718 struct rfcomm_cmd cmd;
719
720 BT_DBG("%p dlci %d", s, dlci);
721
722 cmd.addr = __addr(!s->initiator, dlci);
723 cmd.ctrl = __ctrl(RFCOMM_UA, 1);
724 cmd.len = __len8(0);
725 cmd.fcs = __fcs2((u8 *) &cmd);
726
727 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
728}
729
730static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci)
731{
732 struct rfcomm_cmd cmd;
733
734 BT_DBG("%p dlci %d", s, dlci);
735
736 cmd.addr = __addr(s->initiator, dlci);
737 cmd.ctrl = __ctrl(RFCOMM_DISC, 1);
738 cmd.len = __len8(0);
739 cmd.fcs = __fcs2((u8 *) &cmd);
740
741 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
742}
743
744static int rfcomm_queue_disc(struct rfcomm_dlc *d)
745{
746 struct rfcomm_cmd *cmd;
747 struct sk_buff *skb;
748
749 BT_DBG("dlc %p dlci %d", d, d->dlci);
750
751 skb = alloc_skb(sizeof(*cmd), GFP_KERNEL);
752 if (!skb)
753 return -ENOMEM;
754
755 cmd = (void *) __skb_put(skb, sizeof(*cmd));
756 cmd->addr = d->addr;
757 cmd->ctrl = __ctrl(RFCOMM_DISC, 1);
758 cmd->len = __len8(0);
759 cmd->fcs = __fcs2((u8 *) cmd);
760
761 skb_queue_tail(&d->tx_queue, skb);
762 rfcomm_schedule(RFCOMM_SCHED_TX);
763 return 0;
764}
765
766static int rfcomm_send_dm(struct rfcomm_session *s, u8 dlci)
767{
768 struct rfcomm_cmd cmd;
769
770 BT_DBG("%p dlci %d", s, dlci);
771
772 cmd.addr = __addr(!s->initiator, dlci);
773 cmd.ctrl = __ctrl(RFCOMM_DM, 1);
774 cmd.len = __len8(0);
775 cmd.fcs = __fcs2((u8 *) &cmd);
776
777 return rfcomm_send_frame(s, (void *) &cmd, sizeof(cmd));
778}
779
780static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type)
781{
782 struct rfcomm_hdr *hdr;
783 struct rfcomm_mcc *mcc;
784 u8 buf[16], *ptr = buf;
785
786 BT_DBG("%p cr %d type %d", s, cr, type);
787
788 hdr = (void *) ptr; ptr += sizeof(*hdr);
789 hdr->addr = __addr(s->initiator, 0);
790 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
791 hdr->len = __len8(sizeof(*mcc) + 1);
792
793 mcc = (void *) ptr; ptr += sizeof(*mcc);
794 mcc->type = __mcc_type(cr, RFCOMM_NSC);
795 mcc->len = __len8(1);
796
797 /* Type that we didn't like */
798 *ptr = __mcc_type(cr, type); ptr++;
799
800 *ptr = __fcs(buf); ptr++;
801
802 return rfcomm_send_frame(s, buf, ptr - buf);
803}
804
805static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d)
806{
807 struct rfcomm_hdr *hdr;
808 struct rfcomm_mcc *mcc;
809 struct rfcomm_pn *pn;
810 u8 buf[16], *ptr = buf;
811
812 BT_DBG("%p cr %d dlci %d mtu %d", s, cr, d->dlci, d->mtu);
813
814 hdr = (void *) ptr; ptr += sizeof(*hdr);
815 hdr->addr = __addr(s->initiator, 0);
816 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
817 hdr->len = __len8(sizeof(*mcc) + sizeof(*pn));
818
819 mcc = (void *) ptr; ptr += sizeof(*mcc);
820 mcc->type = __mcc_type(cr, RFCOMM_PN);
821 mcc->len = __len8(sizeof(*pn));
822
823 pn = (void *) ptr; ptr += sizeof(*pn);
824 pn->dlci = d->dlci;
825 pn->priority = d->priority;
826 pn->ack_timer = 0;
827 pn->max_retrans = 0;
828
829 if (s->cfc) {
830 pn->flow_ctrl = cr ? 0xf0 : 0xe0;
831 pn->credits = RFCOMM_DEFAULT_CREDITS;
832 } else {
833 pn->flow_ctrl = 0;
834 pn->credits = 0;
835 }
836
Marcel Holtmann98bcd082006-07-14 11:42:12 +0200837 if (cr && channel_mtu >= 0)
838 pn->mtu = htobs(channel_mtu);
839 else
840 pn->mtu = htobs(d->mtu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841
842 *ptr = __fcs(buf); ptr++;
843
844 return rfcomm_send_frame(s, buf, ptr - buf);
845}
846
J. Suter3a5e9032005-08-09 20:28:46 -0700847int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
848 u8 bit_rate, u8 data_bits, u8 stop_bits,
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900849 u8 parity, u8 flow_ctrl_settings,
J. Suter3a5e9032005-08-09 20:28:46 -0700850 u8 xon_char, u8 xoff_char, u16 param_mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851{
852 struct rfcomm_hdr *hdr;
853 struct rfcomm_mcc *mcc;
854 struct rfcomm_rpn *rpn;
855 u8 buf[16], *ptr = buf;
856
857 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 +0900858 " flwc_s 0x%x xon_c 0x%x xoff_c 0x%x p_mask 0x%x",
859 s, cr, dlci, bit_rate, data_bits, stop_bits, parity,
J. Suter3a5e9032005-08-09 20:28:46 -0700860 flow_ctrl_settings, xon_char, xoff_char, param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861
862 hdr = (void *) ptr; ptr += sizeof(*hdr);
863 hdr->addr = __addr(s->initiator, 0);
864 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
865 hdr->len = __len8(sizeof(*mcc) + sizeof(*rpn));
866
867 mcc = (void *) ptr; ptr += sizeof(*mcc);
868 mcc->type = __mcc_type(cr, RFCOMM_RPN);
869 mcc->len = __len8(sizeof(*rpn));
870
871 rpn = (void *) ptr; ptr += sizeof(*rpn);
872 rpn->dlci = __addr(1, dlci);
873 rpn->bit_rate = bit_rate;
874 rpn->line_settings = __rpn_line_settings(data_bits, stop_bits, parity);
875 rpn->flow_ctrl = flow_ctrl_settings;
876 rpn->xon_char = xon_char;
877 rpn->xoff_char = xoff_char;
Al Viroe8db8c92006-11-08 00:28:44 -0800878 rpn->param_mask = cpu_to_le16(param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879
880 *ptr = __fcs(buf); ptr++;
881
882 return rfcomm_send_frame(s, buf, ptr - buf);
883}
884
885static int rfcomm_send_rls(struct rfcomm_session *s, int cr, u8 dlci, u8 status)
886{
887 struct rfcomm_hdr *hdr;
888 struct rfcomm_mcc *mcc;
889 struct rfcomm_rls *rls;
890 u8 buf[16], *ptr = buf;
891
892 BT_DBG("%p cr %d status 0x%x", s, cr, status);
893
894 hdr = (void *) ptr; ptr += sizeof(*hdr);
895 hdr->addr = __addr(s->initiator, 0);
896 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
897 hdr->len = __len8(sizeof(*mcc) + sizeof(*rls));
898
899 mcc = (void *) ptr; ptr += sizeof(*mcc);
900 mcc->type = __mcc_type(cr, RFCOMM_RLS);
901 mcc->len = __len8(sizeof(*rls));
902
903 rls = (void *) ptr; ptr += sizeof(*rls);
904 rls->dlci = __addr(1, dlci);
905 rls->status = status;
906
907 *ptr = __fcs(buf); ptr++;
908
909 return rfcomm_send_frame(s, buf, ptr - buf);
910}
911
912static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig)
913{
914 struct rfcomm_hdr *hdr;
915 struct rfcomm_mcc *mcc;
916 struct rfcomm_msc *msc;
917 u8 buf[16], *ptr = buf;
918
919 BT_DBG("%p cr %d v24 0x%x", s, cr, v24_sig);
920
921 hdr = (void *) ptr; ptr += sizeof(*hdr);
922 hdr->addr = __addr(s->initiator, 0);
923 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
924 hdr->len = __len8(sizeof(*mcc) + sizeof(*msc));
925
926 mcc = (void *) ptr; ptr += sizeof(*mcc);
927 mcc->type = __mcc_type(cr, RFCOMM_MSC);
928 mcc->len = __len8(sizeof(*msc));
929
930 msc = (void *) ptr; ptr += sizeof(*msc);
931 msc->dlci = __addr(1, dlci);
932 msc->v24_sig = v24_sig | 0x01;
933
934 *ptr = __fcs(buf); ptr++;
935
936 return rfcomm_send_frame(s, buf, ptr - buf);
937}
938
939static int rfcomm_send_fcoff(struct rfcomm_session *s, int cr)
940{
941 struct rfcomm_hdr *hdr;
942 struct rfcomm_mcc *mcc;
943 u8 buf[16], *ptr = buf;
944
945 BT_DBG("%p cr %d", s, cr);
946
947 hdr = (void *) ptr; ptr += sizeof(*hdr);
948 hdr->addr = __addr(s->initiator, 0);
949 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
950 hdr->len = __len8(sizeof(*mcc));
951
952 mcc = (void *) ptr; ptr += sizeof(*mcc);
953 mcc->type = __mcc_type(cr, RFCOMM_FCOFF);
954 mcc->len = __len8(0);
955
956 *ptr = __fcs(buf); ptr++;
957
958 return rfcomm_send_frame(s, buf, ptr - buf);
959}
960
961static int rfcomm_send_fcon(struct rfcomm_session *s, int cr)
962{
963 struct rfcomm_hdr *hdr;
964 struct rfcomm_mcc *mcc;
965 u8 buf[16], *ptr = buf;
966
967 BT_DBG("%p cr %d", s, cr);
968
969 hdr = (void *) ptr; ptr += sizeof(*hdr);
970 hdr->addr = __addr(s->initiator, 0);
971 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
972 hdr->len = __len8(sizeof(*mcc));
973
974 mcc = (void *) ptr; ptr += sizeof(*mcc);
975 mcc->type = __mcc_type(cr, RFCOMM_FCON);
976 mcc->len = __len8(0);
977
978 *ptr = __fcs(buf); ptr++;
979
980 return rfcomm_send_frame(s, buf, ptr - buf);
981}
982
983static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len)
984{
985 struct socket *sock = s->sock;
986 struct kvec iv[3];
987 struct msghdr msg;
988 unsigned char hdr[5], crc[1];
989
990 if (len > 125)
991 return -EINVAL;
992
993 BT_DBG("%p cr %d", s, cr);
994
995 hdr[0] = __addr(s->initiator, 0);
996 hdr[1] = __ctrl(RFCOMM_UIH, 0);
997 hdr[2] = 0x01 | ((len + 2) << 1);
998 hdr[3] = 0x01 | ((cr & 0x01) << 1) | (RFCOMM_TEST << 2);
999 hdr[4] = 0x01 | (len << 1);
1000
1001 crc[0] = __fcs(hdr);
1002
1003 iv[0].iov_base = hdr;
1004 iv[0].iov_len = 5;
1005 iv[1].iov_base = pattern;
1006 iv[1].iov_len = len;
1007 iv[2].iov_base = crc;
1008 iv[2].iov_len = 1;
1009
1010 memset(&msg, 0, sizeof(msg));
1011
1012 return kernel_sendmsg(sock, &msg, iv, 3, 6 + len);
1013}
1014
1015static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits)
1016{
1017 struct rfcomm_hdr *hdr;
1018 u8 buf[16], *ptr = buf;
1019
1020 BT_DBG("%p addr %d credits %d", s, addr, credits);
1021
1022 hdr = (void *) ptr; ptr += sizeof(*hdr);
1023 hdr->addr = addr;
1024 hdr->ctrl = __ctrl(RFCOMM_UIH, 1);
1025 hdr->len = __len8(0);
1026
1027 *ptr = credits; ptr++;
1028
1029 *ptr = __fcs(buf); ptr++;
1030
1031 return rfcomm_send_frame(s, buf, ptr - buf);
1032}
1033
1034static void rfcomm_make_uih(struct sk_buff *skb, u8 addr)
1035{
1036 struct rfcomm_hdr *hdr;
1037 int len = skb->len;
1038 u8 *crc;
1039
1040 if (len > 127) {
1041 hdr = (void *) skb_push(skb, 4);
Al Viro6ba9c752006-11-08 00:28:19 -08001042 put_unaligned(htobs(__len16(len)), (__le16 *) &hdr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043 } else {
1044 hdr = (void *) skb_push(skb, 3);
1045 hdr->len = __len8(len);
1046 }
1047 hdr->addr = addr;
1048 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1049
1050 crc = skb_put(skb, 1);
1051 *crc = __fcs((void *) hdr);
1052}
1053
1054/* ---- RFCOMM frame reception ---- */
1055static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
1056{
1057 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1058
1059 if (dlci) {
1060 /* Data channel */
1061 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1062 if (!d) {
1063 rfcomm_send_dm(s, dlci);
1064 return 0;
1065 }
1066
1067 switch (d->state) {
1068 case BT_CONNECT:
1069 rfcomm_dlc_clear_timer(d);
1070
1071 rfcomm_dlc_lock(d);
1072 d->state = BT_CONNECTED;
1073 d->state_change(d, 0);
1074 rfcomm_dlc_unlock(d);
1075
1076 rfcomm_send_msc(s, 1, dlci, d->v24_sig);
1077 break;
1078
1079 case BT_DISCONN:
1080 d->state = BT_CLOSED;
1081 __rfcomm_dlc_close(d, 0);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001082
1083 if (list_empty(&s->dlcs)) {
1084 s->state = BT_DISCONN;
1085 rfcomm_send_disc(s, 0);
1086 }
1087
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088 break;
1089 }
1090 } else {
1091 /* Control channel */
1092 switch (s->state) {
1093 case BT_CONNECT:
1094 s->state = BT_CONNECTED;
1095 rfcomm_process_connect(s);
1096 break;
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001097
1098 case BT_DISCONN:
1099 rfcomm_session_put(s);
1100 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101 }
1102 }
1103 return 0;
1104}
1105
1106static int rfcomm_recv_dm(struct rfcomm_session *s, u8 dlci)
1107{
1108 int err = 0;
1109
1110 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1111
1112 if (dlci) {
1113 /* Data DLC */
1114 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1115 if (d) {
1116 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1117 err = ECONNREFUSED;
1118 else
1119 err = ECONNRESET;
1120
1121 d->state = BT_CLOSED;
1122 __rfcomm_dlc_close(d, err);
1123 }
1124 } else {
1125 if (s->state == BT_CONNECT)
1126 err = ECONNREFUSED;
1127 else
1128 err = ECONNRESET;
1129
1130 s->state = BT_CLOSED;
1131 rfcomm_session_close(s, err);
1132 }
1133 return 0;
1134}
1135
1136static int rfcomm_recv_disc(struct rfcomm_session *s, u8 dlci)
1137{
1138 int err = 0;
1139
1140 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1141
1142 if (dlci) {
1143 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1144 if (d) {
1145 rfcomm_send_ua(s, dlci);
1146
1147 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1148 err = ECONNREFUSED;
1149 else
1150 err = ECONNRESET;
1151
1152 d->state = BT_CLOSED;
1153 __rfcomm_dlc_close(d, err);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001154 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 rfcomm_send_dm(s, dlci);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001156
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157 } else {
1158 rfcomm_send_ua(s, 0);
1159
1160 if (s->state == BT_CONNECT)
1161 err = ECONNREFUSED;
1162 else
1163 err = ECONNRESET;
1164
1165 s->state = BT_CLOSED;
1166 rfcomm_session_close(s, err);
1167 }
1168
1169 return 0;
1170}
1171
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001172void rfcomm_dlc_accept(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173{
Marcel Holtmann300b9392006-07-03 10:37:55 +02001174 struct sock *sk = d->session->sock->sk;
1175
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176 BT_DBG("dlc %p", d);
1177
1178 rfcomm_send_ua(d->session, d->dlci);
1179
1180 rfcomm_dlc_lock(d);
1181 d->state = BT_CONNECTED;
1182 d->state_change(d, 0);
1183 rfcomm_dlc_unlock(d);
1184
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001185 if (d->role_switch)
Marcel Holtmann300b9392006-07-03 10:37:55 +02001186 hci_conn_switch_role(l2cap_pi(sk)->conn->hcon, 0x00);
1187
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
1189}
1190
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001191static void rfcomm_check_accept(struct rfcomm_dlc *d)
1192{
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001193 if (rfcomm_check_security(d)) {
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001194 if (d->defer_setup) {
1195 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1196 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1197 } else
1198 rfcomm_dlc_accept(d);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001199 } else {
1200 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1201 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001202 }
1203}
1204
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
1206{
1207 struct rfcomm_dlc *d;
1208 u8 channel;
1209
1210 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1211
1212 if (!dlci) {
1213 rfcomm_send_ua(s, 0);
1214
1215 if (s->state == BT_OPEN) {
1216 s->state = BT_CONNECTED;
1217 rfcomm_process_connect(s);
1218 }
1219 return 0;
1220 }
1221
1222 /* Check if DLC exists */
1223 d = rfcomm_dlc_get(s, dlci);
1224 if (d) {
1225 if (d->state == BT_OPEN) {
1226 /* DLC was previously opened by PN request */
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001227 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 }
1229 return 0;
1230 }
1231
1232 /* Notify socket layer about incoming connection */
1233 channel = __srv_channel(dlci);
1234 if (rfcomm_connect_ind(s, channel, &d)) {
1235 d->dlci = dlci;
1236 d->addr = __addr(s->initiator, dlci);
1237 rfcomm_dlc_link(s, d);
1238
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001239 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 } else {
1241 rfcomm_send_dm(s, dlci);
1242 }
1243
1244 return 0;
1245}
1246
1247static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)
1248{
1249 struct rfcomm_session *s = d->session;
1250
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001251 BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits);
1253
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001254 if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) ||
1255 pn->flow_ctrl == 0xe0) {
1256 d->cfc = RFCOMM_CFC_ENABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257 d->tx_credits = pn->credits;
1258 } else {
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001259 d->cfc = RFCOMM_CFC_DISABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1261 }
1262
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001263 if (s->cfc == RFCOMM_CFC_UNKNOWN)
1264 s->cfc = d->cfc;
1265
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266 d->priority = pn->priority;
1267
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001268 d->mtu = btohs(pn->mtu);
1269
1270 if (cr && d->mtu > s->mtu)
1271 d->mtu = s->mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272
1273 return 0;
1274}
1275
1276static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1277{
1278 struct rfcomm_pn *pn = (void *) skb->data;
1279 struct rfcomm_dlc *d;
1280 u8 dlci = pn->dlci;
1281
1282 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1283
1284 if (!dlci)
1285 return 0;
1286
1287 d = rfcomm_dlc_get(s, dlci);
1288 if (d) {
1289 if (cr) {
1290 /* PN request */
1291 rfcomm_apply_pn(d, cr, pn);
1292 rfcomm_send_pn(s, 0, d);
1293 } else {
1294 /* PN response */
1295 switch (d->state) {
1296 case BT_CONFIG:
1297 rfcomm_apply_pn(d, cr, pn);
1298
1299 d->state = BT_CONNECT;
1300 rfcomm_send_sabm(s, d->dlci);
1301 break;
1302 }
1303 }
1304 } else {
1305 u8 channel = __srv_channel(dlci);
1306
1307 if (!cr)
1308 return 0;
1309
1310 /* PN request for non existing DLC.
1311 * Assume incoming connection. */
1312 if (rfcomm_connect_ind(s, channel, &d)) {
1313 d->dlci = dlci;
1314 d->addr = __addr(s->initiator, dlci);
1315 rfcomm_dlc_link(s, d);
1316
1317 rfcomm_apply_pn(d, cr, pn);
1318
1319 d->state = BT_OPEN;
1320 rfcomm_send_pn(s, 0, d);
1321 } else {
1322 rfcomm_send_dm(s, dlci);
1323 }
1324 }
1325 return 0;
1326}
1327
1328static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_buff *skb)
1329{
1330 struct rfcomm_rpn *rpn = (void *) skb->data;
1331 u8 dlci = __get_dlci(rpn->dlci);
1332
1333 u8 bit_rate = 0;
1334 u8 data_bits = 0;
1335 u8 stop_bits = 0;
1336 u8 parity = 0;
1337 u8 flow_ctrl = 0;
1338 u8 xon_char = 0;
1339 u8 xoff_char = 0;
1340 u16 rpn_mask = RFCOMM_RPN_PM_ALL;
J. Suter3a5e9032005-08-09 20:28:46 -07001341
1342 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",
1343 dlci, cr, len, rpn->bit_rate, rpn->line_settings, rpn->flow_ctrl,
1344 rpn->xon_char, rpn->xoff_char, rpn->param_mask);
1345
1346 if (!cr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347 return 0;
J. Suter3a5e9032005-08-09 20:28:46 -07001348
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 if (len == 1) {
J. Suter3a5e9032005-08-09 20:28:46 -07001350 /* This is a request, return default settings */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351 bit_rate = RFCOMM_RPN_BR_115200;
1352 data_bits = RFCOMM_RPN_DATA_8;
1353 stop_bits = RFCOMM_RPN_STOP_1;
1354 parity = RFCOMM_RPN_PARITY_NONE;
1355 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1356 xon_char = RFCOMM_RPN_XON_CHAR;
1357 xoff_char = RFCOMM_RPN_XOFF_CHAR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 goto rpn_out;
1359 }
J. Suter3a5e9032005-08-09 20:28:46 -07001360
1361 /* Check for sane values, ignore/accept bit_rate, 8 bits, 1 stop bit,
1362 * no parity, no flow control lines, normal XON/XOFF chars */
1363
Al Viroe8db8c92006-11-08 00:28:44 -08001364 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_BITRATE)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365 bit_rate = rpn->bit_rate;
1366 if (bit_rate != RFCOMM_RPN_BR_115200) {
1367 BT_DBG("RPN bit rate mismatch 0x%x", bit_rate);
1368 bit_rate = RFCOMM_RPN_BR_115200;
1369 rpn_mask ^= RFCOMM_RPN_PM_BITRATE;
1370 }
1371 }
J. Suter3a5e9032005-08-09 20:28:46 -07001372
Al Viroe8db8c92006-11-08 00:28:44 -08001373 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_DATA)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374 data_bits = __get_rpn_data_bits(rpn->line_settings);
1375 if (data_bits != RFCOMM_RPN_DATA_8) {
1376 BT_DBG("RPN data bits mismatch 0x%x", data_bits);
1377 data_bits = RFCOMM_RPN_DATA_8;
1378 rpn_mask ^= RFCOMM_RPN_PM_DATA;
1379 }
1380 }
J. Suter3a5e9032005-08-09 20:28:46 -07001381
Al Viroe8db8c92006-11-08 00:28:44 -08001382 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_STOP)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383 stop_bits = __get_rpn_stop_bits(rpn->line_settings);
1384 if (stop_bits != RFCOMM_RPN_STOP_1) {
1385 BT_DBG("RPN stop bits mismatch 0x%x", stop_bits);
1386 stop_bits = RFCOMM_RPN_STOP_1;
1387 rpn_mask ^= RFCOMM_RPN_PM_STOP;
1388 }
1389 }
J. Suter3a5e9032005-08-09 20:28:46 -07001390
Al Viroe8db8c92006-11-08 00:28:44 -08001391 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_PARITY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392 parity = __get_rpn_parity(rpn->line_settings);
1393 if (parity != RFCOMM_RPN_PARITY_NONE) {
1394 BT_DBG("RPN parity mismatch 0x%x", parity);
1395 parity = RFCOMM_RPN_PARITY_NONE;
1396 rpn_mask ^= RFCOMM_RPN_PM_PARITY;
1397 }
1398 }
J. Suter3a5e9032005-08-09 20:28:46 -07001399
Al Viroe8db8c92006-11-08 00:28:44 -08001400 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_FLOW)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401 flow_ctrl = rpn->flow_ctrl;
1402 if (flow_ctrl != RFCOMM_RPN_FLOW_NONE) {
1403 BT_DBG("RPN flow ctrl mismatch 0x%x", flow_ctrl);
1404 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1405 rpn_mask ^= RFCOMM_RPN_PM_FLOW;
1406 }
1407 }
J. Suter3a5e9032005-08-09 20:28:46 -07001408
Al Viroe8db8c92006-11-08 00:28:44 -08001409 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XON)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410 xon_char = rpn->xon_char;
1411 if (xon_char != RFCOMM_RPN_XON_CHAR) {
1412 BT_DBG("RPN XON char mismatch 0x%x", xon_char);
1413 xon_char = RFCOMM_RPN_XON_CHAR;
1414 rpn_mask ^= RFCOMM_RPN_PM_XON;
1415 }
1416 }
J. Suter3a5e9032005-08-09 20:28:46 -07001417
Al Viroe8db8c92006-11-08 00:28:44 -08001418 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XOFF)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419 xoff_char = rpn->xoff_char;
1420 if (xoff_char != RFCOMM_RPN_XOFF_CHAR) {
1421 BT_DBG("RPN XOFF char mismatch 0x%x", xoff_char);
1422 xoff_char = RFCOMM_RPN_XOFF_CHAR;
1423 rpn_mask ^= RFCOMM_RPN_PM_XOFF;
1424 }
1425 }
1426
1427rpn_out:
J. Suter3a5e9032005-08-09 20:28:46 -07001428 rfcomm_send_rpn(s, 0, dlci, bit_rate, data_bits, stop_bits,
1429 parity, flow_ctrl, xon_char, xoff_char, rpn_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430
1431 return 0;
1432}
1433
1434static int rfcomm_recv_rls(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1435{
1436 struct rfcomm_rls *rls = (void *) skb->data;
1437 u8 dlci = __get_dlci(rls->dlci);
1438
1439 BT_DBG("dlci %d cr %d status 0x%x", dlci, cr, rls->status);
J. Suter3a5e9032005-08-09 20:28:46 -07001440
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 if (!cr)
1442 return 0;
1443
J. Suter3a5e9032005-08-09 20:28:46 -07001444 /* We should probably do something with this information here. But
1445 * for now it's sufficient just to reply -- Bluetooth 1.1 says it's
1446 * mandatory to recognise and respond to RLS */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447
1448 rfcomm_send_rls(s, 0, dlci, rls->status);
1449
1450 return 0;
1451}
1452
1453static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1454{
1455 struct rfcomm_msc *msc = (void *) skb->data;
1456 struct rfcomm_dlc *d;
1457 u8 dlci = __get_dlci(msc->dlci);
1458
1459 BT_DBG("dlci %d cr %d v24 0x%x", dlci, cr, msc->v24_sig);
1460
1461 d = rfcomm_dlc_get(s, dlci);
J. Suter3a5e9032005-08-09 20:28:46 -07001462 if (!d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463 return 0;
1464
1465 if (cr) {
1466 if (msc->v24_sig & RFCOMM_V24_FC && !d->cfc)
1467 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1468 else
1469 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
J. Suter3a5e9032005-08-09 20:28:46 -07001470
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471 rfcomm_dlc_lock(d);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001472
1473 d->remote_v24_sig = msc->v24_sig;
1474
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 if (d->modem_status)
1476 d->modem_status(d, msc->v24_sig);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001477
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478 rfcomm_dlc_unlock(d);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001479
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480 rfcomm_send_msc(s, 0, dlci, msc->v24_sig);
1481
1482 d->mscex |= RFCOMM_MSCEX_RX;
J. Suter3a5e9032005-08-09 20:28:46 -07001483 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 d->mscex |= RFCOMM_MSCEX_TX;
1485
1486 return 0;
1487}
1488
1489static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
1490{
1491 struct rfcomm_mcc *mcc = (void *) skb->data;
1492 u8 type, cr, len;
1493
1494 cr = __test_cr(mcc->type);
1495 type = __get_mcc_type(mcc->type);
1496 len = __get_mcc_len(mcc->len);
1497
1498 BT_DBG("%p type 0x%x cr %d", s, type, cr);
1499
1500 skb_pull(skb, 2);
1501
1502 switch (type) {
1503 case RFCOMM_PN:
1504 rfcomm_recv_pn(s, cr, skb);
1505 break;
1506
1507 case RFCOMM_RPN:
1508 rfcomm_recv_rpn(s, cr, len, skb);
1509 break;
1510
1511 case RFCOMM_RLS:
1512 rfcomm_recv_rls(s, cr, skb);
1513 break;
1514
1515 case RFCOMM_MSC:
1516 rfcomm_recv_msc(s, cr, skb);
1517 break;
1518
1519 case RFCOMM_FCOFF:
1520 if (cr) {
1521 set_bit(RFCOMM_TX_THROTTLED, &s->flags);
1522 rfcomm_send_fcoff(s, 0);
1523 }
1524 break;
1525
1526 case RFCOMM_FCON:
1527 if (cr) {
1528 clear_bit(RFCOMM_TX_THROTTLED, &s->flags);
1529 rfcomm_send_fcon(s, 0);
1530 }
1531 break;
1532
1533 case RFCOMM_TEST:
1534 if (cr)
1535 rfcomm_send_test(s, 0, skb->data, skb->len);
1536 break;
1537
1538 case RFCOMM_NSC:
1539 break;
1540
1541 default:
1542 BT_ERR("Unknown control type 0x%02x", type);
1543 rfcomm_send_nsc(s, cr, type);
1544 break;
1545 }
1546 return 0;
1547}
1548
1549static int rfcomm_recv_data(struct rfcomm_session *s, u8 dlci, int pf, struct sk_buff *skb)
1550{
1551 struct rfcomm_dlc *d;
1552
1553 BT_DBG("session %p state %ld dlci %d pf %d", s, s->state, dlci, pf);
1554
1555 d = rfcomm_dlc_get(s, dlci);
1556 if (!d) {
1557 rfcomm_send_dm(s, dlci);
1558 goto drop;
1559 }
1560
1561 if (pf && d->cfc) {
1562 u8 credits = *(u8 *) skb->data; skb_pull(skb, 1);
1563
1564 d->tx_credits += credits;
1565 if (d->tx_credits)
1566 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
1567 }
1568
1569 if (skb->len && d->state == BT_CONNECTED) {
1570 rfcomm_dlc_lock(d);
1571 d->rx_credits--;
1572 d->data_ready(d, skb);
1573 rfcomm_dlc_unlock(d);
1574 return 0;
1575 }
1576
1577drop:
1578 kfree_skb(skb);
1579 return 0;
1580}
1581
1582static int rfcomm_recv_frame(struct rfcomm_session *s, struct sk_buff *skb)
1583{
1584 struct rfcomm_hdr *hdr = (void *) skb->data;
1585 u8 type, dlci, fcs;
1586
1587 dlci = __get_dlci(hdr->addr);
1588 type = __get_type(hdr->ctrl);
1589
1590 /* Trim FCS */
1591 skb->len--; skb->tail--;
Arnaldo Carvalho de Melo27a884d2007-04-19 20:29:13 -07001592 fcs = *(u8 *)skb_tail_pointer(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593
1594 if (__check_fcs(skb->data, type, fcs)) {
1595 BT_ERR("bad checksum in packet");
1596 kfree_skb(skb);
1597 return -EILSEQ;
1598 }
1599
1600 if (__test_ea(hdr->len))
1601 skb_pull(skb, 3);
1602 else
1603 skb_pull(skb, 4);
1604
1605 switch (type) {
1606 case RFCOMM_SABM:
1607 if (__test_pf(hdr->ctrl))
1608 rfcomm_recv_sabm(s, dlci);
1609 break;
1610
1611 case RFCOMM_DISC:
1612 if (__test_pf(hdr->ctrl))
1613 rfcomm_recv_disc(s, dlci);
1614 break;
1615
1616 case RFCOMM_UA:
1617 if (__test_pf(hdr->ctrl))
1618 rfcomm_recv_ua(s, dlci);
1619 break;
1620
1621 case RFCOMM_DM:
1622 rfcomm_recv_dm(s, dlci);
1623 break;
1624
1625 case RFCOMM_UIH:
1626 if (dlci)
1627 return rfcomm_recv_data(s, dlci, __test_pf(hdr->ctrl), skb);
1628
1629 rfcomm_recv_mcc(s, skb);
1630 break;
1631
1632 default:
1633 BT_ERR("Unknown packet type 0x%02x\n", type);
1634 break;
1635 }
1636 kfree_skb(skb);
1637 return 0;
1638}
1639
1640/* ---- Connection and data processing ---- */
1641
1642static void rfcomm_process_connect(struct rfcomm_session *s)
1643{
1644 struct rfcomm_dlc *d;
1645 struct list_head *p, *n;
1646
1647 BT_DBG("session %p state %ld", s, s->state);
1648
1649 list_for_each_safe(p, n, &s->dlcs) {
1650 d = list_entry(p, struct rfcomm_dlc, list);
1651 if (d->state == BT_CONFIG) {
1652 d->mtu = s->mtu;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001653 if (rfcomm_check_security(d)) {
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001654 rfcomm_send_pn(s, 1, d);
1655 } else {
Marcel Holtmann77db1982008-07-14 20:13:45 +02001656 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1657 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001658 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 }
1660 }
1661}
1662
1663/* Send data queued for the DLC.
1664 * Return number of frames left in the queue.
1665 */
1666static inline int rfcomm_process_tx(struct rfcomm_dlc *d)
1667{
1668 struct sk_buff *skb;
1669 int err;
1670
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001671 BT_DBG("dlc %p state %ld cfc %d rx_credits %d tx_credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672 d, d->state, d->cfc, d->rx_credits, d->tx_credits);
1673
1674 /* Send pending MSC */
1675 if (test_and_clear_bit(RFCOMM_MSC_PENDING, &d->flags))
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001676 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677
1678 if (d->cfc) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001679 /* CFC enabled.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 * Give them some credits */
1681 if (!test_bit(RFCOMM_RX_THROTTLED, &d->flags) &&
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001682 d->rx_credits <= (d->cfc >> 2)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 rfcomm_send_credits(d->session, d->addr, d->cfc - d->rx_credits);
1684 d->rx_credits = d->cfc;
1685 }
1686 } else {
1687 /* CFC disabled.
1688 * Give ourselves some credits */
1689 d->tx_credits = 5;
1690 }
1691
1692 if (test_bit(RFCOMM_TX_THROTTLED, &d->flags))
1693 return skb_queue_len(&d->tx_queue);
1694
1695 while (d->tx_credits && (skb = skb_dequeue(&d->tx_queue))) {
1696 err = rfcomm_send_frame(d->session, skb->data, skb->len);
1697 if (err < 0) {
1698 skb_queue_head(&d->tx_queue, skb);
1699 break;
1700 }
1701 kfree_skb(skb);
1702 d->tx_credits--;
1703 }
1704
1705 if (d->cfc && !d->tx_credits) {
1706 /* We're out of TX credits.
1707 * Set TX_THROTTLED flag to avoid unnesary wakeups by dlc_send. */
1708 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1709 }
1710
1711 return skb_queue_len(&d->tx_queue);
1712}
1713
1714static inline void rfcomm_process_dlcs(struct rfcomm_session *s)
1715{
1716 struct rfcomm_dlc *d;
1717 struct list_head *p, *n;
1718
1719 BT_DBG("session %p state %ld", s, s->state);
1720
1721 list_for_each_safe(p, n, &s->dlcs) {
1722 d = list_entry(p, struct rfcomm_dlc, list);
1723
1724 if (test_bit(RFCOMM_TIMED_OUT, &d->flags)) {
1725 __rfcomm_dlc_close(d, ETIMEDOUT);
1726 continue;
1727 }
1728
1729 if (test_and_clear_bit(RFCOMM_AUTH_ACCEPT, &d->flags)) {
1730 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001731 if (d->out) {
1732 rfcomm_send_pn(s, 1, d);
1733 rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001734 } else {
1735 if (d->defer_setup) {
1736 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1737 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1738 } else
1739 rfcomm_dlc_accept(d);
1740 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741 continue;
1742 } else if (test_and_clear_bit(RFCOMM_AUTH_REJECT, &d->flags)) {
1743 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001744 if (!d->out)
1745 rfcomm_send_dm(s, d->dlci);
1746 else
1747 d->state = BT_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748 __rfcomm_dlc_close(d, ECONNREFUSED);
1749 continue;
1750 }
1751
Jaikumar Ganesh6e1031a2009-02-02 18:03:57 -08001752 if (test_bit(RFCOMM_SEC_PENDING, &d->flags))
1753 continue;
1754
Linus Torvalds1da177e2005-04-16 15:20:36 -07001755 if (test_bit(RFCOMM_TX_THROTTLED, &s->flags))
1756 continue;
1757
1758 if ((d->state == BT_CONNECTED || d->state == BT_DISCONN) &&
Marcel Holtmann77db1982008-07-14 20:13:45 +02001759 d->mscex == RFCOMM_MSCEX_OK)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001760 rfcomm_process_tx(d);
1761 }
1762}
1763
1764static inline void rfcomm_process_rx(struct rfcomm_session *s)
1765{
1766 struct socket *sock = s->sock;
1767 struct sock *sk = sock->sk;
1768 struct sk_buff *skb;
1769
1770 BT_DBG("session %p state %ld qlen %d", s, s->state, skb_queue_len(&sk->sk_receive_queue));
1771
1772 /* Get data directly from socket receive queue without copying it. */
1773 while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
1774 skb_orphan(skb);
1775 rfcomm_recv_frame(s, skb);
1776 }
1777
1778 if (sk->sk_state == BT_CLOSED) {
1779 if (!s->initiator)
1780 rfcomm_session_put(s);
1781
1782 rfcomm_session_close(s, sk->sk_err);
1783 }
1784}
1785
1786static inline void rfcomm_accept_connection(struct rfcomm_session *s)
1787{
1788 struct socket *sock = s->sock, *nsock;
1789 int err;
1790
1791 /* Fast check for a new connection.
1792 * Avoids unnesesary socket allocations. */
1793 if (list_empty(&bt_sk(sock->sk)->accept_q))
1794 return;
1795
1796 BT_DBG("session %p", s);
1797
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001798 err = kernel_accept(sock, &nsock, O_NONBLOCK);
1799 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800 return;
1801
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802 /* Set our callbacks */
1803 nsock->sk->sk_data_ready = rfcomm_l2data_ready;
1804 nsock->sk->sk_state_change = rfcomm_l2state_change;
1805
1806 s = rfcomm_session_add(nsock, BT_OPEN);
1807 if (s) {
1808 rfcomm_session_hold(s);
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001809
1810 /* We should adjust MTU on incoming sessions.
1811 * L2CAP MTU minus UIH header and FCS. */
1812 s->mtu = min(l2cap_pi(nsock->sk)->omtu, l2cap_pi(nsock->sk)->imtu) - 5;
1813
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814 rfcomm_schedule(RFCOMM_SCHED_RX);
1815 } else
1816 sock_release(nsock);
1817}
1818
1819static inline void rfcomm_check_connection(struct rfcomm_session *s)
1820{
1821 struct sock *sk = s->sock->sk;
1822
1823 BT_DBG("%p state %ld", s, s->state);
1824
1825 switch(sk->sk_state) {
1826 case BT_CONNECTED:
1827 s->state = BT_CONNECT;
1828
1829 /* We can adjust MTU on outgoing sessions.
1830 * L2CAP MTU minus UIH header and FCS. */
1831 s->mtu = min(l2cap_pi(sk)->omtu, l2cap_pi(sk)->imtu) - 5;
1832
1833 rfcomm_send_sabm(s, 0);
1834 break;
1835
1836 case BT_CLOSED:
1837 s->state = BT_CLOSED;
1838 rfcomm_session_close(s, sk->sk_err);
1839 break;
1840 }
1841}
1842
1843static inline void rfcomm_process_sessions(void)
1844{
1845 struct list_head *p, *n;
1846
1847 rfcomm_lock();
1848
1849 list_for_each_safe(p, n, &session_list) {
1850 struct rfcomm_session *s;
1851 s = list_entry(p, struct rfcomm_session, list);
1852
1853 if (s->state == BT_LISTEN) {
1854 rfcomm_accept_connection(s);
1855 continue;
1856 }
1857
1858 rfcomm_session_hold(s);
1859
1860 switch (s->state) {
1861 case BT_BOUND:
1862 rfcomm_check_connection(s);
1863 break;
1864
1865 default:
1866 rfcomm_process_rx(s);
1867 break;
1868 }
1869
1870 rfcomm_process_dlcs(s);
1871
1872 rfcomm_session_put(s);
1873 }
1874
1875 rfcomm_unlock();
1876}
1877
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878static int rfcomm_add_listener(bdaddr_t *ba)
1879{
1880 struct sockaddr_l2 addr;
1881 struct socket *sock;
1882 struct sock *sk;
1883 struct rfcomm_session *s;
1884 int err = 0;
1885
1886 /* Create socket */
1887 err = rfcomm_l2sock_create(&sock);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001888 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001889 BT_ERR("Create socket failed %d", err);
1890 return err;
1891 }
1892
1893 /* Bind socket */
1894 bacpy(&addr.l2_bdaddr, ba);
1895 addr.l2_family = AF_BLUETOOTH;
1896 addr.l2_psm = htobs(RFCOMM_PSM);
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001897 err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001898 if (err < 0) {
1899 BT_ERR("Bind failed %d", err);
1900 goto failed;
1901 }
1902
1903 /* Set L2CAP options */
1904 sk = sock->sk;
1905 lock_sock(sk);
Marcel Holtmann56f3a402006-02-13 11:39:57 +01001906 l2cap_pi(sk)->imtu = l2cap_mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001907 release_sock(sk);
1908
1909 /* Start listening on the socket */
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001910 err = kernel_listen(sock, 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001911 if (err) {
1912 BT_ERR("Listen failed %d", err);
1913 goto failed;
1914 }
1915
1916 /* Add listening session */
1917 s = rfcomm_session_add(sock, BT_LISTEN);
1918 if (!s)
1919 goto failed;
1920
1921 rfcomm_session_hold(s);
1922 return 0;
1923failed:
1924 sock_release(sock);
1925 return err;
1926}
1927
1928static void rfcomm_kill_listener(void)
1929{
1930 struct rfcomm_session *s;
1931 struct list_head *p, *n;
1932
1933 BT_DBG("");
1934
1935 list_for_each_safe(p, n, &session_list) {
1936 s = list_entry(p, struct rfcomm_session, list);
1937 rfcomm_session_del(s);
1938 }
1939}
1940
1941static int rfcomm_run(void *unused)
1942{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943 BT_DBG("");
1944
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02001945 set_user_nice(current, -10);
1946
Linus Torvalds1da177e2005-04-16 15:20:36 -07001947 rfcomm_add_listener(BDADDR_ANY);
1948
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02001949 while (!kthread_should_stop()) {
1950 set_current_state(TASK_INTERRUPTIBLE);
1951 if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) {
1952 /* No pending events. Let's sleep.
1953 * Incoming connections and data will wake us up. */
1954 schedule();
1955 }
1956 set_current_state(TASK_RUNNING);
1957
1958 /* Process stuff */
1959 clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event);
1960 rfcomm_process_sessions();
1961 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001962
1963 rfcomm_kill_listener();
1964
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 return 0;
1966}
1967
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001968static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001969{
1970 struct rfcomm_session *s;
1971 struct rfcomm_dlc *d;
1972 struct list_head *p, *n;
1973
1974 BT_DBG("conn %p status 0x%02x encrypt 0x%02x", conn, status, encrypt);
1975
1976 s = rfcomm_session_get(&conn->hdev->bdaddr, &conn->dst);
1977 if (!s)
1978 return;
1979
1980 rfcomm_session_hold(s);
1981
1982 list_for_each_safe(p, n, &s->dlcs) {
1983 d = list_entry(p, struct rfcomm_dlc, list);
1984
Marcel Holtmann8c84b832009-01-16 08:17:51 +01001985 if (test_and_clear_bit(RFCOMM_SEC_PENDING, &d->flags)) {
1986 rfcomm_dlc_clear_timer(d);
1987 if (status || encrypt == 0x00) {
1988 __rfcomm_dlc_close(d, ECONNREFUSED);
1989 continue;
1990 }
1991 }
1992
1993 if (d->state == BT_CONNECTED && !status && encrypt == 0x00) {
1994 if (d->sec_level == BT_SECURITY_MEDIUM) {
1995 set_bit(RFCOMM_SEC_PENDING, &d->flags);
1996 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
1997 continue;
1998 } else if (d->sec_level == BT_SECURITY_HIGH) {
1999 __rfcomm_dlc_close(d, ECONNREFUSED);
2000 continue;
2001 }
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02002002 }
2003
Linus Torvalds1da177e2005-04-16 15:20:36 -07002004 if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags))
2005 continue;
2006
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002007 if (!status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008 set_bit(RFCOMM_AUTH_ACCEPT, &d->flags);
2009 else
2010 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
2011 }
2012
2013 rfcomm_session_put(s);
2014
2015 rfcomm_schedule(RFCOMM_SCHED_AUTH);
2016}
2017
2018static struct hci_cb rfcomm_cb = {
2019 .name = "RFCOMM",
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002020 .security_cfm = rfcomm_security_cfm
Linus Torvalds1da177e2005-04-16 15:20:36 -07002021};
2022
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002023static ssize_t rfcomm_dlc_sysfs_show(struct class *dev, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024{
2025 struct rfcomm_session *s;
2026 struct list_head *pp, *p;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002027 char *str = buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028
2029 rfcomm_lock();
2030
2031 list_for_each(p, &session_list) {
2032 s = list_entry(p, struct rfcomm_session, list);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002033 list_for_each(pp, &s->dlcs) {
2034 struct sock *sk = s->sock->sk;
2035 struct rfcomm_dlc *d = list_entry(pp, struct rfcomm_dlc, list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002036
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002037 str += sprintf(str, "%s %s %ld %d %d %d %d\n",
2038 batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
2039 d->state, d->dlci, d->mtu, d->rx_credits, d->tx_credits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040 }
2041 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002042
Linus Torvalds1da177e2005-04-16 15:20:36 -07002043 rfcomm_unlock();
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002044
2045 return (str - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046}
2047
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002048static CLASS_ATTR(rfcomm_dlc, S_IRUGO, rfcomm_dlc_sysfs_show, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049
2050/* ---- Initialization ---- */
2051static int __init rfcomm_init(void)
2052{
2053 l2cap_load();
2054
2055 hci_register_cb(&rfcomm_cb);
2056
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002057 rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd");
2058 if (IS_ERR(rfcomm_thread)) {
2059 hci_unregister_cb(&rfcomm_cb);
2060 return PTR_ERR(rfcomm_thread);
2061 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062
Marcel Holtmanndf5c37e2006-10-15 17:30:45 +02002063 if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0)
2064 BT_ERR("Failed to create RFCOMM info file");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065
2066 rfcomm_init_sockets();
2067
2068#ifdef CONFIG_BT_RFCOMM_TTY
2069 rfcomm_init_ttys();
2070#endif
2071
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002072 BT_INFO("RFCOMM ver %s", VERSION);
2073
Linus Torvalds1da177e2005-04-16 15:20:36 -07002074 return 0;
2075}
2076
2077static void __exit rfcomm_exit(void)
2078{
Marcel Holtmanna91f2e32006-07-03 10:02:41 +02002079 class_remove_file(bt_class, &class_attr_rfcomm_dlc);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002080
Linus Torvalds1da177e2005-04-16 15:20:36 -07002081 hci_unregister_cb(&rfcomm_cb);
2082
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002083 kthread_stop(rfcomm_thread);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084
2085#ifdef CONFIG_BT_RFCOMM_TTY
2086 rfcomm_cleanup_ttys();
2087#endif
2088
2089 rfcomm_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002090}
2091
2092module_init(rfcomm_init);
2093module_exit(rfcomm_exit);
2094
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02002095module_param(disable_cfc, bool, 0644);
2096MODULE_PARM_DESC(disable_cfc, "Disable credit based flow control");
2097
Marcel Holtmann98bcd082006-07-14 11:42:12 +02002098module_param(channel_mtu, int, 0644);
2099MODULE_PARM_DESC(channel_mtu, "Default MTU for the RFCOMM channel");
2100
Marcel Holtmann56f3a402006-02-13 11:39:57 +01002101module_param(l2cap_mtu, uint, 0644);
2102MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection");
2103
Marcel Holtmann63fbd242008-08-18 13:23:53 +02002104MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105MODULE_DESCRIPTION("Bluetooth RFCOMM ver " VERSION);
2106MODULE_VERSION(VERSION);
2107MODULE_LICENSE("GPL");
2108MODULE_ALIAS("bt-proto-3");