blob: cf620260affaea75c4c1e9875ca338afb04f7b2e [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 Padovan6039aa732012-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
David S. Miller676d2362014-04-11 16:15:36 -0400189static void rfcomm_l2data_ready(struct sock *sk)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190{
David S. Miller676d2362014-04-11 16:15:36 -0400191 BT_DBG("%p", sk);
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 Padovan6039aa732012-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
Peter Hurleyf6223572014-02-09 20:59:13 -0500434static void __rfcomm_dlc_disconn(struct rfcomm_dlc *d)
435{
436 struct rfcomm_session *s = d->session;
437
438 d->state = BT_DISCONN;
439 if (skb_queue_empty(&d->tx_queue)) {
440 rfcomm_send_disc(s, d->dlci);
441 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT);
442 } else {
443 rfcomm_queue_disc(d);
444 rfcomm_dlc_set_timer(d, RFCOMM_DISC_TIMEOUT * 2);
445 }
446}
447
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
449{
450 struct rfcomm_session *s = d->session;
451 if (!s)
452 return 0;
453
454 BT_DBG("dlc %p state %ld dlci %d err %d session %p",
455 d, d->state, d->dlci, err, s);
456
457 switch (d->state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458 case BT_CONNECT:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100459 case BT_CONFIG:
Peter Hurley5998e042014-02-09 20:59:12 -0500460 case BT_OPEN:
461 case BT_CONNECT2:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100462 if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
463 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300464 rfcomm_schedule();
Peter Hurley5998e042014-02-09 20:59:12 -0500465 return 0;
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100466 }
Peter Hurley5998e042014-02-09 20:59:12 -0500467 }
468
469 switch (d->state) {
470 case BT_CONNECT:
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +0100471 case BT_CONNECTED:
Peter Hurleyf6223572014-02-09 20:59:13 -0500472 __rfcomm_dlc_disconn(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 break;
474
Peter Hurleyc4fd3182014-02-09 20:59:14 -0500475 case BT_CONFIG:
476 if (s->state != BT_BOUND) {
477 __rfcomm_dlc_disconn(d);
478 break;
479 }
480 /* if closing a dlc in a session that hasn't been started,
481 * just close and unlink the dlc
482 */
483
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 default:
485 rfcomm_dlc_clear_timer(d);
486
487 rfcomm_dlc_lock(d);
488 d->state = BT_CLOSED;
Dave Young1905f6c2008-04-01 23:59:06 -0700489 d->state_change(d, err);
Arjan van de Ven4c8411f2008-05-29 01:32:47 -0700490 rfcomm_dlc_unlock(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491
492 skb_queue_purge(&d->tx_queue);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 rfcomm_dlc_unlink(d);
494 }
495
496 return 0;
497}
498
499int rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
500{
Dean Jenkinsc06f7d52013-02-28 14:21:54 +0000501 int r = 0;
502 struct rfcomm_dlc *d_list;
503 struct rfcomm_session *s, *s_list;
504
505 BT_DBG("dlc %p state %ld dlci %d err %d", d, d->state, d->dlci, err);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506
507 rfcomm_lock();
508
Dean Jenkinsc06f7d52013-02-28 14:21:54 +0000509 s = d->session;
510 if (!s)
511 goto no_session;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512
Dean Jenkinsc06f7d52013-02-28 14:21:54 +0000513 /* after waiting on the mutex check the session still exists
514 * then check the dlc still exists
515 */
516 list_for_each_entry(s_list, &session_list, list) {
517 if (s_list == s) {
518 list_for_each_entry(d_list, &s->dlcs, list) {
519 if (d_list == d) {
520 r = __rfcomm_dlc_close(d, err);
521 break;
522 }
523 }
524 break;
525 }
526 }
527
528no_session:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 rfcomm_unlock();
530 return r;
531}
532
Peter Hurleyc10a8482014-02-09 20:59:10 -0500533struct rfcomm_dlc *rfcomm_dlc_exists(bdaddr_t *src, bdaddr_t *dst, u8 channel)
534{
535 struct rfcomm_session *s;
536 struct rfcomm_dlc *dlc = NULL;
537 u8 dlci;
538
539 if (rfcomm_check_channel(channel))
540 return ERR_PTR(-EINVAL);
541
542 rfcomm_lock();
543 s = rfcomm_session_get(src, dst);
544 if (s) {
545 dlci = __dlci(!s->initiator, channel);
546 dlc = rfcomm_dlc_get(s, dlci);
547 }
548 rfcomm_unlock();
549 return dlc;
550}
551
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb)
553{
554 int len = skb->len;
555
556 if (d->state != BT_CONNECTED)
557 return -ENOTCONN;
558
559 BT_DBG("dlc %p mtu %d len %d", d, d->mtu, len);
560
561 if (len > d->mtu)
562 return -EINVAL;
563
564 rfcomm_make_uih(skb, d->addr);
565 skb_queue_tail(&d->tx_queue, skb);
566
567 if (!test_bit(RFCOMM_TX_THROTTLED, &d->flags))
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300568 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 return len;
570}
571
Peter Hurley72e51082014-02-09 20:59:22 -0500572void rfcomm_dlc_send_noerror(struct rfcomm_dlc *d, struct sk_buff *skb)
573{
574 int len = skb->len;
575
576 BT_DBG("dlc %p mtu %d len %d", d, d->mtu, len);
577
578 rfcomm_make_uih(skb, d->addr);
579 skb_queue_tail(&d->tx_queue, skb);
580
581 if (d->state == BT_CONNECTED &&
582 !test_bit(RFCOMM_TX_THROTTLED, &d->flags))
583 rfcomm_schedule();
584}
585
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800586void __rfcomm_dlc_throttle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587{
588 BT_DBG("dlc %p state %ld", d, d->state);
589
590 if (!d->cfc) {
591 d->v24_sig |= RFCOMM_V24_FC;
592 set_bit(RFCOMM_MSC_PENDING, &d->flags);
593 }
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300594 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595}
596
Harvey Harrisonb5606c22008-02-13 15:03:16 -0800597void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598{
599 BT_DBG("dlc %p state %ld", d, d->state);
600
601 if (!d->cfc) {
602 d->v24_sig &= ~RFCOMM_V24_FC;
603 set_bit(RFCOMM_MSC_PENDING, &d->flags);
604 }
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300605 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700606}
607
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900608/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609 Set/get modem status functions use _local_ status i.e. what we report
610 to the other side.
611 Remote status is provided by dlc->modem_status() callback.
612 */
613int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
614{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900615 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 d, d->state, v24_sig);
617
618 if (test_bit(RFCOMM_RX_THROTTLED, &d->flags))
619 v24_sig |= RFCOMM_V24_FC;
620 else
621 v24_sig &= ~RFCOMM_V24_FC;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900622
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623 d->v24_sig = v24_sig;
624
625 if (!test_and_set_bit(RFCOMM_MSC_PENDING, &d->flags))
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300626 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627
628 return 0;
629}
630
631int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig)
632{
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900633 BT_DBG("dlc %p state %ld v24_sig 0x%x",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700634 d, d->state, d->v24_sig);
635
636 *v24_sig = d->v24_sig;
637 return 0;
638}
639
640/* ---- RFCOMM sessions ---- */
641static struct rfcomm_session *rfcomm_session_add(struct socket *sock, int state)
642{
Marcel Holtmann25ea6db2006-07-06 15:40:09 +0200643 struct rfcomm_session *s = kzalloc(sizeof(*s), GFP_KERNEL);
644
Linus Torvalds1da177e2005-04-16 15:20:36 -0700645 if (!s)
646 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647
648 BT_DBG("session %p sock %p", s, sock);
649
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300650 setup_timer(&s->timer, rfcomm_session_timeout, (unsigned long) s);
651
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652 INIT_LIST_HEAD(&s->dlcs);
653 s->state = state;
654 s->sock = sock;
655
656 s->mtu = RFCOMM_DEFAULT_MTU;
Marcel Holtmann7c2660b2006-07-03 10:02:51 +0200657 s->cfc = disable_cfc ? RFCOMM_CFC_DISABLED : RFCOMM_CFC_UNKNOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658
659 /* Do not increment module usage count for listening sessions.
660 * Otherwise we won't be able to unload the module. */
661 if (state != BT_LISTEN)
662 if (!try_module_get(THIS_MODULE)) {
663 kfree(s);
664 return NULL;
665 }
666
667 list_add(&s->list, &session_list);
668
669 return s;
670}
671
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000672static struct rfcomm_session *rfcomm_session_del(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673{
674 int state = s->state;
675
676 BT_DBG("session %p state %ld", s, s->state);
677
678 list_del(&s->list);
679
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300680 rfcomm_session_clear_timer(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 sock_release(s->sock);
682 kfree(s);
683
684 if (state != BT_LISTEN)
685 module_put(THIS_MODULE);
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000686
687 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688}
689
690static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst)
691{
692 struct rfcomm_session *s;
693 struct list_head *p, *n;
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700694 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695 list_for_each_safe(p, n, &session_list) {
696 s = list_entry(p, struct rfcomm_session, list);
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700697 chan = l2cap_pi(s->sock->sk)->chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700699 if ((!bacmp(src, BDADDR_ANY) || !bacmp(&chan->src, src)) &&
700 !bacmp(&chan->dst, dst))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701 return s;
702 }
703 return NULL;
704}
705
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000706static struct rfcomm_session *rfcomm_session_close(struct rfcomm_session *s,
707 int err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708{
709 struct rfcomm_dlc *d;
710 struct list_head *p, *n;
711
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712 s->state = BT_CLOSED;
713
Dean Jenkins24fd6422013-02-28 14:21:58 +0000714 BT_DBG("session %p state %ld err %d", s, s->state, err);
715
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 /* Close all dlcs */
717 list_for_each_safe(p, n, &s->dlcs) {
718 d = list_entry(p, struct rfcomm_dlc, list);
719 d->state = BT_CLOSED;
720 __rfcomm_dlc_close(d, err);
721 }
722
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -0300723 rfcomm_session_clear_timer(s);
Dean Jenkins08c30ac2013-02-28 14:21:56 +0000724 return rfcomm_session_del(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725}
726
Luiz Augusto von Dentz63ce0902010-08-19 14:06:10 +0300727static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src,
728 bdaddr_t *dst,
729 u8 sec_level,
730 int *err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731{
732 struct rfcomm_session *s = NULL;
733 struct sockaddr_l2 addr;
734 struct socket *sock;
735 struct sock *sk;
736
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +0300737 BT_DBG("%pMR -> %pMR", src, dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738
739 *err = rfcomm_l2sock_create(&sock);
740 if (*err < 0)
741 return NULL;
742
743 bacpy(&addr.l2_bdaddr, src);
744 addr.l2_family = AF_BLUETOOTH;
745 addr.l2_psm = 0;
Marcel Holtmann37e62f52009-02-17 21:49:33 +0100746 addr.l2_cid = 0;
Seung-Woo Kimc507f132013-11-05 16:02:24 +0900747 addr.l2_bdaddr_type = BDADDR_BREDR;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200748 *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749 if (*err < 0)
750 goto failed;
751
752 /* Set L2CAP options */
753 sk = sock->sk;
754 lock_sock(sk);
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300755 l2cap_pi(sk)->chan->imtu = l2cap_mtu;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -0300756 l2cap_pi(sk)->chan->sec_level = sec_level;
Marcel Holtmanneae38ee2009-10-05 12:23:48 +0200757 if (l2cap_ertm)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300758 l2cap_pi(sk)->chan->mode = L2CAP_MODE_ERTM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759 release_sock(sk);
760
761 s = rfcomm_session_add(sock, BT_BOUND);
762 if (!s) {
763 *err = -ENOMEM;
764 goto failed;
765 }
766
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 s->initiator = 1;
768
769 bacpy(&addr.l2_bdaddr, dst);
770 addr.l2_family = AF_BLUETOOTH;
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700771 addr.l2_psm = cpu_to_le16(RFCOMM_PSM);
Marcel Holtmann37e62f52009-02-17 21:49:33 +0100772 addr.l2_cid = 0;
Seung-Woo Kim8992da02013-11-05 17:15:42 +0900773 addr.l2_bdaddr_type = BDADDR_BREDR;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +0200774 *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
Marcel Holtmannb4c612a2006-09-23 09:54:38 +0200775 if (*err == 0 || *err == -EINPROGRESS)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 return s;
777
Dean Jenkins8ff52f72013-02-28 14:21:55 +0000778 return rfcomm_session_del(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779
780failed:
781 sock_release(sock);
782 return NULL;
783}
784
785void rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src, bdaddr_t *dst)
786{
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700787 struct l2cap_chan *chan = l2cap_pi(s->sock->sk)->chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 if (src)
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700789 bacpy(src, &chan->src);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790 if (dst)
Marcel Holtmann24bc10c2013-10-13 09:49:54 -0700791 bacpy(dst, &chan->dst);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792}
793
794/* ---- RFCOMM frame sending ---- */
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200795static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797 struct kvec iv = { data, len };
798 struct msghdr msg;
799
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200800 BT_DBG("session %p len %d", s, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801
802 memset(&msg, 0, sizeof(msg));
803
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200804 return kernel_sendmsg(s->sock, &msg, &iv, 1, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805}
806
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200807static int rfcomm_send_cmd(struct rfcomm_session *s, struct rfcomm_cmd *cmd)
808{
809 BT_DBG("%p cmd %u", s, cmd->ctrl);
810
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200811 return rfcomm_send_frame(s, (void *) cmd, sizeof(*cmd));
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200812}
813
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci)
815{
816 struct rfcomm_cmd cmd;
817
818 BT_DBG("%p dlci %d", s, dlci);
819
820 cmd.addr = __addr(s->initiator, dlci);
821 cmd.ctrl = __ctrl(RFCOMM_SABM, 1);
822 cmd.len = __len8(0);
823 cmd.fcs = __fcs2((u8 *) &cmd);
824
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200825 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826}
827
828static int rfcomm_send_ua(struct rfcomm_session *s, u8 dlci)
829{
830 struct rfcomm_cmd cmd;
831
832 BT_DBG("%p dlci %d", s, dlci);
833
834 cmd.addr = __addr(!s->initiator, dlci);
835 cmd.ctrl = __ctrl(RFCOMM_UA, 1);
836 cmd.len = __len8(0);
837 cmd.fcs = __fcs2((u8 *) &cmd);
838
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200839 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840}
841
842static int rfcomm_send_disc(struct rfcomm_session *s, u8 dlci)
843{
844 struct rfcomm_cmd cmd;
845
846 BT_DBG("%p dlci %d", s, dlci);
847
848 cmd.addr = __addr(s->initiator, dlci);
849 cmd.ctrl = __ctrl(RFCOMM_DISC, 1);
850 cmd.len = __len8(0);
851 cmd.fcs = __fcs2((u8 *) &cmd);
852
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200853 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854}
855
856static int rfcomm_queue_disc(struct rfcomm_dlc *d)
857{
858 struct rfcomm_cmd *cmd;
859 struct sk_buff *skb;
860
861 BT_DBG("dlc %p dlci %d", d, d->dlci);
862
863 skb = alloc_skb(sizeof(*cmd), GFP_KERNEL);
864 if (!skb)
865 return -ENOMEM;
866
867 cmd = (void *) __skb_put(skb, sizeof(*cmd));
868 cmd->addr = d->addr;
869 cmd->ctrl = __ctrl(RFCOMM_DISC, 1);
870 cmd->len = __len8(0);
871 cmd->fcs = __fcs2((u8 *) cmd);
872
873 skb_queue_tail(&d->tx_queue, skb);
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +0300874 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 return 0;
876}
877
878static int rfcomm_send_dm(struct rfcomm_session *s, u8 dlci)
879{
880 struct rfcomm_cmd cmd;
881
882 BT_DBG("%p dlci %d", s, dlci);
883
884 cmd.addr = __addr(!s->initiator, dlci);
885 cmd.ctrl = __ctrl(RFCOMM_DM, 1);
886 cmd.len = __len8(0);
887 cmd.fcs = __fcs2((u8 *) &cmd);
888
Luiz Augusto von Dentz262038f2011-11-01 10:58:58 +0200889 return rfcomm_send_cmd(s, &cmd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890}
891
892static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type)
893{
894 struct rfcomm_hdr *hdr;
895 struct rfcomm_mcc *mcc;
896 u8 buf[16], *ptr = buf;
897
898 BT_DBG("%p cr %d type %d", s, cr, type);
899
900 hdr = (void *) ptr; ptr += sizeof(*hdr);
901 hdr->addr = __addr(s->initiator, 0);
902 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
903 hdr->len = __len8(sizeof(*mcc) + 1);
904
905 mcc = (void *) ptr; ptr += sizeof(*mcc);
906 mcc->type = __mcc_type(cr, RFCOMM_NSC);
907 mcc->len = __len8(1);
908
909 /* Type that we didn't like */
910 *ptr = __mcc_type(cr, type); ptr++;
911
912 *ptr = __fcs(buf); ptr++;
913
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200914 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915}
916
917static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d)
918{
919 struct rfcomm_hdr *hdr;
920 struct rfcomm_mcc *mcc;
921 struct rfcomm_pn *pn;
922 u8 buf[16], *ptr = buf;
923
924 BT_DBG("%p cr %d dlci %d mtu %d", s, cr, d->dlci, d->mtu);
925
926 hdr = (void *) ptr; ptr += sizeof(*hdr);
927 hdr->addr = __addr(s->initiator, 0);
928 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
929 hdr->len = __len8(sizeof(*mcc) + sizeof(*pn));
930
931 mcc = (void *) ptr; ptr += sizeof(*mcc);
932 mcc->type = __mcc_type(cr, RFCOMM_PN);
933 mcc->len = __len8(sizeof(*pn));
934
935 pn = (void *) ptr; ptr += sizeof(*pn);
936 pn->dlci = d->dlci;
937 pn->priority = d->priority;
938 pn->ack_timer = 0;
939 pn->max_retrans = 0;
940
941 if (s->cfc) {
942 pn->flow_ctrl = cr ? 0xf0 : 0xe0;
943 pn->credits = RFCOMM_DEFAULT_CREDITS;
944 } else {
945 pn->flow_ctrl = 0;
946 pn->credits = 0;
947 }
948
Marcel Holtmann98bcd082006-07-14 11:42:12 +0200949 if (cr && channel_mtu >= 0)
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200950 pn->mtu = cpu_to_le16(channel_mtu);
Marcel Holtmann98bcd082006-07-14 11:42:12 +0200951 else
Marcel Holtmannb4324b52009-06-07 18:06:51 +0200952 pn->mtu = cpu_to_le16(d->mtu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953
954 *ptr = __fcs(buf); ptr++;
955
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200956 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957}
958
J. Suter3a5e9032005-08-09 20:28:46 -0700959int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
960 u8 bit_rate, u8 data_bits, u8 stop_bits,
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900961 u8 parity, u8 flow_ctrl_settings,
J. Suter3a5e9032005-08-09 20:28:46 -0700962 u8 xon_char, u8 xoff_char, u16 param_mask)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963{
964 struct rfcomm_hdr *hdr;
965 struct rfcomm_mcc *mcc;
966 struct rfcomm_rpn *rpn;
967 u8 buf[16], *ptr = buf;
968
969 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 +0900970 " flwc_s 0x%x xon_c 0x%x xoff_c 0x%x p_mask 0x%x",
971 s, cr, dlci, bit_rate, data_bits, stop_bits, parity,
J. Suter3a5e9032005-08-09 20:28:46 -0700972 flow_ctrl_settings, xon_char, xoff_char, param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973
974 hdr = (void *) ptr; ptr += sizeof(*hdr);
975 hdr->addr = __addr(s->initiator, 0);
976 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
977 hdr->len = __len8(sizeof(*mcc) + sizeof(*rpn));
978
979 mcc = (void *) ptr; ptr += sizeof(*mcc);
980 mcc->type = __mcc_type(cr, RFCOMM_RPN);
981 mcc->len = __len8(sizeof(*rpn));
982
983 rpn = (void *) ptr; ptr += sizeof(*rpn);
984 rpn->dlci = __addr(1, dlci);
985 rpn->bit_rate = bit_rate;
986 rpn->line_settings = __rpn_line_settings(data_bits, stop_bits, parity);
987 rpn->flow_ctrl = flow_ctrl_settings;
988 rpn->xon_char = xon_char;
989 rpn->xoff_char = xoff_char;
Al Viroe8db8c92006-11-08 00:28:44 -0800990 rpn->param_mask = cpu_to_le16(param_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991
992 *ptr = __fcs(buf); ptr++;
993
Gustavo F. Padovan54365382011-12-20 16:30:44 -0200994 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995}
996
997static int rfcomm_send_rls(struct rfcomm_session *s, int cr, u8 dlci, u8 status)
998{
999 struct rfcomm_hdr *hdr;
1000 struct rfcomm_mcc *mcc;
1001 struct rfcomm_rls *rls;
1002 u8 buf[16], *ptr = buf;
1003
1004 BT_DBG("%p cr %d status 0x%x", s, cr, status);
1005
1006 hdr = (void *) ptr; ptr += sizeof(*hdr);
1007 hdr->addr = __addr(s->initiator, 0);
1008 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1009 hdr->len = __len8(sizeof(*mcc) + sizeof(*rls));
1010
1011 mcc = (void *) ptr; ptr += sizeof(*mcc);
1012 mcc->type = __mcc_type(cr, RFCOMM_RLS);
1013 mcc->len = __len8(sizeof(*rls));
1014
1015 rls = (void *) ptr; ptr += sizeof(*rls);
1016 rls->dlci = __addr(1, dlci);
1017 rls->status = status;
1018
1019 *ptr = __fcs(buf); ptr++;
1020
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001021 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022}
1023
1024static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig)
1025{
1026 struct rfcomm_hdr *hdr;
1027 struct rfcomm_mcc *mcc;
1028 struct rfcomm_msc *msc;
1029 u8 buf[16], *ptr = buf;
1030
1031 BT_DBG("%p cr %d v24 0x%x", s, cr, v24_sig);
1032
1033 hdr = (void *) ptr; ptr += sizeof(*hdr);
1034 hdr->addr = __addr(s->initiator, 0);
1035 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1036 hdr->len = __len8(sizeof(*mcc) + sizeof(*msc));
1037
1038 mcc = (void *) ptr; ptr += sizeof(*mcc);
1039 mcc->type = __mcc_type(cr, RFCOMM_MSC);
1040 mcc->len = __len8(sizeof(*msc));
1041
1042 msc = (void *) ptr; ptr += sizeof(*msc);
1043 msc->dlci = __addr(1, dlci);
1044 msc->v24_sig = v24_sig | 0x01;
1045
1046 *ptr = __fcs(buf); ptr++;
1047
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001048 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049}
1050
1051static int rfcomm_send_fcoff(struct rfcomm_session *s, int cr)
1052{
1053 struct rfcomm_hdr *hdr;
1054 struct rfcomm_mcc *mcc;
1055 u8 buf[16], *ptr = buf;
1056
1057 BT_DBG("%p cr %d", s, cr);
1058
1059 hdr = (void *) ptr; ptr += sizeof(*hdr);
1060 hdr->addr = __addr(s->initiator, 0);
1061 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1062 hdr->len = __len8(sizeof(*mcc));
1063
1064 mcc = (void *) ptr; ptr += sizeof(*mcc);
1065 mcc->type = __mcc_type(cr, RFCOMM_FCOFF);
1066 mcc->len = __len8(0);
1067
1068 *ptr = __fcs(buf); ptr++;
1069
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001070 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071}
1072
1073static int rfcomm_send_fcon(struct rfcomm_session *s, int cr)
1074{
1075 struct rfcomm_hdr *hdr;
1076 struct rfcomm_mcc *mcc;
1077 u8 buf[16], *ptr = buf;
1078
1079 BT_DBG("%p cr %d", s, cr);
1080
1081 hdr = (void *) ptr; ptr += sizeof(*hdr);
1082 hdr->addr = __addr(s->initiator, 0);
1083 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1084 hdr->len = __len8(sizeof(*mcc));
1085
1086 mcc = (void *) ptr; ptr += sizeof(*mcc);
1087 mcc->type = __mcc_type(cr, RFCOMM_FCON);
1088 mcc->len = __len8(0);
1089
1090 *ptr = __fcs(buf); ptr++;
1091
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001092 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093}
1094
1095static int rfcomm_send_test(struct rfcomm_session *s, int cr, u8 *pattern, int len)
1096{
1097 struct socket *sock = s->sock;
1098 struct kvec iv[3];
1099 struct msghdr msg;
1100 unsigned char hdr[5], crc[1];
1101
1102 if (len > 125)
1103 return -EINVAL;
1104
1105 BT_DBG("%p cr %d", s, cr);
1106
1107 hdr[0] = __addr(s->initiator, 0);
1108 hdr[1] = __ctrl(RFCOMM_UIH, 0);
1109 hdr[2] = 0x01 | ((len + 2) << 1);
1110 hdr[3] = 0x01 | ((cr & 0x01) << 1) | (RFCOMM_TEST << 2);
1111 hdr[4] = 0x01 | (len << 1);
1112
1113 crc[0] = __fcs(hdr);
1114
1115 iv[0].iov_base = hdr;
1116 iv[0].iov_len = 5;
1117 iv[1].iov_base = pattern;
1118 iv[1].iov_len = len;
1119 iv[2].iov_base = crc;
1120 iv[2].iov_len = 1;
1121
1122 memset(&msg, 0, sizeof(msg));
1123
1124 return kernel_sendmsg(sock, &msg, iv, 3, 6 + len);
1125}
1126
1127static int rfcomm_send_credits(struct rfcomm_session *s, u8 addr, u8 credits)
1128{
1129 struct rfcomm_hdr *hdr;
1130 u8 buf[16], *ptr = buf;
1131
1132 BT_DBG("%p addr %d credits %d", s, addr, credits);
1133
1134 hdr = (void *) ptr; ptr += sizeof(*hdr);
1135 hdr->addr = addr;
1136 hdr->ctrl = __ctrl(RFCOMM_UIH, 1);
1137 hdr->len = __len8(0);
1138
1139 *ptr = credits; ptr++;
1140
1141 *ptr = __fcs(buf); ptr++;
1142
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001143 return rfcomm_send_frame(s, buf, ptr - buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144}
1145
1146static void rfcomm_make_uih(struct sk_buff *skb, u8 addr)
1147{
1148 struct rfcomm_hdr *hdr;
1149 int len = skb->len;
1150 u8 *crc;
1151
1152 if (len > 127) {
1153 hdr = (void *) skb_push(skb, 4);
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001154 put_unaligned(cpu_to_le16(__len16(len)), (__le16 *) &hdr->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 } else {
1156 hdr = (void *) skb_push(skb, 3);
1157 hdr->len = __len8(len);
1158 }
1159 hdr->addr = addr;
1160 hdr->ctrl = __ctrl(RFCOMM_UIH, 0);
1161
1162 crc = skb_put(skb, 1);
1163 *crc = __fcs((void *) hdr);
1164}
1165
1166/* ---- RFCOMM frame reception ---- */
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001167static struct rfcomm_session *rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168{
1169 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1170
1171 if (dlci) {
1172 /* Data channel */
1173 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1174 if (!d) {
1175 rfcomm_send_dm(s, dlci);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001176 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177 }
1178
1179 switch (d->state) {
1180 case BT_CONNECT:
1181 rfcomm_dlc_clear_timer(d);
1182
1183 rfcomm_dlc_lock(d);
1184 d->state = BT_CONNECTED;
1185 d->state_change(d, 0);
1186 rfcomm_dlc_unlock(d);
1187
1188 rfcomm_send_msc(s, 1, dlci, d->v24_sig);
1189 break;
1190
1191 case BT_DISCONN:
1192 d->state = BT_CLOSED;
1193 __rfcomm_dlc_close(d, 0);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001194
1195 if (list_empty(&s->dlcs)) {
1196 s->state = BT_DISCONN;
1197 rfcomm_send_disc(s, 0);
Mat Martineau79e65472011-12-06 16:23:26 -08001198 rfcomm_session_clear_timer(s);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001199 }
1200
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 break;
1202 }
1203 } else {
1204 /* Control channel */
1205 switch (s->state) {
1206 case BT_CONNECT:
1207 s->state = BT_CONNECTED;
1208 rfcomm_process_connect(s);
1209 break;
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001210
1211 case BT_DISCONN:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001212 s = rfcomm_session_close(s, ECONNRESET);
Marcel Holtmann9cf5b0e2007-05-05 00:36:13 +02001213 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214 }
1215 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001216 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217}
1218
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001219static struct rfcomm_session *rfcomm_recv_dm(struct rfcomm_session *s, u8 dlci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220{
1221 int err = 0;
1222
1223 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1224
1225 if (dlci) {
1226 /* Data DLC */
1227 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1228 if (d) {
1229 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1230 err = ECONNREFUSED;
1231 else
1232 err = ECONNRESET;
1233
1234 d->state = BT_CLOSED;
1235 __rfcomm_dlc_close(d, err);
1236 }
1237 } else {
1238 if (s->state == BT_CONNECT)
1239 err = ECONNREFUSED;
1240 else
1241 err = ECONNRESET;
1242
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001243 s = rfcomm_session_close(s, err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001245 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246}
1247
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001248static struct rfcomm_session *rfcomm_recv_disc(struct rfcomm_session *s,
1249 u8 dlci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250{
1251 int err = 0;
1252
1253 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1254
1255 if (dlci) {
1256 struct rfcomm_dlc *d = rfcomm_dlc_get(s, dlci);
1257 if (d) {
1258 rfcomm_send_ua(s, dlci);
1259
1260 if (d->state == BT_CONNECT || d->state == BT_CONFIG)
1261 err = ECONNREFUSED;
1262 else
1263 err = ECONNRESET;
1264
1265 d->state = BT_CLOSED;
1266 __rfcomm_dlc_close(d, err);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001267 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 rfcomm_send_dm(s, dlci);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001269
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270 } else {
1271 rfcomm_send_ua(s, 0);
1272
1273 if (s->state == BT_CONNECT)
1274 err = ECONNREFUSED;
1275 else
1276 err = ECONNRESET;
1277
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001278 s = rfcomm_session_close(s, err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001280 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281}
1282
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001283void rfcomm_dlc_accept(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284{
Marcel Holtmann300b9392006-07-03 10:37:55 +02001285 struct sock *sk = d->session->sock->sk;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001286 struct l2cap_conn *conn = l2cap_pi(sk)->chan->conn;
Marcel Holtmann300b9392006-07-03 10:37:55 +02001287
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 BT_DBG("dlc %p", d);
1289
1290 rfcomm_send_ua(d->session, d->dlci);
1291
Johan Hedberge2139b32009-03-26 16:41:56 +02001292 rfcomm_dlc_clear_timer(d);
1293
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 rfcomm_dlc_lock(d);
1295 d->state = BT_CONNECTED;
1296 d->state_change(d, 0);
1297 rfcomm_dlc_unlock(d);
1298
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001299 if (d->role_switch)
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001300 hci_conn_switch_role(conn->hcon, 0x00);
Marcel Holtmann300b9392006-07-03 10:37:55 +02001301
Linus Torvalds1da177e2005-04-16 15:20:36 -07001302 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
1303}
1304
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001305static void rfcomm_check_accept(struct rfcomm_dlc *d)
1306{
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001307 if (rfcomm_check_security(d)) {
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001308 if (d->defer_setup) {
1309 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1310 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmann8bf47942009-02-16 02:59:49 +01001311
1312 rfcomm_dlc_lock(d);
1313 d->state = BT_CONNECT2;
1314 d->state_change(d, 0);
1315 rfcomm_dlc_unlock(d);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001316 } else
1317 rfcomm_dlc_accept(d);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001318 } else {
1319 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1320 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001321 }
1322}
1323
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
1325{
1326 struct rfcomm_dlc *d;
1327 u8 channel;
1328
1329 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1330
1331 if (!dlci) {
1332 rfcomm_send_ua(s, 0);
1333
1334 if (s->state == BT_OPEN) {
1335 s->state = BT_CONNECTED;
1336 rfcomm_process_connect(s);
1337 }
1338 return 0;
1339 }
1340
1341 /* Check if DLC exists */
1342 d = rfcomm_dlc_get(s, dlci);
1343 if (d) {
1344 if (d->state == BT_OPEN) {
1345 /* DLC was previously opened by PN request */
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001346 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347 }
1348 return 0;
1349 }
1350
1351 /* Notify socket layer about incoming connection */
1352 channel = __srv_channel(dlci);
1353 if (rfcomm_connect_ind(s, channel, &d)) {
1354 d->dlci = dlci;
1355 d->addr = __addr(s->initiator, dlci);
1356 rfcomm_dlc_link(s, d);
1357
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001358 rfcomm_check_accept(d);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 } else {
1360 rfcomm_send_dm(s, dlci);
1361 }
1362
1363 return 0;
1364}
1365
1366static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)
1367{
1368 struct rfcomm_session *s = d->session;
1369
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001370 BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371 d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits);
1372
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001373 if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) ||
1374 pn->flow_ctrl == 0xe0) {
1375 d->cfc = RFCOMM_CFC_ENABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 d->tx_credits = pn->credits;
1377 } else {
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001378 d->cfc = RFCOMM_CFC_DISABLED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001379 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1380 }
1381
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02001382 if (s->cfc == RFCOMM_CFC_UNKNOWN)
1383 s->cfc = d->cfc;
1384
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385 d->priority = pn->priority;
1386
Marcel Holtmannb4324b52009-06-07 18:06:51 +02001387 d->mtu = __le16_to_cpu(pn->mtu);
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001388
1389 if (cr && d->mtu > s->mtu)
1390 d->mtu = s->mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391
1392 return 0;
1393}
1394
1395static int rfcomm_recv_pn(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1396{
1397 struct rfcomm_pn *pn = (void *) skb->data;
1398 struct rfcomm_dlc *d;
1399 u8 dlci = pn->dlci;
1400
1401 BT_DBG("session %p state %ld dlci %d", s, s->state, dlci);
1402
1403 if (!dlci)
1404 return 0;
1405
1406 d = rfcomm_dlc_get(s, dlci);
1407 if (d) {
1408 if (cr) {
1409 /* PN request */
1410 rfcomm_apply_pn(d, cr, pn);
1411 rfcomm_send_pn(s, 0, d);
1412 } else {
1413 /* PN response */
1414 switch (d->state) {
1415 case BT_CONFIG:
1416 rfcomm_apply_pn(d, cr, pn);
1417
1418 d->state = BT_CONNECT;
1419 rfcomm_send_sabm(s, d->dlci);
1420 break;
1421 }
1422 }
1423 } else {
1424 u8 channel = __srv_channel(dlci);
1425
1426 if (!cr)
1427 return 0;
1428
1429 /* PN request for non existing DLC.
1430 * Assume incoming connection. */
1431 if (rfcomm_connect_ind(s, channel, &d)) {
1432 d->dlci = dlci;
1433 d->addr = __addr(s->initiator, dlci);
1434 rfcomm_dlc_link(s, d);
1435
1436 rfcomm_apply_pn(d, cr, pn);
1437
1438 d->state = BT_OPEN;
1439 rfcomm_send_pn(s, 0, d);
1440 } else {
1441 rfcomm_send_dm(s, dlci);
1442 }
1443 }
1444 return 0;
1445}
1446
1447static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_buff *skb)
1448{
1449 struct rfcomm_rpn *rpn = (void *) skb->data;
1450 u8 dlci = __get_dlci(rpn->dlci);
1451
1452 u8 bit_rate = 0;
1453 u8 data_bits = 0;
1454 u8 stop_bits = 0;
1455 u8 parity = 0;
1456 u8 flow_ctrl = 0;
1457 u8 xon_char = 0;
1458 u8 xoff_char = 0;
1459 u16 rpn_mask = RFCOMM_RPN_PM_ALL;
J. Suter3a5e9032005-08-09 20:28:46 -07001460
1461 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",
1462 dlci, cr, len, rpn->bit_rate, rpn->line_settings, rpn->flow_ctrl,
1463 rpn->xon_char, rpn->xoff_char, rpn->param_mask);
1464
1465 if (!cr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 return 0;
J. Suter3a5e9032005-08-09 20:28:46 -07001467
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468 if (len == 1) {
Yuri Kululin08601462010-07-23 13:57:12 +04001469 /* This is a request, return default (according to ETSI TS 07.10) settings */
1470 bit_rate = RFCOMM_RPN_BR_9600;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471 data_bits = RFCOMM_RPN_DATA_8;
1472 stop_bits = RFCOMM_RPN_STOP_1;
1473 parity = RFCOMM_RPN_PARITY_NONE;
1474 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1475 xon_char = RFCOMM_RPN_XON_CHAR;
1476 xoff_char = RFCOMM_RPN_XOFF_CHAR;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 goto rpn_out;
1478 }
J. Suter3a5e9032005-08-09 20:28:46 -07001479
1480 /* Check for sane values, ignore/accept bit_rate, 8 bits, 1 stop bit,
1481 * no parity, no flow control lines, normal XON/XOFF chars */
1482
Al Viroe8db8c92006-11-08 00:28:44 -08001483 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_BITRATE)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 bit_rate = rpn->bit_rate;
Yuri Kululin08601462010-07-23 13:57:12 +04001485 if (bit_rate > RFCOMM_RPN_BR_230400) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486 BT_DBG("RPN bit rate mismatch 0x%x", bit_rate);
Yuri Kululin08601462010-07-23 13:57:12 +04001487 bit_rate = RFCOMM_RPN_BR_9600;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488 rpn_mask ^= RFCOMM_RPN_PM_BITRATE;
1489 }
1490 }
J. Suter3a5e9032005-08-09 20:28:46 -07001491
Al Viroe8db8c92006-11-08 00:28:44 -08001492 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_DATA)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493 data_bits = __get_rpn_data_bits(rpn->line_settings);
1494 if (data_bits != RFCOMM_RPN_DATA_8) {
1495 BT_DBG("RPN data bits mismatch 0x%x", data_bits);
1496 data_bits = RFCOMM_RPN_DATA_8;
1497 rpn_mask ^= RFCOMM_RPN_PM_DATA;
1498 }
1499 }
J. Suter3a5e9032005-08-09 20:28:46 -07001500
Al Viroe8db8c92006-11-08 00:28:44 -08001501 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_STOP)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 stop_bits = __get_rpn_stop_bits(rpn->line_settings);
1503 if (stop_bits != RFCOMM_RPN_STOP_1) {
1504 BT_DBG("RPN stop bits mismatch 0x%x", stop_bits);
1505 stop_bits = RFCOMM_RPN_STOP_1;
1506 rpn_mask ^= RFCOMM_RPN_PM_STOP;
1507 }
1508 }
J. Suter3a5e9032005-08-09 20:28:46 -07001509
Al Viroe8db8c92006-11-08 00:28:44 -08001510 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_PARITY)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 parity = __get_rpn_parity(rpn->line_settings);
1512 if (parity != RFCOMM_RPN_PARITY_NONE) {
1513 BT_DBG("RPN parity mismatch 0x%x", parity);
1514 parity = RFCOMM_RPN_PARITY_NONE;
1515 rpn_mask ^= RFCOMM_RPN_PM_PARITY;
1516 }
1517 }
J. Suter3a5e9032005-08-09 20:28:46 -07001518
Al Viroe8db8c92006-11-08 00:28:44 -08001519 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_FLOW)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520 flow_ctrl = rpn->flow_ctrl;
1521 if (flow_ctrl != RFCOMM_RPN_FLOW_NONE) {
1522 BT_DBG("RPN flow ctrl mismatch 0x%x", flow_ctrl);
1523 flow_ctrl = RFCOMM_RPN_FLOW_NONE;
1524 rpn_mask ^= RFCOMM_RPN_PM_FLOW;
1525 }
1526 }
J. Suter3a5e9032005-08-09 20:28:46 -07001527
Al Viroe8db8c92006-11-08 00:28:44 -08001528 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XON)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529 xon_char = rpn->xon_char;
1530 if (xon_char != RFCOMM_RPN_XON_CHAR) {
1531 BT_DBG("RPN XON char mismatch 0x%x", xon_char);
1532 xon_char = RFCOMM_RPN_XON_CHAR;
1533 rpn_mask ^= RFCOMM_RPN_PM_XON;
1534 }
1535 }
J. Suter3a5e9032005-08-09 20:28:46 -07001536
Al Viroe8db8c92006-11-08 00:28:44 -08001537 if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_XOFF)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538 xoff_char = rpn->xoff_char;
1539 if (xoff_char != RFCOMM_RPN_XOFF_CHAR) {
1540 BT_DBG("RPN XOFF char mismatch 0x%x", xoff_char);
1541 xoff_char = RFCOMM_RPN_XOFF_CHAR;
1542 rpn_mask ^= RFCOMM_RPN_PM_XOFF;
1543 }
1544 }
1545
1546rpn_out:
J. Suter3a5e9032005-08-09 20:28:46 -07001547 rfcomm_send_rpn(s, 0, dlci, bit_rate, data_bits, stop_bits,
1548 parity, flow_ctrl, xon_char, xoff_char, rpn_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549
1550 return 0;
1551}
1552
1553static int rfcomm_recv_rls(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1554{
1555 struct rfcomm_rls *rls = (void *) skb->data;
1556 u8 dlci = __get_dlci(rls->dlci);
1557
1558 BT_DBG("dlci %d cr %d status 0x%x", dlci, cr, rls->status);
J. Suter3a5e9032005-08-09 20:28:46 -07001559
Linus Torvalds1da177e2005-04-16 15:20:36 -07001560 if (!cr)
1561 return 0;
1562
J. Suter3a5e9032005-08-09 20:28:46 -07001563 /* We should probably do something with this information here. But
1564 * for now it's sufficient just to reply -- Bluetooth 1.1 says it's
1565 * mandatory to recognise and respond to RLS */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001566
1567 rfcomm_send_rls(s, 0, dlci, rls->status);
1568
1569 return 0;
1570}
1571
1572static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb)
1573{
1574 struct rfcomm_msc *msc = (void *) skb->data;
1575 struct rfcomm_dlc *d;
1576 u8 dlci = __get_dlci(msc->dlci);
1577
1578 BT_DBG("dlci %d cr %d v24 0x%x", dlci, cr, msc->v24_sig);
1579
1580 d = rfcomm_dlc_get(s, dlci);
J. Suter3a5e9032005-08-09 20:28:46 -07001581 if (!d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 return 0;
1583
1584 if (cr) {
1585 if (msc->v24_sig & RFCOMM_V24_FC && !d->cfc)
1586 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1587 else
1588 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
J. Suter3a5e9032005-08-09 20:28:46 -07001589
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590 rfcomm_dlc_lock(d);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001591
1592 d->remote_v24_sig = msc->v24_sig;
1593
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594 if (d->modem_status)
1595 d->modem_status(d, msc->v24_sig);
Marcel Holtmann8b6b3da2008-07-14 20:13:52 +02001596
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597 rfcomm_dlc_unlock(d);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001598
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599 rfcomm_send_msc(s, 0, dlci, msc->v24_sig);
1600
1601 d->mscex |= RFCOMM_MSCEX_RX;
J. Suter3a5e9032005-08-09 20:28:46 -07001602 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001603 d->mscex |= RFCOMM_MSCEX_TX;
1604
1605 return 0;
1606}
1607
1608static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
1609{
1610 struct rfcomm_mcc *mcc = (void *) skb->data;
1611 u8 type, cr, len;
1612
1613 cr = __test_cr(mcc->type);
1614 type = __get_mcc_type(mcc->type);
1615 len = __get_mcc_len(mcc->len);
1616
1617 BT_DBG("%p type 0x%x cr %d", s, type, cr);
1618
1619 skb_pull(skb, 2);
1620
1621 switch (type) {
1622 case RFCOMM_PN:
1623 rfcomm_recv_pn(s, cr, skb);
1624 break;
1625
1626 case RFCOMM_RPN:
1627 rfcomm_recv_rpn(s, cr, len, skb);
1628 break;
1629
1630 case RFCOMM_RLS:
1631 rfcomm_recv_rls(s, cr, skb);
1632 break;
1633
1634 case RFCOMM_MSC:
1635 rfcomm_recv_msc(s, cr, skb);
1636 break;
1637
1638 case RFCOMM_FCOFF:
1639 if (cr) {
1640 set_bit(RFCOMM_TX_THROTTLED, &s->flags);
1641 rfcomm_send_fcoff(s, 0);
1642 }
1643 break;
1644
1645 case RFCOMM_FCON:
1646 if (cr) {
1647 clear_bit(RFCOMM_TX_THROTTLED, &s->flags);
1648 rfcomm_send_fcon(s, 0);
1649 }
1650 break;
1651
1652 case RFCOMM_TEST:
1653 if (cr)
1654 rfcomm_send_test(s, 0, skb->data, skb->len);
1655 break;
1656
1657 case RFCOMM_NSC:
1658 break;
1659
1660 default:
1661 BT_ERR("Unknown control type 0x%02x", type);
1662 rfcomm_send_nsc(s, cr, type);
1663 break;
1664 }
1665 return 0;
1666}
1667
1668static int rfcomm_recv_data(struct rfcomm_session *s, u8 dlci, int pf, struct sk_buff *skb)
1669{
1670 struct rfcomm_dlc *d;
1671
1672 BT_DBG("session %p state %ld dlci %d pf %d", s, s->state, dlci, pf);
1673
1674 d = rfcomm_dlc_get(s, dlci);
1675 if (!d) {
1676 rfcomm_send_dm(s, dlci);
1677 goto drop;
1678 }
1679
1680 if (pf && d->cfc) {
1681 u8 credits = *(u8 *) skb->data; skb_pull(skb, 1);
1682
1683 d->tx_credits += credits;
1684 if (d->tx_credits)
1685 clear_bit(RFCOMM_TX_THROTTLED, &d->flags);
1686 }
1687
1688 if (skb->len && d->state == BT_CONNECTED) {
1689 rfcomm_dlc_lock(d);
1690 d->rx_credits--;
1691 d->data_ready(d, skb);
1692 rfcomm_dlc_unlock(d);
1693 return 0;
1694 }
1695
1696drop:
1697 kfree_skb(skb);
1698 return 0;
1699}
1700
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001701static struct rfcomm_session *rfcomm_recv_frame(struct rfcomm_session *s,
1702 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703{
1704 struct rfcomm_hdr *hdr = (void *) skb->data;
1705 u8 type, dlci, fcs;
1706
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001707 if (!s) {
1708 /* no session, so free socket data */
1709 kfree_skb(skb);
1710 return s;
1711 }
1712
Linus Torvalds1da177e2005-04-16 15:20:36 -07001713 dlci = __get_dlci(hdr->addr);
1714 type = __get_type(hdr->ctrl);
1715
1716 /* Trim FCS */
1717 skb->len--; skb->tail--;
Arnaldo Carvalho de Melo27a884d2007-04-19 20:29:13 -07001718 fcs = *(u8 *)skb_tail_pointer(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719
1720 if (__check_fcs(skb->data, type, fcs)) {
1721 BT_ERR("bad checksum in packet");
1722 kfree_skb(skb);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001723 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724 }
1725
1726 if (__test_ea(hdr->len))
1727 skb_pull(skb, 3);
1728 else
1729 skb_pull(skb, 4);
1730
1731 switch (type) {
1732 case RFCOMM_SABM:
1733 if (__test_pf(hdr->ctrl))
1734 rfcomm_recv_sabm(s, dlci);
1735 break;
1736
1737 case RFCOMM_DISC:
1738 if (__test_pf(hdr->ctrl))
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001739 s = rfcomm_recv_disc(s, dlci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740 break;
1741
1742 case RFCOMM_UA:
1743 if (__test_pf(hdr->ctrl))
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001744 s = rfcomm_recv_ua(s, dlci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 break;
1746
1747 case RFCOMM_DM:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001748 s = rfcomm_recv_dm(s, dlci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001749 break;
1750
1751 case RFCOMM_UIH:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001752 if (dlci) {
1753 rfcomm_recv_data(s, dlci, __test_pf(hdr->ctrl), skb);
1754 return s;
1755 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756 rfcomm_recv_mcc(s, skb);
1757 break;
1758
1759 default:
Andrei Emeltchenko5017d8d2010-09-08 16:26:53 +03001760 BT_ERR("Unknown packet type 0x%02x", type);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 break;
1762 }
1763 kfree_skb(skb);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001764 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765}
1766
1767/* ---- Connection and data processing ---- */
1768
1769static void rfcomm_process_connect(struct rfcomm_session *s)
1770{
1771 struct rfcomm_dlc *d;
1772 struct list_head *p, *n;
1773
1774 BT_DBG("session %p state %ld", s, s->state);
1775
1776 list_for_each_safe(p, n, &s->dlcs) {
1777 d = list_entry(p, struct rfcomm_dlc, list);
1778 if (d->state == BT_CONFIG) {
1779 d->mtu = s->mtu;
Marcel Holtmann9f2c8a02009-01-15 21:58:40 +01001780 if (rfcomm_check_security(d)) {
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001781 rfcomm_send_pn(s, 1, d);
1782 } else {
Marcel Holtmann77db1982008-07-14 20:13:45 +02001783 set_bit(RFCOMM_AUTH_PENDING, &d->flags);
1784 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01001785 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 }
1787 }
1788}
1789
1790/* Send data queued for the DLC.
1791 * Return number of frames left in the queue.
1792 */
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001793static int rfcomm_process_tx(struct rfcomm_dlc *d)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001794{
1795 struct sk_buff *skb;
1796 int err;
1797
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001798 BT_DBG("dlc %p state %ld cfc %d rx_credits %d tx_credits %d",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 d, d->state, d->cfc, d->rx_credits, d->tx_credits);
1800
1801 /* Send pending MSC */
1802 if (test_and_clear_bit(RFCOMM_MSC_PENDING, &d->flags))
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001803 rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001804
1805 if (d->cfc) {
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001806 /* CFC enabled.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 * Give them some credits */
1808 if (!test_bit(RFCOMM_RX_THROTTLED, &d->flags) &&
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001809 d->rx_credits <= (d->cfc >> 2)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810 rfcomm_send_credits(d->session, d->addr, d->cfc - d->rx_credits);
1811 d->rx_credits = d->cfc;
1812 }
1813 } else {
1814 /* CFC disabled.
1815 * Give ourselves some credits */
1816 d->tx_credits = 5;
1817 }
1818
1819 if (test_bit(RFCOMM_TX_THROTTLED, &d->flags))
1820 return skb_queue_len(&d->tx_queue);
1821
1822 while (d->tx_credits && (skb = skb_dequeue(&d->tx_queue))) {
Gustavo F. Padovan54365382011-12-20 16:30:44 -02001823 err = rfcomm_send_frame(d->session, skb->data, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824 if (err < 0) {
1825 skb_queue_head(&d->tx_queue, skb);
1826 break;
1827 }
1828 kfree_skb(skb);
1829 d->tx_credits--;
1830 }
1831
1832 if (d->cfc && !d->tx_credits) {
1833 /* We're out of TX credits.
1834 * Set TX_THROTTLED flag to avoid unnesary wakeups by dlc_send. */
1835 set_bit(RFCOMM_TX_THROTTLED, &d->flags);
1836 }
1837
1838 return skb_queue_len(&d->tx_queue);
1839}
1840
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001841static void rfcomm_process_dlcs(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842{
1843 struct rfcomm_dlc *d;
1844 struct list_head *p, *n;
1845
1846 BT_DBG("session %p state %ld", s, s->state);
1847
1848 list_for_each_safe(p, n, &s->dlcs) {
1849 d = list_entry(p, struct rfcomm_dlc, list);
1850
1851 if (test_bit(RFCOMM_TIMED_OUT, &d->flags)) {
1852 __rfcomm_dlc_close(d, ETIMEDOUT);
1853 continue;
1854 }
1855
Szymon Jancdb544672011-09-26 14:19:47 +02001856 if (test_bit(RFCOMM_ENC_DROP, &d->flags)) {
1857 __rfcomm_dlc_close(d, ECONNREFUSED);
1858 continue;
1859 }
1860
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861 if (test_and_clear_bit(RFCOMM_AUTH_ACCEPT, &d->flags)) {
1862 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001863 if (d->out) {
1864 rfcomm_send_pn(s, 1, d);
1865 rfcomm_dlc_set_timer(d, RFCOMM_CONN_TIMEOUT);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001866 } else {
1867 if (d->defer_setup) {
1868 set_bit(RFCOMM_DEFER_SETUP, &d->flags);
1869 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
Marcel Holtmann8bf47942009-02-16 02:59:49 +01001870
1871 rfcomm_dlc_lock(d);
1872 d->state = BT_CONNECT2;
1873 d->state_change(d, 0);
1874 rfcomm_dlc_unlock(d);
Marcel Holtmannbb23c0a2009-01-15 21:56:48 +01001875 } else
1876 rfcomm_dlc_accept(d);
1877 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 continue;
1879 } else if (test_and_clear_bit(RFCOMM_AUTH_REJECT, &d->flags)) {
1880 rfcomm_dlc_clear_timer(d);
Marcel Holtmann77db1982008-07-14 20:13:45 +02001881 if (!d->out)
1882 rfcomm_send_dm(s, d->dlci);
1883 else
1884 d->state = BT_CLOSED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001885 __rfcomm_dlc_close(d, ECONNREFUSED);
1886 continue;
1887 }
1888
Jaikumar Ganesh6e1031a2009-02-02 18:03:57 -08001889 if (test_bit(RFCOMM_SEC_PENDING, &d->flags))
1890 continue;
1891
Linus Torvalds1da177e2005-04-16 15:20:36 -07001892 if (test_bit(RFCOMM_TX_THROTTLED, &s->flags))
1893 continue;
1894
1895 if ((d->state == BT_CONNECTED || d->state == BT_DISCONN) &&
Marcel Holtmann77db1982008-07-14 20:13:45 +02001896 d->mscex == RFCOMM_MSCEX_OK)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 rfcomm_process_tx(d);
1898 }
1899}
1900
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001901static struct rfcomm_session *rfcomm_process_rx(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001902{
1903 struct socket *sock = s->sock;
1904 struct sock *sk = sock->sk;
1905 struct sk_buff *skb;
1906
1907 BT_DBG("session %p state %ld qlen %d", s, s->state, skb_queue_len(&sk->sk_receive_queue));
1908
1909 /* Get data directly from socket receive queue without copying it. */
1910 while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
1911 skb_orphan(skb);
Mat Martineau44935722011-07-22 14:53:58 -07001912 if (!skb_linearize(skb))
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001913 s = rfcomm_recv_frame(s, skb);
Mat Martineau44935722011-07-22 14:53:58 -07001914 else
1915 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001916 }
1917
Dean Jenkins08c30ac2013-02-28 14:21:56 +00001918 if (s && (sk->sk_state == BT_CLOSED))
1919 s = rfcomm_session_close(s, sk->sk_err);
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001920
1921 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001922}
1923
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001924static void rfcomm_accept_connection(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001925{
1926 struct socket *sock = s->sock, *nsock;
1927 int err;
1928
1929 /* Fast check for a new connection.
1930 * Avoids unnesesary socket allocations. */
1931 if (list_empty(&bt_sk(sock->sk)->accept_q))
1932 return;
1933
1934 BT_DBG("session %p", s);
1935
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02001936 err = kernel_accept(sock, &nsock, O_NONBLOCK);
1937 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001938 return;
1939
Linus Torvalds1da177e2005-04-16 15:20:36 -07001940 /* Set our callbacks */
1941 nsock->sk->sk_data_ready = rfcomm_l2data_ready;
1942 nsock->sk->sk_state_change = rfcomm_l2state_change;
1943
1944 s = rfcomm_session_add(nsock, BT_OPEN);
1945 if (s) {
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001946 /* We should adjust MTU on incoming sessions.
1947 * L2CAP MTU minus UIH header and FCS. */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001948 s->mtu = min(l2cap_pi(nsock->sk)->chan->omtu,
1949 l2cap_pi(nsock->sk)->chan->imtu) - 5;
Marcel Holtmann98bcd082006-07-14 11:42:12 +02001950
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +03001951 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952 } else
1953 sock_release(nsock);
1954}
1955
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001956static struct rfcomm_session *rfcomm_check_connection(struct rfcomm_session *s)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957{
1958 struct sock *sk = s->sock->sk;
1959
1960 BT_DBG("%p state %ld", s, s->state);
1961
Andrei Emeltchenko285b4e92010-12-01 16:58:23 +02001962 switch (sk->sk_state) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001963 case BT_CONNECTED:
1964 s->state = BT_CONNECT;
1965
1966 /* We can adjust MTU on outgoing sessions.
1967 * L2CAP MTU minus UIH header and FCS. */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03001968 s->mtu = min(l2cap_pi(sk)->chan->omtu, l2cap_pi(sk)->chan->imtu) - 5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001969
1970 rfcomm_send_sabm(s, 0);
1971 break;
1972
1973 case BT_CLOSED:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001974 s = rfcomm_session_close(s, sk->sk_err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001975 break;
1976 }
Dean Jenkins8ff52f72013-02-28 14:21:55 +00001977 return s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001978}
1979
Gustavo Padovan6039aa732012-05-23 04:04:18 -03001980static void rfcomm_process_sessions(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981{
1982 struct list_head *p, *n;
1983
1984 rfcomm_lock();
1985
1986 list_for_each_safe(p, n, &session_list) {
1987 struct rfcomm_session *s;
1988 s = list_entry(p, struct rfcomm_session, list);
1989
Luiz Augusto von Dentz9e726b12009-07-15 13:50:58 -03001990 if (test_and_clear_bit(RFCOMM_TIMED_OUT, &s->flags)) {
1991 s->state = BT_DISCONN;
1992 rfcomm_send_disc(s, 0);
1993 continue;
1994 }
1995
Peter Hurley4339c252014-02-09 20:59:11 -05001996 switch (s->state) {
1997 case BT_LISTEN:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001998 rfcomm_accept_connection(s);
1999 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002000
Linus Torvalds1da177e2005-04-16 15:20:36 -07002001 case BT_BOUND:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00002002 s = rfcomm_check_connection(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003 break;
2004
2005 default:
Dean Jenkins8ff52f72013-02-28 14:21:55 +00002006 s = rfcomm_process_rx(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002007 break;
2008 }
2009
Dean Jenkins8ff52f72013-02-28 14:21:55 +00002010 if (s)
2011 rfcomm_process_dlcs(s);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002012 }
2013
2014 rfcomm_unlock();
2015}
2016
Linus Torvalds1da177e2005-04-16 15:20:36 -07002017static int rfcomm_add_listener(bdaddr_t *ba)
2018{
2019 struct sockaddr_l2 addr;
2020 struct socket *sock;
2021 struct sock *sk;
2022 struct rfcomm_session *s;
2023 int err = 0;
2024
2025 /* Create socket */
2026 err = rfcomm_l2sock_create(&sock);
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09002027 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028 BT_ERR("Create socket failed %d", err);
2029 return err;
2030 }
2031
2032 /* Bind socket */
2033 bacpy(&addr.l2_bdaddr, ba);
2034 addr.l2_family = AF_BLUETOOTH;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002035 addr.l2_psm = cpu_to_le16(RFCOMM_PSM);
Marcel Holtmann37e62f52009-02-17 21:49:33 +01002036 addr.l2_cid = 0;
Seung-Woo Kimc507f132013-11-05 16:02:24 +09002037 addr.l2_bdaddr_type = BDADDR_BREDR;
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02002038 err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039 if (err < 0) {
2040 BT_ERR("Bind failed %d", err);
2041 goto failed;
2042 }
2043
2044 /* Set L2CAP options */
2045 sk = sock->sk;
2046 lock_sock(sk);
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03002047 l2cap_pi(sk)->chan->imtu = l2cap_mtu;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002048 release_sock(sk);
2049
2050 /* Start listening on the socket */
Marcel Holtmann48db9ca2007-05-05 00:36:06 +02002051 err = kernel_listen(sock, 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 if (err) {
2053 BT_ERR("Listen failed %d", err);
2054 goto failed;
2055 }
2056
2057 /* Add listening session */
2058 s = rfcomm_session_add(sock, BT_LISTEN);
Wei Yongjun0227c7b2013-03-20 20:23:37 +08002059 if (!s) {
2060 err = -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061 goto failed;
Wei Yongjun0227c7b2013-03-20 20:23:37 +08002062 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063
Linus Torvalds1da177e2005-04-16 15:20:36 -07002064 return 0;
2065failed:
2066 sock_release(sock);
2067 return err;
2068}
2069
2070static void rfcomm_kill_listener(void)
2071{
2072 struct rfcomm_session *s;
2073 struct list_head *p, *n;
2074
2075 BT_DBG("");
2076
2077 list_for_each_safe(p, n, &session_list) {
2078 s = list_entry(p, struct rfcomm_session, list);
2079 rfcomm_session_del(s);
2080 }
2081}
2082
2083static int rfcomm_run(void *unused)
2084{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085 BT_DBG("");
2086
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002087 set_user_nice(current, -10);
2088
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089 rfcomm_add_listener(BDADDR_ANY);
2090
Peter Hurleye5842cd2011-07-24 00:10:35 -04002091 while (1) {
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002092 set_current_state(TASK_INTERRUPTIBLE);
Peter Hurleye5842cd2011-07-24 00:10:35 -04002093
2094 if (kthread_should_stop())
2095 break;
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002096
2097 /* Process stuff */
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002098 rfcomm_process_sessions();
Peter Hurleye5842cd2011-07-24 00:10:35 -04002099
2100 schedule();
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002101 }
Peter Hurleye5842cd2011-07-24 00:10:35 -04002102 __set_current_state(TASK_RUNNING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002103
2104 rfcomm_kill_listener();
2105
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106 return 0;
2107}
2108
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002109static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110{
2111 struct rfcomm_session *s;
2112 struct rfcomm_dlc *d;
2113 struct list_head *p, *n;
2114
2115 BT_DBG("conn %p status 0x%02x encrypt 0x%02x", conn, status, encrypt);
2116
2117 s = rfcomm_session_get(&conn->hdev->bdaddr, &conn->dst);
2118 if (!s)
2119 return;
2120
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121 list_for_each_safe(p, n, &s->dlcs) {
2122 d = list_entry(p, struct rfcomm_dlc, list);
2123
Marcel Holtmann8c84b832009-01-16 08:17:51 +01002124 if (test_and_clear_bit(RFCOMM_SEC_PENDING, &d->flags)) {
2125 rfcomm_dlc_clear_timer(d);
2126 if (status || encrypt == 0x00) {
Szymon Jancdb544672011-09-26 14:19:47 +02002127 set_bit(RFCOMM_ENC_DROP, &d->flags);
Marcel Holtmann8c84b832009-01-16 08:17:51 +01002128 continue;
2129 }
2130 }
2131
2132 if (d->state == BT_CONNECTED && !status && encrypt == 0x00) {
2133 if (d->sec_level == BT_SECURITY_MEDIUM) {
2134 set_bit(RFCOMM_SEC_PENDING, &d->flags);
2135 rfcomm_dlc_set_timer(d, RFCOMM_AUTH_TIMEOUT);
2136 continue;
Marcel Holtmann2c068e02014-01-15 22:37:41 -08002137 } else if (d->sec_level == BT_SECURITY_HIGH ||
2138 d->sec_level == BT_SECURITY_FIPS) {
Szymon Jancdb544672011-09-26 14:19:47 +02002139 set_bit(RFCOMM_ENC_DROP, &d->flags);
Marcel Holtmann8c84b832009-01-16 08:17:51 +01002140 continue;
2141 }
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02002142 }
2143
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144 if (!test_and_clear_bit(RFCOMM_AUTH_PENDING, &d->flags))
2145 continue;
2146
Waldemar Rymarkiewiczb3b1b062011-05-06 09:42:31 +02002147 if (!status && hci_conn_check_secure(conn, d->sec_level))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148 set_bit(RFCOMM_AUTH_ACCEPT, &d->flags);
2149 else
2150 set_bit(RFCOMM_AUTH_REJECT, &d->flags);
2151 }
2152
Andrei Emeltchenko534c92f2010-10-01 12:05:11 +03002153 rfcomm_schedule();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154}
2155
2156static struct hci_cb rfcomm_cb = {
2157 .name = "RFCOMM",
Marcel Holtmann8c1b2352009-01-15 21:58:04 +01002158 .security_cfm = rfcomm_security_cfm
Linus Torvalds1da177e2005-04-16 15:20:36 -07002159};
2160
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002161static int rfcomm_dlc_debugfs_show(struct seq_file *f, void *x)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162{
2163 struct rfcomm_session *s;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164
2165 rfcomm_lock();
2166
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002167 list_for_each_entry(s, &session_list, list) {
Marcel Holtmann24bc10c2013-10-13 09:49:54 -07002168 struct l2cap_chan *chan = l2cap_pi(s->sock->sk)->chan;
Luiz Augusto von Dentz8035ded2011-11-01 10:58:56 +02002169 struct rfcomm_dlc *d;
2170 list_for_each_entry(d, &s->dlcs, list) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03002171 seq_printf(f, "%pMR %pMR %ld %d %d %d %d\n",
Marcel Holtmann24bc10c2013-10-13 09:49:54 -07002172 &chan->src, &chan->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03002173 d->state, d->dlci, d->mtu,
2174 d->rx_credits, d->tx_credits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175 }
2176 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178 rfcomm_unlock();
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002179
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002180 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181}
2182
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002183static int rfcomm_dlc_debugfs_open(struct inode *inode, struct file *file)
2184{
2185 return single_open(file, rfcomm_dlc_debugfs_show, inode->i_private);
2186}
2187
2188static const struct file_operations rfcomm_dlc_debugfs_fops = {
2189 .open = rfcomm_dlc_debugfs_open,
2190 .read = seq_read,
2191 .llseek = seq_lseek,
2192 .release = single_release,
2193};
2194
2195static struct dentry *rfcomm_dlc_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002196
2197/* ---- Initialization ---- */
2198static int __init rfcomm_init(void)
2199{
Marcel Holtmann52d18342009-08-22 14:49:36 -07002200 int err;
Dave Youngaf0d3b12009-08-03 04:26:16 +00002201
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202 hci_register_cb(&rfcomm_cb);
2203
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002204 rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd");
2205 if (IS_ERR(rfcomm_thread)) {
Marcel Holtmann52d18342009-08-22 14:49:36 -07002206 err = PTR_ERR(rfcomm_thread);
2207 goto unregister;
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002208 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209
Marcel Holtmann52d18342009-08-22 14:49:36 -07002210 err = rfcomm_init_ttys();
2211 if (err < 0)
2212 goto stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002213
Marcel Holtmann52d18342009-08-22 14:49:36 -07002214 err = rfcomm_init_sockets();
2215 if (err < 0)
2216 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002217
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002218 BT_INFO("RFCOMM ver %s", VERSION);
2219
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07002220 if (IS_ERR_OR_NULL(bt_debugfs))
2221 return 0;
2222
2223 rfcomm_dlc_debugfs = debugfs_create_file("rfcomm_dlc", 0444,
2224 bt_debugfs, NULL,
2225 &rfcomm_dlc_debugfs_fops);
2226
Linus Torvalds1da177e2005-04-16 15:20:36 -07002227 return 0;
Dave Youngaf0d3b12009-08-03 04:26:16 +00002228
Marcel Holtmann52d18342009-08-22 14:49:36 -07002229cleanup:
Dave Youngaf0d3b12009-08-03 04:26:16 +00002230 rfcomm_cleanup_ttys();
Marcel Holtmann52d18342009-08-22 14:49:36 -07002231
2232stop:
Dave Youngaf0d3b12009-08-03 04:26:16 +00002233 kthread_stop(rfcomm_thread);
Marcel Holtmann52d18342009-08-22 14:49:36 -07002234
2235unregister:
Dave Youngaf0d3b12009-08-03 04:26:16 +00002236 hci_unregister_cb(&rfcomm_cb);
2237
Marcel Holtmann52d18342009-08-22 14:49:36 -07002238 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239}
2240
2241static void __exit rfcomm_exit(void)
2242{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01002243 debugfs_remove(rfcomm_dlc_debugfs);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08002244
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 hci_unregister_cb(&rfcomm_cb);
2246
Marcel Holtmanna524ecc2007-10-20 21:37:20 +02002247 kthread_stop(rfcomm_thread);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249 rfcomm_cleanup_ttys();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250
2251 rfcomm_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002252}
2253
2254module_init(rfcomm_init);
2255module_exit(rfcomm_exit);
2256
Marcel Holtmann7c2660b2006-07-03 10:02:51 +02002257module_param(disable_cfc, bool, 0644);
2258MODULE_PARM_DESC(disable_cfc, "Disable credit based flow control");
2259
Marcel Holtmann98bcd082006-07-14 11:42:12 +02002260module_param(channel_mtu, int, 0644);
2261MODULE_PARM_DESC(channel_mtu, "Default MTU for the RFCOMM channel");
2262
Marcel Holtmann56f3a402006-02-13 11:39:57 +01002263module_param(l2cap_mtu, uint, 0644);
2264MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection");
2265
Marcel Holtmanneae38ee2009-10-05 12:23:48 +02002266module_param(l2cap_ertm, bool, 0644);
2267MODULE_PARM_DESC(l2cap_ertm, "Use L2CAP ERTM mode for connection");
2268
Marcel Holtmann63fbd242008-08-18 13:23:53 +02002269MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270MODULE_DESCRIPTION("Bluetooth RFCOMM ver " VERSION);
2271MODULE_VERSION(VERSION);
2272MODULE_LICENSE("GPL");
2273MODULE_ALIAS("bt-proto-3");