blob: b378bbb6f8a79fea17eaf33b5a4e29fa3f5aa0cd [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>
Marcel Holtmannaef7d972010-03-21 05:27:45 +010029#include <linux/debugfs.h>
Marcel Holtmanna524ecc2007-10-20 21:37:20 +020030#include <linux/kthread.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <asm/unaligned.h>
32
33#include <net/bluetooth/bluetooth.h>
34#include <net/bluetooth/hci_core.h>
35#include <net/bluetooth/l2cap.h>
36#include <net/bluetooth/rfcomm.h>
37
Marcel Holtmann5f9018a2009-01-16 10:09:50 +010038#define VERSION "1.11"
Marcel Holtmann56f3a402006-02-13 11:39:57 +010039
Rusty Russelleb939922011-12-19 14:08:01 +000040static bool disable_cfc;
41static bool l2cap_ertm;
Marcel Holtmann98bcd082006-07-14 11:42:12 +020042static int channel_mtu = -1;
Marcel Holtmann56f3a402006-02-13 11:39:57 +010043static unsigned int l2cap_mtu = RFCOMM_MAX_L2CAP_MTU;
44
Linus Torvalds1da177e2005-04-16 15:20:36 -070045static struct task_struct *rfcomm_thread;
46
Arjan van de Ven4a3e2f72006-03-20 22:33:17 -080047static DEFINE_MUTEX(rfcomm_mutex);
48#define rfcomm_lock() mutex_lock(&rfcomm_mutex)
49#define rfcomm_unlock() mutex_unlock(&rfcomm_mutex)
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Linus Torvalds1da177e2005-04-16 15:20:36 -070051
52static LIST_HEAD(session_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Gustavo F. Padovan54365382011-12-20 16:30:44 -020054static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci);
56static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci);
57static int rfcomm_queue_disc(struct rfcomm_dlc *d);
58static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type);
59static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d);
60static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig);
61static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len);
62static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits);
63static void rfcomm_make_uih(struct sk_buff *skb, u8 addr);
64
65static void rfcomm_process_connect(struct rfcomm_session *s);
66
Luiz Augusto von Dentz63ce0902010-08-19 14:06:10 +030067static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src,
68 bdaddr_t *dst,
69 u8 sec_level,
70 int *err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070071static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst);
Dean Jenkins8ff52f72013-02-28 14:21:55 +000072static struct rfcomm_session *rfcomm_session_del(struct rfcomm_session *s);
Linus Torvalds1da177e2005-04-16 15:20:36 -070073
74/* ---- RFCOMM frame parsing macros ---- */
75#define __get_dlci(b) ((b & 0xfc) >> 2)
76#define __get_channel(b) ((b & 0xf8) >> 3)
77#define __get_dir(b) ((b & 0x04) >> 2)
78#define __get_type(b) ((b & 0xef))
79
80#define __test_ea(b) ((b & 0x01))
81#define __test_cr(b) ((b & 0x02))
82#define __test_pf(b) ((b & 0x10))
83
84#define __addr(cr, dlci) (((dlci & 0x3f) << 2) | (cr << 1) | 0x01)
85#define __ctrl(type, pf) (((type & 0xef) | (pf << 4)))
86#define __dlci(dir, chn) (((chn & 0x1f) << 1) | dir)
87#define __srv_channel(dlci) (dlci >> 1)
88#define __dir(dlci) (dlci & 0x01)
89
90#define __len8(len) (((len) << 1) | 1)
91#define __len16(len) ((len) << 1)
92
93/* MCC macros */
94#define __mcc_type(cr, type) (((type << 2) | (cr << 1) | 0x01))
95#define __get_mcc_type(b) ((b & 0xfc) >> 2)
96#define __get_mcc_len(b) ((b & 0xfe) >> 1)
97
98/* RPN macros */
J. Suter3a5e9032005-08-09 20:28:46 -070099#define __rpn_line_settings(data, stop, parity) ((data & 0x3) | ((stop & 0x1) << 2) | ((parity & 0x7) << 3))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700100#define __get_rpn_data_bits(line) ((line) & 0x3)
101#define __get_rpn_stop_bits(line) (((line) >> 2) & 0x1)
J. Suter3a5e9032005-08-09 20:28:46 -0700102#define __get_rpn_parity(line) (((line) >> 3) & 0x7)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300104static void rfcomm_schedule(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105{
106 if (!rfcomm_thread)
107 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108 wake_up_process(rfcomm_thread);
109}
110
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111/* ---- RFCOMM FCS computation ---- */
112
Marcel Holtmann408c1ce2005-10-28 19:20:36 +0200113/* reversed, 8-bit, poly=0x07 */
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900114static unsigned char rfcomm_crc_table[256] = {
Marcel Holtmann408c1ce2005-10-28 19:20:36 +0200115 0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75,
116 0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,
117 0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69,
118 0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67,
119
120 0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d,
121 0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43,
122 0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51,
123 0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f,
124
125 0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05,
126 0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b,
127 0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19,
128 0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17,
129
130 0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d,
131 0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33,
132 0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21,
133 0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f,
134
135 0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95,
136 0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b,
137 0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89,
138 0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87,
139
140 0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad,
141 0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3,
142 0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1,
143 0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf,
144
145 0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5,
146 0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb,
147 0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9,
148 0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7,
149
150 0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd,
151 0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3,
152 0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1,
153 0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf
154};
155
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156/* CRC on 2 bytes */
157#define __crc(data) (rfcomm_crc_table[rfcomm_crc_table[0xff ^ data[0]] ^ data[1]])
158
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900159/* FCS on 2 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160static inline u8 __fcs(u8 *data)
161{
Eric Dumazeta02cec22010-09-22 20:43:57 +0000162 return 0xff - __crc(data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163}
164
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900165/* FCS on 3 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166static inline u8 __fcs2(u8 *data)
167{
Eric Dumazeta02cec22010-09-22 20:43:57 +0000168 return 0xff - rfcomm_crc_table[__crc(data) ^ data[2]];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169}
170
171/* Check FCS */
172static inline int __check_fcs(u8 *data, int type, u8 fcs)
173{
174 u8 f = __crc(data);
175
176 if (type != RFCOMM_UIH)
177 f = rfcomm_crc_table[f ^ data[2]];
178
179 return rfcomm_crc_table[f ^ fcs] != 0xcf;
180}
181
182/* ---- L2CAP callbacks ---- */
183static void rfcomm_l2state_change(struct sock *sk)
184{
185 BT_DBG("%p state %d", sk, sk->sk_state);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300186 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187}
188
189static void rfcomm_l2data_ready(struct sock *sk, int bytes)
190{
191 BT_DBG("%p bytes %d", sk, bytes);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300192 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193}
194
195static int rfcomm_l2sock_create(struct socket **sock)
196{
197 int err;
198
199 BT_DBG("");
200
201 err = sock_create_kern(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP, sock);
202 if (!err) {
203 struct sock *sk = (*sock)->sk;
204 sk->sk_data_ready = rfcomm_l2data_ready;
205 sk->sk_state_change = rfcomm_l2state_change;
206 }
207 return err;
208}
209
Gustavo Padovan6039aa72012-05-23 04:04:18 -0300210static int rfcomm_check_security(struct rfcomm_dlc *d)
Marcel Holtmann77db1982008-07-14 20:13:45 +0200211{
212 struct sock *sk = d->session->sock->sk;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300213 struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn;
214
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100215 __u8 auth_type;
Marcel Holtmann77db1982008-07-14 20:13:45 +0200216
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100217 switch (d->sec_level) {
218 case BT_SECURITY_HIGH:
Marcel Holtmann2c068e02014-01-15 22:37:41 -0800219 case BT_SECURITY_FIPS:
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100220 auth_type = HCI_AT_GENERAL_BONDING_MITM;
221 break;
222 case BT_SECURITY_MEDIUM:
223 auth_type = HCI_AT_GENERAL_BONDING;
224 break;
225 default:
226 auth_type = HCI_AT_NO_BONDING;
227 break;
228 }
229
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300230 return hci_conn_security(conn->hcon, d->sec_level, auth_type);
Marcel Holtmann77db1982008-07-14 20:13:45 +0200231}
232
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300233static void rfcomm_session_timeout(unsigned long arg)
234{
235 struct rfcomm_session *s = (void *) arg;
236
237 BT_DBG("session %p state %ld", s, s->state);
238
239 set_bit(RFCOMM_TIMED_OUT, &s->flags);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300240 rfcomm_schedule();
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300241}
242
243static void rfcomm_session_set_timer(struct rfcomm_session *s, long timeout)
244{
245 BT_DBG("session %p state %ld timeout %ld", s, s->state, timeout);
246
Dean Jenkins08c30ac2013-02-28 14:21:56 +0000247 mod_timer(&s->timer, jiffies + timeout);
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300248}
249
250static void rfcomm_session_clear_timer(struct rfcomm_session *s)
251{
252 BT_DBG("session %p state %ld", s, s->state);
253
Dean Jenkins08c30ac2013-02-28 14:21:56 +0000254 del_timer_sync(&s->timer);
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300255}
256
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257/* ---- RFCOMM DLCs ---- */
258static void rfcomm_dlc_timeout(unsigned long arg)
259{
260 struct rfcomm_dlc *d = (void *) arg;
261
262 BT_DBG("dlc %p state %ld", d, d->state);
263
264 set_bit(RFCOMM_TIMED_OUT, &d->flags);
265 rfcomm_dlc_put(d);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300266 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267}
268
269static void rfcomm_dlc_set_timer(struct rfcomm_dlc *d, long timeout)
270{
271 BT_DBG("dlc %p state %ld timeout %ld", d, d->state, timeout);
272
273 if (!mod_timer(&d->timer, jiffies + timeout))
274 rfcomm_dlc_hold(d);
275}
276
277static void rfcomm_dlc_clear_timer(struct rfcomm_dlc *d)
278{
279 BT_DBG("dlc %p state %ld", d, d->state);
280
Ying Xue25cc4ae2013-02-03 20:32:57 +0000281 if (del_timer(&d->timer))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282 rfcomm_dlc_put(d);
283}
284
285static void rfcomm_dlc_clear_state(struct rfcomm_dlc *d)
286{
287 BT_DBG("%p", d);
288
289 d->state = BT_OPEN;
290 d->flags = 0;
291 d->mscex = 0;
Johan Hedberg183f7322010-12-06 15:56:17 +0200292 d->sec_level = BT_SECURITY_LOW;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 d->mtu = RFCOMM_DEFAULT_MTU;
294 d->v24_sig = RFCOMM_V24_RTC | RFCOMM_V24_RTR | RFCOMM_V24_DV;
295
296 d->cfc = RFCOMM_CFC_DISABLED;
297 d->rx_credits = RFCOMM_DEFAULT_CREDITS;
298}
299
Al Virodd0fc662005-10-07 07:46:04 +0100300struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301{
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200302 struct rfcomm_dlc *d = kzalloc(sizeof(*d), prio);
303
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304 if (!d)
305 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800307 setup_timer(&d->timer, rfcomm_dlc_timeout, (unsigned long)d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308
309 skb_queue_head_init(&d->tx_queue);
310 spin_lock_init(&d->lock);
311 atomic_set(&d->refcnt, 1);
312
313 rfcomm_dlc_clear_state(d);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900314
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315 BT_DBG("%p", d);
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200316
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317 return d;
318}
319
320void rfcomm_dlc_free(struct rfcomm_dlc *d)
321{
322 BT_DBG("%p", d);
323
324 skb_queue_purge(&d->tx_queue);
325 kfree(d);
326}
327
328static void rfcomm_dlc_link(struct rfcomm_session *s, struct rfcomm_dlc *d)
329{
330 BT_DBG("dlc %p session %p", d, s);
331
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300332 rfcomm_session_clear_timer(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333 rfcomm_dlc_hold(d);
334 list_add(&d->list, &s->dlcs);
335 d->session = s;
336}
337
338static void rfcomm_dlc_unlink(struct rfcomm_dlc *d)
339{
340 struct rfcomm_session *s = d->session;
341
342 BT_DBG("dlc %p refcnt %d session %p", d, atomic_read(&d->refcnt), s);
343
344 list_del(&d->list);
345 d->session = NULL;
346 rfcomm_dlc_put(d);
347
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300348 if (list_empty(&s->dlcs))
349 rfcomm_session_set_timer(s, RFCOMM_IDLE_TIMEOUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350}
351
352static struct rfcomm_dlc *rfcomm_dlc_get(struct rfcomm_session *s, u8 dlci)
353{
354 struct rfcomm_dlc *d;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +0200356 list_for_each_entry(d, &s->dlcs, list)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357 if (d->dlci == dlci)
358 return d;
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +0200359
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 return NULL;
361}
362
Peter Hurleyc10a8482014-02-09 20:59:10 -0500363static int rfcomm_check_channel(u8 channel)
364{
365 return channel < 1 || channel > 30;
366}
367
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
369{
370 struct rfcomm_session *s;
371 int err = 0;
372 u8 dlci;
373
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +0300374 BT_DBG("dlc %p state %ld %pMR -> %pMR channel %d",
375 d, d->state, src, dst, channel);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376
Peter Hurleyc10a8482014-02-09 20:59:10 -0500377 if (rfcomm_check_channel(channel))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378 return -EINVAL;
379
380 if (d->state != BT_OPEN && d->state != BT_CLOSED)
381 return 0;
382
383 s = rfcomm_session_get(src, dst);
384 if (!s) {
Luiz Augusto von Dentz63ce0902010-08-19 14:06:10 +0300385 s = rfcomm_session_create(src, dst, d->sec_level, &err);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386 if (!s)
387 return err;
388 }
389
390 dlci = __dlci(!s->initiator, channel);
391
392 /* Check if DLCI already exists */
393 if (rfcomm_dlc_get(s, dlci))
394 return -EBUSY;
395
396 rfcomm_dlc_clear_state(d);
397
398 d->dlci = dlci;
399 d->addr = __addr(s->initiator, dlci);
400 d->priority = 7;
401
Marcel Holtmann77db1982008-07-14 20:13:45 +0200402 d->state = BT_CONFIG;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403 rfcomm_dlc_link(s, d);
404
Marcel Holtmann77db1982008-07-14 20:13:45 +0200405 d->out = 1;
406
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407 d->mtu = s->mtu;
408 d->cfc = (s->cfc == RFCOMM_CFC_UNKNOWN) ? 0 : s->cfc;
409
Marcel Holtmann77db1982008-07-14 20:13:45 +0200410 if (s->state == BT_CONNECTED) {
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +0100411 if (rfcomm_check_security(d))
Marcel Holtmann77db1982008-07-14 20:13:45 +0200412 rfcomm_send_pn(s, 1, d);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100413 else
414 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
Marcel Holtmann77db1982008-07-14 20:13:45 +0200415 }
416
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
Marcel Holtmann77db1982008-07-14 20:13:45 +0200418
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 return 0;
420}
421
422int rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, u8 channel)
423{
424 int r;
425
426 rfcomm_lock();
427
428 r = __rfcomm_dlc_open(d, src, dst, channel);
429
430 rfcomm_unlock();
431 return r;
432}
433
434static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
435{
436 struct rfcomm_session *s = d->session;
437 if (!s)
438 return 0;
439
440 BT_DBG("dlc %p state %ld dlci %d err %d session %p",
441 d, d->state, d->dlci, err, s);
442
443 switch (d->state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 case BT_CONNECT:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100445 case BT_CONFIG:
446 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
447 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300448 rfcomm_schedule();
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100449 break;
450 }
451 /* Fall through */
452
453 case BT_CONNECTED:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 d->state = BT_DISCONN;
455 if (skb_queue_empty(&d->tx_queue)) {
456 rfcomm_send_disc(s, d->dlci);
457 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT);
458 } else {
459 rfcomm_queue_disc(d);
460 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT * 2);
461 }
462 break;
463
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100464 case BT_OPEN:
Marcel Holtmann8bf47942009-02-16 02:59:49 +0100465 case BT_CONNECT2:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100466 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
467 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300468 rfcomm_schedule();
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100469 break;
470 }
471 /* Fall through */
472
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 default:
474 rfcomm_dlc_clear_timer(d);
475
476 rfcomm_dlc_lock(d);
477 d->state = BT_CLOSED;
Dave Young1905f6c2008-04-01 23:59:06 -0700478 d->state_change(d, err);
Arjan van de Ven4c8411f2008-05-29 01:32:47 -0700479 rfcomm_dlc_unlock(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480
481 skb_queue_purge(&d->tx_queue);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482 rfcomm_dlc_unlink(d);
483 }
484
485 return 0;
486}
487
488int rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
489{
Dean Jenkinsc06f7d52013-02-28 14:21:54 +0000490 int r = 0;
491 struct rfcomm_dlc *d_list;
492 struct rfcomm_session *s, *s_list;
493
494 BT_DBG("dlc %p state %ld dlci %d err %d", d, d->state, d->dlci, err);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495
496 rfcomm_lock();
497
Dean Jenkinsc06f7d52013-02-28 14:21:54 +0000498 s = d->session;
499 if (!s)
500 goto no_session;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501
Dean Jenkinsc06f7d52013-02-28 14:21:54 +0000502 /* after waiting on the mutex check the session still exists
503 * then check the dlc still exists
504 */
505 list_for_each_entry(s_list, &session_list, list) {
506 if (s_list == s) {
507 list_for_each_entry(d_list, &s->dlcs, list) {
508 if (d_list == d) {
509 r = __rfcomm_dlc_close(d, err);
510 break;
511 }
512 }
513 break;
514 }
515 }
516
517no_session:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518 rfcomm_unlock();
519 return r;
520}
521
Peter Hurleyc10a8482014-02-09 20:59:10 -0500522struct rfcomm_dlc *rfcomm_dlc_exists(bdaddr_t *src, bdaddr_t *dst, u8 channel)
523{
524 struct rfcomm_session *s;
525 struct rfcomm_dlc *dlc = NULL;
526 u8 dlci;
527
528 if (rfcomm_check_channel(channel))
529 return ERR_PTR(-EINVAL);
530
531 rfcomm_lock();
532 s = rfcomm_session_get(src, dst);
533 if (s) {
534 dlci = __dlci(!s->initiator, channel);
535 dlc = rfcomm_dlc_get(s, dlci);
536 }
537 rfcomm_unlock();
538 return dlc;
539}
540
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb)
542{
543 int len = skb->len;
544
545 if (d->state != BT_CONNECTED)
546 return -ENOTCONN;
547
548 BT_DBG("dlc %p mtu %d len %d", d, d->mtu, len);
549
550 if (len > d->mtu)
551 return -EINVAL;
552
553 rfcomm_make_uih(skb, d->addr);
554 skb_queue_tail(&d->tx_queue, skb);
555
556 if (!test_bit(RFCOMM_TX_THROTTLED, &d->flags))
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300557 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 return len;
559}
560
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800561void __rfcomm_dlc_throttle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562{
563 BT_DBG("dlc %p state %ld", d, d->state);
564
565 if (!d->cfc) {
566 d->v24_sig |= RFCOMM_V24_FC;
567 set_bit(RFCOMM_MSC_PENDING, &d->flags);
568 }
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300569 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570}
571
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800572void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573{
574 BT_DBG("dlc %p state %ld", d, d->state);
575
576 if (!d->cfc) {
577 d->v24_sig &= ~RFCOMM_V24_FC;
578 set_bit(RFCOMM_MSC_PENDING, &d->flags);
579 }
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300580 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581}
582
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900583/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700584 Set/get modem status functions use _local_ status i.e. what we report
585 to the other side.
586 Remote status is provided by dlc->modem_status() callback.
587 */
588int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
589{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900590 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700591 d, d->state, v24_sig);
592
593 if (test_bit(RFCOMM_RX_THROTTLED, &d->flags))
594 v24_sig |= RFCOMM_V24_FC;
595 else
596 v24_sig &= ~RFCOMM_V24_FC;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900597
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598 d->v24_sig = v24_sig;
599
600 if (!test_and_set_bit(RFCOMM_MSC_PENDING, &d->flags))
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300601 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602
603 return 0;
604}
605
606int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig)
607{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900608 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609 d, d->state, d->v24_sig);
610
611 *v24_sig = d->v24_sig;
612 return 0;
613}
614
615/* ---- RFCOMM sessions ---- */
616static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state)
617{
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200618 struct rfcomm_session *s = kzalloc(sizeof(*s), GFP_KERNEL);
619
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 if (!s)
621 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622
623 BT_DBG("session %p sock %p", s, sock);
624
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300625 setup_timer(&s->timer, rfcomm_session_timeout, (unsigned long) s);
626
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 INIT_LIST_HEAD(&s->dlcs);
628 s->state = state;
629 s->sock = sock;
630
631 s->mtu = RFCOMM_DEFAULT_MTU;
Marcel Holtmann7c2660b2006-07-03 10:02:51 +0200632 s->cfc = disable_cfc ? RFCOMM_CFC_DISABLED : RFCOMM_CFC_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633
634 /* Do not increment module usage count for listening sessions.
635 * Otherwise we won't be able to unload the module. */
636 if (state != BT_LISTEN)
637 if (!try_module_get(THIS_MODULE)) {
638 kfree(s);
639 return NULL;
640 }
641
642 list_add(&s->list, &session_list);
643
644 return s;
645}
646
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000647static struct rfcomm_session *rfcomm_session_del(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648{
649 int state = s->state;
650
651 BT_DBG("session %p state %ld", s, s->state);
652
653 list_del(&s->list);
654
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300655 rfcomm_session_clear_timer(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656 sock_release(s->sock);
657 kfree(s);
658
659 if (state != BT_LISTEN)
660 module_put(THIS_MODULE);
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000661
662 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663}
664
665static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst)
666{
667 struct rfcomm_session *s;
668 struct list_head *p, *n;
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700669 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 list_for_each_safe(p, n, &session_list) {
671 s = list_entry(p, struct rfcomm_session, list);
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700672 chan = l2cap_pi(s->sock->sk)->chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700674 if ((!bacmp(src, BDADDR_ANY) || !bacmp(&chan->src, src)) &&
675 !bacmp(&chan->dst, dst))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 return s;
677 }
678 return NULL;
679}
680
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000681static struct rfcomm_session *rfcomm_session_close(struct rfcomm_session *s,
682 int err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683{
684 struct rfcomm_dlc *d;
685 struct list_head *p, *n;
686
Linus Torvalds1da177e2005-04-16 15:20:36 -0700687 s->state = BT_CLOSED;
688
Dean Jenkins24fd6422013-02-28 14:21:58 +0000689 BT_DBG("session %p state %ld err %d", s, s->state, err);
690
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691 /* Close all dlcs */
692 list_for_each_safe(p, n, &s->dlcs) {
693 d = list_entry(p, struct rfcomm_dlc, list);
694 d->state = BT_CLOSED;
695 __rfcomm_dlc_close(d, err);
696 }
697
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300698 rfcomm_session_clear_timer(s);
Dean Jenkins08c30ac2013-02-28 14:21:56 +0000699 return rfcomm_session_del(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700}
701
Luiz Augusto von Dentz63ce0902010-08-19 14:06:10 +0300702static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src,
703 bdaddr_t *dst,
704 u8 sec_level,
705 int *err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706{
707 struct rfcomm_session *s = NULL;
708 struct sockaddr_l2 addr;
709 struct socket *sock;
710 struct sock *sk;
711
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +0300712 BT_DBG("%pMR -> %pMR", src, dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700713
714 *err = rfcomm_l2sock_create(&sock);
715 if (*err < 0)
716 return NULL;
717
718 bacpy(&addr.l2_bdaddr, src);
719 addr.l2_family = AF_BLUETOOTH;
720 addr.l2_psm = 0;
Marcel Holtmann37e62f52009-02-17 21:49:33 +0100721 addr.l2_cid = 0;
Seung-Woo Kimc507f132013-11-05 16:02:24 +0900722 addr.l2_bdaddr_type = BDADDR_BREDR;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200723 *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 if (*err < 0)
725 goto failed;
726
727 /* Set L2CAP options */
728 sk = sock->sk;
729 lock_sock(sk);
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300730 l2cap_pi(sk)->chan->imtu = l2cap_mtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300731 l2cap_pi(sk)->chan->sec_level = sec_level;
Marcel Holtmanneae38ee2009-10-05 12:23:48 +0200732 if (l2cap_ertm)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300733 l2cap_pi(sk)->chan->mode = L2CAP_MODE_ERTM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 release_sock(sk);
735
736 s = rfcomm_session_add(sock, BT_BOUND);
737 if (!s) {
738 *err = -ENOMEM;
739 goto failed;
740 }
741
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742 s->initiator = 1;
743
744 bacpy(&addr.l2_bdaddr, dst);
745 addr.l2_family = AF_BLUETOOTH;
Syam Sidhardhan5bcb8092012-10-10 22:09:29 +0530746 addr.l2_psm = __constant_cpu_to_le16(RFCOMM_PSM);
Marcel Holtmann37e62f52009-02-17 21:49:33 +0100747 addr.l2_cid = 0;
Seung-Woo Kim8992da02013-11-05 17:15:42 +0900748 addr.l2_bdaddr_type = BDADDR_BREDR;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200749 *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
Marcel Holtmannb4c612a2006-09-23 09:54:38 +0200750 if (*err == 0 || *err == -EINPROGRESS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 return s;
752
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000753 return rfcomm_session_del(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754
755failed:
756 sock_release(sock);
757 return NULL;
758}
759
760void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst)
761{
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700762 struct l2cap_chan *chan = l2cap_pi(s->sock->sk)->chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763 if (src)
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700764 bacpy(src, &chan->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765 if (dst)
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700766 bacpy(dst, &chan->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767}
768
769/* ---- RFCOMM frame sending ---- */
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200770static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772 struct kvec iv = { data, len };
773 struct msghdr msg;
774
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200775 BT_DBG("session %p len %d", s, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776
777 memset(&msg, 0, sizeof(msg));
778
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200779 return kernel_sendmsg(s->sock, &msg, &iv, 1, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780}
781
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200782static int rfcomm_send_cmd(struct rfcomm_session *s, struct rfcomm_cmd *cmd)
783{
784 BT_DBG("%p cmd %u", s, cmd->ctrl);
785
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200786 return rfcomm_send_frame(s, (void *) cmd, sizeof(*cmd));
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200787}
788
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci)
790{
791 struct rfcomm_cmd cmd;
792
793 BT_DBG("%p dlci %d", s, dlci);
794
795 cmd.addr = __addr(s->initiator, dlci);
796 cmd.ctrl = __ctrl(RFCOMM_SABM, 1);
797 cmd.len = __len8(0);
798 cmd.fcs = __fcs2((u8 *) &cmd);
799
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200800 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801}
802
803static int rfcomm_send_ua(struct rfcomm_session *s, u8 dlci)
804{
805 struct rfcomm_cmd cmd;
806
807 BT_DBG("%p dlci %d", s, dlci);
808
809 cmd.addr = __addr(!s->initiator, dlci);
810 cmd.ctrl = __ctrl(RFCOMM_UA, 1);
811 cmd.len = __len8(0);
812 cmd.fcs = __fcs2((u8 *) &cmd);
813
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200814 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815}
816
817static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci)
818{
819 struct rfcomm_cmd cmd;
820
821 BT_DBG("%p dlci %d", s, dlci);
822
823 cmd.addr = __addr(s->initiator, dlci);
824 cmd.ctrl = __ctrl(RFCOMM_DISC, 1);
825 cmd.len = __len8(0);
826 cmd.fcs = __fcs2((u8 *) &cmd);
827
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200828 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829}
830
831static int rfcomm_queue_disc(struct rfcomm_dlc *d)
832{
833 struct rfcomm_cmd *cmd;
834 struct sk_buff *skb;
835
836 BT_DBG("dlc %p dlci %d", d, d->dlci);
837
838 skb = alloc_skb(sizeof(*cmd), GFP_KERNEL);
839 if (!skb)
840 return -ENOMEM;
841
842 cmd = (void *) __skb_put(skb, sizeof(*cmd));
843 cmd->addr = d->addr;
844 cmd->ctrl = __ctrl(RFCOMM_DISC, 1);
845 cmd->len = __len8(0);
846 cmd->fcs = __fcs2((u8 *) cmd);
847
848 skb_queue_tail(&d->tx_queue, skb);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300849 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 return 0;
851}
852
853static int rfcomm_send_dm(struct rfcomm_session *s, u8 dlci)
854{
855 struct rfcomm_cmd cmd;
856
857 BT_DBG("%p dlci %d", s, dlci);
858
859 cmd.addr = __addr(!s->initiator, dlci);
860 cmd.ctrl = __ctrl(RFCOMM_DM, 1);
861 cmd.len = __len8(0);
862 cmd.fcs = __fcs2((u8 *) &cmd);
863
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200864 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865}
866
867static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type)
868{
869 struct rfcomm_hdr *hdr;
870 struct rfcomm_mcc *mcc;
871 u8 buf[16], *ptr = buf;
872
873 BT_DBG("%p cr %d type %d", s, cr, type);
874
875 hdr = (void *) ptr; ptr += sizeof(*hdr);
876 hdr->addr = __addr(s->initiator, 0);
877 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
878 hdr->len = __len8(sizeof(*mcc) + 1);
879
880 mcc = (void *) ptr; ptr += sizeof(*mcc);
881 mcc->type = __mcc_type(cr, RFCOMM_NSC);
882 mcc->len = __len8(1);
883
884 /* Type that we didn't like */
885 *ptr = __mcc_type(cr, type); ptr++;
886
887 *ptr = __fcs(buf); ptr++;
888
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200889 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890}
891
892static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d)
893{
894 struct rfcomm_hdr *hdr;
895 struct rfcomm_mcc *mcc;
896 struct rfcomm_pn *pn;
897 u8 buf[16], *ptr = buf;
898
899 BT_DBG("%p cr %d dlci %d mtu %d", s, cr, d->dlci, d->mtu);
900
901 hdr = (void *) ptr; ptr += sizeof(*hdr);
902 hdr->addr = __addr(s->initiator, 0);
903 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
904 hdr->len = __len8(sizeof(*mcc) + sizeof(*pn));
905
906 mcc = (void *) ptr; ptr += sizeof(*mcc);
907 mcc->type = __mcc_type(cr, RFCOMM_PN);
908 mcc->len = __len8(sizeof(*pn));
909
910 pn = (void *) ptr; ptr += sizeof(*pn);
911 pn->dlci = d->dlci;
912 pn->priority = d->priority;
913 pn->ack_timer = 0;
914 pn->max_retrans = 0;
915
916 if (s->cfc) {
917 pn->flow_ctrl = cr ? 0xf0 : 0xe0;
918 pn->credits = RFCOMM_DEFAULT_CREDITS;
919 } else {
920 pn->flow_ctrl = 0;
921 pn->credits = 0;
922 }
923
Marcel Holtmann98bcd082006-07-14 11:42:12 +0200924 if (cr && channel_mtu >= 0)
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200925 pn->mtu = cpu_to_le16(channel_mtu);
Marcel Holtmann98bcd082006-07-14 11:42:12 +0200926 else
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200927 pn->mtu = cpu_to_le16(d->mtu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928
929 *ptr = __fcs(buf); ptr++;
930
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200931 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932}
933
J. Suter3a5e9032005-08-09 20:28:46 -0700934int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
935 u8 bit_rate, u8 data_bits, u8 stop_bits,
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900936 u8 parity, u8 flow_ctrl_settings,
J. Suter3a5e9032005-08-09 20:28:46 -0700937 u8 xon_char, u8 xoff_char, u16 param_mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938{
939 struct rfcomm_hdr *hdr;
940 struct rfcomm_mcc *mcc;
941 struct rfcomm_rpn *rpn;
942 u8 buf[16], *ptr = buf;
943
944 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 +0900945 " flwc_s 0x%x xon_c 0x%x xoff_c 0x%x p_mask 0x%x",
946 s, cr, dlci, bit_rate, data_bits, stop_bits, parity,
J. Suter3a5e9032005-08-09 20:28:46 -0700947 flow_ctrl_settings, xon_char, xoff_char, param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948
949 hdr = (void *) ptr; ptr += sizeof(*hdr);
950 hdr->addr = __addr(s->initiator, 0);
951 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
952 hdr->len = __len8(sizeof(*mcc) + sizeof(*rpn));
953
954 mcc = (void *) ptr; ptr += sizeof(*mcc);
955 mcc->type = __mcc_type(cr, RFCOMM_RPN);
956 mcc->len = __len8(sizeof(*rpn));
957
958 rpn = (void *) ptr; ptr += sizeof(*rpn);
959 rpn->dlci = __addr(1, dlci);
960 rpn->bit_rate = bit_rate;
961 rpn->line_settings = __rpn_line_settings(data_bits, stop_bits, parity);
962 rpn->flow_ctrl = flow_ctrl_settings;
963 rpn->xon_char = xon_char;
964 rpn->xoff_char = xoff_char;
Al Viroe8db8c92006-11-08 00:28:44 -0800965 rpn->param_mask = cpu_to_le16(param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966
967 *ptr = __fcs(buf); ptr++;
968
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200969 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970}
971
972static int rfcomm_send_rls(struct rfcomm_session *s, int cr, u8 dlci, u8 status)
973{
974 struct rfcomm_hdr *hdr;
975 struct rfcomm_mcc *mcc;
976 struct rfcomm_rls *rls;
977 u8 buf[16], *ptr = buf;
978
979 BT_DBG("%p cr %d status 0x%x", s, cr, status);
980
981 hdr = (void *) ptr; ptr += sizeof(*hdr);
982 hdr->addr = __addr(s->initiator, 0);
983 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
984 hdr->len = __len8(sizeof(*mcc) + sizeof(*rls));
985
986 mcc = (void *) ptr; ptr += sizeof(*mcc);
987 mcc->type = __mcc_type(cr, RFCOMM_RLS);
988 mcc->len = __len8(sizeof(*rls));
989
990 rls = (void *) ptr; ptr += sizeof(*rls);
991 rls->dlci = __addr(1, dlci);
992 rls->status = status;
993
994 *ptr = __fcs(buf); ptr++;
995
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200996 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997}
998
999static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig)
1000{
1001 struct rfcomm_hdr *hdr;
1002 struct rfcomm_mcc *mcc;
1003 struct rfcomm_msc *msc;
1004 u8 buf[16], *ptr = buf;
1005
1006 BT_DBG("%p cr %d v24 0x%x", s, cr, v24_sig);
1007
1008 hdr = (void *) ptr; ptr += sizeof(*hdr);
1009 hdr->addr = __addr(s->initiator, 0);
1010 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1011 hdr->len = __len8(sizeof(*mcc) + sizeof(*msc));
1012
1013 mcc = (void *) ptr; ptr += sizeof(*mcc);
1014 mcc->type = __mcc_type(cr, RFCOMM_MSC);
1015 mcc->len = __len8(sizeof(*msc));
1016
1017 msc = (void *) ptr; ptr += sizeof(*msc);
1018 msc->dlci = __addr(1, dlci);
1019 msc->v24_sig = v24_sig | 0x01;
1020
1021 *ptr = __fcs(buf); ptr++;
1022
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001023 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024}
1025
1026static int rfcomm_send_fcoff(struct rfcomm_session *s, int cr)
1027{
1028 struct rfcomm_hdr *hdr;
1029 struct rfcomm_mcc *mcc;
1030 u8 buf[16], *ptr = buf;
1031
1032 BT_DBG("%p cr %d", s, cr);
1033
1034 hdr = (void *) ptr; ptr += sizeof(*hdr);
1035 hdr->addr = __addr(s->initiator, 0);
1036 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1037 hdr->len = __len8(sizeof(*mcc));
1038
1039 mcc = (void *) ptr; ptr += sizeof(*mcc);
1040 mcc->type = __mcc_type(cr, RFCOMM_FCOFF);
1041 mcc->len = __len8(0);
1042
1043 *ptr = __fcs(buf); ptr++;
1044
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001045 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046}
1047
1048static int rfcomm_send_fcon(struct rfcomm_session *s, int cr)
1049{
1050 struct rfcomm_hdr *hdr;
1051 struct rfcomm_mcc *mcc;
1052 u8 buf[16], *ptr = buf;
1053
1054 BT_DBG("%p cr %d", s, cr);
1055
1056 hdr = (void *) ptr; ptr += sizeof(*hdr);
1057 hdr->addr = __addr(s->initiator, 0);
1058 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1059 hdr->len = __len8(sizeof(*mcc));
1060
1061 mcc = (void *) ptr; ptr += sizeof(*mcc);
1062 mcc->type = __mcc_type(cr, RFCOMM_FCON);
1063 mcc->len = __len8(0);
1064
1065 *ptr = __fcs(buf); ptr++;
1066
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001067 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068}
1069
1070static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len)
1071{
1072 struct socket *sock = s->sock;
1073 struct kvec iv[3];
1074 struct msghdr msg;
1075 unsigned char hdr[5], crc[1];
1076
1077 if (len > 125)
1078 return -EINVAL;
1079
1080 BT_DBG("%p cr %d", s, cr);
1081
1082 hdr[0] = __addr(s->initiator, 0);
1083 hdr[1] = __ctrl(RFCOMM_UIH, 0);
1084 hdr[2] = 0x01 | ((len + 2) << 1);
1085 hdr[3] = 0x01 | ((cr & 0x01) << 1) | (RFCOMM_TEST << 2);
1086 hdr[4] = 0x01 | (len << 1);
1087
1088 crc[0] = __fcs(hdr);
1089
1090 iv[0].iov_base = hdr;
1091 iv[0].iov_len = 5;
1092 iv[1].iov_base = pattern;
1093 iv[1].iov_len = len;
1094 iv[2].iov_base = crc;
1095 iv[2].iov_len = 1;
1096
1097 memset(&msg, 0, sizeof(msg));
1098
1099 return kernel_sendmsg(sock, &msg, iv, 3, 6 + len);
1100}
1101
1102static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits)
1103{
1104 struct rfcomm_hdr *hdr;
1105 u8 buf[16], *ptr = buf;
1106
1107 BT_DBG("%p addr %d credits %d", s, addr, credits);
1108
1109 hdr = (void *) ptr; ptr += sizeof(*hdr);
1110 hdr->addr = addr;
1111 hdr->ctrl = __ctrl(RFCOMM_UIH, 1);
1112 hdr->len = __len8(0);
1113
1114 *ptr = credits; ptr++;
1115
1116 *ptr = __fcs(buf); ptr++;
1117
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001118 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119}
1120
1121static void rfcomm_make_uih(struct sk_buff *skb, u8 addr)
1122{
1123 struct rfcomm_hdr *hdr;
1124 int len = skb->len;
1125 u8 *crc;
1126
1127 if (len > 127) {
1128 hdr = (void *) skb_push(skb, 4);
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001129 put_unaligned(cpu_to_le16(__len16(len)), (__le16 *) &hdr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 } else {
1131 hdr = (void *) skb_push(skb, 3);
1132 hdr->len = __len8(len);
1133 }
1134 hdr->addr = addr;
1135 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1136
1137 crc = skb_put(skb, 1);
1138 *crc = __fcs((void *) hdr);
1139}
1140
1141/* ---- RFCOMM frame reception ---- */
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001142static struct rfcomm_session *rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143{
1144 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1145
1146 if (dlci) {
1147 /* Data channel */
1148 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1149 if (!d) {
1150 rfcomm_send_dm(s, dlci);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001151 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 }
1153
1154 switch (d->state) {
1155 case BT_CONNECT:
1156 rfcomm_dlc_clear_timer(d);
1157
1158 rfcomm_dlc_lock(d);
1159 d->state = BT_CONNECTED;
1160 d->state_change(d, 0);
1161 rfcomm_dlc_unlock(d);
1162
1163 rfcomm_send_msc(s, 1, dlci, d->v24_sig);
1164 break;
1165
1166 case BT_DISCONN:
1167 d->state = BT_CLOSED;
1168 __rfcomm_dlc_close(d, 0);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001169
1170 if (list_empty(&s->dlcs)) {
1171 s->state = BT_DISCONN;
1172 rfcomm_send_disc(s, 0);
Mat Martineau79e65472011-12-06 16:23:26 -08001173 rfcomm_session_clear_timer(s);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001174 }
1175
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176 break;
1177 }
1178 } else {
1179 /* Control channel */
1180 switch (s->state) {
1181 case BT_CONNECT:
1182 s->state = BT_CONNECTED;
1183 rfcomm_process_connect(s);
1184 break;
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001185
1186 case BT_DISCONN:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001187 s = rfcomm_session_close(s, ECONNRESET);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001188 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 }
1190 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001191 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192}
1193
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001194static struct rfcomm_session *rfcomm_recv_dm(struct rfcomm_session *s, u8 dlci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195{
1196 int err = 0;
1197
1198 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1199
1200 if (dlci) {
1201 /* Data DLC */
1202 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1203 if (d) {
1204 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1205 err = ECONNREFUSED;
1206 else
1207 err = ECONNRESET;
1208
1209 d->state = BT_CLOSED;
1210 __rfcomm_dlc_close(d, err);
1211 }
1212 } else {
1213 if (s->state == BT_CONNECT)
1214 err = ECONNREFUSED;
1215 else
1216 err = ECONNRESET;
1217
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001218 s = rfcomm_session_close(s, err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001219 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001220 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221}
1222
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001223static struct rfcomm_session *rfcomm_recv_disc(struct rfcomm_session *s,
1224 u8 dlci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225{
1226 int err = 0;
1227
1228 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1229
1230 if (dlci) {
1231 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1232 if (d) {
1233 rfcomm_send_ua(s, dlci);
1234
1235 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1236 err = ECONNREFUSED;
1237 else
1238 err = ECONNRESET;
1239
1240 d->state = BT_CLOSED;
1241 __rfcomm_dlc_close(d, err);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001242 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243 rfcomm_send_dm(s, dlci);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001244
Linus Torvalds1da177e2005-04-16 15:20:36 -07001245 } else {
1246 rfcomm_send_ua(s, 0);
1247
1248 if (s->state == BT_CONNECT)
1249 err = ECONNREFUSED;
1250 else
1251 err = ECONNRESET;
1252
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001253 s = rfcomm_session_close(s, err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001255 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256}
1257
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001258void rfcomm_dlc_accept(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001259{
Marcel Holtmann300b9392006-07-03 10:37:55 +02001260 struct sock *sk = d->session->sock->sk;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001261 struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn;
Marcel Holtmann300b9392006-07-03 10:37:55 +02001262
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 BT_DBG("dlc %p", d);
1264
1265 rfcomm_send_ua(d->session, d->dlci);
1266
Johan Hedberge2139b32009-03-26 16:41:56 +02001267 rfcomm_dlc_clear_timer(d);
1268
Linus Torvalds1da177e2005-04-16 15:20:36 -07001269 rfcomm_dlc_lock(d);
1270 d->state = BT_CONNECTED;
1271 d->state_change(d, 0);
1272 rfcomm_dlc_unlock(d);
1273
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001274 if (d->role_switch)
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001275 hci_conn_switch_role(conn->hcon, 0x00);
Marcel Holtmann300b9392006-07-03 10:37:55 +02001276
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
1278}
1279
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001280static void rfcomm_check_accept(struct rfcomm_dlc *d)
1281{
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001282 if (rfcomm_check_security(d)) {
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001283 if (d->defer_setup) {
1284 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1285 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmann8bf47942009-02-16 02:59:49 +01001286
1287 rfcomm_dlc_lock(d);
1288 d->state = BT_CONNECT2;
1289 d->state_change(d, 0);
1290 rfcomm_dlc_unlock(d);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001291 } else
1292 rfcomm_dlc_accept(d);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001293 } else {
1294 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1295 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001296 }
1297}
1298
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
1300{
1301 struct rfcomm_dlc *d;
1302 u8 channel;
1303
1304 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1305
1306 if (!dlci) {
1307 rfcomm_send_ua(s, 0);
1308
1309 if (s->state == BT_OPEN) {
1310 s->state = BT_CONNECTED;
1311 rfcomm_process_connect(s);
1312 }
1313 return 0;
1314 }
1315
1316 /* Check if DLC exists */
1317 d = rfcomm_dlc_get(s, dlci);
1318 if (d) {
1319 if (d->state == BT_OPEN) {
1320 /* DLC was previously opened by PN request */
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001321 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322 }
1323 return 0;
1324 }
1325
1326 /* Notify socket layer about incoming connection */
1327 channel = __srv_channel(dlci);
1328 if (rfcomm_connect_ind(s, channel, &d)) {
1329 d->dlci = dlci;
1330 d->addr = __addr(s->initiator, dlci);
1331 rfcomm_dlc_link(s, d);
1332
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001333 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001334 } else {
1335 rfcomm_send_dm(s, dlci);
1336 }
1337
1338 return 0;
1339}
1340
1341static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)
1342{
1343 struct rfcomm_session *s = d->session;
1344
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001345 BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346 d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits);
1347
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001348 if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) ||
1349 pn->flow_ctrl == 0xe0) {
1350 d->cfc = RFCOMM_CFC_ENABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351 d->tx_credits = pn->credits;
1352 } else {
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001353 d->cfc = RFCOMM_CFC_DISABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1355 }
1356
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001357 if (s->cfc == RFCOMM_CFC_UNKNOWN)
1358 s->cfc = d->cfc;
1359
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 d->priority = pn->priority;
1361
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001362 d->mtu = __le16_to_cpu(pn->mtu);
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001363
1364 if (cr && d->mtu > s->mtu)
1365 d->mtu = s->mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366
1367 return 0;
1368}
1369
1370static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1371{
1372 struct rfcomm_pn *pn = (void *) skb->data;
1373 struct rfcomm_dlc *d;
1374 u8 dlci = pn->dlci;
1375
1376 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1377
1378 if (!dlci)
1379 return 0;
1380
1381 d = rfcomm_dlc_get(s, dlci);
1382 if (d) {
1383 if (cr) {
1384 /* PN request */
1385 rfcomm_apply_pn(d, cr, pn);
1386 rfcomm_send_pn(s, 0, d);
1387 } else {
1388 /* PN response */
1389 switch (d->state) {
1390 case BT_CONFIG:
1391 rfcomm_apply_pn(d, cr, pn);
1392
1393 d->state = BT_CONNECT;
1394 rfcomm_send_sabm(s, d->dlci);
1395 break;
1396 }
1397 }
1398 } else {
1399 u8 channel = __srv_channel(dlci);
1400
1401 if (!cr)
1402 return 0;
1403
1404 /* PN request for non existing DLC.
1405 * Assume incoming connection. */
1406 if (rfcomm_connect_ind(s, channel, &d)) {
1407 d->dlci = dlci;
1408 d->addr = __addr(s->initiator, dlci);
1409 rfcomm_dlc_link(s, d);
1410
1411 rfcomm_apply_pn(d, cr, pn);
1412
1413 d->state = BT_OPEN;
1414 rfcomm_send_pn(s, 0, d);
1415 } else {
1416 rfcomm_send_dm(s, dlci);
1417 }
1418 }
1419 return 0;
1420}
1421
1422static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_buff *skb)
1423{
1424 struct rfcomm_rpn *rpn = (void *) skb->data;
1425 u8 dlci = __get_dlci(rpn->dlci);
1426
1427 u8 bit_rate = 0;
1428 u8 data_bits = 0;
1429 u8 stop_bits = 0;
1430 u8 parity = 0;
1431 u8 flow_ctrl = 0;
1432 u8 xon_char = 0;
1433 u8 xoff_char = 0;
1434 u16 rpn_mask = RFCOMM_RPN_PM_ALL;
J. Suter3a5e9032005-08-09 20:28:46 -07001435
1436 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",
1437 dlci, cr, len, rpn->bit_rate, rpn->line_settings, rpn->flow_ctrl,
1438 rpn->xon_char, rpn->xoff_char, rpn->param_mask);
1439
1440 if (!cr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 return 0;
J. Suter3a5e9032005-08-09 20:28:46 -07001442
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443 if (len == 1) {
Yuri Kululin08601462010-07-23 13:57:12 +04001444 /* This is a request, return default (according to ETSI TS 07.10) settings */
1445 bit_rate = RFCOMM_RPN_BR_9600;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 data_bits = RFCOMM_RPN_DATA_8;
1447 stop_bits = RFCOMM_RPN_STOP_1;
1448 parity = RFCOMM_RPN_PARITY_NONE;
1449 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1450 xon_char = RFCOMM_RPN_XON_CHAR;
1451 xoff_char = RFCOMM_RPN_XOFF_CHAR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452 goto rpn_out;
1453 }
J. Suter3a5e9032005-08-09 20:28:46 -07001454
1455 /* Check for sane values, ignore/accept bit_rate, 8 bits, 1 stop bit,
1456 * no parity, no flow control lines, normal XON/XOFF chars */
1457
Al Viroe8db8c92006-11-08 00:28:44 -08001458 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_BITRATE)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459 bit_rate = rpn->bit_rate;
Yuri Kululin08601462010-07-23 13:57:12 +04001460 if (bit_rate > RFCOMM_RPN_BR_230400) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 BT_DBG("RPN bit rate mismatch 0x%x", bit_rate);
Yuri Kululin08601462010-07-23 13:57:12 +04001462 bit_rate = RFCOMM_RPN_BR_9600;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463 rpn_mask ^= RFCOMM_RPN_PM_BITRATE;
1464 }
1465 }
J. Suter3a5e9032005-08-09 20:28:46 -07001466
Al Viroe8db8c92006-11-08 00:28:44 -08001467 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_DATA)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468 data_bits = __get_rpn_data_bits(rpn->line_settings);
1469 if (data_bits != RFCOMM_RPN_DATA_8) {
1470 BT_DBG("RPN data bits mismatch 0x%x", data_bits);
1471 data_bits = RFCOMM_RPN_DATA_8;
1472 rpn_mask ^= RFCOMM_RPN_PM_DATA;
1473 }
1474 }
J. Suter3a5e9032005-08-09 20:28:46 -07001475
Al Viroe8db8c92006-11-08 00:28:44 -08001476 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_STOP)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 stop_bits = __get_rpn_stop_bits(rpn->line_settings);
1478 if (stop_bits != RFCOMM_RPN_STOP_1) {
1479 BT_DBG("RPN stop bits mismatch 0x%x", stop_bits);
1480 stop_bits = RFCOMM_RPN_STOP_1;
1481 rpn_mask ^= RFCOMM_RPN_PM_STOP;
1482 }
1483 }
J. Suter3a5e9032005-08-09 20:28:46 -07001484
Al Viroe8db8c92006-11-08 00:28:44 -08001485 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_PARITY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486 parity = __get_rpn_parity(rpn->line_settings);
1487 if (parity != RFCOMM_RPN_PARITY_NONE) {
1488 BT_DBG("RPN parity mismatch 0x%x", parity);
1489 parity = RFCOMM_RPN_PARITY_NONE;
1490 rpn_mask ^= RFCOMM_RPN_PM_PARITY;
1491 }
1492 }
J. Suter3a5e9032005-08-09 20:28:46 -07001493
Al Viroe8db8c92006-11-08 00:28:44 -08001494 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_FLOW)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495 flow_ctrl = rpn->flow_ctrl;
1496 if (flow_ctrl != RFCOMM_RPN_FLOW_NONE) {
1497 BT_DBG("RPN flow ctrl mismatch 0x%x", flow_ctrl);
1498 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1499 rpn_mask ^= RFCOMM_RPN_PM_FLOW;
1500 }
1501 }
J. Suter3a5e9032005-08-09 20:28:46 -07001502
Al Viroe8db8c92006-11-08 00:28:44 -08001503 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XON)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 xon_char = rpn->xon_char;
1505 if (xon_char != RFCOMM_RPN_XON_CHAR) {
1506 BT_DBG("RPN XON char mismatch 0x%x", xon_char);
1507 xon_char = RFCOMM_RPN_XON_CHAR;
1508 rpn_mask ^= RFCOMM_RPN_PM_XON;
1509 }
1510 }
J. Suter3a5e9032005-08-09 20:28:46 -07001511
Al Viroe8db8c92006-11-08 00:28:44 -08001512 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XOFF)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513 xoff_char = rpn->xoff_char;
1514 if (xoff_char != RFCOMM_RPN_XOFF_CHAR) {
1515 BT_DBG("RPN XOFF char mismatch 0x%x", xoff_char);
1516 xoff_char = RFCOMM_RPN_XOFF_CHAR;
1517 rpn_mask ^= RFCOMM_RPN_PM_XOFF;
1518 }
1519 }
1520
1521rpn_out:
J. Suter3a5e9032005-08-09 20:28:46 -07001522 rfcomm_send_rpn(s, 0, dlci, bit_rate, data_bits, stop_bits,
1523 parity, flow_ctrl, xon_char, xoff_char, rpn_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524
1525 return 0;
1526}
1527
1528static int rfcomm_recv_rls(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1529{
1530 struct rfcomm_rls *rls = (void *) skb->data;
1531 u8 dlci = __get_dlci(rls->dlci);
1532
1533 BT_DBG("dlci %d cr %d status 0x%x", dlci, cr, rls->status);
J. Suter3a5e9032005-08-09 20:28:46 -07001534
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 if (!cr)
1536 return 0;
1537
J. Suter3a5e9032005-08-09 20:28:46 -07001538 /* We should probably do something with this information here. But
1539 * for now it's sufficient just to reply -- Bluetooth 1.1 says it's
1540 * mandatory to recognise and respond to RLS */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001541
1542 rfcomm_send_rls(s, 0, dlci, rls->status);
1543
1544 return 0;
1545}
1546
1547static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1548{
1549 struct rfcomm_msc *msc = (void *) skb->data;
1550 struct rfcomm_dlc *d;
1551 u8 dlci = __get_dlci(msc->dlci);
1552
1553 BT_DBG("dlci %d cr %d v24 0x%x", dlci, cr, msc->v24_sig);
1554
1555 d = rfcomm_dlc_get(s, dlci);
J. Suter3a5e9032005-08-09 20:28:46 -07001556 if (!d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557 return 0;
1558
1559 if (cr) {
1560 if (msc->v24_sig & RFCOMM_V24_FC && !d->cfc)
1561 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1562 else
1563 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
J. Suter3a5e9032005-08-09 20:28:46 -07001564
Linus Torvalds1da177e2005-04-16 15:20:36 -07001565 rfcomm_dlc_lock(d);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001566
1567 d->remote_v24_sig = msc->v24_sig;
1568
Linus Torvalds1da177e2005-04-16 15:20:36 -07001569 if (d->modem_status)
1570 d->modem_status(d, msc->v24_sig);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001571
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572 rfcomm_dlc_unlock(d);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001573
Linus Torvalds1da177e2005-04-16 15:20:36 -07001574 rfcomm_send_msc(s, 0, dlci, msc->v24_sig);
1575
1576 d->mscex |= RFCOMM_MSCEX_RX;
J. Suter3a5e9032005-08-09 20:28:46 -07001577 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578 d->mscex |= RFCOMM_MSCEX_TX;
1579
1580 return 0;
1581}
1582
1583static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
1584{
1585 struct rfcomm_mcc *mcc = (void *) skb->data;
1586 u8 type, cr, len;
1587
1588 cr = __test_cr(mcc->type);
1589 type = __get_mcc_type(mcc->type);
1590 len = __get_mcc_len(mcc->len);
1591
1592 BT_DBG("%p type 0x%x cr %d", s, type, cr);
1593
1594 skb_pull(skb, 2);
1595
1596 switch (type) {
1597 case RFCOMM_PN:
1598 rfcomm_recv_pn(s, cr, skb);
1599 break;
1600
1601 case RFCOMM_RPN:
1602 rfcomm_recv_rpn(s, cr, len, skb);
1603 break;
1604
1605 case RFCOMM_RLS:
1606 rfcomm_recv_rls(s, cr, skb);
1607 break;
1608
1609 case RFCOMM_MSC:
1610 rfcomm_recv_msc(s, cr, skb);
1611 break;
1612
1613 case RFCOMM_FCOFF:
1614 if (cr) {
1615 set_bit(RFCOMM_TX_THROTTLED, &s->flags);
1616 rfcomm_send_fcoff(s, 0);
1617 }
1618 break;
1619
1620 case RFCOMM_FCON:
1621 if (cr) {
1622 clear_bit(RFCOMM_TX_THROTTLED, &s->flags);
1623 rfcomm_send_fcon(s, 0);
1624 }
1625 break;
1626
1627 case RFCOMM_TEST:
1628 if (cr)
1629 rfcomm_send_test(s, 0, skb->data, skb->len);
1630 break;
1631
1632 case RFCOMM_NSC:
1633 break;
1634
1635 default:
1636 BT_ERR("Unknown control type 0x%02x", type);
1637 rfcomm_send_nsc(s, cr, type);
1638 break;
1639 }
1640 return 0;
1641}
1642
1643static int rfcomm_recv_data(struct rfcomm_session *s, u8 dlci, int pf, struct sk_buff *skb)
1644{
1645 struct rfcomm_dlc *d;
1646
1647 BT_DBG("session %p state %ld dlci %d pf %d", s, s->state, dlci, pf);
1648
1649 d = rfcomm_dlc_get(s, dlci);
1650 if (!d) {
1651 rfcomm_send_dm(s, dlci);
1652 goto drop;
1653 }
1654
1655 if (pf && d->cfc) {
1656 u8 credits = *(u8 *) skb->data; skb_pull(skb, 1);
1657
1658 d->tx_credits += credits;
1659 if (d->tx_credits)
1660 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
1661 }
1662
1663 if (skb->len && d->state == BT_CONNECTED) {
1664 rfcomm_dlc_lock(d);
1665 d->rx_credits--;
1666 d->data_ready(d, skb);
1667 rfcomm_dlc_unlock(d);
1668 return 0;
1669 }
1670
1671drop:
1672 kfree_skb(skb);
1673 return 0;
1674}
1675
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001676static struct rfcomm_session *rfcomm_recv_frame(struct rfcomm_session *s,
1677 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001678{
1679 struct rfcomm_hdr *hdr = (void *) skb->data;
1680 u8 type, dlci, fcs;
1681
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001682 if (!s) {
1683 /* no session, so free socket data */
1684 kfree_skb(skb);
1685 return s;
1686 }
1687
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688 dlci = __get_dlci(hdr->addr);
1689 type = __get_type(hdr->ctrl);
1690
1691 /* Trim FCS */
1692 skb->len--; skb->tail--;
Arnaldo Carvalho de Melo27a884d2007-04-19 20:29:13 -07001693 fcs = *(u8 *)skb_tail_pointer(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694
1695 if (__check_fcs(skb->data, type, fcs)) {
1696 BT_ERR("bad checksum in packet");
1697 kfree_skb(skb);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001698 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699 }
1700
1701 if (__test_ea(hdr->len))
1702 skb_pull(skb, 3);
1703 else
1704 skb_pull(skb, 4);
1705
1706 switch (type) {
1707 case RFCOMM_SABM:
1708 if (__test_pf(hdr->ctrl))
1709 rfcomm_recv_sabm(s, dlci);
1710 break;
1711
1712 case RFCOMM_DISC:
1713 if (__test_pf(hdr->ctrl))
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001714 s = rfcomm_recv_disc(s, dlci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715 break;
1716
1717 case RFCOMM_UA:
1718 if (__test_pf(hdr->ctrl))
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001719 s = rfcomm_recv_ua(s, dlci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720 break;
1721
1722 case RFCOMM_DM:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001723 s = rfcomm_recv_dm(s, dlci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724 break;
1725
1726 case RFCOMM_UIH:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001727 if (dlci) {
1728 rfcomm_recv_data(s, dlci, __test_pf(hdr->ctrl), skb);
1729 return s;
1730 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001731 rfcomm_recv_mcc(s, skb);
1732 break;
1733
1734 default:
Andrei Emeltchenko5017d8d2010-09-08 16:26:53 +03001735 BT_ERR("Unknown packet type 0x%02x", type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001736 break;
1737 }
1738 kfree_skb(skb);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001739 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740}
1741
1742/* ---- Connection and data processing ---- */
1743
1744static void rfcomm_process_connect(struct rfcomm_session *s)
1745{
1746 struct rfcomm_dlc *d;
1747 struct list_head *p, *n;
1748
1749 BT_DBG("session %p state %ld", s, s->state);
1750
1751 list_for_each_safe(p, n, &s->dlcs) {
1752 d = list_entry(p, struct rfcomm_dlc, list);
1753 if (d->state == BT_CONFIG) {
1754 d->mtu = s->mtu;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001755 if (rfcomm_check_security(d)) {
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001756 rfcomm_send_pn(s, 1, d);
1757 } else {
Marcel Holtmann77db1982008-07-14 20:13:45 +02001758 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1759 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001760 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 }
1762 }
1763}
1764
1765/* Send data queued for the DLC.
1766 * Return number of frames left in the queue.
1767 */
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001768static int rfcomm_process_tx(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769{
1770 struct sk_buff *skb;
1771 int err;
1772
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001773 BT_DBG("dlc %p state %ld cfc %d rx_credits %d tx_credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774 d, d->state, d->cfc, d->rx_credits, d->tx_credits);
1775
1776 /* Send pending MSC */
1777 if (test_and_clear_bit(RFCOMM_MSC_PENDING, &d->flags))
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001778 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779
1780 if (d->cfc) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001781 /* CFC enabled.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001782 * Give them some credits */
1783 if (!test_bit(RFCOMM_RX_THROTTLED, &d->flags) &&
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001784 d->rx_credits <= (d->cfc >> 2)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785 rfcomm_send_credits(d->session, d->addr, d->cfc - d->rx_credits);
1786 d->rx_credits = d->cfc;
1787 }
1788 } else {
1789 /* CFC disabled.
1790 * Give ourselves some credits */
1791 d->tx_credits = 5;
1792 }
1793
1794 if (test_bit(RFCOMM_TX_THROTTLED, &d->flags))
1795 return skb_queue_len(&d->tx_queue);
1796
1797 while (d->tx_credits && (skb = skb_dequeue(&d->tx_queue))) {
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001798 err = rfcomm_send_frame(d->session, skb->data, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 if (err < 0) {
1800 skb_queue_head(&d->tx_queue, skb);
1801 break;
1802 }
1803 kfree_skb(skb);
1804 d->tx_credits--;
1805 }
1806
1807 if (d->cfc && !d->tx_credits) {
1808 /* We're out of TX credits.
1809 * Set TX_THROTTLED flag to avoid unnesary wakeups by dlc_send. */
1810 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1811 }
1812
1813 return skb_queue_len(&d->tx_queue);
1814}
1815
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001816static void rfcomm_process_dlcs(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817{
1818 struct rfcomm_dlc *d;
1819 struct list_head *p, *n;
1820
1821 BT_DBG("session %p state %ld", s, s->state);
1822
1823 list_for_each_safe(p, n, &s->dlcs) {
1824 d = list_entry(p, struct rfcomm_dlc, list);
1825
1826 if (test_bit(RFCOMM_TIMED_OUT, &d->flags)) {
1827 __rfcomm_dlc_close(d, ETIMEDOUT);
1828 continue;
1829 }
1830
Szymon Jancdb544672011-09-26 14:19:47 +02001831 if (test_bit(RFCOMM_ENC_DROP, &d->flags)) {
1832 __rfcomm_dlc_close(d, ECONNREFUSED);
1833 continue;
1834 }
1835
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836 if (test_and_clear_bit(RFCOMM_AUTH_ACCEPT, &d->flags)) {
1837 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001838 if (d->out) {
1839 rfcomm_send_pn(s, 1, d);
1840 rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001841 } else {
1842 if (d->defer_setup) {
1843 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1844 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmann8bf47942009-02-16 02:59:49 +01001845
1846 rfcomm_dlc_lock(d);
1847 d->state = BT_CONNECT2;
1848 d->state_change(d, 0);
1849 rfcomm_dlc_unlock(d);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001850 } else
1851 rfcomm_dlc_accept(d);
1852 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001853 continue;
1854 } else if (test_and_clear_bit(RFCOMM_AUTH_REJECT, &d->flags)) {
1855 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001856 if (!d->out)
1857 rfcomm_send_dm(s, d->dlci);
1858 else
1859 d->state = BT_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001860 __rfcomm_dlc_close(d, ECONNREFUSED);
1861 continue;
1862 }
1863
Jaikumar Ganesh6e1031a2009-02-02 18:03:57 -08001864 if (test_bit(RFCOMM_SEC_PENDING, &d->flags))
1865 continue;
1866
Linus Torvalds1da177e2005-04-16 15:20:36 -07001867 if (test_bit(RFCOMM_TX_THROTTLED, &s->flags))
1868 continue;
1869
1870 if ((d->state == BT_CONNECTED || d->state == BT_DISCONN) &&
Marcel Holtmann77db1982008-07-14 20:13:45 +02001871 d->mscex == RFCOMM_MSCEX_OK)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001872 rfcomm_process_tx(d);
1873 }
1874}
1875
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001876static struct rfcomm_session *rfcomm_process_rx(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001877{
1878 struct socket *sock = s->sock;
1879 struct sock *sk = sock->sk;
1880 struct sk_buff *skb;
1881
1882 BT_DBG("session %p state %ld qlen %d", s, s->state, skb_queue_len(&sk->sk_receive_queue));
1883
1884 /* Get data directly from socket receive queue without copying it. */
1885 while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
1886 skb_orphan(skb);
Mat Martineau44935722011-07-22 14:53:58 -07001887 if (!skb_linearize(skb))
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001888 s = rfcomm_recv_frame(s, skb);
Mat Martineau44935722011-07-22 14:53:58 -07001889 else
1890 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001891 }
1892
Dean Jenkins08c30ac2013-02-28 14:21:56 +00001893 if (s && (sk->sk_state == BT_CLOSED))
1894 s = rfcomm_session_close(s, sk->sk_err);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001895
1896 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897}
1898
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001899static void rfcomm_accept_connection(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001900{
1901 struct socket *sock = s->sock, *nsock;
1902 int err;
1903
1904 /* Fast check for a new connection.
1905 * Avoids unnesesary socket allocations. */
1906 if (list_empty(&bt_sk(sock->sk)->accept_q))
1907 return;
1908
1909 BT_DBG("session %p", s);
1910
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001911 err = kernel_accept(sock, &nsock, O_NONBLOCK);
1912 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001913 return;
1914
Linus Torvalds1da177e2005-04-16 15:20:36 -07001915 /* Set our callbacks */
1916 nsock->sk->sk_data_ready = rfcomm_l2data_ready;
1917 nsock->sk->sk_state_change = rfcomm_l2state_change;
1918
1919 s = rfcomm_session_add(nsock, BT_OPEN);
1920 if (s) {
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001921 /* We should adjust MTU on incoming sessions.
1922 * L2CAP MTU minus UIH header and FCS. */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001923 s->mtu = min(l2cap_pi(nsock->sk)->chan->omtu,
1924 l2cap_pi(nsock->sk)->chan->imtu) - 5;
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001925
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +03001926 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001927 } else
1928 sock_release(nsock);
1929}
1930
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001931static struct rfcomm_session *rfcomm_check_connection(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001932{
1933 struct sock *sk = s->sock->sk;
1934
1935 BT_DBG("%p state %ld", s, s->state);
1936
Andrei Emeltchenko285b4e92010-12-01 16:58:23 +02001937 switch (sk->sk_state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001938 case BT_CONNECTED:
1939 s->state = BT_CONNECT;
1940
1941 /* We can adjust MTU on outgoing sessions.
1942 * L2CAP MTU minus UIH header and FCS. */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001943 s->mtu = min(l2cap_pi(sk)->chan->omtu, l2cap_pi(sk)->chan->imtu) - 5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944
1945 rfcomm_send_sabm(s, 0);
1946 break;
1947
1948 case BT_CLOSED:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001949 s = rfcomm_session_close(s, sk->sk_err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001950 break;
1951 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001952 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953}
1954
Gustavo Padovan6039aa72012-05-23 04:04:18 -03001955static void rfcomm_process_sessions(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001956{
1957 struct list_head *p, *n;
1958
1959 rfcomm_lock();
1960
1961 list_for_each_safe(p, n, &session_list) {
1962 struct rfcomm_session *s;
1963 s = list_entry(p, struct rfcomm_session, list);
1964
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -03001965 if (test_and_clear_bit(RFCOMM_TIMED_OUT, &s->flags)) {
1966 s->state = BT_DISCONN;
1967 rfcomm_send_disc(s, 0);
1968 continue;
1969 }
1970
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 if (s->state == BT_LISTEN) {
1972 rfcomm_accept_connection(s);
1973 continue;
1974 }
1975
Linus Torvalds1da177e2005-04-16 15:20:36 -07001976 switch (s->state) {
1977 case BT_BOUND:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001978 s = rfcomm_check_connection(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979 break;
1980
1981 default:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001982 s = rfcomm_process_rx(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 break;
1984 }
1985
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001986 if (s)
1987 rfcomm_process_dlcs(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001988 }
1989
1990 rfcomm_unlock();
1991}
1992
Linus Torvalds1da177e2005-04-16 15:20:36 -07001993static int rfcomm_add_listener(bdaddr_t *ba)
1994{
1995 struct sockaddr_l2 addr;
1996 struct socket *sock;
1997 struct sock *sk;
1998 struct rfcomm_session *s;
1999 int err = 0;
2000
2001 /* Create socket */
2002 err = rfcomm_l2sock_create(&sock);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002003 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002004 BT_ERR("Create socket failed %d", err);
2005 return err;
2006 }
2007
2008 /* Bind socket */
2009 bacpy(&addr.l2_bdaddr, ba);
2010 addr.l2_family = AF_BLUETOOTH;
Syam Sidhardhan5bcb8092012-10-10 22:09:29 +05302011 addr.l2_psm = __constant_cpu_to_le16(RFCOMM_PSM);
Marcel Holtmann37e62f52009-02-17 21:49:33 +01002012 addr.l2_cid = 0;
Seung-Woo Kimc507f132013-11-05 16:02:24 +09002013 addr.l2_bdaddr_type = BDADDR_BREDR;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02002014 err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002015 if (err < 0) {
2016 BT_ERR("Bind failed %d", err);
2017 goto failed;
2018 }
2019
2020 /* Set L2CAP options */
2021 sk = sock->sk;
2022 lock_sock(sk);
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03002023 l2cap_pi(sk)->chan->imtu = l2cap_mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024 release_sock(sk);
2025
2026 /* Start listening on the socket */
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02002027 err = kernel_listen(sock, 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028 if (err) {
2029 BT_ERR("Listen failed %d", err);
2030 goto failed;
2031 }
2032
2033 /* Add listening session */
2034 s = rfcomm_session_add(sock, BT_LISTEN);
Wei Yongjun0227c7b2013-03-20 20:23:37 +08002035 if (!s) {
2036 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037 goto failed;
Wei Yongjun0227c7b2013-03-20 20:23:37 +08002038 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040 return 0;
2041failed:
2042 sock_release(sock);
2043 return err;
2044}
2045
2046static void rfcomm_kill_listener(void)
2047{
2048 struct rfcomm_session *s;
2049 struct list_head *p, *n;
2050
2051 BT_DBG("");
2052
2053 list_for_each_safe(p, n, &session_list) {
2054 s = list_entry(p, struct rfcomm_session, list);
2055 rfcomm_session_del(s);
2056 }
2057}
2058
2059static int rfcomm_run(void *unused)
2060{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061 BT_DBG("");
2062
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002063 set_user_nice(current, -10);
2064
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065 rfcomm_add_listener(BDADDR_ANY);
2066
Peter Hurleye5842cd2011-07-24 00:10:35 -04002067 while (1) {
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002068 set_current_state(TASK_INTERRUPTIBLE);
Peter Hurleye5842cd2011-07-24 00:10:35 -04002069
2070 if (kthread_should_stop())
2071 break;
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002072
2073 /* Process stuff */
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002074 rfcomm_process_sessions();
Peter Hurleye5842cd2011-07-24 00:10:35 -04002075
2076 schedule();
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002077 }
Peter Hurleye5842cd2011-07-24 00:10:35 -04002078 __set_current_state(TASK_RUNNING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079
2080 rfcomm_kill_listener();
2081
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082 return 0;
2083}
2084
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002085static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086{
2087 struct rfcomm_session *s;
2088 struct rfcomm_dlc *d;
2089 struct list_head *p, *n;
2090
2091 BT_DBG("conn %p status 0x%02x encrypt 0x%02x", conn, status, encrypt);
2092
2093 s = rfcomm_session_get(&conn->hdev->bdaddr, &conn->dst);
2094 if (!s)
2095 return;
2096
Linus Torvalds1da177e2005-04-16 15:20:36 -07002097 list_for_each_safe(p, n, &s->dlcs) {
2098 d = list_entry(p, struct rfcomm_dlc, list);
2099
Marcel Holtmann8c84b832009-01-16 08:17:51 +01002100 if (test_and_clear_bit(RFCOMM_SEC_PENDING, &d->flags)) {
2101 rfcomm_dlc_clear_timer(d);
2102 if (status || encrypt == 0x00) {
Szymon Jancdb544672011-09-26 14:19:47 +02002103 set_bit(RFCOMM_ENC_DROP, &d->flags);
Marcel Holtmann8c84b832009-01-16 08:17:51 +01002104 continue;
2105 }
2106 }
2107
2108 if (d->state == BT_CONNECTED && !status && encrypt == 0x00) {
2109 if (d->sec_level == BT_SECURITY_MEDIUM) {
2110 set_bit(RFCOMM_SEC_PENDING, &d->flags);
2111 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
2112 continue;
Marcel Holtmann2c068e02014-01-15 22:37:41 -08002113 } else if (d->sec_level == BT_SECURITY_HIGH ||
2114 d->sec_level == BT_SECURITY_FIPS) {
Szymon Jancdb544672011-09-26 14:19:47 +02002115 set_bit(RFCOMM_ENC_DROP, &d->flags);
Marcel Holtmann8c84b832009-01-16 08:17:51 +01002116 continue;
2117 }
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02002118 }
2119
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120 if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags))
2121 continue;
2122
Waldemar Rymarkiewiczb3b1b062011-05-06 09:42:31 +02002123 if (!status && hci_conn_check_secure(conn, d->sec_level))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002124 set_bit(RFCOMM_AUTH_ACCEPT, &d->flags);
2125 else
2126 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
2127 }
2128
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +03002129 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130}
2131
2132static struct hci_cb rfcomm_cb = {
2133 .name = "RFCOMM",
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002134 .security_cfm = rfcomm_security_cfm
Linus Torvalds1da177e2005-04-16 15:20:36 -07002135};
2136
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002137static int rfcomm_dlc_debugfs_show(struct seq_file *f, void *x)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138{
2139 struct rfcomm_session *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140
2141 rfcomm_lock();
2142
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002143 list_for_each_entry(s, &session_list, list) {
Marcel Holtmann24bc10c2013-10-13 09:49:54 -07002144 struct l2cap_chan *chan = l2cap_pi(s->sock->sk)->chan;
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002145 struct rfcomm_dlc *d;
2146 list_for_each_entry(d, &s->dlcs, list) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03002147 seq_printf(f, "%pMR %pMR %ld %d %d %d %d\n",
Marcel Holtmann24bc10c2013-10-13 09:49:54 -07002148 &chan->src, &chan->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03002149 d->state, d->dlci, d->mtu,
2150 d->rx_credits, d->tx_credits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 }
2152 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002153
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154 rfcomm_unlock();
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002155
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002156 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002157}
2158
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002159static int rfcomm_dlc_debugfs_open(struct inode *inode, struct file *file)
2160{
2161 return single_open(file, rfcomm_dlc_debugfs_show, inode->i_private);
2162}
2163
2164static const struct file_operations rfcomm_dlc_debugfs_fops = {
2165 .open = rfcomm_dlc_debugfs_open,
2166 .read = seq_read,
2167 .llseek = seq_lseek,
2168 .release = single_release,
2169};
2170
2171static struct dentry *rfcomm_dlc_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172
2173/* ---- Initialization ---- */
2174static int __init rfcomm_init(void)
2175{
Marcel Holtmann52d18342009-08-22 14:49:36 -07002176 int err;
Dave Youngaf0d3b12009-08-03 04:26:16 +00002177
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178 hci_register_cb(&rfcomm_cb);
2179
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002180 rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd");
2181 if (IS_ERR(rfcomm_thread)) {
Marcel Holtmann52d18342009-08-22 14:49:36 -07002182 err = PTR_ERR(rfcomm_thread);
2183 goto unregister;
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002184 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185
Marcel Holtmann52d18342009-08-22 14:49:36 -07002186 err = rfcomm_init_ttys();
2187 if (err < 0)
2188 goto stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002189
Marcel Holtmann52d18342009-08-22 14:49:36 -07002190 err = rfcomm_init_sockets();
2191 if (err < 0)
2192 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002194 BT_INFO("RFCOMM ver %s", VERSION);
2195
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07002196 if (IS_ERR_OR_NULL(bt_debugfs))
2197 return 0;
2198
2199 rfcomm_dlc_debugfs = debugfs_create_file("rfcomm_dlc", 0444,
2200 bt_debugfs, NULL,
2201 &rfcomm_dlc_debugfs_fops);
2202
Linus Torvalds1da177e2005-04-16 15:20:36 -07002203 return 0;
Dave Youngaf0d3b12009-08-03 04:26:16 +00002204
Marcel Holtmann52d18342009-08-22 14:49:36 -07002205cleanup:
Dave Youngaf0d3b12009-08-03 04:26:16 +00002206 rfcomm_cleanup_ttys();
Marcel Holtmann52d18342009-08-22 14:49:36 -07002207
2208stop:
Dave Youngaf0d3b12009-08-03 04:26:16 +00002209 kthread_stop(rfcomm_thread);
Marcel Holtmann52d18342009-08-22 14:49:36 -07002210
2211unregister:
Dave Youngaf0d3b12009-08-03 04:26:16 +00002212 hci_unregister_cb(&rfcomm_cb);
2213
Marcel Holtmann52d18342009-08-22 14:49:36 -07002214 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215}
2216
2217static void __exit rfcomm_exit(void)
2218{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002219 debugfs_remove(rfcomm_dlc_debugfs);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002220
Linus Torvalds1da177e2005-04-16 15:20:36 -07002221 hci_unregister_cb(&rfcomm_cb);
2222
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002223 kthread_stop(rfcomm_thread);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225 rfcomm_cleanup_ttys();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226
2227 rfcomm_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228}
2229
2230module_init(rfcomm_init);
2231module_exit(rfcomm_exit);
2232
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02002233module_param(disable_cfc, bool, 0644);
2234MODULE_PARM_DESC(disable_cfc, "Disable credit based flow control");
2235
Marcel Holtmann98bcd082006-07-14 11:42:12 +02002236module_param(channel_mtu, int, 0644);
2237MODULE_PARM_DESC(channel_mtu, "Default MTU for the RFCOMM channel");
2238
Marcel Holtmann56f3a402006-02-13 11:39:57 +01002239module_param(l2cap_mtu, uint, 0644);
2240MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection");
2241
Marcel Holtmanneae38ee2009-10-05 12:23:48 +02002242module_param(l2cap_ertm, bool, 0644);
2243MODULE_PARM_DESC(l2cap_ertm, "Use L2CAP ERTM mode for connection");
2244
Marcel Holtmann63fbd242008-08-18 13:23:53 +02002245MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246MODULE_DESCRIPTION("Bluetooth RFCOMM ver " VERSION);
2247MODULE_VERSION(VERSION);
2248MODULE_LICENSE("GPL");
2249MODULE_ALIAS("bt-proto-3");