blob: 404998efa7e2000c1b895789d87fe2550ebf8bba [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
Gustavo F. Padovance5706b2010-07-13 11:57:11 -03004 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
Gustavo F. Padovan5d8868f2010-07-16 16:18:39 -03005 Copyright (C) 2010 Google Inc.
Gustavo F. Padovan590051d2011-12-18 13:39:33 -02006 Copyright (C) 2011 ProFUSION Embedded Systems
Mat Martineau422e9252012-04-27 16:50:55 -07007 Copyright (c) 2012 Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License version 2 as
13 published by the Free Software Foundation;
14
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
18 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090019 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090024 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
25 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 SOFTWARE IS DISCLAIMED.
27*/
28
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -020029/* Bluetooth L2CAP core. */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/module.h>
32
Marcel Holtmannaef7d972010-03-21 05:27:45 +010033#include <linux/debugfs.h>
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -030034#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include <net/bluetooth/bluetooth.h>
37#include <net/bluetooth/hci_core.h>
38#include <net/bluetooth/l2cap.h>
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070039
Marcel Holtmannac4b7232013-10-10 14:54:16 -070040#include "smp.h"
Marcel Holtmann70247282013-10-10 14:54:15 -070041#include "a2mp.h"
Marcel Holtmann7ef9fbf2013-10-10 14:54:14 -070042#include "amp.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Johan Hedberg0f1bfe42014-01-27 15:11:35 -080044#define LE_FLOWCTL_MAX_CREDITS 65535
45
Mat Martineaud1de6d42012-05-17 20:53:55 -070046bool disable_ertm;
Marcel Holtmannf0709e02007-10-20 13:38:51 +020047
Marcel Holtmann547d1032013-10-12 08:18:19 -070048static u32 l2cap_feat_mask = L2CAP_FEAT_FIXED_CHAN | L2CAP_FEAT_UCD;
Marcel Holtmanna6801ca2014-07-11 06:03:08 +020049static u8 l2cap_fixed_chan[8] = { L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS, };
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Johannes Bergb5ad8b72011-06-01 08:54:45 +020051static LIST_HEAD(chan_list);
52static DEFINE_RWLOCK(chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Johan Hedbergf15b8ec2013-12-03 15:08:25 +020054static u16 le_max_credits = L2CAP_LE_MAX_CREDITS;
55static u16 le_default_mps = L2CAP_LE_DEFAULT_MPS;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +010058 u8 code, u8 ident, u16 dlen, void *data);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -030059static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
Gustavo Padovan2d792812012-10-06 10:07:01 +010060 void *data);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -030061static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +020062static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
Gustavo Padovand6603662012-05-21 13:58:22 -030064static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
Gustavo Padovan2d792812012-10-06 10:07:01 +010065 struct sk_buff_head *skbs, u8 event);
Mat Martineau608bcc62012-05-17 20:53:32 -070066
Marcel Holtmann4f1654e2013-10-13 08:50:41 -070067static inline __u8 bdaddr_type(struct hci_conn *hcon, __u8 type)
68{
69 if (hcon->type == LE_LINK) {
70 if (type == ADDR_LE_DEV_PUBLIC)
71 return BDADDR_LE_PUBLIC;
72 else
73 return BDADDR_LE_RANDOM;
74 }
75
76 return BDADDR_BREDR;
77}
78
Marcel Holtmann01394182006-07-03 10:02:46 +020079/* ---- L2CAP channels ---- */
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -030080
Gustavo Padovan2d792812012-10-06 10:07:01 +010081static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
82 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020083{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020084 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030085
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020086 list_for_each_entry(c, &conn->chan_l, list) {
87 if (c->dcid == cid)
88 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +020089 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020090 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +020091}
92
Gustavo Padovan2d792812012-10-06 10:07:01 +010093static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn,
94 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +020095{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020096 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -030097
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +020098 list_for_each_entry(c, &conn->chan_l, list) {
99 if (c->scid == cid)
100 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200101 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200102 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200103}
104
105/* Find channel with given SCID.
Mat Martineauef191ad2012-05-02 09:42:00 -0700106 * Returns locked channel. */
Gustavo Padovan2d792812012-10-06 10:07:01 +0100107static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn,
108 u16 cid)
Marcel Holtmann01394182006-07-03 10:02:46 +0200109{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300110 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300111
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200112 mutex_lock(&conn->chan_lock);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300113 c = __l2cap_get_chan_by_scid(conn, cid);
Mat Martineauef191ad2012-05-02 09:42:00 -0700114 if (c)
115 l2cap_chan_lock(c);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200116 mutex_unlock(&conn->chan_lock);
117
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300118 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200119}
120
Mat Martineaub1a130b2012-10-23 15:24:09 -0700121/* Find channel with given DCID.
122 * Returns locked channel.
123 */
124static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn,
125 u16 cid)
126{
127 struct l2cap_chan *c;
128
129 mutex_lock(&conn->chan_lock);
130 c = __l2cap_get_chan_by_dcid(conn, cid);
131 if (c)
132 l2cap_chan_lock(c);
133 mutex_unlock(&conn->chan_lock);
134
135 return c;
136}
137
Gustavo Padovan2d792812012-10-06 10:07:01 +0100138static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn,
139 u8 ident)
Marcel Holtmann01394182006-07-03 10:02:46 +0200140{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200141 struct l2cap_chan *c;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300142
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200143 list_for_each_entry(c, &conn->chan_l, list) {
144 if (c->ident == ident)
145 return c;
Marcel Holtmann01394182006-07-03 10:02:46 +0200146 }
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200147 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200148}
149
Mat Martineau5b155ef2012-10-23 15:24:14 -0700150static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn,
151 u8 ident)
152{
153 struct l2cap_chan *c;
154
155 mutex_lock(&conn->chan_lock);
156 c = __l2cap_get_chan_by_ident(conn, ident);
157 if (c)
158 l2cap_chan_lock(c);
159 mutex_unlock(&conn->chan_lock);
160
161 return c;
162}
163
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300164static struct l2cap_chan *__l2cap_global_chan_by_addr(__le16 psm, bdaddr_t *src)
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300165{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300166 struct l2cap_chan *c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300167
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300168 list_for_each_entry(c, &chan_list, global_l) {
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700169 if (c->sport == psm && !bacmp(&c->src, src))
Szymon Janc250938c2011-11-16 09:32:22 +0100170 return c;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300171 }
Szymon Janc250938c2011-11-16 09:32:22 +0100172 return NULL;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300173}
174
175int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm)
176{
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300177 int err;
178
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200179 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300180
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300181 if (psm && __l2cap_global_chan_by_addr(psm, src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300182 err = -EADDRINUSE;
183 goto done;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300184 }
185
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300186 if (psm) {
187 chan->psm = psm;
188 chan->sport = psm;
189 err = 0;
190 } else {
191 u16 p;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300192
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300193 err = -EINVAL;
194 for (p = 0x1001; p < 0x1100; p += 2)
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300195 if (!__l2cap_global_chan_by_addr(cpu_to_le16(p), src)) {
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300196 chan->psm = cpu_to_le16(p);
197 chan->sport = cpu_to_le16(p);
198 err = 0;
199 break;
200 }
201 }
202
203done:
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200204 write_unlock(&chan_list_lock);
Gustavo F. Padovan73b2ec12011-04-18 19:36:44 -0300205 return err;
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300206}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300207EXPORT_SYMBOL_GPL(l2cap_add_psm);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300208
209int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid)
210{
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200211 write_lock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300212
Johan Hedberg14824302014-08-07 22:56:50 +0300213 /* Override the defaults (which are for conn-oriented) */
214 chan->omtu = L2CAP_DEFAULT_MTU;
215 chan->chan_type = L2CAP_CHAN_FIXED;
216
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300217 chan->scid = scid;
218
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200219 write_unlock(&chan_list_lock);
Gustavo F. Padovan9e4425f2011-04-18 18:38:43 -0300220
221 return 0;
222}
223
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300224static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
Marcel Holtmann01394182006-07-03 10:02:46 +0200225{
Johan Hedberge77af752013-10-08 10:31:00 +0200226 u16 cid, dyn_end;
Marcel Holtmann01394182006-07-03 10:02:46 +0200227
Johan Hedberge77af752013-10-08 10:31:00 +0200228 if (conn->hcon->type == LE_LINK)
229 dyn_end = L2CAP_CID_LE_DYN_END;
230 else
231 dyn_end = L2CAP_CID_DYN_END;
232
233 for (cid = L2CAP_CID_DYN_START; cid < dyn_end; cid++) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300234 if (!__l2cap_get_chan_by_scid(conn, cid))
Marcel Holtmann01394182006-07-03 10:02:46 +0200235 return cid;
236 }
237
238 return 0;
239}
240
Gustavo Padovanf93fa272013-10-21 14:21:40 -0200241static void l2cap_state_change(struct l2cap_chan *chan, int state)
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300242{
Andrei Emeltchenko42d2d872012-02-17 11:40:57 +0200243 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
Gustavo Padovan2d792812012-10-06 10:07:01 +0100244 state_to_string(state));
Gustavo F. Padovanbadaaa02011-11-23 20:11:46 -0200245
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300246 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300247 chan->ops->state_change(chan, state, 0);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300248}
249
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300250static inline void l2cap_state_change_and_error(struct l2cap_chan *chan,
251 int state, int err)
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200252{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300253 chan->state = state;
Gustavo Padovan53f52122013-10-15 19:24:45 -0300254 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200255}
256
257static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err)
258{
Gustavo Padovanf8e73012013-10-15 19:24:46 -0300259 chan->ops->state_change(chan, chan->state, err);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +0200260}
261
Mat Martineau4239d162012-05-17 20:53:49 -0700262static void __set_retrans_timer(struct l2cap_chan *chan)
263{
264 if (!delayed_work_pending(&chan->monitor_timer) &&
265 chan->retrans_timeout) {
266 l2cap_set_timer(chan, &chan->retrans_timer,
267 msecs_to_jiffies(chan->retrans_timeout));
268 }
269}
270
271static void __set_monitor_timer(struct l2cap_chan *chan)
272{
273 __clear_retrans_timer(chan);
274 if (chan->monitor_timeout) {
275 l2cap_set_timer(chan, &chan->monitor_timer,
276 msecs_to_jiffies(chan->monitor_timeout));
277 }
278}
279
Mat Martineau608bcc62012-05-17 20:53:32 -0700280static struct sk_buff *l2cap_ertm_seq_in_queue(struct sk_buff_head *head,
281 u16 seq)
282{
283 struct sk_buff *skb;
284
285 skb_queue_walk(head, skb) {
286 if (bt_cb(skb)->control.txseq == seq)
287 return skb;
288 }
289
290 return NULL;
291}
292
Mat Martineau3c588192012-04-11 10:48:42 -0700293/* ---- L2CAP sequence number lists ---- */
294
295/* For ERTM, ordered lists of sequence numbers must be tracked for
296 * SREJ requests that are received and for frames that are to be
297 * retransmitted. These seq_list functions implement a singly-linked
298 * list in an array, where membership in the list can also be checked
299 * in constant time. Items can also be added to the tail of the list
300 * and removed from the head in constant time, without further memory
301 * allocs or frees.
302 */
303
304static int l2cap_seq_list_init(struct l2cap_seq_list *seq_list, u16 size)
305{
306 size_t alloc_size, i;
307
308 /* Allocated size is a power of 2 to map sequence numbers
309 * (which may be up to 14 bits) in to a smaller array that is
310 * sized for the negotiated ERTM transmit windows.
311 */
312 alloc_size = roundup_pow_of_two(size);
313
314 seq_list->list = kmalloc(sizeof(u16) * alloc_size, GFP_KERNEL);
315 if (!seq_list->list)
316 return -ENOMEM;
317
318 seq_list->mask = alloc_size - 1;
319 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
320 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
321 for (i = 0; i < alloc_size; i++)
322 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
323
324 return 0;
325}
326
327static inline void l2cap_seq_list_free(struct l2cap_seq_list *seq_list)
328{
329 kfree(seq_list->list);
330}
331
332static inline bool l2cap_seq_list_contains(struct l2cap_seq_list *seq_list,
333 u16 seq)
334{
335 /* Constant-time check for list membership */
336 return seq_list->list[seq & seq_list->mask] != L2CAP_SEQ_LIST_CLEAR;
337}
338
Mat Martineau3c588192012-04-11 10:48:42 -0700339static inline u16 l2cap_seq_list_pop(struct l2cap_seq_list *seq_list)
340{
Johan Hedberg03a0c5d2014-01-18 21:32:59 +0200341 u16 seq = seq_list->head;
342 u16 mask = seq_list->mask;
343
344 seq_list->head = seq_list->list[seq & mask];
345 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_CLEAR;
346
347 if (seq_list->head == L2CAP_SEQ_LIST_TAIL) {
348 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
349 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
350 }
351
352 return seq;
Mat Martineau3c588192012-04-11 10:48:42 -0700353}
354
355static void l2cap_seq_list_clear(struct l2cap_seq_list *seq_list)
356{
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300357 u16 i;
Mat Martineau3c588192012-04-11 10:48:42 -0700358
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300359 if (seq_list->head == L2CAP_SEQ_LIST_CLEAR)
360 return;
361
362 for (i = 0; i <= seq_list->mask; i++)
363 seq_list->list[i] = L2CAP_SEQ_LIST_CLEAR;
364
365 seq_list->head = L2CAP_SEQ_LIST_CLEAR;
366 seq_list->tail = L2CAP_SEQ_LIST_CLEAR;
Mat Martineau3c588192012-04-11 10:48:42 -0700367}
368
369static void l2cap_seq_list_append(struct l2cap_seq_list *seq_list, u16 seq)
370{
371 u16 mask = seq_list->mask;
372
373 /* All appends happen in constant time */
374
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300375 if (seq_list->list[seq & mask] != L2CAP_SEQ_LIST_CLEAR)
376 return;
Mat Martineau3c588192012-04-11 10:48:42 -0700377
Gustavo Padovanf522ae32012-05-09 18:28:00 -0300378 if (seq_list->tail == L2CAP_SEQ_LIST_CLEAR)
379 seq_list->head = seq;
380 else
381 seq_list->list[seq_list->tail & mask] = seq;
382
383 seq_list->tail = seq;
384 seq_list->list[seq & mask] = L2CAP_SEQ_LIST_TAIL;
Mat Martineau3c588192012-04-11 10:48:42 -0700385}
386
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300387static void l2cap_chan_timeout(struct work_struct *work)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300388{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300389 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100390 chan_timer.work);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200391 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300392 int reason;
393
Andrei Emeltchenkoe05dcc32012-02-17 11:40:56 +0200394 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300395
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200396 mutex_lock(&conn->chan_lock);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200397 l2cap_chan_lock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300398
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300399 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300400 reason = ECONNREFUSED;
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300401 else if (chan->state == BT_CONNECT &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100402 chan->sec_level != BT_SECURITY_SDP)
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300403 reason = ECONNREFUSED;
404 else
405 reason = ETIMEDOUT;
406
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300407 l2cap_chan_close(chan, reason);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300408
Andrei Emeltchenko6be36552012-02-22 17:11:56 +0200409 l2cap_chan_unlock(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300410
Gustavo Padovan80b98022012-05-27 22:27:51 -0300411 chan->ops->close(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200412 mutex_unlock(&conn->chan_lock);
413
Ulisses Furquim371fd832011-12-21 20:02:36 -0200414 l2cap_chan_put(chan);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300415}
416
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300417struct l2cap_chan *l2cap_chan_create(void)
Marcel Holtmann01394182006-07-03 10:02:46 +0200418{
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300419 struct l2cap_chan *chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200420
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300421 chan = kzalloc(sizeof(*chan), GFP_ATOMIC);
422 if (!chan)
423 return NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200424
Andrei Emeltchenkoc03b3552012-02-21 12:54:56 +0200425 mutex_init(&chan->lock);
426
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200427 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300428 list_add(&chan->global_l, &chan_list);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200429 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300430
Gustavo F. Padovan721c4182011-06-23 19:29:58 -0300431 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout);
Gustavo F. Padovanab078012011-05-02 18:25:01 -0300432
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300433 chan->state = BT_OPEN;
434
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530435 kref_init(&chan->kref);
Gustavo F. Padovan71ba0e52011-05-17 14:34:52 -0300436
Mat Martineau28270112012-05-17 21:14:09 -0700437 /* This flag is cleared in l2cap_chan_ready() */
438 set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
439
Gustavo Padovaneef1d9b2012-03-25 13:59:16 -0300440 BT_DBG("chan %p", chan);
Szymon Jancabc545b2011-11-03 16:05:44 +0100441
Gustavo F. Padovan48454072011-03-25 00:22:30 -0300442 return chan;
Marcel Holtmann01394182006-07-03 10:02:46 +0200443}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300444EXPORT_SYMBOL_GPL(l2cap_chan_create);
Marcel Holtmann01394182006-07-03 10:02:46 +0200445
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530446static void l2cap_chan_destroy(struct kref *kref)
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300447{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530448 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref);
449
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530450 BT_DBG("chan %p", chan);
451
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200452 write_lock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300453 list_del(&chan->global_l);
Gustavo F. Padovan333055f2011-12-22 15:14:39 -0200454 write_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -0300455
Jaganath Kanakkassery4af66c62012-07-13 18:17:55 +0530456 kfree(chan);
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300457}
458
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530459void l2cap_chan_hold(struct l2cap_chan *c)
460{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530461 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530462
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530463 kref_get(&c->kref);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530464}
465
466void l2cap_chan_put(struct l2cap_chan *c)
467{
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530468 BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->kref.refcount));
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530469
Syam Sidhardhan144ad332012-07-27 23:51:21 +0530470 kref_put(&c->kref, l2cap_chan_destroy);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530471}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300472EXPORT_SYMBOL_GPL(l2cap_chan_put);
Jaganath Kanakkassery30648372012-07-13 18:17:54 +0530473
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300474void l2cap_chan_set_defaults(struct l2cap_chan *chan)
475{
476 chan->fcs = L2CAP_FCS_CRC16;
477 chan->max_tx = L2CAP_DEFAULT_MAX_TX;
478 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW;
479 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300480 chan->remote_max_tx = chan->max_tx;
481 chan->remote_tx_win = chan->tx_win;
Mat Martineauc20f8e32012-07-10 05:47:07 -0700482 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300483 chan->sec_level = BT_SECURITY_LOW;
Jukka Rissanen6a5e8162014-05-28 14:43:04 +0300484 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
485 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
486 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
487 chan->conf_state = 0;
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300488
489 set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
490}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300491EXPORT_SYMBOL_GPL(l2cap_chan_set_defaults);
Andrei Emeltchenkobd4b1652012-03-28 16:31:25 +0300492
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200493static void l2cap_le_flowctl_init(struct l2cap_chan *chan)
Johan Hedberg38319712013-05-17 12:49:23 +0300494{
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200495 chan->sdu = NULL;
496 chan->sdu_last_frag = NULL;
497 chan->sdu_len = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300498 chan->tx_credits = 0;
Johan Hedbergf15b8ec2013-12-03 15:08:25 +0200499 chan->rx_credits = le_max_credits;
Johan Hedbergd1d79412014-01-27 15:11:33 -0800500 chan->mps = min_t(u16, chan->imtu, le_default_mps);
Johan Hedberg0ce43ce2013-12-05 14:55:33 +0200501
502 skb_queue_head_init(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300503}
504
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +0300505void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Marcel Holtmann01394182006-07-03 10:02:46 +0200506{
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -0300507 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn,
Andrei Emeltchenko097db762012-03-09 14:16:17 +0200508 __le16_to_cpu(chan->psm), chan->dcid);
Marcel Holtmann01394182006-07-03 10:02:46 +0200509
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +0200510 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100511
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300512 chan->conn = conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200513
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200514 switch (chan->chan_type) {
515 case L2CAP_CHAN_CONN_ORIENTED:
Johan Hedberg21626e62014-01-24 10:35:41 +0200516 /* Alloc CID for connection-oriented socket */
517 chan->scid = l2cap_alloc_cid(conn);
518 if (conn->hcon->type == ACL_LINK)
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300519 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200520 break;
521
522 case L2CAP_CHAN_CONN_LESS:
Marcel Holtmann01394182006-07-03 10:02:46 +0200523 /* Connectionless socket */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300524 chan->scid = L2CAP_CID_CONN_LESS;
525 chan->dcid = L2CAP_CID_CONN_LESS;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300526 chan->omtu = L2CAP_DEFAULT_MTU;
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200527 break;
528
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200529 case L2CAP_CHAN_FIXED:
530 /* Caller will set CID and CID specific MTU values */
Andrei Emeltchenko416fa752012-05-29 13:59:16 +0300531 break;
532
Andrei Emeltchenko54911202012-02-06 15:04:00 +0200533 default:
Marcel Holtmann01394182006-07-03 10:02:46 +0200534 /* Raw socket can send/recv signalling messages only */
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -0300535 chan->scid = L2CAP_CID_SIGNALING;
536 chan->dcid = L2CAP_CID_SIGNALING;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -0300537 chan->omtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann01394182006-07-03 10:02:46 +0200538 }
539
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300540 chan->local_id = L2CAP_BESTEFFORT_ID;
541 chan->local_stype = L2CAP_SERV_BESTEFFORT;
542 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE;
543 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME;
544 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT;
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +0300545 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO;
Andrei Emeltchenko8f7975b2011-10-13 16:18:54 +0300546
Ulisses Furquim371fd832011-12-21 20:02:36 -0200547 l2cap_chan_hold(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300548
Johan Hedberg5ee98912013-04-29 19:35:43 +0300549 hci_conn_hold(conn->hcon);
550
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200551 list_add(&chan->list, &conn->chan_l);
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200552}
553
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300554void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
Andrei Emeltchenko643162a2012-02-22 17:11:55 +0200555{
556 mutex_lock(&conn->chan_lock);
557 __l2cap_chan_add(conn, chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200558 mutex_unlock(&conn->chan_lock);
Marcel Holtmann01394182006-07-03 10:02:46 +0200559}
560
Andrei Emeltchenko466f8002012-05-29 13:59:01 +0300561void l2cap_chan_del(struct l2cap_chan *chan, int err)
Marcel Holtmann01394182006-07-03 10:02:46 +0200562{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300563 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann01394182006-07-03 10:02:46 +0200564
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -0300565 __clear_chan_timer(chan);
Marcel Holtmann01394182006-07-03 10:02:46 +0200566
Gustavo F. Padovan49208c92011-04-04 15:59:54 -0300567 BT_DBG("chan %p, conn %p, err %d", chan, conn, err);
Marcel Holtmann01394182006-07-03 10:02:46 +0200568
Johan Hedberg72847ce2014-08-08 09:28:03 +0300569 chan->ops->teardown(chan, err);
570
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900571 if (conn) {
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300572 struct amp_mgr *mgr = conn->hcon->amp_mgr;
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300573 /* Delete from channel list */
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +0200574 list_del(&chan->list);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -0200575
Ulisses Furquim371fd832011-12-21 20:02:36 -0200576 l2cap_chan_put(chan);
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -0300577
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300578 chan->conn = NULL;
Andrei Emeltchenko3cabbfd2012-05-31 11:01:37 +0300579
Johan Hedberg2338a7e2014-01-24 10:35:40 +0200580 if (chan->scid != L2CAP_CID_A2MP)
David Herrmann76a68ba2013-04-06 20:28:37 +0200581 hci_conn_drop(conn->hcon);
Andrei Emeltchenko56f60982012-10-15 11:58:44 +0300582
583 if (mgr && mgr->bredr_chan == chan)
584 mgr->bredr_chan = NULL;
Marcel Holtmann01394182006-07-03 10:02:46 +0200585 }
586
Andrei Emeltchenko419e08c2012-10-31 15:46:34 +0200587 if (chan->hs_hchan) {
588 struct hci_chan *hs_hchan = chan->hs_hchan;
589
590 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan);
591 amp_disconnect_logical_link(hs_hchan);
592 }
593
Mat Martineau28270112012-05-17 21:14:09 -0700594 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state))
Gustavo F. Padovan6ff5abb2011-04-25 15:10:41 -0300595 return;
Gustavo F. Padovan2ead70b2011-04-01 15:13:36 -0300596
Gustavo Padovanee556f62012-05-18 20:22:38 -0300597 switch(chan->mode) {
598 case L2CAP_MODE_BASIC:
599 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300600
Johan Hedberg38319712013-05-17 12:49:23 +0300601 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +0300602 skb_queue_purge(&chan->tx_q);
Johan Hedberg38319712013-05-17 12:49:23 +0300603 break;
604
Gustavo Padovanee556f62012-05-18 20:22:38 -0300605 case L2CAP_MODE_ERTM:
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -0300606 __clear_retrans_timer(chan);
607 __clear_monitor_timer(chan);
608 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300609
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -0300610 skb_queue_purge(&chan->srej_q);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300611
Mat Martineau3c588192012-04-11 10:48:42 -0700612 l2cap_seq_list_free(&chan->srej_list);
613 l2cap_seq_list_free(&chan->retrans_list);
Gustavo Padovanee556f62012-05-18 20:22:38 -0300614
615 /* fall through */
616
617 case L2CAP_MODE_STREAMING:
618 skb_queue_purge(&chan->tx_q);
619 break;
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -0300620 }
Gustavo Padovanee556f62012-05-18 20:22:38 -0300621
622 return;
Marcel Holtmann01394182006-07-03 10:02:46 +0200623}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300624EXPORT_SYMBOL_GPL(l2cap_chan_del);
Marcel Holtmann01394182006-07-03 10:02:46 +0200625
Johan Hedberg387a33e2014-02-18 21:41:33 +0200626void l2cap_conn_update_id_addr(struct hci_conn *hcon)
627{
628 struct l2cap_conn *conn = hcon->l2cap_data;
629 struct l2cap_chan *chan;
630
631 mutex_lock(&conn->chan_lock);
632
633 list_for_each_entry(chan, &conn->chan_l, list) {
634 l2cap_chan_lock(chan);
635 bacpy(&chan->dst, &hcon->dst);
636 chan->dst_type = bdaddr_type(hcon, hcon->dst_type);
637 l2cap_chan_unlock(chan);
638 }
639
640 mutex_unlock(&conn->chan_lock);
641}
642
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300643static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
644{
645 struct l2cap_conn *conn = chan->conn;
646 struct l2cap_le_conn_rsp rsp;
647 u16 result;
648
649 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
650 result = L2CAP_CR_AUTHORIZATION;
651 else
652 result = L2CAP_CR_BAD_PSM;
653
654 l2cap_state_change(chan, BT_DISCONN);
655
656 rsp.dcid = cpu_to_le16(chan->scid);
657 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +0200658 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +0300659 rsp.credits = cpu_to_le16(chan->rx_credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300660 rsp.result = cpu_to_le16(result);
661
662 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
663 &rsp);
664}
665
Johan Hedberg791d60f2013-05-14 22:24:44 +0300666static void l2cap_chan_connect_reject(struct l2cap_chan *chan)
667{
668 struct l2cap_conn *conn = chan->conn;
669 struct l2cap_conn_rsp rsp;
670 u16 result;
671
672 if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
673 result = L2CAP_CR_SEC_BLOCK;
674 else
675 result = L2CAP_CR_BAD_PSM;
676
677 l2cap_state_change(chan, BT_DISCONN);
678
679 rsp.scid = cpu_to_le16(chan->dcid);
680 rsp.dcid = cpu_to_le16(chan->scid);
681 rsp.result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700682 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Johan Hedberg791d60f2013-05-14 22:24:44 +0300683
684 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp);
685}
686
Gustavo F. Padovan0f852722011-05-04 19:42:50 -0300687void l2cap_chan_close(struct l2cap_chan *chan, int reason)
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300688{
689 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300690
Marcel Holtmann7eafc592013-10-13 08:12:47 -0700691 BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300692
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -0300693 switch (chan->state) {
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300694 case BT_LISTEN:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100695 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300696 break;
697
698 case BT_CONNECTED:
699 case BT_CONFIG:
Johan Hedberg7b25c9b2014-01-28 15:28:04 -0800700 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan8d836d72013-10-15 19:24:47 -0300701 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +0200702 l2cap_send_disconn_req(chan, reason);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300703 } else
704 l2cap_chan_del(chan, reason);
705 break;
706
707 case BT_CONNECT2:
Johan Hedberg791d60f2013-05-14 22:24:44 +0300708 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) {
709 if (conn->hcon->type == ACL_LINK)
710 l2cap_chan_connect_reject(chan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +0300711 else if (conn->hcon->type == LE_LINK)
712 l2cap_chan_le_connect_reject(chan);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300713 }
714
715 l2cap_chan_del(chan, reason);
716 break;
717
718 case BT_CONNECT:
719 case BT_DISCONN:
720 l2cap_chan_del(chan, reason);
721 break;
722
723 default:
Gustavo Padovanb699ec02012-10-06 11:51:54 +0100724 chan->ops->teardown(chan, 0);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300725 break;
726 }
727}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +0300728EXPORT_SYMBOL(l2cap_chan_close);
Gustavo F. Padovan4519de92011-04-28 17:55:53 -0300729
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300730static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan)
Johan Hedberg8556edd32011-01-19 12:06:50 +0530731{
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700732 switch (chan->chan_type) {
733 case L2CAP_CHAN_RAW:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300734 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530735 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800736 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530737 return HCI_AT_DEDICATED_BONDING_MITM;
738 case BT_SECURITY_MEDIUM:
739 return HCI_AT_DEDICATED_BONDING;
740 default:
741 return HCI_AT_NO_BONDING;
742 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700743 break;
Marcel Holtmann3124b842013-10-12 07:19:32 -0700744 case L2CAP_CHAN_CONN_LESS:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700745 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) {
Marcel Holtmann3124b842013-10-12 07:19:32 -0700746 if (chan->sec_level == BT_SECURITY_LOW)
747 chan->sec_level = BT_SECURITY_SDP;
748 }
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800749 if (chan->sec_level == BT_SECURITY_HIGH ||
750 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann3124b842013-10-12 07:19:32 -0700751 return HCI_AT_NO_BONDING_MITM;
752 else
753 return HCI_AT_NO_BONDING;
754 break;
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700755 case L2CAP_CHAN_CONN_ORIENTED:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700756 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) {
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700757 if (chan->sec_level == BT_SECURITY_LOW)
758 chan->sec_level = BT_SECURITY_SDP;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530759
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800760 if (chan->sec_level == BT_SECURITY_HIGH ||
761 chan->sec_level == BT_SECURITY_FIPS)
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700762 return HCI_AT_NO_BONDING_MITM;
763 else
764 return HCI_AT_NO_BONDING;
765 }
766 /* fall through */
767 default:
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300768 switch (chan->sec_level) {
Johan Hedberg8556edd32011-01-19 12:06:50 +0530769 case BT_SECURITY_HIGH:
Marcel Holtmann7d513e92014-01-15 22:37:40 -0800770 case BT_SECURITY_FIPS:
Johan Hedberg8556edd32011-01-19 12:06:50 +0530771 return HCI_AT_GENERAL_BONDING_MITM;
772 case BT_SECURITY_MEDIUM:
773 return HCI_AT_GENERAL_BONDING;
774 default:
775 return HCI_AT_NO_BONDING;
776 }
Marcel Holtmann6a974b52013-10-12 07:19:31 -0700777 break;
Johan Hedberg8556edd32011-01-19 12:06:50 +0530778 }
779}
780
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200781/* Service level security */
Johan Hedberge7cafc42014-07-17 15:35:38 +0300782int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator)
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200783{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -0300784 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100785 __u8 auth_type;
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200786
Johan Hedberga17de2f2013-05-14 13:25:37 +0300787 if (conn->hcon->type == LE_LINK)
788 return smp_conn_security(conn->hcon, chan->sec_level);
789
Gustavo F. Padovan43434782011-04-12 18:31:57 -0300790 auth_type = l2cap_get_auth_type(chan);
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100791
Johan Hedberge7cafc42014-07-17 15:35:38 +0300792 return hci_conn_security(conn->hcon, chan->sec_level, auth_type,
793 initiator);
Marcel Holtmann79d554a2008-07-14 20:13:44 +0200794}
795
Johannes Bergb5ad8b72011-06-01 08:54:45 +0200796static u8 l2cap_get_ident(struct l2cap_conn *conn)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200797{
798 u8 id;
799
800 /* Get next available identificator.
801 * 1 - 128 are used by kernel.
802 * 129 - 199 are reserved.
803 * 200 - 254 are used by utilities like l2ping, etc.
804 */
805
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200806 mutex_lock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200807
808 if (++conn->tx_ident > 128)
809 conn->tx_ident = 1;
810
811 id = conn->tx_ident;
812
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +0200813 mutex_unlock(&conn->ident_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200814
815 return id;
816}
817
Gustavo Padovan2d792812012-10-06 10:07:01 +0100818static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
819 void *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200820{
821 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data);
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200822 u8 flags;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200823
824 BT_DBG("code 0x%2.2x", code);
825
826 if (!skb)
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -0300827 return;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200828
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +0200829 if (lmp_no_flush_capable(conn->hcon->hdev))
830 flags = ACL_START_NO_FLUSH;
831 else
832 flags = ACL_START;
833
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700834 bt_cb(skb)->force_active = BT_POWER_FORCE_ACTIVE_ON;
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +0200835 skb->priority = HCI_PRIO_MAX;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700836
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200837 hci_send_acl(conn->hchan, skb, flags);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +0200838}
839
Mat Martineau02b0fbb2012-10-23 15:24:10 -0700840static bool __chan_is_moving(struct l2cap_chan *chan)
841{
842 return chan->move_state != L2CAP_MOVE_STABLE &&
843 chan->move_state != L2CAP_MOVE_WAIT_PREPARE;
844}
845
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200846static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
847{
848 struct hci_conn *hcon = chan->conn->hcon;
849 u16 flags;
850
851 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
Gustavo Padovan2d792812012-10-06 10:07:01 +0100852 skb->priority);
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200853
Mat Martineaud5f8a752012-10-23 15:24:18 -0700854 if (chan->hs_hcon && !__chan_is_moving(chan)) {
855 if (chan->hs_hchan)
856 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE);
857 else
858 kfree_skb(skb);
859
860 return;
861 }
862
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200863 if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +0100864 lmp_no_flush_capable(hcon->hdev))
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200865 flags = ACL_START_NO_FLUSH;
866 else
867 flags = ACL_START;
868
869 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags);
870 hci_send_acl(chan->conn->hchan, skb, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871}
872
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700873static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control)
874{
875 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
876 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
877
878 if (enh & L2CAP_CTRL_FRAME_TYPE) {
879 /* S-Frame */
880 control->sframe = 1;
881 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
882 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
883
884 control->sar = 0;
885 control->txseq = 0;
886 } else {
887 /* I-Frame */
888 control->sframe = 0;
889 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
890 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
891
892 control->poll = 0;
893 control->super = 0;
894 }
895}
896
897static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control)
898{
899 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
900 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
901
902 if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
903 /* S-Frame */
904 control->sframe = 1;
905 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
906 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
907
908 control->sar = 0;
909 control->txseq = 0;
910 } else {
911 /* I-Frame */
912 control->sframe = 0;
913 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
914 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
915
916 control->poll = 0;
917 control->super = 0;
918 }
919}
920
921static inline void __unpack_control(struct l2cap_chan *chan,
922 struct sk_buff *skb)
923{
924 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
925 __unpack_extended_control(get_unaligned_le32(skb->data),
926 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700927 skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700928 } else {
929 __unpack_enhanced_control(get_unaligned_le16(skb->data),
930 &bt_cb(skb)->control);
Mat Martineaucec8ab6e2012-05-17 20:53:36 -0700931 skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
Mat Martineaub5c6aae2012-04-25 16:36:15 -0700932 }
933}
934
935static u32 __pack_extended_control(struct l2cap_ctrl *control)
936{
937 u32 packed;
938
939 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
940 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
941
942 if (control->sframe) {
943 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
944 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
945 packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
946 } else {
947 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
948 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
949 }
950
951 return packed;
952}
953
954static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
955{
956 u16 packed;
957
958 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
959 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
960
961 if (control->sframe) {
962 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
963 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
964 packed |= L2CAP_CTRL_FRAME_TYPE;
965 } else {
966 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
967 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
968 }
969
970 return packed;
971}
972
973static inline void __pack_control(struct l2cap_chan *chan,
974 struct l2cap_ctrl *control,
975 struct sk_buff *skb)
976{
977 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
978 put_unaligned_le32(__pack_extended_control(control),
979 skb->data + L2CAP_HDR_SIZE);
980 } else {
981 put_unaligned_le16(__pack_enhanced_control(control),
982 skb->data + L2CAP_HDR_SIZE);
983 }
984}
985
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300986static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan)
987{
988 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
989 return L2CAP_EXT_HDR_SIZE;
990 else
991 return L2CAP_ENH_HDR_SIZE;
992}
993
Mat Martineaua67d7f62012-05-17 20:53:35 -0700994static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan,
995 u32 control)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300996{
997 struct sk_buff *skb;
998 struct l2cap_hdr *lh;
Gustavo Padovanba7aa642012-05-29 13:29:16 -0300999 int hlen = __ertm_hdr_size(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001000
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001001 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001002 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001003
Mat Martineaua67d7f62012-05-17 20:53:35 -07001004 skb = bt_skb_alloc(hlen, GFP_KERNEL);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001005
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001006 if (!skb)
Mat Martineaua67d7f62012-05-17 20:53:35 -07001007 return ERR_PTR(-ENOMEM);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001008
1009 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001010 lh->len = cpu_to_le16(hlen - L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001011 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03001012
Mat Martineaua67d7f62012-05-17 20:53:35 -07001013 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1014 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
1015 else
1016 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001017
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001018 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineaua67d7f62012-05-17 20:53:35 -07001019 u16 fcs = crc16(0, (u8 *)skb->data, skb->len);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03001020 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001021 }
1022
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001023 skb->priority = HCI_PRIO_MAX;
Mat Martineaua67d7f62012-05-17 20:53:35 -07001024 return skb;
1025}
1026
1027static void l2cap_send_sframe(struct l2cap_chan *chan,
1028 struct l2cap_ctrl *control)
1029{
1030 struct sk_buff *skb;
1031 u32 control_field;
1032
1033 BT_DBG("chan %p, control %p", chan, control);
1034
1035 if (!control->sframe)
1036 return;
1037
Mat Martineaub99e13a2012-10-23 15:24:19 -07001038 if (__chan_is_moving(chan))
1039 return;
1040
Mat Martineaua67d7f62012-05-17 20:53:35 -07001041 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) &&
1042 !control->poll)
1043 control->final = 1;
1044
1045 if (control->super == L2CAP_SUPER_RR)
1046 clear_bit(CONN_RNR_SENT, &chan->conn_state);
1047 else if (control->super == L2CAP_SUPER_RNR)
1048 set_bit(CONN_RNR_SENT, &chan->conn_state);
1049
1050 if (control->super != L2CAP_SUPER_SREJ) {
1051 chan->last_acked_seq = control->reqseq;
1052 __clear_ack_timer(chan);
1053 }
1054
1055 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq,
1056 control->final, control->poll, control->super);
1057
1058 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
1059 control_field = __pack_extended_control(control);
1060 else
1061 control_field = __pack_enhanced_control(control);
1062
1063 skb = l2cap_create_sframe_pdu(chan, control_field);
1064 if (!IS_ERR(skb))
1065 l2cap_do_send(chan, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001066}
1067
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001068static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll)
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001069{
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001070 struct l2cap_ctrl control;
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001071
Mat Martineauc9e3d5e2012-05-17 20:53:48 -07001072 BT_DBG("chan %p, poll %d", chan, poll);
1073
1074 memset(&control, 0, sizeof(control));
1075 control.sframe = 1;
1076 control.poll = poll;
1077
1078 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
1079 control.super = L2CAP_SUPER_RNR;
1080 else
1081 control.super = L2CAP_SUPER_RR;
1082
1083 control.reqseq = chan->buffer_seq;
1084 l2cap_send_sframe(chan, &control);
Gustavo F. Padovan7e743092009-08-26 04:04:03 -03001085}
1086
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03001087static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001088{
Johan Hedberg5ff6f342014-08-07 22:56:43 +03001089 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
1090 return true;
1091
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001092 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
Andrei Emeltchenkoe501d052010-07-08 12:14:41 +03001093}
1094
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001095static bool __amp_capable(struct l2cap_chan *chan)
1096{
1097 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001098 struct hci_dev *hdev;
1099 bool amp_available = false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001100
Marcel Holtmann1df7b172013-10-05 11:47:49 -07001101 if (!conn->hs_enabled)
1102 return false;
1103
1104 if (!(conn->fixed_chan_mask & L2CAP_FC_A2MP))
1105 return false;
1106
1107 read_lock(&hci_dev_list_lock);
1108 list_for_each_entry(hdev, &hci_dev_list, list) {
1109 if (hdev->amp_type != AMP_TYPE_BREDR &&
1110 test_bit(HCI_UP, &hdev->flags)) {
1111 amp_available = true;
1112 break;
1113 }
1114 }
1115 read_unlock(&hci_dev_list_lock);
1116
1117 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED)
1118 return amp_available;
Marcel Holtmann848566b2013-10-01 22:59:22 -07001119
1120 return false;
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001121}
1122
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02001123static bool l2cap_check_efs(struct l2cap_chan *chan)
1124{
1125 /* Check EFS parameters */
1126 return true;
1127}
1128
Andrei Emeltchenko2766be42012-09-27 17:26:21 +03001129void l2cap_send_conn_req(struct l2cap_chan *chan)
Andrei Emeltchenko9b27f352012-02-24 16:00:00 +02001130{
1131 struct l2cap_conn *conn = chan->conn;
1132 struct l2cap_conn_req req;
1133
1134 req.scid = cpu_to_le16(chan->scid);
1135 req.psm = chan->psm;
1136
1137 chan->ident = l2cap_get_ident(conn);
1138
1139 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
1140
1141 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req);
1142}
1143
Mat Martineau8eb200b2012-10-23 15:24:17 -07001144static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id)
1145{
1146 struct l2cap_create_chan_req req;
1147 req.scid = cpu_to_le16(chan->scid);
1148 req.psm = chan->psm;
1149 req.amp_id = amp_id;
1150
1151 chan->ident = l2cap_get_ident(chan->conn);
1152
1153 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ,
1154 sizeof(req), &req);
1155}
1156
Mat Martineau02b0fbb2012-10-23 15:24:10 -07001157static void l2cap_move_setup(struct l2cap_chan *chan)
1158{
1159 struct sk_buff *skb;
1160
1161 BT_DBG("chan %p", chan);
1162
1163 if (chan->mode != L2CAP_MODE_ERTM)
1164 return;
1165
1166 __clear_retrans_timer(chan);
1167 __clear_monitor_timer(chan);
1168 __clear_ack_timer(chan);
1169
1170 chan->retry_count = 0;
1171 skb_queue_walk(&chan->tx_q, skb) {
1172 if (bt_cb(skb)->control.retries)
1173 bt_cb(skb)->control.retries = 1;
1174 else
1175 break;
1176 }
1177
1178 chan->expected_tx_seq = chan->buffer_seq;
1179
1180 clear_bit(CONN_REJ_ACT, &chan->conn_state);
1181 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
1182 l2cap_seq_list_clear(&chan->retrans_list);
1183 l2cap_seq_list_clear(&chan->srej_list);
1184 skb_queue_purge(&chan->srej_q);
1185
1186 chan->tx_state = L2CAP_TX_STATE_XMIT;
1187 chan->rx_state = L2CAP_RX_STATE_MOVE;
1188
1189 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
1190}
1191
Mat Martineau5f3847a2012-10-23 15:24:12 -07001192static void l2cap_move_done(struct l2cap_chan *chan)
1193{
1194 u8 move_role = chan->move_role;
1195 BT_DBG("chan %p", chan);
1196
1197 chan->move_state = L2CAP_MOVE_STABLE;
1198 chan->move_role = L2CAP_MOVE_ROLE_NONE;
1199
1200 if (chan->mode != L2CAP_MODE_ERTM)
1201 return;
1202
1203 switch (move_role) {
1204 case L2CAP_MOVE_ROLE_INITIATOR:
1205 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL);
1206 chan->rx_state = L2CAP_RX_STATE_WAIT_F;
1207 break;
1208 case L2CAP_MOVE_ROLE_RESPONDER:
1209 chan->rx_state = L2CAP_RX_STATE_WAIT_P;
1210 break;
1211 }
1212}
1213
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001214static void l2cap_chan_ready(struct l2cap_chan *chan)
1215{
Mat Martineau28270112012-05-17 21:14:09 -07001216 /* This clears all conf flags, including CONF_NOT_COMPLETE */
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001217 chan->conf_state = 0;
1218 __clear_chan_timer(chan);
1219
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02001220 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && !chan->tx_credits)
1221 chan->ops->suspend(chan);
Johan Hedberg177f8f22013-05-31 17:54:51 +03001222
Andrei Emeltchenko54a59aa2012-05-27 22:27:53 -03001223 chan->state = BT_CONNECTED;
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001224
Andrei Emeltchenkofd83e2c2012-05-30 09:55:32 +03001225 chan->ops->ready(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001226}
1227
Johan Hedbergf1496de2013-05-13 14:15:56 +03001228static void l2cap_le_connect(struct l2cap_chan *chan)
1229{
1230 struct l2cap_conn *conn = chan->conn;
1231 struct l2cap_le_conn_req req;
1232
Johan Hedberg595177f2013-12-02 22:12:22 +02001233 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
1234 return;
1235
Johan Hedbergf1496de2013-05-13 14:15:56 +03001236 req.psm = chan->psm;
1237 req.scid = cpu_to_le16(chan->scid);
1238 req.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02001239 req.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03001240 req.credits = cpu_to_le16(chan->rx_credits);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001241
1242 chan->ident = l2cap_get_ident(conn);
1243
1244 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ,
1245 sizeof(req), &req);
1246}
1247
1248static void l2cap_le_start(struct l2cap_chan *chan)
1249{
1250 struct l2cap_conn *conn = chan->conn;
1251
1252 if (!smp_conn_security(conn->hcon, chan->sec_level))
1253 return;
1254
1255 if (!chan->psm) {
1256 l2cap_chan_ready(chan);
1257 return;
1258 }
1259
1260 if (chan->state == BT_CONNECT)
1261 l2cap_le_connect(chan);
1262}
1263
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001264static void l2cap_start_connection(struct l2cap_chan *chan)
1265{
1266 if (__amp_capable(chan)) {
1267 BT_DBG("chan %p AMP capable: discover AMPs", chan);
1268 a2mp_discover_amp(chan);
Johan Hedbergf1496de2013-05-13 14:15:56 +03001269 } else if (chan->conn->hcon->type == LE_LINK) {
1270 l2cap_le_start(chan);
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001271 } else {
1272 l2cap_send_conn_req(chan);
1273 }
1274}
1275
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001276static void l2cap_do_start(struct l2cap_chan *chan)
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001277{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03001278 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001279
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001280 if (conn->hcon->type == LE_LINK) {
Johan Hedberg96ac34f2013-05-13 11:15:07 +03001281 l2cap_le_start(chan);
Vinicius Costa Gomes9f0caeb2012-04-20 15:46:08 -03001282 return;
1283 }
1284
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001285 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) {
Marcel Holtmann984947d2009-02-06 23:35:19 +01001286 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))
1287 return;
1288
Johan Hedberge7cafc42014-07-17 15:35:38 +03001289 if (l2cap_chan_check_security(chan, true) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01001290 __l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001291 l2cap_start_connection(chan);
1292 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001293 } else {
1294 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001295 req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001296
1297 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
1298 conn->info_ident = l2cap_get_ident(conn);
1299
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08001300 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001301
Gustavo Padovan2d792812012-10-06 10:07:01 +01001302 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
1303 sizeof(req), &req);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001304 }
1305}
1306
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001307static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
1308{
1309 u32 local_feat_mask = l2cap_feat_mask;
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03001310 if (!disable_ertm)
Gustavo F. Padovancf6c2c02010-06-07 20:54:45 -03001311 local_feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING;
1312
1313 switch (mode) {
1314 case L2CAP_MODE_ERTM:
1315 return L2CAP_FEAT_ERTM & feat_mask & local_feat_mask;
1316 case L2CAP_MODE_STREAMING:
1317 return L2CAP_FEAT_STREAMING & feat_mask & local_feat_mask;
1318 default:
1319 return 0x00;
1320 }
1321}
1322
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001323static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err)
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001324{
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001325 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001326 struct l2cap_disconn_req req;
1327
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001328 if (!conn)
1329 return;
1330
Andrei Emeltchenkoaad3d0e2012-09-06 15:05:42 +03001331 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) {
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001332 __clear_retrans_timer(chan);
1333 __clear_monitor_timer(chan);
1334 __clear_ack_timer(chan);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001335 }
1336
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001337 if (chan->scid == L2CAP_CID_A2MP) {
Gustavo Padovand1177732012-10-06 11:47:38 +01001338 l2cap_state_change(chan, BT_DISCONN);
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001339 return;
1340 }
1341
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001342 req.dcid = cpu_to_le16(chan->dcid);
1343 req.scid = cpu_to_le16(chan->scid);
Gustavo Padovan2d792812012-10-06 10:07:01 +01001344 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ,
1345 sizeof(req), &req);
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001346
Gustavo Padovanf8e73012013-10-15 19:24:46 -03001347 l2cap_state_change_and_error(chan, BT_DISCONN, err);
Gustavo F. Padovan22121fc2009-07-23 10:27:23 -03001348}
1349
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350/* ---- L2CAP connections ---- */
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001351static void l2cap_conn_start(struct l2cap_conn *conn)
1352{
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001353 struct l2cap_chan *chan, *tmp;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001354
1355 BT_DBG("conn %p", conn);
1356
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001357 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001358
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001359 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001360 l2cap_chan_lock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001361
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03001362 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001363 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001364 continue;
1365 }
1366
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001367 if (chan->state == BT_CONNECT) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03001368 if (!l2cap_chan_check_security(chan, true) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001369 !__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001370 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001371 continue;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02001372 }
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001373
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001374 if (!l2cap_mode_supported(chan->mode, conn->feat_mask)
Gustavo Padovan2d792812012-10-06 10:07:01 +01001375 && test_bit(CONF_STATE2_DEVICE,
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001376 &chan->conf_state)) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001377 l2cap_chan_close(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001378 l2cap_chan_unlock(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001379 continue;
1380 }
1381
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03001382 l2cap_start_connection(chan);
Gustavo F. Padovan47731de2010-07-09 16:38:35 -03001383
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001384 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001385 struct l2cap_conn_rsp rsp;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001386 char buf[128];
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03001387 rsp.scid = cpu_to_le16(chan->dcid);
1388 rsp.dcid = cpu_to_le16(chan->scid);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001389
Johan Hedberge7cafc42014-07-17 15:35:38 +03001390 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07001391 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001392 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1393 rsp.status = cpu_to_le16(L2CAP_CS_AUTHOR_PEND);
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08001394 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001395
1396 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02001397 l2cap_state_change(chan, BT_CONFIG);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001398 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
1399 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01001400 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001401 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07001402 rsp.result = cpu_to_le16(L2CAP_CR_PEND);
1403 rsp.status = cpu_to_le16(L2CAP_CS_AUTHEN_PEND);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001404 }
1405
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001406 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001407 sizeof(rsp), &rsp);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001408
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001409 if (test_bit(CONF_REQ_SENT, &chan->conf_state) ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01001410 rsp.result != L2CAP_CR_SUCCESS) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001411 l2cap_chan_unlock(chan);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001412 continue;
1413 }
1414
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03001415 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03001416 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001417 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03001418 chan->num_conf_req++;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001419 }
1420
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001421 l2cap_chan_unlock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001422 }
1423
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001424 mutex_unlock(&conn->chan_lock);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001425}
1426
Ville Tervob62f3282011-02-10 22:38:50 -03001427static void l2cap_le_conn_ready(struct l2cap_conn *conn)
1428{
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001429 struct hci_conn *hcon = conn->hcon;
Johan Hedbergdcc36c12014-07-09 12:59:13 +03001430 struct hci_dev *hdev = hcon->hdev;
Ville Tervob62f3282011-02-10 22:38:50 -03001431
Johan Hedberge760ec12014-08-07 22:56:47 +03001432 BT_DBG("%s conn %p", hdev->name, conn);
Ville Tervob62f3282011-02-10 22:38:50 -03001433
Johan Hedberge760ec12014-08-07 22:56:47 +03001434 /* For outgoing pairing which doesn't necessarily have an
1435 * associated socket (e.g. mgmt_pair_device).
1436 */
1437 if (hcon->out)
1438 smp_conn_security(hcon, hcon->pending_sec_level);
Marcel Holtmanncc8dba22013-10-18 03:43:01 -07001439
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001440 /* For LE slave connections, make sure the connection interval
1441 * is in the range of the minium and maximum interval that has
1442 * been configured for this connection. If not, then trigger
1443 * the connection update procedure.
1444 */
Johan Hedberg40bef302014-07-16 11:42:27 +03001445 if (hcon->role == HCI_ROLE_SLAVE &&
Marcel Holtmann80afeb62014-06-23 12:18:51 +02001446 (hcon->le_conn_interval < hcon->le_conn_min_interval ||
1447 hcon->le_conn_interval > hcon->le_conn_max_interval)) {
1448 struct l2cap_conn_param_update_req req;
1449
1450 req.min = cpu_to_le16(hcon->le_conn_min_interval);
1451 req.max = cpu_to_le16(hcon->le_conn_max_interval);
1452 req.latency = cpu_to_le16(hcon->le_conn_latency);
1453 req.to_multiplier = cpu_to_le16(hcon->le_supv_timeout);
1454
1455 l2cap_send_cmd(conn, l2cap_get_ident(conn),
1456 L2CAP_CONN_PARAM_UPDATE_REQ, sizeof(req), &req);
1457 }
Ville Tervob62f3282011-02-10 22:38:50 -03001458}
1459
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001460static void l2cap_conn_ready(struct l2cap_conn *conn)
1461{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001462 struct l2cap_chan *chan;
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001463 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001464
1465 BT_DBG("conn %p", conn);
1466
Johan Hedberge760ec12014-08-07 22:56:47 +03001467 mutex_lock(&conn->chan_lock);
1468
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001469 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03001470
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001471 l2cap_chan_lock(chan);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02001472
Johan Hedberg2338a7e2014-01-24 10:35:40 +02001473 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko416fa752012-05-29 13:59:16 +03001474 l2cap_chan_unlock(chan);
1475 continue;
1476 }
1477
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001478 if (hcon->type == LE_LINK) {
Johan Hedbergf1496de2013-05-13 14:15:56 +03001479 l2cap_le_start(chan);
Vinicius Costa Gomes63128452011-06-17 22:46:26 -03001480 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
Gustavo Padovan74e75742013-10-15 19:24:51 -03001481 l2cap_chan_ready(chan);
Anderson Brigliab501d6a2011-06-07 18:46:31 -03001482
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001483 } else if (chan->state == BT_CONNECT) {
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03001484 l2cap_do_start(chan);
Gustavo Padovan1c244f72012-12-07 03:29:10 -02001485 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001486
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001487 l2cap_chan_unlock(chan);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001488 }
1489
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001490 mutex_unlock(&conn->chan_lock);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001491
Johan Hedberg79a05722014-08-08 09:28:04 +03001492 if (hcon->type == LE_LINK)
1493 l2cap_le_conn_ready(conn);
1494
Johan Hedberg61a939c2014-01-17 20:45:11 +02001495 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001496}
1497
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001498/* Notify sockets that we cannot guaranty reliability anymore */
1499static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err)
1500{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03001501 struct l2cap_chan *chan;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001502
1503 BT_DBG("conn %p", conn);
1504
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001505 mutex_lock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001506
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001507 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenkoecf61bd2011-10-11 14:04:32 +03001508 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags))
Gustavo Padovan1d8b1fd2012-10-06 11:34:52 +01001509 l2cap_chan_set_err(chan, err);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001510 }
1511
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001512 mutex_unlock(&conn->chan_lock);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001513}
1514
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001515static void l2cap_info_timeout(struct work_struct *work)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001516{
Gustavo F. Padovanf878fca2011-12-15 01:16:14 -02001517 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001518 info_timer.work);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001519
Marcel Holtmann984947d2009-02-06 23:35:19 +01001520 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01001521 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01001522
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02001523 l2cap_conn_start(conn);
1524}
1525
David Herrmann2c8e1412013-04-06 20:28:45 +02001526/*
1527 * l2cap_user
1528 * External modules can register l2cap_user objects on l2cap_conn. The ->probe
1529 * callback is called during registration. The ->remove callback is called
1530 * during unregistration.
1531 * An l2cap_user object can either be explicitly unregistered or when the
1532 * underlying l2cap_conn object is deleted. This guarantees that l2cap->hcon,
1533 * l2cap->hchan, .. are valid as long as the remove callback hasn't been called.
1534 * External modules must own a reference to the l2cap_conn object if they intend
1535 * to call l2cap_unregister_user(). The l2cap_conn object might get destroyed at
1536 * any time if they don't.
1537 */
1538
1539int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
1540{
1541 struct hci_dev *hdev = conn->hcon->hdev;
1542 int ret;
1543
1544 /* We need to check whether l2cap_conn is registered. If it is not, we
1545 * must not register the l2cap_user. l2cap_conn_del() is unregisters
1546 * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1547 * relies on the parent hci_conn object to be locked. This itself relies
1548 * on the hci_dev object to be locked. So we must lock the hci device
1549 * here, too. */
1550
1551 hci_dev_lock(hdev);
1552
1553 if (user->list.next || user->list.prev) {
1554 ret = -EINVAL;
1555 goto out_unlock;
1556 }
1557
1558 /* conn->hchan is NULL after l2cap_conn_del() was called */
1559 if (!conn->hchan) {
1560 ret = -ENODEV;
1561 goto out_unlock;
1562 }
1563
1564 ret = user->probe(conn, user);
1565 if (ret)
1566 goto out_unlock;
1567
1568 list_add(&user->list, &conn->users);
1569 ret = 0;
1570
1571out_unlock:
1572 hci_dev_unlock(hdev);
1573 return ret;
1574}
1575EXPORT_SYMBOL(l2cap_register_user);
1576
1577void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
1578{
1579 struct hci_dev *hdev = conn->hcon->hdev;
1580
1581 hci_dev_lock(hdev);
1582
1583 if (!user->list.next || !user->list.prev)
1584 goto out_unlock;
1585
1586 list_del(&user->list);
1587 user->list.next = NULL;
1588 user->list.prev = NULL;
1589 user->remove(conn, user);
1590
1591out_unlock:
1592 hci_dev_unlock(hdev);
1593}
1594EXPORT_SYMBOL(l2cap_unregister_user);
1595
1596static void l2cap_unregister_all_users(struct l2cap_conn *conn)
1597{
1598 struct l2cap_user *user;
1599
1600 while (!list_empty(&conn->users)) {
1601 user = list_first_entry(&conn->users, struct l2cap_user, list);
1602 list_del(&user->list);
1603 user->list.next = NULL;
1604 user->list.prev = NULL;
1605 user->remove(conn, user);
1606 }
1607}
1608
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001609static void l2cap_conn_del(struct hci_conn *hcon, int err)
1610{
1611 struct l2cap_conn *conn = hcon->l2cap_data;
1612 struct l2cap_chan *chan, *l;
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001613
1614 if (!conn)
1615 return;
1616
1617 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
1618
1619 kfree_skb(conn->rx_skb);
1620
Johan Hedberg61a939c2014-01-17 20:45:11 +02001621 skb_queue_purge(&conn->pending_rx);
Jukka Taimisto7ab56c32014-06-12 10:15:13 +00001622
1623 /* We can not call flush_work(&conn->pending_rx_work) here since we
1624 * might block if we are running on a worker from the same workqueue
1625 * pending_rx_work is waiting on.
1626 */
1627 if (work_pending(&conn->pending_rx_work))
1628 cancel_work_sync(&conn->pending_rx_work);
Johan Hedberg61a939c2014-01-17 20:45:11 +02001629
Johan Hedbergdec5b492014-08-11 22:06:37 +03001630 if (work_pending(&conn->disconn_work))
1631 cancel_work_sync(&conn->disconn_work);
1632
David Herrmann2c8e1412013-04-06 20:28:45 +02001633 l2cap_unregister_all_users(conn);
1634
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001635 mutex_lock(&conn->chan_lock);
1636
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001637 /* Kill channels */
1638 list_for_each_entry_safe(chan, l, &conn->chan_l, list) {
Mat Martineau61d6ef32012-04-27 16:50:50 -07001639 l2cap_chan_hold(chan);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001640 l2cap_chan_lock(chan);
1641
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001642 l2cap_chan_del(chan, err);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001643
1644 l2cap_chan_unlock(chan);
1645
Gustavo Padovan80b98022012-05-27 22:27:51 -03001646 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07001647 l2cap_chan_put(chan);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001648 }
1649
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02001650 mutex_unlock(&conn->chan_lock);
1651
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +02001652 hci_chan_del(conn->hchan);
1653
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001654 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
Ulisses Furquim127074b2012-01-30 18:26:29 -02001655 cancel_delayed_work_sync(&conn->info_timer);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001656
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001657 hcon->l2cap_data = NULL;
David Herrmann9c903e32013-04-06 20:28:44 +02001658 conn->hchan = NULL;
1659 l2cap_conn_put(conn);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001660}
1661
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001662static void security_timeout(struct work_struct *work)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001663{
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -02001664 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01001665 security_timer.work);
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001666
Johan Hedbergd06cc412012-06-06 18:44:11 +08001667 BT_DBG("conn %p", conn);
1668
1669 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
1670 smp_chan_destroy(conn);
1671 l2cap_conn_del(conn->hcon, ETIMEDOUT);
1672 }
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -03001673}
1674
Johan Hedbergdec5b492014-08-11 22:06:37 +03001675static void disconn_work(struct work_struct *work)
1676{
1677 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
1678 disconn_work);
1679
1680 BT_DBG("conn %p", conn);
1681
1682 l2cap_conn_del(conn->hcon, conn->disconn_err);
1683}
1684
1685void l2cap_conn_shutdown(struct l2cap_conn *conn, int err)
1686{
1687 struct hci_dev *hdev = conn->hcon->hdev;
1688
1689 BT_DBG("conn %p err %d", conn, err);
1690
1691 conn->disconn_err = err;
1692 queue_work(hdev->workqueue, &conn->disconn_work);
1693}
1694
David Herrmann9c903e32013-04-06 20:28:44 +02001695static void l2cap_conn_free(struct kref *ref)
1696{
1697 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref);
1698
1699 hci_conn_put(conn->hcon);
1700 kfree(conn);
1701}
1702
1703void l2cap_conn_get(struct l2cap_conn *conn)
1704{
1705 kref_get(&conn->ref);
1706}
1707EXPORT_SYMBOL(l2cap_conn_get);
1708
1709void l2cap_conn_put(struct l2cap_conn *conn)
1710{
1711 kref_put(&conn->ref, l2cap_conn_free);
1712}
1713EXPORT_SYMBOL(l2cap_conn_put);
1714
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715/* ---- Socket interface ---- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001716
Ido Yarivc2287682012-04-20 15:46:07 -03001717/* Find socket with psm and source / destination bdaddr.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001718 * Returns closest match.
1719 */
Ido Yarivc2287682012-04-20 15:46:07 -03001720static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,
1721 bdaddr_t *src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001722 bdaddr_t *dst,
1723 u8 link_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001725 struct l2cap_chan *c, *c1 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001727 read_lock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001728
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001729 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001730 if (state && c->state != state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001731 continue;
1732
Johan Hedbergbf20fd42013-05-14 13:23:13 +03001733 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
1734 continue;
1735
1736 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
1737 continue;
1738
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001739 if (c->psm == psm) {
Ido Yarivc2287682012-04-20 15:46:07 -03001740 int src_match, dst_match;
1741 int src_any, dst_any;
1742
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 /* Exact match. */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001744 src_match = !bacmp(&c->src, src);
1745 dst_match = !bacmp(&c->dst, dst);
Ido Yarivc2287682012-04-20 15:46:07 -03001746 if (src_match && dst_match) {
Johan Hedberga24cce12014-08-07 22:56:42 +03001747 l2cap_chan_hold(c);
Johannes Berga7567b22011-06-01 08:29:54 +02001748 read_unlock(&chan_list_lock);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001749 return c;
1750 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751
1752 /* Closest match */
Marcel Holtmann7eafc592013-10-13 08:12:47 -07001753 src_any = !bacmp(&c->src, BDADDR_ANY);
1754 dst_any = !bacmp(&c->dst, BDADDR_ANY);
Ido Yarivc2287682012-04-20 15:46:07 -03001755 if ((src_match && dst_any) || (src_any && dst_match) ||
1756 (src_any && dst_any))
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001757 c1 = c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758 }
1759 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001760
Johan Hedberga24cce12014-08-07 22:56:42 +03001761 if (c1)
1762 l2cap_chan_hold(c1);
1763
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001764 read_unlock(&chan_list_lock);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00001765
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03001766 return c1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001767}
1768
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001769static void l2cap_monitor_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001770{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001771 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001772 monitor_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001773
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03001774 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001775
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001776 l2cap_chan_lock(chan);
1777
Mat Martineau80909e02012-05-17 20:53:50 -07001778 if (!chan->conn) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001779 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001780 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001781 return;
1782 }
1783
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001784 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001785
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001786 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001787 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001788}
1789
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001790static void l2cap_retrans_timeout(struct work_struct *work)
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001791{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03001792 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau4239d162012-05-17 20:53:49 -07001793 retrans_timer.work);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001794
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03001795 BT_DBG("chan %p", chan);
Gustavo F. Padovan0e989582010-04-19 14:45:38 -03001796
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001797 l2cap_chan_lock(chan);
1798
Mat Martineau80909e02012-05-17 20:53:50 -07001799 if (!chan->conn) {
1800 l2cap_chan_unlock(chan);
1801 l2cap_chan_put(chan);
1802 return;
1803 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001804
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03001805 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02001806 l2cap_chan_unlock(chan);
Andrei Emeltchenko8d7e1c72012-03-23 09:42:15 +02001807 l2cap_chan_put(chan);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001808}
1809
Gustavo Padovand6603662012-05-21 13:58:22 -03001810static void l2cap_streaming_send(struct l2cap_chan *chan,
1811 struct sk_buff_head *skbs)
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001812{
Gustavo F. Padovanccbb84a2010-08-30 18:44:44 -03001813 struct sk_buff *skb;
Mat Martineau37339372012-05-17 20:53:33 -07001814 struct l2cap_ctrl *control;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001815
Mat Martineau37339372012-05-17 20:53:33 -07001816 BT_DBG("chan %p, skbs %p", chan, skbs);
1817
Mat Martineaub99e13a2012-10-23 15:24:19 -07001818 if (__chan_is_moving(chan))
1819 return;
1820
Mat Martineau37339372012-05-17 20:53:33 -07001821 skb_queue_splice_tail_init(skbs, &chan->tx_q);
1822
1823 while (!skb_queue_empty(&chan->tx_q)) {
1824
1825 skb = skb_dequeue(&chan->tx_q);
1826
1827 bt_cb(skb)->control.retries = 1;
1828 control = &bt_cb(skb)->control;
1829
1830 control->reqseq = 0;
1831 control->txseq = chan->next_tx_seq;
1832
1833 __pack_control(chan, control, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001834
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001835 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau37339372012-05-17 20:53:33 -07001836 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1837 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001838 }
1839
Gustavo F. Padovan43434782011-04-12 18:31:57 -03001840 l2cap_do_send(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001841
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001842 BT_DBG("Sent txseq %u", control->txseq);
Mat Martineau37339372012-05-17 20:53:33 -07001843
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001844 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau37339372012-05-17 20:53:33 -07001845 chan->frames_sent++;
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001846 }
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03001847}
1848
Szymon Janc67c9e842011-07-28 16:24:33 +02001849static int l2cap_ertm_send(struct l2cap_chan *chan)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001850{
1851 struct sk_buff *skb, *tx_skb;
Mat Martineau18a48e72012-05-17 20:53:34 -07001852 struct l2cap_ctrl *control;
1853 int sent = 0;
1854
1855 BT_DBG("chan %p", chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001856
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03001857 if (chan->state != BT_CONNECTED)
Gustavo F. Padovanc13ffa62010-05-13 20:50:12 -03001858 return -ENOTCONN;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001859
Mat Martineau94122bb2012-05-02 09:42:02 -07001860 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1861 return 0;
1862
Mat Martineaub99e13a2012-10-23 15:24:19 -07001863 if (__chan_is_moving(chan))
1864 return 0;
1865
Mat Martineau18a48e72012-05-17 20:53:34 -07001866 while (chan->tx_send_head &&
1867 chan->unacked_frames < chan->remote_tx_win &&
1868 chan->tx_state == L2CAP_TX_STATE_XMIT) {
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001869
Mat Martineau18a48e72012-05-17 20:53:34 -07001870 skb = chan->tx_send_head;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001871
Mat Martineau18a48e72012-05-17 20:53:34 -07001872 bt_cb(skb)->control.retries = 1;
1873 control = &bt_cb(skb)->control;
Gustavo F. Padovan95ffa972010-06-18 20:37:33 -03001874
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001875 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
Mat Martineau18a48e72012-05-17 20:53:34 -07001876 control->final = 1;
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03001877
Mat Martineau18a48e72012-05-17 20:53:34 -07001878 control->reqseq = chan->buffer_seq;
1879 chan->last_acked_seq = chan->buffer_seq;
1880 control->txseq = chan->next_tx_seq;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001881
Mat Martineau18a48e72012-05-17 20:53:34 -07001882 __pack_control(chan, control, skb);
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03001883
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03001884 if (chan->fcs == L2CAP_FCS_CRC16) {
Mat Martineau18a48e72012-05-17 20:53:34 -07001885 u16 fcs = crc16(0, (u8 *) skb->data, skb->len);
1886 put_unaligned_le16(fcs, skb_put(skb, L2CAP_FCS_SIZE));
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03001887 }
1888
Mat Martineau18a48e72012-05-17 20:53:34 -07001889 /* Clone after data has been modified. Data is assumed to be
1890 read-only (for locking purposes) on cloned sk_buffs.
1891 */
1892 tx_skb = skb_clone(skb, GFP_KERNEL);
1893
1894 if (!tx_skb)
1895 break;
Gustavo F. Padovan9a9c6a32010-05-01 16:15:43 -03001896
Gustavo F. Padovan1a09bcb2011-05-17 15:13:19 -03001897 __set_retrans_timer(chan);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001898
Andrei Emeltchenko836be932011-10-17 12:19:57 +03001899 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq);
Mat Martineau18a48e72012-05-17 20:53:34 -07001900 chan->unacked_frames++;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03001901 chan->frames_sent++;
Mat Martineau18a48e72012-05-17 20:53:34 -07001902 sent++;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001903
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001904 if (skb_queue_is_last(&chan->tx_q, skb))
1905 chan->tx_send_head = NULL;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001906 else
Gustavo F. Padovan58d35f82011-04-04 16:16:44 -03001907 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb);
Mat Martineau18a48e72012-05-17 20:53:34 -07001908
1909 l2cap_do_send(chan, tx_skb);
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001910 BT_DBG("Sent txseq %u", control->txseq);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03001911 }
1912
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03001913 BT_DBG("Sent %d, %u unacked, %u in ERTM queue", sent,
1914 chan->unacked_frames, skb_queue_len(&chan->tx_q));
Mat Martineau18a48e72012-05-17 20:53:34 -07001915
1916 return sent;
Gustavo F. Padovan9e917af2010-05-01 16:15:37 -03001917}
1918
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001919static void l2cap_ertm_resend(struct l2cap_chan *chan)
1920{
1921 struct l2cap_ctrl control;
1922 struct sk_buff *skb;
1923 struct sk_buff *tx_skb;
1924 u16 seq;
1925
1926 BT_DBG("chan %p", chan);
1927
1928 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
1929 return;
1930
Mat Martineaub99e13a2012-10-23 15:24:19 -07001931 if (__chan_is_moving(chan))
1932 return;
1933
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001934 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) {
1935 seq = l2cap_seq_list_pop(&chan->retrans_list);
1936
1937 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq);
1938 if (!skb) {
1939 BT_DBG("Error: Can't retransmit seq %d, frame missing",
Gustavo Padovan2d792812012-10-06 10:07:01 +01001940 seq);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001941 continue;
1942 }
1943
1944 bt_cb(skb)->control.retries++;
1945 control = bt_cb(skb)->control;
1946
1947 if (chan->max_tx != 0 &&
1948 bt_cb(skb)->control.retries > chan->max_tx) {
1949 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02001950 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001951 l2cap_seq_list_clear(&chan->retrans_list);
1952 break;
1953 }
1954
1955 control.reqseq = chan->buffer_seq;
1956 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1957 control.final = 1;
1958 else
1959 control.final = 0;
1960
1961 if (skb_cloned(skb)) {
1962 /* Cloned sk_buffs are read-only, so we need a
1963 * writeable copy
1964 */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001965 tx_skb = skb_copy(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001966 } else {
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03001967 tx_skb = skb_clone(skb, GFP_KERNEL);
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07001968 }
1969
1970 if (!tx_skb) {
1971 l2cap_seq_list_clear(&chan->retrans_list);
1972 break;
1973 }
1974
1975 /* Update skb contents */
1976 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
1977 put_unaligned_le32(__pack_extended_control(&control),
1978 tx_skb->data + L2CAP_HDR_SIZE);
1979 } else {
1980 put_unaligned_le16(__pack_enhanced_control(&control),
1981 tx_skb->data + L2CAP_HDR_SIZE);
1982 }
1983
1984 if (chan->fcs == L2CAP_FCS_CRC16) {
1985 u16 fcs = crc16(0, (u8 *) tx_skb->data, tx_skb->len);
1986 put_unaligned_le16(fcs, skb_put(tx_skb,
1987 L2CAP_FCS_SIZE));
1988 }
1989
1990 l2cap_do_send(chan, tx_skb);
1991
1992 BT_DBG("Resent txseq %d", control.txseq);
1993
1994 chan->last_acked_seq = chan->buffer_seq;
1995 }
1996}
1997
Mat Martineauf80842a2012-05-17 20:53:46 -07001998static void l2cap_retransmit(struct l2cap_chan *chan,
1999 struct l2cap_ctrl *control)
2000{
2001 BT_DBG("chan %p, control %p", chan, control);
2002
2003 l2cap_seq_list_append(&chan->retrans_list, control->reqseq);
2004 l2cap_ertm_resend(chan);
2005}
2006
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002007static void l2cap_retransmit_all(struct l2cap_chan *chan,
2008 struct l2cap_ctrl *control)
2009{
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002010 struct sk_buff *skb;
2011
2012 BT_DBG("chan %p, control %p", chan, control);
2013
2014 if (control->poll)
2015 set_bit(CONN_SEND_FBIT, &chan->conn_state);
2016
2017 l2cap_seq_list_clear(&chan->retrans_list);
2018
2019 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state))
2020 return;
2021
2022 if (chan->unacked_frames) {
2023 skb_queue_walk(&chan->tx_q, skb) {
2024 if (bt_cb(skb)->control.txseq == control->reqseq ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01002025 skb == chan->tx_send_head)
Mat Martineaue1fbd4c2012-05-17 20:53:43 -07002026 break;
2027 }
2028
2029 skb_queue_walk_from(&chan->tx_q, skb) {
2030 if (skb == chan->tx_send_head)
2031 break;
2032
2033 l2cap_seq_list_append(&chan->retrans_list,
2034 bt_cb(skb)->control.txseq);
2035 }
2036
2037 l2cap_ertm_resend(chan);
2038 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002039}
2040
Szymon Jancb17e73b2012-01-11 10:59:47 +01002041static void l2cap_send_ack(struct l2cap_chan *chan)
2042{
Mat Martineau0a0aba42012-05-17 20:53:39 -07002043 struct l2cap_ctrl control;
2044 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
2045 chan->last_acked_seq);
2046 int threshold;
2047
2048 BT_DBG("chan %p last_acked_seq %d buffer_seq %d",
2049 chan, chan->last_acked_seq, chan->buffer_seq);
2050
2051 memset(&control, 0, sizeof(control));
2052 control.sframe = 1;
2053
2054 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
2055 chan->rx_state == L2CAP_RX_STATE_RECV) {
2056 __clear_ack_timer(chan);
2057 control.super = L2CAP_SUPER_RNR;
2058 control.reqseq = chan->buffer_seq;
2059 l2cap_send_sframe(chan, &control);
2060 } else {
2061 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) {
2062 l2cap_ertm_send(chan);
2063 /* If any i-frames were sent, they included an ack */
2064 if (chan->buffer_seq == chan->last_acked_seq)
2065 frames_to_ack = 0;
2066 }
2067
Mat Martineauc20f8e32012-07-10 05:47:07 -07002068 /* Ack now if the window is 3/4ths full.
Mat Martineau0a0aba42012-05-17 20:53:39 -07002069 * Calculate without mul or div
2070 */
Mat Martineauc20f8e32012-07-10 05:47:07 -07002071 threshold = chan->ack_win;
Mat Martineau0a0aba42012-05-17 20:53:39 -07002072 threshold += threshold << 1;
2073 threshold >>= 2;
2074
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002075 BT_DBG("frames_to_ack %u, threshold %d", frames_to_ack,
Mat Martineau0a0aba42012-05-17 20:53:39 -07002076 threshold);
2077
2078 if (frames_to_ack >= threshold) {
2079 __clear_ack_timer(chan);
2080 control.super = L2CAP_SUPER_RR;
2081 control.reqseq = chan->buffer_seq;
2082 l2cap_send_sframe(chan, &control);
2083 frames_to_ack = 0;
2084 }
2085
2086 if (frames_to_ack)
2087 __set_ack_timer(chan);
2088 }
Szymon Jancb17e73b2012-01-11 10:59:47 +01002089}
2090
Gustavo F. Padovan04124682012-03-08 01:25:00 -03002091static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
2092 struct msghdr *msg, int len,
2093 int count, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094{
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002095 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002096 struct sk_buff **frag;
Gustavo Padovan90338942012-04-06 20:15:47 -03002097 int sent = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098
Jukka Rissanen04988782014-06-18 16:37:07 +03002099 if (chan->ops->memcpy_fromiovec(chan, skb_put(skb, count),
2100 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002101 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102
2103 sent += count;
2104 len -= count;
2105
2106 /* Continuation fragments (no L2CAP header) */
2107 frag = &skb_shinfo(skb)->frag_list;
2108 while (len) {
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002109 struct sk_buff *tmp;
2110
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111 count = min_t(unsigned int, conn->mtu, len);
2112
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002113 tmp = chan->ops->alloc_skb(chan, 0, count,
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002114 msg->msg_flags & MSG_DONTWAIT);
2115 if (IS_ERR(tmp))
2116 return PTR_ERR(tmp);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002117
Gustavo Padovanfbe00702012-05-15 13:22:55 -03002118 *frag = tmp;
2119
Jukka Rissanen04988782014-06-18 16:37:07 +03002120 if (chan->ops->memcpy_fromiovec(chan, skb_put(*frag, count),
2121 msg->msg_iov, count))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002122 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123
2124 sent += count;
2125 len -= count;
2126
Gustavo Padovan2d0ed3d2012-05-11 13:16:12 -03002127 skb->len += (*frag)->len;
2128 skb->data_len += (*frag)->len;
2129
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130 frag = &(*frag)->next;
2131 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132
2133 return sent;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002134}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002135
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002136static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002137 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002138{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002139 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002140 struct sk_buff *skb;
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002141 int err, count, hlen = L2CAP_HDR_SIZE + L2CAP_PSMLEN_SIZE;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002142 struct l2cap_hdr *lh;
2143
Marcel Holtmann8d463212014-06-05 15:22:51 +02002144 BT_DBG("chan %p psm 0x%2.2x len %zu", chan,
2145 __le16_to_cpu(chan->psm), len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002146
2147 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002148
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002149 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002150 msg->msg_flags & MSG_DONTWAIT);
2151 if (IS_ERR(skb))
2152 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002153
2154 /* Create L2CAP header */
2155 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002156 lh->cid = cpu_to_le16(chan->dcid);
Andrei Emeltchenkodaf6a78c2012-05-03 10:55:52 +03002157 lh->len = cpu_to_le16(len + L2CAP_PSMLEN_SIZE);
Marcel Holtmann43b1b8d2013-10-12 06:01:26 -07002158 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002159
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002160 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002161 if (unlikely(err < 0)) {
2162 kfree_skb(skb);
2163 return ERR_PTR(err);
2164 }
2165 return skb;
2166}
2167
Luiz Augusto von Dentz5e59b792011-11-01 10:58:57 +02002168static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
Marcel Holtmann8d463212014-06-05 15:22:51 +02002169 struct msghdr *msg, size_t len)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002170{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002171 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002172 struct sk_buff *skb;
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002173 int err, count;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002174 struct l2cap_hdr *lh;
2175
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002176 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002177
Gustavo Padovanf2ba7fa2012-05-03 04:54:21 -03002178 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002179
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002180 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002181 msg->msg_flags & MSG_DONTWAIT);
2182 if (IS_ERR(skb))
2183 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002184
2185 /* Create L2CAP header */
2186 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002187 lh->cid = cpu_to_le16(chan->dcid);
Gustavo Padovan6ff9b5e2012-05-02 11:56:17 -03002188 lh->len = cpu_to_le16(len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002189
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002190 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002191 if (unlikely(err < 0)) {
2192 kfree_skb(skb);
2193 return ERR_PTR(err);
2194 }
2195 return skb;
2196}
2197
Luiz Augusto von Dentzab0ff762011-09-12 20:00:50 +03002198static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan,
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002199 struct msghdr *msg, size_t len,
2200 u16 sdulen)
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002201{
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03002202 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002203 struct sk_buff *skb;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002204 int err, count, hlen;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002205 struct l2cap_hdr *lh;
2206
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002207 BT_DBG("chan %p len %zu", chan, len);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002208
Gustavo F. Padovan0ee0d202010-05-01 16:15:41 -03002209 if (!conn)
2210 return ERR_PTR(-ENOTCONN);
2211
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002212 hlen = __ertm_hdr_size(chan);
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03002213
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002214 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002215 hlen += L2CAP_SDULEN_SIZE;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002216
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03002217 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002218 hlen += L2CAP_FCS_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03002219
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002220 count = min_t(unsigned int, (conn->mtu - hlen), len);
Andrei Emeltchenko2f7719c2012-01-20 14:08:03 +02002221
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002222 skb = chan->ops->alloc_skb(chan, hlen, count,
Gustavo Padovan90338942012-04-06 20:15:47 -03002223 msg->msg_flags & MSG_DONTWAIT);
2224 if (IS_ERR(skb))
2225 return skb;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002226
2227 /* Create L2CAP header */
2228 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03002229 lh->cid = cpu_to_le16(chan->dcid);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002230 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002231
Mat Martineau18a48e72012-05-17 20:53:34 -07002232 /* Control header is populated later */
2233 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
2234 put_unaligned_le32(0, skb_put(skb, L2CAP_EXT_CTRL_SIZE));
2235 else
2236 put_unaligned_le16(0, skb_put(skb, L2CAP_ENH_CTRL_SIZE));
Andrei Emeltchenko88843ab2011-10-17 12:19:56 +03002237
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002238 if (sdulen)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03002239 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002240
Andrei Emeltchenko0952a572012-01-13 17:21:43 +02002241 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002242 if (unlikely(err < 0)) {
2243 kfree_skb(skb);
2244 return ERR_PTR(err);
2245 }
Gustavo F. Padovane90bac02009-08-20 22:26:00 -03002246
Mat Martineau18a48e72012-05-17 20:53:34 -07002247 bt_cb(skb)->control.fcs = chan->fcs;
Mat Martineau3ce35142012-04-25 16:36:14 -07002248 bt_cb(skb)->control.retries = 0;
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03002249 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250}
2251
Mat Martineau94122bb2012-05-02 09:42:02 -07002252static int l2cap_segment_sdu(struct l2cap_chan *chan,
2253 struct sk_buff_head *seg_queue,
2254 struct msghdr *msg, size_t len)
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002255{
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002256 struct sk_buff *skb;
Mat Martineau94122bb2012-05-02 09:42:02 -07002257 u16 sdu_len;
2258 size_t pdu_len;
Mat Martineau94122bb2012-05-02 09:42:02 -07002259 u8 sar;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002260
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002261 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002262
Mat Martineau94122bb2012-05-02 09:42:02 -07002263 /* It is critical that ERTM PDUs fit in a single HCI fragment,
2264 * so fragmented skbs are not used. The HCI layer's handling
2265 * of fragmented skbs is not compatible with ERTM's queueing.
2266 */
2267
2268 /* PDU size is derived from the HCI MTU */
2269 pdu_len = chan->conn->mtu;
2270
Mat Martineaua5495742012-10-23 15:24:21 -07002271 /* Constrain PDU size for BR/EDR connections */
2272 if (!chan->hs_hcon)
2273 pdu_len = min_t(size_t, pdu_len, L2CAP_BREDR_MAX_PAYLOAD);
Mat Martineau94122bb2012-05-02 09:42:02 -07002274
2275 /* Adjust for largest possible L2CAP overhead. */
Gustavo Padovan35d401d2012-05-25 18:57:05 -03002276 if (chan->fcs)
2277 pdu_len -= L2CAP_FCS_SIZE;
2278
Gustavo Padovanba7aa642012-05-29 13:29:16 -03002279 pdu_len -= __ertm_hdr_size(chan);
Mat Martineau94122bb2012-05-02 09:42:02 -07002280
2281 /* Remote device may have requested smaller PDUs */
2282 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2283
2284 if (len <= pdu_len) {
2285 sar = L2CAP_SAR_UNSEGMENTED;
2286 sdu_len = 0;
2287 pdu_len = len;
2288 } else {
2289 sar = L2CAP_SAR_START;
2290 sdu_len = len;
2291 pdu_len -= L2CAP_SDULEN_SIZE;
2292 }
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002293
2294 while (len > 0) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002295 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002296
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002297 if (IS_ERR(skb)) {
Mat Martineau94122bb2012-05-02 09:42:02 -07002298 __skb_queue_purge(seg_queue);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002299 return PTR_ERR(skb);
2300 }
2301
Mat Martineau94122bb2012-05-02 09:42:02 -07002302 bt_cb(skb)->control.sar = sar;
2303 __skb_queue_tail(seg_queue, skb);
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002304
Mat Martineau94122bb2012-05-02 09:42:02 -07002305 len -= pdu_len;
2306 if (sdu_len) {
2307 sdu_len = 0;
2308 pdu_len += L2CAP_SDULEN_SIZE;
2309 }
2310
2311 if (len <= pdu_len) {
2312 sar = L2CAP_SAR_END;
2313 pdu_len = len;
2314 } else {
2315 sar = L2CAP_SAR_CONTINUE;
2316 }
2317 }
2318
Gustavo Padovanf0f62792012-05-29 13:29:17 -03002319 return 0;
Gustavo F. Padovanc74e5602009-08-20 22:25:58 -03002320}
2321
Johan Hedberg177f8f22013-05-31 17:54:51 +03002322static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan,
2323 struct msghdr *msg,
2324 size_t len, u16 sdulen)
2325{
2326 struct l2cap_conn *conn = chan->conn;
2327 struct sk_buff *skb;
2328 int err, count, hlen;
2329 struct l2cap_hdr *lh;
2330
2331 BT_DBG("chan %p len %zu", chan, len);
2332
2333 if (!conn)
2334 return ERR_PTR(-ENOTCONN);
2335
2336 hlen = L2CAP_HDR_SIZE;
2337
2338 if (sdulen)
2339 hlen += L2CAP_SDULEN_SIZE;
2340
2341 count = min_t(unsigned int, (conn->mtu - hlen), len);
2342
Marcel Holtmannd9fbd022014-06-08 11:22:28 +02002343 skb = chan->ops->alloc_skb(chan, hlen, count,
Johan Hedberg177f8f22013-05-31 17:54:51 +03002344 msg->msg_flags & MSG_DONTWAIT);
2345 if (IS_ERR(skb))
2346 return skb;
2347
2348 /* Create L2CAP header */
2349 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
2350 lh->cid = cpu_to_le16(chan->dcid);
2351 lh->len = cpu_to_le16(len + (hlen - L2CAP_HDR_SIZE));
2352
2353 if (sdulen)
2354 put_unaligned_le16(sdulen, skb_put(skb, L2CAP_SDULEN_SIZE));
2355
2356 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb);
2357 if (unlikely(err < 0)) {
2358 kfree_skb(skb);
2359 return ERR_PTR(err);
2360 }
2361
2362 return skb;
2363}
2364
2365static int l2cap_segment_le_sdu(struct l2cap_chan *chan,
2366 struct sk_buff_head *seg_queue,
2367 struct msghdr *msg, size_t len)
2368{
2369 struct sk_buff *skb;
2370 size_t pdu_len;
2371 u16 sdu_len;
2372
2373 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len);
2374
2375 pdu_len = chan->conn->mtu - L2CAP_HDR_SIZE;
2376
2377 pdu_len = min_t(size_t, pdu_len, chan->remote_mps);
2378
2379 sdu_len = len;
2380 pdu_len -= L2CAP_SDULEN_SIZE;
2381
2382 while (len > 0) {
2383 if (len <= pdu_len)
2384 pdu_len = len;
2385
2386 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len);
2387 if (IS_ERR(skb)) {
2388 __skb_queue_purge(seg_queue);
2389 return PTR_ERR(skb);
2390 }
2391
2392 __skb_queue_tail(seg_queue, skb);
2393
2394 len -= pdu_len;
2395
2396 if (sdu_len) {
2397 sdu_len = 0;
2398 pdu_len += L2CAP_SDULEN_SIZE;
2399 }
2400 }
2401
2402 return 0;
2403}
2404
Marcel Holtmann8d463212014-06-05 15:22:51 +02002405int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002406{
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002407 struct sk_buff *skb;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002408 int err;
Mat Martineau94122bb2012-05-02 09:42:02 -07002409 struct sk_buff_head seg_queue;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002410
Seung-Woo Kim31e8ce82013-11-05 18:46:33 +09002411 if (!chan->conn)
2412 return -ENOTCONN;
2413
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002414 /* Connectionless channel */
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002415 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) {
Marcel Holtmann8d463212014-06-05 15:22:51 +02002416 skb = l2cap_create_connless_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002417 if (IS_ERR(skb))
2418 return PTR_ERR(skb);
2419
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002420 /* Channel lock is released before requesting new skb and then
2421 * reacquired thus we need to recheck channel state.
2422 */
2423 if (chan->state != BT_CONNECTED) {
2424 kfree_skb(skb);
2425 return -ENOTCONN;
2426 }
2427
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002428 l2cap_do_send(chan, skb);
2429 return len;
2430 }
2431
2432 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03002433 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedberg177f8f22013-05-31 17:54:51 +03002434 /* Check outgoing MTU */
2435 if (len > chan->omtu)
2436 return -EMSGSIZE;
2437
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002438 if (!chan->tx_credits)
2439 return -EAGAIN;
2440
Johan Hedberg177f8f22013-05-31 17:54:51 +03002441 __skb_queue_head_init(&seg_queue);
2442
2443 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
2444
2445 if (chan->state != BT_CONNECTED) {
2446 __skb_queue_purge(&seg_queue);
2447 err = -ENOTCONN;
2448 }
2449
2450 if (err)
2451 return err;
2452
2453 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q);
2454
2455 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
2456 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
2457 chan->tx_credits--;
2458 }
2459
2460 if (!chan->tx_credits)
2461 chan->ops->suspend(chan);
2462
2463 err = len;
2464
2465 break;
2466
Johan Hedbergfad5fc892013-12-05 09:45:01 +02002467 case L2CAP_MODE_BASIC:
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002468 /* Check outgoing MTU */
2469 if (len > chan->omtu)
2470 return -EMSGSIZE;
2471
2472 /* Create a basic PDU */
Marcel Holtmann8d463212014-06-05 15:22:51 +02002473 skb = l2cap_create_basic_pdu(chan, msg, len);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002474 if (IS_ERR(skb))
2475 return PTR_ERR(skb);
2476
Andrzej Kaczmarekede81a22014-02-25 17:16:22 +01002477 /* Channel lock is released before requesting new skb and then
2478 * reacquired thus we need to recheck channel state.
2479 */
2480 if (chan->state != BT_CONNECTED) {
2481 kfree_skb(skb);
2482 return -ENOTCONN;
2483 }
2484
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002485 l2cap_do_send(chan, skb);
2486 err = len;
2487 break;
2488
2489 case L2CAP_MODE_ERTM:
2490 case L2CAP_MODE_STREAMING:
Mat Martineau94122bb2012-05-02 09:42:02 -07002491 /* Check outgoing MTU */
2492 if (len > chan->omtu) {
2493 err = -EMSGSIZE;
2494 break;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002495 }
2496
Mat Martineau94122bb2012-05-02 09:42:02 -07002497 __skb_queue_head_init(&seg_queue);
2498
2499 /* Do segmentation before calling in to the state machine,
2500 * since it's possible to block while waiting for memory
2501 * allocation.
2502 */
2503 err = l2cap_segment_sdu(chan, &seg_queue, msg, len);
2504
2505 /* The channel could have been closed while segmenting,
2506 * check that it is still connected.
2507 */
2508 if (chan->state != BT_CONNECTED) {
2509 __skb_queue_purge(&seg_queue);
2510 err = -ENOTCONN;
2511 }
2512
2513 if (err)
2514 break;
2515
Mat Martineau37339372012-05-17 20:53:33 -07002516 if (chan->mode == L2CAP_MODE_ERTM)
Gustavo Padovand6603662012-05-21 13:58:22 -03002517 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST);
Mat Martineau37339372012-05-17 20:53:33 -07002518 else
Gustavo Padovand6603662012-05-21 13:58:22 -03002519 l2cap_streaming_send(chan, &seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002520
Gustavo Padovand6603662012-05-21 13:58:22 -03002521 err = len;
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002522
Mat Martineau94122bb2012-05-02 09:42:02 -07002523 /* If the skbs were not queued for sending, they'll still be in
2524 * seg_queue and need to be purged.
2525 */
2526 __skb_queue_purge(&seg_queue);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002527 break;
2528
2529 default:
2530 BT_DBG("bad state %1.1x", chan->mode);
2531 err = -EBADFD;
2532 }
2533
2534 return err;
2535}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03002536EXPORT_SYMBOL_GPL(l2cap_chan_send);
Gustavo F. Padovan9a91a042011-04-28 18:50:17 -03002537
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002538static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq)
2539{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002540 struct l2cap_ctrl control;
2541 u16 seq;
2542
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002543 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002544
2545 memset(&control, 0, sizeof(control));
2546 control.sframe = 1;
2547 control.super = L2CAP_SUPER_SREJ;
2548
2549 for (seq = chan->expected_tx_seq; seq != txseq;
2550 seq = __next_seq(chan, seq)) {
2551 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) {
2552 control.reqseq = seq;
2553 l2cap_send_sframe(chan, &control);
2554 l2cap_seq_list_append(&chan->srej_list, seq);
2555 }
2556 }
2557
2558 chan->expected_tx_seq = __next_seq(chan, txseq);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002559}
2560
2561static void l2cap_send_srej_tail(struct l2cap_chan *chan)
2562{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002563 struct l2cap_ctrl control;
2564
2565 BT_DBG("chan %p", chan);
2566
2567 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR)
2568 return;
2569
2570 memset(&control, 0, sizeof(control));
2571 control.sframe = 1;
2572 control.super = L2CAP_SUPER_SREJ;
2573 control.reqseq = chan->srej_list.tail;
2574 l2cap_send_sframe(chan, &control);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002575}
2576
2577static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq)
2578{
Mat Martineaubed68bd2012-05-17 20:53:44 -07002579 struct l2cap_ctrl control;
2580 u16 initial_head;
2581 u16 seq;
2582
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002583 BT_DBG("chan %p, txseq %u", chan, txseq);
Mat Martineaubed68bd2012-05-17 20:53:44 -07002584
2585 memset(&control, 0, sizeof(control));
2586 control.sframe = 1;
2587 control.super = L2CAP_SUPER_SREJ;
2588
2589 /* Capture initial list head to allow only one pass through the list. */
2590 initial_head = chan->srej_list.head;
2591
2592 do {
2593 seq = l2cap_seq_list_pop(&chan->srej_list);
2594 if (seq == txseq || seq == L2CAP_SEQ_LIST_CLEAR)
2595 break;
2596
2597 control.reqseq = seq;
2598 l2cap_send_sframe(chan, &control);
2599 l2cap_seq_list_append(&chan->srej_list, seq);
2600 } while (chan->srej_list.head != initial_head);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07002601}
2602
Mat Martineau608bcc62012-05-17 20:53:32 -07002603static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq)
2604{
2605 struct sk_buff *acked_skb;
2606 u16 ackseq;
2607
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002608 BT_DBG("chan %p, reqseq %u", chan, reqseq);
Mat Martineau608bcc62012-05-17 20:53:32 -07002609
2610 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq)
2611 return;
2612
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002613 BT_DBG("expected_ack_seq %u, unacked_frames %u",
Mat Martineau608bcc62012-05-17 20:53:32 -07002614 chan->expected_ack_seq, chan->unacked_frames);
2615
2616 for (ackseq = chan->expected_ack_seq; ackseq != reqseq;
2617 ackseq = __next_seq(chan, ackseq)) {
2618
2619 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq);
2620 if (acked_skb) {
2621 skb_unlink(acked_skb, &chan->tx_q);
2622 kfree_skb(acked_skb);
2623 chan->unacked_frames--;
2624 }
2625 }
2626
2627 chan->expected_ack_seq = reqseq;
2628
2629 if (chan->unacked_frames == 0)
2630 __clear_retrans_timer(chan);
2631
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002632 BT_DBG("unacked_frames %u", chan->unacked_frames);
Mat Martineau608bcc62012-05-17 20:53:32 -07002633}
2634
2635static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan)
2636{
2637 BT_DBG("chan %p", chan);
2638
2639 chan->expected_tx_seq = chan->buffer_seq;
2640 l2cap_seq_list_clear(&chan->srej_list);
2641 skb_queue_purge(&chan->srej_q);
2642 chan->rx_state = L2CAP_RX_STATE_RECV;
2643}
2644
Gustavo Padovand6603662012-05-21 13:58:22 -03002645static void l2cap_tx_state_xmit(struct l2cap_chan *chan,
2646 struct l2cap_ctrl *control,
2647 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002648{
Mat Martineau608bcc62012-05-17 20:53:32 -07002649 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2650 event);
2651
2652 switch (event) {
2653 case L2CAP_EV_DATA_REQUEST:
2654 if (chan->tx_send_head == NULL)
2655 chan->tx_send_head = skb_peek(skbs);
2656
2657 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2658 l2cap_ertm_send(chan);
2659 break;
2660 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2661 BT_DBG("Enter LOCAL_BUSY");
2662 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2663
2664 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2665 /* The SREJ_SENT state must be aborted if we are to
2666 * enter the LOCAL_BUSY state.
2667 */
2668 l2cap_abort_rx_srej_sent(chan);
2669 }
2670
2671 l2cap_send_ack(chan);
2672
2673 break;
2674 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2675 BT_DBG("Exit LOCAL_BUSY");
2676 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2677
2678 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2679 struct l2cap_ctrl local_control;
2680
2681 memset(&local_control, 0, sizeof(local_control));
2682 local_control.sframe = 1;
2683 local_control.super = L2CAP_SUPER_RR;
2684 local_control.poll = 1;
2685 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002686 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002687
2688 chan->retry_count = 1;
2689 __set_monitor_timer(chan);
2690 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2691 }
2692 break;
2693 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2694 l2cap_process_reqseq(chan, control->reqseq);
2695 break;
2696 case L2CAP_EV_EXPLICIT_POLL:
2697 l2cap_send_rr_or_rnr(chan, 1);
2698 chan->retry_count = 1;
2699 __set_monitor_timer(chan);
2700 __clear_ack_timer(chan);
2701 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2702 break;
2703 case L2CAP_EV_RETRANS_TO:
2704 l2cap_send_rr_or_rnr(chan, 1);
2705 chan->retry_count = 1;
2706 __set_monitor_timer(chan);
2707 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2708 break;
2709 case L2CAP_EV_RECV_FBIT:
2710 /* Nothing to process */
2711 break;
2712 default:
2713 break;
2714 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002715}
2716
Gustavo Padovand6603662012-05-21 13:58:22 -03002717static void l2cap_tx_state_wait_f(struct l2cap_chan *chan,
2718 struct l2cap_ctrl *control,
2719 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002720{
Mat Martineau608bcc62012-05-17 20:53:32 -07002721 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs,
2722 event);
2723
2724 switch (event) {
2725 case L2CAP_EV_DATA_REQUEST:
2726 if (chan->tx_send_head == NULL)
2727 chan->tx_send_head = skb_peek(skbs);
2728 /* Queue data, but don't send. */
2729 skb_queue_splice_tail_init(skbs, &chan->tx_q);
2730 break;
2731 case L2CAP_EV_LOCAL_BUSY_DETECTED:
2732 BT_DBG("Enter LOCAL_BUSY");
2733 set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2734
2735 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
2736 /* The SREJ_SENT state must be aborted if we are to
2737 * enter the LOCAL_BUSY state.
2738 */
2739 l2cap_abort_rx_srej_sent(chan);
2740 }
2741
2742 l2cap_send_ack(chan);
2743
2744 break;
2745 case L2CAP_EV_LOCAL_BUSY_CLEAR:
2746 BT_DBG("Exit LOCAL_BUSY");
2747 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
2748
2749 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) {
2750 struct l2cap_ctrl local_control;
2751 memset(&local_control, 0, sizeof(local_control));
2752 local_control.sframe = 1;
2753 local_control.super = L2CAP_SUPER_RR;
2754 local_control.poll = 1;
2755 local_control.reqseq = chan->buffer_seq;
Mat Martineaua67d7f62012-05-17 20:53:35 -07002756 l2cap_send_sframe(chan, &local_control);
Mat Martineau608bcc62012-05-17 20:53:32 -07002757
2758 chan->retry_count = 1;
2759 __set_monitor_timer(chan);
2760 chan->tx_state = L2CAP_TX_STATE_WAIT_F;
2761 }
2762 break;
2763 case L2CAP_EV_RECV_REQSEQ_AND_FBIT:
2764 l2cap_process_reqseq(chan, control->reqseq);
2765
2766 /* Fall through */
2767
2768 case L2CAP_EV_RECV_FBIT:
2769 if (control && control->final) {
2770 __clear_monitor_timer(chan);
2771 if (chan->unacked_frames > 0)
2772 __set_retrans_timer(chan);
2773 chan->retry_count = 0;
2774 chan->tx_state = L2CAP_TX_STATE_XMIT;
2775 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state);
2776 }
2777 break;
2778 case L2CAP_EV_EXPLICIT_POLL:
2779 /* Ignore */
2780 break;
2781 case L2CAP_EV_MONITOR_TO:
2782 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) {
2783 l2cap_send_rr_or_rnr(chan, 1);
2784 __set_monitor_timer(chan);
2785 chan->retry_count++;
2786 } else {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02002787 l2cap_send_disconn_req(chan, ECONNABORTED);
Mat Martineau608bcc62012-05-17 20:53:32 -07002788 }
2789 break;
2790 default:
2791 break;
2792 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002793}
2794
Gustavo Padovand6603662012-05-21 13:58:22 -03002795static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
2796 struct sk_buff_head *skbs, u8 event)
Mat Martineau608bcc62012-05-17 20:53:32 -07002797{
Mat Martineau608bcc62012-05-17 20:53:32 -07002798 BT_DBG("chan %p, control %p, skbs %p, event %d, state %d",
2799 chan, control, skbs, event, chan->tx_state);
2800
2801 switch (chan->tx_state) {
2802 case L2CAP_TX_STATE_XMIT:
Gustavo Padovand6603662012-05-21 13:58:22 -03002803 l2cap_tx_state_xmit(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002804 break;
2805 case L2CAP_TX_STATE_WAIT_F:
Gustavo Padovand6603662012-05-21 13:58:22 -03002806 l2cap_tx_state_wait_f(chan, control, skbs, event);
Mat Martineau608bcc62012-05-17 20:53:32 -07002807 break;
2808 default:
2809 /* Ignore event */
2810 break;
2811 }
Mat Martineau608bcc62012-05-17 20:53:32 -07002812}
2813
Mat Martineau4b51dae92012-05-17 20:53:37 -07002814static void l2cap_pass_to_tx(struct l2cap_chan *chan,
2815 struct l2cap_ctrl *control)
2816{
2817 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002818 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT);
Mat Martineau4b51dae92012-05-17 20:53:37 -07002819}
2820
Mat Martineauf80842a2012-05-17 20:53:46 -07002821static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan,
2822 struct l2cap_ctrl *control)
2823{
2824 BT_DBG("chan %p, control %p", chan, control);
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03002825 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT);
Mat Martineauf80842a2012-05-17 20:53:46 -07002826}
2827
Linus Torvalds1da177e2005-04-16 15:20:36 -07002828/* Copy frame to all raw sockets on that connection */
2829static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb)
2830{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002831 struct sk_buff *nskb;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03002832 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833
2834 BT_DBG("conn %p", conn);
2835
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002836 mutex_lock(&conn->chan_lock);
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002837
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002838 list_for_each_entry(chan, &conn->chan_l, list) {
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03002839 if (chan->chan_type != L2CAP_CHAN_RAW)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840 continue;
2841
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002842 /* Don't send frame to the channel it came from */
2843 if (bt_cb(skb)->chan == chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 continue;
Gustavo Padovan7f5396a2013-10-21 18:22:25 -02002845
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002846 nskb = skb_clone(skb, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03002847 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002848 continue;
Gustavo Padovan80b98022012-05-27 22:27:51 -03002849 if (chan->ops->recv(chan, nskb))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850 kfree_skb(nskb);
2851 }
Gustavo F. Padovan3d57dc62011-12-17 10:56:45 -02002852
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02002853 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002854}
2855
2856/* ---- L2CAP signalling commands ---- */
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002857static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code,
2858 u8 ident, u16 dlen, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002859{
2860 struct sk_buff *skb, **frag;
2861 struct l2cap_cmd_hdr *cmd;
2862 struct l2cap_hdr *lh;
2863 int len, count;
2864
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002865 BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u",
2866 conn, code, ident, dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867
Anderson Lizardo300b9622013-06-02 16:30:40 -04002868 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE)
2869 return NULL;
2870
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871 len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen;
2872 count = min_t(unsigned int, conn->mtu, len);
2873
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002874 skb = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 if (!skb)
2876 return NULL;
2877
2878 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002879 lh->len = cpu_to_le16(L2CAP_CMD_HDR_SIZE + dlen);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002880
2881 if (conn->hcon->type == LE_LINK)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002882 lh->cid = cpu_to_le16(L2CAP_CID_LE_SIGNALING);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02002883 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002884 lh->cid = cpu_to_le16(L2CAP_CID_SIGNALING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885
2886 cmd = (struct l2cap_cmd_hdr *) skb_put(skb, L2CAP_CMD_HDR_SIZE);
2887 cmd->code = code;
2888 cmd->ident = ident;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07002889 cmd->len = cpu_to_le16(dlen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002890
2891 if (dlen) {
2892 count -= L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE;
2893 memcpy(skb_put(skb, count), data, count);
2894 data += count;
2895 }
2896
2897 len -= skb->len;
2898
2899 /* Continuation fragments (no L2CAP header) */
2900 frag = &skb_shinfo(skb)->frag_list;
2901 while (len) {
2902 count = min_t(unsigned int, conn->mtu, len);
2903
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03002904 *frag = bt_skb_alloc(count, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002905 if (!*frag)
2906 goto fail;
2907
2908 memcpy(skb_put(*frag, count), data, count);
2909
2910 len -= count;
2911 data += count;
2912
2913 frag = &(*frag)->next;
2914 }
2915
2916 return skb;
2917
2918fail:
2919 kfree_skb(skb);
2920 return NULL;
2921}
2922
Gustavo Padovan2d792812012-10-06 10:07:01 +01002923static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen,
2924 unsigned long *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002925{
2926 struct l2cap_conf_opt *opt = *ptr;
2927 int len;
2928
2929 len = L2CAP_CONF_OPT_SIZE + opt->len;
2930 *ptr += len;
2931
2932 *type = opt->type;
2933 *olen = opt->len;
2934
2935 switch (opt->len) {
2936 case 1:
2937 *val = *((u8 *) opt->val);
2938 break;
2939
2940 case 2:
steven miaobfaaeb32010-10-16 18:29:47 -04002941 *val = get_unaligned_le16(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002942 break;
2943
2944 case 4:
steven miaobfaaeb32010-10-16 18:29:47 -04002945 *val = get_unaligned_le32(opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002946 break;
2947
2948 default:
2949 *val = (unsigned long) opt->val;
2950 break;
2951 }
2952
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002953 BT_DBG("type 0x%2.2x len %u val 0x%lx", *type, opt->len, *val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002954 return len;
2955}
2956
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val)
2958{
2959 struct l2cap_conf_opt *opt = *ptr;
2960
Andrei Emeltchenkob4400672012-07-10 15:27:49 +03002961 BT_DBG("type 0x%2.2x len %u val 0x%lx", type, len, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002962
2963 opt->type = type;
2964 opt->len = len;
2965
2966 switch (len) {
2967 case 1:
2968 *((u8 *) opt->val) = val;
2969 break;
2970
2971 case 2:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002972 put_unaligned_le16(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973 break;
2974
2975 case 4:
Gustavo F. Padovan4f8b6912010-10-18 14:25:53 -02002976 put_unaligned_le32(val, opt->val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977 break;
2978
2979 default:
2980 memcpy(opt->val, (void *) val, len);
2981 break;
2982 }
2983
2984 *ptr += L2CAP_CONF_OPT_SIZE + len;
2985}
2986
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002987static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan)
2988{
2989 struct l2cap_conf_efs efs;
2990
Szymon Janc1ec918c2011-11-16 09:32:21 +01002991 switch (chan->mode) {
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002992 case L2CAP_MODE_ERTM:
2993 efs.id = chan->local_id;
2994 efs.stype = chan->local_stype;
2995 efs.msdu = cpu_to_le16(chan->local_msdu);
2996 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07002997 efs.acc_lat = cpu_to_le32(L2CAP_DEFAULT_ACC_LAT);
2998 efs.flush_to = cpu_to_le32(L2CAP_EFS_DEFAULT_FLUSH_TO);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03002999 break;
3000
3001 case L2CAP_MODE_STREAMING:
3002 efs.id = 1;
3003 efs.stype = L2CAP_SERV_BESTEFFORT;
3004 efs.msdu = cpu_to_le16(chan->local_msdu);
3005 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime);
3006 efs.acc_lat = 0;
3007 efs.flush_to = 0;
3008 break;
3009
3010 default:
3011 return;
3012 }
3013
3014 l2cap_add_conf_opt(ptr, L2CAP_CONF_EFS, sizeof(efs),
Andrei Emeltchenko8936fa62012-10-08 11:14:41 +03003015 (unsigned long) &efs);
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003016}
3017
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003018static void l2cap_ack_timeout(struct work_struct *work)
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003019{
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003020 struct l2cap_chan *chan = container_of(work, struct l2cap_chan,
Mat Martineau03625202012-05-17 20:53:51 -07003021 ack_timer.work);
3022 u16 frames_to_ack;
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003023
Gustavo F. Padovan2fb9b3d2011-12-22 16:56:05 -02003024 BT_DBG("chan %p", chan);
3025
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003026 l2cap_chan_lock(chan);
3027
Mat Martineau03625202012-05-17 20:53:51 -07003028 frames_to_ack = __seq_offset(chan, chan->buffer_seq,
3029 chan->last_acked_seq);
3030
3031 if (frames_to_ack)
3032 l2cap_send_rr_or_rnr(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003033
3034 l2cap_chan_unlock(chan);
Szymon Janc09bfb2e2012-01-11 10:59:49 +01003035 l2cap_chan_put(chan);
Gustavo F. Padovanc1b4f432010-05-01 16:15:39 -03003036}
3037
Andrei Emeltchenko466f8002012-05-29 13:59:01 +03003038int l2cap_ertm_init(struct l2cap_chan *chan)
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003039{
Mat Martineau3c588192012-04-11 10:48:42 -07003040 int err;
3041
Mat Martineau105bdf92012-04-27 16:50:48 -07003042 chan->next_tx_seq = 0;
3043 chan->expected_tx_seq = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003044 chan->expected_ack_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003045 chan->unacked_frames = 0;
Gustavo F. Padovan42e5c802011-03-25 19:58:34 -03003046 chan->buffer_seq = 0;
Gustavo F. Padovan6a026612011-04-01 00:38:50 -03003047 chan->frames_sent = 0;
Mat Martineau105bdf92012-04-27 16:50:48 -07003048 chan->last_acked_seq = 0;
3049 chan->sdu = NULL;
3050 chan->sdu_last_frag = NULL;
3051 chan->sdu_len = 0;
3052
Mat Martineaud34c34f2012-05-14 14:49:27 -07003053 skb_queue_head_init(&chan->tx_q);
3054
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003055 chan->local_amp_id = AMP_ID_BREDR;
3056 chan->move_id = AMP_ID_BREDR;
Mat Martineau08333282012-10-23 15:24:06 -07003057 chan->move_state = L2CAP_MOVE_STABLE;
3058 chan->move_role = L2CAP_MOVE_ROLE_NONE;
3059
Mat Martineau105bdf92012-04-27 16:50:48 -07003060 if (chan->mode != L2CAP_MODE_ERTM)
3061 return 0;
3062
3063 chan->rx_state = L2CAP_RX_STATE_RECV;
3064 chan->tx_state = L2CAP_TX_STATE_XMIT;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003065
Gustavo F. Padovan721c4182011-06-23 19:29:58 -03003066 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout);
3067 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout);
3068 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003069
Gustavo F. Padovanf1c67752011-03-25 20:36:10 -03003070 skb_queue_head_init(&chan->srej_q);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03003071
Mat Martineau3c588192012-04-11 10:48:42 -07003072 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
3073 if (err < 0)
3074 return err;
3075
Mat Martineau9dc9aff2012-05-17 16:20:14 -07003076 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win);
3077 if (err < 0)
3078 l2cap_seq_list_free(&chan->srej_list);
3079
3080 return err;
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03003081}
3082
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003083static inline __u8 l2cap_select_mode(__u8 mode, __u16 remote_feat_mask)
3084{
3085 switch (mode) {
3086 case L2CAP_MODE_STREAMING:
3087 case L2CAP_MODE_ERTM:
3088 if (l2cap_mode_supported(mode, remote_feat_mask))
3089 return mode;
3090 /* fall through */
3091 default:
3092 return L2CAP_MODE_BASIC;
3093 }
3094}
3095
Marcel Holtmann848566b2013-10-01 22:59:22 -07003096static inline bool __l2cap_ews_supported(struct l2cap_conn *conn)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003097{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003098 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003099}
3100
Marcel Holtmann848566b2013-10-01 22:59:22 -07003101static inline bool __l2cap_efs_supported(struct l2cap_conn *conn)
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003102{
Marcel Holtmann848566b2013-10-01 22:59:22 -07003103 return conn->hs_enabled && conn->feat_mask & L2CAP_FEAT_EXT_FLOW;
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003104}
3105
Mat Martineau36c86c82012-10-23 15:24:20 -07003106static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan,
3107 struct l2cap_conf_rfc *rfc)
3108{
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003109 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) {
Mat Martineau36c86c82012-10-23 15:24:20 -07003110 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to;
3111
3112 /* Class 1 devices have must have ERTM timeouts
3113 * exceeding the Link Supervision Timeout. The
3114 * default Link Supervision Timeout for AMP
3115 * controllers is 10 seconds.
3116 *
3117 * Class 1 devices use 0xffffffff for their
3118 * best-effort flush timeout, so the clamping logic
3119 * will result in a timeout that meets the above
3120 * requirement. ERTM timeouts are 16-bit values, so
3121 * the maximum timeout is 65.535 seconds.
3122 */
3123
3124 /* Convert timeout to milliseconds and round */
3125 ertm_to = DIV_ROUND_UP_ULL(ertm_to, 1000);
3126
3127 /* This is the recommended formula for class 2 devices
3128 * that start ERTM timers when packets are sent to the
3129 * controller.
3130 */
3131 ertm_to = 3 * ertm_to + 500;
3132
3133 if (ertm_to > 0xffff)
3134 ertm_to = 0xffff;
3135
3136 rfc->retrans_timeout = cpu_to_le16((u16) ertm_to);
3137 rfc->monitor_timeout = rfc->retrans_timeout;
3138 } else {
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003139 rfc->retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO);
3140 rfc->monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO);
Mat Martineau36c86c82012-10-23 15:24:20 -07003141 }
3142}
3143
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003144static inline void l2cap_txwin_setup(struct l2cap_chan *chan)
3145{
3146 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW &&
Marcel Holtmann848566b2013-10-01 22:59:22 -07003147 __l2cap_ews_supported(chan->conn)) {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003148 /* use extended control field */
3149 set_bit(FLAG_EXT_CTRL, &chan->flags);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003150 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
3151 } else {
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003152 chan->tx_win = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003153 L2CAP_DEFAULT_TX_WINDOW);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003154 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW;
3155 }
Mat Martineauc20f8e32012-07-10 05:47:07 -07003156 chan->ack_win = chan->tx_win;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003157}
3158
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003159static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003160{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 struct l2cap_conf_req *req = data;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003162 struct l2cap_conf_rfc rfc = { .mode = chan->mode };
Linus Torvalds1da177e2005-04-16 15:20:36 -07003163 void *ptr = req->data;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003164 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003165
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03003166 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003167
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003168 if (chan->num_conf_req || chan->num_conf_rsp)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003169 goto done;
3170
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003171 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003172 case L2CAP_MODE_STREAMING:
3173 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003174 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state))
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003175 break;
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003176
Marcel Holtmann848566b2013-10-01 22:59:22 -07003177 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003178 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3179
Gustavo F. Padovan2ba13ed2010-06-09 16:39:05 -03003180 /* fall through */
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003181 default:
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003182 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003183 break;
3184 }
3185
3186done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003187 if (chan->imtu != L2CAP_DEFAULT_MTU)
3188 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovan7990681c2011-01-24 16:01:43 -02003189
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003190 switch (chan->mode) {
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003191 case L2CAP_MODE_BASIC:
Marcel Holtmann6fea7ad2014-07-09 11:53:35 +02003192 if (disable_ertm)
3193 break;
3194
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003195 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003196 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING))
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003197 break;
3198
Gustavo F. Padovan62547752010-06-08 20:05:31 -03003199 rfc.mode = L2CAP_MODE_BASIC;
3200 rfc.txwin_size = 0;
3201 rfc.max_transmit = 0;
3202 rfc.retrans_timeout = 0;
3203 rfc.monitor_timeout = 0;
3204 rfc.max_pdu_size = 0;
3205
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003206 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003207 (unsigned long) &rfc);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003208 break;
3209
3210 case L2CAP_MODE_ERTM:
3211 rfc.mode = L2CAP_MODE_ERTM;
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003212 rfc.max_transmit = chan->max_tx;
Mat Martineau36c86c82012-10-23 15:24:20 -07003213
3214 __l2cap_set_ertm_timeouts(chan, &rfc);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003215
3216 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003217 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3218 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003219 rfc.max_pdu_size = cpu_to_le16(size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003220
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003221 l2cap_txwin_setup(chan);
3222
3223 rfc.txwin_size = min_t(u16, chan->tx_win,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003224 L2CAP_DEFAULT_TX_WINDOW);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003225
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003226 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003227 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003228
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003229 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3230 l2cap_add_opt_efs(&ptr, chan);
3231
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003232 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3233 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003234 chan->tx_win);
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003235
3236 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3237 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003238 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003239 chan->fcs = L2CAP_FCS_NONE;
3240 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3241 chan->fcs);
3242 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003243 break;
3244
3245 case L2CAP_MODE_STREAMING:
Mat Martineau273759e2012-05-17 20:53:53 -07003246 l2cap_txwin_setup(chan);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003247 rfc.mode = L2CAP_MODE_STREAMING;
3248 rfc.txwin_size = 0;
3249 rfc.max_transmit = 0;
3250 rfc.retrans_timeout = 0;
3251 rfc.monitor_timeout = 0;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003252
3253 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu -
Gustavo Padovan2d792812012-10-06 10:07:01 +01003254 L2CAP_EXT_HDR_SIZE - L2CAP_SDULEN_SIZE -
3255 L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003256 rfc.max_pdu_size = cpu_to_le16(size);
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003257
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003258 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003259 (unsigned long) &rfc);
Gustavo F. Padovan63406502010-08-03 23:49:29 -03003260
Andrei Emeltchenkof89cef02011-10-13 16:18:55 +03003261 if (test_bit(FLAG_EFS_ENABLE, &chan->flags))
3262 l2cap_add_opt_efs(&ptr, chan);
3263
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003264 if (chan->conn->feat_mask & L2CAP_FEAT_FCS)
3265 if (chan->fcs == L2CAP_FCS_NONE ||
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003266 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) {
Andrei Emeltchenko60918912012-11-29 17:46:06 +02003267 chan->fcs = L2CAP_FCS_NONE;
3268 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1,
3269 chan->fcs);
3270 }
Marcel Holtmann65c7c492009-05-02 23:07:53 -07003271 break;
3272 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003273
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003274 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003275 req->flags = cpu_to_le16(0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003276
3277 return ptr - data;
3278}
3279
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003280static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003281{
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003282 struct l2cap_conf_rsp *rsp = data;
3283 void *ptr = rsp->data;
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003284 void *req = chan->conf_req;
3285 int len = chan->conf_len;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003286 int type, hint, olen;
3287 unsigned long val;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003288 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003289 struct l2cap_conf_efs efs;
3290 u8 remote_efs = 0;
Marcel Holtmann861d6882007-10-20 13:37:06 +02003291 u16 mtu = L2CAP_DEFAULT_MTU;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003292 u16 result = L2CAP_CONF_SUCCESS;
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003293 u16 size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003294
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003295 BT_DBG("chan %p", chan);
Marcel Holtmann820ae1b2006-11-18 22:15:00 +01003296
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003297 while (len >= L2CAP_CONF_OPT_SIZE) {
3298 len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003299
Gustavo F. Padovan589d2742009-04-20 01:31:07 -03003300 hint = type & L2CAP_CONF_HINT;
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07003301 type &= L2CAP_CONF_MASK;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003302
3303 switch (type) {
3304 case L2CAP_CONF_MTU:
Marcel Holtmann861d6882007-10-20 13:37:06 +02003305 mtu = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003306 break;
3307
3308 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003309 chan->flush_to = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003310 break;
3311
3312 case L2CAP_CONF_QOS:
3313 break;
3314
Marcel Holtmann6464f352007-10-20 13:39:51 +02003315 case L2CAP_CONF_RFC:
3316 if (olen == sizeof(rfc))
3317 memcpy(&rfc, (void *) val, olen);
3318 break;
3319
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003320 case L2CAP_CONF_FCS:
3321 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003322 set_bit(CONF_RECV_NO_FCS, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003323 break;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003324
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003325 case L2CAP_CONF_EFS:
3326 remote_efs = 1;
3327 if (olen == sizeof(efs))
3328 memcpy(&efs, (void *) val, olen);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03003329 break;
3330
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003331 case L2CAP_CONF_EWS:
Marcel Holtmann848566b2013-10-01 22:59:22 -07003332 if (!chan->conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003333 return -ECONNREFUSED;
3334
3335 set_bit(FLAG_EXT_CTRL, &chan->flags);
3336 set_bit(CONF_EWS_RECV, &chan->conf_state);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03003337 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003338 chan->remote_tx_win = val;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003339 break;
3340
3341 default:
3342 if (hint)
3343 break;
3344
3345 result = L2CAP_CONF_UNKNOWN;
3346 *((u8 *) ptr++) = type;
3347 break;
3348 }
3349 }
3350
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003351 if (chan->num_conf_rsp || chan->num_conf_req > 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003352 goto done;
3353
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003354 switch (chan->mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003355 case L2CAP_MODE_STREAMING:
3356 case L2CAP_MODE_ERTM:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003357 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003358 chan->mode = l2cap_select_mode(rfc.mode,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003359 chan->conn->feat_mask);
Gustavo F. Padovan85eb53c2010-06-03 18:43:28 -03003360 break;
3361 }
3362
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003363 if (remote_efs) {
Marcel Holtmann848566b2013-10-01 22:59:22 -07003364 if (__l2cap_efs_supported(chan->conn))
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003365 set_bit(FLAG_EFS_ENABLE, &chan->flags);
3366 else
3367 return -ECONNREFUSED;
3368 }
3369
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003370 if (chan->mode != rfc.mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003371 return -ECONNREFUSED;
Gustavo F. Padovan742e5192010-06-08 19:09:48 -03003372
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003373 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003374 }
3375
3376done:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003377 if (chan->mode != rfc.mode) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003378 result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003379 rfc.mode = chan->mode;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003380
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003381 if (chan->num_conf_rsp == 1)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003382 return -ECONNREFUSED;
3383
Gustavo Padovan2d792812012-10-06 10:07:01 +01003384 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3385 (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003386 }
3387
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003388 if (result == L2CAP_CONF_SUCCESS) {
3389 /* Configure output options and let the other side know
3390 * which ones we don't like. */
3391
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003392 if (mtu < L2CAP_DEFAULT_MIN_MTU)
3393 result = L2CAP_CONF_UNACCEPT;
3394 else {
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003395 chan->omtu = mtu;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003396 set_bit(CONF_MTU_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003397 }
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003398 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003399
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003400 if (remote_efs) {
3401 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003402 efs.stype != L2CAP_SERV_NOTRAFIC &&
3403 efs.stype != chan->local_stype) {
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003404
3405 result = L2CAP_CONF_UNACCEPT;
3406
3407 if (chan->num_conf_req >= 1)
3408 return -ECONNREFUSED;
3409
3410 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003411 sizeof(efs),
3412 (unsigned long) &efs);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003413 } else {
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003414 /* Send PENDING Conf Rsp */
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003415 result = L2CAP_CONF_PENDING;
3416 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003417 }
3418 }
3419
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003420 switch (rfc.mode) {
3421 case L2CAP_MODE_BASIC:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003422 chan->fcs = L2CAP_FCS_NONE;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003423 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003424 break;
3425
3426 case L2CAP_MODE_ERTM:
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003427 if (!test_bit(CONF_EWS_RECV, &chan->conf_state))
3428 chan->remote_tx_win = rfc.txwin_size;
3429 else
3430 rfc.txwin_size = L2CAP_DEFAULT_TX_WINDOW;
3431
Gustavo F. Padovan2c03a7a2011-03-25 20:15:28 -03003432 chan->remote_max_tx = rfc.max_transmit;
Mat Martineau86b1b262010-08-05 15:54:22 -07003433
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003434 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003435 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3436 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003437 rfc.max_pdu_size = cpu_to_le16(size);
3438 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003439
Mat Martineau36c86c82012-10-23 15:24:20 -07003440 __l2cap_set_ertm_timeouts(chan, &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003441
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003442 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003443
3444 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003445 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003446
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003447 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3448 chan->remote_id = efs.id;
3449 chan->remote_stype = efs.stype;
3450 chan->remote_msdu = le16_to_cpu(efs.msdu);
3451 chan->remote_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003452 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003453 chan->remote_acc_lat =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003454 le32_to_cpu(efs.acc_lat);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003455 chan->remote_sdu_itime =
3456 le32_to_cpu(efs.sdu_itime);
3457 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003458 sizeof(efs),
3459 (unsigned long) &efs);
Andrei Emeltchenko42dceae2011-10-17 14:35:30 +03003460 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003461 break;
3462
3463 case L2CAP_MODE_STREAMING:
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003464 size = min_t(u16, le16_to_cpu(rfc.max_pdu_size),
Gustavo Padovan2d792812012-10-06 10:07:01 +01003465 chan->conn->mtu - L2CAP_EXT_HDR_SIZE -
3466 L2CAP_SDULEN_SIZE - L2CAP_FCS_SIZE);
Andrei Emeltchenkoc8f79162011-10-17 12:19:59 +03003467 rfc.max_pdu_size = cpu_to_le16(size);
3468 chan->remote_mps = size;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003469
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003470 set_bit(CONF_MODE_DONE, &chan->conf_state);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003471
Gustavo Padovan2d792812012-10-06 10:07:01 +01003472 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc),
3473 (unsigned long) &rfc);
Gustavo F. Padovan68ae6632009-10-17 21:41:01 -03003474
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003475 break;
3476
3477 default:
Marcel Holtmann6464f352007-10-20 13:39:51 +02003478 result = L2CAP_CONF_UNACCEPT;
3479
3480 memset(&rfc, 0, sizeof(rfc));
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003481 rfc.mode = chan->mode;
Marcel Holtmann6464f352007-10-20 13:39:51 +02003482 }
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003483
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003484 if (result == L2CAP_CONF_SUCCESS)
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003485 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003486 }
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003487 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003488 rsp->result = cpu_to_le16(result);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003489 rsp->flags = cpu_to_le16(0);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003490
3491 return ptr - data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003492}
3493
Gustavo Padovan2d792812012-10-06 10:07:01 +01003494static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3495 void *data, u16 *result)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003496{
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003497 struct l2cap_conf_req *req = data;
3498 void *ptr = req->data;
3499 int type, olen;
3500 unsigned long val;
Mat Martineau36e999a2011-12-08 17:23:21 -08003501 struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC };
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003502 struct l2cap_conf_efs efs;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003503
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003504 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003505
3506 while (len >= L2CAP_CONF_OPT_SIZE) {
3507 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3508
3509 switch (type) {
3510 case L2CAP_CONF_MTU:
3511 if (val < L2CAP_DEFAULT_MIN_MTU) {
3512 *result = L2CAP_CONF_UNACCEPT;
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003513 chan->imtu = L2CAP_DEFAULT_MIN_MTU;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003514 } else
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003515 chan->imtu = val;
3516 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003517 break;
3518
3519 case L2CAP_CONF_FLUSH_TO:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003520 chan->flush_to = val;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003521 l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003522 2, chan->flush_to);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003523 break;
3524
3525 case L2CAP_CONF_RFC:
3526 if (olen == sizeof(rfc))
3527 memcpy(&rfc, (void *)val, olen);
3528
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003529 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003530 rfc.mode != chan->mode)
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003531 return -ECONNREFUSED;
3532
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003533 chan->fcs = 0;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003534
3535 l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003536 sizeof(rfc), (unsigned long) &rfc);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003537 break;
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003538
3539 case L2CAP_CONF_EWS:
Mat Martineauc20f8e32012-07-10 05:47:07 -07003540 chan->ack_win = min_t(u16, val, chan->ack_win);
Gustavo F. Padovan3e6b3b92011-11-01 14:06:23 -02003541 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2,
Mat Martineauc20f8e32012-07-10 05:47:07 -07003542 chan->tx_win);
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03003543 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003544
3545 case L2CAP_CONF_EFS:
3546 if (olen == sizeof(efs))
3547 memcpy(&efs, (void *)val, olen);
3548
3549 if (chan->local_stype != L2CAP_SERV_NOTRAFIC &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003550 efs.stype != L2CAP_SERV_NOTRAFIC &&
3551 efs.stype != chan->local_stype)
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003552 return -ECONNREFUSED;
3553
Gustavo Padovan2d792812012-10-06 10:07:01 +01003554 l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs),
3555 (unsigned long) &efs);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003556 break;
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003557
3558 case L2CAP_CONF_FCS:
3559 if (*result == L2CAP_CONF_PENDING)
3560 if (val == L2CAP_FCS_NONE)
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003561 set_bit(CONF_RECV_NO_FCS,
Andrei Emeltchenkocbabee72012-11-29 17:46:07 +02003562 &chan->conf_state);
3563 break;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003564 }
3565 }
3566
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003567 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode)
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003568 return -ECONNREFUSED;
3569
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003570 chan->mode = rfc.mode;
Gustavo F. Padovan6c2ea7a2010-06-08 20:08:49 -03003571
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03003572 if (*result == L2CAP_CONF_SUCCESS || *result == L2CAP_CONF_PENDING) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003573 switch (rfc.mode) {
3574 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003575 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3576 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
3577 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003578 if (!test_bit(FLAG_EXT_CTRL, &chan->flags))
3579 chan->ack_win = min_t(u16, chan->ack_win,
3580 rfc.txwin_size);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003581
3582 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) {
3583 chan->local_msdu = le16_to_cpu(efs.msdu);
3584 chan->local_sdu_itime =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003585 le32_to_cpu(efs.sdu_itime);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003586 chan->local_acc_lat = le32_to_cpu(efs.acc_lat);
3587 chan->local_flush_to =
Gustavo Padovan2d792812012-10-06 10:07:01 +01003588 le32_to_cpu(efs.flush_to);
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003589 }
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003590 break;
Andrei Emeltchenko66af7aa2011-11-07 14:20:33 +02003591
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003592 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003593 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003594 }
3595 }
3596
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003597 req->dcid = cpu_to_le16(chan->dcid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003598 req->flags = cpu_to_le16(0);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03003599
3600 return ptr - data;
3601}
3602
Gustavo Padovan2d792812012-10-06 10:07:01 +01003603static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data,
3604 u16 result, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003605{
3606 struct l2cap_conf_rsp *rsp = data;
3607 void *ptr = rsp->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003608
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003609 BT_DBG("chan %p", chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003610
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003611 rsp->scid = cpu_to_le16(chan->dcid);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02003612 rsp->result = cpu_to_le16(result);
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003613 rsp->flags = cpu_to_le16(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003614
3615 return ptr - data;
3616}
3617
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003618void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
3619{
3620 struct l2cap_le_conn_rsp rsp;
3621 struct l2cap_conn *conn = chan->conn;
3622
3623 BT_DBG("chan %p", chan);
3624
3625 rsp.dcid = cpu_to_le16(chan->scid);
3626 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02003627 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03003628 rsp.credits = cpu_to_le16(chan->rx_credits);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003629 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03003630
3631 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
3632 &rsp);
3633}
3634
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003635void __l2cap_connect_rsp_defer(struct l2cap_chan *chan)
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003636{
3637 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan8c1d7872011-04-13 20:23:55 -03003638 struct l2cap_conn *conn = chan->conn;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003639 u8 buf[128];
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003640 u8 rsp_code;
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003641
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003642 rsp.scid = cpu_to_le16(chan->dcid);
3643 rsp.dcid = cpu_to_le16(chan->scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003644 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
3645 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko439f34a2012-10-31 15:46:28 +02003646
3647 if (chan->hs_hcon)
3648 rsp_code = L2CAP_CREATE_CHAN_RSP;
3649 else
3650 rsp_code = L2CAP_CONN_RSP;
3651
3652 BT_DBG("chan %p rsp_code %u", chan, rsp_code);
3653
3654 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003655
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003656 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003657 return;
3658
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003659 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003660 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan710f9b0a2011-03-25 14:30:37 -03003661 chan->num_conf_req++;
3662}
3663
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003664static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003665{
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003666 int type, olen;
3667 unsigned long val;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003668 /* Use sane default values in case a misbehaving remote device
3669 * did not send an RFC or extended window size option.
3670 */
3671 u16 txwin_ext = chan->ack_win;
3672 struct l2cap_conf_rfc rfc = {
3673 .mode = chan->mode,
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003674 .retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO),
3675 .monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO),
Mat Martineauc20f8e32012-07-10 05:47:07 -07003676 .max_pdu_size = cpu_to_le16(chan->imtu),
3677 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW),
3678 };
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003679
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003680 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003681
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003682 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING))
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003683 return;
3684
3685 while (len >= L2CAP_CONF_OPT_SIZE) {
3686 len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
3687
Mat Martineauc20f8e32012-07-10 05:47:07 -07003688 switch (type) {
3689 case L2CAP_CONF_RFC:
3690 if (olen == sizeof(rfc))
3691 memcpy(&rfc, (void *)val, olen);
Szymon Janc8f321f82012-06-08 11:33:33 +02003692 break;
Mat Martineauc20f8e32012-07-10 05:47:07 -07003693 case L2CAP_CONF_EWS:
3694 txwin_ext = val;
3695 break;
3696 }
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003697 }
3698
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003699 switch (rfc.mode) {
3700 case L2CAP_MODE_ERTM:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003701 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout);
3702 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout);
Mat Martineauc20f8e32012-07-10 05:47:07 -07003703 chan->mps = le16_to_cpu(rfc.max_pdu_size);
3704 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
3705 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext);
3706 else
3707 chan->ack_win = min_t(u16, chan->ack_win,
3708 rfc.txwin_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003709 break;
3710 case L2CAP_MODE_STREAMING:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003711 chan->mps = le16_to_cpu(rfc.max_pdu_size);
Gustavo F. Padovan7b1c0042010-05-01 16:15:39 -03003712 }
3713}
3714
Gustavo Padovan2d792812012-10-06 10:07:01 +01003715static inline int l2cap_command_rej(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003716 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3717 u8 *data)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003718{
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003719 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003720
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003721 if (cmd_len < sizeof(*rej))
3722 return -EPROTO;
3723
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03003724 if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD)
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003725 return 0;
3726
3727 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003728 cmd->ident == conn->info_ident) {
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02003729 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann984947d2009-02-06 23:35:19 +01003730
3731 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01003732 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01003733
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02003734 l2cap_conn_start(conn);
3735 }
3736
3737 return 0;
3738}
3739
Mat Martineau17009152012-10-23 15:24:07 -07003740static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
3741 struct l2cap_cmd_hdr *cmd,
3742 u8 *data, u8 rsp_code, u8 amp_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003743{
Linus Torvalds1da177e2005-04-16 15:20:36 -07003744 struct l2cap_conn_req *req = (struct l2cap_conn_req *) data;
3745 struct l2cap_conn_rsp rsp;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003746 struct l2cap_chan *chan = NULL, *pchan;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003747 int result, status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003748
3749 u16 dcid = 0, scid = __le16_to_cpu(req->scid);
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003750 __le16 psm = req->psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003751
Andrei Emeltchenko097db762012-03-09 14:16:17 +02003752 BT_DBG("psm 0x%2.2x scid 0x%4.4x", __le16_to_cpu(psm), scid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003753
3754 /* Check if we have socket listening on psm */
Marcel Holtmann6f59b902013-10-13 05:24:01 -07003755 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
Johan Hedbergbf20fd42013-05-14 13:23:13 +03003756 &conn->hcon->dst, ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03003757 if (!pchan) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003758 result = L2CAP_CR_BAD_PSM;
3759 goto sendresp;
3760 }
3761
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003762 mutex_lock(&conn->chan_lock);
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003763 l2cap_chan_lock(pchan);
Gustavo F. Padovane0f0cb52010-11-01 18:43:53 +00003764
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003765 /* Check if the ACL is secure enough (if not SDP) */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003766 if (psm != cpu_to_le16(L2CAP_PSM_SDP) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003767 !hci_conn_check_link_mode(conn->hcon)) {
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02003768 conn->disc_reason = HCI_ERROR_AUTH_FAILURE;
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +02003769 result = L2CAP_CR_SEC_BLOCK;
3770 goto response;
3771 }
3772
Linus Torvalds1da177e2005-04-16 15:20:36 -07003773 result = L2CAP_CR_NO_MEM;
3774
Gustavo Padovan2dfa1002012-05-27 22:27:58 -03003775 /* Check if we already have channel with that dcid */
3776 if (__l2cap_get_chan_by_dcid(conn, scid))
3777 goto response;
3778
Gustavo Padovan80b98022012-05-27 22:27:51 -03003779 chan = pchan->ops->new_connection(pchan);
Gustavo F. Padovan80808e42011-05-16 17:24:37 -03003780 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003781 goto response;
3782
Syam Sidhardhan330b6c12013-08-06 01:59:12 +09003783 /* For certain devices (ex: HID mouse), support for authentication,
3784 * pairing and bonding is optional. For such devices, inorder to avoid
3785 * the ACL alive for too long after L2CAP disconnection, reset the ACL
3786 * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
3787 */
3788 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
3789
Marcel Holtmann7eafc592013-10-13 08:12:47 -07003790 bacpy(&chan->src, &conn->hcon->src);
3791 bacpy(&chan->dst, &conn->hcon->dst);
Marcel Holtmann4f1654e2013-10-13 08:50:41 -07003792 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
3793 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003794 chan->psm = psm;
3795 chan->dcid = scid;
Mat Martineau17009152012-10-23 15:24:07 -07003796 chan->local_amp_id = amp_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003798 __l2cap_chan_add(conn, chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003799
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003800 dcid = chan->scid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003801
Gustavo Padovan8d836d72013-10-15 19:24:47 -03003802 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003803
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003804 chan->ident = cmd->ident;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003805
Marcel Holtmann984947d2009-02-06 23:35:19 +01003806 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
Johan Hedberge7cafc42014-07-17 15:35:38 +03003807 if (l2cap_chan_check_security(chan, false)) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07003808 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003809 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003810 result = L2CAP_CR_PEND;
3811 status = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08003812 chan->ops->defer(chan);
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003813 } else {
Mat Martineau17009152012-10-23 15:24:07 -07003814 /* Force pending result for AMP controllers.
3815 * The connection will succeed after the
3816 * physical link is up.
3817 */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003818 if (amp_id == AMP_ID_BREDR) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003819 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau17009152012-10-23 15:24:07 -07003820 result = L2CAP_CR_SUCCESS;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003821 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003822 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07003823 result = L2CAP_CR_PEND;
Mat Martineau17009152012-10-23 15:24:07 -07003824 }
Marcel Holtmannf66dc812009-01-15 21:57:00 +01003825 status = L2CAP_CS_NO_INFO;
3826 }
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003827 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003828 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003829 result = L2CAP_CR_PEND;
3830 status = L2CAP_CS_AUTHEN_PEND;
3831 }
3832 } else {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02003833 l2cap_state_change(chan, BT_CONNECT2);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003834 result = L2CAP_CR_PEND;
3835 status = L2CAP_CS_NO_INFO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003836 }
3837
Linus Torvalds1da177e2005-04-16 15:20:36 -07003838response:
Gustavo Padovan8ffb9292013-10-21 14:21:41 -02003839 l2cap_chan_unlock(pchan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003840 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03003841 l2cap_chan_put(pchan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003842
3843sendresp:
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -07003844 rsp.scid = cpu_to_le16(scid);
3845 rsp.dcid = cpu_to_le16(dcid);
3846 rsp.result = cpu_to_le16(result);
3847 rsp.status = cpu_to_le16(status);
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003848 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003849
3850 if (result == L2CAP_CR_PEND && status == L2CAP_CS_NO_INFO) {
3851 struct l2cap_info_req info;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07003852 info.type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003853
3854 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT;
3855 conn->info_ident = l2cap_get_ident(conn);
3856
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08003857 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003858
Gustavo Padovan2d792812012-10-06 10:07:01 +01003859 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ,
3860 sizeof(info), &info);
Marcel Holtmann79d554a2008-07-14 20:13:44 +02003861 }
3862
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003863 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) &&
Gustavo Padovan2d792812012-10-06 10:07:01 +01003864 result == L2CAP_CR_SUCCESS) {
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003865 u8 buf[128];
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003866 set_bit(CONF_REQ_SENT, &chan->conf_state);
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003867 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003868 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003869 chan->num_conf_req++;
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003870 }
Mat Martineau17009152012-10-23 15:24:07 -07003871
3872 return chan;
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003873}
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003874
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003875static int l2cap_connect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003876 struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data)
Mat Martineau4c89b6a2012-10-11 17:48:22 +03003877{
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303878 struct hci_dev *hdev = conn->hcon->hdev;
3879 struct hci_conn *hcon = conn->hcon;
3880
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003881 if (cmd_len < sizeof(struct l2cap_conn_req))
3882 return -EPROTO;
3883
Jaganath Kanakkassery7b064ed2013-01-10 10:28:35 +05303884 hci_dev_lock(hdev);
3885 if (test_bit(HCI_MGMT, &hdev->dev_flags) &&
3886 !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags))
3887 mgmt_device_connected(hdev, &hcon->dst, hcon->type,
3888 hcon->dst_type, 0, NULL, 0,
3889 hcon->dev_class);
3890 hci_dev_unlock(hdev);
3891
Gustavo Padovan300229f2012-10-12 19:40:40 +08003892 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003893 return 0;
3894}
3895
Mat Martineau5909cf32012-10-23 15:24:08 -07003896static int l2cap_connect_create_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003897 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
3898 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003899{
3900 struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data;
3901 u16 scid, dcid, result, status;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003902 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003903 u8 req[128];
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003904 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003905
Johan Hedbergcb3b3152013-05-28 13:46:30 +03003906 if (cmd_len < sizeof(*rsp))
3907 return -EPROTO;
3908
Linus Torvalds1da177e2005-04-16 15:20:36 -07003909 scid = __le16_to_cpu(rsp->scid);
3910 dcid = __le16_to_cpu(rsp->dcid);
3911 result = __le16_to_cpu(rsp->result);
3912 status = __le16_to_cpu(rsp->status);
3913
Andrei Emeltchenko1b009c92012-02-21 12:54:54 +02003914 BT_DBG("dcid 0x%4.4x scid 0x%4.4x result 0x%2.2x status 0x%2.2x",
Gustavo Padovan2d792812012-10-06 10:07:01 +01003915 dcid, scid, result, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003916
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003917 mutex_lock(&conn->chan_lock);
3918
Linus Torvalds1da177e2005-04-16 15:20:36 -07003919 if (scid) {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003920 chan = __l2cap_get_chan_by_scid(conn, scid);
3921 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003922 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003923 goto unlock;
3924 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003925 } else {
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003926 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
3927 if (!chan) {
Johan Hedberg21870b52013-09-16 13:05:14 +03003928 err = -EBADSLT;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003929 goto unlock;
3930 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003931 }
3932
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003933 err = 0;
3934
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003935 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003936
Linus Torvalds1da177e2005-04-16 15:20:36 -07003937 switch (result) {
3938 case L2CAP_CR_SUCCESS:
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03003939 l2cap_state_change(chan, BT_CONFIG);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03003940 chan->ident = 0;
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03003941 chan->dcid = dcid;
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003942 clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01003943
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003944 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state))
Gustavo F. Padovane9aeb2d2010-07-08 20:08:18 -03003945 break;
3946
Linus Torvalds1da177e2005-04-16 15:20:36 -07003947 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01003948 l2cap_build_conf_req(chan, req), req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03003949 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003950 break;
3951
3952 case L2CAP_CR_PEND:
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03003953 set_bit(CONF_CONNECT_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003954 break;
3955
3956 default:
Gustavo F. Padovan48454072011-03-25 00:22:30 -03003957 l2cap_chan_del(chan, ECONNREFUSED);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003958 break;
3959 }
3960
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02003961 l2cap_chan_unlock(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02003962
3963unlock:
3964 mutex_unlock(&conn->chan_lock);
3965
3966 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003967}
3968
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003969static inline void set_default_fcs(struct l2cap_chan *chan)
Mat Martineau8c462b62010-08-24 15:35:42 -07003970{
3971 /* FCS is enabled only in ERTM or streaming mode, if one or both
3972 * sides request it.
3973 */
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03003974 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING)
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003975 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenkof2592d32012-11-29 17:46:08 +02003976 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state))
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03003977 chan->fcs = L2CAP_FCS_CRC16;
Mat Martineau8c462b62010-08-24 15:35:42 -07003978}
3979
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03003980static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data,
3981 u8 ident, u16 flags)
3982{
3983 struct l2cap_conn *conn = chan->conn;
3984
3985 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident,
3986 flags);
3987
3988 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state);
3989 set_bit(CONF_OUTPUT_DONE, &chan->conf_state);
3990
3991 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP,
3992 l2cap_build_conf_rsp(chan, data,
3993 L2CAP_CONF_SUCCESS, flags), data);
3994}
3995
Johan Hedberg662d6522013-10-16 11:20:47 +03003996static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident,
3997 u16 scid, u16 dcid)
3998{
3999 struct l2cap_cmd_rej_cid rej;
4000
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004001 rej.reason = cpu_to_le16(L2CAP_REJ_INVALID_CID);
Johan Hedberg662d6522013-10-16 11:20:47 +03004002 rej.scid = __cpu_to_le16(scid);
4003 rej.dcid = __cpu_to_le16(dcid);
4004
4005 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
4006}
4007
Gustavo Padovan2d792812012-10-06 10:07:01 +01004008static inline int l2cap_config_req(struct l2cap_conn *conn,
4009 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4010 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004011{
4012 struct l2cap_conf_req *req = (struct l2cap_conf_req *) data;
4013 u16 dcid, flags;
4014 u8 rsp[64];
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004015 struct l2cap_chan *chan;
Mat Martineau3c588192012-04-11 10:48:42 -07004016 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004017
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004018 if (cmd_len < sizeof(*req))
4019 return -EPROTO;
4020
Linus Torvalds1da177e2005-04-16 15:20:36 -07004021 dcid = __le16_to_cpu(req->dcid);
4022 flags = __le16_to_cpu(req->flags);
4023
4024 BT_DBG("dcid 0x%4.4x flags 0x%2.2x", dcid, flags);
4025
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004026 chan = l2cap_get_chan_by_scid(conn, dcid);
Johan Hedberg662d6522013-10-16 11:20:47 +03004027 if (!chan) {
4028 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0);
4029 return 0;
4030 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004031
David S. Miller033b1142011-07-21 13:38:42 -07004032 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2) {
Johan Hedberg662d6522013-10-16 11:20:47 +03004033 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4034 chan->dcid);
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004035 goto unlock;
Gustavo F. Padovandf6bd742010-06-14 02:26:15 -03004036 }
Marcel Holtmann354f60a2006-11-18 22:15:20 +01004037
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004038 /* Reject if config buffer is too small. */
Al Viro88219a02007-07-29 00:17:25 -07004039 len = cmd_len - sizeof(*req);
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004040 if (chan->conf_len + len > sizeof(chan->conf_req)) {
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004041 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004042 l2cap_build_conf_rsp(chan, rsp,
4043 L2CAP_CONF_REJECT, flags), rsp);
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004044 goto unlock;
4045 }
4046
4047 /* Store config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004048 memcpy(chan->conf_req + chan->conf_len, req->data, len);
4049 chan->conf_len += len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004050
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004051 if (flags & L2CAP_CONF_FLAG_CONTINUATION) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07004052 /* Incomplete config. Send empty response. */
4053 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004054 l2cap_build_conf_rsp(chan, rsp,
4055 L2CAP_CONF_SUCCESS, flags), rsp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004056 goto unlock;
4057 }
4058
4059 /* Complete config. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004060 len = l2cap_parse_conf_req(chan, rsp);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004061 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004062 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004063 goto unlock;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004064 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004065
Mat Martineau1500109b2012-10-23 15:24:15 -07004066 chan->ident = cmd->ident;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004067 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004068 chan->num_conf_rsp++;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004069
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004070 /* Reset config buffer. */
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004071 chan->conf_len = 0;
Marcel Holtmann5dee9e72007-05-24 14:27:19 +02004072
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004073 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state))
Marcel Holtmann876d9482007-10-20 13:35:42 +02004074 goto unlock;
4075
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004076 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004077 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004078
Mat Martineau105bdf92012-04-27 16:50:48 -07004079 if (chan->mode == L2CAP_MODE_ERTM ||
4080 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004081 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004082
Mat Martineau3c588192012-04-11 10:48:42 -07004083 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004084 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004085 else
4086 l2cap_chan_ready(chan);
4087
Marcel Holtmann876d9482007-10-20 13:35:42 +02004088 goto unlock;
4089 }
4090
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004091 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) {
Marcel Holtmann79d554a2008-07-14 20:13:44 +02004092 u8 buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07004093 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004094 l2cap_build_conf_req(chan, buf), buf);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004095 chan->num_conf_req++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004096 }
4097
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004098 /* Got Conf Rsp PENDING from remote side and asume we sent
4099 Conf Rsp PENDING in the code above */
4100 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) &&
Andrei Emeltchenko29d8a592012-09-21 12:30:05 +03004101 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004102
4103 /* check compatibility */
4104
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004105 /* Send rsp for BR/EDR channel */
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004106 if (!chan->hs_hcon)
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004107 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags);
4108 else
4109 chan->ident = cmd->ident;
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004110 }
4111
Linus Torvalds1da177e2005-04-16 15:20:36 -07004112unlock:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004113 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004114 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004115}
4116
Gustavo Padovan2d792812012-10-06 10:07:01 +01004117static inline int l2cap_config_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004118 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4119 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004120{
4121 struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data;
4122 u16 scid, flags, result;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004123 struct l2cap_chan *chan;
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004124 int len = cmd_len - sizeof(*rsp);
Mat Martineau3c588192012-04-11 10:48:42 -07004125 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004126
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004127 if (cmd_len < sizeof(*rsp))
4128 return -EPROTO;
4129
Linus Torvalds1da177e2005-04-16 15:20:36 -07004130 scid = __le16_to_cpu(rsp->scid);
4131 flags = __le16_to_cpu(rsp->flags);
4132 result = __le16_to_cpu(rsp->result);
4133
Andrei Emeltchenko61386cb2012-03-12 12:13:07 +02004134 BT_DBG("scid 0x%4.4x flags 0x%2.2x result 0x%2.2x len %d", scid, flags,
4135 result, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004136
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03004137 chan = l2cap_get_chan_by_scid(conn, scid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004138 if (!chan)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004139 return 0;
4140
4141 switch (result) {
4142 case L2CAP_CONF_SUCCESS:
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004143 l2cap_conf_rfc_get(chan, rsp->data, len);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004144 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004145 break;
4146
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004147 case L2CAP_CONF_PENDING:
4148 set_bit(CONF_REM_CONF_PEND, &chan->conf_state);
4149
4150 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) {
4151 char buf[64];
4152
4153 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004154 buf, &result);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004155 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004156 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004157 goto done;
4158 }
4159
Andrei Emeltchenkof351bc72012-10-31 15:46:35 +02004160 if (!chan->hs_hcon) {
Andrei Emeltchenko79de8862012-10-15 11:58:42 +03004161 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident,
4162 0);
Andrei Emeltchenko5ce66b52012-10-31 15:46:30 +02004163 } else {
4164 if (l2cap_check_efs(chan)) {
4165 amp_create_logical_link(chan);
4166 chan->ident = cmd->ident;
4167 }
4168 }
Andrei Emeltchenko0e8b2072011-10-17 14:35:32 +03004169 }
4170 goto done;
4171
Linus Torvalds1da177e2005-04-16 15:20:36 -07004172 case L2CAP_CONF_UNACCEPT:
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004173 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) {
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004174 char req[64];
4175
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004176 if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004177 l2cap_send_disconn_req(chan, ECONNRESET);
Andrei Emeltchenkoc2c77ec2010-03-19 10:26:28 +02004178 goto done;
4179 }
4180
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004181 /* throw out any old stored conf requests */
4182 result = L2CAP_CONF_SUCCESS;
Gustavo F. Padovanb4450032011-04-12 18:15:09 -03004183 len = l2cap_parse_conf_rsp(chan, rsp->data, len,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004184 req, &result);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004185 if (len < 0) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004186 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004187 goto done;
4188 }
4189
4190 l2cap_send_cmd(conn, l2cap_get_ident(conn),
Gustavo Padovan2d792812012-10-06 10:07:01 +01004191 L2CAP_CONF_REQ, len, req);
Gustavo F. Padovan73ffa902011-03-25 14:16:54 -03004192 chan->num_conf_req++;
Gustavo F. Padovanf2fcfcd2009-07-04 15:06:24 -03004193 if (result != L2CAP_CONF_SUCCESS)
4194 goto done;
4195 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004196 }
4197
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09004198 default:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004199 l2cap_chan_set_err(chan, ECONNRESET);
Andrei Emeltchenko2e0052e2012-02-21 12:54:58 +02004200
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08004201 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004202 l2cap_send_disconn_req(chan, ECONNRESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004203 goto done;
4204 }
4205
Andrei Emeltchenko59e54bd2012-05-23 15:44:06 +03004206 if (flags & L2CAP_CONF_FLAG_CONTINUATION)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004207 goto done;
4208
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004209 set_bit(CONF_INPUT_DONE, &chan->conf_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004210
Gustavo F. Padovanc1360a12011-06-10 17:02:12 -03004211 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03004212 set_default_fcs(chan);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004213
Mat Martineau105bdf92012-04-27 16:50:48 -07004214 if (chan->mode == L2CAP_MODE_ERTM ||
4215 chan->mode == L2CAP_MODE_STREAMING)
Mat Martineau3c588192012-04-11 10:48:42 -07004216 err = l2cap_ertm_init(chan);
Gustavo F. Padovan0565c1c2009-10-03 02:34:36 -03004217
Mat Martineau3c588192012-04-11 10:48:42 -07004218 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004219 l2cap_send_disconn_req(chan, -err);
Mat Martineau3c588192012-04-11 10:48:42 -07004220 else
4221 l2cap_chan_ready(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004222 }
4223
4224done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004225 l2cap_chan_unlock(chan);
Mat Martineau3c588192012-04-11 10:48:42 -07004226 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004227}
4228
Gustavo Padovan2d792812012-10-06 10:07:01 +01004229static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004230 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4231 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004232{
4233 struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data;
4234 struct l2cap_disconn_rsp rsp;
4235 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004236 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004237
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004238 if (cmd_len != sizeof(*req))
4239 return -EPROTO;
4240
Linus Torvalds1da177e2005-04-16 15:20:36 -07004241 scid = __le16_to_cpu(req->scid);
4242 dcid = __le16_to_cpu(req->dcid);
4243
4244 BT_DBG("scid 0x%4.4x dcid 0x%4.4x", scid, dcid);
4245
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004246 mutex_lock(&conn->chan_lock);
4247
4248 chan = __l2cap_get_chan_by_scid(conn, dcid);
4249 if (!chan) {
4250 mutex_unlock(&conn->chan_lock);
Johan Hedberg662d6522013-10-16 11:20:47 +03004251 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid);
4252 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004253 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004254
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004255 l2cap_chan_lock(chan);
4256
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03004257 rsp.dcid = cpu_to_le16(chan->scid);
4258 rsp.scid = cpu_to_le16(chan->dcid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004259 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4260
Gustavo Padovan5ec1bbe2013-10-15 19:24:48 -03004261 chan->ops->set_shutdown(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004262
Mat Martineau61d6ef32012-04-27 16:50:50 -07004263 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004264 l2cap_chan_del(chan, ECONNRESET);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004265
4266 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004267
Gustavo Padovan80b98022012-05-27 22:27:51 -03004268 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004269 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004270
4271 mutex_unlock(&conn->chan_lock);
4272
Linus Torvalds1da177e2005-04-16 15:20:36 -07004273 return 0;
4274}
4275
Gustavo Padovan2d792812012-10-06 10:07:01 +01004276static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004277 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4278 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004279{
4280 struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data;
4281 u16 dcid, scid;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004282 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004283
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004284 if (cmd_len != sizeof(*rsp))
4285 return -EPROTO;
4286
Linus Torvalds1da177e2005-04-16 15:20:36 -07004287 scid = __le16_to_cpu(rsp->scid);
4288 dcid = __le16_to_cpu(rsp->dcid);
4289
4290 BT_DBG("dcid 0x%4.4x scid 0x%4.4x", dcid, scid);
4291
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004292 mutex_lock(&conn->chan_lock);
4293
4294 chan = __l2cap_get_chan_by_scid(conn, scid);
4295 if (!chan) {
4296 mutex_unlock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004297 return 0;
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004298 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004299
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004300 l2cap_chan_lock(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004301
Mat Martineau61d6ef32012-04-27 16:50:50 -07004302 l2cap_chan_hold(chan);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03004303 l2cap_chan_del(chan, 0);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02004304
4305 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07004306
Gustavo Padovan80b98022012-05-27 22:27:51 -03004307 chan->ops->close(chan);
Mat Martineau61d6ef32012-04-27 16:50:50 -07004308 l2cap_chan_put(chan);
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02004309
4310 mutex_unlock(&conn->chan_lock);
4311
Linus Torvalds1da177e2005-04-16 15:20:36 -07004312 return 0;
4313}
4314
Gustavo Padovan2d792812012-10-06 10:07:01 +01004315static inline int l2cap_information_req(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004316 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4317 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004318{
4319 struct l2cap_info_req *req = (struct l2cap_info_req *) data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07004320 u16 type;
4321
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004322 if (cmd_len != sizeof(*req))
4323 return -EPROTO;
4324
Linus Torvalds1da177e2005-04-16 15:20:36 -07004325 type = __le16_to_cpu(req->type);
4326
4327 BT_DBG("type 0x%4.4x", type);
4328
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004329 if (type == L2CAP_IT_FEAT_MASK) {
4330 u8 buf[8];
Marcel Holtmann44dd46d2009-05-02 19:09:01 -07004331 u32 feat_mask = l2cap_feat_mask;
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004332 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004333 rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK);
4334 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03004335 if (!disable_ertm)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03004336 feat_mask |= L2CAP_FEAT_ERTM | L2CAP_FEAT_STREAMING
Gustavo Padovan2d792812012-10-06 10:07:01 +01004337 | L2CAP_FEAT_FCS;
Marcel Holtmann848566b2013-10-01 22:59:22 -07004338 if (conn->hs_enabled)
Andrei Emeltchenko6327eb92011-10-11 13:37:42 +03004339 feat_mask |= L2CAP_FEAT_EXT_FLOW
Gustavo Padovan2d792812012-10-06 10:07:01 +01004340 | L2CAP_FEAT_EXT_WINDOW;
Andrei Emeltchenkoa5fd6f32011-09-16 16:26:32 +03004341
Gustavo F. Padovan1b7bf4e2009-08-24 00:45:20 -03004342 put_unaligned_le32(feat_mask, rsp->data);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004343 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4344 buf);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004345 } else if (type == L2CAP_IT_FIXED_CHAN) {
4346 u8 buf[12];
4347 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf;
Mat Martineau50a147c2011-11-02 16:18:34 -07004348
Marcel Holtmann848566b2013-10-01 22:59:22 -07004349 if (conn->hs_enabled)
Mat Martineau50a147c2011-11-02 16:18:34 -07004350 l2cap_fixed_chan[0] |= L2CAP_FC_A2MP;
4351 else
4352 l2cap_fixed_chan[0] &= ~L2CAP_FC_A2MP;
4353
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004354 rsp->type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
4355 rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS);
Andrei Emeltchenkoc6337ea2011-10-20 17:02:44 +03004356 memcpy(rsp->data, l2cap_fixed_chan, sizeof(l2cap_fixed_chan));
Gustavo Padovan2d792812012-10-06 10:07:01 +01004357 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf),
4358 buf);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004359 } else {
4360 struct l2cap_info_rsp rsp;
4361 rsp.type = cpu_to_le16(type);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004362 rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP);
Gustavo Padovan2d792812012-10-06 10:07:01 +01004363 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp),
4364 &rsp);
Marcel Holtmannf0709e02007-10-20 13:38:51 +02004365 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07004366
4367 return 0;
4368}
4369
Gustavo Padovan2d792812012-10-06 10:07:01 +01004370static inline int l2cap_information_rsp(struct l2cap_conn *conn,
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004371 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
4372 u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004373{
4374 struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data;
4375 u16 type, result;
4376
Jaganath Kanakkassery3f6fa3d2013-06-21 19:55:11 +05304377 if (cmd_len < sizeof(*rsp))
Johan Hedbergcb3b3152013-05-28 13:46:30 +03004378 return -EPROTO;
4379
Linus Torvalds1da177e2005-04-16 15:20:36 -07004380 type = __le16_to_cpu(rsp->type);
4381 result = __le16_to_cpu(rsp->result);
4382
4383 BT_DBG("type 0x%4.4x result 0x%2.2x", type, result);
4384
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004385 /* L2CAP Info req/rsp are unbound to channels, add extra checks */
4386 if (cmd->ident != conn->info_ident ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01004387 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
Andrei Emeltchenkoe90165b2011-03-25 11:31:41 +02004388 return 0;
4389
Ulisses Furquim17cd3f32012-01-30 18:26:28 -02004390 cancel_delayed_work(&conn->info_timer);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004391
Ville Tervoadb08ed2010-08-04 09:43:33 +03004392 if (result != L2CAP_IR_SUCCESS) {
4393 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4394 conn->info_ident = 0;
4395
4396 l2cap_conn_start(conn);
4397
4398 return 0;
4399 }
4400
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004401 switch (type) {
4402 case L2CAP_IT_FEAT_MASK:
Harvey Harrison83985312008-05-02 16:25:46 -07004403 conn->feat_mask = get_unaligned_le32(rsp->data);
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004404
Marcel Holtmann47ec1dcd2009-05-02 18:57:55 -07004405 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004406 struct l2cap_info_req req;
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004407 req.type = cpu_to_le16(L2CAP_IT_FIXED_CHAN);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004408
4409 conn->info_ident = l2cap_get_ident(conn);
4410
4411 l2cap_send_cmd(conn, conn->info_ident,
Gustavo Padovan2d792812012-10-06 10:07:01 +01004412 L2CAP_INFO_REQ, sizeof(req), &req);
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004413 } else {
4414 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
4415 conn->info_ident = 0;
4416
4417 l2cap_conn_start(conn);
4418 }
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004419 break;
4420
4421 case L2CAP_IT_FIXED_CHAN:
4422 conn->fixed_chan_mask = rsp->data[0];
Marcel Holtmann984947d2009-02-06 23:35:19 +01004423 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
Marcel Holtmanne1027a72009-02-09 09:18:02 +01004424 conn->info_ident = 0;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004425
4426 l2cap_conn_start(conn);
Andrei Emeltchenko978c93b2012-02-29 10:41:41 +02004427 break;
Marcel Holtmann984947d2009-02-06 23:35:19 +01004428 }
Marcel Holtmann4e8402a2007-10-20 13:37:56 +02004429
Linus Torvalds1da177e2005-04-16 15:20:36 -07004430 return 0;
4431}
4432
Mat Martineau17009152012-10-23 15:24:07 -07004433static int l2cap_create_channel_req(struct l2cap_conn *conn,
4434 struct l2cap_cmd_hdr *cmd,
4435 u16 cmd_len, void *data)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004436{
4437 struct l2cap_create_chan_req *req = data;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004438 struct l2cap_create_chan_rsp rsp;
Mat Martineau17009152012-10-23 15:24:07 -07004439 struct l2cap_chan *chan;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004440 struct hci_dev *hdev;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004441 u16 psm, scid;
4442
4443 if (cmd_len != sizeof(*req))
4444 return -EPROTO;
4445
Marcel Holtmann848566b2013-10-01 22:59:22 -07004446 if (!conn->hs_enabled)
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004447 return -EINVAL;
4448
4449 psm = le16_to_cpu(req->psm);
4450 scid = le16_to_cpu(req->scid);
4451
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004452 BT_DBG("psm 0x%2.2x, scid 0x%4.4x, amp_id %d", psm, scid, req->amp_id);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004453
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004454 /* For controller id 0 make BR/EDR connection */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004455 if (req->amp_id == AMP_ID_BREDR) {
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004456 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4457 req->amp_id);
4458 return 0;
4459 }
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004460
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004461 /* Validate AMP controller id */
4462 hdev = hci_dev_get(req->amp_id);
4463 if (!hdev)
4464 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004465
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004466 if (hdev->dev_type != HCI_AMP || !test_bit(HCI_UP, &hdev->flags)) {
Mat Martineau17009152012-10-23 15:24:07 -07004467 hci_dev_put(hdev);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004468 goto error;
Mat Martineau17009152012-10-23 15:24:07 -07004469 }
4470
4471 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP,
4472 req->amp_id);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004473 if (chan) {
4474 struct amp_mgr *mgr = conn->hcon->amp_mgr;
4475 struct hci_conn *hs_hcon;
4476
Marcel Holtmann98e0f7e2013-10-13 02:23:40 -07004477 hs_hcon = hci_conn_hash_lookup_ba(hdev, AMP_LINK,
4478 &conn->hcon->dst);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004479 if (!hs_hcon) {
4480 hci_dev_put(hdev);
Johan Hedberg662d6522013-10-16 11:20:47 +03004481 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid,
4482 chan->dcid);
4483 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004484 }
4485
4486 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon);
4487
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004488 mgr->bredr_chan = chan;
4489 chan->hs_hcon = hs_hcon;
Andrei Emeltchenkofd45bf42012-11-20 17:16:22 +02004490 chan->fcs = L2CAP_FCS_NONE;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004491 conn->mtu = hdev->block_mtu;
4492 }
4493
4494 hci_dev_put(hdev);
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004495
4496 return 0;
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004497
4498error:
4499 rsp.dcid = 0;
4500 rsp.scid = cpu_to_le16(scid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004501 rsp.result = cpu_to_le16(L2CAP_CR_BAD_AMP);
4502 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Andrei Emeltchenko6e1df6a2012-11-01 15:37:02 +02004503
4504 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP,
4505 sizeof(rsp), &rsp);
4506
Johan Hedbergdc280802013-09-16 13:05:13 +03004507 return 0;
Mat Martineauf94ff6f2011-11-02 16:18:32 -07004508}
4509
Mat Martineau8eb200b2012-10-23 15:24:17 -07004510static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id)
4511{
4512 struct l2cap_move_chan_req req;
4513 u8 ident;
4514
4515 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id);
4516
4517 ident = l2cap_get_ident(chan->conn);
4518 chan->ident = ident;
4519
4520 req.icid = cpu_to_le16(chan->scid);
4521 req.dest_amp_id = dest_amp_id;
4522
4523 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req),
4524 &req);
4525
4526 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4527}
4528
Mat Martineau1500109b2012-10-23 15:24:15 -07004529static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004530{
4531 struct l2cap_move_chan_rsp rsp;
4532
Mat Martineau1500109b2012-10-23 15:24:15 -07004533 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004534
Mat Martineau1500109b2012-10-23 15:24:15 -07004535 rsp.icid = cpu_to_le16(chan->dcid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004536 rsp.result = cpu_to_le16(result);
4537
Mat Martineau1500109b2012-10-23 15:24:15 -07004538 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP,
4539 sizeof(rsp), &rsp);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004540}
4541
Mat Martineau5b155ef2012-10-23 15:24:14 -07004542static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004543{
4544 struct l2cap_move_chan_cfm cfm;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004545
Mat Martineau5b155ef2012-10-23 15:24:14 -07004546 BT_DBG("chan %p, result 0x%4.4x", chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004547
Mat Martineau5b155ef2012-10-23 15:24:14 -07004548 chan->ident = l2cap_get_ident(chan->conn);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004549
Mat Martineau5b155ef2012-10-23 15:24:14 -07004550 cfm.icid = cpu_to_le16(chan->scid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004551 cfm.result = cpu_to_le16(result);
4552
Mat Martineau5b155ef2012-10-23 15:24:14 -07004553 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM,
4554 sizeof(cfm), &cfm);
4555
4556 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT);
4557}
4558
4559static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid)
4560{
4561 struct l2cap_move_chan_cfm cfm;
4562
4563 BT_DBG("conn %p, icid 0x%4.4x", conn, icid);
4564
4565 cfm.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004566 cfm.result = cpu_to_le16(L2CAP_MC_UNCONFIRMED);
Mat Martineau5b155ef2012-10-23 15:24:14 -07004567
4568 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM,
4569 sizeof(cfm), &cfm);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004570}
4571
4572static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004573 u16 icid)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004574{
4575 struct l2cap_move_chan_cfm_rsp rsp;
4576
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004577 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004578
4579 rsp.icid = cpu_to_le16(icid);
4580 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp);
4581}
4582
Mat Martineau5f3847a2012-10-23 15:24:12 -07004583static void __release_logical_link(struct l2cap_chan *chan)
4584{
4585 chan->hs_hchan = NULL;
4586 chan->hs_hcon = NULL;
4587
4588 /* Placeholder - release the logical link */
4589}
4590
Mat Martineau1500109b2012-10-23 15:24:15 -07004591static void l2cap_logical_fail(struct l2cap_chan *chan)
4592{
4593 /* Logical link setup failed */
4594 if (chan->state != BT_CONNECTED) {
4595 /* Create channel failure, disconnect */
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004596 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineau1500109b2012-10-23 15:24:15 -07004597 return;
4598 }
4599
4600 switch (chan->move_role) {
4601 case L2CAP_MOVE_ROLE_RESPONDER:
4602 l2cap_move_done(chan);
4603 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP);
4604 break;
4605 case L2CAP_MOVE_ROLE_INITIATOR:
4606 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP ||
4607 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) {
4608 /* Remote has only sent pending or
4609 * success responses, clean up
4610 */
4611 l2cap_move_done(chan);
4612 }
4613
4614 /* Other amp move states imply that the move
4615 * has already aborted
4616 */
4617 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
4618 break;
4619 }
4620}
4621
4622static void l2cap_logical_finish_create(struct l2cap_chan *chan,
4623 struct hci_chan *hchan)
4624{
4625 struct l2cap_conf_rsp rsp;
Mat Martineau1500109b2012-10-23 15:24:15 -07004626
Andrei Emeltchenko336178a2012-10-31 15:46:27 +02004627 chan->hs_hchan = hchan;
Mat Martineau1500109b2012-10-23 15:24:15 -07004628 chan->hs_hcon->l2cap_data = chan->conn;
4629
Andrei Emeltchenko35ba9562012-10-25 15:20:43 +03004630 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0);
Mat Martineau1500109b2012-10-23 15:24:15 -07004631
4632 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
Andrei Emeltchenkofe79c6f2012-10-25 15:20:42 +03004633 int err;
Mat Martineau1500109b2012-10-23 15:24:15 -07004634
4635 set_default_fcs(chan);
4636
4637 err = l2cap_ertm_init(chan);
4638 if (err < 0)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02004639 l2cap_send_disconn_req(chan, -err);
Mat Martineau1500109b2012-10-23 15:24:15 -07004640 else
4641 l2cap_chan_ready(chan);
4642 }
4643}
4644
4645static void l2cap_logical_finish_move(struct l2cap_chan *chan,
4646 struct hci_chan *hchan)
4647{
4648 chan->hs_hcon = hchan->conn;
4649 chan->hs_hcon->l2cap_data = chan->conn;
4650
4651 BT_DBG("move_state %d", chan->move_state);
4652
4653 switch (chan->move_state) {
4654 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4655 /* Move confirm will be sent after a success
4656 * response is received
4657 */
4658 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4659 break;
4660 case L2CAP_MOVE_WAIT_LOGICAL_CFM:
4661 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4662 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4663 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
4664 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4665 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4666 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4667 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4668 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4669 }
4670 break;
4671 default:
4672 /* Move was not in expected state, free the channel */
4673 __release_logical_link(chan);
4674
4675 chan->move_state = L2CAP_MOVE_STABLE;
4676 }
4677}
4678
4679/* Call with chan locked */
Andrei Emeltchenko27695fb2012-10-25 15:20:45 +03004680void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan,
4681 u8 status)
Mat Martineau5b155ef2012-10-23 15:24:14 -07004682{
Mat Martineau1500109b2012-10-23 15:24:15 -07004683 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status);
4684
4685 if (status) {
4686 l2cap_logical_fail(chan);
4687 __release_logical_link(chan);
4688 return;
4689 }
4690
4691 if (chan->state != BT_CONNECTED) {
4692 /* Ignore logical link if channel is on BR/EDR */
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004693 if (chan->local_amp_id != AMP_ID_BREDR)
Mat Martineau1500109b2012-10-23 15:24:15 -07004694 l2cap_logical_finish_create(chan, hchan);
4695 } else {
4696 l2cap_logical_finish_move(chan, hchan);
4697 }
Mat Martineau5b155ef2012-10-23 15:24:14 -07004698}
4699
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004700void l2cap_move_start(struct l2cap_chan *chan)
4701{
4702 BT_DBG("chan %p", chan);
4703
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004704 if (chan->local_amp_id == AMP_ID_BREDR) {
Mat Martineau3f7a56c2012-10-23 15:24:23 -07004705 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED)
4706 return;
4707 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4708 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4709 /* Placeholder - start physical link setup */
4710 } else {
4711 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR;
4712 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
4713 chan->move_id = 0;
4714 l2cap_move_setup(chan);
4715 l2cap_send_move_chan_req(chan, 0);
4716 }
4717}
4718
Mat Martineau8eb200b2012-10-23 15:24:17 -07004719static void l2cap_do_create(struct l2cap_chan *chan, int result,
4720 u8 local_amp_id, u8 remote_amp_id)
4721{
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004722 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
4723 local_amp_id, remote_amp_id);
4724
Andrei Emeltchenko12d6cc62012-11-14 17:39:31 +02004725 chan->fcs = L2CAP_FCS_NONE;
4726
Andrei Emeltchenko62748ca2012-11-20 17:16:19 +02004727 /* Outgoing channel on AMP */
4728 if (chan->state == BT_CONNECT) {
4729 if (result == L2CAP_CR_SUCCESS) {
4730 chan->local_amp_id = local_amp_id;
4731 l2cap_send_create_chan_req(chan, remote_amp_id);
4732 } else {
4733 /* Revert to BR/EDR connect */
4734 l2cap_send_conn_req(chan);
4735 }
4736
4737 return;
4738 }
4739
4740 /* Incoming channel on AMP */
4741 if (__l2cap_no_conn_pending(chan)) {
Mat Martineau8eb200b2012-10-23 15:24:17 -07004742 struct l2cap_conn_rsp rsp;
4743 char buf[128];
4744 rsp.scid = cpu_to_le16(chan->dcid);
4745 rsp.dcid = cpu_to_le16(chan->scid);
4746
Mat Martineau8eb200b2012-10-23 15:24:17 -07004747 if (result == L2CAP_CR_SUCCESS) {
4748 /* Send successful response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004749 rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
4750 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004751 } else {
4752 /* Send negative response */
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004753 rsp.result = cpu_to_le16(L2CAP_CR_NO_MEM);
4754 rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004755 }
4756
4757 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP,
4758 sizeof(rsp), &rsp);
4759
4760 if (result == L2CAP_CR_SUCCESS) {
Gustavo Padovanf93fa272013-10-21 14:21:40 -02004761 l2cap_state_change(chan, BT_CONFIG);
Mat Martineau8eb200b2012-10-23 15:24:17 -07004762 set_bit(CONF_REQ_SENT, &chan->conf_state);
4763 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn),
4764 L2CAP_CONF_REQ,
4765 l2cap_build_conf_req(chan, buf), buf);
4766 chan->num_conf_req++;
4767 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004768 }
4769}
4770
4771static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id,
4772 u8 remote_amp_id)
4773{
4774 l2cap_move_setup(chan);
4775 chan->move_id = local_amp_id;
4776 chan->move_state = L2CAP_MOVE_WAIT_RSP;
4777
4778 l2cap_send_move_chan_req(chan, remote_amp_id);
4779}
4780
4781static void l2cap_do_move_respond(struct l2cap_chan *chan, int result)
4782{
4783 struct hci_chan *hchan = NULL;
4784
4785 /* Placeholder - get hci_chan for logical link */
4786
4787 if (hchan) {
4788 if (hchan->state == BT_CONNECTED) {
4789 /* Logical link is ready to go */
4790 chan->hs_hcon = hchan->conn;
4791 chan->hs_hcon->l2cap_data = chan->conn;
4792 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4793 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS);
4794
4795 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
4796 } else {
4797 /* Wait for logical link to be ready */
4798 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4799 }
4800 } else {
4801 /* Logical link not available */
4802 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED);
4803 }
4804}
4805
4806static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result)
4807{
4808 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) {
4809 u8 rsp_result;
4810 if (result == -EINVAL)
4811 rsp_result = L2CAP_MR_BAD_ID;
4812 else
4813 rsp_result = L2CAP_MR_NOT_ALLOWED;
4814
4815 l2cap_send_move_chan_rsp(chan, rsp_result);
4816 }
4817
4818 chan->move_role = L2CAP_MOVE_ROLE_NONE;
4819 chan->move_state = L2CAP_MOVE_STABLE;
4820
4821 /* Restart data transmission */
4822 l2cap_ertm_send(chan);
4823}
4824
Andrei Emeltchenkoa514b172012-11-14 17:39:30 +02004825/* Invoke with locked chan */
4826void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
Mat Martineau8eb200b2012-10-23 15:24:17 -07004827{
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004828 u8 local_amp_id = chan->local_amp_id;
Andrei Emeltchenkofffadc02012-11-01 15:37:03 +02004829 u8 remote_amp_id = chan->remote_amp_id;
Andrei Emeltchenko770bfef2012-10-31 15:46:29 +02004830
Mat Martineau8eb200b2012-10-23 15:24:17 -07004831 BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
4832 chan, result, local_amp_id, remote_amp_id);
4833
Mat Martineau8eb200b2012-10-23 15:24:17 -07004834 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
4835 l2cap_chan_unlock(chan);
4836 return;
4837 }
4838
4839 if (chan->state != BT_CONNECTED) {
4840 l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
4841 } else if (result != L2CAP_MR_SUCCESS) {
4842 l2cap_do_move_cancel(chan, result);
4843 } else {
4844 switch (chan->move_role) {
4845 case L2CAP_MOVE_ROLE_INITIATOR:
4846 l2cap_do_move_initiate(chan, local_amp_id,
4847 remote_amp_id);
4848 break;
4849 case L2CAP_MOVE_ROLE_RESPONDER:
4850 l2cap_do_move_respond(chan, result);
4851 break;
4852 default:
4853 l2cap_do_move_cancel(chan, result);
4854 break;
4855 }
4856 }
Mat Martineau8eb200b2012-10-23 15:24:17 -07004857}
4858
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004859static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004860 struct l2cap_cmd_hdr *cmd,
4861 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004862{
4863 struct l2cap_move_chan_req *req = data;
Mat Martineau1500109b2012-10-23 15:24:15 -07004864 struct l2cap_move_chan_rsp rsp;
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004865 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004866 u16 icid = 0;
4867 u16 result = L2CAP_MR_NOT_ALLOWED;
4868
4869 if (cmd_len != sizeof(*req))
4870 return -EPROTO;
4871
4872 icid = le16_to_cpu(req->icid);
4873
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03004874 BT_DBG("icid 0x%4.4x, dest_amp_id %d", icid, req->dest_amp_id);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004875
Marcel Holtmann848566b2013-10-01 22:59:22 -07004876 if (!conn->hs_enabled)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004877 return -EINVAL;
4878
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004879 chan = l2cap_get_chan_by_dcid(conn, icid);
4880 if (!chan) {
Mat Martineau1500109b2012-10-23 15:24:15 -07004881 rsp.icid = cpu_to_le16(icid);
Joe Perchesdcf4adb2014-03-12 10:52:35 -07004882 rsp.result = cpu_to_le16(L2CAP_MR_NOT_ALLOWED);
Mat Martineau1500109b2012-10-23 15:24:15 -07004883 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP,
4884 sizeof(rsp), &rsp);
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004885 return 0;
4886 }
4887
Mat Martineau1500109b2012-10-23 15:24:15 -07004888 chan->ident = cmd->ident;
4889
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004890 if (chan->scid < L2CAP_CID_DYN_START ||
4891 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY ||
4892 (chan->mode != L2CAP_MODE_ERTM &&
4893 chan->mode != L2CAP_MODE_STREAMING)) {
4894 result = L2CAP_MR_NOT_ALLOWED;
4895 goto send_move_response;
4896 }
4897
4898 if (chan->local_amp_id == req->dest_amp_id) {
4899 result = L2CAP_MR_SAME_ID;
4900 goto send_move_response;
4901 }
4902
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004903 if (req->dest_amp_id != AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004904 struct hci_dev *hdev;
4905 hdev = hci_dev_get(req->dest_amp_id);
4906 if (!hdev || hdev->dev_type != HCI_AMP ||
4907 !test_bit(HCI_UP, &hdev->flags)) {
4908 if (hdev)
4909 hci_dev_put(hdev);
4910
4911 result = L2CAP_MR_BAD_ID;
4912 goto send_move_response;
4913 }
4914 hci_dev_put(hdev);
4915 }
4916
4917 /* Detect a move collision. Only send a collision response
4918 * if this side has "lost", otherwise proceed with the move.
4919 * The winner has the larger bd_addr.
4920 */
4921 if ((__chan_is_moving(chan) ||
4922 chan->move_role != L2CAP_MOVE_ROLE_NONE) &&
Marcel Holtmann6f59b902013-10-13 05:24:01 -07004923 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004924 result = L2CAP_MR_COLLISION;
4925 goto send_move_response;
4926 }
4927
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004928 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
4929 l2cap_move_setup(chan);
4930 chan->move_id = req->dest_amp_id;
4931 icid = chan->dcid;
4932
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07004933 if (req->dest_amp_id == AMP_ID_BREDR) {
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004934 /* Moving to BR/EDR */
4935 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4936 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4937 result = L2CAP_MR_PEND;
4938 } else {
4939 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM;
4940 result = L2CAP_MR_SUCCESS;
4941 }
4942 } else {
4943 chan->move_state = L2CAP_MOVE_WAIT_PREPARE;
4944 /* Placeholder - uncomment when amp functions are available */
4945 /*amp_accept_physical(chan, req->dest_amp_id);*/
4946 result = L2CAP_MR_PEND;
4947 }
4948
4949send_move_response:
Mat Martineau1500109b2012-10-23 15:24:15 -07004950 l2cap_send_move_chan_rsp(chan, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004951
Mat Martineau02b0fbb2012-10-23 15:24:10 -07004952 l2cap_chan_unlock(chan);
4953
Mat Martineau8d5a04a2011-11-02 16:18:35 -07004954 return 0;
4955}
4956
Mat Martineau5b155ef2012-10-23 15:24:14 -07004957static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result)
4958{
4959 struct l2cap_chan *chan;
4960 struct hci_chan *hchan = NULL;
4961
4962 chan = l2cap_get_chan_by_scid(conn, icid);
4963 if (!chan) {
4964 l2cap_send_move_chan_cfm_icid(conn, icid);
4965 return;
4966 }
4967
4968 __clear_chan_timer(chan);
4969 if (result == L2CAP_MR_PEND)
4970 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT);
4971
4972 switch (chan->move_state) {
4973 case L2CAP_MOVE_WAIT_LOGICAL_COMP:
4974 /* Move confirm will be sent when logical link
4975 * is complete.
4976 */
4977 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
4978 break;
4979 case L2CAP_MOVE_WAIT_RSP_SUCCESS:
4980 if (result == L2CAP_MR_PEND) {
4981 break;
4982 } else if (test_bit(CONN_LOCAL_BUSY,
4983 &chan->conn_state)) {
4984 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY;
4985 } else {
4986 /* Logical link is up or moving to BR/EDR,
4987 * proceed with move
4988 */
4989 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP;
4990 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
4991 }
4992 break;
4993 case L2CAP_MOVE_WAIT_RSP:
4994 /* Moving to AMP */
4995 if (result == L2CAP_MR_SUCCESS) {
4996 /* Remote is ready, send confirm immediately
4997 * after logical link is ready
4998 */
4999 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM;
5000 } else {
5001 /* Both logical link and move success
5002 * are required to confirm
5003 */
5004 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP;
5005 }
5006
5007 /* Placeholder - get hci_chan for logical link */
5008 if (!hchan) {
5009 /* Logical link not available */
5010 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5011 break;
5012 }
5013
5014 /* If the logical link is not yet connected, do not
5015 * send confirmation.
5016 */
5017 if (hchan->state != BT_CONNECTED)
5018 break;
5019
5020 /* Logical link is already ready to go */
5021
5022 chan->hs_hcon = hchan->conn;
5023 chan->hs_hcon->l2cap_data = chan->conn;
5024
5025 if (result == L2CAP_MR_SUCCESS) {
5026 /* Can confirm now */
5027 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED);
5028 } else {
5029 /* Now only need move success
5030 * to confirm
5031 */
5032 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS;
5033 }
5034
5035 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS);
5036 break;
5037 default:
5038 /* Any other amp move state means the move failed. */
5039 chan->move_id = chan->local_amp_id;
5040 l2cap_move_done(chan);
5041 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5042 }
5043
5044 l2cap_chan_unlock(chan);
5045}
5046
5047static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid,
5048 u16 result)
5049{
5050 struct l2cap_chan *chan;
5051
5052 chan = l2cap_get_chan_by_ident(conn, ident);
5053 if (!chan) {
5054 /* Could not locate channel, icid is best guess */
5055 l2cap_send_move_chan_cfm_icid(conn, icid);
5056 return;
5057 }
5058
5059 __clear_chan_timer(chan);
5060
5061 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) {
5062 if (result == L2CAP_MR_COLLISION) {
5063 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER;
5064 } else {
5065 /* Cleanup - cancel move */
5066 chan->move_id = chan->local_amp_id;
5067 l2cap_move_done(chan);
5068 }
5069 }
5070
5071 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED);
5072
5073 l2cap_chan_unlock(chan);
5074}
5075
5076static int l2cap_move_channel_rsp(struct l2cap_conn *conn,
5077 struct l2cap_cmd_hdr *cmd,
5078 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005079{
5080 struct l2cap_move_chan_rsp *rsp = data;
5081 u16 icid, result;
5082
5083 if (cmd_len != sizeof(*rsp))
5084 return -EPROTO;
5085
5086 icid = le16_to_cpu(rsp->icid);
5087 result = le16_to_cpu(rsp->result);
5088
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005089 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005090
Mat Martineau5b155ef2012-10-23 15:24:14 -07005091 if (result == L2CAP_MR_SUCCESS || result == L2CAP_MR_PEND)
5092 l2cap_move_continue(conn, icid, result);
5093 else
5094 l2cap_move_fail(conn, cmd->ident, icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005095
5096 return 0;
5097}
5098
Mat Martineau5f3847a2012-10-23 15:24:12 -07005099static int l2cap_move_channel_confirm(struct l2cap_conn *conn,
5100 struct l2cap_cmd_hdr *cmd,
5101 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005102{
5103 struct l2cap_move_chan_cfm *cfm = data;
Mat Martineau5f3847a2012-10-23 15:24:12 -07005104 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005105 u16 icid, result;
5106
5107 if (cmd_len != sizeof(*cfm))
5108 return -EPROTO;
5109
5110 icid = le16_to_cpu(cfm->icid);
5111 result = le16_to_cpu(cfm->result);
5112
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005113 BT_DBG("icid 0x%4.4x, result 0x%4.4x", icid, result);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005114
Mat Martineau5f3847a2012-10-23 15:24:12 -07005115 chan = l2cap_get_chan_by_dcid(conn, icid);
5116 if (!chan) {
5117 /* Spec requires a response even if the icid was not found */
5118 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5119 return 0;
5120 }
5121
5122 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) {
5123 if (result == L2CAP_MC_CONFIRMED) {
5124 chan->local_amp_id = chan->move_id;
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005125 if (chan->local_amp_id == AMP_ID_BREDR)
Mat Martineau5f3847a2012-10-23 15:24:12 -07005126 __release_logical_link(chan);
5127 } else {
5128 chan->move_id = chan->local_amp_id;
5129 }
5130
5131 l2cap_move_done(chan);
5132 }
5133
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005134 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid);
5135
Mat Martineau5f3847a2012-10-23 15:24:12 -07005136 l2cap_chan_unlock(chan);
5137
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005138 return 0;
5139}
5140
5141static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn,
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005142 struct l2cap_cmd_hdr *cmd,
5143 u16 cmd_len, void *data)
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005144{
5145 struct l2cap_move_chan_cfm_rsp *rsp = data;
Mat Martineau3fd71a02012-10-23 15:24:16 -07005146 struct l2cap_chan *chan;
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005147 u16 icid;
5148
5149 if (cmd_len != sizeof(*rsp))
5150 return -EPROTO;
5151
5152 icid = le16_to_cpu(rsp->icid);
5153
Andrei Emeltchenkoad0ac6c2012-07-10 15:27:50 +03005154 BT_DBG("icid 0x%4.4x", icid);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005155
Mat Martineau3fd71a02012-10-23 15:24:16 -07005156 chan = l2cap_get_chan_by_scid(conn, icid);
5157 if (!chan)
5158 return 0;
5159
5160 __clear_chan_timer(chan);
5161
5162 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) {
5163 chan->local_amp_id = chan->move_id;
5164
Marcel Holtmann6ed971c2013-10-05 11:47:44 -07005165 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan)
Mat Martineau3fd71a02012-10-23 15:24:16 -07005166 __release_logical_link(chan);
5167
5168 l2cap_move_done(chan);
5169 }
5170
5171 l2cap_chan_unlock(chan);
5172
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005173 return 0;
5174}
5175
Claudio Takahaside731152011-02-11 19:28:55 -02005176static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005177 struct l2cap_cmd_hdr *cmd,
Johan Hedberg203e6392013-05-15 10:07:15 +03005178 u16 cmd_len, u8 *data)
Claudio Takahaside731152011-02-11 19:28:55 -02005179{
5180 struct hci_conn *hcon = conn->hcon;
5181 struct l2cap_conn_param_update_req *req;
5182 struct l2cap_conn_param_update_rsp rsp;
Johan Hedberg203e6392013-05-15 10:07:15 +03005183 u16 min, max, latency, to_multiplier;
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005184 int err;
Claudio Takahaside731152011-02-11 19:28:55 -02005185
Johan Hedberg40bef302014-07-16 11:42:27 +03005186 if (hcon->role != HCI_ROLE_MASTER)
Claudio Takahaside731152011-02-11 19:28:55 -02005187 return -EINVAL;
5188
Claudio Takahaside731152011-02-11 19:28:55 -02005189 if (cmd_len != sizeof(struct l2cap_conn_param_update_req))
5190 return -EPROTO;
5191
5192 req = (struct l2cap_conn_param_update_req *) data;
Gustavo F. Padovane2174ca2011-02-17 19:16:55 -03005193 min = __le16_to_cpu(req->min);
5194 max = __le16_to_cpu(req->max);
Claudio Takahaside731152011-02-11 19:28:55 -02005195 latency = __le16_to_cpu(req->latency);
5196 to_multiplier = __le16_to_cpu(req->to_multiplier);
5197
5198 BT_DBG("min 0x%4.4x max 0x%4.4x latency: 0x%4.4x Timeout: 0x%4.4x",
Gustavo Padovan2d792812012-10-06 10:07:01 +01005199 min, max, latency, to_multiplier);
Claudio Takahaside731152011-02-11 19:28:55 -02005200
5201 memset(&rsp, 0, sizeof(rsp));
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005202
Andre Guedesd4905f22014-06-25 21:52:52 -03005203 err = hci_check_conn_params(min, max, latency, to_multiplier);
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005204 if (err)
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005205 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005206 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005207 rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_ACCEPTED);
Claudio Takahaside731152011-02-11 19:28:55 -02005208
5209 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005210 sizeof(rsp), &rsp);
Claudio Takahaside731152011-02-11 19:28:55 -02005211
Andre Guedesffb5a8272014-07-01 18:10:11 -03005212 if (!err) {
Johan Hedbergf4869e22014-07-02 17:37:32 +03005213 u8 store_hint;
Andre Guedesffb5a8272014-07-01 18:10:11 -03005214
Johan Hedbergf4869e22014-07-02 17:37:32 +03005215 store_hint = hci_le_conn_update(hcon, min, max, latency,
5216 to_multiplier);
5217 mgmt_new_conn_param(hcon->hdev, &hcon->dst, hcon->dst_type,
5218 store_hint, min, max, latency,
5219 to_multiplier);
5220
Andre Guedesffb5a8272014-07-01 18:10:11 -03005221 }
Claudio Takahasi2ce603e2011-02-16 20:44:53 -02005222
Claudio Takahaside731152011-02-11 19:28:55 -02005223 return 0;
5224}
5225
Johan Hedbergf1496de2013-05-13 14:15:56 +03005226static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
5227 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5228 u8 *data)
5229{
5230 struct l2cap_le_conn_rsp *rsp = (struct l2cap_le_conn_rsp *) data;
5231 u16 dcid, mtu, mps, credits, result;
5232 struct l2cap_chan *chan;
5233 int err;
5234
5235 if (cmd_len < sizeof(*rsp))
5236 return -EPROTO;
5237
5238 dcid = __le16_to_cpu(rsp->dcid);
5239 mtu = __le16_to_cpu(rsp->mtu);
5240 mps = __le16_to_cpu(rsp->mps);
5241 credits = __le16_to_cpu(rsp->credits);
5242 result = __le16_to_cpu(rsp->result);
5243
5244 if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23))
5245 return -EPROTO;
5246
5247 BT_DBG("dcid 0x%4.4x mtu %u mps %u credits %u result 0x%2.2x",
5248 dcid, mtu, mps, credits, result);
5249
5250 mutex_lock(&conn->chan_lock);
5251
5252 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5253 if (!chan) {
5254 err = -EBADSLT;
5255 goto unlock;
5256 }
5257
5258 err = 0;
5259
5260 l2cap_chan_lock(chan);
5261
5262 switch (result) {
5263 case L2CAP_CR_SUCCESS:
5264 chan->ident = 0;
5265 chan->dcid = dcid;
5266 chan->omtu = mtu;
5267 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005268 chan->tx_credits = credits;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005269 l2cap_chan_ready(chan);
5270 break;
5271
5272 default:
5273 l2cap_chan_del(chan, ECONNREFUSED);
5274 break;
5275 }
5276
5277 l2cap_chan_unlock(chan);
5278
5279unlock:
5280 mutex_unlock(&conn->chan_lock);
5281
5282 return err;
5283}
5284
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005285static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005286 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5287 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005288{
5289 int err = 0;
5290
5291 switch (cmd->code) {
5292 case L2CAP_COMMAND_REJ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005293 l2cap_command_rej(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005294 break;
5295
5296 case L2CAP_CONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005297 err = l2cap_connect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005298 break;
5299
5300 case L2CAP_CONN_RSP:
Mat Martineauf5a25982012-10-11 17:48:21 +03005301 case L2CAP_CREATE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005302 l2cap_connect_create_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005303 break;
5304
5305 case L2CAP_CONF_REQ:
5306 err = l2cap_config_req(conn, cmd, cmd_len, data);
5307 break;
5308
5309 case L2CAP_CONF_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005310 l2cap_config_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005311 break;
5312
5313 case L2CAP_DISCONN_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005314 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005315 break;
5316
5317 case L2CAP_DISCONN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005318 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005319 break;
5320
5321 case L2CAP_ECHO_REQ:
5322 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data);
5323 break;
5324
5325 case L2CAP_ECHO_RSP:
5326 break;
5327
5328 case L2CAP_INFO_REQ:
Johan Hedbergcb3b3152013-05-28 13:46:30 +03005329 err = l2cap_information_req(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005330 break;
5331
5332 case L2CAP_INFO_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005333 l2cap_information_rsp(conn, cmd, cmd_len, data);
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005334 break;
5335
Mat Martineauf94ff6f2011-11-02 16:18:32 -07005336 case L2CAP_CREATE_CHAN_REQ:
5337 err = l2cap_create_channel_req(conn, cmd, cmd_len, data);
5338 break;
5339
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005340 case L2CAP_MOVE_CHAN_REQ:
5341 err = l2cap_move_channel_req(conn, cmd, cmd_len, data);
5342 break;
5343
5344 case L2CAP_MOVE_CHAN_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005345 l2cap_move_channel_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005346 break;
5347
5348 case L2CAP_MOVE_CHAN_CFM:
5349 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data);
5350 break;
5351
5352 case L2CAP_MOVE_CHAN_CFM_RSP:
Johan Hedberg9245e732013-09-16 13:05:17 +03005353 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data);
Mat Martineau8d5a04a2011-11-02 16:18:35 -07005354 break;
5355
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005356 default:
5357 BT_ERR("Unknown BR/EDR signaling command 0x%2.2x", cmd->code);
5358 err = -EINVAL;
5359 break;
5360 }
5361
5362 return err;
5363}
5364
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005365static int l2cap_le_connect_req(struct l2cap_conn *conn,
5366 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5367 u8 *data)
5368{
5369 struct l2cap_le_conn_req *req = (struct l2cap_le_conn_req *) data;
5370 struct l2cap_le_conn_rsp rsp;
5371 struct l2cap_chan *chan, *pchan;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005372 u16 dcid, scid, credits, mtu, mps;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005373 __le16 psm;
5374 u8 result;
5375
5376 if (cmd_len != sizeof(*req))
5377 return -EPROTO;
5378
5379 scid = __le16_to_cpu(req->scid);
5380 mtu = __le16_to_cpu(req->mtu);
5381 mps = __le16_to_cpu(req->mps);
5382 psm = req->psm;
5383 dcid = 0;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005384 credits = 0;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005385
5386 if (mtu < 23 || mps < 23)
5387 return -EPROTO;
5388
5389 BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
5390 scid, mtu, mps);
5391
5392 /* Check if we have socket listening on psm */
5393 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
5394 &conn->hcon->dst, LE_LINK);
5395 if (!pchan) {
5396 result = L2CAP_CR_BAD_PSM;
5397 chan = NULL;
5398 goto response;
5399 }
5400
5401 mutex_lock(&conn->chan_lock);
5402 l2cap_chan_lock(pchan);
5403
5404 if (!smp_sufficient_security(conn->hcon, pchan->sec_level)) {
5405 result = L2CAP_CR_AUTHENTICATION;
5406 chan = NULL;
5407 goto response_unlock;
5408 }
5409
5410 /* Check if we already have channel with that dcid */
5411 if (__l2cap_get_chan_by_dcid(conn, scid)) {
5412 result = L2CAP_CR_NO_MEM;
5413 chan = NULL;
5414 goto response_unlock;
5415 }
5416
5417 chan = pchan->ops->new_connection(pchan);
5418 if (!chan) {
5419 result = L2CAP_CR_NO_MEM;
5420 goto response_unlock;
5421 }
5422
Johan Hedberg0ce43ce2013-12-05 14:55:33 +02005423 l2cap_le_flowctl_init(chan);
5424
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005425 bacpy(&chan->src, &conn->hcon->src);
5426 bacpy(&chan->dst, &conn->hcon->dst);
5427 chan->src_type = bdaddr_type(conn->hcon, conn->hcon->src_type);
5428 chan->dst_type = bdaddr_type(conn->hcon, conn->hcon->dst_type);
5429 chan->psm = psm;
5430 chan->dcid = scid;
5431 chan->omtu = mtu;
5432 chan->remote_mps = mps;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005433 chan->tx_credits = __le16_to_cpu(req->credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005434
5435 __l2cap_chan_add(conn, chan);
5436 dcid = chan->scid;
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005437 credits = chan->rx_credits;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005438
5439 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
5440
5441 chan->ident = cmd->ident;
5442
5443 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
5444 l2cap_state_change(chan, BT_CONNECT2);
5445 result = L2CAP_CR_PEND;
5446 chan->ops->defer(chan);
5447 } else {
5448 l2cap_chan_ready(chan);
5449 result = L2CAP_CR_SUCCESS;
5450 }
5451
5452response_unlock:
5453 l2cap_chan_unlock(pchan);
5454 mutex_unlock(&conn->chan_lock);
Johan Hedberga24cce12014-08-07 22:56:42 +03005455 l2cap_chan_put(pchan);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005456
5457 if (result == L2CAP_CR_PEND)
5458 return 0;
5459
5460response:
5461 if (chan) {
5462 rsp.mtu = cpu_to_le16(chan->imtu);
Johan Hedberg3916aed2013-10-07 15:35:26 +02005463 rsp.mps = cpu_to_le16(chan->mps);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005464 } else {
5465 rsp.mtu = 0;
5466 rsp.mps = 0;
5467 }
5468
5469 rsp.dcid = cpu_to_le16(dcid);
Johan Hedberg0cd75f72013-05-17 13:09:05 +03005470 rsp.credits = cpu_to_le16(credits);
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005471 rsp.result = cpu_to_le16(result);
5472
5473 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp);
5474
5475 return 0;
5476}
5477
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005478static inline int l2cap_le_credits(struct l2cap_conn *conn,
5479 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5480 u8 *data)
5481{
5482 struct l2cap_le_credits *pkt;
5483 struct l2cap_chan *chan;
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005484 u16 cid, credits, max_credits;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005485
5486 if (cmd_len != sizeof(*pkt))
5487 return -EPROTO;
5488
5489 pkt = (struct l2cap_le_credits *) data;
5490 cid = __le16_to_cpu(pkt->cid);
5491 credits = __le16_to_cpu(pkt->credits);
5492
5493 BT_DBG("cid 0x%4.4x credits 0x%4.4x", cid, credits);
5494
5495 chan = l2cap_get_chan_by_dcid(conn, cid);
5496 if (!chan)
5497 return -EBADSLT;
5498
Johan Hedberg0f1bfe42014-01-27 15:11:35 -08005499 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits;
5500 if (credits > max_credits) {
5501 BT_ERR("LE credits overflow");
5502 l2cap_send_disconn_req(chan, ECONNRESET);
5503
5504 /* Return 0 so that we don't trigger an unnecessary
5505 * command reject packet.
5506 */
5507 return 0;
5508 }
5509
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005510 chan->tx_credits += credits;
5511
5512 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) {
5513 l2cap_do_send(chan, skb_dequeue(&chan->tx_q));
5514 chan->tx_credits--;
5515 }
5516
5517 if (chan->tx_credits)
5518 chan->ops->resume(chan);
5519
5520 l2cap_chan_unlock(chan);
5521
5522 return 0;
5523}
5524
Johan Hedberg71fb4192013-12-10 10:52:48 +02005525static inline int l2cap_le_command_rej(struct l2cap_conn *conn,
5526 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5527 u8 *data)
5528{
5529 struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data;
5530 struct l2cap_chan *chan;
5531
5532 if (cmd_len < sizeof(*rej))
5533 return -EPROTO;
5534
5535 mutex_lock(&conn->chan_lock);
5536
5537 chan = __l2cap_get_chan_by_ident(conn, cmd->ident);
5538 if (!chan)
5539 goto done;
5540
5541 l2cap_chan_lock(chan);
5542 l2cap_chan_del(chan, ECONNREFUSED);
5543 l2cap_chan_unlock(chan);
5544
5545done:
5546 mutex_unlock(&conn->chan_lock);
5547 return 0;
5548}
5549
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005550static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn,
Johan Hedberg203e6392013-05-15 10:07:15 +03005551 struct l2cap_cmd_hdr *cmd, u16 cmd_len,
5552 u8 *data)
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005553{
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005554 int err = 0;
5555
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005556 switch (cmd->code) {
5557 case L2CAP_COMMAND_REJ:
Johan Hedberg71fb4192013-12-10 10:52:48 +02005558 l2cap_le_command_rej(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005559 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005560
5561 case L2CAP_CONN_PARAM_UPDATE_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005562 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data);
5563 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005564
5565 case L2CAP_CONN_PARAM_UPDATE_RSP:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005566 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005567
Johan Hedbergf1496de2013-05-13 14:15:56 +03005568 case L2CAP_LE_CONN_RSP:
5569 l2cap_le_connect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005570 break;
Johan Hedbergf1496de2013-05-13 14:15:56 +03005571
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005572 case L2CAP_LE_CONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005573 err = l2cap_le_connect_req(conn, cmd, cmd_len, data);
5574 break;
Johan Hedberg27e2d4c2013-05-14 13:27:21 +03005575
Johan Hedbergfad5fc892013-12-05 09:45:01 +02005576 case L2CAP_LE_CREDITS:
5577 err = l2cap_le_credits(conn, cmd, cmd_len, data);
5578 break;
5579
Johan Hedberg3defe012013-05-15 10:16:06 +03005580 case L2CAP_DISCONN_REQ:
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005581 err = l2cap_disconnect_req(conn, cmd, cmd_len, data);
5582 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005583
5584 case L2CAP_DISCONN_RSP:
5585 l2cap_disconnect_rsp(conn, cmd, cmd_len, data);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005586 break;
Johan Hedberg3defe012013-05-15 10:16:06 +03005587
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005588 default:
5589 BT_ERR("Unknown LE signaling command 0x%2.2x", cmd->code);
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005590 err = -EINVAL;
5591 break;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005592 }
Johan Hedbergb5ecba62013-12-02 12:21:29 +02005593
5594 return err;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005595}
5596
Johan Hedbergc5623552013-04-29 19:35:33 +03005597static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
5598 struct sk_buff *skb)
5599{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005600 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005601 struct l2cap_cmd_hdr *cmd;
5602 u16 len;
Johan Hedbergc5623552013-04-29 19:35:33 +03005603 int err;
5604
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005605 if (hcon->type != LE_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005606 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005607
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005608 if (skb->len < L2CAP_CMD_HDR_SIZE)
5609 goto drop;
Johan Hedbergc5623552013-04-29 19:35:33 +03005610
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005611 cmd = (void *) skb->data;
5612 skb_pull(skb, L2CAP_CMD_HDR_SIZE);
Johan Hedbergc5623552013-04-29 19:35:33 +03005613
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005614 len = le16_to_cpu(cmd->len);
Johan Hedbergc5623552013-04-29 19:35:33 +03005615
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005616 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd->code, len, cmd->ident);
Johan Hedbergc5623552013-04-29 19:35:33 +03005617
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005618 if (len != skb->len || !cmd->ident) {
5619 BT_DBG("corrupted command");
5620 goto drop;
5621 }
Johan Hedbergc5623552013-04-29 19:35:33 +03005622
Johan Hedberg203e6392013-05-15 10:07:15 +03005623 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005624 if (err) {
5625 struct l2cap_cmd_rej_unk rej;
Johan Hedbergc5623552013-04-29 19:35:33 +03005626
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005627 BT_ERR("Wrong link type (%d)", err);
Johan Hedbergc5623552013-04-29 19:35:33 +03005628
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005629 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Marcel Holtmann4f3e2192013-10-03 01:26:37 -07005630 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
5631 sizeof(rej), &rej);
Johan Hedbergc5623552013-04-29 19:35:33 +03005632 }
5633
Marcel Holtmann3b166292013-10-02 08:28:21 -07005634drop:
Johan Hedbergc5623552013-04-29 19:35:33 +03005635 kfree_skb(skb);
5636}
5637
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005638static inline void l2cap_sig_channel(struct l2cap_conn *conn,
Gustavo Padovan2d792812012-10-06 10:07:01 +01005639 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07005640{
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005641 struct hci_conn *hcon = conn->hcon;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005642 u8 *data = skb->data;
5643 int len = skb->len;
5644 struct l2cap_cmd_hdr cmd;
Claudio Takahasi3300d9a2011-02-11 19:28:54 -02005645 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005646
5647 l2cap_raw_recv(conn, skb);
5648
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005649 if (hcon->type != ACL_LINK)
Marcel Holtmann3b166292013-10-02 08:28:21 -07005650 goto drop;
Johan Hedberg69c4e4e2013-09-16 13:05:18 +03005651
Linus Torvalds1da177e2005-04-16 15:20:36 -07005652 while (len >= L2CAP_CMD_HDR_SIZE) {
Al Viro88219a02007-07-29 00:17:25 -07005653 u16 cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005654 memcpy(&cmd, data, L2CAP_CMD_HDR_SIZE);
5655 data += L2CAP_CMD_HDR_SIZE;
5656 len -= L2CAP_CMD_HDR_SIZE;
5657
Al Viro88219a02007-07-29 00:17:25 -07005658 cmd_len = le16_to_cpu(cmd.len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005659
Gustavo Padovan2d792812012-10-06 10:07:01 +01005660 BT_DBG("code 0x%2.2x len %d id 0x%2.2x", cmd.code, cmd_len,
5661 cmd.ident);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005662
Al Viro88219a02007-07-29 00:17:25 -07005663 if (cmd_len > len || !cmd.ident) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07005664 BT_DBG("corrupted command");
5665 break;
5666 }
5667
Johan Hedbergc5623552013-04-29 19:35:33 +03005668 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005669 if (err) {
Ilia Kolomisnkye2fd3182011-07-10 08:47:44 +03005670 struct l2cap_cmd_rej_unk rej;
Gustavo F. Padovan2c6d1a22011-03-23 14:38:32 -03005671
5672 BT_ERR("Wrong link type (%d)", err);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005673
Joe Perchesdcf4adb2014-03-12 10:52:35 -07005674 rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
Gustavo Padovan2d792812012-10-06 10:07:01 +01005675 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ,
5676 sizeof(rej), &rej);
Linus Torvalds1da177e2005-04-16 15:20:36 -07005677 }
5678
Al Viro88219a02007-07-29 00:17:25 -07005679 data += cmd_len;
5680 len -= cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07005681 }
5682
Marcel Holtmann3b166292013-10-02 08:28:21 -07005683drop:
Linus Torvalds1da177e2005-04-16 15:20:36 -07005684 kfree_skb(skb);
5685}
5686
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005687static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb)
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005688{
5689 u16 our_fcs, rcv_fcs;
Andrei Emeltchenkoe4ca6d92011-10-11 13:37:52 +03005690 int hdr_size;
5691
5692 if (test_bit(FLAG_EXT_CTRL, &chan->flags))
5693 hdr_size = L2CAP_EXT_HDR_SIZE;
5694 else
5695 hdr_size = L2CAP_ENH_HDR_SIZE;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005696
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03005697 if (chan->fcs == L2CAP_FCS_CRC16) {
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005698 skb_trim(skb, skb->len - L2CAP_FCS_SIZE);
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005699 rcv_fcs = get_unaligned_le16(skb->data + skb->len);
5700 our_fcs = crc16(0, skb->data - hdr_size, skb->len + hdr_size);
5701
5702 if (our_fcs != rcv_fcs)
João Paulo Rechi Vita7a560e52010-06-22 13:56:27 -03005703 return -EBADMSG;
Gustavo F. Padovanfcc203c2009-08-20 22:26:02 -03005704 }
5705 return 0;
5706}
5707
Mat Martineau6ea00482012-05-17 20:53:52 -07005708static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005709{
Mat Martineaue31f7632012-05-17 20:53:41 -07005710 struct l2cap_ctrl control;
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005711
Mat Martineaue31f7632012-05-17 20:53:41 -07005712 BT_DBG("chan %p", chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005713
Mat Martineaue31f7632012-05-17 20:53:41 -07005714 memset(&control, 0, sizeof(control));
5715 control.sframe = 1;
5716 control.final = 1;
5717 control.reqseq = chan->buffer_seq;
5718 set_bit(CONN_SEND_FBIT, &chan->conn_state);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005719
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005720 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
Mat Martineaue31f7632012-05-17 20:53:41 -07005721 control.super = L2CAP_SUPER_RNR;
5722 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005723 }
5724
Mat Martineaue31f7632012-05-17 20:53:41 -07005725 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
5726 chan->unacked_frames > 0)
5727 __set_retrans_timer(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005728
Mat Martineaue31f7632012-05-17 20:53:41 -07005729 /* Send pending iframes */
Gustavo F. Padovan525cd182011-03-25 19:43:39 -03005730 l2cap_ertm_send(chan);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005731
Gustavo F. Padovane2ab4352011-06-10 21:28:49 -03005732 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) &&
Mat Martineaue31f7632012-05-17 20:53:41 -07005733 test_bit(CONN_SEND_FBIT, &chan->conn_state)) {
5734 /* F-bit wasn't sent in an s-frame or i-frame yet, so
5735 * send it now.
5736 */
5737 control.super = L2CAP_SUPER_RR;
5738 l2cap_send_sframe(chan, &control);
Gustavo F. Padovand5392c82010-05-01 16:15:36 -03005739 }
5740}
5741
Gustavo Padovan2d792812012-10-06 10:07:01 +01005742static void append_skb_frag(struct sk_buff *skb, struct sk_buff *new_frag,
5743 struct sk_buff **last_frag)
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005744{
Mat Martineau84084a32011-07-22 14:54:00 -07005745 /* skb->len reflects data in skb as well as all fragments
5746 * skb->data_len reflects only data in fragments
5747 */
5748 if (!skb_has_frag_list(skb))
5749 skb_shinfo(skb)->frag_list = new_frag;
5750
5751 new_frag->next = NULL;
5752
5753 (*last_frag)->next = new_frag;
5754 *last_frag = new_frag;
5755
5756 skb->len += new_frag->len;
5757 skb->data_len += new_frag->len;
5758 skb->truesize += new_frag->truesize;
5759}
5760
Mat Martineau4b51dae92012-05-17 20:53:37 -07005761static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
5762 struct l2cap_ctrl *control)
Mat Martineau84084a32011-07-22 14:54:00 -07005763{
5764 int err = -EINVAL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005765
Mat Martineau4b51dae92012-05-17 20:53:37 -07005766 switch (control->sar) {
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005767 case L2CAP_SAR_UNSEGMENTED:
Mat Martineau84084a32011-07-22 14:54:00 -07005768 if (chan->sdu)
5769 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005770
Gustavo Padovan80b98022012-05-27 22:27:51 -03005771 err = chan->ops->recv(chan, skb);
Mat Martineau84084a32011-07-22 14:54:00 -07005772 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005773
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005774 case L2CAP_SAR_START:
Mat Martineau84084a32011-07-22 14:54:00 -07005775 if (chan->sdu)
5776 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005777
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005778 chan->sdu_len = get_unaligned_le16(skb->data);
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03005779 skb_pull(skb, L2CAP_SDULEN_SIZE);
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005780
Mat Martineau84084a32011-07-22 14:54:00 -07005781 if (chan->sdu_len > chan->imtu) {
5782 err = -EMSGSIZE;
5783 break;
5784 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005785
Mat Martineau84084a32011-07-22 14:54:00 -07005786 if (skb->len >= chan->sdu_len)
5787 break;
5788
5789 chan->sdu = skb;
5790 chan->sdu_last_frag = skb;
5791
5792 skb = NULL;
5793 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005794 break;
5795
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005796 case L2CAP_SAR_CONTINUE:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005797 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005798 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005799
Mat Martineau84084a32011-07-22 14:54:00 -07005800 append_skb_frag(chan->sdu, skb,
5801 &chan->sdu_last_frag);
5802 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005803
Mat Martineau84084a32011-07-22 14:54:00 -07005804 if (chan->sdu->len >= chan->sdu_len)
5805 break;
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005806
Mat Martineau84084a32011-07-22 14:54:00 -07005807 err = 0;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005808 break;
5809
Andrei Emeltchenko7e0ef6e2011-10-11 13:37:45 +03005810 case L2CAP_SAR_END:
Gustavo F. Padovan6f61fd472011-03-25 20:09:37 -03005811 if (!chan->sdu)
Mat Martineau84084a32011-07-22 14:54:00 -07005812 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005813
Mat Martineau84084a32011-07-22 14:54:00 -07005814 append_skb_frag(chan->sdu, skb,
5815 &chan->sdu_last_frag);
5816 skb = NULL;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005817
Mat Martineau84084a32011-07-22 14:54:00 -07005818 if (chan->sdu->len != chan->sdu_len)
5819 break;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005820
Gustavo Padovan80b98022012-05-27 22:27:51 -03005821 err = chan->ops->recv(chan, chan->sdu);
Gustavo F. Padovan4178ba42010-05-01 16:15:45 -03005822
Mat Martineau84084a32011-07-22 14:54:00 -07005823 if (!err) {
5824 /* Reassembly complete */
5825 chan->sdu = NULL;
5826 chan->sdu_last_frag = NULL;
5827 chan->sdu_len = 0;
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005828 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005829 break;
5830 }
5831
Mat Martineau84084a32011-07-22 14:54:00 -07005832 if (err) {
5833 kfree_skb(skb);
5834 kfree_skb(chan->sdu);
5835 chan->sdu = NULL;
5836 chan->sdu_last_frag = NULL;
5837 chan->sdu_len = 0;
5838 }
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005839
Mat Martineau84084a32011-07-22 14:54:00 -07005840 return err;
Gustavo F. Padovan18778a62010-05-01 16:15:44 -03005841}
5842
Mat Martineau32b32732012-10-23 15:24:11 -07005843static int l2cap_resegment(struct l2cap_chan *chan)
5844{
5845 /* Placeholder */
5846 return 0;
5847}
5848
Mat Martineaue3281402011-07-07 09:39:02 -07005849void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
Gustavo F. Padovan712132e2010-06-21 19:39:50 -03005850{
Mat Martineau61aa4f52012-05-17 20:53:40 -07005851 u8 event;
5852
5853 if (chan->mode != L2CAP_MODE_ERTM)
5854 return;
5855
5856 event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
Andrei Emeltchenko401bb1f2012-05-21 15:47:46 +03005857 l2cap_tx(chan, NULL, NULL, event);
Gustavo F. Padovan1890d362010-05-01 16:15:44 -03005858}
5859
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005860static int l2cap_rx_queued_iframes(struct l2cap_chan *chan)
5861{
Mat Martineau63838722012-05-17 20:53:45 -07005862 int err = 0;
5863 /* Pass sequential frames to l2cap_reassemble_sdu()
5864 * until a gap is encountered.
5865 */
5866
5867 BT_DBG("chan %p", chan);
5868
5869 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
5870 struct sk_buff *skb;
5871 BT_DBG("Searching for skb with txseq %d (queue len %d)",
5872 chan->buffer_seq, skb_queue_len(&chan->srej_q));
5873
5874 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq);
5875
5876 if (!skb)
5877 break;
5878
5879 skb_unlink(skb, &chan->srej_q);
5880 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
5881 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->control);
5882 if (err)
5883 break;
5884 }
5885
5886 if (skb_queue_empty(&chan->srej_q)) {
5887 chan->rx_state = L2CAP_RX_STATE_RECV;
5888 l2cap_send_ack(chan);
5889 }
5890
5891 return err;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005892}
5893
5894static void l2cap_handle_srej(struct l2cap_chan *chan,
5895 struct l2cap_ctrl *control)
5896{
Mat Martineauf80842a2012-05-17 20:53:46 -07005897 struct sk_buff *skb;
5898
5899 BT_DBG("chan %p, control %p", chan, control);
5900
5901 if (control->reqseq == chan->next_tx_seq) {
5902 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005903 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005904 return;
5905 }
5906
5907 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5908
5909 if (skb == NULL) {
5910 BT_DBG("Seq %d not available for retransmission",
5911 control->reqseq);
5912 return;
5913 }
5914
5915 if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) {
5916 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005917 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineauf80842a2012-05-17 20:53:46 -07005918 return;
5919 }
5920
5921 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5922
5923 if (control->poll) {
5924 l2cap_pass_to_tx(chan, control);
5925
5926 set_bit(CONN_SEND_FBIT, &chan->conn_state);
5927 l2cap_retransmit(chan, control);
5928 l2cap_ertm_send(chan);
5929
5930 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5931 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5932 chan->srej_save_reqseq = control->reqseq;
5933 }
5934 } else {
5935 l2cap_pass_to_tx_fbit(chan, control);
5936
5937 if (control->final) {
5938 if (chan->srej_save_reqseq != control->reqseq ||
5939 !test_and_clear_bit(CONN_SREJ_ACT,
5940 &chan->conn_state))
5941 l2cap_retransmit(chan, control);
5942 } else {
5943 l2cap_retransmit(chan, control);
5944 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) {
5945 set_bit(CONN_SREJ_ACT, &chan->conn_state);
5946 chan->srej_save_reqseq = control->reqseq;
5947 }
5948 }
5949 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005950}
5951
5952static void l2cap_handle_rej(struct l2cap_chan *chan,
5953 struct l2cap_ctrl *control)
5954{
Mat Martineaufcd289d2012-05-17 20:53:47 -07005955 struct sk_buff *skb;
5956
5957 BT_DBG("chan %p, control %p", chan, control);
5958
5959 if (control->reqseq == chan->next_tx_seq) {
5960 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005961 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005962 return;
5963 }
5964
5965 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq);
5966
5967 if (chan->max_tx && skb &&
5968 bt_cb(skb)->control.retries >= chan->max_tx) {
5969 BT_DBG("Retry limit exceeded (%d)", chan->max_tx);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02005970 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaufcd289d2012-05-17 20:53:47 -07005971 return;
5972 }
5973
5974 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
5975
5976 l2cap_pass_to_tx(chan, control);
5977
5978 if (control->final) {
5979 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
5980 l2cap_retransmit_all(chan, control);
5981 } else {
5982 l2cap_retransmit_all(chan, control);
5983 l2cap_ertm_send(chan);
5984 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F)
5985 set_bit(CONN_REJ_ACT, &chan->conn_state);
5986 }
Mat Martineaud2a7ac52012-05-17 20:53:42 -07005987}
5988
Mat Martineau4b51dae92012-05-17 20:53:37 -07005989static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
5990{
5991 BT_DBG("chan %p, txseq %d", chan, txseq);
5992
5993 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq,
5994 chan->expected_tx_seq);
5995
5996 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) {
5997 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
Gustavo Padovan2d792812012-10-06 10:07:01 +01005998 chan->tx_win) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07005999 /* See notes below regarding "double poll" and
6000 * invalid packets.
6001 */
6002 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6003 BT_DBG("Invalid/Ignore - after SREJ");
6004 return L2CAP_TXSEQ_INVALID_IGNORE;
6005 } else {
6006 BT_DBG("Invalid - in window after SREJ sent");
6007 return L2CAP_TXSEQ_INVALID;
6008 }
6009 }
6010
6011 if (chan->srej_list.head == txseq) {
6012 BT_DBG("Expected SREJ");
6013 return L2CAP_TXSEQ_EXPECTED_SREJ;
6014 }
6015
6016 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) {
6017 BT_DBG("Duplicate SREJ - txseq already stored");
6018 return L2CAP_TXSEQ_DUPLICATE_SREJ;
6019 }
6020
6021 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) {
6022 BT_DBG("Unexpected SREJ - not requested");
6023 return L2CAP_TXSEQ_UNEXPECTED_SREJ;
6024 }
6025 }
6026
6027 if (chan->expected_tx_seq == txseq) {
6028 if (__seq_offset(chan, txseq, chan->last_acked_seq) >=
6029 chan->tx_win) {
6030 BT_DBG("Invalid - txseq outside tx window");
6031 return L2CAP_TXSEQ_INVALID;
6032 } else {
6033 BT_DBG("Expected");
6034 return L2CAP_TXSEQ_EXPECTED;
6035 }
6036 }
6037
6038 if (__seq_offset(chan, txseq, chan->last_acked_seq) <
Gustavo Padovan2d792812012-10-06 10:07:01 +01006039 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) {
Mat Martineau4b51dae92012-05-17 20:53:37 -07006040 BT_DBG("Duplicate - expected_tx_seq later than txseq");
6041 return L2CAP_TXSEQ_DUPLICATE;
6042 }
6043
6044 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) {
6045 /* A source of invalid packets is a "double poll" condition,
6046 * where delays cause us to send multiple poll packets. If
6047 * the remote stack receives and processes both polls,
6048 * sequence numbers can wrap around in such a way that a
6049 * resent frame has a sequence number that looks like new data
6050 * with a sequence gap. This would trigger an erroneous SREJ
6051 * request.
6052 *
6053 * Fortunately, this is impossible with a tx window that's
6054 * less than half of the maximum sequence number, which allows
6055 * invalid frames to be safely ignored.
6056 *
6057 * With tx window sizes greater than half of the tx window
6058 * maximum, the frame is invalid and cannot be ignored. This
6059 * causes a disconnect.
6060 */
6061
6062 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) {
6063 BT_DBG("Invalid/Ignore - txseq outside tx window");
6064 return L2CAP_TXSEQ_INVALID_IGNORE;
6065 } else {
6066 BT_DBG("Invalid - txseq outside tx window");
6067 return L2CAP_TXSEQ_INVALID;
6068 }
6069 } else {
6070 BT_DBG("Unexpected - txseq indicates missing frames");
6071 return L2CAP_TXSEQ_UNEXPECTED;
6072 }
6073}
6074
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006075static int l2cap_rx_state_recv(struct l2cap_chan *chan,
6076 struct l2cap_ctrl *control,
6077 struct sk_buff *skb, u8 event)
6078{
6079 int err = 0;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006080 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006081
6082 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6083 event);
6084
6085 switch (event) {
6086 case L2CAP_EV_RECV_IFRAME:
6087 switch (l2cap_classify_txseq(chan, control->txseq)) {
6088 case L2CAP_TXSEQ_EXPECTED:
6089 l2cap_pass_to_tx(chan, control);
6090
6091 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6092 BT_DBG("Busy, discarding expected seq %d",
6093 control->txseq);
6094 break;
6095 }
6096
6097 chan->expected_tx_seq = __next_seq(chan,
6098 control->txseq);
6099
6100 chan->buffer_seq = chan->expected_tx_seq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006101 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006102
6103 err = l2cap_reassemble_sdu(chan, skb, control);
6104 if (err)
6105 break;
6106
6107 if (control->final) {
6108 if (!test_and_clear_bit(CONN_REJ_ACT,
6109 &chan->conn_state)) {
6110 control->final = 0;
6111 l2cap_retransmit_all(chan, control);
6112 l2cap_ertm_send(chan);
6113 }
6114 }
6115
6116 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
6117 l2cap_send_ack(chan);
6118 break;
6119 case L2CAP_TXSEQ_UNEXPECTED:
6120 l2cap_pass_to_tx(chan, control);
6121
6122 /* Can't issue SREJ frames in the local busy state.
6123 * Drop this frame, it will be seen as missing
6124 * when local busy is exited.
6125 */
6126 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
6127 BT_DBG("Busy, discarding unexpected seq %d",
6128 control->txseq);
6129 break;
6130 }
6131
6132 /* There was a gap in the sequence, so an SREJ
6133 * must be sent for each missing frame. The
6134 * current frame is stored for later use.
6135 */
6136 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006137 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006138 BT_DBG("Queued %p (queue len %d)", skb,
6139 skb_queue_len(&chan->srej_q));
6140
6141 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
6142 l2cap_seq_list_clear(&chan->srej_list);
6143 l2cap_send_srej(chan, control->txseq);
6144
6145 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT;
6146 break;
6147 case L2CAP_TXSEQ_DUPLICATE:
6148 l2cap_pass_to_tx(chan, control);
6149 break;
6150 case L2CAP_TXSEQ_INVALID_IGNORE:
6151 break;
6152 case L2CAP_TXSEQ_INVALID:
6153 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006154 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006155 break;
6156 }
6157 break;
6158 case L2CAP_EV_RECV_RR:
6159 l2cap_pass_to_tx(chan, control);
6160 if (control->final) {
6161 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6162
Mat Martineaue6a3ee62012-10-23 15:24:22 -07006163 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) &&
6164 !__chan_is_moving(chan)) {
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006165 control->final = 0;
6166 l2cap_retransmit_all(chan, control);
6167 }
6168
6169 l2cap_ertm_send(chan);
6170 } else if (control->poll) {
6171 l2cap_send_i_or_rr_or_rnr(chan);
6172 } else {
6173 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6174 &chan->conn_state) &&
6175 chan->unacked_frames)
6176 __set_retrans_timer(chan);
6177
6178 l2cap_ertm_send(chan);
6179 }
6180 break;
6181 case L2CAP_EV_RECV_RNR:
6182 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6183 l2cap_pass_to_tx(chan, control);
6184 if (control && control->poll) {
6185 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6186 l2cap_send_rr_or_rnr(chan, 0);
6187 }
6188 __clear_retrans_timer(chan);
6189 l2cap_seq_list_clear(&chan->retrans_list);
6190 break;
6191 case L2CAP_EV_RECV_REJ:
6192 l2cap_handle_rej(chan, control);
6193 break;
6194 case L2CAP_EV_RECV_SREJ:
6195 l2cap_handle_srej(chan, control);
6196 break;
6197 default:
6198 break;
6199 }
6200
6201 if (skb && !skb_in_use) {
6202 BT_DBG("Freeing %p", skb);
6203 kfree_skb(skb);
6204 }
6205
6206 return err;
6207}
6208
6209static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan,
6210 struct l2cap_ctrl *control,
6211 struct sk_buff *skb, u8 event)
6212{
6213 int err = 0;
6214 u16 txseq = control->txseq;
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006215 bool skb_in_use = false;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006216
6217 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6218 event);
6219
6220 switch (event) {
6221 case L2CAP_EV_RECV_IFRAME:
6222 switch (l2cap_classify_txseq(chan, txseq)) {
6223 case L2CAP_TXSEQ_EXPECTED:
6224 /* Keep frame for reassembly later */
6225 l2cap_pass_to_tx(chan, control);
6226 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006227 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006228 BT_DBG("Queued %p (queue len %d)", skb,
6229 skb_queue_len(&chan->srej_q));
6230
6231 chan->expected_tx_seq = __next_seq(chan, txseq);
6232 break;
6233 case L2CAP_TXSEQ_EXPECTED_SREJ:
6234 l2cap_seq_list_pop(&chan->srej_list);
6235
6236 l2cap_pass_to_tx(chan, control);
6237 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006238 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006239 BT_DBG("Queued %p (queue len %d)", skb,
6240 skb_queue_len(&chan->srej_q));
6241
6242 err = l2cap_rx_queued_iframes(chan);
6243 if (err)
6244 break;
6245
6246 break;
6247 case L2CAP_TXSEQ_UNEXPECTED:
6248 /* Got a frame that can't be reassembled yet.
6249 * Save it for later, and send SREJs to cover
6250 * the missing frames.
6251 */
6252 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006253 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006254 BT_DBG("Queued %p (queue len %d)", skb,
6255 skb_queue_len(&chan->srej_q));
6256
6257 l2cap_pass_to_tx(chan, control);
6258 l2cap_send_srej(chan, control->txseq);
6259 break;
6260 case L2CAP_TXSEQ_UNEXPECTED_SREJ:
6261 /* This frame was requested with an SREJ, but
6262 * some expected retransmitted frames are
6263 * missing. Request retransmission of missing
6264 * SREJ'd frames.
6265 */
6266 skb_queue_tail(&chan->srej_q, skb);
Peter Senna Tschudin941247f2013-09-22 20:44:10 +02006267 skb_in_use = true;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006268 BT_DBG("Queued %p (queue len %d)", skb,
6269 skb_queue_len(&chan->srej_q));
6270
6271 l2cap_pass_to_tx(chan, control);
6272 l2cap_send_srej_list(chan, control->txseq);
6273 break;
6274 case L2CAP_TXSEQ_DUPLICATE_SREJ:
6275 /* We've already queued this frame. Drop this copy. */
6276 l2cap_pass_to_tx(chan, control);
6277 break;
6278 case L2CAP_TXSEQ_DUPLICATE:
6279 /* Expecting a later sequence number, so this frame
6280 * was already received. Ignore it completely.
6281 */
6282 break;
6283 case L2CAP_TXSEQ_INVALID_IGNORE:
6284 break;
6285 case L2CAP_TXSEQ_INVALID:
6286 default:
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006287 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006288 break;
6289 }
6290 break;
6291 case L2CAP_EV_RECV_RR:
6292 l2cap_pass_to_tx(chan, control);
6293 if (control->final) {
6294 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6295
6296 if (!test_and_clear_bit(CONN_REJ_ACT,
6297 &chan->conn_state)) {
6298 control->final = 0;
6299 l2cap_retransmit_all(chan, control);
6300 }
6301
6302 l2cap_ertm_send(chan);
6303 } else if (control->poll) {
6304 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6305 &chan->conn_state) &&
6306 chan->unacked_frames) {
6307 __set_retrans_timer(chan);
6308 }
6309
6310 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6311 l2cap_send_srej_tail(chan);
6312 } else {
6313 if (test_and_clear_bit(CONN_REMOTE_BUSY,
6314 &chan->conn_state) &&
6315 chan->unacked_frames)
6316 __set_retrans_timer(chan);
6317
6318 l2cap_send_ack(chan);
6319 }
6320 break;
6321 case L2CAP_EV_RECV_RNR:
6322 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6323 l2cap_pass_to_tx(chan, control);
6324 if (control->poll) {
6325 l2cap_send_srej_tail(chan);
6326 } else {
6327 struct l2cap_ctrl rr_control;
6328 memset(&rr_control, 0, sizeof(rr_control));
6329 rr_control.sframe = 1;
6330 rr_control.super = L2CAP_SUPER_RR;
6331 rr_control.reqseq = chan->buffer_seq;
6332 l2cap_send_sframe(chan, &rr_control);
6333 }
6334
6335 break;
6336 case L2CAP_EV_RECV_REJ:
6337 l2cap_handle_rej(chan, control);
6338 break;
6339 case L2CAP_EV_RECV_SREJ:
6340 l2cap_handle_srej(chan, control);
6341 break;
6342 }
6343
6344 if (skb && !skb_in_use) {
6345 BT_DBG("Freeing %p", skb);
6346 kfree_skb(skb);
6347 }
6348
6349 return err;
6350}
6351
Mat Martineau32b32732012-10-23 15:24:11 -07006352static int l2cap_finish_move(struct l2cap_chan *chan)
6353{
6354 BT_DBG("chan %p", chan);
6355
6356 chan->rx_state = L2CAP_RX_STATE_RECV;
6357
6358 if (chan->hs_hcon)
6359 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6360 else
6361 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6362
6363 return l2cap_resegment(chan);
6364}
6365
6366static int l2cap_rx_state_wait_p(struct l2cap_chan *chan,
6367 struct l2cap_ctrl *control,
6368 struct sk_buff *skb, u8 event)
6369{
6370 int err;
6371
6372 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb,
6373 event);
6374
6375 if (!control->poll)
6376 return -EPROTO;
6377
6378 l2cap_process_reqseq(chan, control->reqseq);
6379
6380 if (!skb_queue_empty(&chan->tx_q))
6381 chan->tx_send_head = skb_peek(&chan->tx_q);
6382 else
6383 chan->tx_send_head = NULL;
6384
6385 /* Rewind next_tx_seq to the point expected
6386 * by the receiver.
6387 */
6388 chan->next_tx_seq = control->reqseq;
6389 chan->unacked_frames = 0;
6390
6391 err = l2cap_finish_move(chan);
6392 if (err)
6393 return err;
6394
6395 set_bit(CONN_SEND_FBIT, &chan->conn_state);
6396 l2cap_send_i_or_rr_or_rnr(chan);
6397
6398 if (event == L2CAP_EV_RECV_IFRAME)
6399 return -EPROTO;
6400
6401 return l2cap_rx_state_recv(chan, control, NULL, event);
6402}
6403
6404static int l2cap_rx_state_wait_f(struct l2cap_chan *chan,
6405 struct l2cap_ctrl *control,
6406 struct sk_buff *skb, u8 event)
6407{
6408 int err;
6409
6410 if (!control->final)
6411 return -EPROTO;
6412
6413 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
6414
6415 chan->rx_state = L2CAP_RX_STATE_RECV;
6416 l2cap_process_reqseq(chan, control->reqseq);
6417
6418 if (!skb_queue_empty(&chan->tx_q))
6419 chan->tx_send_head = skb_peek(&chan->tx_q);
6420 else
6421 chan->tx_send_head = NULL;
6422
6423 /* Rewind next_tx_seq to the point expected
6424 * by the receiver.
6425 */
6426 chan->next_tx_seq = control->reqseq;
6427 chan->unacked_frames = 0;
6428
6429 if (chan->hs_hcon)
6430 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu;
6431 else
6432 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu;
6433
6434 err = l2cap_resegment(chan);
6435
6436 if (!err)
6437 err = l2cap_rx_state_recv(chan, control, skb, event);
6438
6439 return err;
6440}
6441
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006442static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq)
6443{
6444 /* Make sure reqseq is for a packet that has been sent but not acked */
6445 u16 unacked;
6446
6447 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq);
6448 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked;
6449}
6450
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006451static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6452 struct sk_buff *skb, u8 event)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006453{
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006454 int err = 0;
6455
6456 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan,
6457 control, skb, event, chan->rx_state);
6458
6459 if (__valid_reqseq(chan, control->reqseq)) {
6460 switch (chan->rx_state) {
6461 case L2CAP_RX_STATE_RECV:
6462 err = l2cap_rx_state_recv(chan, control, skb, event);
6463 break;
6464 case L2CAP_RX_STATE_SREJ_SENT:
6465 err = l2cap_rx_state_srej_sent(chan, control, skb,
6466 event);
6467 break;
Mat Martineau32b32732012-10-23 15:24:11 -07006468 case L2CAP_RX_STATE_WAIT_P:
6469 err = l2cap_rx_state_wait_p(chan, control, skb, event);
6470 break;
6471 case L2CAP_RX_STATE_WAIT_F:
6472 err = l2cap_rx_state_wait_f(chan, control, skb, event);
6473 break;
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006474 default:
6475 /* shut it down */
6476 break;
6477 }
6478 } else {
6479 BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d",
6480 control->reqseq, chan->next_tx_seq,
6481 chan->expected_ack_seq);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006482 l2cap_send_disconn_req(chan, ECONNRESET);
Mat Martineaud2a7ac52012-05-17 20:53:42 -07006483 }
6484
6485 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006486}
6487
6488static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
6489 struct sk_buff *skb)
6490{
Mat Martineau4b51dae92012-05-17 20:53:37 -07006491 int err = 0;
6492
6493 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
6494 chan->rx_state);
6495
6496 if (l2cap_classify_txseq(chan, control->txseq) ==
6497 L2CAP_TXSEQ_EXPECTED) {
6498 l2cap_pass_to_tx(chan, control);
6499
6500 BT_DBG("buffer_seq %d->%d", chan->buffer_seq,
6501 __next_seq(chan, chan->buffer_seq));
6502
6503 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
6504
6505 l2cap_reassemble_sdu(chan, skb, control);
6506 } else {
6507 if (chan->sdu) {
6508 kfree_skb(chan->sdu);
6509 chan->sdu = NULL;
6510 }
6511 chan->sdu_last_frag = NULL;
6512 chan->sdu_len = 0;
6513
6514 if (skb) {
6515 BT_DBG("Freeing %p", skb);
6516 kfree_skb(skb);
6517 }
6518 }
6519
6520 chan->last_acked_seq = control->txseq;
6521 chan->expected_tx_seq = __next_seq(chan, control->txseq);
6522
6523 return err;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006524}
6525
6526static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6527{
6528 struct l2cap_ctrl *control = &bt_cb(skb)->control;
6529 u16 len;
6530 u8 event;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006531
Mat Martineaub76bbd62012-04-11 10:48:43 -07006532 __unpack_control(chan, skb);
6533
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006534 len = skb->len;
6535
6536 /*
6537 * We can just drop the corrupted I-frame here.
6538 * Receiver will miss it and start proper recovery
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006539 * procedures and ask for retransmission.
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006540 */
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006541 if (l2cap_check_fcs(chan, skb))
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006542 goto drop;
6543
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006544 if (!control->sframe && control->sar == L2CAP_SAR_START)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006545 len -= L2CAP_SDULEN_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006546
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006547 if (chan->fcs == L2CAP_FCS_CRC16)
Andrei Emeltchenko03a51212011-10-17 12:19:58 +03006548 len -= L2CAP_FCS_SIZE;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006549
Gustavo F. Padovan47d1ec62011-04-13 15:57:03 -03006550 if (len > chan->mps) {
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006551 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006552 goto drop;
6553 }
6554
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006555 if (!control->sframe) {
6556 int err;
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006557
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006558 BT_DBG("iframe sar %d, reqseq %d, final %d, txseq %d",
6559 control->sar, control->reqseq, control->final,
6560 control->txseq);
Andrei Emeltchenko836be932011-10-17 12:19:57 +03006561
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006562 /* Validate F-bit - F=0 always valid, F=1 only
6563 * valid in TX WAIT_F
6564 */
6565 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F)
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006566 goto drop;
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006567
6568 if (chan->mode != L2CAP_MODE_STREAMING) {
6569 event = L2CAP_EV_RECV_IFRAME;
6570 err = l2cap_rx(chan, control, skb, event);
6571 } else {
6572 err = l2cap_stream_rx(chan, control, skb);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006573 }
6574
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006575 if (err)
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006576 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006577 } else {
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006578 const u8 rx_func_to_event[4] = {
6579 L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ,
6580 L2CAP_EV_RECV_RNR, L2CAP_EV_RECV_SREJ
6581 };
6582
6583 /* Only I-frames are expected in streaming mode */
6584 if (chan->mode == L2CAP_MODE_STREAMING)
6585 goto drop;
6586
6587 BT_DBG("sframe reqseq %d, final %d, poll %d, super %d",
6588 control->reqseq, control->final, control->poll,
6589 control->super);
6590
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006591 if (len != 0) {
Andrei Emeltchenko1bb166e2012-11-20 17:16:21 +02006592 BT_ERR("Trailing bytes: %d in sframe", len);
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006593 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006594 goto drop;
6595 }
6596
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006597 /* Validate F and P bits */
6598 if (control->final && (control->poll ||
6599 chan->tx_state != L2CAP_TX_STATE_WAIT_F))
6600 goto drop;
6601
6602 event = rx_func_to_event[control->super];
6603 if (l2cap_rx(chan, control, skb, event))
Andrei Emeltchenko5e4e3972012-11-28 17:59:39 +02006604 l2cap_send_disconn_req(chan, ECONNRESET);
Gustavo F. Padovan218bb9d2010-06-21 18:53:22 -03006605 }
6606
6607 return 0;
6608
6609drop:
6610 kfree_skb(skb);
6611 return 0;
6612}
6613
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006614static void l2cap_chan_le_send_credits(struct l2cap_chan *chan)
6615{
6616 struct l2cap_conn *conn = chan->conn;
6617 struct l2cap_le_credits pkt;
6618 u16 return_credits;
6619
6620 /* We return more credits to the sender only after the amount of
6621 * credits falls below half of the initial amount.
6622 */
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006623 if (chan->rx_credits >= (le_max_credits + 1) / 2)
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006624 return;
6625
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02006626 return_credits = le_max_credits - chan->rx_credits;
Johan Hedbergb1c325c2013-12-05 09:43:34 +02006627
6628 BT_DBG("chan %p returning %u credits to sender", chan, return_credits);
6629
6630 chan->rx_credits += return_credits;
6631
6632 pkt.cid = cpu_to_le16(chan->scid);
6633 pkt.credits = cpu_to_le16(return_credits);
6634
6635 chan->ident = l2cap_get_ident(conn);
6636
6637 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt);
6638}
6639
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006640static int l2cap_le_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
6641{
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006642 int err;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006643
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006644 if (!chan->rx_credits) {
6645 BT_ERR("No credits to receive LE L2CAP data");
Johan Hedbergdfd97742014-01-27 15:11:34 -08006646 l2cap_send_disconn_req(chan, ECONNRESET);
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006647 return -ENOBUFS;
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006648 }
6649
6650 if (chan->imtu < skb->len) {
6651 BT_ERR("Too big LE L2CAP PDU");
6652 return -ENOBUFS;
6653 }
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006654
6655 chan->rx_credits--;
6656 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits);
6657
6658 l2cap_chan_le_send_credits(chan);
6659
Johan Hedbergaac23bf2013-06-01 10:14:57 +03006660 err = 0;
6661
6662 if (!chan->sdu) {
6663 u16 sdu_len;
6664
6665 sdu_len = get_unaligned_le16(skb->data);
6666 skb_pull(skb, L2CAP_SDULEN_SIZE);
6667
6668 BT_DBG("Start of new SDU. sdu_len %u skb->len %u imtu %u",
6669 sdu_len, skb->len, chan->imtu);
6670
6671 if (sdu_len > chan->imtu) {
6672 BT_ERR("Too big LE L2CAP SDU length received");
6673 err = -EMSGSIZE;
6674 goto failed;
6675 }
6676
6677 if (skb->len > sdu_len) {
6678 BT_ERR("Too much LE L2CAP data received");
6679 err = -EINVAL;
6680 goto failed;
6681 }
6682
6683 if (skb->len == sdu_len)
6684 return chan->ops->recv(chan, skb);
6685
6686 chan->sdu = skb;
6687 chan->sdu_len = sdu_len;
6688 chan->sdu_last_frag = skb;
6689
6690 return 0;
6691 }
6692
6693 BT_DBG("SDU fragment. chan->sdu->len %u skb->len %u chan->sdu_len %u",
6694 chan->sdu->len, skb->len, chan->sdu_len);
6695
6696 if (chan->sdu->len + skb->len > chan->sdu_len) {
6697 BT_ERR("Too much LE L2CAP data received");
6698 err = -EINVAL;
6699 goto failed;
6700 }
6701
6702 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag);
6703 skb = NULL;
6704
6705 if (chan->sdu->len == chan->sdu_len) {
6706 err = chan->ops->recv(chan, chan->sdu);
6707 if (!err) {
6708 chan->sdu = NULL;
6709 chan->sdu_last_frag = NULL;
6710 chan->sdu_len = 0;
6711 }
6712 }
6713
6714failed:
6715 if (err) {
6716 kfree_skb(skb);
6717 kfree_skb(chan->sdu);
6718 chan->sdu = NULL;
6719 chan->sdu_last_frag = NULL;
6720 chan->sdu_len = 0;
6721 }
6722
6723 /* We can't return an error here since we took care of the skb
6724 * freeing internally. An error return would cause the caller to
6725 * do a double-free of the skb.
6726 */
6727 return 0;
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006728}
6729
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006730static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid,
6731 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006732{
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006733 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006734
Gustavo F. Padovanbaa7e1f2011-03-31 16:17:41 -03006735 chan = l2cap_get_chan_by_scid(conn, cid);
Gustavo F. Padovan48454072011-03-25 00:22:30 -03006736 if (!chan) {
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006737 if (cid == L2CAP_CID_A2MP) {
6738 chan = a2mp_channel_create(conn, skb);
6739 if (!chan) {
6740 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006741 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006742 }
6743
6744 l2cap_chan_lock(chan);
6745 } else {
6746 BT_DBG("unknown cid 0x%4.4x", cid);
6747 /* Drop packet and return */
6748 kfree_skb(skb);
Andrei Emeltchenko13ca56e2012-05-31 11:18:55 +03006749 return;
Andrei Emeltchenko97e8e892012-05-29 13:59:17 +03006750 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006751 }
6752
Gustavo F. Padovan49208c92011-04-04 15:59:54 -03006753 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006754
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006755 if (chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006756 goto drop;
6757
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006758 switch (chan->mode) {
Johan Hedberg38319712013-05-17 12:49:23 +03006759 case L2CAP_MODE_LE_FLOWCTL:
Johan Hedbergfad5fc892013-12-05 09:45:01 +02006760 if (l2cap_le_data_rcv(chan, skb) < 0)
6761 goto drop;
6762
6763 goto done;
6764
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006765 case L2CAP_MODE_BASIC:
6766 /* If socket recv buffers overflows we drop data here
6767 * which is *bad* because L2CAP has to be reliable.
6768 * But we don't have any other choice. L2CAP doesn't
6769 * provide flow control mechanism. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006770
Szymon Janc2c96e032014-02-18 20:48:34 +01006771 if (chan->imtu < skb->len) {
6772 BT_ERR("Dropping L2CAP data: receive buffer overflow");
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006773 goto drop;
Szymon Janc2c96e032014-02-18 20:48:34 +01006774 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006775
Gustavo Padovan80b98022012-05-27 22:27:51 -03006776 if (!chan->ops->recv(chan, skb))
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006777 goto done;
6778 break;
6779
6780 case L2CAP_MODE_ERTM:
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006781 case L2CAP_MODE_STREAMING:
Mat Martineaucec8ab6e2012-05-17 20:53:36 -07006782 l2cap_data_rcv(chan, skb);
Gustavo F. Padovan6840ed02009-08-20 22:26:01 -03006783 goto done;
6784
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006785 default:
Gustavo F. Padovan0c1bc5c2011-04-13 17:20:49 -03006786 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode);
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006787 break;
6788 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006789
6790drop:
6791 kfree_skb(skb);
6792
6793done:
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02006794 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006795}
6796
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006797static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm,
6798 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006799{
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006800 struct hci_conn *hcon = conn->hcon;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006801 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006802
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006803 if (hcon->type != ACL_LINK)
Johan Hedberga24cce12014-08-07 22:56:42 +03006804 goto free_skb;
Marcel Holtmannae4fd2d2013-10-03 00:03:39 -07006805
Johan Hedbergbf20fd42013-05-14 13:23:13 +03006806 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst,
6807 ACL_LINK);
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03006808 if (!chan)
Johan Hedberga24cce12014-08-07 22:56:42 +03006809 goto free_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006810
Andrei Emeltchenko5b4ceda2012-02-24 16:35:32 +02006811 BT_DBG("chan %p, len %d", chan, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006812
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03006813 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006814 goto drop;
6815
Vinicius Costa Gomese13e21d2011-06-17 22:46:27 -03006816 if (chan->imtu < skb->len)
Linus Torvalds1da177e2005-04-16 15:20:36 -07006817 goto drop;
6818
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006819 /* Store remote BD_ADDR and PSM for msg_name */
Marcel Holtmann06ae3312013-10-18 03:43:00 -07006820 bacpy(&bt_cb(skb)->bdaddr, &hcon->dst);
Marcel Holtmann2edf8702013-10-13 12:55:29 -07006821 bt_cb(skb)->psm = psm;
6822
Johan Hedberga24cce12014-08-07 22:56:42 +03006823 if (!chan->ops->recv(chan, skb)) {
6824 l2cap_chan_put(chan);
Andrei Emeltchenko84104b22012-05-31 11:18:56 +03006825 return;
Johan Hedberga24cce12014-08-07 22:56:42 +03006826 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006827
6828drop:
Johan Hedberga24cce12014-08-07 22:56:42 +03006829 l2cap_chan_put(chan);
6830free_skb:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006831 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006832}
6833
6834static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb)
6835{
6836 struct l2cap_hdr *lh = (void *) skb->data;
Johan Hedberg61a939c2014-01-17 20:45:11 +02006837 struct hci_conn *hcon = conn->hcon;
Al Viro8e036fc2007-07-29 00:16:36 -07006838 u16 cid, len;
6839 __le16 psm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07006840
Johan Hedberg61a939c2014-01-17 20:45:11 +02006841 if (hcon->state != BT_CONNECTED) {
6842 BT_DBG("queueing pending rx skb");
6843 skb_queue_tail(&conn->pending_rx, skb);
6844 return;
6845 }
6846
Linus Torvalds1da177e2005-04-16 15:20:36 -07006847 skb_pull(skb, L2CAP_HDR_SIZE);
6848 cid = __le16_to_cpu(lh->cid);
6849 len = __le16_to_cpu(lh->len);
6850
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -03006851 if (len != skb->len) {
6852 kfree_skb(skb);
6853 return;
6854 }
6855
Johan Hedberg9e1d7e12014-07-06 11:03:36 +03006856 /* Since we can't actively block incoming LE connections we must
6857 * at least ensure that we ignore incoming data from them.
6858 */
6859 if (hcon->type == LE_LINK &&
Johan Hedbergdcc36c12014-07-09 12:59:13 +03006860 hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst,
6861 bdaddr_type(hcon, hcon->dst_type))) {
Johan Hedberge4931502014-07-02 09:36:21 +03006862 kfree_skb(skb);
6863 return;
6864 }
6865
Linus Torvalds1da177e2005-04-16 15:20:36 -07006866 BT_DBG("len %d, cid 0x%4.4x", len, cid);
6867
6868 switch (cid) {
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006869 case L2CAP_CID_SIGNALING:
Linus Torvalds1da177e2005-04-16 15:20:36 -07006870 l2cap_sig_channel(conn, skb);
6871 break;
6872
Gustavo F. Padovan8db4dc42009-04-20 01:31:05 -03006873 case L2CAP_CID_CONN_LESS:
Andrei Emeltchenko097db762012-03-09 14:16:17 +02006874 psm = get_unaligned((__le16 *) skb->data);
Andrei Emeltchenko0181a702012-05-29 10:04:05 +03006875 skb_pull(skb, L2CAP_PSMLEN_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07006876 l2cap_conless_channel(conn, psm, skb);
6877 break;
6878
Marcel Holtmanna2877622013-10-02 23:46:54 -07006879 case L2CAP_CID_LE_SIGNALING:
6880 l2cap_le_sig_channel(conn, skb);
6881 break;
6882
Linus Torvalds1da177e2005-04-16 15:20:36 -07006883 default:
6884 l2cap_data_channel(conn, cid, skb);
6885 break;
6886 }
6887}
6888
Johan Hedberg61a939c2014-01-17 20:45:11 +02006889static void process_pending_rx(struct work_struct *work)
6890{
6891 struct l2cap_conn *conn = container_of(work, struct l2cap_conn,
6892 pending_rx_work);
6893 struct sk_buff *skb;
6894
6895 BT_DBG("");
6896
6897 while ((skb = skb_dequeue(&conn->pending_rx)))
6898 l2cap_recv_frame(conn, skb);
6899}
6900
Johan Hedberg162b49e2014-01-17 20:45:10 +02006901static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon)
6902{
6903 struct l2cap_conn *conn = hcon->l2cap_data;
6904 struct hci_chan *hchan;
6905
6906 if (conn)
6907 return conn;
6908
6909 hchan = hci_chan_create(hcon);
6910 if (!hchan)
6911 return NULL;
6912
Johan Hedberg27f70f32014-07-21 10:50:06 +03006913 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006914 if (!conn) {
6915 hci_chan_del(hchan);
6916 return NULL;
6917 }
6918
6919 kref_init(&conn->ref);
6920 hcon->l2cap_data = conn;
6921 conn->hcon = hcon;
6922 hci_conn_get(conn->hcon);
6923 conn->hchan = hchan;
6924
6925 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan);
6926
6927 switch (hcon->type) {
6928 case LE_LINK:
6929 if (hcon->hdev->le_mtu) {
6930 conn->mtu = hcon->hdev->le_mtu;
6931 break;
6932 }
6933 /* fall through */
6934 default:
6935 conn->mtu = hcon->hdev->acl_mtu;
6936 break;
6937 }
6938
6939 conn->feat_mask = 0;
6940
6941 if (hcon->type == ACL_LINK)
6942 conn->hs_enabled = test_bit(HCI_HS_ENABLED,
6943 &hcon->hdev->dev_flags);
6944
Marcel Holtmann5a54e7c2014-07-13 20:50:15 +02006945 mutex_init(&conn->ident_lock);
Johan Hedberg162b49e2014-01-17 20:45:10 +02006946 mutex_init(&conn->chan_lock);
6947
6948 INIT_LIST_HEAD(&conn->chan_l);
6949 INIT_LIST_HEAD(&conn->users);
6950
6951 if (hcon->type == LE_LINK)
6952 INIT_DELAYED_WORK(&conn->security_timer, security_timeout);
6953 else
6954 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout);
6955
Johan Hedbergdec5b492014-08-11 22:06:37 +03006956 INIT_WORK(&conn->disconn_work, disconn_work);
6957
Johan Hedberg61a939c2014-01-17 20:45:11 +02006958 skb_queue_head_init(&conn->pending_rx);
6959 INIT_WORK(&conn->pending_rx_work, process_pending_rx);
6960
Johan Hedberg162b49e2014-01-17 20:45:10 +02006961 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM;
6962
6963 return conn;
6964}
6965
6966static bool is_valid_psm(u16 psm, u8 dst_type) {
6967 if (!psm)
6968 return false;
6969
6970 if (bdaddr_type_is_le(dst_type))
6971 return (psm <= 0x00ff);
6972
6973 /* PSM must be odd and lsb of upper byte must be 0 */
6974 return ((psm & 0x0101) == 0x0001);
6975}
6976
6977int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6978 bdaddr_t *dst, u8 dst_type)
6979{
6980 struct l2cap_conn *conn;
6981 struct hci_conn *hcon;
6982 struct hci_dev *hdev;
Johan Hedberg162b49e2014-01-17 20:45:10 +02006983 int err;
6984
6985 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
6986 dst_type, __le16_to_cpu(psm));
6987
6988 hdev = hci_get_route(dst, &chan->src);
6989 if (!hdev)
6990 return -EHOSTUNREACH;
6991
6992 hci_dev_lock(hdev);
6993
6994 l2cap_chan_lock(chan);
6995
6996 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6997 chan->chan_type != L2CAP_CHAN_RAW) {
6998 err = -EINVAL;
6999 goto done;
7000 }
7001
Johan Hedberg21626e62014-01-24 10:35:41 +02007002 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
7003 err = -EINVAL;
7004 goto done;
7005 }
7006
7007 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
Johan Hedberg162b49e2014-01-17 20:45:10 +02007008 err = -EINVAL;
7009 goto done;
7010 }
7011
7012 switch (chan->mode) {
7013 case L2CAP_MODE_BASIC:
7014 break;
7015 case L2CAP_MODE_LE_FLOWCTL:
7016 l2cap_le_flowctl_init(chan);
7017 break;
7018 case L2CAP_MODE_ERTM:
7019 case L2CAP_MODE_STREAMING:
7020 if (!disable_ertm)
7021 break;
7022 /* fall through */
7023 default:
Johan Hedbergbeb19e42014-07-18 11:15:26 +03007024 err = -EOPNOTSUPP;
Johan Hedberg162b49e2014-01-17 20:45:10 +02007025 goto done;
7026 }
7027
7028 switch (chan->state) {
7029 case BT_CONNECT:
7030 case BT_CONNECT2:
7031 case BT_CONFIG:
7032 /* Already connecting */
7033 err = 0;
7034 goto done;
7035
7036 case BT_CONNECTED:
7037 /* Already connected */
7038 err = -EISCONN;
7039 goto done;
7040
7041 case BT_OPEN:
7042 case BT_BOUND:
7043 /* Can connect */
7044 break;
7045
7046 default:
7047 err = -EBADFD;
7048 goto done;
7049 }
7050
7051 /* Set destination address and psm */
7052 bacpy(&chan->dst, dst);
7053 chan->dst_type = dst_type;
7054
7055 chan->psm = psm;
7056 chan->dcid = cid;
7057
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007058 if (bdaddr_type_is_le(dst_type)) {
Johan Hedberge804d252014-07-16 11:42:28 +03007059 u8 role;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007060
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007061 /* Convert from L2CAP channel address type to HCI address type
7062 */
7063 if (dst_type == BDADDR_LE_PUBLIC)
7064 dst_type = ADDR_LE_DEV_PUBLIC;
7065 else
7066 dst_type = ADDR_LE_DEV_RANDOM;
7067
Johan Hedberge804d252014-07-16 11:42:28 +03007068 if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
7069 role = HCI_ROLE_SLAVE;
7070 else
7071 role = HCI_ROLE_MASTER;
Johan Hedbergcdd62752014-07-07 15:02:28 +03007072
Andre Guedes04a6c582014-02-26 20:21:44 -03007073 hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
Johan Hedberge804d252014-07-16 11:42:28 +03007074 HCI_LE_CONN_TIMEOUT, role);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007075 } else {
Johan Hedbergd93375a2014-07-07 15:02:27 +03007076 u8 auth_type = l2cap_get_auth_type(chan);
Andre Guedes04a6c582014-02-26 20:21:44 -03007077 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
Andre Guedes6f77d8c2014-02-26 20:21:45 -03007078 }
Johan Hedberg162b49e2014-01-17 20:45:10 +02007079
7080 if (IS_ERR(hcon)) {
7081 err = PTR_ERR(hcon);
7082 goto done;
7083 }
7084
7085 conn = l2cap_conn_add(hcon);
7086 if (!conn) {
7087 hci_conn_drop(hcon);
7088 err = -ENOMEM;
7089 goto done;
7090 }
7091
7092 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7093 hci_conn_drop(hcon);
7094 err = -EBUSY;
7095 goto done;
7096 }
7097
7098 /* Update source addr of the socket */
7099 bacpy(&chan->src, &hcon->src);
7100 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7101
7102 l2cap_chan_unlock(chan);
7103 l2cap_chan_add(conn, chan);
7104 l2cap_chan_lock(chan);
7105
7106 /* l2cap_chan_add takes its own ref so we can drop this one */
7107 hci_conn_drop(hcon);
7108
7109 l2cap_state_change(chan, BT_CONNECT);
7110 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan));
7111
Johan Hedberg61202e42014-01-28 15:16:48 -08007112 /* Release chan->sport so that it can be reused by other
7113 * sockets (as it's only used for listening sockets).
7114 */
7115 write_lock(&chan_list_lock);
7116 chan->sport = 0;
7117 write_unlock(&chan_list_lock);
7118
Johan Hedberg162b49e2014-01-17 20:45:10 +02007119 if (hcon->state == BT_CONNECTED) {
7120 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
7121 __clear_chan_timer(chan);
Johan Hedberge7cafc42014-07-17 15:35:38 +03007122 if (l2cap_chan_check_security(chan, true))
Johan Hedberg162b49e2014-01-17 20:45:10 +02007123 l2cap_state_change(chan, BT_CONNECTED);
7124 } else
7125 l2cap_do_start(chan);
7126 }
7127
7128 err = 0;
7129
7130done:
7131 l2cap_chan_unlock(chan);
7132 hci_dev_unlock(hdev);
7133 hci_dev_put(hdev);
7134 return err;
7135}
Jukka Rissanen6b8d4a62014-06-18 16:37:08 +03007136EXPORT_SYMBOL_GPL(l2cap_chan_connect);
Johan Hedberg162b49e2014-01-17 20:45:10 +02007137
Linus Torvalds1da177e2005-04-16 15:20:36 -07007138/* ---- L2CAP interface with lower layer (HCI) ---- */
7139
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007140int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007141{
7142 int exact = 0, lm1 = 0, lm2 = 0;
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007143 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007144
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007145 BT_DBG("hdev %s, bdaddr %pMR", hdev->name, bdaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007146
7147 /* Find listening sockets and check their link_mode */
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007148 read_lock(&chan_list_lock);
7149 list_for_each_entry(c, &chan_list, global_l) {
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007150 if (c->state != BT_LISTEN)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007151 continue;
7152
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007153 if (!bacmp(&c->src, &hdev->bdaddr)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007154 lm1 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007155 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007156 lm1 |= HCI_LM_MASTER;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007157 exact++;
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007158 } else if (!bacmp(&c->src, BDADDR_ANY)) {
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007159 lm2 |= HCI_LM_ACCEPT;
Andrei Emeltchenko43bd0f32011-10-11 14:04:34 +03007160 if (test_bit(FLAG_ROLE_SWITCH, &c->flags))
Marcel Holtmann2af6b9d2009-01-15 21:58:38 +01007161 lm2 |= HCI_LM_MASTER;
7162 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007163 }
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007164 read_unlock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007165
7166 return exact ? lm1 : lm2;
7167}
7168
Johan Hedberge760ec12014-08-07 22:56:47 +03007169/* Find the next fixed channel in BT_LISTEN state, continue iteration
7170 * from an existing channel in the list or from the beginning of the
7171 * global list (by passing NULL as first parameter).
7172 */
7173static struct l2cap_chan *l2cap_global_fixed_chan(struct l2cap_chan *c,
Johan Hedberg54a1b622014-08-07 22:56:48 +03007174 bdaddr_t *src, u8 link_type)
Johan Hedberge760ec12014-08-07 22:56:47 +03007175{
7176 read_lock(&chan_list_lock);
7177
7178 if (c)
7179 c = list_next_entry(c, global_l);
7180 else
7181 c = list_entry(chan_list.next, typeof(*c), global_l);
7182
7183 list_for_each_entry_from(c, &chan_list, global_l) {
7184 if (c->chan_type != L2CAP_CHAN_FIXED)
7185 continue;
7186 if (c->state != BT_LISTEN)
7187 continue;
7188 if (bacmp(&c->src, src) && bacmp(&c->src, BDADDR_ANY))
7189 continue;
Johan Hedberg54a1b622014-08-07 22:56:48 +03007190 if (link_type == ACL_LINK && c->src_type != BDADDR_BREDR)
7191 continue;
7192 if (link_type == LE_LINK && c->src_type == BDADDR_BREDR)
7193 continue;
Johan Hedberge760ec12014-08-07 22:56:47 +03007194
7195 l2cap_chan_hold(c);
7196 read_unlock(&chan_list_lock);
7197 return c;
7198 }
7199
7200 read_unlock(&chan_list_lock);
7201
7202 return NULL;
7203}
7204
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007205void l2cap_connect_cfm(struct hci_conn *hcon, u8 status)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007206{
Johan Hedberge760ec12014-08-07 22:56:47 +03007207 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann01394182006-07-03 10:02:46 +02007208 struct l2cap_conn *conn;
Johan Hedberge760ec12014-08-07 22:56:47 +03007209 struct l2cap_chan *pchan;
7210 u8 dst_type;
Marcel Holtmann01394182006-07-03 10:02:46 +02007211
Andrei Emeltchenko6ed93dc2012-09-25 12:49:43 +03007212 BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007213
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007214 if (status) {
Joe Perchese1750722011-06-29 18:18:29 -07007215 l2cap_conn_del(hcon, bt_to_errno(status));
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007216 return;
Andrei Emeltchenkoba6fc312012-10-31 15:46:26 +02007217 }
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007218
7219 conn = l2cap_conn_add(hcon);
7220 if (!conn)
7221 return;
7222
Johan Hedberge760ec12014-08-07 22:56:47 +03007223 dst_type = bdaddr_type(hcon, hcon->dst_type);
7224
7225 /* If device is blocked, do not create channels for it */
7226 if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type))
7227 return;
7228
7229 /* Find fixed channels and notify them of the new connection. We
7230 * use multiple individual lookups, continuing each time where
7231 * we left off, because the list lock would prevent calling the
7232 * potentially sleeping l2cap_chan_lock() function.
7233 */
Johan Hedberg54a1b622014-08-07 22:56:48 +03007234 pchan = l2cap_global_fixed_chan(NULL, &hdev->bdaddr, hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007235 while (pchan) {
7236 struct l2cap_chan *chan, *next;
7237
7238 /* Client fixed channels should override server ones */
7239 if (__l2cap_get_chan_by_dcid(conn, pchan->scid))
7240 goto next;
7241
7242 l2cap_chan_lock(pchan);
7243 chan = pchan->ops->new_connection(pchan);
7244 if (chan) {
7245 bacpy(&chan->src, &hcon->src);
7246 bacpy(&chan->dst, &hcon->dst);
7247 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7248 chan->dst_type = dst_type;
7249
7250 __l2cap_chan_add(conn, chan);
7251 }
7252
7253 l2cap_chan_unlock(pchan);
7254next:
Johan Hedberg54a1b622014-08-07 22:56:48 +03007255 next = l2cap_global_fixed_chan(pchan, &hdev->bdaddr,
7256 hcon->type);
Johan Hedberge760ec12014-08-07 22:56:47 +03007257 l2cap_chan_put(pchan);
7258 pchan = next;
7259 }
7260
Johan Hedbergdc0f5082014-08-07 22:56:46 +03007261 l2cap_conn_ready(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007262}
7263
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007264int l2cap_disconn_ind(struct hci_conn *hcon)
Marcel Holtmann2950f212009-02-12 14:02:50 +01007265{
7266 struct l2cap_conn *conn = hcon->l2cap_data;
7267
7268 BT_DBG("hcon %p", hcon);
7269
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007270 if (!conn)
Andrei Emeltchenko9f5a0d72011-11-07 14:20:25 +02007271 return HCI_ERROR_REMOTE_USER_TERM;
Marcel Holtmann2950f212009-02-12 14:02:50 +01007272 return conn->disc_reason;
7273}
7274
Andrei Emeltchenko9e664632012-07-24 16:06:15 +03007275void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007276{
7277 BT_DBG("hcon %p reason %d", hcon, reason);
7278
Joe Perchese1750722011-06-29 18:18:29 -07007279 l2cap_conn_del(hcon, bt_to_errno(reason));
Linus Torvalds1da177e2005-04-16 15:20:36 -07007280}
7281
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007282static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007283{
Gustavo F. Padovan715ec002011-05-02 17:13:55 -03007284 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED)
Marcel Holtmann255c7602009-02-04 21:07:19 +01007285 return;
7286
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007287 if (encrypt == 0x00) {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007288 if (chan->sec_level == BT_SECURITY_MEDIUM) {
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007289 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
Marcel Holtmann7d513e92014-01-15 22:37:40 -08007290 } else if (chan->sec_level == BT_SECURITY_HIGH ||
7291 chan->sec_level == BT_SECURITY_FIPS)
Gustavo F. Padovan0f852722011-05-04 19:42:50 -03007292 l2cap_chan_close(chan, ECONNREFUSED);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007293 } else {
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007294 if (chan->sec_level == BT_SECURITY_MEDIUM)
Gustavo F. Padovanc9b66672011-05-17 14:59:01 -03007295 __clear_chan_timer(chan);
Marcel Holtmannf62e4322009-01-15 21:58:44 +01007296 }
7297}
7298
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007299int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007300{
Marcel Holtmann40be4922008-07-14 20:13:50 +02007301 struct l2cap_conn *conn = hcon->l2cap_data;
Gustavo F. Padovan48454072011-03-25 00:22:30 -03007302 struct l2cap_chan *chan;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007303
Marcel Holtmann01394182006-07-03 10:02:46 +02007304 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007305 return 0;
Marcel Holtmann01394182006-07-03 10:02:46 +02007306
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007307 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007308
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007309 mutex_lock(&conn->chan_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007310
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007311 list_for_each_entry(chan, &conn->chan_l, list) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007312 l2cap_chan_lock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007313
Andrei Emeltchenko89d8b402012-07-10 15:27:51 +03007314 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid,
7315 state_to_string(chan->state));
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007316
Johan Hedberg2338a7e2014-01-24 10:35:40 +02007317 if (chan->scid == L2CAP_CID_A2MP) {
Andrei Emeltchenko78eb2f92012-07-19 17:03:47 +03007318 l2cap_chan_unlock(chan);
7319 continue;
7320 }
7321
Johan Hedberg191eb392014-08-07 22:56:45 +03007322 if (!status && encrypt)
7323 chan->sec_level = hcon->sec_level;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03007324
Andrei Emeltchenko96eff462012-11-15 18:14:53 +02007325 if (!__l2cap_no_conn_pending(chan)) {
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007326 l2cap_chan_unlock(chan);
Marcel Holtmann6a8d3012009-02-06 23:56:36 +01007327 continue;
7328 }
7329
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007330 if (!status && (chan->state == BT_CONNECTED ||
Gustavo Padovan2d792812012-10-06 10:07:01 +01007331 chan->state == BT_CONFIG)) {
Marcel Holtmannd97c8992013-10-14 02:53:54 -07007332 chan->ops->resume(chan);
Gustavo F. Padovan43434782011-04-12 18:31:57 -03007333 l2cap_check_encryption(chan, encrypt);
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007334 l2cap_chan_unlock(chan);
Marcel Holtmann9719f8a2008-07-14 20:13:45 +02007335 continue;
7336 }
7337
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007338 if (chan->state == BT_CONNECT) {
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007339 if (!status)
Andrei Emeltchenko93c3e8f2012-09-27 17:26:16 +03007340 l2cap_start_connection(chan);
Johan Hedberg6d3c15d2013-12-02 22:13:24 +02007341 else
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007342 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Gustavo F. Padovan89bc5002011-06-03 00:19:47 -03007343 } else if (chan->state == BT_CONNECT2) {
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007344 struct l2cap_conn_rsp rsp;
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007345 __u16 res, stat;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007346
7347 if (!status) {
Marcel Holtmannbdc25782013-10-14 02:45:34 -07007348 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) {
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007349 res = L2CAP_CR_PEND;
7350 stat = L2CAP_CS_AUTHOR_PEND;
Gustavo Padovan2dc4e512012-10-12 19:35:24 +08007351 chan->ops->defer(chan);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007352 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007353 l2cap_state_change(chan, BT_CONFIG);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007354 res = L2CAP_CR_SUCCESS;
7355 stat = L2CAP_CS_NO_INFO;
7356 }
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007357 } else {
Gustavo Padovanacdcabf2013-10-21 14:21:39 -02007358 l2cap_state_change(chan, BT_DISCONN);
Marcel Holtmannba13ccd2012-03-01 14:25:33 -08007359 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007360 res = L2CAP_CR_SEC_BLOCK;
7361 stat = L2CAP_CS_NO_INFO;
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007362 }
7363
Gustavo F. Padovanfe4128e2011-04-13 19:50:45 -03007364 rsp.scid = cpu_to_le16(chan->dcid);
7365 rsp.dcid = cpu_to_le16(chan->scid);
Johan Hedbergdf3c3932011-06-14 12:48:19 +03007366 rsp.result = cpu_to_le16(res);
7367 rsp.status = cpu_to_le16(stat);
Gustavo F. Padovanfc7f8a72011-03-25 13:59:37 -03007368 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
Gustavo Padovan2d792812012-10-06 10:07:01 +01007369 sizeof(rsp), &rsp);
Mat Martineau2d369352012-05-23 14:59:30 -07007370
7371 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) &&
7372 res == L2CAP_CR_SUCCESS) {
7373 char buf[128];
7374 set_bit(CONF_REQ_SENT, &chan->conf_state);
7375 l2cap_send_cmd(conn, l2cap_get_ident(conn),
7376 L2CAP_CONF_REQ,
7377 l2cap_build_conf_req(chan, buf),
7378 buf);
7379 chan->num_conf_req++;
7380 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007381 }
7382
Andrei Emeltchenko6be36552012-02-22 17:11:56 +02007383 l2cap_chan_unlock(chan);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007384 }
7385
Andrei Emeltchenko3df91ea2012-02-21 12:54:55 +02007386 mutex_unlock(&conn->chan_lock);
Marcel Holtmannb1235d72008-07-14 20:13:54 +02007387
Linus Torvalds1da177e2005-04-16 15:20:36 -07007388 return 0;
7389}
7390
Ulisses Furquim686ebf22011-12-21 10:11:33 -02007391int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007392{
7393 struct l2cap_conn *conn = hcon->l2cap_data;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007394 struct l2cap_hdr *hdr;
7395 int len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007396
Andrei Emeltchenko1d13a252012-10-15 11:58:41 +03007397 /* For AMP controller do not create l2cap conn */
7398 if (!conn && hcon->hdev->dev_type != HCI_BREDR)
7399 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007400
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007401 if (!conn)
Claudio Takahasibaf43252013-04-11 13:55:50 -03007402 conn = l2cap_conn_add(hcon);
Andrei Emeltchenko5a08ecc2011-01-11 17:20:20 +02007403
7404 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007405 goto drop;
7406
7407 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags);
7408
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007409 switch (flags) {
7410 case ACL_START:
7411 case ACL_START_NO_FLUSH:
7412 case ACL_COMPLETE:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007413 if (conn->rx_len) {
7414 BT_ERR("Unexpected start frame (len %d)", skb->len);
7415 kfree_skb(conn->rx_skb);
7416 conn->rx_skb = NULL;
7417 conn->rx_len = 0;
7418 l2cap_conn_unreliable(conn, ECOMM);
7419 }
7420
Andrei Emeltchenkoaae7fe22010-09-15 14:28:43 +03007421 /* Start fragment always begin with Basic L2CAP header */
7422 if (skb->len < L2CAP_HDR_SIZE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07007423 BT_ERR("Frame is too short (len %d)", skb->len);
7424 l2cap_conn_unreliable(conn, ECOMM);
7425 goto drop;
7426 }
7427
7428 hdr = (struct l2cap_hdr *) skb->data;
7429 len = __le16_to_cpu(hdr->len) + L2CAP_HDR_SIZE;
7430
7431 if (len == skb->len) {
7432 /* Complete frame received */
7433 l2cap_recv_frame(conn, skb);
7434 return 0;
7435 }
7436
7437 BT_DBG("Start: total len %d, frag len %d", len, skb->len);
7438
7439 if (skb->len > len) {
7440 BT_ERR("Frame is too long (len %d, expected len %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007441 skb->len, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007442 l2cap_conn_unreliable(conn, ECOMM);
7443 goto drop;
7444 }
7445
7446 /* Allocate skb for the complete frame (with header) */
Gustavo Padovan8bcde1f2012-05-28 19:18:14 -03007447 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL);
Gustavo F. Padovanaf05b30b2009-04-20 01:31:08 -03007448 if (!conn->rx_skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007449 goto drop;
7450
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007451 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007452 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007453 conn->rx_len = len - skb->len;
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007454 break;
7455
7456 case ACL_CONT:
Linus Torvalds1da177e2005-04-16 15:20:36 -07007457 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len);
7458
7459 if (!conn->rx_len) {
7460 BT_ERR("Unexpected continuation frame (len %d)", skb->len);
7461 l2cap_conn_unreliable(conn, ECOMM);
7462 goto drop;
7463 }
7464
7465 if (skb->len > conn->rx_len) {
7466 BT_ERR("Fragment is too long (len %d, expected %d)",
Gustavo Padovan2d792812012-10-06 10:07:01 +01007467 skb->len, conn->rx_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007468 kfree_skb(conn->rx_skb);
7469 conn->rx_skb = NULL;
7470 conn->rx_len = 0;
7471 l2cap_conn_unreliable(conn, ECOMM);
7472 goto drop;
7473 }
7474
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03007475 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len),
Gustavo Padovan2d792812012-10-06 10:07:01 +01007476 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007477 conn->rx_len -= skb->len;
7478
7479 if (!conn->rx_len) {
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007480 /* Complete frame received. l2cap_recv_frame
7481 * takes ownership of the skb so set the global
7482 * rx_skb pointer to NULL first.
7483 */
7484 struct sk_buff *rx_skb = conn->rx_skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007485 conn->rx_skb = NULL;
Johan Hedbergc4e5baf2013-10-10 13:33:37 +02007486 l2cap_recv_frame(conn, rx_skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007487 }
Andrei Emeltchenkod73a0982012-10-15 11:58:40 +03007488 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007489 }
7490
7491drop:
7492 kfree_skb(skb);
7493 return 0;
7494}
7495
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007496static int l2cap_debugfs_show(struct seq_file *f, void *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007497{
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007498 struct l2cap_chan *c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007499
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007500 read_lock(&chan_list_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007501
Gustavo F. Padovan23691d72011-04-27 18:26:32 -03007502 list_for_each_entry(c, &chan_list, global_l) {
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007503 seq_printf(f, "%pMR %pMR %d %d 0x%4.4x 0x%4.4x %d %d %d %d\n",
Marcel Holtmann7eafc592013-10-13 08:12:47 -07007504 &c->src, &c->dst,
Andrei Emeltchenkofcb73332012-09-25 12:49:44 +03007505 c->state, __le16_to_cpu(c->psm),
7506 c->scid, c->dcid, c->imtu, c->omtu,
7507 c->sec_level, c->mode);
Andrei Emeltchenko61e1b4b2012-01-19 11:19:50 +02007508 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07007509
Gustavo F. Padovan333055f2011-12-22 15:14:39 -02007510 read_unlock(&chan_list_lock);
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007511
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007512 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007513}
7514
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007515static int l2cap_debugfs_open(struct inode *inode, struct file *file)
7516{
7517 return single_open(file, l2cap_debugfs_show, inode->i_private);
7518}
7519
7520static const struct file_operations l2cap_debugfs_fops = {
7521 .open = l2cap_debugfs_open,
7522 .read = seq_read,
7523 .llseek = seq_lseek,
7524 .release = single_release,
7525};
7526
7527static struct dentry *l2cap_debugfs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007528
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007529int __init l2cap_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007530{
7531 int err;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -08007532
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007533 err = l2cap_init_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007534 if (err < 0)
7535 return err;
7536
Marcel Holtmann1120e4b2013-10-17 17:24:16 -07007537 if (IS_ERR_OR_NULL(bt_debugfs))
7538 return 0;
7539
7540 l2cap_debugfs = debugfs_create_file("l2cap", 0444, bt_debugfs,
7541 NULL, &l2cap_debugfs_fops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07007542
Samuel Ortiz40b93972014-05-14 17:53:35 +02007543 debugfs_create_u16("l2cap_le_max_credits", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007544 &le_max_credits);
Samuel Ortiz40b93972014-05-14 17:53:35 +02007545 debugfs_create_u16("l2cap_le_default_mps", 0644, bt_debugfs,
Johan Hedbergf15b8ec2013-12-03 15:08:25 +02007546 &le_default_mps);
7547
Linus Torvalds1da177e2005-04-16 15:20:36 -07007548 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007549}
7550
Gustavo F. Padovan64274512011-02-07 20:08:52 -02007551void l2cap_exit(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07007552{
Marcel Holtmannaef7d972010-03-21 05:27:45 +01007553 debugfs_remove(l2cap_debugfs);
Gustavo F. Padovanbb58f742011-02-03 20:50:35 -02007554 l2cap_cleanup_sockets();
Linus Torvalds1da177e2005-04-16 15:20:36 -07007555}
7556
Gustavo F. Padovand1c4a172010-07-18 16:25:54 -03007557module_param(disable_ertm, bool, 0644);
7558MODULE_PARM_DESC(disable_ertm, "Disable enhanced retransmission mode");